]> git.itanic.dy.fi Git - linux-stable/commitdiff
net: fman: Map the base address once
authorSean Anderson <sean.anderson@seco.com>
Fri, 2 Sep 2022 21:57:27 +0000 (17:57 -0400)
committerDavid S. Miller <davem@davemloft.net>
Mon, 5 Sep 2022 13:27:39 +0000 (14:27 +0100)
We don't need to remap the base address from the resource twice (once in
mac_probe() and again in set_fman_mac_params()). We still need the
resource to get the end address, but we can use a single function call
to get both at once.

While we're at it, use platform_get_mem_or_io and devm_request_resource
to map the resource. I think this is the more "correct" way to do things
here, since we use the pdev resource, instead of creating a new one.
It's still a bit tricky, since we need to ensure that the resource is a
child of the fman region when it gets requested.

Signed-off-by: Sean Anderson <sean.anderson@seco.com>
Acked-by: Camelia Groza <camelia.groza@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
drivers/net/ethernet/freescale/dpaa/dpaa_eth_sysfs.c
drivers/net/ethernet/freescale/fman/mac.c
drivers/net/ethernet/freescale/fman/mac.h

index e974d90f15e3cfb839b4a767316261b3e129cf31..02b588c46fcff34877dafe024f8f283b43200a2f 100644 (file)
@@ -218,8 +218,8 @@ static int dpaa_netdev_init(struct net_device *net_dev,
        net_dev->netdev_ops = dpaa_ops;
        mac_addr = priv->mac_dev->addr;
 
-       net_dev->mem_start = priv->mac_dev->res->start;
-       net_dev->mem_end = priv->mac_dev->res->end;
+       net_dev->mem_start = (unsigned long)priv->mac_dev->vaddr;
+       net_dev->mem_end = (unsigned long)priv->mac_dev->vaddr_end;
 
        net_dev->min_mtu = ETH_MIN_MTU;
        net_dev->max_mtu = dpaa_get_max_mtu();
index 4fee74c024bd74022f90826e6920b16f6ae27799..258eb6c8f4c060f85576bb357ad5ab734f8d3cae 100644 (file)
@@ -18,7 +18,7 @@ static ssize_t dpaa_eth_show_addr(struct device *dev,
 
        if (mac_dev)
                return sprintf(buf, "%llx",
-                               (unsigned long long)mac_dev->res->start);
+                               (unsigned long long)mac_dev->vaddr);
        else
                return sprintf(buf, "none");
 }
index 7afedd4995c9ea7c94ed194fe14c7369edbfd814..62af81c0c942460f3df2bd77170d314b160015a5 100644 (file)
@@ -28,7 +28,6 @@ MODULE_LICENSE("Dual BSD/GPL");
 MODULE_DESCRIPTION("FSL FMan MAC API based driver");
 
 struct mac_priv_s {
-       void __iomem                    *vaddr;
        u8                              cell_index;
        struct fman                     *fman;
        /* List of multicast addresses */
@@ -63,12 +62,7 @@ int set_fman_mac_params(struct mac_device *mac_dev,
 {
        struct mac_priv_s *priv = mac_dev->priv;
 
-       params->base_addr = (typeof(params->base_addr))
-               devm_ioremap(mac_dev->dev, mac_dev->res->start,
-                            resource_size(mac_dev->res));
-       if (!params->base_addr)
-               return -ENOMEM;
-
+       params->base_addr = mac_dev->vaddr;
        memcpy(&params->addr, mac_dev->addr, sizeof(mac_dev->addr));
        params->max_speed       = priv->max_speed;
        params->phy_if          = mac_dev->phy_if;
@@ -305,7 +299,7 @@ static int mac_probe(struct platform_device *_of_dev)
        struct device_node      *mac_node, *dev_node;
        struct mac_device       *mac_dev;
        struct platform_device  *of_dev;
-       struct resource          res;
+       struct resource         *res;
        struct mac_priv_s       *priv;
        u32                      val;
        u8                      fman_id;
@@ -368,30 +362,25 @@ static int mac_probe(struct platform_device *_of_dev)
        of_node_put(dev_node);
 
        /* Get the address of the memory mapped registers */
-       err = of_address_to_resource(mac_node, 0, &res);
-       if (err < 0) {
-               dev_err(dev, "of_address_to_resource(%pOF) = %d\n",
-                       mac_node, err);
-               goto _return_of_node_put;
+       res = platform_get_mem_or_io(_of_dev, 0);
+       if (!res) {
+               dev_err(dev, "could not get registers\n");
+               return -EINVAL;
        }
 
-       mac_dev->res = __devm_request_region(dev,
-                                            fman_get_mem_region(priv->fman),
-                                            res.start, resource_size(&res),
-                                            "mac");
-       if (!mac_dev->res) {
-               dev_err(dev, "__devm_request_mem_region(mac) failed\n");
-               err = -EBUSY;
+       err = devm_request_resource(dev, fman_get_mem_region(priv->fman), res);
+       if (err) {
+               dev_err_probe(dev, err, "could not request resource\n");
                goto _return_of_node_put;
        }
 
-       priv->vaddr = devm_ioremap(dev, mac_dev->res->start,
-                                  resource_size(mac_dev->res));
-       if (!priv->vaddr) {
+       mac_dev->vaddr = devm_ioremap(dev, res->start, resource_size(res));
+       if (!mac_dev->vaddr) {
                dev_err(dev, "devm_ioremap() failed\n");
                err = -EIO;
                goto _return_of_node_put;
        }
+       mac_dev->vaddr_end = mac_dev->vaddr + resource_size(res);
 
        if (!of_device_is_available(mac_node)) {
                err = -ENODEV;
index da410a7d00c9557b3e0f32c886227f3c6eead7f6..7aa71b05bd3ef6c1959209bddccd5a30a0ca9b68 100644 (file)
@@ -19,8 +19,9 @@ struct fman_mac;
 struct mac_priv_s;
 
 struct mac_device {
+       void __iomem            *vaddr;
+       void __iomem            *vaddr_end;
        struct device           *dev;
-       struct resource         *res;
        u8                       addr[ETH_ALEN];
        struct fman_port        *port[2];
        u32                      if_support;