diff options
| -rw-r--r-- | arch/powerpc/kernel/pci_64.c | 10 | ||||
| -rw-r--r-- | drivers/pci/host/pci-rcar-gen2.c | 8 | ||||
| -rw-r--r-- | drivers/pci/host/pci-tegra.c | 7 | ||||
| -rw-r--r-- | drivers/pci/host/pcie-designware.c | 20 |
4 files changed, 32 insertions, 13 deletions
diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c index 2a4779091a58..155013da27e0 100644 --- a/arch/powerpc/kernel/pci_64.c +++ b/arch/powerpc/kernel/pci_64.c | |||
| @@ -208,7 +208,7 @@ long sys_pciconfig_iobase(long which, unsigned long in_bus, | |||
| 208 | unsigned long in_devfn) | 208 | unsigned long in_devfn) |
| 209 | { | 209 | { |
| 210 | struct pci_controller* hose; | 210 | struct pci_controller* hose; |
| 211 | struct pci_bus *bus = NULL; | 211 | struct pci_bus *tmp_bus, *bus = NULL; |
| 212 | struct device_node *hose_node; | 212 | struct device_node *hose_node; |
| 213 | 213 | ||
| 214 | /* Argh ! Please forgive me for that hack, but that's the | 214 | /* Argh ! Please forgive me for that hack, but that's the |
| @@ -229,10 +229,12 @@ long sys_pciconfig_iobase(long which, unsigned long in_bus, | |||
| 229 | * used on pre-domains setup. We return the first match | 229 | * used on pre-domains setup. We return the first match |
| 230 | */ | 230 | */ |
| 231 | 231 | ||
| 232 | list_for_each_entry(bus, &pci_root_buses, node) { | 232 | list_for_each_entry(tmp_bus, &pci_root_buses, node) { |
| 233 | if (in_bus >= bus->number && in_bus <= bus->busn_res.end) | 233 | if (in_bus >= tmp_bus->number && |
| 234 | in_bus <= tmp_bus->busn_res.end) { | ||
| 235 | bus = tmp_bus; | ||
| 234 | break; | 236 | break; |
| 235 | bus = NULL; | 237 | } |
| 236 | } | 238 | } |
| 237 | if (bus == NULL || bus->dev.of_node == NULL) | 239 | if (bus == NULL || bus->dev.of_node == NULL) |
| 238 | return -ENODEV; | 240 | return -ENODEV; |
diff --git a/drivers/pci/host/pci-rcar-gen2.c b/drivers/pci/host/pci-rcar-gen2.c index fd3e3ab56509..4fe349dcaf59 100644 --- a/drivers/pci/host/pci-rcar-gen2.c +++ b/drivers/pci/host/pci-rcar-gen2.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <linux/io.h> | 15 | #include <linux/io.h> |
| 16 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
| 17 | #include <linux/module.h> | 17 | #include <linux/module.h> |
| 18 | #include <linux/of_pci.h> | ||
| 18 | #include <linux/pci.h> | 19 | #include <linux/pci.h> |
| 19 | #include <linux/platform_device.h> | 20 | #include <linux/platform_device.h> |
| 20 | #include <linux/pm_runtime.h> | 21 | #include <linux/pm_runtime.h> |
| @@ -180,8 +181,13 @@ static int rcar_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) | |||
| 180 | { | 181 | { |
| 181 | struct pci_sys_data *sys = dev->bus->sysdata; | 182 | struct pci_sys_data *sys = dev->bus->sysdata; |
| 182 | struct rcar_pci_priv *priv = sys->private_data; | 183 | struct rcar_pci_priv *priv = sys->private_data; |
| 184 | int irq; | ||
| 185 | |||
| 186 | irq = of_irq_parse_and_map_pci(dev, slot, pin); | ||
| 187 | if (!irq) | ||
| 188 | irq = priv->irq; | ||
| 183 | 189 | ||
| 184 | return priv->irq; | 190 | return irq; |
| 185 | } | 191 | } |
| 186 | 192 | ||
| 187 | #ifdef CONFIG_PCI_DEBUG | 193 | #ifdef CONFIG_PCI_DEBUG |
diff --git a/drivers/pci/host/pci-tegra.c b/drivers/pci/host/pci-tegra.c index 330f7e3a32dd..083cf37ca047 100644 --- a/drivers/pci/host/pci-tegra.c +++ b/drivers/pci/host/pci-tegra.c | |||
| @@ -639,10 +639,15 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys) | |||
| 639 | static int tegra_pcie_map_irq(const struct pci_dev *pdev, u8 slot, u8 pin) | 639 | static int tegra_pcie_map_irq(const struct pci_dev *pdev, u8 slot, u8 pin) |
| 640 | { | 640 | { |
| 641 | struct tegra_pcie *pcie = sys_to_pcie(pdev->bus->sysdata); | 641 | struct tegra_pcie *pcie = sys_to_pcie(pdev->bus->sysdata); |
| 642 | int irq; | ||
| 642 | 643 | ||
| 643 | tegra_cpuidle_pcie_irqs_in_use(); | 644 | tegra_cpuidle_pcie_irqs_in_use(); |
| 644 | 645 | ||
| 645 | return pcie->irq; | 646 | irq = of_irq_parse_and_map_pci(pdev, slot, pin); |
| 647 | if (!irq) | ||
| 648 | irq = pcie->irq; | ||
| 649 | |||
| 650 | return irq; | ||
| 646 | } | 651 | } |
| 647 | 652 | ||
| 648 | static void tegra_pcie_add_bus(struct pci_bus *bus) | 653 | static void tegra_pcie_add_bus(struct pci_bus *bus) |
diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c index 509a29d84509..c4e373294476 100644 --- a/drivers/pci/host/pcie-designware.c +++ b/drivers/pci/host/pcie-designware.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <linux/module.h> | 17 | #include <linux/module.h> |
| 18 | #include <linux/msi.h> | 18 | #include <linux/msi.h> |
| 19 | #include <linux/of_address.h> | 19 | #include <linux/of_address.h> |
| 20 | #include <linux/of_pci.h> | ||
| 20 | #include <linux/pci.h> | 21 | #include <linux/pci.h> |
| 21 | #include <linux/pci_regs.h> | 22 | #include <linux/pci_regs.h> |
| 22 | #include <linux/types.h> | 23 | #include <linux/types.h> |
| @@ -490,7 +491,7 @@ int __init dw_pcie_host_init(struct pcie_port *pp) | |||
| 490 | dw_pci.nr_controllers = 1; | 491 | dw_pci.nr_controllers = 1; |
| 491 | dw_pci.private_data = (void **)&pp; | 492 | dw_pci.private_data = (void **)&pp; |
| 492 | 493 | ||
| 493 | pci_common_init(&dw_pci); | 494 | pci_common_init_dev(pp->dev, &dw_pci); |
| 494 | pci_assign_unassigned_resources(); | 495 | pci_assign_unassigned_resources(); |
| 495 | #ifdef CONFIG_PCI_DOMAINS | 496 | #ifdef CONFIG_PCI_DOMAINS |
| 496 | dw_pci.domain++; | 497 | dw_pci.domain++; |
| @@ -520,13 +521,13 @@ static void dw_pcie_prog_viewport_cfg1(struct pcie_port *pp, u32 busdev) | |||
| 520 | dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX1, | 521 | dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX1, |
| 521 | PCIE_ATU_VIEWPORT); | 522 | PCIE_ATU_VIEWPORT); |
| 522 | dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_CFG1, PCIE_ATU_CR1); | 523 | dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_CFG1, PCIE_ATU_CR1); |
| 523 | dw_pcie_writel_rc(pp, PCIE_ATU_ENABLE, PCIE_ATU_CR2); | ||
| 524 | dw_pcie_writel_rc(pp, pp->cfg1_base, PCIE_ATU_LOWER_BASE); | 524 | dw_pcie_writel_rc(pp, pp->cfg1_base, PCIE_ATU_LOWER_BASE); |
| 525 | dw_pcie_writel_rc(pp, (pp->cfg1_base >> 32), PCIE_ATU_UPPER_BASE); | 525 | dw_pcie_writel_rc(pp, (pp->cfg1_base >> 32), PCIE_ATU_UPPER_BASE); |
| 526 | dw_pcie_writel_rc(pp, pp->cfg1_base + pp->config.cfg1_size - 1, | 526 | dw_pcie_writel_rc(pp, pp->cfg1_base + pp->config.cfg1_size - 1, |
| 527 | PCIE_ATU_LIMIT); | 527 | PCIE_ATU_LIMIT); |
| 528 | dw_pcie_writel_rc(pp, busdev, PCIE_ATU_LOWER_TARGET); | 528 | dw_pcie_writel_rc(pp, busdev, PCIE_ATU_LOWER_TARGET); |
| 529 | dw_pcie_writel_rc(pp, 0, PCIE_ATU_UPPER_TARGET); | 529 | dw_pcie_writel_rc(pp, 0, PCIE_ATU_UPPER_TARGET); |
| 530 | dw_pcie_writel_rc(pp, PCIE_ATU_ENABLE, PCIE_ATU_CR2); | ||
| 530 | } | 531 | } |
| 531 | 532 | ||
| 532 | static void dw_pcie_prog_viewport_mem_outbound(struct pcie_port *pp) | 533 | static void dw_pcie_prog_viewport_mem_outbound(struct pcie_port *pp) |
| @@ -535,7 +536,6 @@ static void dw_pcie_prog_viewport_mem_outbound(struct pcie_port *pp) | |||
| 535 | dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX0, | 536 | dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX0, |
| 536 | PCIE_ATU_VIEWPORT); | 537 | PCIE_ATU_VIEWPORT); |
| 537 | dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_MEM, PCIE_ATU_CR1); | 538 | dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_MEM, PCIE_ATU_CR1); |
| 538 | dw_pcie_writel_rc(pp, PCIE_ATU_ENABLE, PCIE_ATU_CR2); | ||
| 539 | dw_pcie_writel_rc(pp, pp->mem_base, PCIE_ATU_LOWER_BASE); | 539 | dw_pcie_writel_rc(pp, pp->mem_base, PCIE_ATU_LOWER_BASE); |
| 540 | dw_pcie_writel_rc(pp, (pp->mem_base >> 32), PCIE_ATU_UPPER_BASE); | 540 | dw_pcie_writel_rc(pp, (pp->mem_base >> 32), PCIE_ATU_UPPER_BASE); |
| 541 | dw_pcie_writel_rc(pp, pp->mem_base + pp->config.mem_size - 1, | 541 | dw_pcie_writel_rc(pp, pp->mem_base + pp->config.mem_size - 1, |
| @@ -543,6 +543,7 @@ static void dw_pcie_prog_viewport_mem_outbound(struct pcie_port *pp) | |||
| 543 | dw_pcie_writel_rc(pp, pp->config.mem_bus_addr, PCIE_ATU_LOWER_TARGET); | 543 | dw_pcie_writel_rc(pp, pp->config.mem_bus_addr, PCIE_ATU_LOWER_TARGET); |
| 544 | dw_pcie_writel_rc(pp, upper_32_bits(pp->config.mem_bus_addr), | 544 | dw_pcie_writel_rc(pp, upper_32_bits(pp->config.mem_bus_addr), |
| 545 | PCIE_ATU_UPPER_TARGET); | 545 | PCIE_ATU_UPPER_TARGET); |
| 546 | dw_pcie_writel_rc(pp, PCIE_ATU_ENABLE, PCIE_ATU_CR2); | ||
| 546 | } | 547 | } |
| 547 | 548 | ||
| 548 | static void dw_pcie_prog_viewport_io_outbound(struct pcie_port *pp) | 549 | static void dw_pcie_prog_viewport_io_outbound(struct pcie_port *pp) |
| @@ -551,7 +552,6 @@ static void dw_pcie_prog_viewport_io_outbound(struct pcie_port *pp) | |||
| 551 | dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX1, | 552 | dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX1, |
| 552 | PCIE_ATU_VIEWPORT); | 553 | PCIE_ATU_VIEWPORT); |
| 553 | dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_IO, PCIE_ATU_CR1); | 554 | dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_IO, PCIE_ATU_CR1); |
| 554 | dw_pcie_writel_rc(pp, PCIE_ATU_ENABLE, PCIE_ATU_CR2); | ||
| 555 | dw_pcie_writel_rc(pp, pp->io_base, PCIE_ATU_LOWER_BASE); | 555 | dw_pcie_writel_rc(pp, pp->io_base, PCIE_ATU_LOWER_BASE); |
| 556 | dw_pcie_writel_rc(pp, (pp->io_base >> 32), PCIE_ATU_UPPER_BASE); | 556 | dw_pcie_writel_rc(pp, (pp->io_base >> 32), PCIE_ATU_UPPER_BASE); |
| 557 | dw_pcie_writel_rc(pp, pp->io_base + pp->config.io_size - 1, | 557 | dw_pcie_writel_rc(pp, pp->io_base + pp->config.io_size - 1, |
| @@ -559,6 +559,7 @@ static void dw_pcie_prog_viewport_io_outbound(struct pcie_port *pp) | |||
| 559 | dw_pcie_writel_rc(pp, pp->config.io_bus_addr, PCIE_ATU_LOWER_TARGET); | 559 | dw_pcie_writel_rc(pp, pp->config.io_bus_addr, PCIE_ATU_LOWER_TARGET); |
| 560 | dw_pcie_writel_rc(pp, upper_32_bits(pp->config.io_bus_addr), | 560 | dw_pcie_writel_rc(pp, upper_32_bits(pp->config.io_bus_addr), |
| 561 | PCIE_ATU_UPPER_TARGET); | 561 | PCIE_ATU_UPPER_TARGET); |
| 562 | dw_pcie_writel_rc(pp, PCIE_ATU_ENABLE, PCIE_ATU_CR2); | ||
| 562 | } | 563 | } |
| 563 | 564 | ||
| 564 | static int dw_pcie_rd_other_conf(struct pcie_port *pp, struct pci_bus *bus, | 565 | static int dw_pcie_rd_other_conf(struct pcie_port *pp, struct pci_bus *bus, |
| @@ -723,7 +724,7 @@ static struct pci_bus *dw_pcie_scan_bus(int nr, struct pci_sys_data *sys) | |||
| 723 | 724 | ||
| 724 | if (pp) { | 725 | if (pp) { |
| 725 | pp->root_bus_nr = sys->busnr; | 726 | pp->root_bus_nr = sys->busnr; |
| 726 | bus = pci_scan_root_bus(NULL, sys->busnr, &dw_pcie_ops, | 727 | bus = pci_scan_root_bus(pp->dev, sys->busnr, &dw_pcie_ops, |
| 727 | sys, &sys->resources); | 728 | sys, &sys->resources); |
| 728 | } else { | 729 | } else { |
| 729 | bus = NULL; | 730 | bus = NULL; |
| @@ -736,8 +737,13 @@ static struct pci_bus *dw_pcie_scan_bus(int nr, struct pci_sys_data *sys) | |||
| 736 | static int dw_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) | 737 | static int dw_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) |
| 737 | { | 738 | { |
| 738 | struct pcie_port *pp = sys_to_pcie(dev->bus->sysdata); | 739 | struct pcie_port *pp = sys_to_pcie(dev->bus->sysdata); |
| 740 | int irq; | ||
| 741 | |||
| 742 | irq = of_irq_parse_and_map_pci(dev, slot, pin); | ||
| 743 | if (!irq) | ||
| 744 | irq = pp->irq; | ||
| 739 | 745 | ||
| 740 | return pp->irq; | 746 | return irq; |
| 741 | } | 747 | } |
| 742 | 748 | ||
| 743 | static void dw_pcie_add_bus(struct pci_bus *bus) | 749 | static void dw_pcie_add_bus(struct pci_bus *bus) |
| @@ -764,7 +770,7 @@ void dw_pcie_setup_rc(struct pcie_port *pp) | |||
| 764 | u32 membase; | 770 | u32 membase; |
| 765 | u32 memlimit; | 771 | u32 memlimit; |
| 766 | 772 | ||
| 767 | /* set the number of lines as 4 */ | 773 | /* set the number of lanes */ |
| 768 | dw_pcie_readl_rc(pp, PCIE_PORT_LINK_CONTROL, &val); | 774 | dw_pcie_readl_rc(pp, PCIE_PORT_LINK_CONTROL, &val); |
| 769 | val &= ~PORT_LINK_MODE_MASK; | 775 | val &= ~PORT_LINK_MODE_MASK; |
| 770 | switch (pp->lanes) { | 776 | switch (pp->lanes) { |
