PCI: Rework of_pci_get_host_bridge_resources() to devm_of_pci_get_host_bridge_resources()
authorJan Kiszka <jan.kiszka@siemens.com>
Tue, 15 May 2018 09:07:05 +0000 (11:07 +0200)
committerBjorn Helgaas <helgaas@kernel.org>
Wed, 30 May 2018 16:35:13 +0000 (11:35 -0500)
of_pci_get_host_bridge_resources() allocates the resource structures it
fills dynamically, but none of its callers care to release them so far.
Rather than requiring everyone to do this explicitly, convert the existing
function to a managed version.

Tested-by: Vladimir Zapolskiy <vladimir_zapolskiy@mentor.com>
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Vladimir Zapolskiy <vladimir_zapolskiy@mentor.com>
Acked-by: Joao Pinto <jpinto@synopsys.com>
Acked-by: Jingoo Han <jingoohan1@gmail.com>
CC: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
14 files changed:
drivers/pci/dwc/pcie-designware-host.c
drivers/pci/host/pci-aardvark.c
drivers/pci/host/pci-ftpci100.c
drivers/pci/host/pci-v3-semi.c
drivers/pci/host/pci-versatile.c
drivers/pci/host/pci-xgene.c
drivers/pci/host/pcie-altera.c
drivers/pci/host/pcie-iproc-platform.c
drivers/pci/host/pcie-rcar.c
drivers/pci/host/pcie-rockchip.c
drivers/pci/host/pcie-xilinx-nwl.c
drivers/pci/host/pcie-xilinx.c
drivers/pci/of.c
include/linux/of_pci.h

index 5a535690b7b5aa318eccb87d777de4bfa9017b5f..a8f6ab54b4c0ed2cacd79f922e95a09ae646d32e 100644 (file)
@@ -342,7 +342,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
        if (!bridge)
                return -ENOMEM;
 
-       ret = of_pci_get_host_bridge_resources(dev, 0, 0xff,
+       ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
                                        &bridge->windows, &pp->io_base);
        if (ret)
                return ret;
index 603c72181af29b183600a0770a6f7deb35f99bce..709f0d69e35b9595783fc187a6c581408eda24a3 100644 (file)
@@ -820,7 +820,7 @@ static int advk_pcie_parse_request_of_pci_ranges(struct advk_pcie *pcie)
 
        INIT_LIST_HEAD(&pcie->resources);
 
-       err = of_pci_get_host_bridge_resources(dev, 0, 0xff,
+       err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
                                                    &pcie->resources, &iobase);
        if (err)
                return err;
index 5c176f806fe523b911e1e0582e3ba79e018c75e4..87748eaeaaed4dcc1f264c873aa31b3c2337cefe 100644 (file)
@@ -476,7 +476,7 @@ static int faraday_pci_probe(struct platform_device *pdev)
        if (IS_ERR(p->base))
                return PTR_ERR(p->base);
 
-       ret = of_pci_get_host_bridge_resources(dev, 0, 0xff,
+       ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
                                                    &res, &io_base);
        if (ret)
                return ret;
index f3f39935ac2fb5b5d444e926895383be2c8ff663..167bf6f6b378bc3236cadfc186d8c0f88b34d68c 100644 (file)
@@ -791,7 +791,7 @@ static int v3_pci_probe(struct platform_device *pdev)
        if (IS_ERR(v3->config_base))
                return PTR_ERR(v3->config_base);
 
-       ret = of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
+       ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
                                                    &io_base);
        if (ret)
                return ret;
index ef33ec0a9e1b61489aa83d67dcad509318914d7d..ff2cd12b397858c03fa54490787692aaf536a019 100644 (file)
@@ -67,7 +67,7 @@ static int versatile_pci_parse_request_of_pci_ranges(struct device *dev,
        resource_size_t iobase;
        struct resource_entry *win, *tmp;
 
-       err = of_pci_get_host_bridge_resources(dev, 0, 0xff, res, &iobase);
+       err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, res, &iobase);
        if (err)
                return err;
 
index 88e9a6d315b37aa15feb6d8a2dde3b55f6fd6f43..7b3ed6e34b6c504154b440e5f517f53848e2fe3e 100644 (file)
@@ -632,7 +632,7 @@ static int xgene_pcie_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
-       ret = of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
+       ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
                                                    &iobase);
        if (ret)
                return ret;
