microblaze/pci: Drop PowerPC-ism from irq parsing
The Microblaze PCI code copied the PowerPC irq handling, but powerpc needs to handle broken device trees that are not present on Microblaze. This patch removes the powerpc special case and replaces it with a direct of_irq_parse_and_map_pci() call. Signed-off-by: Grant Likely <grant.likely@linaro.org> Acked-by: Michal Simek <monstr@monstr.eu>
This commit is contained in:
parent
16b84e5a50
commit
f27446c3ad
|
@ -127,8 +127,6 @@ extern void of_scan_pci_bridge(struct device_node *node,
|
|||
extern void of_scan_bus(struct device_node *node, struct pci_bus *bus);
|
||||
extern void of_rescan_bus(struct device_node *node, struct pci_bus *bus);
|
||||
|
||||
extern int pci_read_irq_line(struct pci_dev *dev);
|
||||
|
||||
extern int pci_bus_find_capability(struct pci_bus *bus,
|
||||
unsigned int devfn, int cap);
|
||||
|
||||
|
|
|
@ -192,75 +192,6 @@ void pcibios_set_master(struct pci_dev *dev)
|
|||
/* No special bus mastering setup handling */
|
||||
}
|
||||
|
||||
/*
|
||||
* Reads the interrupt pin to determine if interrupt is use by card.
|
||||
* If the interrupt is used, then gets the interrupt line from the
|
||||
* openfirmware and sets it in the pci_dev and pci_config line.
|
||||
*/
|
||||
int pci_read_irq_line(struct pci_dev *pci_dev)
|
||||
{
|
||||
struct of_phandle_args oirq;
|
||||
unsigned int virq;
|
||||
|
||||
/* The current device-tree that iSeries generates from the HV
|
||||
* PCI informations doesn't contain proper interrupt routing,
|
||||
* and all the fallback would do is print out crap, so we
|
||||
* don't attempt to resolve the interrupts here at all, some
|
||||
* iSeries specific fixup does it.
|
||||
*
|
||||
* In the long run, we will hopefully fix the generated device-tree
|
||||
* instead.
|
||||
*/
|
||||
pr_debug("PCI: Try to map irq for %s...\n", pci_name(pci_dev));
|
||||
|
||||
#ifdef DEBUG
|
||||
memset(&oirq, 0xff, sizeof(oirq));
|
||||
#endif
|
||||
/* Try to get a mapping from the device-tree */
|
||||
if (of_irq_parse_pci(pci_dev, &oirq)) {
|
||||
u8 line, pin;
|
||||
|
||||
/* If that fails, lets fallback to what is in the config
|
||||
* space and map that through the default controller. We
|
||||
* also set the type to level low since that's what PCI
|
||||
* interrupts are. If your platform does differently, then
|
||||
* 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;
|
||||
}
|
||||
pr_debug(" No map ! Using line %d (pin %d) from PCI config\n",
|
||||
line, pin);
|
||||
|
||||
virq = irq_create_mapping(NULL, line);
|
||||
if (virq)
|
||||
irq_set_irq_type(virq, IRQ_TYPE_LEVEL_LOW);
|
||||
} else {
|
||||
pr_debug(" Got one, spec %d cells (0x%08x 0x%08x...) on %s\n",
|
||||
oirq.args_count, oirq.args[0], oirq.args[1],
|
||||
of_node_full_name(oirq.np));
|
||||
|
||||
virq = irq_create_of_mapping(&oirq);
|
||||
}
|
||||
if (!virq) {
|
||||
pr_debug(" Failed to map !\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
pr_debug(" Mapped to linux irq %d\n", virq);
|
||||
|
||||
pci_dev->irq = virq;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(pci_read_irq_line);
|
||||
|
||||
/*
|
||||
* Platform support for /proc/bus/pci/X/Y mmap()s,
|
||||
* modelled on the sparc64 implementation by Dave Miller.
|
||||
|
@ -959,7 +890,7 @@ void pcibios_setup_bus_devices(struct pci_bus *bus)
|
|||
dev->dev.archdata.dma_data = (void *)PCI_DRAM_OFFSET;
|
||||
|
||||
/* Read default IRQs and fixup if necessary */
|
||||
pci_read_irq_line(dev);
|
||||
dev->irq = of_irq_parse_and_map_pci(dev, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue