[U-Boot] [PATCH] davinci: enbw_cmc: change switch init behaviour

Heiko Schocher hs at denx.de
Tue Aug 14 11:51:04 CEST 2012


change the behaviour of switch initialization:

- rename "pwl" to "lan" in hwconfig parameter
  "lan" = port 1 with phy addr 2
  "lmn" = port 2 with phy addr 3

- if we have a valid switch config file in flash, do not
  evaluate the settings in the hwconfig "lan" or "lmn"
  subcommand.

- if we have no valid switch config file in flash, start
  the switch with default values, if we have a "lan" or
  a "lmn" hwconfig subcommand. If no "lan" or "lmn" is
  found in hwconfig, do nothing with the switch.

Signed-off-by: Heiko Schocher <hs at denx.de>
---
 board/enbw/enbw_cmc/enbw_cmc.c |  102 +++++++++++++++++++++++++++-------------
 1 files changed, 69 insertions(+), 33 deletions(-)

diff --git a/board/enbw/enbw_cmc/enbw_cmc.c b/board/enbw/enbw_cmc/enbw_cmc.c
index 0874e9c..b9dfc5d 100644
--- a/board/enbw/enbw_cmc/enbw_cmc.c
+++ b/board/enbw/enbw_cmc/enbw_cmc.c
@@ -451,25 +451,15 @@ static char *enbw_cmc_getvalue(char *ptr, int *value)
 	return ptr;
 }
 
-static int enbw_cmc_config_switch(unsigned long addr)
+static struct spi_slave *enbw_cmc_init_spi(void)
 {
 	struct spi_slave *spi;
-	char *ptr = (char *)addr;
-	int value, reg;
 	int ret;
-	int bus, cs, max_hz, spi_mode;
-
-	debug("configure switch with file on addr: 0x%lx\n", addr);
 
-	bus = 0;
-	cs = 0;
-	max_hz = 1000000;
-	spi_mode = 0;
-
-	spi = spi_setup_slave(bus, cs, max_hz, spi_mode);
+	spi = spi_setup_slave(0, 0, 1000000, 0);
 	if (!spi) {
 		printf("Failed to set up slave\n");
-		return -EINVAL;
+		return NULL;
 	}
 
 	ret = spi_claim_bus(spi);
@@ -480,25 +470,45 @@ static int enbw_cmc_config_switch(unsigned long addr)
 
 	ret = enbw_cmc_switch_read_ident(spi);
 	if (ret)
-		goto err_claim_bus;
+		goto err_read;
+
+	return spi;
+err_read:
+	spi_release_bus(spi);
+err_claim_bus:
+	spi_free_slave(spi);
+	return NULL;
+}
+
+static int enbw_cmc_config_switch(unsigned long addr)
+{
+	struct spi_slave *spi;
+	char *ptr = (char *)addr;
+	int value, reg;
+	int ret = 0;
+
+	debug("configure switch with file on addr: 0x%lx\n", addr);
+
+	spi = enbw_cmc_init_spi();
+	if (!spi)
+		return -EINVAL;
 
-	ptr = (char *)addr;
 	while (ptr != NULL) {
 		ptr = enbw_cmc_getvalue(ptr, &reg);
 		if (ptr != NULL) {
 			ptr = enbw_cmc_getvalue(ptr, &value);
 			if ((ptr != NULL) && (value >= 0))
-				if (enbw_cmc_switch_write(spi, reg, value))
-					goto err_read;
+				if (enbw_cmc_switch_write(spi, reg, value)) {
+					/* error writing to switch */
+					ptr = NULL;
+					ret = -EINVAL;
+				}
 		}
 	}
-	return 0;
 
-err_read:
 	spi_release_bus(spi);
-err_claim_bus:
 	spi_free_slave(spi);
-	return -EINVAL;
+	return ret;
 }
 
 static int do_switch(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
@@ -524,8 +534,10 @@ U_BOOT_CMD(switch, 3, 1, do_switch,
  */
 int board_eth_init(bd_t *bis)
 {
+	struct spi_slave *spi;
 	const char *s;
-	size_t len;
+	size_t len = 0;
+	int config = 1;
 
 	davinci_emac_mii_mode_sel(0);
 
@@ -534,25 +546,49 @@ int board_eth_init(bd_t *bis)
 	if (len) {
 		unsigned long addr = simple_strtoul(s, NULL, 16);
 
-		enbw_cmc_config_switch(addr);
+		config = enbw_cmc_config_switch(addr);
 	}
 
+	if (config) {
+		/*
+		 * no valid config file -> do we have some args in
+		 * hwconfig ?
+		 */
+		if ((hwconfig_subarg("switch", "lan", &len)) ||
+		    (hwconfig_subarg("switch", "lmn", &len))) {
+			/* If so start switch */
+			spi = enbw_cmc_init_spi();
+			if (spi) {
+				if (enbw_cmc_switch_write(spi, 1, 0))
+					config = 0;
+				udelay(10000);
+				if (enbw_cmc_switch_write(spi, 1, 1))
+					config = 0;
+				spi_release_bus(spi);
+				spi_free_slave(spi);
+			}
+		} else {
+			config = 0;
+		}
+	}
 	if (!davinci_emac_initialize()) {
 		printf("Error: Ethernet init failed!\n");
 		return -1;
 	}
 
-	if (hwconfig_subarg_cmp("switch", "lan", "on"))
-		/* Switch port lan on */
-		enbw_cmc_switch(1, 1);
-	else
-		enbw_cmc_switch(1, 0);
+	if (config) {
+		if (hwconfig_subarg_cmp("switch", "lan", "on"))
+			/* Switch port lan on */
+			enbw_cmc_switch(1, 1);
+		else
+			enbw_cmc_switch(1, 0);
 
-	if (hwconfig_subarg_cmp("switch", "pwl", "on"))
-		/* Switch port pwl on */
-		enbw_cmc_switch(2, 1);
-	else
-		enbw_cmc_switch(2, 0);
+		if (hwconfig_subarg_cmp("switch", "lmn", "on"))
+			/* Switch port pwl on */
+			enbw_cmc_switch(2, 1);
+		else
+			enbw_cmc_switch(2, 0);
+	}
 
 	return 0;
 }
-- 
1.7.7.6



More information about the U-Boot mailing list