Commit 27d9cb7e authored by Bjorn Helgaas's avatar Bjorn Helgaas

PCI: designware: Free bridge resource list on failure

of_pci_get_host_bridge_resources() allocates a list of resources for host
bridge windows.  If we fail after allocating that list, free it before we
return error.
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent 950334bc
...@@ -493,7 +493,8 @@ int dw_pcie_host_init(struct pcie_port *pp) ...@@ -493,7 +493,8 @@ int dw_pcie_host_init(struct pcie_port *pp)
resource_size(pp->cfg)); resource_size(pp->cfg));
if (!pp->dbi_base) { if (!pp->dbi_base) {
dev_err(pp->dev, "error with ioremap\n"); dev_err(pp->dev, "error with ioremap\n");
return -ENOMEM; ret = -ENOMEM;
goto error;
} }
} }
...@@ -504,7 +505,8 @@ int dw_pcie_host_init(struct pcie_port *pp) ...@@ -504,7 +505,8 @@ int dw_pcie_host_init(struct pcie_port *pp)
pp->cfg0_size); pp->cfg0_size);
if (!pp->va_cfg0_base) { if (!pp->va_cfg0_base) {
dev_err(pp->dev, "error with ioremap in function\n"); dev_err(pp->dev, "error with ioremap in function\n");
return -ENOMEM; ret = -ENOMEM;
goto error;
} }
} }
...@@ -513,7 +515,8 @@ int dw_pcie_host_init(struct pcie_port *pp) ...@@ -513,7 +515,8 @@ int dw_pcie_host_init(struct pcie_port *pp)
pp->cfg1_size); pp->cfg1_size);
if (!pp->va_cfg1_base) { if (!pp->va_cfg1_base) {
dev_err(pp->dev, "error with ioremap\n"); dev_err(pp->dev, "error with ioremap\n");
return -ENOMEM; ret = -ENOMEM;
goto error;
} }
} }
...@@ -528,7 +531,8 @@ int dw_pcie_host_init(struct pcie_port *pp) ...@@ -528,7 +531,8 @@ int dw_pcie_host_init(struct pcie_port *pp)
&dw_pcie_msi_chip); &dw_pcie_msi_chip);
if (!pp->irq_domain) { if (!pp->irq_domain) {
dev_err(pp->dev, "irq domain init failed\n"); dev_err(pp->dev, "irq domain init failed\n");
return -ENXIO; ret = -ENXIO;
goto error;
} }
for (i = 0; i < MAX_MSI_IRQS; i++) for (i = 0; i < MAX_MSI_IRQS; i++)
...@@ -536,7 +540,7 @@ int dw_pcie_host_init(struct pcie_port *pp) ...@@ -536,7 +540,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
} else { } else {
ret = pp->ops->msi_host_init(pp, &dw_pcie_msi_chip); ret = pp->ops->msi_host_init(pp, &dw_pcie_msi_chip);
if (ret < 0) if (ret < 0)
return ret; goto error;
} }
} }
...@@ -552,8 +556,10 @@ int dw_pcie_host_init(struct pcie_port *pp) ...@@ -552,8 +556,10 @@ int dw_pcie_host_init(struct pcie_port *pp)
} else } else
bus = pci_scan_root_bus(pp->dev, pp->root_bus_nr, &dw_pcie_ops, bus = pci_scan_root_bus(pp->dev, pp->root_bus_nr, &dw_pcie_ops,
pp, &res); pp, &res);
if (!bus) if (!bus) {
return -ENOMEM; ret = -ENOMEM;
goto error;
}
if (pp->ops->scan_bus) if (pp->ops->scan_bus)
pp->ops->scan_bus(pp); pp->ops->scan_bus(pp);
...@@ -571,6 +577,10 @@ int dw_pcie_host_init(struct pcie_port *pp) ...@@ -571,6 +577,10 @@ int dw_pcie_host_init(struct pcie_port *pp)
pci_bus_add_devices(bus); pci_bus_add_devices(bus);
return 0; return 0;
error:
pci_free_resource_list(&res);
return ret;
} }
static int dw_pcie_rd_other_conf(struct pcie_port *pp, struct pci_bus *bus, static int dw_pcie_rd_other_conf(struct pcie_port *pp, struct pci_bus *bus,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment