From: Chaithrika U S <[email protected]>

EMAC platform device definitions have been moved to the respective SoC specific
files, also the resource structures have been simplified to represent a single
contiguous memory region.

Platform data has been suitably modified to add module offsets. PHY
address mask and maximum MDIO clock value has also been included in the
platform data structure.

The EMAC init is done by the EVM/board init function and not by the EEPROM
setup.

Signed-off-by: Chaithrika U S <[email protected]>
---
 arch/arm/mach-davinci/board-dm644x-evm.c    |   11 ++-
 arch/arm/mach-davinci/board-dm646x-evm.c    |   11 ++-
 arch/arm/mach-davinci/board-sffsdr.c        |   11 ++-
 arch/arm/mach-davinci/devices.c             |  137 ++-------------------------
 arch/arm/mach-davinci/dm644x.c              |   41 ++++++++
 arch/arm/mach-davinci/dm646x.c              |   55 +++++++++++
 arch/arm/mach-davinci/include/mach/dm644x.h |   10 ++
 arch/arm/mach-davinci/include/mach/dm646x.h |   10 ++
 arch/arm/mach-davinci/include/mach/emac.h   |    9 ++-
 9 files changed, 164 insertions(+), 131 deletions(-)

diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c 
b/arch/arm/mach-davinci/board-dm644x-evm.c
index 20ec961..ad5b7bf 100644
--- a/arch/arm/mach-davinci/board-dm644x-evm.c
+++ b/arch/arm/mach-davinci/board-dm644x-evm.c
@@ -45,6 +45,9 @@
 #include <mach/nand.h>
 #include <mach/mmc.h>
 
+#define DM644X_EVM_PHY_MASK            (0x2)
+#define DM644X_EVM_MDIO_FREQUENCY      (2200000) /* PHY bus frequency */
+
 #define DAVINCI_CFC_ATA_BASE             0x01C66000
 
 #define DAVINCI_ASYNC_EMIF_CONTROL_BASE   0x01e00000
@@ -56,6 +59,11 @@
 #define LXT971_PHY_ID  (0x001378e2)
 #define LXT971_PHY_MASK        (0xfffffff0)
 
+static struct emac_platform_data dm644x_evm_emac_pdata = {
+       .phy_mask       = DM644X_EVM_PHY_MASK,
+       .mdio_max_freq  = DM644X_EVM_MDIO_FREQUENCY,
+};
+
 static struct mtd_partition davinci_evm_norflash_partitions[] = {
        /* bootloader (UBL, U-Boot, etc) in first 5 sectors */
        {
@@ -418,7 +426,7 @@ static int at24_setup(struct at24_iface *iface, void 
*context)
                printk(KERN_INFO "Read MAC addr from EEPROM: %s\n",
                       print_mac(mac_str, mac_addr));
 
-               davinci_init_emac(mac_addr);
+               memcpy(dm644x_evm_emac_pdata.mac_addr, mac_addr, 6);
        }
 
        return 0;
@@ -667,6 +675,7 @@ static __init void davinci_evm_init(void)
        davinci_setup_mmc(0, &dm6446evm_mmc_config);
 
        davinci_serial_init(&uart_config);
+       davinci_init_emac(&dm644x_evm_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 907f424..a300d5d 100644
--- a/arch/arm/mach-davinci/board-dm646x-evm.c
+++ b/arch/arm/mach-davinci/board-dm646x-evm.c
@@ -46,6 +46,14 @@
 #include <linux/etherdevice.h>
 #include <mach/emac.h>
 
+#define DM646X_EVM_PHY_MASK            (0x2)
+#define DM646X_EVM_MDIO_FREQUENCY      (2200000) /* PHY bus frequency */
+
+static struct emac_platform_data dm646x_evm_emac_pdata = {
+       .phy_mask       = DM646X_EVM_PHY_MASK,
+       .mdio_max_freq  = DM646X_EVM_MDIO_FREQUENCY,
+};
+
 static struct davinci_uart_config uart_config __initdata = {
        .enabled_uarts = (1 << 0),
 };
@@ -68,7 +76,7 @@ static int at24_setup(struct at24_iface *iface, void *context)
                printk(KERN_INFO "Read MAC addr from EEPROM: %s\n",
                print_mac(mac_str, mac_addr));
 
-               davinci_init_emac(mac_addr);
+               memcpy(dm646x_evm_emac_pdata.mac_addr, mac_addr, 6);
        }
        return 0;
 }
