1
2
3
4
5
6
7
8#ifndef _LINUX_PM_RUNTIME_H
9#define _LINUX_PM_RUNTIME_H
10
11#include <linux/device.h>
12#include <linux/notifier.h>
13#include <linux/pm.h>
14
15#include <linux/jiffies.h>
16
17
18#define RPM_ASYNC 0x01
19#define RPM_NOWAIT 0x02
20
21#define RPM_GET_PUT 0x04
22
23#define RPM_AUTO 0x08
24
25#ifdef CONFIG_PM
26extern struct workqueue_struct *pm_wq;
27
28static inline bool queue_pm_work(struct work_struct *work)
29{
30 return queue_work(pm_wq, work);
31}
32
33extern int pm_generic_runtime_suspend(struct device *dev);
34extern int pm_generic_runtime_resume(struct device *dev);
35extern int pm_runtime_force_suspend(struct device *dev);
36extern int pm_runtime_force_resume(struct device *dev);
37
38extern int __pm_runtime_idle(struct device *dev, int rpmflags);
39extern int __pm_runtime_suspend(struct device *dev, int rpmflags);
40extern int __pm_runtime_resume(struct device *dev, int rpmflags);
41extern int pm_runtime_get_if_active(struct device *dev, bool ign_usage_count);
42extern int pm_schedule_suspend(struct device *dev, unsigned int delay);
43extern int __pm_runtime_set_status(struct device *dev, unsigned int status);
44extern int pm_runtime_barrier(struct device *dev);
45extern void pm_runtime_enable(struct device *dev);
46extern void __pm_runtime_disable(struct device *dev, bool check_resume);
47extern void pm_runtime_allow(struct device *dev);
48extern void pm_runtime_forbid(struct device *dev);
49extern void pm_runtime_no_callbacks(struct device *dev);
50extern void pm_runtime_irq_safe(struct device *dev);
51extern void __pm_runtime_use_autosuspend(struct device *dev, bool use);
52extern void pm_runtime_set_autosuspend_delay(struct device *dev, int delay);
53extern u64 pm_runtime_autosuspend_expiration(struct device *dev);
54extern void pm_runtime_update_max_time_suspended(struct device *dev,
55 s64 delta_ns);
56extern void pm_runtime_set_memalloc_noio(struct device *dev, bool enable);
57extern void pm_runtime_get_suppliers(struct device *dev);
58extern void pm_runtime_put_suppliers(struct device *dev);
59extern void pm_runtime_new_link(struct device *dev);
60extern void pm_runtime_drop_link(struct device_link *link);
61
62
63
64
65
66
67
68
69static inline int pm_runtime_get_if_in_use(struct device *dev)
70{
71 return pm_runtime_get_if_active(dev, false);
72}
73
74
75
76
77
78
79
80
81
82
83static inline void pm_suspend_ignore_children(struct device *dev, bool enable)
84{
85 dev->power.ignore_children = enable;
86}
87
88
89
90
91
92static inline void pm_runtime_get_noresume(struct device *dev)
93{
94 atomic_inc(&dev->power.usage_count);
95}
96
97
98
99
100
101
102
103static inline void pm_runtime_put_noidle(struct device *dev)
104{
105 atomic_add_unless(&dev->power.usage_count, -1, 0);
106}
107
108
109
110
111
112
113
114
115
116
117
118
119
120static inline bool pm_runtime_suspended(struct device *dev)
121{
122 return dev->power.runtime_status == RPM_SUSPENDED
123 && !dev->power.disable_depth;
124}
125
126
127
128
129
130
131
132
133
134
135
136
137
138static inline bool pm_runtime_active(struct device *dev)
139{
140 return dev->power.runtime_status == RPM_ACTIVE
141 || dev->power.disable_depth;
142}
143
144
145
146
147
148
149
150
151
152
153
154
155static inline bool pm_runtime_status_suspended(struct device *dev)
156{
157 return dev->power.runtime_status == RPM_SUSPENDED;
158}
159
160
161
162
163
164
165
166
167
168
169
170static inline bool pm_runtime_enabled(struct device *dev)
171{
172 return !dev->power.disable_depth;
173}
174
175
176
177
178
179
180
181
182static inline bool pm_runtime_has_no_callbacks(struct device *dev)
183{
184 return dev->power.no_callbacks;
185}
186
187
188
189
190
191
192
193
194static inline void pm_runtime_mark_last_busy(struct device *dev)
195{
196 WRITE_ONCE(dev->power.last_busy, ktime_get_mono_fast_ns());
197}
198
199
200
201
202
203
204
205
206
207static inline bool pm_runtime_is_irq_safe(struct device *dev)
208{
209 return dev->power.irq_safe;
210}
211
212extern u64 pm_runtime_suspended_time(struct device *dev);
213
214#else
215
216static inline bool queue_pm_work(struct work_struct *work) { return false; }
217
218static inline int pm_generic_runtime_suspend(struct device *dev) { return 0; }
219static inline int pm_generic_runtime_resume(struct device *dev) { return 0; }
220static inline int pm_runtime_force_suspend(struct device *dev) { return 0; }
221static inline int pm_runtime_force_resume(struct device *dev) { return 0; }
222
223static inline int __pm_runtime_idle(struct device *dev, int rpmflags)
224{
225 return -ENOSYS;
226}
227static inline int __pm_runtime_suspend(struct device *dev, int rpmflags)
228{
229 return -ENOSYS;
230}
231static inline int __pm_runtime_resume(struct device *dev, int rpmflags)
232{
233 return 1;
234}
235static inline int pm_schedule_suspend(struct device *dev, unsigned int delay)
236{
237 return -ENOSYS;
238}
239static inline int pm_runtime_get_if_in_use(struct device *dev)
240{
241 return -EINVAL;
242}
243static inline int pm_runtime_get_if_active(struct device *dev,
244 bool ign_usage_count)
245{
246 return -EINVAL;
247}
248static inline int __pm_runtime_set_status(struct device *dev,
249 unsigned int status) { return 0; }
250static inline int pm_runtime_barrier(struct device *dev) { return 0; }
251static inline void pm_runtime_enable(struct device *dev) {}
252static inline void __pm_runtime_disable(struct device *dev, bool c) {}
253static inline void pm_runtime_allow(struct device *dev) {}
254static inline void pm_runtime_forbid(struct device *dev) {}
255
256static inline void pm_suspend_ignore_children(struct device *dev, bool enable) {}
257static inline void pm_runtime_get_noresume(struct device *dev) {}
258static inline void pm_runtime_put_noidle(struct device *dev) {}
259static inline bool pm_runtime_suspended(struct device *dev) { return false; }
260static inline bool pm_runtime_active(struct device *dev) { return true; }
261static inline bool pm_runtime_status_suspended(struct device *dev) { return false; }
262static inline bool pm_runtime_enabled(struct device *dev) { return false; }
263
264static inline void pm_runtime_no_callbacks(struct device *dev) {}
265static inline void pm_runtime_irq_safe(struct device *dev) {}
266static inline bool pm_runtime_is_irq_safe(struct device *dev) { return false; }
267
268static inline bool pm_runtime_callbacks_present(struct device *dev) { return false; }
269static inline void pm_runtime_mark_last_busy(struct device *dev) {}
270static inline void __pm_runtime_use_autosuspend(struct device *dev,
271 bool use) {}
272static inline void pm_runtime_set_autosuspend_delay(struct device *dev,
273 int delay) {}
274static inline u64 pm_runtime_autosuspend_expiration(
275 struct device *dev) { return 0; }
276static inline void pm_runtime_set_memalloc_noio(struct device *dev,
277 bool enable){}
278static inline void pm_runtime_get_suppliers(struct device *dev) {}
279static inline void pm_runtime_put_suppliers(struct device *dev) {}
280static inline void pm_runtime_new_link(struct device *dev) {}
281static inline void pm_runtime_drop_link(struct device_link *link) {}
282
283#endif
284
285
286
287
288
289
290
291
292
293static inline int pm_runtime_idle(struct device *dev)
294{
295 return __pm_runtime_idle(dev, 0);
296}
297
298
299
300
301
302static inline int pm_runtime_suspend(struct device *dev)
303{
304 return __pm_runtime_suspend(dev, 0);
305}
306
307
308
309
310
311
312
313
314static inline int pm_runtime_autosuspend(struct device *dev)
315{
316 return __pm_runtime_suspend(dev, RPM_AUTO);
317}
318
319
320
321
322
323static inline int pm_runtime_resume(struct device *dev)
324{
325 return __pm_runtime_resume(dev, 0);
326}
327
328
329
330
331
332
333
334
335static inline int pm_request_idle(struct device *dev)
336{
337 return __pm_runtime_idle(dev, RPM_ASYNC);
338}
339
340
341
342
343
344static inline int pm_request_resume(struct device *dev)
345{
346 return __pm_runtime_resume(dev, RPM_ASYNC);
347}
348
349
350
351
352
353
354
355
356static inline int pm_request_autosuspend(struct device *dev)
357{
358 return __pm_runtime_suspend(dev, RPM_ASYNC | RPM_AUTO);
359}
360
361
362
363
364
365
366
367
368static inline int pm_runtime_get(struct device *dev)
369{
370 return __pm_runtime_resume(dev, RPM_GET_PUT | RPM_ASYNC);
371}
372
373
374
375
376
377
378
379
380
381
382
383
384static inline int pm_runtime_get_sync(struct device *dev)
385{
386 return __pm_runtime_resume(dev, RPM_GET_PUT);
387}
388
389
390
391
392
393
394
395
396
397static inline int pm_runtime_resume_and_get(struct device *dev)
398{
399 int ret;
400
401 ret = __pm_runtime_resume(dev, RPM_GET_PUT);
402 if (ret < 0) {
403 pm_runtime_put_noidle(dev);
404 return ret;
405 }
406
407 return 0;
408}
409
410
411
412
413
414
415
416
417static inline int pm_runtime_put(struct device *dev)
418{
419 return __pm_runtime_idle(dev, RPM_GET_PUT | RPM_ASYNC);
420}
421
422
423
424
425
426
427
428
429static inline int pm_runtime_put_autosuspend(struct device *dev)
430{
431 return __pm_runtime_suspend(dev,
432 RPM_GET_PUT | RPM_ASYNC | RPM_AUTO);
433}
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448static inline int pm_runtime_put_sync(struct device *dev)
449{
450 return __pm_runtime_idle(dev, RPM_GET_PUT);
451}
452
453
454
455
456
457
458
459
460
461
462
463
464static inline int pm_runtime_put_sync_suspend(struct device *dev)
465{
466 return __pm_runtime_suspend(dev, RPM_GET_PUT);
467}
468
469
470
471
472
473
474
475
476
477
478
479
480
481static inline int pm_runtime_put_sync_autosuspend(struct device *dev)
482{
483 return __pm_runtime_suspend(dev, RPM_GET_PUT | RPM_AUTO);
484}
485
486
487
488
489
490
491
492
493
494
495static inline int pm_runtime_set_active(struct device *dev)
496{
497 return __pm_runtime_set_status(dev, RPM_ACTIVE);
498}
499
500
501
502
503
504
505
506
507
508
509static inline int pm_runtime_set_suspended(struct device *dev)
510{
511 return __pm_runtime_set_status(dev, RPM_SUSPENDED);
512}
513
514
515
516
517
518
519
520
521
522
523
524static inline void pm_runtime_disable(struct device *dev)
525{
526 __pm_runtime_disable(dev, true);
527}
528
529
530
531
532
533
534
535
536
537static inline void pm_runtime_use_autosuspend(struct device *dev)
538{
539 __pm_runtime_use_autosuspend(dev, true);
540}
541
542
543
544
545
546
547
548
549
550static inline void pm_runtime_dont_use_autosuspend(struct device *dev)
551{
552 __pm_runtime_use_autosuspend(dev, false);
553}
554
555#endif
556