Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0-only */
2 : : /*
3 : : * pm_runtime.h - Device run-time power management helper functions.
4 : : *
5 : : * Copyright (C) 2009 Rafael J. Wysocki <rjw@sisk.pl>
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 : : /* 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 : :
25 : : #ifdef CONFIG_PM
26 : : extern struct workqueue_struct *pm_wq;
27 : :
28 : : static inline bool queue_pm_work(struct work_struct *work)
29 : : {
30 : : return queue_work(pm_wq, work);
31 : : }
32 : :
33 : : extern int pm_generic_runtime_suspend(struct device *dev);
34 : : extern int pm_generic_runtime_resume(struct device *dev);
35 : : extern int pm_runtime_force_suspend(struct device *dev);
36 : : extern int pm_runtime_force_resume(struct device *dev);
37 : :
38 : : extern int __pm_runtime_idle(struct device *dev, int rpmflags);
39 : : extern int __pm_runtime_suspend(struct device *dev, int rpmflags);
40 : : extern int __pm_runtime_resume(struct device *dev, int rpmflags);
41 : : extern int pm_runtime_get_if_in_use(struct device *dev);
42 : : extern int pm_schedule_suspend(struct device *dev, unsigned int delay);
43 : : extern int __pm_runtime_set_status(struct device *dev, unsigned int status);
44 : : extern int pm_runtime_barrier(struct device *dev);
45 : : extern void pm_runtime_enable(struct device *dev);
46 : : extern void __pm_runtime_disable(struct device *dev, bool check_resume);
47 : : extern void pm_runtime_allow(struct device *dev);
48 : : extern void pm_runtime_forbid(struct device *dev);
49 : : extern void pm_runtime_no_callbacks(struct device *dev);
50 : : extern void pm_runtime_irq_safe(struct device *dev);
51 : : extern void __pm_runtime_use_autosuspend(struct device *dev, bool use);
52 : : extern void pm_runtime_set_autosuspend_delay(struct device *dev, int delay);
53 : : extern u64 pm_runtime_autosuspend_expiration(struct device *dev);
54 : : extern void pm_runtime_update_max_time_suspended(struct device *dev,
55 : : s64 delta_ns);
56 : : extern void pm_runtime_set_memalloc_noio(struct device *dev, bool enable);
57 : : extern void pm_runtime_clean_up_links(struct device *dev);
58 : : extern void pm_runtime_get_suppliers(struct device *dev);
59 : : extern void pm_runtime_put_suppliers(struct device *dev);
60 : : extern void pm_runtime_new_link(struct device *dev);
61 : : extern void pm_runtime_drop_link(struct device *dev);
62 : :
63 : 8740 : static inline void pm_suspend_ignore_children(struct device *dev, bool enable)
64 : : {
65 [ # # # # ]: 8740 : dev->power.ignore_children = enable;
66 : : }
67 : :
68 : 756 : static inline void pm_runtime_get_noresume(struct device *dev)
69 : : {
70 : 756 : atomic_inc(&dev->power.usage_count);
71 : 0 : }
72 : :
73 : 644 : static inline void pm_runtime_put_noidle(struct device *dev)
74 : : {
75 : 644 : atomic_add_unless(&dev->power.usage_count, -1, 0);
76 : 0 : }
77 : :
78 : 0 : static inline bool pm_runtime_suspended(struct device *dev)
79 : : {
80 : 0 : return dev->power.runtime_status == RPM_SUSPENDED
81 [ # # # # : 0 : && !dev->power.disable_depth;
# # # # #
# # # # #
# # # # ]
82 : : }
83 : :
84 : 0 : static inline bool pm_runtime_active(struct device *dev)
85 : : {
86 : 0 : return dev->power.runtime_status == RPM_ACTIVE
87 [ # # # # : 0 : || dev->power.disable_depth;
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # ]
88 : : }
89 : :
90 : 0 : static inline bool pm_runtime_status_suspended(struct device *dev)
91 : : {
92 [ # # # # : 0 : return dev->power.runtime_status == RPM_SUSPENDED;
# # # # #
# # # #
# ]
93 : : }
94 : :
95 : 170 : static inline bool pm_runtime_enabled(struct device *dev)
96 : : {
97 [ + + ]: 170 : return !dev->power.disable_depth;
98 : : }
99 : :
100 : 8124 : static inline bool pm_runtime_callbacks_present(struct device *dev)
101 : : {
102 [ + - ]: 8124 : return !dev->power.no_callbacks;
103 : : }
104 : :
105 : 30577 : static inline void pm_runtime_mark_last_busy(struct device *dev)
106 : : {
107 [ + - ]: 30577 : WRITE_ONCE(dev->power.last_busy, ktime_get_mono_fast_ns());
108 : 30521 : }
109 : :
110 : : static inline bool pm_runtime_is_irq_safe(struct device *dev)
111 : : {
112 : : return dev->power.irq_safe;
113 : : }
114 : :
115 : : extern u64 pm_runtime_suspended_time(struct device *dev);
116 : :
117 : : #else /* !CONFIG_PM */
118 : :
119 : : static inline bool queue_pm_work(struct work_struct *work) { return false; }
120 : :
121 : : static inline int pm_generic_runtime_suspend(struct device *dev) { return 0; }
122 : : static inline int pm_generic_runtime_resume(struct device *dev) { return 0; }
123 : : static inline int pm_runtime_force_suspend(struct device *dev) { return 0; }
124 : : static inline int pm_runtime_force_resume(struct device *dev) { return 0; }
125 : :
126 : : static inline int __pm_runtime_idle(struct device *dev, int rpmflags)
127 : : {
128 : : return -ENOSYS;
129 : : }
130 : : static inline int __pm_runtime_suspend(struct device *dev, int rpmflags)
131 : : {
132 : : return -ENOSYS;
133 : : }
134 : : static inline int __pm_runtime_resume(struct device *dev, int rpmflags)
135 : : {
136 : : return 1;
137 : : }
138 : : static inline int pm_schedule_suspend(struct device *dev, unsigned int delay)
139 : : {
140 : : return -ENOSYS;
141 : : }
142 : : static inline int pm_runtime_get_if_in_use(struct device *dev)
143 : : {
144 : : return -EINVAL;
145 : : }
146 : : static inline int __pm_runtime_set_status(struct device *dev,
147 : : unsigned int status) { return 0; }
148 : : static inline int pm_runtime_barrier(struct device *dev) { return 0; }
149 : : static inline void pm_runtime_enable(struct device *dev) {}
150 : : static inline void __pm_runtime_disable(struct device *dev, bool c) {}
151 : : static inline void pm_runtime_allow(struct device *dev) {}
152 : : static inline void pm_runtime_forbid(struct device *dev) {}
153 : :
154 : : static inline void pm_suspend_ignore_children(struct device *dev, bool enable) {}
155 : : static inline void pm_runtime_get_noresume(struct device *dev) {}
156 : : static inline void pm_runtime_put_noidle(struct device *dev) {}
157 : : static inline bool pm_runtime_suspended(struct device *dev) { return false; }
158 : : static inline bool pm_runtime_active(struct device *dev) { return true; }
159 : : static inline bool pm_runtime_status_suspended(struct device *dev) { return false; }
160 : : static inline bool pm_runtime_enabled(struct device *dev) { return false; }
161 : :
162 : : static inline void pm_runtime_no_callbacks(struct device *dev) {}
163 : : static inline void pm_runtime_irq_safe(struct device *dev) {}
164 : : static inline bool pm_runtime_is_irq_safe(struct device *dev) { return false; }
165 : :
166 : : static inline bool pm_runtime_callbacks_present(struct device *dev) { return false; }
167 : : static inline void pm_runtime_mark_last_busy(struct device *dev) {}
168 : : static inline void __pm_runtime_use_autosuspend(struct device *dev,
169 : : bool use) {}
170 : : static inline void pm_runtime_set_autosuspend_delay(struct device *dev,
171 : : int delay) {}
172 : : static inline u64 pm_runtime_autosuspend_expiration(
173 : : struct device *dev) { return 0; }
174 : : static inline void pm_runtime_set_memalloc_noio(struct device *dev,
175 : : bool enable){}
176 : : static inline void pm_runtime_clean_up_links(struct device *dev) {}
177 : : static inline void pm_runtime_get_suppliers(struct device *dev) {}
178 : : static inline void pm_runtime_put_suppliers(struct device *dev) {}
179 : : static inline void pm_runtime_new_link(struct device *dev) {}
180 : : static inline void pm_runtime_drop_link(struct device *dev) {}
181 : :
182 : : #endif /* !CONFIG_PM */
183 : :
184 : 0 : static inline int pm_runtime_idle(struct device *dev)
185 : : {
186 : 0 : return __pm_runtime_idle(dev, 0);
187 : : }
188 : :
189 : : static inline int pm_runtime_suspend(struct device *dev)
190 : : {
191 : : return __pm_runtime_suspend(dev, 0);
192 : : }
193 : :
194 : 0 : static inline int pm_runtime_autosuspend(struct device *dev)
195 : : {
196 : 0 : return __pm_runtime_suspend(dev, RPM_AUTO);
197 : : }
198 : :
199 : 0 : static inline int pm_runtime_resume(struct device *dev)
200 : : {
201 : 0 : return __pm_runtime_resume(dev, 0);
202 : : }
203 : :
204 : 5012 : static inline int pm_request_idle(struct device *dev)
205 : : {
206 : 5012 : return __pm_runtime_idle(dev, RPM_ASYNC);
207 : : }
208 : :
209 : 0 : static inline int pm_request_resume(struct device *dev)
210 : : {
211 : 0 : return __pm_runtime_resume(dev, RPM_ASYNC);
212 : : }
213 : :
214 : 0 : static inline int pm_request_autosuspend(struct device *dev)
215 : : {
216 : 0 : return __pm_runtime_suspend(dev, RPM_ASYNC | RPM_AUTO);
217 : : }
218 : :
219 : 0 : static inline int pm_runtime_get(struct device *dev)
220 : : {
221 : 0 : return __pm_runtime_resume(dev, RPM_GET_PUT | RPM_ASYNC);
222 : : }
223 : :
224 : 5404 : static inline int pm_runtime_get_sync(struct device *dev)
225 : : {
226 : 5404 : return __pm_runtime_resume(dev, RPM_GET_PUT);
227 : : }
228 : :
229 : 4508 : static inline int pm_runtime_put(struct device *dev)
230 : : {
231 : 4508 : return __pm_runtime_idle(dev, RPM_GET_PUT | RPM_ASYNC);
232 : : }
233 : :
234 : 0 : static inline int pm_runtime_put_autosuspend(struct device *dev)
235 : : {
236 : 0 : return __pm_runtime_suspend(dev,
237 : : RPM_GET_PUT | RPM_ASYNC | RPM_AUTO);
238 : : }
239 : :
240 : 926 : static inline int pm_runtime_put_sync(struct device *dev)
241 : : {
242 : 926 : return __pm_runtime_idle(dev, RPM_GET_PUT);
243 : : }
244 : :
245 : 0 : static inline int pm_runtime_put_sync_suspend(struct device *dev)
246 : : {
247 : 0 : return __pm_runtime_suspend(dev, RPM_GET_PUT);
248 : : }
249 : :
250 : 0 : static inline int pm_runtime_put_sync_autosuspend(struct device *dev)
251 : : {
252 : 0 : return __pm_runtime_suspend(dev, RPM_GET_PUT | RPM_AUTO);
253 : : }
254 : :
255 : 476 : static inline int pm_runtime_set_active(struct device *dev)
256 : : {
257 : 476 : return __pm_runtime_set_status(dev, RPM_ACTIVE);
258 : : }
259 : :
260 : 0 : static inline int pm_runtime_set_suspended(struct device *dev)
261 : : {
262 : 0 : return __pm_runtime_set_status(dev, RPM_SUSPENDED);
263 : : }
264 : :
265 : 0 : static inline void pm_runtime_disable(struct device *dev)
266 : : {
267 : 0 : __pm_runtime_disable(dev, true);
268 : 0 : }
269 : :
270 : 84 : static inline void pm_runtime_use_autosuspend(struct device *dev)
271 : : {
272 : 84 : __pm_runtime_use_autosuspend(dev, true);
273 : 0 : }
274 : :
275 : 0 : static inline void pm_runtime_dont_use_autosuspend(struct device *dev)
276 : : {
277 : 0 : __pm_runtime_use_autosuspend(dev, false);
278 : 0 : }
279 : :
280 : : #endif
|