| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 1 | /* | 
 | 2 |  * pm_runtime.h - Device run-time power management helper functions. | 
 | 3 |  * | 
 | 4 |  * Copyright (C) 2009 Rafael J. Wysocki <rjw@sisk.pl> | 
 | 5 |  * | 
 | 6 |  * This file is released under the GPLv2. | 
 | 7 |  */ | 
 | 8 |  | 
 | 9 | #ifndef _LINUX_PM_RUNTIME_H | 
 | 10 | #define _LINUX_PM_RUNTIME_H | 
 | 11 |  | 
 | 12 | #include <linux/device.h> | 
 | 13 | #include <linux/pm.h> | 
 | 14 |  | 
| Alan Stern | 15bcb91 | 2010-09-25 23:35:21 +0200 | [diff] [blame] | 15 | #include <linux/jiffies.h> | 
 | 16 |  | 
| Alan Stern | 3f9af05 | 2010-09-25 23:34:54 +0200 | [diff] [blame] | 17 | /* Runtime PM flag argument bits */ | 
 | 18 | #define RPM_ASYNC		0x01	/* Request is asynchronous */ | 
 | 19 | #define RPM_NOWAIT		0x02	/* Don't wait for concurrent | 
 | 20 | 					    state change */ | 
| Alan Stern | 140a6c9 | 2010-09-25 23:35:07 +0200 | [diff] [blame] | 21 | #define RPM_GET_PUT		0x04	/* Increment/decrement the | 
 | 22 | 					    usage_count */ | 
| Alan Stern | 15bcb91 | 2010-09-25 23:35:21 +0200 | [diff] [blame] | 23 | #define RPM_AUTO		0x08	/* Use autosuspend_delay */ | 
| Alan Stern | 3f9af05 | 2010-09-25 23:34:54 +0200 | [diff] [blame] | 24 |  | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 25 | #ifdef CONFIG_PM_RUNTIME | 
 | 26 |  | 
 | 27 | extern struct workqueue_struct *pm_wq; | 
 | 28 |  | 
| Alan Stern | 140a6c9 | 2010-09-25 23:35:07 +0200 | [diff] [blame] | 29 | extern int __pm_runtime_idle(struct device *dev, int rpmflags); | 
 | 30 | extern int __pm_runtime_suspend(struct device *dev, int rpmflags); | 
 | 31 | extern int __pm_runtime_resume(struct device *dev, int rpmflags); | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 32 | extern int pm_schedule_suspend(struct device *dev, unsigned int delay); | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 33 | extern int __pm_runtime_set_status(struct device *dev, unsigned int status); | 
 | 34 | extern int pm_runtime_barrier(struct device *dev); | 
 | 35 | extern void pm_runtime_enable(struct device *dev); | 
 | 36 | extern void __pm_runtime_disable(struct device *dev, bool check_resume); | 
| Rafael J. Wysocki | 5382363 | 2010-01-23 22:02:51 +0100 | [diff] [blame] | 37 | extern void pm_runtime_allow(struct device *dev); | 
 | 38 | extern void pm_runtime_forbid(struct device *dev); | 
| Rafael J. Wysocki | 2f60ba7 | 2010-05-10 23:09:30 +0200 | [diff] [blame] | 39 | extern int pm_generic_runtime_idle(struct device *dev); | 
 | 40 | extern int pm_generic_runtime_suspend(struct device *dev); | 
 | 41 | extern int pm_generic_runtime_resume(struct device *dev); | 
| Alan Stern | 7490e44 | 2010-09-25 23:35:15 +0200 | [diff] [blame] | 42 | extern void pm_runtime_no_callbacks(struct device *dev); | 
| Alan Stern | c7b61de | 2010-12-01 00:14:42 +0100 | [diff] [blame] | 43 | extern void pm_runtime_irq_safe(struct device *dev); | 
| Alan Stern | 15bcb91 | 2010-09-25 23:35:21 +0200 | [diff] [blame] | 44 | extern void __pm_runtime_use_autosuspend(struct device *dev, bool use); | 
 | 45 | extern void pm_runtime_set_autosuspend_delay(struct device *dev, int delay); | 
 | 46 | extern unsigned long pm_runtime_autosuspend_expiration(struct device *dev); | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 47 |  | 
 | 48 | static inline bool pm_children_suspended(struct device *dev) | 
 | 49 | { | 
 | 50 | 	return dev->power.ignore_children | 
 | 51 | 		|| !atomic_read(&dev->power.child_count); | 
 | 52 | } | 
 | 53 |  | 
 | 54 | static inline void pm_suspend_ignore_children(struct device *dev, bool enable) | 
 | 55 | { | 
 | 56 | 	dev->power.ignore_children = enable; | 
 | 57 | } | 
 | 58 |  | 
 | 59 | static inline void pm_runtime_get_noresume(struct device *dev) | 
 | 60 | { | 
 | 61 | 	atomic_inc(&dev->power.usage_count); | 
 | 62 | } | 
 | 63 |  | 
 | 64 | static inline void pm_runtime_put_noidle(struct device *dev) | 
 | 65 | { | 
 | 66 | 	atomic_add_unless(&dev->power.usage_count, -1, 0); | 
 | 67 | } | 
 | 68 |  | 
