diff options
Diffstat (limited to 'board/davinci/da8xxevm/da850evm.c')
| -rw-r--r-- | board/davinci/da8xxevm/da850evm.c | 72 | 
1 files changed, 72 insertions, 0 deletions
| diff --git a/board/davinci/da8xxevm/da850evm.c b/board/davinci/da8xxevm/da850evm.c index 34ef53df2..beb56575e 100644 --- a/board/davinci/da8xxevm/da850evm.c +++ b/board/davinci/da8xxevm/da850evm.c @@ -25,12 +25,15 @@  #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/arch/pinmux_defs.h>  #include <asm/io.h>  #include <asm/arch/davinci_misc.h> +#include <asm/errno.h>  #include <hwconfig.h>  DECLARE_GLOBAL_DATA_PTR; @@ -43,6 +46,36 @@ DECLARE_GLOBAL_DATA_PTR;  #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"); +		return -1; +	} + +	ret = spi_flash_read(flash, CFG_MAC_ADDR_OFFSET, 6, addr); +	if (ret) { +		printf("Error - unable to read MAC address from SPI flash.\n"); +		return -1; +	} + +	return ret; +} +#endif +  void dsp_lpsc_on(unsigned domain, unsigned int id)  {  	dv_reg_p mdstat, mdctl, ptstat, ptcmd; @@ -98,6 +131,45 @@ static void dspwake(void)  int misc_init_r(void)  {  	dspwake(); + +#ifdef CONFIG_MAC_ADDR_IN_SPIFLASH +	uchar env_enetaddr[6]; +	int enetaddr_found; +	int spi_mac_read; +	uchar buff[6]; + +	enetaddr_found = eth_getenv_enetaddr("ethaddr", env_enetaddr); +	spi_mac_read = get_mac_addr(buff); + +	/* +	 * MAC address not present in the environment +	 * try and read the MAC address from SPI flash +	 * and set it. +	 */ +	if (!enetaddr_found) { +		if (!spi_mac_read) { +			if (is_valid_ether_addr(buff)) { +				if (eth_setenv_enetaddr("ethaddr", buff)) { +					printf("Warning: Failed to " +					"set MAC address from SPI flash\n"); +				} +			} else { +					printf("Warning: Invalid " +					"MAC address read from SPI flash\n"); +			} +		} +	} else { +		/* +		 * MAC address present in environment compare it with +		 * the MAC address in SPI flash and warn on mismatch +		 */ +		if (!spi_mac_read && is_valid_ether_addr(buff) && +						memcmp(env_enetaddr, buff, 6)) +			printf("Warning: MAC address in SPI flash don't match " +					"with the MAC address in the environment\n"); +			printf("Default using MAC address from environment\n"); +	} +#endif  	return 0;  } |