@@ -28,5 +28,4 @@ extern struct pci_ops *__nongpreldata pci_root_ops;
extern unsigned int pcibios_irq_mask;
void pcibios_irq_init(void);
-void pcibios_fixup_irqs(void);
void pcibios_enable_irq(struct pci_dev *dev);
@@ -40,19 +40,19 @@ void __init pcibios_irq_init(void)
{
}
-void __init pcibios_fixup_irqs(void)
+int pcibios_map_irq(struct pci_dev *dev, uint8_t slot, uint8_t pin)
{
- struct pci_dev *dev = NULL;
- uint8_t line, pin;
-
- for_each_pci_dev(dev) {
- pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
- if (pin) {
- dev->irq = pci_bus0_irq_routing[PCI_SLOT(dev->devfn)][pin - 1];
- pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
- }
- pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &line);
- }
+ int irq;
+
+ irq = pci_bus0_irq_routing[PCI_SLOT(dev->devfn)][pin - 1];
+ pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq);
+ return irq;
+}
+
+int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
+{
+ bridge->map_irq = pcibios_map_irq;
+ return 0;
}
void pcibios_enable_irq(struct pci_dev *dev)
@@ -387,7 +387,6 @@ int __init pcibios_init(void)
bus = pci_scan_root_bus(NULL, 0, pci_root_ops, NULL, &resources);
pcibios_irq_init();
- pcibios_fixup_irqs();
pcibios_resource_survey();
if (!bus)
return 0;
PCI IRQs are being assigned during the frv pcibios phase. This causes devices which are not connected at boot but are later hot-plugged to not receive an IRQ. This patch set causes the pcibios to instead register an IRQ assignment function which is called during the enable device path to apply to all devices. Signed-off-by: Matthew Minter <matt@masarand.com> --- arch/frv/mb93090-mb00/pci-frv.h | 1 - arch/frv/mb93090-mb00/pci-irq.c | 24 ++++++++++++------------ arch/frv/mb93090-mb00/pci-vdk.c | 1 - 3 files changed, 12 insertions(+), 14 deletions(-)