index 9567415aaad039b99be0d1594b10764538156cb8..0694271d4036f743b4c16f7ad03ec9376afdad3d 100644 (file)
@@ -490,7 +490,7 @@ static int altera_pcie_parse_request_of_pci_ranges(struct altera_pcie *pcie)
        struct device *dev = &pcie->pdev->dev;
        struct resource_entry *win;
 
-       err = of_pci_get_host_bridge_resources(dev, 0, 0xff,
+       err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
                                                    &pcie->resources, NULL);
        if (err)
                return err;
index cec0130326c9cbbc05c44921434dad532dc6d103..99c2022813e465114c41e469be7343feeadd9d9e 100644 (file)
@@ -99,7 +99,7 @@ static int iproc_pcie_pltfm_probe(struct platform_device *pdev)
                pcie->phy = NULL;
        }
 
-       ret = of_pci_get_host_bridge_resources(dev, 0, 0xff, &resources,
+       ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &resources,
                                                    &iobase);
        if (ret) {
                dev_err(dev, "unable to get PCI host bridge resources\n");
index 4c1787e021fd5b73074fd34907ba02de380ce7f1..6eb36c924983fe3daca1160a4621aa1055942cf6 100644 (file)
@@ -1070,7 +1070,7 @@ static int rcar_pcie_parse_request_of_pci_ranges(struct rcar_pcie *pci)
        resource_size_t iobase;
        struct resource_entry *win, *tmp;
 
-       err = of_pci_get_host_bridge_resources(dev, 0, 0xff,
+       err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
                                                    &pci->resources, &iobase);
        if (err)
                return err;
index abac972f0dc2472d4759c3e992cb130e00f15e22..27b97fcddf15e43fcfb2b7bcff664908a9396c3c 100644 (file)
@@ -1560,7 +1560,7 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
        if (err < 0)
                goto err_deinit_port;
 
-       err = of_pci_get_host_bridge_resources(dev, 0, 0xff,
+       err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
                                                    &res, &io_base);
        if (err)
                goto err_remove_irq_domain;
index 6aea997cd21b2fdbc0559b536d8af419bb942153..64df768c795cf153e981fbedc02c33d7846f6b37 100644 (file)
@@ -854,7 +854,7 @@ static int nwl_pcie_probe(struct platform_device *pdev)
                return err;
        }
 
-       err = of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
+       err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
                                                    &iobase);
        if (err) {
                dev_err(dev, "Getting bridge resources failed\n");
index fa5e44a480a4a96b05e40c92294f0fd25d928ecd..88c96e5669e0786709457fa64fa7dd61910f7f86 100644 (file)
@@ -643,7 +643,7 @@ static int xilinx_pcie_probe(struct platform_device *pdev)
                return err;
        }
 
