ARM/net: ixp4xx: Pass ethernet physical base as resource
In order to probe this ethernet interface from the device tree all physical MMIO regions must be passed as resources. Begin this rewrite by first passing the port base address as a resource for all platforms using this driver, remap it in the driver and avoid using any reference of the statically mapped virtual address in the driver. Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Родитель
3cb5b0ee72
Коммит
f458ac4797
|
@ -132,6 +132,22 @@ static struct platform_device fsg_leds = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Built-in 10/100 Ethernet MAC interfaces */
|
/* Built-in 10/100 Ethernet MAC interfaces */
|
||||||
|
static struct resource fsg_eth_npeb_resources[] = {
|
||||||
|
{
|
||||||
|
.start = IXP4XX_EthB_BASE_PHYS,
|
||||||
|
.end = IXP4XX_EthB_BASE_PHYS + 0x0fff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource fsg_eth_npec_resources[] = {
|
||||||
|
{
|
||||||
|
.start = IXP4XX_EthC_BASE_PHYS,
|
||||||
|
.end = IXP4XX_EthC_BASE_PHYS + 0x0fff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct eth_plat_info fsg_plat_eth[] = {
|
static struct eth_plat_info fsg_plat_eth[] = {
|
||||||
{
|
{
|
||||||
.phy = 5,
|
.phy = 5,
|
||||||
|
@ -151,12 +167,16 @@ static struct platform_device fsg_eth[] = {
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = fsg_plat_eth,
|
.platform_data = fsg_plat_eth,
|
||||||
},
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(fsg_eth_npeb_resources),
|
||||||
|
.resource = fsg_eth_npeb_resources,
|
||||||
}, {
|
}, {
|
||||||
.name = "ixp4xx_eth",
|
.name = "ixp4xx_eth",
|
||||||
.id = IXP4XX_ETH_NPEC,
|
.id = IXP4XX_ETH_NPEC,
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = fsg_plat_eth + 1,
|
.platform_data = fsg_plat_eth + 1,
|
||||||
},
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(fsg_eth_npec_resources),
|
||||||
|
.resource = fsg_eth_npec_resources,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -273,6 +273,22 @@ static struct platform_device device_uarts = {
|
||||||
|
|
||||||
|
|
||||||
/* Built-in 10/100 Ethernet MAC interfaces */
|
/* Built-in 10/100 Ethernet MAC interfaces */
|
||||||
|
static struct resource eth_npeb_resources[] = {
|
||||||
|
{
|
||||||
|
.start = IXP4XX_EthB_BASE_PHYS,
|
||||||
|
.end = IXP4XX_EthB_BASE_PHYS + 0x0fff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource eth_npec_resources[] = {
|
||||||
|
{
|
||||||
|
.start = IXP4XX_EthC_BASE_PHYS,
|
||||||
|
.end = IXP4XX_EthC_BASE_PHYS + 0x0fff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct eth_plat_info eth_plat[] = {
|
static struct eth_plat_info eth_plat[] = {
|
||||||
{
|
{
|
||||||
.phy = 0,
|
.phy = 0,
|
||||||
|
@ -290,10 +306,14 @@ static struct platform_device device_eth_tab[] = {
|
||||||
.name = "ixp4xx_eth",
|
.name = "ixp4xx_eth",
|
||||||
.id = IXP4XX_ETH_NPEB,
|
.id = IXP4XX_ETH_NPEB,
|
||||||
.dev.platform_data = eth_plat,
|
.dev.platform_data = eth_plat,
|
||||||
|
.num_resources = ARRAY_SIZE(eth_npeb_resources),
|
||||||
|
.resource = eth_npeb_resources,
|
||||||
}, {
|
}, {
|
||||||
.name = "ixp4xx_eth",
|
.name = "ixp4xx_eth",
|
||||||
.id = IXP4XX_ETH_NPEC,
|
.id = IXP4XX_ETH_NPEC,
|
||||||
.dev.platform_data = eth_plat + 1,
|
.dev.platform_data = eth_plat + 1,
|
||||||
|
.num_resources = ARRAY_SIZE(eth_npec_resources),
|
||||||
|
.resource = eth_npec_resources,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -187,6 +187,22 @@ static struct platform_device ixdp425_uart = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Built-in 10/100 Ethernet MAC interfaces */
|
/* Built-in 10/100 Ethernet MAC interfaces */
|
||||||
|
static struct resource ixp425_npeb_resources[] = {
|
||||||
|
{
|
||||||
|
.start = IXP4XX_EthB_BASE_PHYS,
|
||||||
|
.end = IXP4XX_EthB_BASE_PHYS + 0x0fff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource ixp425_npec_resources[] = {
|
||||||
|
{
|
||||||
|
.start = IXP4XX_EthC_BASE_PHYS,
|
||||||
|
.end = IXP4XX_EthC_BASE_PHYS + 0x0fff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct eth_plat_info ixdp425_plat_eth[] = {
|
static struct eth_plat_info ixdp425_plat_eth[] = {
|
||||||
{
|
{
|
||||||
.phy = 0,
|
.phy = 0,
|
||||||
|
@ -204,10 +220,14 @@ static struct platform_device ixdp425_eth[] = {
|
||||||
.name = "ixp4xx_eth",
|
.name = "ixp4xx_eth",
|
||||||
.id = IXP4XX_ETH_NPEB,
|
.id = IXP4XX_ETH_NPEB,
|
||||||
.dev.platform_data = ixdp425_plat_eth,
|
.dev.platform_data = ixdp425_plat_eth,
|
||||||
|
.num_resources = ARRAY_SIZE(ixp425_npeb_resources),
|
||||||
|
.resource = ixp425_npeb_resources,
|
||||||
}, {
|
}, {
|
||||||
.name = "ixp4xx_eth",
|
.name = "ixp4xx_eth",
|
||||||
.id = IXP4XX_ETH_NPEC,
|
.id = IXP4XX_ETH_NPEC,
|
||||||
.dev.platform_data = ixdp425_plat_eth + 1,
|
.dev.platform_data = ixdp425_plat_eth + 1,
|
||||||
|
.num_resources = ARRAY_SIZE(ixp425_npec_resources),
|
||||||
|
.resource = ixp425_npec_resources,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -165,6 +165,14 @@ static struct platform_device nas100d_uart = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Built-in 10/100 Ethernet MAC interfaces */
|
/* Built-in 10/100 Ethernet MAC interfaces */
|
||||||
|
static struct resource nas100d_eth_resources[] = {
|
||||||
|
{
|
||||||
|
.start = IXP4XX_EthB_BASE_PHYS,
|
||||||
|
.end = IXP4XX_EthB_BASE_PHYS + 0x0fff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct eth_plat_info nas100d_plat_eth[] = {
|
static struct eth_plat_info nas100d_plat_eth[] = {
|
||||||
{
|
{
|
||||||
.phy = 0,
|
.phy = 0,
|
||||||
|
@ -178,6 +186,8 @@ static struct platform_device nas100d_eth[] = {
|
||||||
.name = "ixp4xx_eth",
|
.name = "ixp4xx_eth",
|
||||||
.id = IXP4XX_ETH_NPEB,
|
.id = IXP4XX_ETH_NPEB,
|
||||||
.dev.platform_data = nas100d_plat_eth,
|
.dev.platform_data = nas100d_plat_eth,
|
||||||
|
.num_resources = ARRAY_SIZE(nas100d_eth_resources),
|
||||||
|
.resource = nas100d_eth_resources,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -185,6 +185,14 @@ static struct platform_device nslu2_uart = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Built-in 10/100 Ethernet MAC interfaces */
|
/* Built-in 10/100 Ethernet MAC interfaces */
|
||||||
|
static struct resource nslu2_eth_resources[] = {
|
||||||
|
{
|
||||||
|
.start = IXP4XX_EthB_BASE_PHYS,
|
||||||
|
.end = IXP4XX_EthB_BASE_PHYS + 0x0fff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct eth_plat_info nslu2_plat_eth[] = {
|
static struct eth_plat_info nslu2_plat_eth[] = {
|
||||||
{
|
{
|
||||||
.phy = 1,
|
.phy = 1,
|
||||||
|
@ -198,6 +206,8 @@ static struct platform_device nslu2_eth[] = {
|
||||||
.name = "ixp4xx_eth",
|
.name = "ixp4xx_eth",
|
||||||
.id = IXP4XX_ETH_NPEB,
|
.id = IXP4XX_ETH_NPEB,
|
||||||
.dev.platform_data = nslu2_plat_eth,
|
.dev.platform_data = nslu2_plat_eth,
|
||||||
|
.num_resources = ARRAY_SIZE(nslu2_eth_resources),
|
||||||
|
.resource = nslu2_eth_resources,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -170,6 +170,22 @@ static struct platform_device mic256_leds = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Built-in 10/100 Ethernet MAC interfaces */
|
/* Built-in 10/100 Ethernet MAC interfaces */
|
||||||
|
static struct resource ixp425_npeb_resources[] = {
|
||||||
|
{
|
||||||
|
.start = IXP4XX_EthB_BASE_PHYS,
|
||||||
|
.end = IXP4XX_EthB_BASE_PHYS + 0x0fff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource ixp425_npec_resources[] = {
|
||||||
|
{
|
||||||
|
.start = IXP4XX_EthC_BASE_PHYS,
|
||||||
|
.end = IXP4XX_EthC_BASE_PHYS + 0x0fff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct eth_plat_info ixdp425_plat_eth[] = {
|
static struct eth_plat_info ixdp425_plat_eth[] = {
|
||||||
{
|
{
|
||||||
.phy = 0,
|
.phy = 0,
|
||||||
|
@ -187,10 +203,14 @@ static struct platform_device ixdp425_eth[] = {
|
||||||
.name = "ixp4xx_eth",
|
.name = "ixp4xx_eth",
|
||||||
.id = IXP4XX_ETH_NPEB,
|
.id = IXP4XX_ETH_NPEB,
|
||||||
.dev.platform_data = ixdp425_plat_eth,
|
.dev.platform_data = ixdp425_plat_eth,
|
||||||
|
.num_resources = ARRAY_SIZE(ixp425_npeb_resources),
|
||||||
|
.resource = ixp425_npeb_resources,
|
||||||
}, {
|
}, {
|
||||||
.name = "ixp4xx_eth",
|
.name = "ixp4xx_eth",
|
||||||
.id = IXP4XX_ETH_NPEC,
|
.id = IXP4XX_ETH_NPEC,
|
||||||
.dev.platform_data = ixdp425_plat_eth + 1,
|
.dev.platform_data = ixdp425_plat_eth + 1,
|
||||||
|
.num_resources = ARRAY_SIZE(ixp425_npec_resources),
|
||||||
|
.resource = ixp425_npec_resources,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -124,6 +124,22 @@ static struct platform_device vulcan_uart = {
|
||||||
.num_resources = ARRAY_SIZE(vulcan_uart_resources),
|
.num_resources = ARRAY_SIZE(vulcan_uart_resources),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct resource vulcan_npeb_resources[] = {
|
||||||
|
{
|
||||||
|
.start = IXP4XX_EthB_BASE_PHYS,
|
||||||
|
.end = IXP4XX_EthB_BASE_PHYS + 0x0fff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource vulcan_npec_resources[] = {
|
||||||
|
{
|
||||||
|
.start = IXP4XX_EthC_BASE_PHYS,
|
||||||
|
.end = IXP4XX_EthC_BASE_PHYS + 0x0fff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct eth_plat_info vulcan_plat_eth[] = {
|
static struct eth_plat_info vulcan_plat_eth[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
.phy = 0,
|
.phy = 0,
|
||||||
|
@ -144,6 +160,8 @@ static struct platform_device vulcan_eth[] = {
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = &vulcan_plat_eth[0],
|
.platform_data = &vulcan_plat_eth[0],
|
||||||
},
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(vulcan_npeb_resources),
|
||||||
|
.resource = vulcan_npeb_resources,
|
||||||
},
|
},
|
||||||
[1] = {
|
[1] = {
|
||||||
.name = "ixp4xx_eth",
|
.name = "ixp4xx_eth",
|
||||||
|
@ -151,6 +169,8 @@ static struct platform_device vulcan_eth[] = {
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = &vulcan_plat_eth[1],
|
.platform_data = &vulcan_plat_eth[1],
|
||||||
},
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(vulcan_npec_resources),
|
||||||
|
.resource = vulcan_npec_resources,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1365,9 +1365,10 @@ static int ixp4xx_eth_probe(struct platform_device *pdev)
|
||||||
struct phy_device *phydev = NULL;
|
struct phy_device *phydev = NULL;
|
||||||
struct device *dev = &pdev->dev;
|
struct device *dev = &pdev->dev;
|
||||||
struct eth_plat_info *plat;
|
struct eth_plat_info *plat;
|
||||||
|
resource_size_t regs_phys;
|
||||||
struct net_device *ndev;
|
struct net_device *ndev;
|
||||||
|
struct resource *res;
|
||||||
struct port *port;
|
struct port *port;
|
||||||
u32 regs_phys;
|
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
plat = dev_get_platdata(dev);
|
plat = dev_get_platdata(dev);
|
||||||
|
@ -1380,13 +1381,18 @@ static int ixp4xx_eth_probe(struct platform_device *pdev)
|
||||||
port->netdev = ndev;
|
port->netdev = ndev;
|
||||||
port->id = pdev->id;
|
port->id = pdev->id;
|
||||||
|
|
||||||
|
/* Get the port resource and remap */
|
||||||
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
|
if (!res)
|
||||||
|
return -ENODEV;
|
||||||
|
regs_phys = res->start;
|
||||||
|
port->regs = devm_ioremap_resource(dev, res);
|
||||||
|
|
||||||
switch (port->id) {
|
switch (port->id) {
|
||||||
case IXP4XX_ETH_NPEA:
|
case IXP4XX_ETH_NPEA:
|
||||||
/* If the MDIO bus is not up yet, defer probe */
|
/* If the MDIO bus is not up yet, defer probe */
|
||||||
if (!mdio_bus)
|
if (!mdio_bus)
|
||||||
return -EPROBE_DEFER;
|
return -EPROBE_DEFER;
|
||||||
port->regs = (struct eth_regs __iomem *)IXP4XX_EthA_BASE_VIRT;
|
|
||||||
regs_phys = IXP4XX_EthA_BASE_PHYS;
|
|
||||||
break;
|
break;
|
||||||
case IXP4XX_ETH_NPEB:
|
case IXP4XX_ETH_NPEB:
|
||||||
/*
|
/*
|
||||||
|
@ -1399,13 +1405,11 @@ static int ixp4xx_eth_probe(struct platform_device *pdev)
|
||||||
IXP4XX_FEATURE_NPEB_ETH0))
|
IXP4XX_FEATURE_NPEB_ETH0))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
/* Else register the MDIO bus on NPE-B */
|
/* Else register the MDIO bus on NPE-B */
|
||||||
if ((err = ixp4xx_mdio_register(IXP4XX_EthC_BASE_VIRT)))
|
if ((err = ixp4xx_mdio_register(port->regs)))
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
if (!mdio_bus)
|
if (!mdio_bus)
|
||||||
return -EPROBE_DEFER;
|
return -EPROBE_DEFER;
|
||||||
port->regs = (struct eth_regs __iomem *)IXP4XX_EthB_BASE_VIRT;
|
|
||||||
regs_phys = IXP4XX_EthB_BASE_PHYS;
|
|
||||||
break;
|
break;
|
||||||
case IXP4XX_ETH_NPEC:
|
case IXP4XX_ETH_NPEC:
|
||||||
/*
|
/*
|
||||||
|
@ -1417,13 +1421,11 @@ static int ixp4xx_eth_probe(struct platform_device *pdev)
|
||||||
IXP4XX_FEATURE_NPEC_ETH))
|
IXP4XX_FEATURE_NPEC_ETH))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
/* Else register the MDIO bus on NPE-C */
|
/* Else register the MDIO bus on NPE-C */
|
||||||
if ((err = ixp4xx_mdio_register(IXP4XX_EthC_BASE_VIRT)))
|
if ((err = ixp4xx_mdio_register(port->regs)))
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
if (!mdio_bus)
|
if (!mdio_bus)
|
||||||
return -EPROBE_DEFER;
|
return -EPROBE_DEFER;
|
||||||
port->regs = (struct eth_regs __iomem *)IXP4XX_EthC_BASE_VIRT;
|
|
||||||
regs_phys = IXP4XX_EthC_BASE_PHYS;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче