| 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 | 15bcb91 | 2010-09-25 23:35:21 +0200 | [diff] [blame] | 43 | extern void __pm_runtime_use_autosuspend(struct device *dev, bool use); | 
 | 44 | extern void pm_runtime_set_autosuspend_delay(struct device *dev, int delay); | 
 | 45 | extern unsigned long pm_runtime_autosuspend_expiration(struct device *dev); | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 46 |  | 
 | 47 | static inline bool pm_children_suspended(struct device *dev) | 
 | 48 | { | 
 | 49 | 	return dev->power.ignore_children | 
 | 50 | 		|| !atomic_read(&dev->power.child_count); | 
 | 51 | } | 
 | 52 |  | 
 | 53 | static inline void pm_suspend_ignore_children(struct device *dev, bool enable) | 
 | 54 | { | 
 | 55 | 	dev->power.ignore_children = enable; | 
 | 56 | } | 
 | 57 |  | 
 | 58 | static inline void pm_runtime_get_noresume(struct device *dev) | 
 | 59 | { | 
 | 60 | 	atomic_inc(&dev->power.usage_count); | 
 | 61 | } | 
 | 62 |  | 
 | 63 | static inline void pm_runtime_put_noidle(struct device *dev) | 
 | 64 | { | 
 | 65 | 	atomic_add_unless(&dev->power.usage_count, -1, 0); | 
 | 66 | } | 
 | 67 |  | 
| Rafael J. Wysocki | 7a1a8eb | 2009-12-03 21:19:18 +0100 | [diff] [blame] | 68 | static inline bool device_run_wake(struct device *dev) | 
 | 69 | { | 
 | 70 | 	return dev->power.run_wake; | 
 | 71 | } | 
 | 72 |  | 
 | 73 | static inline void device_set_run_wake(struct device *dev, bool enable) | 
 | 74 | { | 
 | 75 | 	dev->power.run_wake = enable; | 
 | 76 | } | 
 | 77 |  | 
| Rafael J. Wysocki | d690b2c | 2010-03-06 21:28:37 +0100 | [diff] [blame] | 78 | static inline bool pm_runtime_suspended(struct device *dev) | 
 | 79 | { | 
 | 80 | 	return dev->power.runtime_status == RPM_SUSPENDED; | 
 | 81 | } | 
 | 82 |  | 
| Alan Stern | 15bcb91 | 2010-09-25 23:35:21 +0200 | [diff] [blame] | 83 | static inline void pm_runtime_mark_last_busy(struct device *dev) | 
 | 84 | { | 
 | 85 | 	ACCESS_ONCE(dev->power.last_busy) = jiffies; | 
 | 86 | } | 
 | 87 |  | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 88 | #else /* !CONFIG_PM_RUNTIME */ | 
 | 89 |  | 
| Alan Stern | 140a6c9 | 2010-09-25 23:35:07 +0200 | [diff] [blame] | 90 | static inline int __pm_runtime_idle(struct device *dev, int rpmflags) | 
 | 91 | { | 
 | 92 | 	return -ENOSYS; | 
 | 93 | } | 
 | 94 | static inline int __pm_runtime_suspend(struct device *dev, int rpmflags) | 
 | 95 | { | 
 | 96 | 	return -ENOSYS; | 
 | 97 | } | 
 | 98 | static inline int __pm_runtime_resume(struct device *dev, int rpmflags) | 
 | 99 | { | 
 | 100 | 	return 1; | 
 | 101 | } | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 102 | static inline int pm_schedule_suspend(struct device *dev, unsigned int delay) | 
 | 103 | { | 
 | 104 | 	return -ENOSYS; | 
 | 105 | } | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 106 | static inline int __pm_runtime_set_status(struct device *dev, | 
 | 107 | 					    unsigned int status) { return 0; } | 
 | 108 | static inline int pm_runtime_barrier(struct device *dev) { return 0; } | 
 | 109 | static inline void pm_runtime_enable(struct device *dev) {} | 
 | 110 | static inline void __pm_runtime_disable(struct device *dev, bool c) {} | 