-       err = of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
+       err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res,
                                                    &iobase);
        if (err) {
                dev_err(dev, "Getting bridge resources failed\n");
index 820fe058d11659dfbd4d05cfd3458934e045032f..d088c9147f10534ef767dba007e57e72337c2b0e 100644 (file)
@@ -244,7 +244,8 @@ EXPORT_SYMBOL_GPL(of_pci_check_probe_only);
 
 #if defined(CONFIG_OF_ADDRESS)
 /**
- * of_pci_get_host_bridge_resources - Parse PCI host bridge resources from DT
+ * devm_of_pci_get_host_bridge_resources() - Resource-managed parsing of PCI
+ *                                           host bridge resources from DT
  * @dev: host bridge device
  * @busno: bus number associated with the bridge root bus
  * @bus_max: maximum number of buses for this bridge
@@ -253,8 +254,6 @@ EXPORT_SYMBOL_GPL(of_pci_check_probe_only);
  * address for the start of the I/O range. Can be NULL if the caller doesn't
  * expect I/O ranges to be present in the device tree.
  *
- * It is the caller's job to free the @resources list.
- *
  * This function will parse the "ranges" property of a PCI host bridge device
  * node and setup the resource mapping based on its content. It is expected
  * that the property conforms with the Power ePAPR document.
@@ -262,12 +261,11 @@ EXPORT_SYMBOL_GPL(of_pci_check_probe_only);
  * It returns zero if the range parsing has been successful or a standard error
  * value if it failed.
  */
-int of_pci_get_host_bridge_resources(struct device *dev,
+int devm_of_pci_get_host_bridge_resources(struct device *dev,
                        unsigned char busno, unsigned char bus_max,
                        struct list_head *resources, resource_size_t *io_base)
 {
        struct device_node *dev_node = dev->of_node;
-       struct resource_entry *window;
        struct resource *res;
        struct resource *bus_range;
        struct of_pci_range range;
@@ -278,7 +276,7 @@ int of_pci_get_host_bridge_resources(struct device *dev,
        if (io_base)
                *io_base = (resource_size_t)OF_BAD_ADDR;
 
-       bus_range = kzalloc(sizeof(*bus_range), GFP_KERNEL);
+       bus_range = devm_kzalloc(dev, sizeof(*bus_range), GFP_KERNEL);
        if (!bus_range)
                return -ENOMEM;
 
@@ -300,7 +298,7 @@ int of_pci_get_host_bridge_resources(struct device *dev,
        /* Check for ranges property */
        err = of_pci_range_parser_init(&parser, dev_node);
        if (err)
-               goto parse_failed;
+               goto failed;
 
        dev_dbg(dev, "Parsing ranges property...\n");
        for_each_of_pci_range(&parser, &range) {
@@ -322,15 +320,15 @@ int of_pci_get_host_bridge_resources(struct device *dev,
                if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
                        continue;
 
-               res = kzalloc(sizeof(struct resource), GFP_KERNEL);
+               res = devm_kzalloc(dev, sizeof(struct resource), GFP_KERNEL);
                if (!res) {
                        err = -ENOMEM;
-                       goto parse_failed;
+                       goto failed;
                }
 
                err = of_pci_range_to_resource(&range, dev_node, res);
                if (err) {
-                       kfree(res);
+                       devm_kfree(dev, res);
                        continue;
                }
 
@@ -339,7 +337,7 @@ int of_pci_get_host_bridge_resources(struct device *dev,
                                dev_err(dev, "I/O range found for %pOF. Please provide an io_base pointer to save CPU base address\n",
                                        dev_node);
                                err = -EINVAL;
-                               goto conversion_failed;
+                               goto failed;
                        }
                        if (*io_base != (resource_size_t)OF_BAD_ADDR)
                                dev_warn(dev, "More than one I/O resource converted for %pOF. CPU base address for old range lost!\n",
@@ -352,15 +350,11 @@ int of_pci_get_host_bridge_resources(struct device *dev,
 
        return 0;
 
-conversion_failed:
-       kfree(res);
-parse_failed:
-       resource_list_for_each_entry(window, resources)
-               kfree(window->res);
+failed:
        pci_free_resource_list(resources);
        return err;
 }
-EXPORT_SYMBOL_GPL(of_pci_get_host_bridge_resources);
+EXPORT_SYMBOL_GPL(devm_of_pci_get_host_bridge_resources);
 #endif /* CONFIG_OF_ADDRESS */
 
 /**
@@ -604,7 +598,7 @@ int pci_parse_request_of_pci_ranges(struct device *dev,
        struct resource_entry *win, *tmp;
 
        INIT_LIST_HEAD(resources);
-       err = of_pci_get_host_bridge_resources(dev, 0, 0xff, resources,
+       err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, resources,
                                                    &iobase);
        if (err)
                return err;
index e6684c68cb94b8691f2a83f85f153d360e827faa..fa4463a52900ffbdc5b79eae71d38bce94bd2ebc 100644 (file)
@@ -71,11 +71,11 @@ of_irq_parse_and_map_pci(const struct pci_dev *dev, u8 slot, u8 pin)
 #endif
 
 #if defined(CONFIG_OF_ADDRESS)
-int of_pci_get_host_bridge_resources(struct device *dev,
+int devm_of_pci_get_host_bridge_resources(struct device *dev,
                        unsigned char busno, unsigned char bus_max,
                        struct list_head *resources, resource_size_t *io_base);
 #else
-static inline int of_pci_get_host_bridge_resources(struct device *dev,
+static inline int devm_of_pci_get_host_bridge_resources(struct device *dev,
                        unsigned char busno, unsigned char bus_max,
                        struct list_head *resources, resource_size_t *io_base)
 {