Cc: Chaithrika Subrahmanya <[email protected]>
Signed-off-by: Kevin Hilman <[email protected]>
---
Chaithrika, this driver currently requests several memory regions which
are appear to be contiguous, at least on dm644x. Are these contiguous
on other devices as well? If so, for your upstream work, you might consider
simplifying by just mapping a single region and let the driver internals
map out the offsets to different regions. It would also make handling
the various init-time error handling paths much simpler.
diff --git a/drivers/net/davinci_emac.c b/drivers/net/davinci_emac.c
index 1f86256..358c4c6 100644
--- a/drivers/net/davinci_emac.c
+++ b/drivers/net/davinci_emac.c
@@ -29,9 +29,7 @@
*/
/** Pending Items in this driver:
- * 1. use ioremap(), remove davinci_readl()/etc, minimize __force
- * 2. Use Linux cache infrastcture for DMA'ed memory (dma_xxx functions)
- * 3. Add DM646x support (gigabit included)
+ * 1. Use Linux cache infrastcture for DMA'ed memory (dma_xxx functions)
*/
#include <linux/module.h>
@@ -485,8 +483,10 @@ struct emac_priv {
char mac_addr[6];
spinlock_t tx_lock;
spinlock_t rx_lock;
- u32 emac_base_regs;
- u32 emac_ctrl_regs;
+ 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;
struct emac_txch *txch[EMAC_DEF_MAX_TX_CH];
@@ -557,16 +557,15 @@ static char *emac_rxhost_errcodes[16] = {
#define EMAC_DEV (&(priv)->ndev->dev)
/* Helper macros */
-#define emac_read(reg) davinci_readl((priv->emac_base_regs + (reg)))
-#define emac_write(reg, val) \
- davinci_writel(val, (priv->emac_base_regs + (reg)))
+#define emac_read(reg) ioread32(priv->emac_base + (reg))
+#define emac_write(reg, val) iowrite32(val, priv->emac_base + (reg))
-#define emac_ctrl_read(reg) davinci_readl((priv->emac_ctrl_regs + (reg)))
-#define emac_ctrl_write(reg, val) \
- davinci_writel(val, (priv->emac_ctrl_regs + (reg)))
+#define emac_ctrl_read(reg) ioread32((priv->ctrl_base + (reg)))
+#define emac_ctrl_write(reg, val) iowrite32(val, (priv->ctrl_base + (reg)))
+
+#define emac_mdio_read(reg) ioread32(bus->priv + (reg))
+#define emac_mdio_write(reg, val) iowrite32(val, (bus->priv + (reg)))
-#define emac_mdio_read(reg) davinci_readl((bus->priv + (reg)))
-#define emac_mdio_write(reg, val) davinci_writel(val, (bus->priv + (reg)))
/**
* emac_dump_regs: Dump important EMAC registers to debug terminal
* @priv: The DaVinci EMAC private adapter structure
@@ -2603,6 +2602,7 @@ static int __devinit davinci_emac_probe(struct
platform_device *pdev)
struct resource *res;
struct net_device *ndev;
struct emac_priv *priv;
+ unsigned long size;
/* obtain emac clock from kernel */
emac_clk = clk_get(&pdev->dev, "EMACCLK");
@@ -2644,16 +2644,22 @@ static int __devinit davinci_emac_probe(struct
platform_device *pdev)
rc = -ENOENT;
goto probe_quit;
}
- priv->emac_base_regs = res->start;
- ndev->base_addr = (unsigned long)IO_ADDRESS(res->start);
- if (!request_mem_region((u32)priv->emac_base_regs,
- (res->end - res->start + 1),
- ndev->name)) {
+ priv->emac_base_phys = res->start;
+ size = res->end - res->start + 1;
+ if (!request_mem_region(priv->emac_base_phys, size, ndev->name)) {
dev_err(EMAC_DEV, "DaVinci EMAC: failed request_mem_region() \
for ctrl regs\n");
rc = -ENXIO;
goto probe_quit;
}
+ priv->emac_base = ioremap(res->start, size);
+ if (!priv->emac_base) {
+ dev_err(EMAC_DEV, "Unable to map IO\n");
+ rc = -ENOMEM;
+ release_mem_region(priv->emac_base_phys, size);
+ goto probe_quit;
+ }
+ ndev->base_addr = (unsigned long)priv->emac_base;
res = platform_get_resource_byname(pdev,
IORESOURCE_MEM, "ctrl_module_regs");
@@ -2663,10 +2669,15 @@ static int __devinit davinci_emac_probe(struct
platform_device *pdev)
rc = -ENOENT;
goto no_ctrl_mod_res;
}
- priv->emac_ctrl_regs = res->start;
- if (!request_mem_region((u32)priv->emac_ctrl_regs,
- (res->end - res->start + 1),
- ndev->name)) {
+ 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;
@@ -2679,11 +2690,14 @@ static int __devinit davinci_emac_probe(struct
platform_device *pdev)
rc = -ENOENT;
goto no_ctrl_ram_res;
}
- priv->emac_ctrl_ram = IO_ADDRESS(res->start);
priv->ctrl_ram_size = res->end - res->start + 1;
- if (!request_mem_region(res->start,
- (res->end - res->start + 1),
- ndev->name)) {
+ 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;
@@ -2751,9 +2765,14 @@ static int __devinit davinci_emac_probe(struct
platform_device *pdev)
}
emac_mii->priv = (void *)(res->start);
- if (!request_mem_region(res->start,
- (res->end - res->start + 1),
- ndev->name)) {
+ 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;
@@ -2771,7 +2790,7 @@ static int __devinit davinci_emac_probe(struct
platform_device *pdev)
if (netif_msg_probe(priv)) {
dev_notice(EMAC_DEV, "DaVinci EMAC Probe found device "\
"(regs: %p, irq: %d)\n",
- (void *)priv->emac_base_regs, ndev->irq);
+ (void *)priv->emac_base_phys, ndev->irq);
}
return 0;
@@ -2786,15 +2805,18 @@ 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(res->start, res->end - res->start + 1);
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(res->start, res->end - res->start + 1);
no_ctrl_mod_res:
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ctrl_regs");
release_mem_region(res->start, res->end - res->start + 1);
+ iounmap(res->start, res->end - res->start + 1);
probe_quit:
clk_put(emac_clk);
@@ -2831,6 +2853,10 @@ static int __devexit davinci_emac_remove(struct
platform_device *pdev)
unregister_netdev(ndev);
free_netdev(ndev);
+ iounmap(priv->emac_base);
+ iounmap(priv->ctrl_base);
+ iounmap(priv->emac_ctrl_ram);
+ iounmap(emac_mii->priv);
clk_disable(emac_clk);
clk_put(emac_clk);
--
1.6.1
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source