]> err.no Git - linux-2.6/commitdiff
[PATCH] powerpc: clean up iSeries PCI probe
authorStephen Rothwell <sfr@canb.auug.org.au>
Fri, 19 May 2006 06:54:42 +0000 (16:54 +1000)
committerPaul Mackerras <paulus@samba.org>
Wed, 24 May 2006 06:08:57 +0000 (16:08 +1000)
Only scan the host bridges and then use the existing pci_devs_phb_init()
routine.

Also fix typo in setup of reg property.

Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/kernel/pci_dn.c
arch/powerpc/platforms/iseries/pci.c
arch/powerpc/platforms/iseries/setup.c

index 12c4c9e9bbc7bc3bb9165d3d8b055d1538cff5e6..1c18953514c3d0a15aea5efce1eaf0092c40c8c1 100644 (file)
@@ -31,6 +31,7 @@
 #include <asm/pci-bridge.h>
 #include <asm/pSeries_reconfig.h>
 #include <asm/ppc-pci.h>
+#include <asm/firmware.h>
 
 /*
  * Traverse_func that inits the PCI fields of the device node.
@@ -59,6 +60,11 @@ static void * __devinit update_dn_pci_info(struct device_node *dn, void *data)
                pdn->busno = (regs[0] >> 16) & 0xff;
                pdn->devfn = (regs[0] >> 8) & 0xff;
        }
+       if (firmware_has_feature(FW_FEATURE_ISERIES)) {
+               u32 *busp = (u32 *)get_property(dn, "linux,subbus", NULL);
+               if (busp)
+                       pdn->bussubno = *busp;
+       }
 
        pdn->pci_ext_config_space = (type && *type == 1);
        return NULL;
index 86a869839d34b743adf33f5bfa77ef6bca503ca2..35bcc98111f5b7077faa9a1f612861cfa678b983 100644 (file)
@@ -166,13 +166,21 @@ static void pci_Log_Error(char *Error_Text, int Bus, int SubBus,
 void iSeries_pcibios_init(void)
 {
        struct pci_controller *phb;
-       struct device_node *node;
-       struct device_node *dn;
+       struct device_node *root = of_find_node_by_path("/");
+       struct device_node *node = NULL;
 
-       for_each_node_by_type(node, "pci") {
+       if (root == NULL) {
+               printk(KERN_CRIT "iSeries_pcibios_init: can't find root "
+                               "of device tree\n");
+               return;
+       }
+       while ((node = of_get_next_child(root, node)) != NULL) {
                HvBusNumber bus;
                u32 *busp;
 
+               if ((node->type == NULL) || (strcmp(node->type, "pci") != 0))
+                       continue;
+
                busp = (u32 *)get_property(node, "bus-range", NULL);
                if (busp == NULL)
                        continue;
@@ -186,33 +194,11 @@ void iSeries_pcibios_init(void)
                phb->first_busno = bus;
                phb->last_busno = bus;
                phb->ops = &iSeries_pci_ops;
+       }
 
-               /* Find and connect the devices. */
-               for (dn = NULL; (dn = of_get_next_child(node, dn)) != NULL;) {
-                       struct pci_dn *pdn;
-                       u32 *reg;
-
-                       reg = (u32 *)get_property(dn, "reg", NULL);
-                       if (reg == NULL) {
-                               printk(KERN_DEBUG "no reg property!\n");
-                               continue;
-                       }
-                       busp = (u32 *)get_property(dn, "linux,subbus", NULL);
-                       if (busp == NULL) {
-                               printk(KERN_DEBUG "no subbus property!\n");
-                               continue;
-                       }
+       of_node_put(root);
 
-                       pdn = kzalloc(sizeof(*pdn), GFP_KERNEL);
-                       if (pdn == NULL)
-                               return;
-                       dn->data = pdn;
-                       pdn->node = dn;
-                       pdn->busno = bus;
-                       pdn->devfn = (reg[0] >> 8) & 0xff;
-                       pdn->bussubno = *busp;
-               }
-       }
+       pci_devs_phb_init();
 }
 
 /*
index d83f5ed4ec1fba94690781703aad50c9e273cf49..0f49412b438edbc0592d9df874c80516fef70b47 100644 (file)
@@ -1073,7 +1073,7 @@ static void scan_bridge_slot(struct iseries_flat_dt *dt, HvBusNumber bus,
                                snprintf(buf, sizeof(buf), "pci@%x,%d",
                                                PCI_SLOT(devfn), function);
                        dt_start_node(dt, buf);
-                       reg[0] = (bus << 18) | (devfn << 8);
+                       reg[0] = (bus << 16) | (devfn << 8);
                        reg[1] = 0;
                        reg[2] = 0;
                        reg[3] = 0;