| Rafael J. Wysocki | 7a1a8eb | 2009-12-03 21:19:18 +0100 | [diff] [blame] | 69 | static inline bool device_run_wake(struct device *dev) | 
 | 70 | { | 
 | 71 | 	return dev->power.run_wake; | 
 | 72 | } | 
 | 73 |  | 
 | 74 | static inline void device_set_run_wake(struct device *dev, bool enable) | 
 | 75 | { | 
 | 76 | 	dev->power.run_wake = enable; | 
 | 77 | } | 
 | 78 |  | 
| Rafael J. Wysocki | d690b2c | 2010-03-06 21:28:37 +0100 | [diff] [blame] | 79 | static inline bool pm_runtime_suspended(struct device *dev) | 
 | 80 | { | 
| Rafael J. Wysocki | f08f5a0 | 2010-12-16 17:11:58 +0100 | [diff] [blame] | 81 | 	return dev->power.runtime_status == RPM_SUSPENDED | 
 | 82 | 		&& !dev->power.disable_depth; | 
| Rafael J. Wysocki | d690b2c | 2010-03-06 21:28:37 +0100 | [diff] [blame] | 83 | } | 
 | 84 |  | 
| Rafael J. Wysocki | 4b31db8 | 2010-12-24 15:04:06 +0100 | [diff] [blame] | 85 | static inline bool pm_runtime_enabled(struct device *dev) | 
 | 86 | { | 
 | 87 | 	return !dev->power.disable_depth; | 
 | 88 | } | 
 | 89 |  | 
| Alan Stern | 15bcb91 | 2010-09-25 23:35:21 +0200 | [diff] [blame] | 90 | static inline void pm_runtime_mark_last_busy(struct device *dev) | 
 | 91 | { | 
 | 92 | 	ACCESS_ONCE(dev->power.last_busy) = jiffies; | 
 | 93 | } | 
 | 94 |  | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 95 | #else /* !CONFIG_PM_RUNTIME */ | 
 | 96 |  | 
| Alan Stern | 140a6c9 | 2010-09-25 23:35:07 +0200 | [diff] [blame] | 97 | static inline int __pm_runtime_idle(struct device *dev, int rpmflags) | 
 | 98 | { | 
 | 99 | 	return -ENOSYS; | 
 | 100 | } | 
 | 101 | static inline int __pm_runtime_suspend(struct device *dev, int rpmflags) | 
 | 102 | { | 
 | 103 | 	return -ENOSYS; | 
 | 104 | } | 
 | 105 | static inline int __pm_runtime_resume(struct device *dev, int rpmflags) | 
 | 106 | { | 
 | 107 | 	return 1; | 
 | 108 | } | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 109 | static inline int pm_schedule_suspend(struct device *dev, unsigned int delay) | 
 | 110 | { | 
 | 111 | 	return -ENOSYS; | 
 | 112 | } | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 113 | static inline int __pm_runtime_set_status(struct device *dev, | 
 | 114 | 					    unsigned int status) { return 0; } | 
 | 115 | static inline int pm_runtime_barrier(struct device *dev) { return 0; } | 
 | 116 | static inline void pm_runtime_enable(struct device *dev) {} | 
 | 117 | static inline void __pm_runtime_disable(struct device *dev, bool c) {} | 
| Rafael J. Wysocki | 5382363 | 2010-01-23 22:02:51 +0100 | [diff] [blame] | 118 | static inline void pm_runtime_allow(struct device *dev) {} | 
 | 119 | static inline void pm_runtime_forbid(struct device *dev) {} | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 120 |  | 
 | 121 | static inline bool pm_children_suspended(struct device *dev) { return false; } | 
 | 122 | static inline void pm_suspend_ignore_children(struct device *dev, bool en) {} | 
 | 123 | static inline void pm_runtime_get_noresume(struct device *dev) {} | 
 | 124 | static inline void pm_runtime_put_noidle(struct device *dev) {} | 
| Rafael J. Wysocki | 7a1a8eb | 2009-12-03 21:19:18 +0100 | [diff] [blame] | 125 | static inline bool device_run_wake(struct device *dev) { return false; } | 
 | 126 | static inline void device_set_run_wake(struct device *dev, bool enable) {} | 
| Rafael J. Wysocki | d690b2c | 2010-03-06 21:28:37 +0100 | [diff] [blame] | 127 | static inline bool pm_runtime_suspended(struct device *dev) { return false; } | 
| Rafael J. Wysocki | 4b31db8 | 2010-12-24 15:04:06 +0100 | [diff] [blame] | 128 | static inline bool pm_runtime_enabled(struct device *dev) { return false; } | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 129 |  | 
| Rafael J. Wysocki | 2f60ba7 | 2010-05-10 23:09:30 +0200 | [diff] [blame] | 130 | static inline int pm_generic_runtime_idle(struct device *dev) { return 0; } | 
 | 131 | static inline int pm_generic_runtime_suspend(struct device *dev) { return 0; } | 
 | 132 | static inline int pm_generic_runtime_resume(struct device *dev) { return 0; } | 
| Alan Stern | 7490e44 | 2010-09-25 23:35:15 +0200 | [diff] [blame] | 133 | static inline void pm_runtime_no_callbacks(struct device *dev) {} | 
| Alan Stern | c7b61de | 2010-12-01 00:14:42 +0100 | [diff] [blame] | 134 | static inline void pm_runtime_irq_safe(struct device *dev) {} | 
| Rafael J. Wysocki | 2f60ba7 | 2010-05-10 23:09:30 +0200 | [diff] [blame] | 135 |  | 
| Alan Stern | 15bcb91 | 2010-09-25 23:35:21 +0200 | [diff] [blame] | 136 | static inline void pm_runtime_mark_last_busy(struct device *dev) {} | 
 | 137 | static inline void __pm_runtime_use_autosuspend(struct device *dev, | 
 | 138 | 						bool use) {} | 
 | 139 | static inline void pm_runtime_set_autosuspend_delay(struct device *dev, | 
 | 140 | 						int delay) {} | 
 | 141 | static inline unsigned long pm_runtime_autosuspend_expiration( | 
 | 142 | 				struct device *dev) { return 0; } | 
 | 143 |  | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 144 | #endif /* !CONFIG_PM_RUNTIME */ | 
 | 145 |  | 
| Alan Stern | 140a6c9 | 2010-09-25 23:35:07 +0200 | [diff] [blame] | 146 | static inline int pm_runtime_idle(struct device *dev) | 
 | 147 | { | 
 | 148 | 	return __pm_runtime_idle(dev, 0); | 
 | 149 | } | 
 | 150 |  | 
 | 151 | static inline int pm_runtime_suspend(struct device *dev) | 
 | 152 | { | 
 | 153 | 	return __pm_runtime_suspend(dev, 0); | 
 | 154 | } | 
 | 155 |  | 
| Alan Stern | 15bcb91 | 2010-09-25 23:35:21 +0200 | [diff] [blame] | 156 | static inline int pm_runtime_autosuspend(struct device *dev) | 
 | 157 | { | 
 | 158 | 	return __pm_runtime_suspend(dev, RPM_AUTO); | 
 | 159 | } | 
 | 160 |  | 
| Alan Stern | 140a6c9 | 2010-09-25 23:35:07 +0200 | [diff] [blame] | 161 | static inline int pm_runtime_resume(struct device *dev) | 
 | 162 | { | 
 | 163 | 	return __pm_runtime_resume(dev, 0); | 
 | 164 | } | 
 | 165 |  | 
 | 166 | static inline int pm_request_idle(struct device *dev) | 
 | 167 | { | 
 | 168 | 	return __pm_runtime_idle(dev, RPM_ASYNC); | 
 | 169 | } | 
 | 170 |  | 
 | 171 | static inline int pm_request_resume(struct device *dev) | 
 | 172 | { | 
 | 173 | 	return __pm_runtime_resume(dev, RPM_ASYNC); | 
 | 174 | } | 
 | 175 |  | 
