Kevin,

> > 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.
> >
> > Signed-off-by: Chaithrika U S <[email protected]>
> > ---
> >  arch/arm/mach-davinci/board-dm644x-evm.c    |   10 ++
> >  arch/arm/mach-davinci/board-dm646x-evm.c    |   10 ++
> >  arch/arm/mach-davinci/board-sffsdr.c        |   12 +++
> >  arch/arm/mach-davinci/devices.c             |  127 ++++-------------
> ----------
> >  arch/arm/mach-davinci/dm644x.c              |   49 ++++++++++
> >  arch/arm/mach-davinci/dm646x.c              |   63 +++++++++++++
> >  arch/arm/mach-davinci/include/mach/dm644x.h |    2 +
> >  arch/arm/mach-davinci/include/mach/dm646x.h |    2 +
> >  arch/arm/mach-davinci/include/mach/emac.h   |    7 ++
> >  9 files changed, 171 insertions(+), 111 deletions(-)
> >
> > diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c
> b/arch/arm/mach-davinci/board-dm644x-evm.c
> > index 20ec961..789f178 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 DAVINCI_EVM_PHY_MASK         0x2
> > +#define EMAC_EVM_MDIO_FREQUENCY              (2200000) /* PHY bus
> frequency */
> > +
> >  #define DAVINCI_CFC_ATA_BASE           0x01C66000
> >
> >  #define DAVINCI_ASYNC_EMIF_CONTROL_BASE   0x01e00000
> > @@ -410,6 +413,8 @@ static int at24_setup(struct at24_iface *iface,
> void *context)
> >  {
> >        DECLARE_MAC_BUF(mac_str);
> >        char mac_addr[6];
> > +     struct platform_device *pdev;
> > +     struct emac_platform_data *pdata;
> >
> >        at24_if = iface;
> >
> > @@ -418,6 +423,11 @@ 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));
> >
> > +             pdev = dm644x_get_emac_pdev();
> > +             pdata = pdev->dev.platform_data;
> > +             pdata->phy_mask = DAVINCI_EVM_PHY_MASK;
> > +             pdata->mdio_max_freq = EMAC_EVM_MDIO_FREQUENCY;
> > +
> >                davinci_init_emac(mac_addr);
> >        }
>
> at24_setup() is not the right place for this.  For example, if no
> EEPROM is detected then these values will not be setup correctly.
> These should be set separately from the EEPROM setup.
>
> I think that a reasonable default should be set in the dm<soc>.c file
> and then a way for the board code to override the defaults. I'm not
> crazy about the dm<soc>_get_emac_pdev().
>
> I think I would rather see davinci_init_emac() expanded to take some
> sort of 'emac_init' struct which contains the MAC, and these new
> parameters.  If the values are non-zero (or not -1) then
> davinci_init_emac() updates the pdata before the
> platform_device_register().
>

Thank you for reviewing the patches.
Developing on your suggestion, the following could be implemented:
- The emac_platform_data structure for a board/EVM will be defined in
   the board_xxx.c file.
- The board/evm init function will call davinci_init_emac() with
   platform data pointer being passed as a parameter.
- The <soc>_init_emac() function in the <soc>.c file will populate
   the necessary members of the platform data and register the
   platform device.
- at24_setup() will only read the MAC address and copy it to the platform
   data structure and not call the davinci_init_emac().
In this case, there is no need of a late_initcall for emac.
Let me know your opinion.

