ARM/net: ixp4xx: Pass ethernet physical base as resource
authorLinus Walleij <linus.walleij@linaro.org>
Sun, 12 Jan 2020 12:04:49 +0000 (13:04 +0100)
committerJakub Kicinski <kuba@kernel.org>
Sun, 12 Jan 2020 20:59:53 +0000 (12:59 -0800)
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>
arch/arm/mach-ixp4xx/fsg-setup.c
arch/arm/mach-ixp4xx/goramo_mlr.c
arch/arm/mach-ixp4xx/ixdp425-setup.c
arch/arm/mach-ixp4xx/nas100d-setup.c
arch/arm/mach-ixp4xx/nslu2-setup.c
arch/arm/mach-ixp4xx/omixp-setup.c
arch/arm/mach-ixp4xx/vulcan-setup.c
drivers/net/ethernet/xscale/ixp4xx_eth.c

index 648932d8d7a8fbec25211201469c302f725d7df6..507ee387876937c470b404fd935fce8f4db131b9 100644 (file)
@@ -132,6 +132,22 @@ static struct platform_device fsg_leds = {
 };
 
 /* 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[] = {
        {
                .phy            = 5,
@@ -151,12 +167,16 @@ static struct platform_device fsg_eth[] = {
                .dev = {
                        .platform_data  = fsg_plat_eth,
                },
+               .num_resources  = ARRAY_SIZE(fsg_eth_npeb_resources),
+               .resource       = fsg_eth_npeb_resources,
        }, {
                .name                   = "ixp4xx_eth",
                .id                     = IXP4XX_ETH_NPEC,
                .dev = {
                        .platform_data  = fsg_plat_eth + 1,
                },
+               .num_resources  = ARRAY_SIZE(fsg_eth_npec_resources),
+               .resource       = fsg_eth_npec_resources,
        }
 };
 
index 93b7afeee1423c6896d7e8845192cf9a8ce27412..07b50dfcc489edc3b242fe078e9a7ac4b495531f 100644 (file)
@@ -273,6 +273,22 @@ static struct platform_device device_uarts = {
 
 
 /* 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[] = {
        {
                .phy            = 0,
@@ -290,10 +306,14 @@ static struct platform_device device_eth_tab[] = {
                .name                   = "ixp4xx_eth",
                .id                     = IXP4XX_ETH_NPEB,
                .dev.platform_data      = eth_plat,
+               .num_resources          = ARRAY_SIZE(eth_npeb_resources),
+               .resource               = eth_npeb_resources,
        }, {
                .name                   = "ixp4xx_eth",
                .id                     = IXP4XX_ETH_NPEC,
                .dev.platform_data      = eth_plat + 1,
+               .num_resources          = ARRAY_SIZE(eth_npec_resources),
+               .resource               = eth_npec_resources,
        }
 };
 
index 6f0f7ed18ea8b93e8164195da9496c028dac0cc2..45d5b720ded6d499908c79cc124418447041a2a6 100644 (file)
@@ -187,6 +187,22 @@ static struct platform_device ixdp425_uart = {
 };
 
 /* 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[] = {
        {
                .phy            = 0,
@@ -204,10 +220,14 @@ static struct platform_device ixdp425_eth[] = {
                .name                   = "ixp4xx_eth",
                .id                     = IXP4XX_ETH_NPEB,
                .dev.platform_data      = ixdp425_plat_eth,
+               .num_resources          = ARRAY_SIZE(ixp425_npeb_resources),
+               .resource               = ixp425_npeb_resources,
        }, {
                .name                   = "ixp4xx_eth",
                .id                     = IXP4XX_ETH_NPEC,
                .dev.platform_data      = ixdp425_plat_eth + 1,
+               .num_resources          = ARRAY_SIZE(ixp425_npec_resources),
+               .resource               = ixp425_npec_resources,
        }
 };
 
index c142cfa8c5d69278ecebb1551d3d061d5082e07a..6959ad2e3aecc74e0b763cfdf1ca3bef7fcfaf18 100644 (file)
@@ -165,6 +165,14 @@ static struct platform_device nas100d_uart = {
 };
 
 /* 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[] = {
        {
                .phy            = 0,
@@ -178,6 +186,8 @@ static struct platform_device nas100d_eth[] = {
                .name                   = "ixp4xx_eth",
                .id                     = IXP4XX_ETH_NPEB,
                .dev.platform_data      = nas100d_plat_eth,
+               .num_resources          = ARRAY_SIZE(nas100d_eth_resources),
+               .resource               = nas100d_eth_resources,
        }
 };
 
index ee1877fcfafea40671eb344d61c75452740f1ee9..a428bb9187037e48c83687bfa30dfd8d01d2e710 100644 (file)
@@ -185,6 +185,14 @@ static struct platform_device nslu2_uart = {
 };
 
 /* 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[] = {
        {
                .phy            = 1,
@@ -198,6 +206,8 @@ static struct platform_device nslu2_eth[] = {
                .name                   = "ixp4xx_eth",
                .id                     = IXP4XX_ETH_NPEB,
                .dev.platform_data      = nslu2_plat_eth,
+               .num_resources          = ARRAY_SIZE(nslu2_eth_resources),
+               .resource               = nslu2_eth_resources,
        }
 };
 
index 6ed5a9aed600c1385af067fa8113134ed0552b63..8f2b8c473d7ae19811ea040d77d755a34803132e 100644 (file)
@@ -170,6 +170,22 @@ static struct platform_device mic256_leds = {
 };
 
 /* 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[] = {
        {
                .phy            = 0,
@@ -187,10 +203,14 @@ static struct platform_device ixdp425_eth[] = {
                .name                   = "ixp4xx_eth",
                .id                     = IXP4XX_ETH_NPEB,
                .dev.platform_data      = ixdp425_plat_eth,
+               .num_resources          = ARRAY_SIZE(ixp425_npeb_resources),
+               .resource               = ixp425_npeb_resources,
        }, {
                .name                   = "ixp4xx_eth",
                .id                     = IXP4XX_ETH_NPEC,
                .dev.platform_data      = ixdp425_plat_eth + 1,
+               .num_resources          = ARRAY_SIZE(ixp425_npec_resources),
+               .resource               = ixp425_npec_resources,
        },
 };
 
index d2ebb7c675a8c59c311d1bbc3f04a31bdbd04455..e506d2af98ad2e02a057b9d3324bdab77e7e647b 100644 (file)
@@ -124,6 +124,22 @@ static struct platform_device vulcan_uart = {
        .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[] = {
        [0] = {
                .phy            = 0,
@@ -144,6 +160,8 @@ static struct platform_device vulcan_eth[] = {
                .dev = {
                        .platform_data  = &vulcan_plat_eth[0],
                },
+               .num_resources          = ARRAY_SIZE(vulcan_npeb_resources),
+               .resource               = vulcan_npeb_resources,
        },
        [1] = {
                .name                   = "ixp4xx_eth",
@@ -151,6 +169,8 @@ static struct platform_device vulcan_eth[] = {
                .dev = {
                        .platform_data  = &vulcan_plat_eth[1],
                },
+               .num_resources          = ARRAY_SIZE(vulcan_npec_resources),
+               .resource               = vulcan_npec_resources,
        },
 };
 
index f7edf8b38dea907f337659da507adacd8ba71829..ee45215c4ba44a9f2850fcd52e0343f84b95c094 100644 (file)
@@ -1365,9 +1365,10 @@ static int ixp4xx_eth_probe(struct platform_device *pdev)
        struct phy_device *phydev = NULL;
        struct device *dev = &pdev->dev;
        struct eth_plat_info *plat;
+       resource_size_t regs_phys;
        struct net_device *ndev;
+       struct resource *res;
        struct port *port;
-       u32 regs_phys;
        int err;
 
        plat = dev_get_platdata(dev);
@@ -1380,13 +1381,18 @@ static int ixp4xx_eth_probe(struct platform_device *pdev)
        port->netdev = ndev;
        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) {
        case IXP4XX_ETH_NPEA:
                /* If the MDIO bus is not up yet, defer probe */
                if (!mdio_bus)
                        return -EPROBE_DEFER;
