Commit a1594321 authored by Tony Lindgren's avatar Tony Lindgren Committed by David S. Miller

net: davinci_emac: Fix ioremap for devices with MDIO within the EMAC address space

Some devices like dm816x have the MDIO registers within the first EMAC
instance address space. Let's fix the issue by allowing to pass an
optional second IO range for the EMAC control register area.

Cc: Brian Hutchinson <b.hutchman@gmail.com>
Cc: Felipe Balbi <balbi@ti.com>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1d82ffa6
...@@ -1890,7 +1890,7 @@ davinci_emac_of_get_pdata(struct platform_device *pdev, struct emac_priv *priv) ...@@ -1890,7 +1890,7 @@ davinci_emac_of_get_pdata(struct platform_device *pdev, struct emac_priv *priv)
static int davinci_emac_probe(struct platform_device *pdev) static int davinci_emac_probe(struct platform_device *pdev)
{ {
int rc = 0; int rc = 0;
struct resource *res; struct resource *res, *res_ctrl;
struct net_device *ndev; struct net_device *ndev;
struct emac_priv *priv; struct emac_priv *priv;
unsigned long hw_ram_addr; unsigned long hw_ram_addr;
...@@ -1949,11 +1949,20 @@ static int davinci_emac_probe(struct platform_device *pdev) ...@@ -1949,11 +1949,20 @@ static int davinci_emac_probe(struct platform_device *pdev)
rc = PTR_ERR(priv->remap_addr); rc = PTR_ERR(priv->remap_addr);
goto no_pdata; goto no_pdata;
} }
res_ctrl = platform_get_resource(pdev, IORESOURCE_MEM, 1);
if (res_ctrl) {
priv->ctrl_base =
devm_ioremap_resource(&pdev->dev, res_ctrl);
if (IS_ERR(priv->ctrl_base))
goto no_pdata;
} else {
priv->ctrl_base = priv->remap_addr + pdata->ctrl_mod_reg_offset;
}
priv->emac_base = priv->remap_addr + pdata->ctrl_reg_offset; priv->emac_base = priv->remap_addr + pdata->ctrl_reg_offset;
ndev->base_addr = (unsigned long)priv->remap_addr; ndev->base_addr = (unsigned long)priv->remap_addr;
priv->ctrl_base = priv->remap_addr + pdata->ctrl_mod_reg_offset;
hw_ram_addr = pdata->hw_ram_addr; hw_ram_addr = pdata->hw_ram_addr;
if (!hw_ram_addr) if (!hw_ram_addr)
hw_ram_addr = (u32 __force)res->start + pdata->ctrl_ram_offset; hw_ram_addr = (u32 __force)res->start + pdata->ctrl_ram_offset;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment