Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 93c9a7f8 authored by Jan Kiszka's avatar Jan Kiszka Committed by Bjorn Helgaas
Browse files

PCI: Clean up resource allocation in devm_of_pci_get_host_bridge_resources()



Instead of first allocating and then freeing memory for struct resource in
case we cannot parse a PCI resource from the device tree, work against a
local struct and kmemdup() it when we decide to go with it.

Suggested-by: default avatarAndy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: default avatarJan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
Reviewed-by: default avatarVladimir Zapolskiy <vladimir_zapolskiy@mentor.com>
parent ce397d21
Loading
Loading
Loading
Loading
+6 −8
Original line number Diff line number Diff line
@@ -266,7 +266,7 @@ int devm_of_pci_get_host_bridge_resources(struct device *dev,
			struct list_head *resources, resource_size_t *io_base)
{
	struct device_node *dev_node = dev->of_node;
	struct resource *res;
	struct resource *res, tmp_res;
	struct resource *bus_range;
	struct of_pci_range range;
	struct of_pci_range_parser parser;
@@ -320,18 +320,16 @@ int devm_of_pci_get_host_bridge_resources(struct device *dev,
		if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
			continue;

		res = devm_kzalloc(dev, sizeof(struct resource), GFP_KERNEL);
		err = of_pci_range_to_resource(&range, dev_node, &tmp_res);
		if (err)
			continue;

		res = devm_kmemdup(dev, &tmp_res, sizeof(tmp_res), GFP_KERNEL);
		if (!res) {
			err = -ENOMEM;
			goto failed;
		}

		err = of_pci_range_to_resource(&range, dev_node, res);
		if (err) {
			devm_kfree(dev, res);
			continue;
		}

		if (resource_type(res) == IORESOURCE_IO) {
			if (!io_base) {
				dev_err(dev, "I/O range found for %pOF. Please provide an io_base pointer to save CPU base address\n",