From: Mark A. Greer <[email protected]>

Several of davinci platforms have their mac address
at the same location in the same type of i2c eeprom
so factor out the code to extract that mac address.
Also factor out the code that fixes up a bogus mac
address.

Signed-off-by: Mark A. Greer <[email protected]>
---
 arch/arm/mach-davinci/Makefile            |    2 +
 arch/arm/mach-davinci/board-dm644x-evm.c  |   24 +---------------
 arch/arm/mach-davinci/board-dm646x-evm.c  |   23 +--------------
 arch/arm/mach-davinci/board-sffsdr.c      |    2 +-
 arch/arm/mach-davinci/devices.c           |   26 ----------------
 arch/arm/mach-davinci/include/mach/emac.h |    8 +++--
 arch/arm/mach-davinci/mac_addr.c          |   45 +++++++++++++++++++++++++++++
 7 files changed, 55 insertions(+), 75 deletions(-)
 create mode 100644 arch/arm/mach-davinci/mac_addr.c

diff --git a/arch/arm/mach-davinci/Makefile b/arch/arm/mach-davinci/Makefile
index b8e54ac..6cb8f60 100644
--- a/arch/arm/mach-davinci/Makefile
+++ b/arch/arm/mach-davinci/Makefile
@@ -8,6 +8,8 @@ obj-y                   := time.o irq.o clock.o serial.o io.o 
psc.o \
                           gpio.o devices.o usb.o dma.o iram.o common.o
 
 obj-$(CONFIG_DAVINCI_MUX)              += mux.o
+obj-$(CONFIG_TI_DAVINCI_EMAC)          += mac_addr.o
+obj-$(CONFIG_TI_DAVINCI_EMAC_MODULE)   += mac_addr.o
 
 # Chip specific
 obj-$(CONFIG_ARCH_DAVINCI_DM644x)       += dm644x.o
diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c 
b/arch/arm/mach-davinci/board-dm644x-evm.c
index 8c9ba95..422b24c 100644
--- a/arch/arm/mach-davinci/board-dm644x-evm.c
+++ b/arch/arm/mach-davinci/board-dm644x-evm.c
@@ -407,32 +407,11 @@ static struct pcf857x_platform_data pcf_data_u35 = {
  *  - 0x0039, 1 byte NTSC vs PAL (bit 0x80 == PAL)
  *  - ... newer boards may have more
  */
-static struct at24_iface *at24_if;
-
-static int at24_setup(struct at24_iface *iface, void *context)
-{
-#if defined(CONFIG_TI_DAVINCI_EMAC) || defined(CONFIG_TI_DAVINCI_EMAC_MODULE)
-       DECLARE_MAC_BUF(mac_str);
-       char mac_addr[6];
-
-       at24_if = iface;
-
-       /* Read MAC addr from EEPROM */
-       if (at24_if->read(at24_if, mac_addr, 0x7f00, 6) == 6) {
-               printk(KERN_INFO "Read MAC addr from EEPROM: %s\n",
-                      print_mac(mac_str, mac_addr));
-
-               memcpy(davinci_soc_info->emac_pdata->mac_addr, mac_addr, 6);
-       }
-#endif
-       return 0;
-}
-
 static struct at24_platform_data eeprom_info = {
        .byte_len       = (256*1024) / 8,
        .page_size      = 64,
        .flags          = AT24_FLAG_ADDR16,
-       .setup          = at24_setup,
+       .setup          = davinci_i2c_get_mac_addr,
 };
 
 /*
@@ -662,7 +641,6 @@ static __init void davinci_evm_init(void)
 #if defined(CONFIG_TI_DAVINCI_EMAC) || defined(CONFIG_TI_DAVINCI_EMAC_MODULE)
        davinci_soc_info->emac_pdata->phy_mask = DM644X_EVM_PHY_MASK;
        davinci_soc_info->emac_pdata->mdio_max_freq = DM644X_EVM_MDIO_FREQUENCY;
-       davinci_init_emac(davinci_soc_info->emac_pdata);
 #endif
 
        /* Register the fixup for PHY on DaVinci */
diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c 
b/arch/arm/mach-davinci/board-dm646x-evm.c
index 04b0e23..9afef59 100644
--- a/arch/arm/mach-davinci/board-dm646x-evm.c
+++ b/arch/arm/mach-davinci/board-dm646x-evm.c
@@ -57,31 +57,11 @@ static struct davinci_uart_config uart_config __initdata = {
  *  - 0x7f00, 6 bytes Ethernet Address
  *  - ... newer boards may have more
  */
-static struct at24_iface *at24_if;
-
-static int at24_setup(struct at24_iface *iface, void *context)
-{
-#if defined(CONFIG_TI_DAVINCI_EMAC) || defined(CONFIG_TI_DAVINCI_EMAC_MODULE)
-       DECLARE_MAC_BUF(mac_str);
-       char mac_addr[6];
-
-       at24_if = iface;
-
-       /* Read MAC addr from EEPROM */
-       if (at24_if->read(at24_if, mac_addr, 0x7f00, 6) == 6) {
-               printk(KERN_INFO "Read MAC addr from EEPROM: %s\n",
-               print_mac(mac_str, mac_addr));
-
-               memcpy(davinci_soc_info->emac_pdata->mac_addr, mac_addr, 6);
-       }
-#endif
-       return 0;
-}
 static struct at24_platform_data eeprom_info = {
        .byte_len       = (256*1024) / 8,
        .page_size      = 64,
        .flags          = AT24_FLAG_ADDR16,
-       .setup          = at24_setup,
+       .setup          = davinci_i2c_get_mac_addr,
 };
 
 static struct i2c_board_info __initdata i2c_info[] =  {
@@ -117,7 +97,6 @@ static __init void evm_init(void)
 #if defined(CONFIG_TI_DAVINCI_EMAC) || defined(CONFIG_TI_DAVINCI_EMAC_MODULE)
        davinci_soc_info->emac_pdata->phy_mask = DM646X_EVM_PHY_MASK;
        davinci_soc_info->emac_pdata->mdio_max_freq = DM646X_EVM_MDIO_FREQUENCY;
-       davinci_init_emac(davinci_soc_info->emac_pdata);
 #endif
 }
 
diff --git a/arch/arm/mach-davinci/board-sffsdr.c 
b/arch/arm/mach-davinci/board-sffsdr.c
index 4188ff7..671b900 100644
--- a/arch/arm/mach-davinci/board-sffsdr.c
+++ b/arch/arm/mach-davinci/board-sffsdr.c
@@ -163,11 +163,11 @@ static __init void davinci_sffsdr_init(void)
        sffsdr_init_i2c();
        davinci_serial_init(&uart_config);
 #if defined(CONFIG_TI_DAVINCI_EMAC) || defined(CONFIG_TI_DAVINCI_EMAC_MODULE)
+       davinci_fixup_mac_addr(davinci_sffsdr_mac_addr);
        memcpy(davinci_soc_info->emac_pdata->mac_addr,
                        davinci_sffsdr_mac_addr, 6);
        davinci_soc_info->emac_pdata->phy_mask = SFFSDR_PHY_MASK;
        davinci_soc_info->emac_pdata->mdio_max_freq = SFFSDR_MDIO_FREQUENCY;
-       davinci_init_emac(davinci_soc_info->emac_pdata);
 #endif
        setup_usb(0, 0); /* We support only peripheral mode. */
 
diff --git a/arch/arm/mach-davinci/devices.c b/arch/arm/mach-davinci/devices.c
index b8de587..70ea0a3 100644
--- a/arch/arm/mach-davinci/devices.c
+++ b/arch/arm/mach-davinci/devices.c
@@ -258,32 +258,6 @@ u32 davinci_timer_irqs[NUM_TIMERS] = {
 
 /*-------------------------------------------------------------------------*/
 
-#if defined(CONFIG_TI_DAVINCI_EMAC) || defined(CONFIG_TI_DAVINCI_EMAC_MODULE)
-
-void davinci_init_emac(struct emac_platform_data *pdata)
-{
-       DECLARE_MAC_BUF(buf);
-
-       /* if valid MAC exists, don't re-register */
-       if (is_valid_ether_addr(pdata->mac_addr))
-               return;
-       else {
-               /* Use random MAC if none passed */
-               random_ether_addr(pdata->mac_addr);
-
-               printk(KERN_WARNING "%s: using random MAC addr: %s\n",
-                      __func__, print_mac(buf, pdata->mac_addr));
-       }
-}
-
-#else
-
-void davinci_init_emac(struct emac_platform_data *unused) {}
-
-#endif
-
-/*-------------------------------------------------------------------------*/
-
 static int __init davinci_init_devices(void)
 {
        /* please keep these calls, and their implementations above,
diff --git a/arch/arm/mach-davinci/include/mach/emac.h 
b/arch/arm/mach-davinci/include/mach/emac.h
index 84d3372..e1dfd09 100644
--- a/arch/arm/mach-davinci/include/mach/emac.h
+++ b/arch/arm/mach-davinci/include/mach/emac.h
@@ -11,6 +11,8 @@
 #ifndef _MACH_DAVINCI_EMAC_H
 #define _MACH_DAVINCI_EMAC_H
 
+#include <linux/i2c/at24.h>
+
 struct emac_platform_data {
        char mac_addr[6];
        u32 ctrl_reg_offset;
@@ -28,7 +30,7 @@ enum {
        EMAC_VERSION_1, /* DM644x */
        EMAC_VERSION_2, /* DM646x */
 };
-void davinci_init_emac(struct emac_platform_data *pdata);
-#endif
-
 
+void davinci_fixup_mac_addr(char *mac_addr);
+int davinci_i2c_get_mac_addr(struct at24_iface *iface, void *context);
+#endif
diff --git a/arch/arm/mach-davinci/mac_addr.c b/arch/arm/mach-davinci/mac_addr.c
new file mode 100644
index 0000000..ff05e04
--- /dev/null
+++ b/arch/arm/mach-davinci/mac_addr.c
@@ -0,0 +1,45 @@
+/*
+ * Helper routines for setting the EMAC MAC address
+ *
+ * Author: Kevin Hilman, MontaVista Software, Inc. <[email protected]>
+ *
+ * 2007 (c) MontaVista Software, Inc. This file is licensed under
+ * the terms of the GNU General Public License version 2. This program
+ * is licensed "as is" without any warranty of any kind, whether express
+ * or implied.
+ */
+#include <linux/kernel.h>
+#include <linux/etherdevice.h>
+#include <linux/i2c/at24.h>
+
+#include <mach/emac.h>
+#include <mach/common.h>
+
+/* Use a random mac addr if one passed in is invalid */
+void davinci_fixup_mac_addr(char *mac_addr)
+{
+       DECLARE_MAC_BUF(mac_str);
+
+       if (!is_valid_ether_addr(mac_addr)) {
+               random_ether_addr(mac_addr);
+
+               printk(KERN_WARNING "%s: using random MAC addr: %s\n",
+                               __func__, print_mac(mac_str, mac_addr));
+       }
+}
+
+/* Ethernet MAC addr is at 0x7f00 in i2c eeprom (at24c256). */
+int davinci_i2c_get_mac_addr(struct at24_iface *iface, void *context)
+{
+       DECLARE_MAC_BUF(mac_str);
+       char *mac_addr = davinci_soc_info->emac_pdata->mac_addr;
+
+       /* Read MAC addr from EEPROM */
+       if (iface->read(iface, mac_addr, 0x7f00, 6) == 6) {
+               printk(KERN_INFO "Read MAC addr from EEPROM: %s\n",
+                               print_mac(mac_str, mac_addr));
+               davinci_fixup_mac_addr(mac_addr);
+       }
+
+       return 0;
+}
-- 
1.6.0.3


_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to