diff options
Diffstat (limited to 'include/linux/pm_runtime.h')
-rw-r--r-- | include/linux/pm_runtime.h | 185 |
1 files changed, 166 insertions, 19 deletions
diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h index 6e81888c6222..878cf84baeb1 100644 --- a/include/linux/pm_runtime.h +++ b/include/linux/pm_runtime.h | |||
@@ -12,18 +12,24 @@ | |||
12 | #include <linux/device.h> | 12 | #include <linux/device.h> |
13 | #include <linux/pm.h> | 13 | #include <linux/pm.h> |
14 | 14 | ||
15 | #include <linux/jiffies.h> | ||
16 | |||
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 */ | ||
21 | #define RPM_GET_PUT 0x04 /* Increment/decrement the | ||
22 | usage_count */ | ||
23 | #define RPM_AUTO 0x08 /* Use autosuspend_delay */ | ||
24 | |||
15 | #ifdef CONFIG_PM_RUNTIME | 25 | #ifdef CONFIG_PM_RUNTIME |
16 | 26 | ||
17 | extern struct workqueue_struct *pm_wq; | 27 | extern struct workqueue_struct *pm_wq; |
18 | 28 | ||
19 | extern int pm_runtime_idle(struct device *dev); | 29 | extern int __pm_runtime_idle(struct device *dev, int rpmflags); |
20 | extern int pm_runtime_suspend(struct device *dev); | 30 | extern int __pm_runtime_suspend(struct device *dev, int rpmflags); |
21 | extern int pm_runtime_resume(struct device *dev); | 31 | extern int __pm_runtime_resume(struct device *dev, int rpmflags); |
22 | extern int pm_request_idle(struct device *dev); | ||
23 | extern int pm_schedule_suspend(struct device *dev, unsigned int delay); | 32 | extern int pm_schedule_suspend(struct device *dev, unsigned int delay); |
24 | extern int pm_request_resume(struct device *dev); | ||
25 | extern int __pm_runtime_get(struct device *dev, bool sync); | ||
26 | extern int __pm_runtime_put(struct device *dev, bool sync); | ||
27 | extern int __pm_runtime_set_status(struct device *dev, unsigned int status); | 33 | extern int __pm_runtime_set_status(struct device *dev, unsigned int status); |
28 | extern int pm_runtime_barrier(struct device *dev); | 34 | extern int pm_runtime_barrier(struct device *dev); |
29 | extern void pm_runtime_enable(struct device *dev); | 35 | extern void pm_runtime_enable(struct device *dev); |
@@ -33,6 +39,11 @@ extern void pm_runtime_forbid(struct device *dev); | |||
33 | extern int pm_generic_runtime_idle(struct device *dev); | 39 | extern int pm_generic_runtime_idle(struct device *dev); |
34 | extern int pm_generic_runtime_suspend(struct device *dev); | 40 | extern int pm_generic_runtime_suspend(struct device *dev); |
35 | extern int pm_generic_runtime_resume(struct device *dev); | 41 | extern int pm_generic_runtime_resume(struct device *dev); |
42 | extern void pm_runtime_no_callbacks(struct device *dev); | ||
43 | extern void pm_runtime_irq_safe(struct device *dev); | ||
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); | ||
36 | 47 | ||
37 | static inline bool pm_children_suspended(struct device *dev) | 48 | static inline bool pm_children_suspended(struct device *dev) |
38 | { | 49 | { |
@@ -67,22 +78,43 @@ static inline void device_set_run_wake(struct device *dev, bool enable) | |||
67 | 78 | ||
68 | static inline bool pm_runtime_suspended(struct device *dev) | 79 | static inline bool pm_runtime_suspended(struct device *dev) |
69 | { | 80 | { |
70 | return dev->power.runtime_status == RPM_SUSPENDED; | 81 | return dev->power.runtime_status == RPM_SUSPENDED |
82 | && !dev->power.disable_depth; | ||
83 | } | ||
84 | |||
85 | static inline bool pm_runtime_enabled(struct device *dev) | ||
86 | { | ||
87 | return !dev->power.disable_depth; | ||
88 | } | ||
89 | |||
90 | static inline bool pm_runtime_callbacks_present(struct device *dev) | ||
91 | { | ||
92 | return !dev->power.no_callbacks; | ||
93 | } | ||
94 | |||
95 | static inline void pm_runtime_mark_last_busy(struct device *dev) | ||
96 | { | ||
97 | ACCESS_ONCE(dev->power.last_busy) = jiffies; | ||
71 | } | 98 | } |
72 | 99 | ||
73 | #else /* !CONFIG_PM_RUNTIME */ | 100 | #else /* !CONFIG_PM_RUNTIME */ |
74 | 101 | ||
75 | static inline int pm_runtime_idle(struct device *dev) { return -ENOSYS; } | 102 | static inline int __pm_runtime_idle(struct device *dev, int rpmflags) |
76 | static inline int pm_runtime_suspend(struct device *dev) { return -ENOSYS; } | 103 | { |
77 | static inline int pm_runtime_resume(struct device *dev) { return 0; } | 104 | return -ENOSYS; |
78 | static inline int pm_request_idle(struct device *dev) { return -ENOSYS; } | 105 | } |
106 | static inline int __pm_runtime_suspend(struct device *dev, int rpmflags) | ||
107 | { | ||
108 | return -ENOSYS; | ||
109 | } | ||
110 | static inline int __pm_runtime_resume(struct device *dev, int rpmflags) | ||
111 | { | ||
112 | return 1; | ||
113 | } | ||
79 | static inline int pm_schedule_suspend(struct device *dev, unsigned int delay) | 114 | static inline int pm_schedule_suspend(struct device *dev, unsigned int delay) |
80 | { | 115 | { |
81 | return -ENOSYS; | 116 | return -ENOSYS; |
82 | } | 117 | } |
83 | static inline int pm_request_resume(struct device *dev) { return 0; } | ||
84 | static inline int __pm_runtime_get(struct device *dev, bool sync) { return 1; } | ||
85 | static inline int __pm_runtime_put(struct device *dev, bool sync) { return 0; } | ||
86 | static inline int __pm_runtime_set_status(struct device *dev, | 118 | static inline int __pm_runtime_set_status(struct device *dev, |
87 | unsigned int status) { return 0; } | 119 | unsigned int status) { return 0; } |
88 | static inline int pm_runtime_barrier(struct device *dev) { return 0; } | 120 | static inline int pm_runtime_barrier(struct device *dev) { return 0; } |
@@ -98,31 +130,94 @@ static inline void pm_runtime_put_noidle(struct device *dev) {} | |||
98 | static inline bool device_run_wake(struct device *dev) { return false; } | 130 | static inline bool device_run_wake(struct device *dev) { return false; } |
99 | static inline void device_set_run_wake(struct device *dev, bool enable) {} | 131 | static inline void device_set_run_wake(struct device *dev, bool enable) {} |
100 | static inline bool pm_runtime_suspended(struct device *dev) { return false; } | 132 | static inline bool pm_runtime_suspended(struct device *dev) { return false; } |
133 | static inline bool pm_runtime_enabled(struct device *dev) { return false; } | ||
101 | 134 | ||
102 | static inline int pm_generic_runtime_idle(struct device *dev) { return 0; } | 135 | static inline int pm_generic_runtime_idle(struct device *dev) { return 0; } |
103 | static inline int pm_generic_runtime_suspend(struct device *dev) { return 0; } | 136 | static inline int pm_generic_runtime_suspend(struct device *dev) { return 0; } |
104 | static inline int pm_generic_runtime_resume(struct device *dev) { return 0; } | 137 | static inline int pm_generic_runtime_resume(struct device *dev) { return 0; } |
138 | static inline void pm_runtime_no_callbacks(struct device *dev) {} | ||
139 | static inline void pm_runtime_irq_safe(struct device *dev) {} | ||
140 | |||
141 | static inline bool pm_runtime_callbacks_present(struct device *dev) { return false; } | ||
142 | static inline void pm_runtime_mark_last_busy(struct device *dev) {} | ||
143 | static inline void __pm_runtime_use_autosuspend(struct device *dev, | ||
144 | bool use) {} | ||
145 | static inline void pm_runtime_set_autosuspend_delay(struct device *dev, | ||
146 | int delay) {} | ||
147 | static inline unsigned long pm_runtime_autosuspend_expiration( | ||
148 | struct device *dev) { return 0; } | ||
105 | 149 | ||
106 | #endif /* !CONFIG_PM_RUNTIME */ | 150 | #endif /* !CONFIG_PM_RUNTIME */ |
107 | 151 | ||
152 | static inline int pm_runtime_idle(struct device *dev) | ||
153 | { | ||
154 | return __pm_runtime_idle(dev, 0); | ||
155 | } | ||
156 | |||
157 | static inline int pm_runtime_suspend(struct device *dev) | ||
158 | { | ||
159 | return __pm_runtime_suspend(dev, 0); | ||
160 | } | ||
161 | |||
162 | static inline int pm_runtime_autosuspend(struct device *dev) | ||
163 | { | ||
164 | return __pm_runtime_suspend(dev, RPM_AUTO); | ||
165 | } | ||
166 | |||
167 | static inline int pm_runtime_resume(struct device *dev) | ||
168 | { | ||
169 | return __pm_runtime_resume(dev, 0); | ||
170 | } | ||
171 | |||
172 | static inline int pm_request_idle(struct device *dev) | ||
173 | { | ||
174 | return __pm_runtime_idle(dev, RPM_ASYNC); | ||
175 | } | ||
176 | |||
177 | static inline int pm_request_resume(struct device *dev) | ||
178 | { | ||
179 | return __pm_runtime_resume(dev, RPM_ASYNC); | ||
180 | } | ||
181 | |||
182 | static inline int pm_request_autosuspend(struct device *dev) | ||
183 | { | ||
184 | return __pm_runtime_suspend(dev, RPM_ASYNC | RPM_AUTO); | ||
185 | } | ||
186 | |||
108 | static inline int pm_runtime_get(struct device *dev) | 187 | static inline int pm_runtime_get(struct device *dev) |
109 | { | 188 | { |
110 | return __pm_runtime_get(dev, false); | 189 | return __pm_runtime_resume(dev, RPM_GET_PUT | RPM_ASYNC); |
111 | } | 190 | } |
112 | 191 | ||
113 | static inline int pm_runtime_get_sync(struct device *dev) | 192 | static inline int pm_runtime_get_sync(struct device *dev) |
114 | { | 193 | { |
115 | return __pm_runtime_get(dev, true); | 194 | return __pm_runtime_resume(dev, RPM_GET_PUT); |
116 | } | 195 | } |
117 | 196 | ||
118 | static inline int pm_runtime_put(struct device *dev) | 197 | static inline int pm_runtime_put(struct device *dev) |
119 | { | 198 | { |
120 | return __pm_runtime_put(dev, false); | 199 | return __pm_runtime_idle(dev, RPM_GET_PUT | RPM_ASYNC); |
200 | } | ||
201 | |||
202 | static inline int pm_runtime_put_autosuspend(struct device *dev) | ||
203 | { | ||
204 | return __pm_runtime_suspend(dev, | ||
205 | RPM_GET_PUT | RPM_ASYNC | RPM_AUTO); | ||
121 | } | 206 | } |
122 | 207 | ||
123 | static inline int pm_runtime_put_sync(struct device *dev) | 208 | static inline int pm_runtime_put_sync(struct device *dev) |
124 | { | 209 | { |
125 | return __pm_runtime_put(dev, true); | 210 | return __pm_runtime_idle(dev, RPM_GET_PUT); |
211 | } | ||
212 | |||
213 | static inline int pm_runtime_put_sync_suspend(struct device *dev) | ||
214 | { | ||
215 | return __pm_runtime_suspend(dev, RPM_GET_PUT); | ||
216 | } | ||
217 | |||
218 | static inline int pm_runtime_put_sync_autosuspend(struct device *dev) | ||
219 | { | ||
220 | return __pm_runtime_suspend(dev, RPM_GET_PUT | RPM_AUTO); | ||
126 | } | 221 | } |
127 | 222 | ||
128 | static inline int pm_runtime_set_active(struct device *dev) | 223 | static inline int pm_runtime_set_active(struct device *dev) |
@@ -140,4 +235,56 @@ static inline void pm_runtime_disable(struct device *dev) | |||
140 | __pm_runtime_disable(dev, true); | 235 | __pm_runtime_disable(dev, true); |
141 | } | 236 | } |
142 | 237 | ||
238 | static inline void pm_runtime_use_autosuspend(struct device *dev) | ||
239 | { | ||
240 | __pm_runtime_use_autosuspend(dev, true); | ||
241 | } | ||
242 | |||
243 | static inline void pm_runtime_dont_use_autosuspend(struct device *dev) | ||
244 | { | ||
245 | __pm_runtime_use_autosuspend(dev, false); | ||
246 | } | ||
247 | |||
248 | struct pm_clk_notifier_block { | ||
249 | struct notifier_block nb; | ||
250 | struct dev_power_domain *pwr_domain; | ||
251 | char *con_ids[]; | ||
252 | }; | ||
253 | |||
254 | #ifdef CONFIG_PM_RUNTIME_CLK | ||
255 | extern int pm_runtime_clk_init(struct device *dev); | ||
256 | extern void pm_runtime_clk_destroy(struct device *dev); | ||
257 | extern int pm_runtime_clk_add(struct device *dev, const char *con_id); | ||
258 | extern void pm_runtime_clk_remove(struct device *dev, const char *con_id); | ||
259 | extern int pm_runtime_clk_suspend(struct device *dev); | ||
260 | extern int pm_runtime_clk_resume(struct device *dev); | ||
261 | #else | ||
262 | static inline int pm_runtime_clk_init(struct device *dev) | ||
263 | { | ||
264 | return -EINVAL; | ||
265 | } | ||
266 | static inline void pm_runtime_clk_destroy(struct device *dev) | ||
267 | { | ||
268 | } | ||
269 | static inline int pm_runtime_clk_add(struct device *dev, const char *con_id) | ||
270 | { | ||
271 | return -EINVAL; | ||
272 | } | ||
273 | static inline void pm_runtime_clk_remove(struct device *dev, const char *con_id) | ||
274 | { | ||
275 | } | ||
276 | #define pm_runtime_clock_suspend NULL | ||
277 | #define pm_runtime_clock_resume NULL | ||
278 | #endif | ||
279 | |||
280 | #ifdef CONFIG_HAVE_CLK | ||
281 | extern void pm_runtime_clk_add_notifier(struct bus_type *bus, | ||
282 | struct pm_clk_notifier_block *clknb); | ||
283 | #else | ||
284 | static inline void pm_runtime_clk_add_notifier(struct bus_type *bus, | ||
285 | struct pm_clk_notifier_block *clknb) | ||
286 | { | ||
287 | } | ||
288 | #endif | ||
289 | |||
143 | #endif | 290 | #endif |