Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/penberg...
[pandora-kernel.git] / drivers / base / power / main.c
index bb5c8cb..2a52270 100644 (file)
@@ -49,12 +49,6 @@ LIST_HEAD(dpm_noirq_list);
 static DEFINE_MUTEX(dpm_list_mtx);
 static pm_message_t pm_transition;
 
-/*
- * Set once the preparation of devices for a PM transition has started, reset
- * before starting to resume devices.  Protected by dpm_list_mtx.
- */
-static bool transition_started;
-
 static int async_error;
 
 /**
@@ -63,7 +57,7 @@ static int async_error;
  */
 void device_pm_init(struct device *dev)
 {
-       dev->power.status = DPM_ON;
+       dev->power.in_suspend = false;
        init_completion(&dev->power.completion);
        complete_all(&dev->power.completion);
        dev->power.wakeup = NULL;
@@ -94,22 +88,11 @@ void device_pm_unlock(void)
 void device_pm_add(struct device *dev)
 {
        pr_debug("PM: Adding info for %s:%s\n",
-                dev->bus ? dev->bus->name : "No Bus",
-                kobject_name(&dev->kobj));
+                dev->bus ? dev->bus->name : "No Bus", dev_name(dev));
        mutex_lock(&dpm_list_mtx);
-       if (dev->parent) {
-               if (dev->parent->power.status >= DPM_SUSPENDING)
-                       dev_warn(dev, "parent %s should not be sleeping\n",
-                                dev_name(dev->parent));
-       } else if (transition_started) {
-               /*
-                * We refuse to register parentless devices while a PM
-                * transition is in progress in order to avoid leaving them
-                * unhandled down the road
-                */
-               dev_WARN(dev, "Parentless device registered during a PM transaction\n");
-       }
-
+       if (dev->parent && dev->parent->power.in_suspend)
+               dev_warn(dev, "parent %s should not be sleeping\n",
+                       dev_name(dev->parent));
        list_add_tail(&dev->power.entry, &dpm_list);
        mutex_unlock(&dpm_list_mtx);
 }
@@ -121,8 +104,7 @@ void device_pm_add(struct device *dev)
 void device_pm_remove(struct device *dev)
 {
        pr_debug("PM: Removing info for %s:%s\n",
-                dev->bus ? dev->bus->name : "No Bus",
-                kobject_name(&dev->kobj));
+                dev->bus ? dev->bus->name : "No Bus", dev_name(dev));
        complete_all(&dev->power.completion);
        mutex_lock(&dpm_list_mtx);
        list_del_init(&dev->power.entry);
@@ -139,10 +121,8 @@ void device_pm_remove(struct device *dev)
 void device_pm_move_before(struct device *deva, struct device *devb)
 {
        pr_debug("PM: Moving %s:%s before %s:%s\n",
-                deva->bus ? deva->bus->name : "No Bus",
-                kobject_name(&deva->kobj),
-                devb->bus ? devb->bus->name : "No Bus",
-                kobject_name(&devb->kobj));
+                deva->bus ? deva->bus->name : "No Bus", dev_name(deva),
+                devb->bus ? devb->bus->name : "No Bus", dev_name(devb));
        /* Delete deva from dpm_list and reinsert before devb. */
        list_move_tail(&deva->power.entry, &devb->power.entry);
 }
@@ -155,10 +135,8 @@ void device_pm_move_before(struct device *deva, struct device *devb)
 void device_pm_move_after(struct device *deva, struct device *devb)
 {
        pr_debug("PM: Moving %s:%s after %s:%s\n",
-                deva->bus ? deva->bus->name : "No Bus",
-                kobject_name(&deva->kobj),
-                devb->bus ? devb->bus->name : "No Bus",
-                kobject_name(&devb->kobj));
+                deva->bus ? deva->bus->name : "No Bus", dev_name(deva),
+                devb->bus ? devb->bus->name : "No Bus", dev_name(devb));
        /* Delete deva from dpm_list and reinsert after devb. */
        list_move(&deva->power.entry, &devb->power.entry);
 }
