[PATCH] powerpc: remove Irq from pci_dn
authorStephen Rothwell <sfr@canb.auug.org.au>
Fri, 19 May 2006 06:50:39 +0000 (16:50 +1000)
committerPaul Mackerras <paulus@samba.org>
Wed, 24 May 2006 06:08:56 +0000 (16:08 +1000)
As we now store enough information in the device_node to allocate the
irq number in pcibios_final_fixup.

Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/platforms/iseries/pci.c
include/asm-powerpc/pci-bridge.h

index 5bc08d4eef4987c7a107b8fc416142105e856c43..edaafbb817b717ecd2d2c73973d3ce7747a48e73 100644 (file)
@@ -190,9 +190,6 @@ void iSeries_pcibios_init(void)
                /* Find and connect the devices. */
                for (dn = NULL; (dn = of_get_next_child(node, dn)) != NULL;) {
                        struct pci_dn *pdn;
-                       u8 irq;
-                       int err;
-                       u32 *agent;
                        u32 *reg;
                        u32 *lsn;
 
@@ -206,11 +203,6 @@ void iSeries_pcibios_init(void)
                                printk(KERN_DEBUG "no subbus property!\n");
                                continue;
                        }
-                       agent = (u32 *)get_property(dn, "linux,agent-id", NULL);
-                       if (agent == NULL) {
-                               printk(KERN_DEBUG "no agent-id\n");
-                               continue;
-                       }
                        lsn = (u32 *)get_property(dn,
                                        "linux,logical-slot-number", NULL);
                        if (lsn == NULL) {
@@ -218,21 +210,6 @@ void iSeries_pcibios_init(void)
                                continue;
                        }
 
-                       irq = iSeries_allocate_IRQ(bus, 0, *busp);
-                       err = HvCallXm_connectBusUnit(bus, *busp, *agent, irq);
-                       if (err) {
-                               pci_Log_Error("Connect Bus Unit",
-                                             bus, *busp, *agent, err);
-                               continue;
-                       }
-                       err = HvCallPci_configStore8(bus, *busp, *agent,
-                                       PCI_INTERRUPT_LINE, irq);
-                       if (err) {
-                               pci_Log_Error("PciCfgStore Irq Failed!",
-                                               bus, *busp, *agent, err);
-                               continue;
-                       }
-
                        pdn = kzalloc(sizeof(*pdn), GFP_KERNEL);
                        if (pdn == NULL)
                                return;
@@ -241,7 +218,6 @@ void iSeries_pcibios_init(void)
                        pdn->busno = bus;
                        pdn->devfn = (reg[0] >> 8) & 0xff;
                        pdn->bussubno = *busp;
-                       pdn->Irq = irq;
                        pdn->LogicalSlot = *lsn;
                }
        }
@@ -266,6 +242,34 @@ void __init iSeries_pci_final_fixup(void)
                       pdev->bus->number, pdev->devfn, node);
 
                if (node != NULL) {
+                       struct pci_dn *pdn = PCI_DN(node);
+                       u32 *agent;
+
+                       agent = (u32 *)get_property(node, "linux,agent-id",
+                                       NULL);
+                       if ((pdn != NULL) && (agent != NULL)) {
+                               u8 irq = iSeries_allocate_IRQ(pdn->busno, 0,
+                                               pdn->bussubno);
+                               int err;
+
+                               err = HvCallXm_connectBusUnit(pdn->busno, pdn->bussubno,
+                                               *agent, irq);
+                               if (err)
+                                       pci_Log_Error("Connect Bus Unit",
+                                               pdn->busno, pdn->bussubno, *agent, err);
+                               else {
+                                       err = HvCallPci_configStore8(pdn->busno, pdn->bussubno,
+                                                       *agent,
+                                                       PCI_INTERRUPT_LINE,
+                                                       irq);
+                                       if (err)
+                                               pci_Log_Error("PciCfgStore Irq Failed!",
+                                                       pdn->busno, pdn->bussubno, *agent, err);
+                               }
+                               if (!err)
+                                       pdev->irq = irq;
+                       }
+
                        ++DeviceCount;
                        pdev->sysdata = (void *)node;
                        PCI_DN(node)->pcidev = pdev;
@@ -275,7 +279,6 @@ void __init iSeries_pci_final_fixup(void)
                } else
                        printk("PCI: Device Tree not found for 0x%016lX\n",
                                        (unsigned long)pdev);
-               pdev->irq = PCI_DN(node)->Irq;
        }
        iSeries_activate_IRQs();
        mf_display_src(0xC9000200);
index 59794b466efc22f4222cd6ce26c9997dfedb73c8..09079e400d2bb7f26fe08f67cee38a2ed37c5ee3 100644 (file)
@@ -79,7 +79,6 @@ struct pci_dn {
        struct  pci_dev *pcidev;        /* back-pointer to the pci device */
        struct  device_node *node;      /* back-pointer to the device_node */
 #ifdef CONFIG_PPC_ISERIES
-       int     Irq;                    /* Assigned IRQ */
        int     Flags;                  /* Possible flags(disable/bist)*/
        u8      LogicalSlot;            /* Hv Slot Index for Tces */
 #endif