diff options
Diffstat (limited to 'drivers/pci/of.c')
| -rw-r--r-- | drivers/pci/of.c | 10 | 
1 files changed, 8 insertions, 2 deletions
| diff --git a/drivers/pci/of.c b/drivers/pci/of.c index d84381ce82b5..0b1237cff239 100644 --- a/drivers/pci/of.c +++ b/drivers/pci/of.c @@ -423,7 +423,7 @@ failed:   */  static int of_irq_parse_pci(const struct pci_dev *pdev, struct of_phandle_args *out_irq)  { -	struct device_node *dn, *ppnode; +	struct device_node *dn, *ppnode = NULL;  	struct pci_dev *ppdev;  	__be32 laddr[3];  	u8 pin; @@ -452,8 +452,14 @@ static int of_irq_parse_pci(const struct pci_dev *pdev, struct of_phandle_args *  	if (pin == 0)  		return -ENODEV; +	/* Local interrupt-map in the device node? Use it! */ +	if (of_get_property(dn, "interrupt-map", NULL)) { +		pin = pci_swizzle_interrupt_pin(pdev, pin); +		ppnode = dn; +	} +  	/* Now we walk up the PCI tree */ -	for (;;) { +	while (!ppnode) {  		/* Get the pci_dev of our parent */  		ppdev = pdev->bus->self; |