diff options
Diffstat (limited to 'drivers/base/power/runtime.c')
| -rw-r--r-- | drivers/base/power/runtime.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index f8b044e8aef7..626dd147b75f 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c | |||
| @@ -1011,6 +1011,50 @@ void pm_runtime_enable(struct device *dev) | |||
| 1011 | EXPORT_SYMBOL_GPL(pm_runtime_enable); | 1011 | EXPORT_SYMBOL_GPL(pm_runtime_enable); |
| 1012 | 1012 | ||
| 1013 | /** | 1013 | /** |
| 1014 | * pm_runtime_forbid - Block run-time PM of a device. | ||
| 1015 | * @dev: Device to handle. | ||
| 1016 | * | ||
| 1017 | * Increase the device's usage count and clear its power.runtime_auto flag, | ||
| 1018 | * so that it cannot be suspended at run time until pm_runtime_allow() is called | ||
| 1019 | * for it. | ||
| 1020 | */ | ||
| 1021 | void pm_runtime_forbid(struct device *dev) | ||
| 1022 | { | ||
| 1023 | spin_lock_irq(&dev->power.lock); | ||
| 1024 | if (!dev->power.runtime_auto) | ||
| 1025 | goto out; | ||
| 1026 | |||
| 1027 | dev->power.runtime_auto = false; | ||
| 1028 | atomic_inc(&dev->power.usage_count); | ||
| 1029 | __pm_runtime_resume(dev, false); | ||
| 1030 | |||
| 1031 | out: | ||
| 1032 | spin_unlock_irq(&dev->power.lock); | ||
| 1033 | } | ||
| 1034 | EXPORT_SYMBOL_GPL(pm_runtime_forbid); | ||
| 1035 | |||
| 1036 | /** | ||
| 1037 | * pm_runtime_allow - Unblock run-time PM of a device. | ||
| 1038 | * @dev: Device to handle. | ||
| 1039 | * | ||
| 1040 | * Decrease the device's usage count and set its power.runtime_auto flag. | ||
| 1041 | */ | ||
| 1042 | void pm_runtime_allow(struct device *dev) | ||
| 1043 | { | ||
| 1044 | spin_lock_irq(&dev->power.lock); | ||
| 1045 | if (dev->power.runtime_auto) | ||
| 1046 | goto out; | ||
| 1047 | |||
| 1048 | dev->power.runtime_auto = true; | ||
| 1049 | if (atomic_dec_and_test(&dev->power.usage_count)) | ||
| 1050 | __pm_runtime_idle(dev); | ||
| 1051 | |||
| 1052 | out: | ||
| 1053 | spin_unlock_irq(&dev->power.lock); | ||
| 1054 | } | ||
| 1055 | EXPORT_SYMBOL_GPL(pm_runtime_allow); | ||
| 1056 | |||
| 1057 | /** | ||
| 1014 | * pm_runtime_init - Initialize run-time PM fields in given device object. | 1058 | * pm_runtime_init - Initialize run-time PM fields in given device object. |
| 1015 | * @dev: Device object to initialize. | 1059 | * @dev: Device object to initialize. |
| 1016 | */ | 1060 | */ |
| @@ -1028,6 +1072,7 @@ void pm_runtime_init(struct device *dev) | |||
| 1028 | 1072 | ||
| 1029 | atomic_set(&dev->power.child_count, 0); | 1073 | atomic_set(&dev->power.child_count, 0); |
| 1030 | pm_suspend_ignore_children(dev, false); | 1074 | pm_suspend_ignore_children(dev, false); |
| 1075 | dev->power.runtime_auto = true; | ||
| 1031 | 1076 | ||
| 1032 | dev->power.request_pending = false; | 1077 | dev->power.request_pending = false; |
| 1033 | dev->power.request = RPM_REQ_NONE; | 1078 | dev->power.request = RPM_REQ_NONE; |