| Ming Lei | 5fc62aa | 2010-09-29 00:12:22 +0200 | [diff] [blame] | 176 | static inline int pm_request_autosuspend(struct device *dev) | 
 | 177 | { | 
 | 178 | 	return __pm_runtime_suspend(dev, RPM_ASYNC | RPM_AUTO); | 
 | 179 | } | 
 | 180 |  | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 181 | static inline int pm_runtime_get(struct device *dev) | 
 | 182 | { | 
| Alan Stern | 140a6c9 | 2010-09-25 23:35:07 +0200 | [diff] [blame] | 183 | 	return __pm_runtime_resume(dev, RPM_GET_PUT | RPM_ASYNC); | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 184 | } | 
 | 185 |  | 
 | 186 | static inline int pm_runtime_get_sync(struct device *dev) | 
 | 187 | { | 
| Alan Stern | 140a6c9 | 2010-09-25 23:35:07 +0200 | [diff] [blame] | 188 | 	return __pm_runtime_resume(dev, RPM_GET_PUT); | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 189 | } | 
 | 190 |  | 
 | 191 | static inline int pm_runtime_put(struct device *dev) | 
 | 192 | { | 
| Alan Stern | 140a6c9 | 2010-09-25 23:35:07 +0200 | [diff] [blame] | 193 | 	return __pm_runtime_idle(dev, RPM_GET_PUT | RPM_ASYNC); | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 194 | } | 
 | 195 |  | 
| Alan Stern | 15bcb91 | 2010-09-25 23:35:21 +0200 | [diff] [blame] | 196 | static inline int pm_runtime_put_autosuspend(struct device *dev) | 
 | 197 | { | 
 | 198 | 	return __pm_runtime_suspend(dev, | 
 | 199 | 	    RPM_GET_PUT | RPM_ASYNC | RPM_AUTO); | 
 | 200 | } | 
 | 201 |  | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 202 | static inline int pm_runtime_put_sync(struct device *dev) | 
 | 203 | { | 
| Alan Stern | 140a6c9 | 2010-09-25 23:35:07 +0200 | [diff] [blame] | 204 | 	return __pm_runtime_idle(dev, RPM_GET_PUT); | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 205 | } | 
 | 206 |  | 
| Alan Stern | c7b61de | 2010-12-01 00:14:42 +0100 | [diff] [blame] | 207 | static inline int pm_runtime_put_sync_suspend(struct device *dev) | 
 | 208 | { | 
 | 209 | 	return __pm_runtime_suspend(dev, RPM_GET_PUT); | 
 | 210 | } | 
 | 211 |  | 
| Alan Stern | 15bcb91 | 2010-09-25 23:35:21 +0200 | [diff] [blame] | 212 | static inline int pm_runtime_put_sync_autosuspend(struct device *dev) | 
 | 213 | { | 
 | 214 | 	return __pm_runtime_suspend(dev, RPM_GET_PUT | RPM_AUTO); | 
 | 215 | } | 
 | 216 |  | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 217 | static inline int pm_runtime_set_active(struct device *dev) | 
 | 218 | { | 
 | 219 | 	return __pm_runtime_set_status(dev, RPM_ACTIVE); | 
 | 220 | } | 
 | 221 |  | 
 | 222 | static inline void pm_runtime_set_suspended(struct device *dev) | 
 | 223 | { | 
 | 224 | 	__pm_runtime_set_status(dev, RPM_SUSPENDED); | 
 | 225 | } | 
 | 226 |  | 
 | 227 | static inline void pm_runtime_disable(struct device *dev) | 
 | 228 | { | 
 | 229 | 	__pm_runtime_disable(dev, true); | 
 | 230 | } | 
 | 231 |  | 
| Alan Stern | 15bcb91 | 2010-09-25 23:35:21 +0200 | [diff] [blame] | 232 | static inline void pm_runtime_use_autosuspend(struct device *dev) | 
 | 233 | { | 
 | 234 | 	__pm_runtime_use_autosuspend(dev, true); | 
 | 235 | } | 
 | 236 |  | 
 | 237 | static inline void pm_runtime_dont_use_autosuspend(struct device *dev) | 
 | 238 | { | 
 | 239 | 	__pm_runtime_use_autosuspend(dev, false); | 
 | 240 | } | 
 | 241 |  | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 242 | #endif |