From: Chaithrika U S <[email protected]>

Modify the EMAC resource structure to define one contiguous memory region.
Also add members to the platform data struct to get offsets of EMAC modules.
This simplifies the  memory mapping calls in the driver code.

Signed-off-by: Chaithrika U S <[email protected]>
---
 arch/arm/mach-davinci/devices.c           |   64 ++++----------
 arch/arm/mach-davinci/include/mach/emac.h |    5 +
 drivers/net/davinci_emac.c                |  136 +++++++----------------------
 3 files changed, 52 insertions(+), 153 deletions(-)

diff --git a/arch/arm/mach-davinci/devices.c b/arch/arm/mach-davinci/devices.c
index 0ce50ef..29863d0 100644
--- a/arch/arm/mach-davinci/devices.c
+++ b/arch/arm/mach-davinci/devices.c
@@ -34,10 +34,12 @@
 
 
 #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_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
 #define DAVINCI_MMCSD0_BASE         0x01E10000
 #define DM355_MMCSD0_BASE           0x01E11000
 #define DM355_MMCSD1_BASE           0x01E00000
@@ -251,28 +253,9 @@ static void davinci_init_wdt(void)
 
 static struct resource emac_resources[] = {
        {
-               .start  = DAVINCI_EMAC_CNTRL_REGS_BASE,
-               .end    = DAVINCI_EMAC_CNTRL_REGS_BASE + 0x0fff,
+               .start  = DAVINCI_EMAC_BASE,
+               .end    = DAVINCI_EMAC_BASE + 0x47ff,
                .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,
@@ -281,7 +264,13 @@ static struct resource emac_resources[] = {
        },
 };
 
-static struct emac_platform_data emac_pdata;
+static struct emac_platform_data 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 davinci_emac_device = {
        .name           = "davinci_emac",
@@ -295,28 +284,9 @@ static struct platform_device davinci_emac_device = {
 
 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,
+               .start  = DAVINCI_EMAC_BASE,
+               .end    = DAVINCI_EMAC_BASE + 0x47ff,
                .flags  = IORESOURCE_MEM,
-               .name   = "mdio_regs"
        },
        {
                .start  = IRQ_DM646X_EMACRXTHINT,
diff --git a/arch/arm/mach-davinci/include/mach/emac.h 
b/arch/arm/mach-davinci/include/mach/emac.h
index 226d2f8..7b8c52e 100644
--- a/arch/arm/mach-davinci/include/mach/emac.h
+++ b/arch/arm/mach-davinci/include/mach/emac.h
@@ -13,6 +13,11 @@
 
 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;
 };
 
 void davinci_init_emac(char *mac_addr);
diff --git a/drivers/net/davinci_emac.c b/drivers/net/davinci_emac.c
index cea8273..88263f3 100644
--- a/drivers/net/davinci_emac.c
+++ b/drivers/net/davinci_emac.c
@@ -483,9 +483,9 @@ struct emac_priv {
        char mac_addr[6];
        spinlock_t tx_lock;
        spinlock_t rx_lock;
+       void __iomem *remap_addr;
        u32 emac_base_phys;
        void __iomem *emac_base;
-       u32 emac_ctrl_phys;
        void __iomem *ctrl_base;
        void __iomem *emac_ctrl_ram;
        u32 ctrl_ram_size;
@@ -2603,6 +2603,7 @@ static int __devinit davinci_emac_probe(struct 
platform_device *pdev)
        struct net_device *ndev;
        struct emac_priv *priv;
        unsigned long size;
+       struct emac_platform_data *pdata;
 
        /* obtain emac clock from kernel */
        emac_clk = clk_get(&pdev->dev, "EMACCLK");
@@ -2630,79 +2631,45 @@ static int __devinit davinci_emac_probe(struct 
platform_device *pdev)
        spin_lock_init(&priv->rx_lock);
        spin_lock_init(&priv->lock);
 
-       /* MAC addr: from platform_data */
-       if (pdev->dev.platform_data) {
-               struct emac_platform_data *pdata = pdev->dev.platform_data;
-
-               memcpy(priv->mac_addr, pdata->mac_addr, 6);
+       pdata = pdev->dev.platform_data;
+       if (!pdata) {
+               printk(KERN_ERR "DaVinci EMAC: No platfrom data\n");
+               return -ENODEV;
        }
 
+       /* MAC addr: from platform_data */
+       memcpy(priv->mac_addr, pdata->mac_addr, 6);
+
        /* Get EMAC platform data */
-       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ctrl_regs");
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res) {
-               dev_err(EMAC_DEV, "DaVinci EMAC: Error getting ctrl res\n");
+               dev_err(EMAC_DEV, "DaVinci EMAC: Error getting res\n");
                rc = -ENOENT;
                goto probe_quit;
        }
-       priv->emac_base_phys = res->start;
+
+       priv->emac_base_phys = res->start + pdata->ctrl_reg_offset;
        size = res->end - res->start + 1;
-       if (!request_mem_region(priv->emac_base_phys, size, ndev->name)) {
+       if (!request_mem_region(res->start, size, ndev->name)) {
                dev_err(EMAC_DEV, "DaVinci EMAC: failed request_mem_region() \
-                                        for ctrl regs\n");
+                                        for regs\n");
                rc = -ENXIO;
                goto probe_quit;
        }
-       priv->emac_base = ioremap(res->start, size);
-       if (!priv->emac_base) {
+
+       priv->remap_addr = ioremap(res->start, size);
+       if (!priv->remap_addr) {
                dev_err(EMAC_DEV, "Unable to map IO\n");
                rc = -ENOMEM;
-               release_mem_region(priv->emac_base_phys, size);
+               release_mem_region(res->start, size);
                goto probe_quit;
        }
-       ndev->base_addr = (unsigned long)priv->emac_base;
-
-       res = platform_get_resource_byname(pdev,
-                                       IORESOURCE_MEM, "ctrl_module_regs");
-       if (!res) {
-               dev_err(EMAC_DEV, "DaVinci EMAC: Error getting ctrl module \
-                                       res\n");
-               rc = -ENOENT;
-               goto no_ctrl_mod_res;
-       }
-       priv->emac_ctrl_phys = res->start;
-       size = res->end - res->start + 1;
-       priv->ctrl_base = ioremap(res->start, size);
-       if (!priv->ctrl_base) {
-               dev_err(EMAC_DEV, "Unable to map ctrl regs\n");
-               rc = -ENOMEM;
-               goto no_ctrl_mod_res;
-       }
-       if (!request_mem_region(priv->emac_ctrl_phys, size, ndev->name)) {
-               dev_err(EMAC_DEV, "DaVinci EMAC: failed request_mem_region() \
-                                       for ctrl module regs\n");
-               rc = -ENXIO;
-               goto no_ctrl_mod_res;
-       }
+       priv->emac_base = priv->remap_addr + pdata->ctrl_reg_offset;
+       ndev->base_addr = (unsigned long)priv->remap_addr;
 
-       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ctrl_ram");
-       if (!res) {
-               dev_err(EMAC_DEV, "DaVinci EMAC: Error getting ctrl ram res\n");
-               rc = -ENOENT;
-               goto no_ctrl_ram_res;
-       }
-       priv->ctrl_ram_size = res->end - res->start + 1;
-       priv->emac_ctrl_ram = ioremap(res->start, priv->ctrl_ram_size);
-       if (!priv->emac_ctrl_ram) {
-               dev_err(EMAC_DEV, "Unable to map ctrl RAM\n");
-               rc = -ENOMEM;
-               goto no_ctrl_ram_res;
-       }
-       if (!request_mem_region(res->start, priv->ctrl_ram_size, ndev->name)) {
-               dev_err(EMAC_DEV, "DaVinci EMAC: failed request_mem_region() \
-                                       for ctrl ram regs\n");
-               rc = -ENXIO;
-               goto no_ctrl_ram_res;
-       }
+       priv->ctrl_base = priv->remap_addr + pdata->ctrl_mod_reg_offset;
+       priv->ctrl_ram_size = pdata->ctrl_ram_size;
+       priv->emac_ctrl_ram = priv->remap_addr + pdata->ctrl_ram_offset;
 
        res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
        if (!res) {
@@ -2755,30 +2722,7 @@ static int __devinit davinci_emac_probe(struct 
platform_device *pdev)
        emac_mii->irq   = mii_irqs,
        emac_mii->phy_mask = ~(EMAC_EVM_PHY_MASK);
        emac_mii->parent = &pdev->dev;
-
-       /* Base address initialisation for MDIO */
-       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mdio_regs");
-       if (!res) {
-               dev_err(EMAC_DEV, "DaVinci EMAC: Error getting mdio res\n");
-               rc = -ENOENT;
-               goto no_mdio_res;
-       }
-
-       emac_mii->priv = (void *)(res->start);
-       size = res->end - res->start + 1;
-       emac_mii->priv = ioremap(res->start, size);
-       if (!emac_mii->priv) {
-               dev_err(EMAC_DEV, "Unable to map MDIO regs\n");
-               rc = -ENOMEM;
-               goto no_mdio_res;
-       }
-       if (!request_mem_region(res->start, size, ndev->name)) {
-               dev_err(EMAC_DEV, "DaVinci EMAC: failed request_mem_region() \
-                                       for mdio regs\n");
-               rc = -ENXIO;
-               goto no_mdio_res;
-       }
-
+       emac_mii->priv = priv->remap_addr + pdata->mdio_reg_offset;
        snprintf(priv->mii_bus->id, MII_BUS_ID_SIZE, "%x", priv->pdev->id);
        emac_mii->reset(emac_mii);
 
@@ -2795,28 +2739,14 @@ static int __devinit davinci_emac_probe(struct 
platform_device *pdev)
        return 0;
 
 mdiobus_quit:
-       release_mem_region(res->start, res->end - res->start + 1);
-
-no_mdio_res:
        mdiobus_free(emac_mii);
 
 netdev_reg_err:
 mdio_alloc_err:
 no_irq_res:
-       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ctrl_ram");
-       release_mem_region(res->start, res->end - res->start + 1);
-       iounmap(priv->emac_ctrl_ram);
-
-no_ctrl_ram_res:
-       res = platform_get_resource_byname(pdev,
-                                       IORESOURCE_MEM, "ctrl_module_regs");
-       release_mem_region(res->start, res->end - res->start + 1);
-       iounmap(priv->ctrl_base);
-
-no_ctrl_mod_res:
-       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ctrl_regs");
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        release_mem_region(res->start, res->end - res->start + 1);
-       iounmap(priv->emac_base);
+       iounmap(priv->remap_addr);
 
 probe_quit:
        clk_put(emac_clk);
@@ -2834,7 +2764,6 @@ probe_quit:
 static int __devexit davinci_emac_remove(struct platform_device *pdev)
 {
        struct resource *res;
-       int i = 0;
        struct net_device *ndev = platform_get_drvdata(pdev);
        struct emac_priv *priv = netdev_priv(ndev);
 
@@ -2846,17 +2775,12 @@ static int __devexit davinci_emac_remove(struct 
platform_device *pdev)
        mdiobus_unregister(priv->mii_bus);
        mdiobus_free(priv->mii_bus);
 
-       while ((res = platform_get_resource(priv->pdev, IORESOURCE_MEM, i))) {
-               release_mem_region(res->start, res->end - res->start + 1);
-               i++;
-       }
+       release_mem_region(res->start, res->end - res->start + 1);
 
        unregister_netdev(ndev);
        free_netdev(ndev);
-       iounmap(priv->emac_base);
-       iounmap(priv->ctrl_base);
-       iounmap(priv->emac_ctrl_ram);
-       iounmap(emac_mii->priv);
+       iounmap(priv->remap_addr);
+
        clk_disable(emac_clk);
        clk_put(emac_clk);
 
-- 
1.5.4.1

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

Reply via email to