]> Pileus Git - ~andy/linux/commitdiff
PM: Prevent dpm_prepare() from returning errors unnecessarily
authorRafael J. Wysocki <rjw@sisk.pl>
Fri, 3 Dec 2010 21:58:05 +0000 (22:58 +0100)
committerRafael J. Wysocki <rjw@sisk.pl>
Fri, 24 Dec 2010 14:02:41 +0000 (15:02 +0100)
Currently dpm_prepare() returns error code if it finds that a device
being suspended has a pending runtime resume request.  However, it
should not do that if the checking for wakeup events is not enabled.
On the other hand, if the checking for wakeup events is enabled, it
can return error when a wakeup event is detected, regardless of its
source.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
drivers/base/power/main.c

index ead3e79d6fcf10f684f8d8f55a30d7254356ff42..4747a1e8b44af43432d5f96b9d4040c215f30bc6 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/interrupt.h>
 #include <linux/sched.h>
 #include <linux/async.h>
+#include <linux/suspend.h>
 
 #include "../base.h"
 #include "power.h"
@@ -1052,8 +1053,10 @@ static int dpm_prepare(pm_message_t state)
                mutex_unlock(&dpm_list_mtx);
 
                pm_runtime_get_noresume(dev);
-               if (pm_runtime_barrier(dev) && device_may_wakeup(dev)) {
-                       /* Wake-up requested during system sleep transition. */
+               if (pm_runtime_barrier(dev) && device_may_wakeup(dev))
+                       pm_wakeup_event(dev, 0);
+
+               if (!pm_check_wakeup_events()) {
                        pm_runtime_put_sync(dev);
                        error = -EBUSY;
                } else {
@@ -1068,8 +1071,8 @@ static int dpm_prepare(pm_message_t state)
                                error = 0;
                                continue;
                        }
-                       printk(KERN_ERR "PM: Failed to prepare device %s "
-                               "for power transition: error %d\n",
+                       printk(KERN_INFO "PM: Device %s not prepared "
+                               "for power transition: code %d\n",
                                kobject_name(&dev->kobj), error);
                        put_device(dev);
                        break;