Commit 240c7337 authored by Alan Stern's avatar Alan Stern Committed by Rafael J. Wysocki

PM: Allow runtime_suspend methods to call pm_schedule_suspend()

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: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
parent 228c54ef
...@@ -229,14 +229,16 @@ int __pm_runtime_suspend(struct device *dev, bool from_wq) ...@@ -229,14 +229,16 @@ int __pm_runtime_suspend(struct device *dev, bool from_wq)
if (retval) { if (retval) {
dev->power.runtime_status = RPM_ACTIVE; dev->power.runtime_status = RPM_ACTIVE;
pm_runtime_cancel_pending(dev);
if (retval == -EAGAIN || retval == -EBUSY) { if (retval == -EAGAIN || retval == -EBUSY) {
if (dev->power.timer_expires == 0)
notify = true; notify = true;
dev->power.runtime_error = 0; dev->power.runtime_error = 0;
} else {
pm_runtime_cancel_pending(dev);
} }
} else { } else {
dev->power.runtime_status = RPM_SUSPENDED; dev->power.runtime_status = RPM_SUSPENDED;
pm_runtime_deactivate_timer(dev);
if (dev->parent) { if (dev->parent) {
parent = dev->parent; parent = dev->parent;
...@@ -659,8 +661,6 @@ int pm_schedule_suspend(struct device *dev, unsigned int delay) ...@@ -659,8 +661,6 @@ int pm_schedule_suspend(struct device *dev, unsigned int delay)
if (dev->power.runtime_status == RPM_SUSPENDED) if (dev->power.runtime_status == RPM_SUSPENDED)
retval = 1; retval = 1;
else if (dev->power.runtime_status == RPM_SUSPENDING)
retval = -EINPROGRESS;
else if (atomic_read(&dev->power.usage_count) > 0 else if (atomic_read(&dev->power.usage_count) > 0
|| dev->power.disable_depth > 0) || dev->power.disable_depth > 0)
retval = -EAGAIN; retval = -EAGAIN;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment