@@ -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,29 @@ static void dspwake(void)
int misc_init_r(void)
{
+ uint8_t enetaddr[8];
+ 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_multicast_ether_addr(buff) ||
+ is_zero_ether_addr(buff)) {
+ printf("Invalid MAC address read.\n");
+ return -EINVAL;
+ }
+
+ sprintf((char *)enetaddr, "%pM", buff);
+
+ eth_setenv_enetaddr("ethaddr", enetaddr);
+ }
+#endif
return 0;
}
@@ -172,6 +172,7 @@
#define CONFIG_SYS_LONGHELP
#define CONFIG_CRC32_VERIFY
#define CONFIG_MX_CYCLIC
+#define CONFIG_MAC_ADDR_IN_SPIFLASH
/*
* Linux Information