]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/pci/bus.c
Merge branches 'x86/cleanups', 'x86/kexec', 'x86/mce2' and 'linus' into x86/core
[linux-2.6-omap-h63xx.git] / drivers / pci / bus.c
index 999cc4088b5952beb76e018e573afff4b53fba04..52b54f053be092e4c589b03d1dd03c6be9deacb6 100644 (file)
@@ -71,7 +71,7 @@ pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res,
 }
 
 /**
- * add a single device
+ * pci_bus_add_device - add a single device
  * @dev: device to add
  *
  * This adds a single pci device to the global
@@ -90,6 +90,37 @@ int pci_bus_add_device(struct pci_dev *dev)
        return 0;
 }
 
+/**
+ * pci_bus_add_child - add a child bus
+ * @bus: bus to add
+ *
+ * This adds sysfs entries for a single bus
+ */
+int pci_bus_add_child(struct pci_bus *bus)
+{
+       int retval;
+
+       if (bus->bridge)
+               bus->dev.parent = bus->bridge;
+
+       retval = device_register(&bus->dev);
+       if (retval)
+               return retval;
+
+       bus->is_added = 1;
+
+       retval = device_create_file(&bus->dev, &dev_attr_cpuaffinity);
+       if (retval)
+               return retval;
+
+       retval = device_create_file(&bus->dev, &dev_attr_cpulistaffinity);
+
+       /* Create legacy_io and legacy_mem files for this bus */
+       pci_create_legacy_files(bus);
+
+       return retval;
+}
+
 /**
  * pci_bus_add_devices - insert newly discovered PCI devices
  * @bus: bus to check for new devices
@@ -105,7 +136,7 @@ int pci_bus_add_device(struct pci_dev *dev)
 void pci_bus_add_devices(struct pci_bus *bus)
 {
        struct pci_dev *dev;
-       struct pci_bus *child_bus;
+       struct pci_bus *child;
        int retval;
 
        list_for_each_entry(dev, &bus->devices, bus_list) {
@@ -120,45 +151,29 @@ void pci_bus_add_devices(struct pci_bus *bus)
        list_for_each_entry(dev, &bus->devices, bus_list) {
                BUG_ON(!dev->is_added);
 
+               child = dev->subordinate;
                /*
                 * If there is an unattached subordinate bus, attach
                 * it and then scan for unattached PCI devices.
                 */
-               if (dev->subordinate) {
-                      if (list_empty(&dev->subordinate->node)) {
-                              down_write(&pci_bus_sem);
-                              list_add_tail(&dev->subordinate->node,
-                                              &dev->bus->children);
-                              up_write(&pci_bus_sem);
-                       }
-                       pci_bus_add_devices(dev->subordinate);
-
-                       /* register the bus with sysfs as the parent is now
-                        * properly registered. */
-                       child_bus = dev->subordinate;
-                       if (child_bus->is_added)
-                               continue;
-                       child_bus->dev.parent = child_bus->bridge;
-                       retval = device_register(&child_bus->dev);
-                       if (retval)
-                               dev_err(&dev->dev, "Error registering pci_bus,"
-                                       " continuing...\n");
-                       else {
-                               child_bus->is_added = 1;
-                               retval = device_create_file(&child_bus->dev,
-                                                       &dev_attr_cpuaffinity);
-                       }
-                       if (retval)
-                               dev_err(&dev->dev, "Error creating cpuaffinity"
-                                       " file, continuing...\n");
-
-                       retval = device_create_file(&child_bus->dev,
-                                               &dev_attr_cpulistaffinity);
-                       if (retval)
-                               dev_err(&dev->dev,
-                                       "Error creating cpulistaffinity"
-                                       " file, continuing...\n");
+               if (!child)
+                       continue;
+               if (list_empty(&child->node)) {
+                       down_write(&pci_bus_sem);
+                       list_add_tail(&child->node, &dev->bus->children);
+                       up_write(&pci_bus_sem);
                }
+               pci_bus_add_devices(child);
+
+               /*
+                * register the bus with sysfs as the parent is now
+                * properly registered.
+                */
+               if (child->is_added)
+                       continue;
+               retval = pci_bus_add_child(child);
+               if (retval)
+                       dev_err(&dev->dev, "Error adding bus, continuing\n");
        }
 }