@@ -170,8 +148,7 @@ void device_pm_move_after(struct device *deva, struct device *devb)
 void device_pm_move_last(struct device *dev)
 {
        pr_debug("PM: Moving %s:%s to end of list\n",
-                dev->bus ? dev->bus->name : "No Bus",
-                kobject_name(&dev->kobj));
+                dev->bus ? dev->bus->name : "No Bus", dev_name(dev));
        list_move_tail(&dev->power.entry, &dpm_list);
 }
 
@@ -409,7 +386,7 @@ static void pm_dev_err(struct device *dev, pm_message_t state, char *info,
                        int error)
 {
        printk(KERN_ERR "PM: Device %s failed to %s%s: error %d\n",
-               kobject_name(&dev->kobj), pm_verb(state.event), info, error);
+               dev_name(dev), pm_verb(state.event), info, error);
 }
 
 static void dpm_show_time(ktime_t starttime, pm_message_t state, char *info)
@@ -482,13 +459,11 @@ void dpm_resume_noirq(pm_message_t state)
        ktime_t starttime = ktime_get();
 
        mutex_lock(&dpm_list_mtx);
-       transition_started = false;
        while (!list_empty(&dpm_noirq_list)) {
                struct device *dev = to_device(dpm_noirq_list.next);
                int error;
 
                get_device(dev);
-               dev->power.status = DPM_OFF;
                list_move_tail(&dev->power.entry, &dpm_suspended_list);
                mutex_unlock(&dpm_list_mtx);
 
@@ -541,7 +516,7 @@ static int device_resume(struct device *dev, pm_message_t state, bool async)
        dpm_wait(dev->parent, async);
        device_lock(dev);
 
-       dev->power.status = DPM_RESUMING;
+       dev->power.in_suspend = false;
 
        if (dev->bus) {
                if (dev->bus->pm) {
@@ -685,12 +660,11 @@ static void dpm_complete(pm_message_t state)
 
        INIT_LIST_HEAD(&list);
        mutex_lock(&dpm_list_mtx);
-       transition_started = false;
        while (!list_empty(&dpm_prepared_list)) {
                struct device *dev = to_device(dpm_prepared_list.prev);
 
                get_device(dev);
-               dev->power.status = DPM_ON;
+               dev->power.in_suspend = false;
                list_move(&dev->power.entry, &list);
                mutex_unlock(&dpm_list_mtx);
 
@@ -806,7 +780,6 @@ int dpm_suspend_noirq(pm_message_t state)
                        put_device(dev);
                        break;
                }
-               dev->power.status = DPM_OFF_IRQ;
                if (!list_empty(&dev->power.entry))
                        list_move(&dev->power.entry, &dpm_noirq_list);
                put_device(dev);
@@ -894,9 +867,6 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)
                }
        }
 
-       if (!error)
-               dev->power.status = DPM_OFF;
-
  End:
        device_unlock(dev);
        complete_all(&dev->power.completion);
@@ -1025,12 +995,10 @@ static int dpm_prepare(pm_message_t state)
        int error = 0;
 
        mutex_lock(&dpm_list_mtx);
-       transition_started = true;
        while (!list_empty(&dpm_list)) {
                struct device *dev = to_device(dpm_list.next);
 
                get_device(dev);
-               dev->power.status = DPM_PREPARING;
                mutex_unlock(&dpm_list_mtx);
 
                pm_runtime_get_noresume(dev);
@@ -1046,7 +1014,6 @@ static int dpm_prepare(pm_message_t state)
 
                mutex_lock(&dpm_list_mtx);
                if (error) {
-                       dev->power.status = DPM_ON;
                        if (error == -EAGAIN) {
                                put_device(dev);
                                error = 0;
@@ -1054,11 +1021,11 @@ static int dpm_prepare(pm_message_t state)
                        }
                        printk(KERN_INFO "PM: Device %s not prepared "
                                "for power transition: code %d\n",
-                               kobject_name(&dev->kobj), error);
+                               dev_name(dev), error);
                        put_device(dev);
                        break;
                }
-               dev->power.status = DPM_SUSPENDING;
+               dev->power.in_suspend = true;
                if (!list_empty(&dev->power.entry))
                        list_move_tail(&dev->power.entry, &dpm_prepared_list);
                put_device(dev);