vserver 1.9.5.x5
[linux-2.6.git] / drivers / base / power / main.c
index 635ea20..15e6a8f 100644 (file)
@@ -28,6 +28,7 @@ LIST_HEAD(dpm_off);
 LIST_HEAD(dpm_off_irq);
 
 DECLARE_MUTEX(dpm_sem);
+DECLARE_MUTEX(dpm_list_sem);
 
 /*
  * PM Reference Counting.
@@ -66,7 +67,7 @@ void device_pm_set_parent(struct device * dev, struct device * parent)
        dev->power.pm_parent = parent;
        device_pm_hold(parent);
 }
-EXPORT_SYMBOL(device_pm_set_parent);
+EXPORT_SYMBOL_GPL(device_pm_set_parent);
 
 int device_pm_add(struct device * dev)
 {
@@ -75,12 +76,12 @@ int device_pm_add(struct device * dev)
        pr_debug("PM: Adding info for %s:%s\n",
                 dev->bus ? dev->bus->name : "No Bus", dev->kobj.name);
        atomic_set(&dev->power.pm_users, 0);
-       down(&dpm_sem);
+       down(&dpm_list_sem);
        list_add_tail(&dev->power.entry, &dpm_active);
        device_pm_set_parent(dev, dev->parent);
        if ((error = dpm_sysfs_add(dev)))
                list_del(&dev->power.entry);
-       up(&dpm_sem);
+       up(&dpm_list_sem);
        return error;
 }
 
@@ -88,11 +89,11 @@ void device_pm_remove(struct device * dev)
 {
        pr_debug("PM: Removing info for %s:%s\n",
                 dev->bus ? dev->bus->name : "No Bus", dev->kobj.name);
-       down(&dpm_sem);
+       down(&dpm_list_sem);
        dpm_sysfs_remove(dev);
        device_pm_release(dev->power.pm_parent);
-       list_del(&dev->power.entry);
-       up(&dpm_sem);
+       list_del_init(&dev->power.entry);
+       up(&dpm_list_sem);
 }