of/pci: Fix the conversion of IO ranges into IO resources
[pandora-kernel.git] / drivers / pci / host / pcie-rcar.c
index 4884ee5..61158e0 100644 (file)
@@ -323,6 +323,7 @@ static void rcar_pcie_setup_window(int win, struct rcar_pcie *pcie)
 
        /* Setup PCIe address space mappings for each resource */
        resource_size_t size;
+       resource_size_t res_start;
        u32 mask;
 
        rcar_pci_write_reg(pcie, 0x00000000, PCIEPTCTLR(win));
@@ -335,8 +336,13 @@ static void rcar_pcie_setup_window(int win, struct rcar_pcie *pcie)
        mask = (roundup_pow_of_two(size) / SZ_128) - 1;
        rcar_pci_write_reg(pcie, mask << 7, PCIEPAMR(win));
 
-       rcar_pci_write_reg(pcie, upper_32_bits(res->start), PCIEPARH(win));
-       rcar_pci_write_reg(pcie, lower_32_bits(res->start), PCIEPARL(win));
+       if (res->flags & IORESOURCE_IO)
+               res_start = pci_pio_to_address(res->start);
+       else
+               res_start = res->start;
+
+       rcar_pci_write_reg(pcie, upper_32_bits(res_start), PCIEPARH(win));
+       rcar_pci_write_reg(pcie, lower_32_bits(res_start), PCIEPARL(win));
 
        /* First resource is for IO */
        mask = PAR_ENABLE;
@@ -363,9 +369,10 @@ static int rcar_pcie_setup(int nr, struct pci_sys_data *sys)
 
                rcar_pcie_setup_window(i, pcie);
 
-               if (res->flags & IORESOURCE_IO)
-                       pci_ioremap_io(nr * SZ_64K, res->start);
-               else
+               if (res->flags & IORESOURCE_IO) {
+                       phys_addr_t io_start = pci_pio_to_address(res->start);
+                       pci_ioremap_io(nr * SZ_64K, io_start);
+               } else
                        pci_add_resource(&sys->resources, res);
        }
        pci_add_resource(&sys->resources, &pcie->busn);
@@ -935,8 +942,10 @@ static int rcar_pcie_probe(struct platform_device *pdev)
        }
 
        for_each_of_pci_range(&parser, &range) {
-               of_pci_range_to_resource(&range, pdev->dev.of_node,
+               err = of_pci_range_to_resource(&range, pdev->dev.of_node,
                                                &pcie->res[win++]);
+               if (err < 0)
+                       return err;
 
                if (win > RCAR_PCI_MAX_RESOURCES)
                        break;