From: Benjamin Herrenschmidt <benh@kernel.crashing.org>

The iMac G5 has some issues with Apple chips not having a valid
PCI_INTERRUPT_PIN.  This patch fixes IRQ routing on PowerMac platforms so
that it only relies on the Open Firmware informations which are correct.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: J. Mayer <l_indien@magic.fr>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/arch/ppc64/kernel/pmac_pci.c |   22 +++++++++++++++++++++-
 1 files changed, 21 insertions(+), 1 deletion(-)

diff -puN arch/ppc64/kernel/pmac_pci.c~ppc64-fix-some-pci-interrupt-routing-issues-on-imac-g5 arch/ppc64/kernel/pmac_pci.c
--- 25/arch/ppc64/kernel/pmac_pci.c~ppc64-fix-some-pci-interrupt-routing-issues-on-imac-g5	2005-03-11 12:32:11.000000000 -0800
+++ 25-akpm/arch/ppc64/kernel/pmac_pci.c	2005-03-11 12:32:11.000000000 -0800
@@ -656,13 +656,32 @@ static int __init add_bridge(struct devi
 	return 0;
 }
 
+/*
+ * We use our own read_irq_line here because PCI_INTERRUPT_PIN is
+ * crap on some of Apple ASICs. We unconditionally use the Open Firmware
+ * interrupt number as this is always right.
+ */
+static int pmac_pci_read_irq_line(struct pci_dev *pci_dev)
+{
+	struct device_node *node;
+
+	node = pci_device_to_OF_node(pci_dev);
+	if (node == NULL)
+		return -1;
+	if (node->n_intrs == 0)
+		return -1;
+	pci_dev->irq = node->intrs[0].line;
+	pci_write_config_byte(pci_dev, PCI_INTERRUPT_LINE, pci_dev->irq);
+
+	return 0;
+}
 
 void __init pmac_pcibios_fixup(void)
 {
 	struct pci_dev *dev = NULL;
 
 	for_each_pci_dev(dev)
-		pci_read_irq_line(dev);
+		pmac_pci_read_irq_line(dev);
 }
 
 static void __init pmac_fixup_phb_resources(void)
@@ -771,3 +790,4 @@ static void fixup_k2_sata(struct pci_dev
 	}
 }
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SERVERWORKS, 0x0240, fixup_k2_sata);
+
_