@@ -123,6 +131,7 @@ static __init void evm_init(void)
 {
        evm_init_i2c();
        davinci_serial_init(&uart_config);
+       davinci_init_emac(&dm646x_evm_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 0d83cb0..2589b0e 100644
--- a/arch/arm/mach-davinci/board-sffsdr.c
+++ b/arch/arm/mach-davinci/board-sffsdr.c
@@ -54,6 +54,9 @@
 #include <mach/psc.h>
 #include <mach/mux.h>
 
+#define SFFSDR_PHY_MASK                (0x2)
+#define SFFSDR_MDIO_FREQUENCY  (2200000) /* PHY bus frequency */
+
 #define DAVINCI_ASYNC_EMIF_CONTROL_BASE   0x01e00000
 #define DAVINCI_ASYNC_EMIF_DATA_CE0_BASE  0x02000000
 
@@ -108,6 +111,11 @@ static struct platform_device 
davinci_sffsdr_nandflash_device = {
 /* Get Ethernet address from kernel boot params */
 static u8 davinci_sffsdr_mac_addr[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
 
+static struct emac_platform_data sffsdr_emac_pdata = {
+       .phy_mask       = SFFSDR_PHY_MASK,
+       .mdio_max_freq  = SFFSDR_MDIO_FREQUENCY,
+};
+
 static struct at24_platform_data eeprom_info = {
        .byte_len       = (64*1024) / 8,
        .page_size      = 32,
@@ -157,7 +165,8 @@ static __init void davinci_sffsdr_init(void)
                             ARRAY_SIZE(davinci_sffsdr_devices));
        sffsdr_init_i2c();
        davinci_serial_init(&uart_config);
-       davinci_init_emac(davinci_sffsdr_mac_addr);
+       memcpy(sffsdr_emac_pdata.mac_addr, davinci_sffsdr_mac_addr, 6);
+       davinci_init_emac(&sffsdr_emac_pdata);
        setup_usb(0, 0); /* We support only peripheral mode. */
 
        /* mux VLYNQ pins */
diff --git a/arch/arm/mach-davinci/devices.c b/arch/arm/mach-davinci/devices.c
index ffc6d7f..aff91e8 100644
--- a/arch/arm/mach-davinci/devices.c
+++ b/arch/arm/mach-davinci/devices.c
@@ -29,15 +29,12 @@
 #include <mach/cpu.h>
 #include <mach/mux.h>
 #include <mach/mmc.h>
+#include <mach/dm646x.h>
 
 #include "clock.h"
 
 
 #define DAVINCI_I2C_BASE            0x01C21000
-#define DAVINCI_EMAC_CNTRL_REGS_BASE 0x01C80000
-#define DAVINCI_EMAC_CNTRL_MOD_REGS_BASE       0x01C81000
-#define DAVINCI_EMAC_CNTRL_RAM_BASE            0x01C82000
-#define DAVINCI_EMAC_MDIO_REGS_BASE            0x01C84000
 #define DAVINCI_MMCSD0_BASE         0x01E10000
 #define DM355_MMCSD0_BASE           0x01E11000
 #define DM355_MMCSD1_BASE           0x01E00000
@@ -248,136 +245,30 @@ static void davinci_init_wdt(void)
 
 #if defined(CONFIG_TI_DAVINCI_EMAC) || defined(CONFIG_TI_DAVINCI_EMAC_MODULE)
 
-static struct resource emac_resources[] = {
-       {
-               .start  = DAVINCI_EMAC_CNTRL_REGS_BASE,
-               .end    = DAVINCI_EMAC_CNTRL_REGS_BASE + 0x0fff,
-               .flags  = IORESOURCE_MEM,
-               .name   = "ctrl_regs"
-       },
-       {
-               .start  = DAVINCI_EMAC_CNTRL_MOD_REGS_BASE,
-               .end    = DAVINCI_EMAC_CNTRL_MOD_REGS_BASE + 0x0fff,
-               .flags  = IORESOURCE_MEM,
-               .name   = "ctrl_module_regs"
-       },
-       {
-               .start  = DAVINCI_EMAC_CNTRL_RAM_BASE,
-               .end    = DAVINCI_EMAC_CNTRL_RAM_BASE + 0x1fff,
-               .flags  = IORESOURCE_MEM,
-               .name   = "ctrl_ram"
-       },
-       {
-               .start  = DAVINCI_EMAC_MDIO_REGS_BASE,
-               .end    = DAVINCI_EMAC_MDIO_REGS_BASE + 0x07ff,
-               .flags  = IORESOURCE_MEM,
-               .name   = "mdio_regs"
-       },
-       {
-               .start = IRQ_EMACINT,
-               .end   = IRQ_EMACINT,
-               .flags = IORESOURCE_IRQ,
-       },
-};
-
-static struct emac_platform_data emac_pdata;
-
-static struct platform_device davinci_emac_device = {
-       .name           = "davinci_emac",
-       .id             = 1,
-       .num_resources  = ARRAY_SIZE(emac_resources),
-       .resource       = emac_resources,
-       .dev = {
-               .platform_data = &emac_pdata,
-       }
-};
-
-static struct resource dm646x_emac_resources[] = {
-       {
-               .start  = DAVINCI_EMAC_CNTRL_REGS_BASE,
-               .end    = DAVINCI_EMAC_CNTRL_REGS_BASE + 0x0fff,
-               .flags  = IORESOURCE_MEM,
-               .name   = "ctrl_regs"
-       },
-       {
-               .start  = DAVINCI_EMAC_CNTRL_MOD_REGS_BASE,
-               .end    = DAVINCI_EMAC_CNTRL_MOD_REGS_BASE + 0x0fff,
-               .flags  = IORESOURCE_MEM,
-               .name   = "ctrl_module_regs"
-       },
-       {
-               .start  = DAVINCI_EMAC_CNTRL_RAM_BASE,
-               .end    = DAVINCI_EMAC_CNTRL_RAM_BASE + 0x1fff,
-               .flags  = IORESOURCE_MEM,
-               .name   = "ctrl_ram"
-       },
-       {
-               .start  = DAVINCI_EMAC_MDIO_REGS_BASE,
-               .end    = DAVINCI_EMAC_MDIO_REGS_BASE + 0x07ff,
-               .flags  = IORESOURCE_MEM,
-               .name   = "mdio_regs"
-       },
-       {
-               .start  = IRQ_DM646X_EMACRXTHINT,
-               .end    = IRQ_DM646X_EMACRXTHINT,
-               .flags  = IORESOURCE_IRQ,
-       },
-       {
-               .start  = IRQ_DM646X_EMACRXINT,
-               .end    = IRQ_DM646X_EMACRXINT,
-               .flags  = IORESOURCE_IRQ,
-       },
-       {
-               .start  = IRQ_DM646X_EMACTXINT,
-               .end    = IRQ_DM646X_EMACTXINT,
-               .flags  = IORESOURCE_IRQ,
-       },
-       {
-               .start  = IRQ_DM646X_EMACMISCINT,
-               .end    = IRQ_DM646X_EMACMISCINT,
-               .flags  = IORESOURCE_IRQ,
-       },
-};
-
-static struct platform_device dm646x_emac_device = {
-       .name           = "davinci_emac",
-       .id             = 1,
-       .num_resources  = ARRAY_SIZE(dm646x_emac_resources),
-       .resource       = dm646x_emac_resources,
-       .dev = {
-               .platform_data = &emac_pdata,
-       }
-};
-
-void davinci_init_emac(char *mac_addr)
+void davinci_init_emac(struct emac_platform_data *pdata)
 {
        DECLARE_MAC_BUF(buf);
 
-       if (!(cpu_is_davinci_dm644x() || cpu_is_davinci_dm646x()))
-               return;
+       if (cpu_is_davinci_dm644x())
+               dm644x_init_emac(pdata);
+       else if (cpu_is_davinci_dm646x())
+               dm646x_init_emac(pdata);
 
        /* if valid MAC exists, don't re-register */
-       if (is_valid_ether_addr(emac_pdata.mac_addr))
+       if (is_valid_ether_addr(pdata->mac_addr))
                return;
-
-       if (mac_addr && is_valid_ether_addr(mac_addr))
-               memcpy(emac_pdata.mac_addr, mac_addr, 6);
        else {
                /* Use random MAC if none passed */
-               random_ether_addr(emac_pdata.mac_addr);
+               random_ether_addr(pdata->mac_addr);
 
                printk(KERN_WARNING "%s: using random MAC addr: %s\n",
-                      __func__, print_mac(buf, emac_pdata.mac_addr));
+                      __func__, print_mac(buf, pdata->mac_addr));
        }
-       if ((cpu_is_davinci_dm644x()))
-               (void) platform_device_register(&davinci_emac_device);
-       else
-               (void) platform_device_register(&dm646x_emac_device);
 }
 
 #else
 
-void davinci_init_emac(char *unused) {}
+void davinci_init_emac(struct emac_platform_data *unused) {}
 
 #endif
 
@@ -394,11 +285,3 @@ static int __init davinci_init_devices(void)
 }
 arch_initcall(davinci_init_devices);
 
-static int __init davinci_init_devices_late(void)
-{
-       /* This is a backup call in case board code did not call init func */
-       davinci_init_emac(NULL);
-
-       return 0;
-}
-late_initcall(davinci_init_devices_late);
diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c
index b2412e8..4419520 100644
--- a/arch/arm/mach-davinci/dm644x.c
+++ b/arch/arm/mach-davinci/dm644x.c
@@ -312,6 +312,30 @@ struct davinci_clk dm644x_clks[] = {
        CLK(NULL, NULL, NULL),
 };
 
+#if defined(CONFIG_TI_DAVINCI_EMAC) || defined(CONFIG_TI_DAVINCI_EMAC_MODULE)
+
+static struct resource dm644x_emac_resources[] = {
+       {
+               .start  = DM644X_EMAC_BASE,
+               .end    = DM644X_EMAC_BASE + 0x47ff,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               .start = IRQ_EMACINT,
+               .end   = IRQ_EMACINT,
+               .flags = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device dm644x_emac_device = {
+       .name           = "davinci_emac",
+       .id             = 1,
+       .num_resources  = ARRAY_SIZE(dm644x_emac_resources),
+       .resource       = dm644x_emac_resources,
+};
+
+#endif
+
 /*
  * Device specific mux setup
  *
@@ -419,6 +443,23 @@ static struct platform_device dm644x_edma_device = {
 };
 
 /*----------------------------------------------------------------------*/
+#if defined(CONFIG_TI_DAVINCI_EMAC) || defined(CONFIG_TI_DAVINCI_EMAC_MODULE)
+
+void dm644x_init_emac(struct emac_platform_data *pdata)
+{
+       pdata->ctrl_reg_offset          = DM644X_EMAC_CNTRL_OFFSET;
+       pdata->ctrl_mod_reg_offset      = DM644X_EMAC_CNTRL_MOD_OFFSET;
+       pdata->ctrl_ram_offset          = DM644X_EMAC_CNTRL_RAM_OFFSET;
+       pdata->mdio_reg_offset          = DM644X_EMAC_MDIO_OFFSET;
+       pdata->ctrl_ram_size            = DM644X_EMAC_CNTRL_RAM_SIZE;
+       dm644x_emac_device.dev.platform_data = pdata;
+       platform_device_register(&dm644x_emac_device);
+}
+#else
+
+void dm644x_init_emac(struct emac_platform_data *unused) {}
+
+#endif
 
 void __init dm644x_init(void)
 {
diff --git a/arch/arm/mach-davinci/dm646x.c b/arch/arm/mach-davinci/dm646x.c
index c5283d3..b6e8759 100644
--- a/arch/arm/mach-davinci/dm646x.c
+++ b/arch/arm/mach-davinci/dm646x.c
@@ -263,6 +263,44 @@ struct davinci_clk dm646x_clks[] = {
        CLK(NULL, NULL, NULL),
 };
 
+#if defined(CONFIG_TI_DAVINCI_EMAC) || defined(CONFIG_TI_DAVINCI_EMAC_MODULE)
+static struct resource dm646x_emac_resources[] = {
+       {
+               .start  = DM646X_EMAC_BASE,
+               .end    = DM646X_EMAC_BASE + 0x47ff,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               .start  = IRQ_DM646X_EMACRXTHINT,
+               .end    = IRQ_DM646X_EMACRXTHINT,
+               .flags  = IORESOURCE_IRQ,
+       },
+       {
+               .start  = IRQ_DM646X_EMACRXINT,
+               .end    = IRQ_DM646X_EMACRXINT,
+               .flags  = IORESOURCE_IRQ,
+       },
+       {
+               .start  = IRQ_DM646X_EMACTXINT,
+               .end    = IRQ_DM646X_EMACTXINT,
+               .flags  = IORESOURCE_IRQ,
+       },
+       {
+               .start  = IRQ_DM646X_EMACMISCINT,
+               .end    = IRQ_DM646X_EMACMISCINT,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device dm646x_emac_device = {
+       .name           = "davinci_emac",
+       .id             = 1,
+       .num_resources  = ARRAY_SIZE(dm646x_emac_resources),
+       .resource       = dm646x_emac_resources,
+};
+
+#endif
+
 /*
  * Device specific mux setup
  *
@@ -346,6 +384,23 @@ static struct platform_device dm646x_edma_device = {
 
 /*----------------------------------------------------------------------*/
 
+#if defined(CONFIG_TI_DAVINCI_EMAC) || defined(CONFIG_TI_DAVINCI_EMAC_MODULE)
+
+void dm646x_init_emac(struct emac_platform_data *pdata)
+{
+       pdata->ctrl_reg_offset          = DM646X_EMAC_CNTRL_OFFSET;
+       pdata->ctrl_mod_reg_offset      = DM646X_EMAC_CNTRL_MOD_OFFSET;
+       pdata->ctrl_ram_offset          = DM646X_EMAC_CNTRL_RAM_OFFSET;
+       pdata->mdio_reg_offset          = DM646X_EMAC_MDIO_OFFSET;
+       pdata->ctrl_ram_size            = DM646X_EMAC_CNTRL_RAM_SIZE;
+       dm646x_emac_device.dev.platform_data = pdata;
+       platform_device_register(&dm646x_emac_device);
+}
+#else
+
+void dm646x_init_emac(struct emac_platform_data *unused) {}
+
+#endif
 
 void __init dm646x_init(void)
 {
diff --git a/arch/arm/mach-davinci/include/mach/dm644x.h 
b/arch/arm/mach-davinci/include/mach/dm644x.h
index 5b3d512..ace167a 100644
--- a/arch/arm/mach-davinci/include/mach/dm644x.h
+++ b/arch/arm/mach-davinci/include/mach/dm644x.h
@@ -22,8 +22,18 @@
 #ifndef __ASM_ARCH_DM644X_H
 #define __ASM_ARCH_DM644X_H
 
+#include <linux/platform_device.h>
 #include <mach/hardware.h>
+#include <mach/emac.h>
+
+#define DM644X_EMAC_BASE               (0x01C80000)
+#define DM644X_EMAC_CNTRL_OFFSET       (0x0000)
+#define DM644X_EMAC_CNTRL_MOD_OFFSET   (0x1000)
+#define DM644X_EMAC_CNTRL_RAM_OFFSET   (0x2000)
+#define DM644X_EMAC_MDIO_OFFSET                (0x4000)
+#define DM644X_EMAC_CNTRL_RAM_SIZE     (0x2000)
 
 void __init dm644x_init(void);
+void dm644x_init_emac(struct emac_platform_data *pdata);
 
 #endif /* __ASM_ARCH_DM644X_H */
diff --git a/arch/arm/mach-davinci/include/mach/dm646x.h 
b/arch/arm/mach-davinci/include/mach/dm646x.h
index d917939..02ce872 100644
--- a/arch/arm/mach-davinci/include/mach/dm646x.h
+++ b/arch/arm/mach-davinci/include/mach/dm646x.h
@@ -11,8 +11,18 @@
 #ifndef __ASM_ARCH_DM646X_H
 #define __ASM_ARCH_DM646X_H
 
+#include <linux/platform_device.h>
 #include <mach/hardware.h>
+#include <mach/emac.h>
+
+#define DM646X_EMAC_BASE               (0x01C80000)
+#define DM646X_EMAC_CNTRL_OFFSET       (0x0000)
+#define DM646X_EMAC_CNTRL_MOD_OFFSET   (0x1000)
+#define DM646X_EMAC_CNTRL_RAM_OFFSET   (0x2000)
+#define DM646X_EMAC_MDIO_OFFSET                (0x4000)
+#define DM646X_EMAC_CNTRL_RAM_SIZE     (0x2000)
 
 void __init dm646x_init(void);
+void dm646x_init_emac(struct emac_platform_data *pdata);
 
 #endif /* __ASM_ARCH_DM646X_H */
diff --git a/arch/arm/mach-davinci/include/mach/emac.h 
b/arch/arm/mach-davinci/include/mach/emac.h
index 226d2f8..65eba9d 100644
--- a/arch/arm/mach-davinci/include/mach/emac.h
+++ b/arch/arm/mach-davinci/include/mach/emac.h
@@ -13,9 +13,16 @@
 
 struct emac_platform_data {
        char mac_addr[6];
+       u32 ctrl_reg_offset;
+       u32 ctrl_mod_reg_offset;
+       u32 ctrl_ram_offset;
+       u32 mdio_reg_offset;
+       u32 ctrl_ram_size;
+       u32 phy_mask;
+       u32 mdio_max_freq;
 };
 
-void davinci_init_emac(char *mac_addr);
+void davinci_init_emac(struct emac_platform_data *pdata);
 #endif
 
 
-- 
1.5.6

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

Reply via email to