| Rafael J. Wysocki | 5382363 | 2010-01-23 22:02:51 +0100 | [diff] [blame] | 111 | static inline void pm_runtime_allow(struct device *dev) {} | 
 | 112 | static inline void pm_runtime_forbid(struct device *dev) {} | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 113 |  | 
 | 114 | static inline bool pm_children_suspended(struct device *dev) { return false; } | 
 | 115 | static inline void pm_suspend_ignore_children(struct device *dev, bool en) {} | 
 | 116 | static inline void pm_runtime_get_noresume(struct device *dev) {} | 
 | 117 | static inline void pm_runtime_put_noidle(struct device *dev) {} | 
| Rafael J. Wysocki | 7a1a8eb | 2009-12-03 21:19:18 +0100 | [diff] [blame] | 118 | static inline bool device_run_wake(struct device *dev) { return false; } | 
 | 119 | 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] | 120 | static inline bool pm_runtime_suspended(struct device *dev) { return false; } | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 121 |  | 
| Rafael J. Wysocki | 2f60ba7 | 2010-05-10 23:09:30 +0200 | [diff] [blame] | 122 | static inline int pm_generic_runtime_idle(struct device *dev) { return 0; } | 
 | 123 | static inline int pm_generic_runtime_suspend(struct device *dev) { return 0; } | 
 | 124 | static inline int pm_generic_runtime_resume(struct device *dev) { return 0; } | 
| Alan Stern | 7490e44 | 2010-09-25 23:35:15 +0200 | [diff] [blame] | 125 | static inline void pm_runtime_no_callbacks(struct device *dev) {} | 
| Rafael J. Wysocki | 2f60ba7 | 2010-05-10 23:09:30 +0200 | [diff] [blame] | 126 |  | 
| Alan Stern | 15bcb91 | 2010-09-25 23:35:21 +0200 | [diff] [blame] | 127 | static inline void pm_runtime_mark_last_busy(struct device *dev) {} | 
 | 128 | static inline void __pm_runtime_use_autosuspend(struct device *dev, | 
 | 129 | 						bool use) {} | 
 | 130 | static inline void pm_runtime_set_autosuspend_delay(struct device *dev, | 
 | 131 | 						int delay) {} | 
 | 132 | static inline unsigned long pm_runtime_autosuspend_expiration( | 
 | 133 | 				struct device *dev) { return 0; } | 
 | 134 |  | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 135 | #endif /* !CONFIG_PM_RUNTIME */ | 
 | 136 |  | 
| Alan Stern | 140a6c9 | 2010-09-25 23:35:07 +0200 | [diff] [blame] | 137 | static inline int pm_runtime_idle(struct device *dev) | 
 | 138 | { | 
 | 139 | 	return __pm_runtime_idle(dev, 0); | 
 | 140 | } | 
 | 141 |  | 
 | 142 | static inline int pm_runtime_suspend(struct device *dev) | 
 | 143 | { | 
 | 144 | 	return __pm_runtime_suspend(dev, 0); | 
 | 145 | } | 
 | 146 |  | 
| Alan Stern | 15bcb91 | 2010-09-25 23:35:21 +0200 | [diff] [blame] | 147 | static inline int pm_runtime_autosuspend(struct device *dev) | 
 | 148 | { | 
 | 149 | 	return __pm_runtime_suspend(dev, RPM_AUTO); | 
 | 150 | } | 
 | 151 |  | 
| Alan Stern | 140a6c9 | 2010-09-25 23:35:07 +0200 | [diff] [blame] | 152 | static inline int pm_runtime_resume(struct device *dev) | 
 | 153 | { | 
 | 154 | 	return __pm_runtime_resume(dev, 0); | 
 | 155 | } | 
 | 156 |  | 
 | 157 | static inline int pm_request_idle(struct device *dev) | 
 | 158 | { | 
 | 159 | 	return __pm_runtime_idle(dev, RPM_ASYNC); | 
 | 160 | } | 
 | 161 |  | 
 | 162 | static inline int pm_request_resume(struct device *dev) | 
 | 163 | { | 
 | 164 | 	return __pm_runtime_resume(dev, RPM_ASYNC); | 
 | 165 | } | 
 | 166 |  | 
| Ming Lei | 5fc62aa | 2010-09-29 00:12:22 +0200 | [diff] [blame] | 167 | static inline int pm_request_autosuspend(struct device *dev) | 
 | 168 | { | 
 | 169 | 	return __pm_runtime_suspend(dev, RPM_ASYNC | RPM_AUTO); | 
 | 170 | } | 
 | 171 |  | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 172 | static inline int pm_runtime_get(struct device *dev) | 
 | 173 | { | 
| Alan Stern | 140a6c9 | 2010-09-25 23:35:07 +0200 | [diff] [blame] | 174 | 	return __pm_runtime_resume(dev, RPM_GET_PUT | RPM_ASYNC); | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 175 | } | 
 | 176 |  | 
 | 177 | static inline int pm_runtime_get_sync(struct device *dev) | 
 | 178 | { | 
| Alan Stern | 140a6c9 | 2010-09-25 23:35:07 +0200 | [diff] [blame] | 179 | 	return __pm_runtime_resume(dev, RPM_GET_PUT); | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 180 | } | 
 | 181 |  | 
 | 182 | static inline int pm_runtime_put(struct device *dev) | 
 | 183 | { | 
| Alan Stern | 140a6c9 | 2010-09-25 23:35:07 +0200 | [diff] [blame] | 184 | 	return __pm_runtime_idle(dev, RPM_GET_PUT | RPM_ASYNC); | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 185 | } | 
 | 186 |  | 
| Alan Stern | 15bcb91 | 2010-09-25 23:35:21 +0200 | [diff] [blame] | 187 | static inline int pm_runtime_put_autosuspend(struct device *dev) | 
 | 188 | { | 
 | 189 | 	return __pm_runtime_suspend(dev, | 
 | 190 | 	    RPM_GET_PUT | RPM_ASYNC | RPM_AUTO); | 
 | 191 | } | 
 | 192 |  | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 193 | static inline int pm_runtime_put_sync(struct device *dev) | 
 | 194 | { | 
| Alan Stern | 140a6c9 | 2010-09-25 23:35:07 +0200 | [diff] [blame] | 195 | 	return __pm_runtime_idle(dev, RPM_GET_PUT); | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 196 | } | 
 | 197 |  | 
| Alan Stern | 15bcb91 | 2010-09-25 23:35:21 +0200 | [diff] [blame] | 198 | static inline int pm_runtime_put_sync_autosuspend(struct device *dev) | 
 | 199 | { | 
 | 200 | 	return __pm_runtime_suspend(dev, RPM_GET_PUT | RPM_AUTO); | 
 | 201 | } | 
 | 202 |  | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 203 | static inline int pm_runtime_set_active(struct device *dev) | 
 | 204 | { | 
 | 205 | 	return __pm_runtime_set_status(dev, RPM_ACTIVE); | 
 | 206 | } | 
 | 207 |  | 
 | 208 | static inline void pm_runtime_set_suspended(struct device *dev) | 
 | 209 | { | 
 | 210 | 	__pm_runtime_set_status(dev, RPM_SUSPENDED); | 
 | 211 | } | 
 | 212 |  | 
 | 213 | static inline void pm_runtime_disable(struct device *dev) | 
 | 214 | { | 
 | 215 | 	__pm_runtime_disable(dev, true); | 
 | 216 | } | 
 | 217 |  | 
| Alan Stern | 15bcb91 | 2010-09-25 23:35:21 +0200 | [diff] [blame] | 218 | static inline void pm_runtime_use_autosuspend(struct device *dev) | 
 | 219 | { | 
 | 220 | 	__pm_runtime_use_autosuspend(dev, true); | 
 | 221 | } | 
 | 222 |  | 
 | 223 | static inline void pm_runtime_dont_use_autosuspend(struct device *dev) | 
 | 224 | { | 
 | 225 | 	__pm_runtime_use_autosuspend(dev, false); | 
 | 226 | } | 
 | 227 |  | 
| Rafael J. Wysocki | 5e928f7 | 2009-08-18 23:38:32 +0200 | [diff] [blame] | 228 | #endif |