From: Mark A. Greer <[email protected]> Factor out the code to extract that mac address from i2c eeprom. 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 | 3 +- arch/arm/mach-davinci/board-dm644x-evm.c | 26 ++-------------- arch/arm/mach-davinci/board-dm646x-evm.c | 25 +-------------- 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 | 47 +++++++++++++++++++++++++++++ 7 files changed, 60 insertions(+), 77 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..ca68012 100644 --- a/arch/arm/mach-davinci/Makefile +++ b/arch/arm/mach-davinci/Makefile @@ -5,7 +5,8 @@ # Common objects 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 + gpio.o devices.o usb.o dma.o iram.o common.o \ + mac_addr.o obj-$(CONFIG_DAVINCI_MUX) += mux.o diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c b/arch/arm/mach-davinci/board-dm644x-evm.c index 5052ec8..fab652b 100644 --- a/arch/arm/mach-davinci/board-dm644x-evm.c +++ b/arch/arm/mach-davinci/board-dm644x-evm.c @@ -44,6 +44,7 @@ #include <mach/psc.h> #include <mach/nand.h> #include <mach/mmc.h> +#include <mach/emac.h> #include <mach/common.h> #define DM644X_EVM_PHY_MASK (0x2) @@ -408,32 +409,12 @@ static struct pcf857x_platform_data pcf_data_u35 = { * - 0x0039, 1 byte NTSC vs PAL (bit 0x80 == PAL) * - ... newer boards may have more */ -static struct memory_accessor *at24_mem_acc; - -static void at24_setup(struct memory_accessor *mem_acc, void *context) -{ -#if defined(CONFIG_TI_DAVINCI_EMAC) || defined(CONFIG_TI_DAVINCI_EMAC_MODULE) - DECLARE_MAC_BUF(mac_str); - char mac_addr[6]; - struct davinci_soc_info *soc_info = davinci_get_soc_info(); - - at24_mem_acc = mem_acc; - - /* Read MAC addr from EEPROM */ - if (at24_mem_acc->read(at24_mem_acc, mac_addr, 0x7f00, 6) == 6) { - printk(KERN_INFO "Read MAC addr from EEPROM: %s\n", - print_mac(mac_str, mac_addr)); - - memcpy(soc_info->emac_pdata->mac_addr, mac_addr, 6); - } -#endif -} - static struct at24_platform_data eeprom_info = { .byte_len = (256*1024) / 8, .page_size = 64, .flags = AT24_FLAG_ADDR16, - .setup = at24_setup, + .setup = davinci_get_mac_addr, + .context = (void *)0x7f00, }; /* @@ -664,7 +645,6 @@ static __init void davinci_evm_init(void) soc_info->emac_pdata->phy_mask = DM644X_EVM_PHY_MASK; soc_info->emac_pdata->mdio_max_freq = DM644X_EVM_MDIO_FREQUENCY; - davinci_init_emac(soc_info->emac_pdata); /* Register the fixup for PHY on DaVinci */ phy_register_fixup_for_uid(LXT971_PHY_ID, LXT971_PHY_MASK, diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c b/arch/arm/mach-davinci/board-dm646x-evm.c index 9648fa2..9db1be3 100644 --- a/arch/arm/mach-davinci/board-dm646x-evm.c +++ b/arch/arm/mach-davinci/board-dm646x-evm.c @@ -57,32 +57,12 @@ static struct davinci_uart_config uart_config __initdata = { * - 0x7f00, 6 bytes Ethernet Address * - ... newer boards may have more */ -static struct memory_accessor *at24_mem_acc; - -static void at24_setup(struct memory_accessor *mem_acc, void *context) -{ -#if defined(CONFIG_TI_DAVINCI_EMAC) || defined(CONFIG_TI_DAVINCI_EMAC_MODULE) - DECLARE_MAC_BUF(mac_str); - char mac_addr[6]; - struct davinci_soc_info *soc_info = davinci_get_soc_info(); - - at24_mem_acc = mem_acc; - - /* Read MAC addr from EEPROM */ - if (at24_mem_acc->read(at24_mem_acc, mac_addr, 0x7f00, 6) == 6) { - printk(KERN_INFO "Read MAC addr from EEPROM: %s\n", - print_mac(mac_str, mac_addr)); - - memcpy(soc_info->emac_pdata->mac_addr, mac_addr, 6); - } -#endif -} - static struct at24_platform_data eeprom_info = { .byte_len = (256*1024) / 8, .page_size = 64, .flags = AT24_FLAG_ADDR16, - .setup = at24_setup, + .setup = davinci_get_mac_addr, + .context = (void *)0x7f00, }; static struct i2c_board_info __initdata i2c_info[] = { @@ -121,7 +101,6 @@ static __init void evm_init(void) soc_info->emac_pdata->phy_mask = DM646X_EVM_PHY_MASK; soc_info->emac_pdata->mdio_max_freq = DM646X_EVM_MDIO_FREQUENCY; - davinci_init_emac(soc_info->emac_pdata); } static __init void davinci_dm646x_evm_irq_init(void) diff --git a/arch/arm/mach-davinci/board-sffsdr.c b/arch/arm/mach-davinci/board-sffsdr.c index c844014..503696d 100644 --- a/arch/arm/mach-davinci/board-sffsdr.c +++ b/arch/arm/mach-davinci/board-sffsdr.c @@ -166,10 +166,10 @@ static __init void davinci_sffsdr_init(void) sffsdr_init_i2c(); davinci_serial_init(&uart_config); + davinci_fixup_mac_addr(davinci_sffsdr_mac_addr); memcpy(soc_info->emac_pdata->mac_addr, davinci_sffsdr_mac_addr, 6); soc_info->emac_pdata->phy_mask = SFFSDR_PHY_MASK; soc_info->emac_pdata->mdio_max_freq = SFFSDR_MDIO_FREQUENCY; - davinci_init_emac(soc_info->emac_pdata); 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 050435c..d104cd8 100644 --- a/arch/arm/mach-davinci/devices.c +++ b/arch/arm/mach-davinci/devices.c @@ -262,32 +262,6 @@ struct davinci_timer_instance davinci_timer_instance[2] = { /*-------------------------------------------------------------------------*/ -#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..7c50a71 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); +void davinci_get_mac_addr(struct memory_accessor *mem_acc, 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..4d8a963 --- /dev/null +++ b/arch/arm/mach-davinci/mac_addr.c @@ -0,0 +1,47 @@ +/* + * 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 <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) +{ +#if defined(CONFIG_TI_DAVINCI_EMAC) || defined(CONFIG_TI_DAVINCI_EMAC_MODULE) + DECLARE_MAC_BUF(mac_str); + + if (!is_valid_ether_addr(mac_addr)) { + random_ether_addr(mac_addr); + + pr_warning("%s: using random MAC addr: %s\n", + __func__, print_mac(mac_str, mac_addr)); + } +#endif +} + +void davinci_get_mac_addr(struct memory_accessor *mem_acc, void *context) +{ +#if defined(CONFIG_TI_DAVINCI_EMAC) || defined(CONFIG_TI_DAVINCI_EMAC_MODULE) + DECLARE_MAC_BUF(mac_str); + struct davinci_soc_info *soc_info = davinci_get_soc_info(); + char *mac_addr = soc_info->emac_pdata->mac_addr; + off_t offset = (off_t)context; + + /* Read MAC addr from EEPROM */ + if (mem_acc->read(mem_acc, mac_addr, offset, 6) == 6) { + pr_info("Read MAC addr from EEPROM: %s\n", + print_mac(mac_str, mac_addr)); + davinci_fixup_mac_addr(mac_addr); + } +#endif +} -- 1.6.0.3 _______________________________________________ Davinci-linux-open-source mailing list [email protected] http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
