Skip to content

Commit

Permalink
PM: Allow runtime_suspend methods to call pm_schedule_suspend()
Browse files Browse the repository at this point in the history
This patch (as1361) changes the runtime PM interface slightly; it
allows suspend requests to be scheduled while the runtime_suspend
method is running.  If the method succeeds then the scheduled request
is cancelled, whereas if the method fails then an idle notification is
sent only if no request was scheduled.

Being able to schedule suspend requests from within a runtime_suspend
method is useful for drivers that need to test for idleness and
suspend the device all while holding a single spinlock, or for drivers
that want to check for idleness by polling.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
  • Loading branch information
Alan Stern authored and Rafael J. Wysocki committed May 10, 2010
1 parent 228c54e commit 240c733
Showing 1 changed file with 5 additions and 5 deletions.
10 changes: 5 additions & 5 deletions drivers/base/power/runtime.c
Original file line number Diff line number Diff line change
Expand Up @@ -229,14 +229,16 @@ int __pm_runtime_suspend(struct device *dev, bool from_wq)

if (retval) {
dev->power.runtime_status = RPM_ACTIVE;
pm_runtime_cancel_pending(dev);

if (retval == -EAGAIN || retval == -EBUSY) {
notify = true;
if (dev->power.timer_expires == 0)
notify = true;
dev->power.runtime_error = 0;
} else {
pm_runtime_cancel_pending(dev);
}
} else {
dev->power.runtime_status = RPM_SUSPENDED;
pm_runtime_deactivate_timer(dev);

if (dev->parent) {
parent = dev->parent;
Expand Down Expand Up @@ -659,8 +661,6 @@ int pm_schedule_suspend(struct device *dev, unsigned int delay)

if (dev->power.runtime_status == RPM_SUSPENDED)
retval = 1;
else if (dev->power.runtime_status == RPM_SUSPENDING)
retval = -EINPROGRESS;
else if (atomic_read(&dev->power.usage_count) > 0
|| dev->power.disable_depth > 0)
retval = -EAGAIN;
Expand Down

0 comments on commit 240c733

Please sign in to comment.