diff options
-rw-r--r-- | drivers/pci/host/pcie-designware.c | 21 |
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; |