-               port->regs = (struct eth_regs __iomem *)IXP4XX_EthA_BASE_VIRT;
-               regs_phys  = IXP4XX_EthA_BASE_PHYS;
                break;
        case IXP4XX_ETH_NPEB:
                /*
@@ -1399,13 +1405,11 @@ static int ixp4xx_eth_probe(struct platform_device *pdev)
                              IXP4XX_FEATURE_NPEB_ETH0))
                                return -ENODEV;
                        /* 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;
                }
                if (!mdio_bus)
                        return -EPROBE_DEFER;
-               port->regs = (struct eth_regs __iomem *)IXP4XX_EthB_BASE_VIRT;
-               regs_phys  = IXP4XX_EthB_BASE_PHYS;
                break;
        case IXP4XX_ETH_NPEC:
                /*
@@ -1417,13 +1421,11 @@ static int ixp4xx_eth_probe(struct platform_device *pdev)
                              IXP4XX_FEATURE_NPEC_ETH))
                                return -ENODEV;
                        /* 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;
                }
                if (!mdio_bus)
                        return -EPROBE_DEFER;
-               port->regs = (struct eth_regs __iomem *)IXP4XX_EthC_BASE_VIRT;
-               regs_phys  = IXP4XX_EthC_BASE_PHYS;
                break;
        default:
                return -ENODEV;