@@ -226,7 +226,7 @@ struct pci_controller* pci_find_hose_for_OF_device(struct device_node* node)
* If the interrupt is used, then gets the interrupt line from the
* openfirmware and sets it in the pci_dev and pci_config line.
*/
-static int pci_read_irq_line(struct pci_dev *pci_dev)
+static int pci_read_irq_line(struct pci_dev *pci_dev, u8 pin)
{
struct of_phandle_args oirq;
unsigned int virq;
@@ -238,7 +238,7 @@ static int pci_read_irq_line(struct pci_dev *pci_dev)
#endif
/* Try to get a mapping from the device-tree */
if (of_irq_parse_pci(pci_dev, &oirq)) {
- u8 line, pin;
+ u8 line;
/* If that fails, lets fallback to what is in the config
* space and map that through the default controller. We
@@ -247,10 +247,6 @@ static int pci_read_irq_line(struct pci_dev *pci_dev)
* either provide a proper interrupt tree or don't use this
* function.
*/
- if (pci_read_config_byte(pci_dev, PCI_INTERRUPT_PIN, &pin))
- return -1;
- if (pin == 0)
- return -1;
if (pci_read_config_byte(pci_dev, PCI_INTERRUPT_LINE, &line) ||
line == 0xff || line == 0) {
return -1;
@@ -275,9 +271,16 @@ static int pci_read_irq_line(struct pci_dev *pci_dev)
pr_debug(" Mapped to linux irq %d\n", virq);
- pci_dev->irq = virq;
+ return virq;
+}
- return 0;
+int pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
+{
+ /* Read default IRQs and fixup if necessary */
+ int irq = pci_read_irq_line(dev, pin);
+ if (ppc_md.pci_irq_fixup)
+ ppc_md.pci_irq_fixup(dev);
+ return irq;
}
/*
@@ -775,6 +778,8 @@ int pci_proc_domain(struct pci_bus *bus)
int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
{
+ bridge->swizzle_irq = NULL;
+ bridge->map_irq = pci_map_irq;
if (ppc_md.pcibios_root_bridge_prepare)
return ppc_md.pcibios_root_bridge_prepare(bridge);
@@ -977,11 +982,6 @@ static void pcibios_setup_device(struct pci_dev *dev)
/* Additional platform DMA/iommu setup */
if (ppc_md.pci_dma_dev_setup)
ppc_md.pci_dma_dev_setup(dev);
-
- /* Read default IRQs and fixup if necessary */
- pci_read_irq_line(dev);
- if (ppc_md.pci_irq_fixup)
- ppc_md.pci_irq_fixup(dev);
}
int pcibios_add_device(struct pci_dev *dev)
From: matthew_minter <matthew_minter@xyratex.com> --- arch/powerpc/kernel/pci-common.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-)