]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/pci/bus.c
hwmon: (lm85) Better label names
[linux-2.6-omap-h63xx.git] / drivers / pci / bus.c
index 5f7db9d2436e76141e15d50a44e9f1fc38e54378..529d9d7727b01d1ea857388cb0514f2703c8f5b3 100644 (file)
@@ -77,16 +77,17 @@ pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res,
  * This adds a single pci device to the global
  * device list and adds sysfs and procfs entries
  */
-void __devinit pci_bus_add_device(struct pci_dev *dev)
+int pci_bus_add_device(struct pci_dev *dev)
 {
-       device_add(&dev->dev);
-
-       down_write(&pci_bus_sem);
-       list_add_tail(&dev->global_list, &pci_devices);
-       up_write(&pci_bus_sem);
+       int retval;
+       retval = device_add(&dev->dev);
+       if (retval)
+               return retval;
 
+       dev->is_added = 1;
        pci_proc_attach_device(dev);
        pci_create_sysfs_dev_files(dev);
+       return 0;
 }
 
 /**
@@ -101,23 +102,23 @@ void __devinit pci_bus_add_device(struct pci_dev *dev)
  *
  * Call hotplug for each new devices.
  */
-void __devinit pci_bus_add_devices(struct pci_bus *bus)
+void pci_bus_add_devices(struct pci_bus *bus)
 {
        struct pci_dev *dev;
+       struct pci_bus *child_bus;
+       int retval;
 
        list_for_each_entry(dev, &bus->devices, bus_list) {
-               /*
-                * Skip already-present devices (which are on the
-                * global device list.)
-                */
-               if (!list_empty(&dev->global_list))
+               /* Skip already-added devices */
+               if (dev->is_added)
                        continue;
-               pci_bus_add_device(dev);
+               retval = pci_bus_add_device(dev);
+               if (retval)
+                       dev_err(&dev->dev, "Error adding device, continuing\n");
        }
 
        list_for_each_entry(dev, &bus->devices, bus_list) {
-
-               BUG_ON(list_empty(&dev->global_list));
+               BUG_ON(!dev->is_added);
 
                /*
                 * If there is an unattached subordinate bus, attach
@@ -129,10 +130,27 @@ void __devinit pci_bus_add_devices(struct pci_bus *bus)
                               list_add_tail(&dev->subordinate->node,
                                               &dev->bus->children);
                               up_write(&pci_bus_sem);
-                      }
+                       }
                        pci_bus_add_devices(dev->subordinate);
 
-                       sysfs_create_link(&dev->subordinate->class_dev.kobj, &dev->dev.kobj, "bridge");
+                       /* 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");
                }
        }
 }
@@ -194,7 +212,6 @@ void pci_walk_bus(struct pci_bus *top, void (*cb)(struct pci_dev *, void *),
        }
        up_read(&pci_bus_sem);
 }
-EXPORT_SYMBOL_GPL(pci_walk_bus);
 
 EXPORT_SYMBOL(pci_bus_alloc_resource);
 EXPORT_SYMBOL_GPL(pci_bus_add_device);