From: Manjunath Hadli <[email protected]> add support to read mac address from spi flash if env variable is not set. This is supported only on L138 boards based on da850 SOC. Introduced a macro CONFIG_MAC_ADDR_IN_SPIFLASH indicating where to look mac address for.
Signed-off-by: Manjunathappa, Prakash <[email protected]> Signed-off-by: Manjunath Hadli <[email protected]> --- board/davinci/da8xxevm/da850evm.c | 59 +++++++++++++++++++++++++++++++++++++ include/configs/da850_l138evm.h | 1 + 2 files changed, 60 insertions(+), 0 deletions(-) diff --git a/board/davinci/da8xxevm/da850evm.c b/board/davinci/da8xxevm/da850evm.c index 34673bf..6aa76cb 100644 --- a/board/davinci/da8xxevm/da850evm.c +++ b/board/davinci/da8xxevm/da850evm.c @@ -25,10 +25,13 @@ #include <i2c.h> #include <net.h> #include <netdev.h> +#include <spi.h> +#include <spi_flash.h> #include <asm/arch/hardware.h> #include <asm/arch/emif_defs.h> #include <asm/arch/emac_defs.h> #include <asm/io.h> +#include <asm/errno.h> #include <asm/arch/davinci_misc.h> #include <hwconfig.h> @@ -166,6 +169,44 @@ const struct pinmux_config nor_pins[] = { #endif #endif /* CONFIG_DRIVER_TI_EMAC */ +#define CFG_MAC_ADDR_SPI_BUS 0 +#define CFG_MAC_ADDR_SPI_CS 0 +#define CFG_MAC_ADDR_SPI_MAX_HZ CONFIG_SF_DEFAULT_SPEED +#define CFG_MAC_ADDR_SPI_MODE SPI_MODE_3 + +#define CFG_MAC_ADDR_OFFSET (flash->size - SZ_64K) + +#ifdef CONFIG_MAC_ADDR_IN_SPIFLASH +static int get_mac_addr(u8 *addr) +{ + struct spi_flash *flash; + int ret; + + + flash = spi_flash_probe(CFG_MAC_ADDR_SPI_BUS, CFG_MAC_ADDR_SPI_CS, + CFG_MAC_ADDR_SPI_MAX_HZ, CFG_MAC_ADDR_SPI_MODE); + if (!flash) { + printf(" Error - unable to probe SPI flash.\n"); + ret = -1; + goto err_probe; + } + + ret = spi_flash_read(flash, CFG_MAC_ADDR_OFFSET, 6, addr); + if (ret) { + printf("Error - unable to read MAC address from SPI flash.\n"); + goto err_read; + } + +err_read: + /* cannot call free currently since the free function calls free() for + * spi_flash structure though it is not directly allocated through + * malloc() + */ +err_probe: + return ret; +} +#endif + void dsp_lpsc_on(unsigned domain, unsigned int id) { dv_reg_p mdstat, mdctl, ptstat, ptcmd; @@ -220,7 +261,25 @@ static void dspwake(void) int misc_init_r(void) { + uchar buff[8]; + int ret; + dspwake(); + +#ifdef CONFIG_MAC_ADDR_IN_SPIFLASH + if (!eth_getenv_enetaddr("ethaddr", buff)) { + ret = get_mac_addr(buff); + if (ret != 0) + return -EINVAL; + + if (!is_valid_ether_addr(buff)) { + printf("Invalid MAC address read.\n"); + return -EINVAL; + } + + eth_setenv_enetaddr("ethaddr", buff); + } +#endif return 0; } diff --git a/include/configs/da850_l138evm.h b/include/configs/da850_l138evm.h index 347893c..929d0a4 100644 --- a/include/configs/da850_l138evm.h +++ b/include/configs/da850_l138evm.h @@ -175,6 +175,7 @@ #define CONFIG_SYS_LONGHELP #define CONFIG_CRC32_VERIFY #define CONFIG_MX_CYCLIC +#define CONFIG_MAC_ADDR_IN_SPIFLASH /* * Linux Information -- 1.6.2.4 _______________________________________________ U-Boot mailing list [email protected] http://lists.denx.de/mailman/listinfo/u-boot