>
> > diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c
> b/arch/arm/mach-davinci/board-dm646x-evm.c
> > index 907f424..b4e884a 100644
> > --- a/arch/arm/mach-davinci/board-dm646x-evm.c
> > +++ b/arch/arm/mach-davinci/board-dm646x-evm.c
> > @@ -46,6 +46,9 @@
> >  #include <linux/etherdevice.h>
> >  #include <mach/emac.h>
> >
> > +#define DAVINCI_EVM_PHY_MASK         0x2
> > +#define EMAC_EVM_MDIO_FREQUENCY              (2200000) /* PHY bus
> frequency */
> > +
> >  static struct davinci_uart_config uart_config __initdata = {
> >        .enabled_uarts = (1 << 0),
> >  };
> > @@ -60,6 +63,8 @@ static int at24_setup(struct at24_iface *iface,
> void *context)
> >  {
> >        DECLARE_MAC_BUF(mac_str);
> >        char mac_addr[6];
> > +     struct platform_device *pdev;
> > +     struct emac_platform_data *pdata;
> >
> >        at24_if = iface;
> >
> > @@ -68,6 +73,11 @@ 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));
> >
> > +             pdev = dm646x_get_emac_pdev();
> > +             pdata = pdev->dev.platform_data;
> > +             pdata->phy_mask = DAVINCI_EVM_PHY_MASK;
> > +             pdata->mdio_max_freq = EMAC_EVM_MDIO_FREQUENCY;
> > +
> >                davinci_init_emac(mac_addr);
> >        }
> >        return 0;
> > diff --git a/arch/arm/mach-davinci/board-sffsdr.c b/arch/arm/mach-
> davinci/board-sffsdr.c
> > index 0d83cb0..8e64d48 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 DAVINCI_EVM_PHY_MASK         0x2
> > +#define EMAC_EVM_MDIO_FREQUENCY              (2200000) /* PHY bus
> frequency */
> > +
> >  #define DAVINCI_ASYNC_EMIF_CONTROL_BASE   0x01e00000
> >  #define DAVINCI_ASYNC_EMIF_DATA_CE0_BASE  0x02000000
> >
> > @@ -153,10 +156,19 @@ static void __init davinci_sffsdr_map_io(void)
> >
> >  static __init void davinci_sffsdr_init(void)
> >  {
> > +     struct platform_device *pdev;
> > +     struct emac_platform_data *pdata;
> > +
> >        platform_add_devices(davinci_sffsdr_devices,
> >                             ARRAY_SIZE(davinci_sffsdr_devices));
> >        sffsdr_init_i2c();
> >        davinci_serial_init(&uart_config);
> > +
> > +     pdev = dm644x_get_emac_pdev();
> > +     pdata = pdev->dev.platform_data;
> > +     pdata->phy_mask = DAVINCI_EVM_PHY_MASK;
> > +     pdata->mdio_max_freq = EMAC_EVM_MDIO_FREQUENCY;
> > +
> >        davinci_init_emac(davinci_sffsdr_mac_addr);
> >        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 a0f5a60..22c2deb 100644
> > --- a/arch/arm/mach-davinci/devices.c
> > +++ b/arch/arm/mach-davinci/devices.c
> > @@ -29,6 +29,7 @@
> >  #include <mach/cpu.h>
> >  #include <mach/mux.h>
> >  #include <mach/mmc.h>
> > +#include <mach/dm646x.h>
> >
> >  #include "clock.h"
> >
> > @@ -252,131 +253,35 @@ 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)
> >  {
> > +     struct platform_device *pdev;
> > +     struct emac_platform_data *pdata;
> > +
> >        DECLARE_MAC_BUF(buf);
> >
> > -     if (!(cpu_is_davinci_dm644x() || cpu_is_davinci_dm646x()))
> > -             return;
> > +     if (cpu_is_davinci_dm644x())
> > +             pdev = dm644x_get_emac_pdev();
> > +     else if (cpu_is_davinci_dm646x())
> > +             pdev = dm646x_get_emac_pdev();
> > +
> > +     pdata = pdev->dev.platform_data;
> >
> >        /* 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);
> > +             memcpy(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);
> > +
> > +     (void) platform_device_register(pdev);
> >  }
> >
> >  #else
> > diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-
> davinci/dm644x.c
> > index 7251b82..cec9584 100644
> > --- a/arch/arm/mach-davinci/dm644x.c
> > +++ b/arch/arm/mach-davinci/dm644x.c
> > @@ -11,11 +11,14 @@
> >  #include <linux/kernel.h>
> >  #include <linux/init.h>
> >  #include <linux/clk.h>
> > +#include <linux/platform_device.h>
> >
> >  #include <mach/dm644x.h>
> >  #include <mach/clock.h>
> >  #include <mach/psc.h>
> >  #include <mach/mux.h>
> > +#include <mach/irqs.h>
> > +#include <mach/emac.h>
> >
> >  #include "clock.h"
> >  #include "mux.h"
> > @@ -24,6 +27,12 @@
> >   * Device specific clocks
> >   */
> >  #define DM644X_REF_FREQ              27000000
> > +#define DAVINCI_EMAC_BASE            0x01C80000
> > +#define DAVINCI_EMAC_CNTRL_OFFSET    0x0000
> > +#define DAVINCI_EMAC_CNTRL_MOD_OFFSET        0x1000
> > +#define DAVINCI_EMAC_CNTRL_RAM_OFFSET        0x2000
> > +#define DAVINCI_EMAC_MDIO_OFFSET     0x4000
> > +#define DAVINCI_EMAC_CNTRL_RAM_SIZE  0x2000
>
> Let's move these to dm644x.h
>
OK

> >  static struct pll_data pll1_data = {
> >        .num       = 1,
> > @@ -306,6 +315,46 @@ static struct clk *dm644x_clks[] __initdata = {
> >        NULL,
> >  };
> >
> > +#if defined(CONFIG_TI_DAVINCI_EMAC) ||
> defined(CONFIG_TI_DAVINCI_EMAC_MODULE)
> > +
> > +static struct resource dm644x_emac_resources[] = {
> > +     {
> > +             .start  = DAVINCI_EMAC_BASE,
> > +             .end    = DAVINCI_EMAC_BASE + 0x47ff,
> > +             .flags  = IORESOURCE_MEM,
> > +     },
> > +     {
> > +             .start = IRQ_EMACINT,
> > +             .end   = IRQ_EMACINT,
> > +             .flags = IORESOURCE_IRQ,
> > +     },
> > +};
> > +
> > +static struct emac_platform_data dm644x_emac_pdata = {
> > +     .ctrl_reg_offset        = DAVINCI_EMAC_CNTRL_OFFSET,
> > +     .ctrl_mod_reg_offset    = DAVINCI_EMAC_CNTRL_MOD_OFFSET,
> > +     .ctrl_ram_offset        = DAVINCI_EMAC_CNTRL_RAM_OFFSET,
> > +     .mdio_reg_offset        = DAVINCI_EMAC_MDIO_OFFSET,
> > +     .ctrl_ram_size          = DAVINCI_EMAC_CNTRL_RAM_SIZE,
> > +};
> > +
> > +static struct platform_device dm644x_emac_device = {
> > +       .name         = "davinci_emac",
> > +       .id           = 1,
> > +       .num_resources        = ARRAY_SIZE(dm644x_emac_resources),
> > +       .resource     = dm644x_emac_resources,
> > +       .dev = {
> > +             .platform_data = &dm644x_emac_pdata,
> > +     }
> > +};
> > +
> > +struct platform_device *dm644x_get_emac_pdev(void)
> > +{
> > +     return &dm644x_emac_device;
> > +}
> > +
> > +#endif
> > +
> >  /*
> >   * Device specific mux setup
> >   *
> > diff --git a/arch/arm/mach-davinci/dm646x.c b/arch/arm/mach-
> davinci/dm646x.c
> > index 6b13bcc..903a254 100644
> > --- a/arch/arm/mach-davinci/dm646x.c
> > +++ b/arch/arm/mach-davinci/dm646x.c
> > @@ -11,11 +11,14 @@
> >  #include <linux/kernel.h>
> >  #include <linux/init.h>
> >  #include <linux/clk.h>
> > +#include <linux/platform_device.h>
> >
> >  #include <mach/dm644x.h>
> >  #include <mach/clock.h>
> >  #include <mach/psc.h>
> >  #include <mach/mux.h>
> > +#include <mach/irqs.h>
> > +#include <mach/emac.h>
> >
> >  #include "clock.h"
> >  #include "mux.h"
> > @@ -25,6 +28,12 @@
> >   */
> >  #define DM646X_REF_FREQ              27000000
> >  #define DM646X_AUX_FREQ              24000000
> > +#define DAVINCI_EMAC_BASE            0x01C80000
> > +#define DAVINCI_EMAC_CNTRL_OFFSET    0x0000
> > +#define DAVINCI_EMAC_CNTRL_MOD_OFFSET        0x1000
> > +#define DAVINCI_EMAC_CNTRL_RAM_OFFSET        0x2000
> > +#define DAVINCI_EMAC_MDIO_OFFSET     0x4000
> > +#define DAVINCI_EMAC_CNTRL_RAM_SIZE  0x2000
>
> ... and these to dm646x.h
>
OK

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

Reply via email to