aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/pci/host/pcie-designware.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c
index 12afce19890b..2a500f270c01 100644
--- a/drivers/pci/host/pcie-designware.c
+++ b/drivers/pci/host/pcie-designware.c
@@ -436,7 +436,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
436 struct resource *cfg_res; 436 struct resource *cfg_res;
437 int i, ret; 437 int i, ret;
438 LIST_HEAD(res); 438 LIST_HEAD(res);
439 struct resource_entry *win; 439 struct resource_entry *win, *tmp;
440 440
441 cfg_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "config"); 441 cfg_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "config");
442 if (cfg_res) { 442 if (cfg_res) {
@@ -457,17 +457,20 @@ int dw_pcie_host_init(struct pcie_port *pp)
457 goto error; 457 goto error;
458 458
459 /* Get the I/O and memory ranges from DT */ 459 /* Get the I/O and memory ranges from DT */
460 resource_list_for_each_entry(win, &res) { 460 resource_list_for_each_entry_safe(win, tmp, &res) {
461 switch (resource_type(win->res)) { 461 switch (resource_type(win->res)) {
462 case IORESOURCE_IO: 462 case IORESOURCE_IO:
463 pp->io = win->res; 463 ret = pci_remap_iospace(win->res, pp->io_base);
464 pp->io->name = "I/O"; 464 if (ret) {
465 pp->io_size = resource_size(pp->io);
466 pp->io_bus_addr = pp->io->start - win->offset;
467 ret = pci_remap_iospace(pp->io, pp->io_base);
468 if (ret)
469 dev_warn(pp->dev, "error %d: failed to map resource %pR\n", 465 dev_warn(pp->dev, "error %d: failed to map resource %pR\n",
470 ret, pp->io); 466 ret, win->res);
467 resource_list_destroy_entry(win);
468 } else {
469 pp->io = win->res;
470 pp->io->name = "I/O";
471 pp->io_size = resource_size(pp->io);
472 pp->io_bus_addr = pp->io->start - win->offset;
473 }
471 break; 474 break;
472 case IORESOURCE_MEM: 475 case IORESOURCE_MEM:
473 pp->mem = win->res; 476 pp->mem = win->res;