aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base/power/runtime.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/base/power/runtime.c')
-rw-r--r--drivers/base/power/runtime.c89
1 files changed, 45 insertions, 44 deletions
diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
index 0d4587b15c55..8dc247c974af 100644
--- a/drivers/base/power/runtime.c
+++ b/drivers/base/power/runtime.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * drivers/base/power/runtime.c - Helper functions for device run-time PM 2 * drivers/base/power/runtime.c - Helper functions for device runtime PM
3 * 3 *
4 * Copyright (c) 2009 Rafael J. Wysocki <rjw@sisk.pl>, Novell Inc. 4 * Copyright (c) 2009 Rafael J. Wysocki <rjw@sisk.pl>, Novell Inc.
5 * Copyright (C) 2010 Alan Stern <stern@rowland.harvard.edu> 5 * Copyright (C) 2010 Alan Stern <stern@rowland.harvard.edu>
@@ -135,8 +135,9 @@ static int rpm_check_suspend_allowed(struct device *dev)
135 135
136 if (dev->power.runtime_error) 136 if (dev->power.runtime_error)
137 retval = -EINVAL; 137 retval = -EINVAL;
138 else if (atomic_read(&dev->power.usage_count) > 0 138 else if (dev->power.disable_depth > 0)
139 || dev->power.disable_depth > 0) 139 retval = -EACCES;
140 else if (atomic_read(&dev->power.usage_count) > 0)
140 retval = -EAGAIN; 141 retval = -EAGAIN;
141 else if (!pm_children_suspended(dev)) 142 else if (!pm_children_suspended(dev))
142 retval = -EBUSY; 143 retval = -EBUSY;
@@ -158,7 +159,7 @@ static int rpm_check_suspend_allowed(struct device *dev)
158 * @dev: Device to notify the bus type about. 159 * @dev: Device to notify the bus type about.
159 * @rpmflags: Flag bits. 160 * @rpmflags: Flag bits.
160 * 161 *
161 * Check if the device's run-time PM status allows it to be suspended. If 162 * Check if the device's runtime PM status allows it to be suspended. If
162 * another idle notification has been started earlier, return immediately. If 163 * another idle notification has been started earlier, return immediately. If
163 * the RPM_ASYNC flag is set then queue an idle-notification request; otherwise 164 * the RPM_ASYNC flag is set then queue an idle-notification request; otherwise
164 * run the ->runtime_idle() callback directly. 165 * run the ->runtime_idle() callback directly.
@@ -213,8 +214,8 @@ static int rpm_idle(struct device *dev, int rpmflags)
213 214
214 dev->power.idle_notification = true; 215 dev->power.idle_notification = true;
215 216
216 if (dev->pwr_domain) 217 if (dev->pm_domain)
217 callback = dev->pwr_domain->ops.runtime_idle; 218 callback = dev->pm_domain->ops.runtime_idle;
218 else if (dev->type && dev->type->pm) 219 else if (dev->type && dev->type->pm)
219 callback = dev->type->pm->runtime_idle; 220 callback = dev->type->pm->runtime_idle;
220 else if (dev->class && dev->class->pm) 221 else if (dev->class && dev->class->pm)
@@ -262,15 +263,15 @@ static int rpm_callback(int (*cb)(struct device *), struct device *dev)
262 spin_lock_irq(&dev->power.lock); 263 spin_lock_irq(&dev->power.lock);
263 } 264 }
264 dev->power.runtime_error = retval; 265 dev->power.runtime_error = retval;
265 return retval; 266 return retval != -EACCES ? retval : -EIO;
266} 267}
267 268
268/** 269/**
269 * rpm_suspend - Carry out run-time suspend of given device. 270 * rpm_suspend - Carry out runtime suspend of given device.
270 * @dev: Device to suspend. 271 * @dev: Device to suspend.
271 * @rpmflags: Flag bits. 272 * @rpmflags: Flag bits.
272 * 273 *
273 * Check if the device's run-time PM status allows it to be suspended. If 274 * Check if the device's runtime PM status allows it to be suspended. If
274 * another suspend has been started earlier, either return immediately or wait 275 * another suspend has been started earlier, either return immediately or wait
275 * for it to finish, depending on the RPM_NOWAIT and RPM_ASYNC flags. Cancel a 276 * for it to finish, depending on the RPM_NOWAIT and RPM_ASYNC flags. Cancel a
276 * pending idle notification. If the RPM_ASYNC flag is set then queue a 277 * pending idle notification. If the RPM_ASYNC flag is set then queue a
@@ -374,8 +375,8 @@ static int rpm_suspend(struct device *dev, int rpmflags)
374 375
375 __update_runtime_status(dev, RPM_SUSPENDING); 376 __update_runtime_status(dev, RPM_SUSPENDING);
376 377
377 if (dev->pwr_domain) 378 if (dev->pm_domain)
378 callback = dev->pwr_domain->ops.runtime_suspend; 379 callback = dev->pm_domain->ops.runtime_suspend;
379 else if (dev->type && dev->type->pm) 380 else if (dev->type && dev->type->pm)
380 callback = dev->type->pm->runtime_suspend; 381 callback = dev->type->pm->runtime_suspend;
381 else if (dev->class && dev->class->pm) 382 else if (dev->class && dev->class->pm)
@@ -388,7 +389,7 @@ static int rpm_suspend(struct device *dev, int rpmflags)
388 retval = rpm_callback(callback, dev); 389 retval = rpm_callback(callback, dev);
389 if (retval) { 390 if (retval) {
390 __update_runtime_status(dev, RPM_ACTIVE); 391 __update_runtime_status(dev, RPM_ACTIVE);
391 dev->power.deferred_resume = 0; 392 dev->power.deferred_resume = false;
392 if (retval == -EAGAIN || retval == -EBUSY) 393 if (retval == -EAGAIN || retval == -EBUSY)
393 dev->power.runtime_error = 0; 394 dev->power.runtime_error = 0;
394 else 395 else
@@ -429,11 +430,11 @@ static int rpm_suspend(struct device *dev, int rpmflags)
429} 430}
430 431
431/** 432/**
432 * rpm_resume - Carry out run-time resume of given device. 433 * rpm_resume - Carry out runtime resume of given device.
433 * @dev: Device to resume. 434 * @dev: Device to resume.
434 * @rpmflags: Flag bits. 435 * @rpmflags: Flag bits.
435 * 436 *
436 * Check if the device's run-time PM status allows it to be resumed. Cancel 437 * Check if the device's runtime PM status allows it to be resumed. Cancel
437 * any scheduled or pending requests. If another resume has been started 438 * any scheduled or pending requests. If another resume has been started
438 * earlier, either return immediately or wait for it to finish, depending on the 439 * earlier, either return immediately or wait for it to finish, depending on the
439 * RPM_NOWAIT and RPM_ASYNC flags. Similarly, if there's a suspend running in 440 * RPM_NOWAIT and RPM_ASYNC flags. Similarly, if there's a suspend running in
@@ -458,7 +459,7 @@ static int rpm_resume(struct device *dev, int rpmflags)
458 if (dev->power.runtime_error) 459 if (dev->power.runtime_error)
459 retval = -EINVAL; 460 retval = -EINVAL;
460 else if (dev->power.disable_depth > 0) 461 else if (dev->power.disable_depth > 0)
461 retval = -EAGAIN; 462 retval = -EACCES;
462 if (retval) 463 if (retval)
463 goto out; 464 goto out;
464 465
@@ -550,7 +551,7 @@ static int rpm_resume(struct device *dev, int rpmflags)
550 551
551 spin_lock(&parent->power.lock); 552 spin_lock(&parent->power.lock);
552 /* 553 /*
553 * We can resume if the parent's run-time PM is disabled or it 554 * We can resume if the parent's runtime PM is disabled or it
554 * is set to ignore children. 555 * is set to ignore children.
555 */ 556 */
556 if (!parent->power.disable_depth 557 if (!parent->power.disable_depth
@@ -573,8 +574,8 @@ static int rpm_resume(struct device *dev, int rpmflags)
573 574
574 __update_runtime_status(dev, RPM_RESUMING); 575 __update_runtime_status(dev, RPM_RESUMING);
575 576
576 if (dev->pwr_domain) 577 if (dev->pm_domain)
577 callback = dev->pwr_domain->ops.runtime_resume; 578 callback = dev->pm_domain->ops.runtime_resume;
578 else if (dev->type && dev->type->pm) 579 else if (dev->type && dev->type->pm)
579 callback = dev->type->pm->runtime_resume; 580 callback = dev->type->pm->runtime_resume;
580 else if (dev->class && dev->class->pm) 581 else if (dev->class && dev->class->pm)
@@ -614,11 +615,11 @@ static int rpm_resume(struct device *dev, int rpmflags)
614} 615}
615 616
616/** 617/**
617 * pm_runtime_work - Universal run-time PM work function. 618 * pm_runtime_work - Universal runtime PM work function.
618 * @work: Work structure used for scheduling the execution of this function. 619 * @work: Work structure used for scheduling the execution of this function.
619 * 620 *
620 * Use @work to get the device object the work is to be done for, determine what 621 * Use @work to get the device object the work is to be done for, determine what
621 * is to be done and execute the appropriate run-time PM function. 622 * is to be done and execute the appropriate runtime PM function.
622 */ 623 */
623static void pm_runtime_work(struct work_struct *work) 624static void pm_runtime_work(struct work_struct *work)
624{ 625{
@@ -717,7 +718,7 @@ int pm_schedule_suspend(struct device *dev, unsigned int delay)
717EXPORT_SYMBOL_GPL(pm_schedule_suspend); 718EXPORT_SYMBOL_GPL(pm_schedule_suspend);
718 719
719/** 720/**
720 * __pm_runtime_idle - Entry point for run-time idle operations. 721 * __pm_runtime_idle - Entry point for runtime idle operations.
721 * @dev: Device to send idle notification for. 722 * @dev: Device to send idle notification for.
722 * @rpmflags: Flag bits. 723 * @rpmflags: Flag bits.
723 * 724 *
@@ -746,7 +747,7 @@ int __pm_runtime_idle(struct device *dev, int rpmflags)
746EXPORT_SYMBOL_GPL(__pm_runtime_idle); 747EXPORT_SYMBOL_GPL(__pm_runtime_idle);
747 748
748/** 749/**
749 * __pm_runtime_suspend - Entry point for run-time put/suspend operations. 750 * __pm_runtime_suspend - Entry point for runtime put/suspend operations.
750 * @dev: Device to suspend. 751 * @dev: Device to suspend.
751 * @rpmflags: Flag bits. 752 * @rpmflags: Flag bits.
752 * 753 *
@@ -775,7 +776,7 @@ int __pm_runtime_suspend(struct device *dev, int rpmflags)
775EXPORT_SYMBOL_GPL(__pm_runtime_suspend); 776EXPORT_SYMBOL_GPL(__pm_runtime_suspend);
776 777
777/** 778/**
778 * __pm_runtime_resume - Entry point for run-time resume operations. 779 * __pm_runtime_resume - Entry point for runtime resume operations.
779 * @dev: Device to resume. 780 * @dev: Device to resume.
780 * @rpmflags: Flag bits. 781 * @rpmflags: Flag bits.
781 * 782 *
@@ -801,11 +802,11 @@ int __pm_runtime_resume(struct device *dev, int rpmflags)
801EXPORT_SYMBOL_GPL(__pm_runtime_resume); 802EXPORT_SYMBOL_GPL(__pm_runtime_resume);
802 803
803/** 804/**
804 * __pm_runtime_set_status - Set run-time PM status of a device. 805 * __pm_runtime_set_status - Set runtime PM status of a device.
805 * @dev: Device to handle. 806 * @dev: Device to handle.
806 * @status: New run-time PM status of the device. 807 * @status: New runtime PM status of the device.
807 * 808 *
808 * If run-time PM of the device is disabled or its power.runtime_error field is 809 * If runtime PM of the device is disabled or its power.runtime_error field is
809 * different from zero, the status may be changed either to RPM_ACTIVE, or to 810 * different from zero, the status may be changed either to RPM_ACTIVE, or to
810 * RPM_SUSPENDED, as long as that reflects the actual state of the device. 811 * RPM_SUSPENDED, as long as that reflects the actual state of the device.
811 * However, if the device has a parent and the parent is not active, and the 812 * However, if the device has a parent and the parent is not active, and the
@@ -851,7 +852,7 @@ int __pm_runtime_set_status(struct device *dev, unsigned int status)
851 852
852 /* 853 /*
853 * It is invalid to put an active child under a parent that is 854 * It is invalid to put an active child under a parent that is
854 * not active, has run-time PM enabled and the 855 * not active, has runtime PM enabled and the
855 * 'power.ignore_children' flag unset. 856 * 'power.ignore_children' flag unset.
856 */ 857 */
857 if (!parent->power.disable_depth 858 if (!parent->power.disable_depth
@@ -885,7 +886,7 @@ EXPORT_SYMBOL_GPL(__pm_runtime_set_status);
885 * @dev: Device to handle. 886 * @dev: Device to handle.
886 * 887 *
887 * Flush all pending requests for the device from pm_wq and wait for all 888 * Flush all pending requests for the device from pm_wq and wait for all
888 * run-time PM operations involving the device in progress to complete. 889 * runtime PM operations involving the device in progress to complete.
889 * 890 *
890 * Should be called under dev->power.lock with interrupts disabled. 891 * Should be called under dev->power.lock with interrupts disabled.
891 */ 892 */
@@ -933,7 +934,7 @@ static void __pm_runtime_barrier(struct device *dev)
933 * Prevent the device from being suspended by incrementing its usage counter and 934 * Prevent the device from being suspended by incrementing its usage counter and
934 * if there's a pending resume request for the device, wake the device up. 935 * if there's a pending resume request for the device, wake the device up.
935 * Next, make sure that all pending requests for the device have been flushed 936 * Next, make sure that all pending requests for the device have been flushed
936 * from pm_wq and wait for all run-time PM operations involving the device in 937 * from pm_wq and wait for all runtime PM operations involving the device in
937 * progress to complete. 938 * progress to complete.
938 * 939 *
939 * Return value: 940 * Return value:
@@ -963,18 +964,18 @@ int pm_runtime_barrier(struct device *dev)
963EXPORT_SYMBOL_GPL(pm_runtime_barrier); 964EXPORT_SYMBOL_GPL(pm_runtime_barrier);
964 965
965/** 966/**
966 * __pm_runtime_disable - Disable run-time PM of a device. 967 * __pm_runtime_disable - Disable runtime PM of a device.
967 * @dev: Device to handle. 968 * @dev: Device to handle.
968 * @check_resume: If set, check if there's a resume request for the device. 969 * @check_resume: If set, check if there's a resume request for the device.
969 * 970 *
970 * Increment power.disable_depth for the device and if was zero previously, 971 * Increment power.disable_depth for the device and if was zero previously,
971 * cancel all pending run-time PM requests for the device and wait for all 972 * cancel all pending runtime PM requests for the device and wait for all
972 * operations in progress to complete. The device can be either active or 973 * operations in progress to complete. The device can be either active or
973 * suspended after its run-time PM has been disabled. 974 * suspended after its runtime PM has been disabled.
974 * 975 *
975 * If @check_resume is set and there's a resume request pending when 976 * If @check_resume is set and there's a resume request pending when
976 * __pm_runtime_disable() is called and power.disable_depth is zero, the 977 * __pm_runtime_disable() is called and power.disable_depth is zero, the
977 * function will wake up the device before disabling its run-time PM. 978 * function will wake up the device before disabling its runtime PM.
978 */ 979 */
979void __pm_runtime_disable(struct device *dev, bool check_resume) 980void __pm_runtime_disable(struct device *dev, bool check_resume)
980{ 981{
@@ -987,7 +988,7 @@ void __pm_runtime_disable(struct device *dev, bool check_resume)
987 988
988 /* 989 /*
989 * Wake up the device if there's a resume request pending, because that 990 * Wake up the device if there's a resume request pending, because that
990 * means there probably is some I/O to process and disabling run-time PM 991 * means there probably is some I/O to process and disabling runtime PM
991 * shouldn't prevent the device from processing the I/O. 992 * shouldn't prevent the device from processing the I/O.
992 */ 993 */
993 if (check_resume && dev->power.request_pending 994 if (check_resume && dev->power.request_pending
@@ -1012,7 +1013,7 @@ void __pm_runtime_disable(struct device *dev, bool check_resume)
1012EXPORT_SYMBOL_GPL(__pm_runtime_disable); 1013EXPORT_SYMBOL_GPL(__pm_runtime_disable);
1013 1014
1014/** 1015/**
1015 * pm_runtime_enable - Enable run-time PM of a device. 1016 * pm_runtime_enable - Enable runtime PM of a device.
1016 * @dev: Device to handle. 1017 * @dev: Device to handle.
1017 */ 1018 */
1018void pm_runtime_enable(struct device *dev) 1019void pm_runtime_enable(struct device *dev)
@@ -1031,7 +1032,7 @@ void pm_runtime_enable(struct device *dev)
1031EXPORT_SYMBOL_GPL(pm_runtime_enable); 1032EXPORT_SYMBOL_GPL(pm_runtime_enable);
1032 1033
1033/** 1034/**
1034 * pm_runtime_forbid - Block run-time PM of a device. 1035 * pm_runtime_forbid - Block runtime PM of a device.
1035 * @dev: Device to handle. 1036 * @dev: Device to handle.
1036 * 1037 *
1037 * Increase the device's usage count and clear its power.runtime_auto flag, 1038 * Increase the device's usage count and clear its power.runtime_auto flag,
@@ -1054,7 +1055,7 @@ void pm_runtime_forbid(struct device *dev)
1054EXPORT_SYMBOL_GPL(pm_runtime_forbid); 1055EXPORT_SYMBOL_GPL(pm_runtime_forbid);
1055 1056
1056/** 1057/**
1057 * pm_runtime_allow - Unblock run-time PM of a device. 1058 * pm_runtime_allow - Unblock runtime PM of a device.
1058 * @dev: Device to handle. 1059 * @dev: Device to handle.
1059 * 1060 *
1060 * Decrease the device's usage count and set its power.runtime_auto flag. 1061 * Decrease the device's usage count and set its power.runtime_auto flag.
@@ -1075,12 +1076,12 @@ void pm_runtime_allow(struct device *dev)
1075EXPORT_SYMBOL_GPL(pm_runtime_allow); 1076EXPORT_SYMBOL_GPL(pm_runtime_allow);
1076 1077
1077/** 1078/**
1078 * pm_runtime_no_callbacks - Ignore run-time PM callbacks for a device. 1079 * pm_runtime_no_callbacks - Ignore runtime PM callbacks for a device.
1079 * @dev: Device to handle. 1080 * @dev: Device to handle.
1080 * 1081 *
1081 * Set the power.no_callbacks flag, which tells the PM core that this 1082 * Set the power.no_callbacks flag, which tells the PM core that this
1082 * device is power-managed through its parent and has no run-time PM 1083 * device is power-managed through its parent and has no runtime PM
1083 * callbacks of its own. The run-time sysfs attributes will be removed. 1084 * callbacks of its own. The runtime sysfs attributes will be removed.
1084 */ 1085 */
1085void pm_runtime_no_callbacks(struct device *dev) 1086void pm_runtime_no_callbacks(struct device *dev)
1086{ 1087{
@@ -1156,8 +1157,8 @@ static void update_autosuspend(struct device *dev, int old_delay, int old_use)
1156 * @delay: Value of the new delay in milliseconds. 1157 * @delay: Value of the new delay in milliseconds.
1157 * 1158 *
1158 * Set the device's power.autosuspend_delay value. If it changes to negative 1159 * Set the device's power.autosuspend_delay value. If it changes to negative
1159 * and the power.use_autosuspend flag is set, prevent run-time suspends. If it 1160 * and the power.use_autosuspend flag is set, prevent runtime suspends. If it
1160 * changes the other way, allow run-time suspends. 1161 * changes the other way, allow runtime suspends.
1161 */ 1162 */
1162void pm_runtime_set_autosuspend_delay(struct device *dev, int delay) 1163void pm_runtime_set_autosuspend_delay(struct device *dev, int delay)
1163{ 1164{
@@ -1177,7 +1178,7 @@ EXPORT_SYMBOL_GPL(pm_runtime_set_autosuspend_delay);
1177 * @dev: Device to handle. 1178 * @dev: Device to handle.
1178 * @use: New value for use_autosuspend. 1179 * @use: New value for use_autosuspend.
1179 * 1180 *
1180 * Set the device's power.use_autosuspend flag, and allow or prevent run-time 1181 * Set the device's power.use_autosuspend flag, and allow or prevent runtime
1181 * suspends as needed. 1182 * suspends as needed.
1182 */ 1183 */
1183void __pm_runtime_use_autosuspend(struct device *dev, bool use) 1184void __pm_runtime_use_autosuspend(struct device *dev, bool use)
@@ -1194,7 +1195,7 @@ void __pm_runtime_use_autosuspend(struct device *dev, bool use)
1194EXPORT_SYMBOL_GPL(__pm_runtime_use_autosuspend); 1195EXPORT_SYMBOL_GPL(__pm_runtime_use_autosuspend);
1195 1196
1196/** 1197/**
1197 * pm_runtime_init - Initialize run-time PM fields in given device object. 1198 * pm_runtime_init - Initialize runtime PM fields in given device object.
1198 * @dev: Device object to initialize. 1199 * @dev: Device object to initialize.
1199 */ 1200 */
1200void pm_runtime_init(struct device *dev) 1201void pm_runtime_init(struct device *dev)