Blame view
include/linux/pm_runtime.h
8.48 KB
5e928f77a
|
1 2 3 4 5 6 7 8 9 10 11 12 |
/* * pm_runtime.h - Device run-time power management helper functions. * * Copyright (C) 2009 Rafael J. Wysocki <rjw@sisk.pl> * * This file is released under the GPLv2. */ #ifndef _LINUX_PM_RUNTIME_H #define _LINUX_PM_RUNTIME_H #include <linux/device.h> |
246359d37
|
13 |
#include <linux/notifier.h> |
5e928f77a
|
14 |
#include <linux/pm.h> |
15bcb91d7
|
15 |
#include <linux/jiffies.h> |
3f9af0513
|
16 17 18 19 |
/* Runtime PM flag argument bits */ #define RPM_ASYNC 0x01 /* Request is asynchronous */ #define RPM_NOWAIT 0x02 /* Don't wait for concurrent state change */ |
140a6c945
|
20 21 |
#define RPM_GET_PUT 0x04 /* Increment/decrement the usage_count */ |
15bcb91d7
|
22 |
#define RPM_AUTO 0x08 /* Use autosuspend_delay */ |
3f9af0513
|
23 |
|
717e5d458
|
24 |
#ifdef CONFIG_PM |
28cb5ef16
|
25 26 27 28 29 30 |
extern struct workqueue_struct *pm_wq; static inline bool queue_pm_work(struct work_struct *work) { return queue_work(pm_wq, work); } |
717e5d458
|
31 32 |
extern int pm_generic_runtime_suspend(struct device *dev); extern int pm_generic_runtime_resume(struct device *dev); |
37f204164
|
33 34 |
extern int pm_runtime_force_suspend(struct device *dev); extern int pm_runtime_force_resume(struct device *dev); |
5e928f77a
|
35 |
|
140a6c945
|
36 37 38 |
extern int __pm_runtime_idle(struct device *dev, int rpmflags); extern int __pm_runtime_suspend(struct device *dev, int rpmflags); extern int __pm_runtime_resume(struct device *dev, int rpmflags); |
a436b6a19
|
39 |
extern int pm_runtime_get_if_in_use(struct device *dev); |
5e928f77a
|
40 |
extern int pm_schedule_suspend(struct device *dev, unsigned int delay); |
5e928f77a
|
41 42 43 44 |
extern int __pm_runtime_set_status(struct device *dev, unsigned int status); extern int pm_runtime_barrier(struct device *dev); extern void pm_runtime_enable(struct device *dev); extern void __pm_runtime_disable(struct device *dev, bool check_resume); |
538236391
|
45 46 |
extern void pm_runtime_allow(struct device *dev); extern void pm_runtime_forbid(struct device *dev); |
7490e4423
|
47 |
extern void pm_runtime_no_callbacks(struct device *dev); |
c7b61de5b
|
48 |
extern void pm_runtime_irq_safe(struct device *dev); |
15bcb91d7
|
49 50 51 |
extern void __pm_runtime_use_autosuspend(struct device *dev, bool use); extern void pm_runtime_set_autosuspend_delay(struct device *dev, int delay); extern unsigned long pm_runtime_autosuspend_expiration(struct device *dev); |
00dc9ad18
|
52 53 |
extern void pm_runtime_update_max_time_suspended(struct device *dev, s64 delta_ns); |
e823407f7
|
54 |
extern void pm_runtime_set_memalloc_noio(struct device *dev, bool enable); |
5e928f77a
|
55 |
|
372a12ed9
|
56 57 58 59 |
static inline void pm_suspend_ignore_children(struct device *dev, bool enable) { dev->power.ignore_children = enable; } |
5e928f77a
|
60 61 62 63 64 |
static inline bool pm_children_suspended(struct device *dev) { return dev->power.ignore_children || !atomic_read(&dev->power.child_count); } |
5e928f77a
|
65 66 67 68 69 70 71 72 73 |
static inline void pm_runtime_get_noresume(struct device *dev) { atomic_inc(&dev->power.usage_count); } static inline void pm_runtime_put_noidle(struct device *dev) { atomic_add_unless(&dev->power.usage_count, -1, 0); } |
7a1a8eb58
|
74 75 76 77 78 79 80 81 82 |
static inline bool device_run_wake(struct device *dev) { return dev->power.run_wake; } static inline void device_set_run_wake(struct device *dev, bool enable) { dev->power.run_wake = enable; } |
d690b2cd2
|
83 84 |
static inline bool pm_runtime_suspended(struct device *dev) { |
f08f5a0ad
|
85 86 |
return dev->power.runtime_status == RPM_SUSPENDED && !dev->power.disable_depth; |
d690b2cd2
|
87 |
} |
fbadc58dd
|
88 89 90 91 92 |
static inline bool pm_runtime_active(struct device *dev) { return dev->power.runtime_status == RPM_ACTIVE || dev->power.disable_depth; } |
f3393b62f
|
93 94 95 96 |
static inline bool pm_runtime_status_suspended(struct device *dev) { return dev->power.runtime_status == RPM_SUSPENDED; } |
4b31db8a1
|
97 98 99 100 |
static inline bool pm_runtime_enabled(struct device *dev) { return !dev->power.disable_depth; } |
cb8f51bda
|
101 102 103 104 |
static inline bool pm_runtime_callbacks_present(struct device *dev) { return !dev->power.no_callbacks; } |
15bcb91d7
|
105 106 107 108 |
static inline void pm_runtime_mark_last_busy(struct device *dev) { ACCESS_ONCE(dev->power.last_busy) = jiffies; } |
3fb1581ea
|
109 110 111 112 |
static inline bool pm_runtime_is_irq_safe(struct device *dev) { return dev->power.irq_safe; } |
d30d819dc
|
113 114 115 116 117 118 119 120 |
#else /* !CONFIG_PM */ static inline bool queue_pm_work(struct work_struct *work) { return false; } static inline int pm_generic_runtime_suspend(struct device *dev) { return 0; } static inline int pm_generic_runtime_resume(struct device *dev) { return 0; } static inline int pm_runtime_force_suspend(struct device *dev) { return 0; } static inline int pm_runtime_force_resume(struct device *dev) { return 0; } |
5e928f77a
|
121 |
|
140a6c945
|
122 123 124 125 126 127 128 129 130 131 132 133 |
static inline int __pm_runtime_idle(struct device *dev, int rpmflags) { return -ENOSYS; } static inline int __pm_runtime_suspend(struct device *dev, int rpmflags) { return -ENOSYS; } static inline int __pm_runtime_resume(struct device *dev, int rpmflags) { return 1; } |
5e928f77a
|
134 135 136 137 |
static inline int pm_schedule_suspend(struct device *dev, unsigned int delay) { return -ENOSYS; } |
a436b6a19
|
138 139 140 141 |
static inline int pm_runtime_get_if_in_use(struct device *dev) { return -EINVAL; } |
5e928f77a
|
142 143 144 145 146 |
static inline int __pm_runtime_set_status(struct device *dev, unsigned int status) { return 0; } static inline int pm_runtime_barrier(struct device *dev) { return 0; } static inline void pm_runtime_enable(struct device *dev) {} static inline void __pm_runtime_disable(struct device *dev, bool c) {} |
538236391
|
147 148 |
static inline void pm_runtime_allow(struct device *dev) {} static inline void pm_runtime_forbid(struct device *dev) {} |
5e928f77a
|
149 |
|
372a12ed9
|
150 |
static inline void pm_suspend_ignore_children(struct device *dev, bool enable) {} |
5e928f77a
|
151 |
static inline bool pm_children_suspended(struct device *dev) { return false; } |
5e928f77a
|
152 153 |
static inline void pm_runtime_get_noresume(struct device *dev) {} static inline void pm_runtime_put_noidle(struct device *dev) {} |
7a1a8eb58
|
154 155 |
static inline bool device_run_wake(struct device *dev) { return false; } static inline void device_set_run_wake(struct device *dev, bool enable) {} |
d690b2cd2
|
156 |
static inline bool pm_runtime_suspended(struct device *dev) { return false; } |
fbadc58dd
|
157 |
static inline bool pm_runtime_active(struct device *dev) { return true; } |
f3393b62f
|
158 |
static inline bool pm_runtime_status_suspended(struct device *dev) { return false; } |
4b31db8a1
|
159 |
static inline bool pm_runtime_enabled(struct device *dev) { return false; } |
5e928f77a
|
160 |
|
7490e4423
|
161 |
static inline void pm_runtime_no_callbacks(struct device *dev) {} |
c7b61de5b
|
162 |
static inline void pm_runtime_irq_safe(struct device *dev) {} |
3fb1581ea
|
163 |
static inline bool pm_runtime_is_irq_safe(struct device *dev) { return false; } |
2f60ba706
|
164 |
|
cb8f51bda
|
165 |
static inline bool pm_runtime_callbacks_present(struct device *dev) { return false; } |
15bcb91d7
|
166 167 168 169 170 171 172 |
static inline void pm_runtime_mark_last_busy(struct device *dev) {} static inline void __pm_runtime_use_autosuspend(struct device *dev, bool use) {} static inline void pm_runtime_set_autosuspend_delay(struct device *dev, int delay) {} static inline unsigned long pm_runtime_autosuspend_expiration( struct device *dev) { return 0; } |
e823407f7
|
173 174 |
static inline void pm_runtime_set_memalloc_noio(struct device *dev, bool enable){} |
15bcb91d7
|
175 |
|
d30d819dc
|
176 |
#endif /* !CONFIG_PM */ |
5e928f77a
|
177 |
|
140a6c945
|
178 179 180 181 182 183 184 185 186 |
static inline int pm_runtime_idle(struct device *dev) { return __pm_runtime_idle(dev, 0); } static inline int pm_runtime_suspend(struct device *dev) { return __pm_runtime_suspend(dev, 0); } |
15bcb91d7
|
187 188 189 190 |
static inline int pm_runtime_autosuspend(struct device *dev) { return __pm_runtime_suspend(dev, RPM_AUTO); } |
140a6c945
|
191 192 193 194 195 196 197 198 199 200 201 202 203 204 |
static inline int pm_runtime_resume(struct device *dev) { return __pm_runtime_resume(dev, 0); } static inline int pm_request_idle(struct device *dev) { return __pm_runtime_idle(dev, RPM_ASYNC); } static inline int pm_request_resume(struct device *dev) { return __pm_runtime_resume(dev, RPM_ASYNC); } |
5fc62aad4
|
205 206 207 208 |
static inline int pm_request_autosuspend(struct device *dev) { return __pm_runtime_suspend(dev, RPM_ASYNC | RPM_AUTO); } |
5e928f77a
|
209 210 |
static inline int pm_runtime_get(struct device *dev) { |
140a6c945
|
211 |
return __pm_runtime_resume(dev, RPM_GET_PUT | RPM_ASYNC); |
5e928f77a
|
212 213 214 215 |
} static inline int pm_runtime_get_sync(struct device *dev) { |
140a6c945
|
216 |
return __pm_runtime_resume(dev, RPM_GET_PUT); |
5e928f77a
|
217 218 219 220 |
} static inline int pm_runtime_put(struct device *dev) { |
140a6c945
|
221 |
return __pm_runtime_idle(dev, RPM_GET_PUT | RPM_ASYNC); |
5e928f77a
|
222 |
} |
15bcb91d7
|
223 224 225 226 227 |
static inline int pm_runtime_put_autosuspend(struct device *dev) { return __pm_runtime_suspend(dev, RPM_GET_PUT | RPM_ASYNC | RPM_AUTO); } |
5e928f77a
|
228 229 |
static inline int pm_runtime_put_sync(struct device *dev) { |
140a6c945
|
230 |
return __pm_runtime_idle(dev, RPM_GET_PUT); |
5e928f77a
|
231 |
} |
c7b61de5b
|
232 233 234 235 |
static inline int pm_runtime_put_sync_suspend(struct device *dev) { return __pm_runtime_suspend(dev, RPM_GET_PUT); } |
15bcb91d7
|
236 237 238 239 |
static inline int pm_runtime_put_sync_autosuspend(struct device *dev) { return __pm_runtime_suspend(dev, RPM_GET_PUT | RPM_AUTO); } |
5e928f77a
|
240 241 242 243 244 245 246 247 248 249 250 251 252 253 |
static inline int pm_runtime_set_active(struct device *dev) { return __pm_runtime_set_status(dev, RPM_ACTIVE); } static inline void pm_runtime_set_suspended(struct device *dev) { __pm_runtime_set_status(dev, RPM_SUSPENDED); } static inline void pm_runtime_disable(struct device *dev) { __pm_runtime_disable(dev, true); } |
15bcb91d7
|
254 255 256 257 258 259 260 261 262 |
static inline void pm_runtime_use_autosuspend(struct device *dev) { __pm_runtime_use_autosuspend(dev, true); } static inline void pm_runtime_dont_use_autosuspend(struct device *dev) { __pm_runtime_use_autosuspend(dev, false); } |
5e928f77a
|
263 |
#endif |