blob: 18b02dcc168e54fb1036877d55f2c1e6a42fae0d [file] [log] [blame]
Thomas Gleixner55716d22019-06-01 10:08:42 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +02002/*
3 * pm_runtime.h - Device run-time power management helper functions.
4 *
5 * Copyright (C) 2009 Rafael J. Wysocki <rjw@sisk.pl>
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +02006 */
7
8#ifndef _LINUX_PM_RUNTIME_H
9#define _LINUX_PM_RUNTIME_H
10
11#include <linux/device.h>
Paul Gortmaker246359d2011-05-27 07:08:41 -040012#include <linux/notifier.h>
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +020013#include <linux/pm.h>
14
Alan Stern15bcb91d2010-09-25 23:35:21 +020015#include <linux/jiffies.h>
16
Alan Stern3f9af052010-09-25 23:34:54 +020017/* 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 Stern140a6c92010-09-25 23:35:07 +020021#define RPM_GET_PUT 0x04 /* Increment/decrement the
22 usage_count */
Alan Stern15bcb91d2010-09-25 23:35:21 +020023#define RPM_AUTO 0x08 /* Use autosuspend_delay */
Alan Stern3f9af052010-09-25 23:34:54 +020024
Ulf Hansson717e5d42013-12-10 14:37:41 +010025#ifdef CONFIG_PM
Rafael J. Wysocki28cb5ef2014-07-23 01:00:36 +020026extern 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
Ulf Hansson717e5d42013-12-10 14:37:41 +010033extern int pm_generic_runtime_suspend(struct device *dev);
34extern int pm_generic_runtime_resume(struct device *dev);
Ulf Hansson37f20412014-03-01 11:56:05 +010035extern int pm_runtime_force_suspend(struct device *dev);
36extern int pm_runtime_force_resume(struct device *dev);
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +020037
Alan Stern140a6c92010-09-25 23:35:07 +020038extern 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);
Sakari Ailusc1115662020-02-25 11:31:02 +020041extern int pm_runtime_get_if_active(struct device *dev, bool ign_usage_count);
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +020042extern int pm_schedule_suspend(struct device *dev, unsigned int delay);
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +020043extern 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);
Rafael J. Wysocki53823632010-01-23 22:02:51 +010047extern void pm_runtime_allow(struct device *dev);
48extern void pm_runtime_forbid(struct device *dev);
Alan Stern7490e442010-09-25 23:35:15 +020049extern void pm_runtime_no_callbacks(struct device *dev);
Alan Sternc7b61de2010-12-01 00:14:42 +010050extern void pm_runtime_irq_safe(struct device *dev);
Alan Stern15bcb91d2010-09-25 23:35:21 +020051extern void __pm_runtime_use_autosuspend(struct device *dev, bool use);
52extern void pm_runtime_set_autosuspend_delay(struct device *dev, int delay);
Vincent Guittot8234f672018-12-14 15:22:25 +010053extern u64 pm_runtime_autosuspend_expiration(struct device *dev);
Rafael J. Wysocki00dc9ad2011-12-01 00:01:31 +010054extern void pm_runtime_update_max_time_suspended(struct device *dev,
55 s64 delta_ns);
Ming Leie8234072013-02-22 16:34:11 -080056extern void pm_runtime_set_memalloc_noio(struct device *dev, bool enable);
Rafael J. Wysocki21d5c572016-10-30 17:32:31 +010057extern void pm_runtime_clean_up_links(struct device *dev);
Rafael J. Wysockib06c0b2f2018-06-12 10:24:13 +020058extern void pm_runtime_get_suppliers(struct device *dev);
59extern void pm_runtime_put_suppliers(struct device *dev);
Rafael J. Wysockibaa88092016-10-30 17:32:43 +010060extern void pm_runtime_new_link(struct device *dev);
61extern void pm_runtime_drop_link(struct device *dev);
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +020062
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +020063/**
64 * pm_runtime_get_if_in_use - Conditionally bump up runtime PM usage counter.
65 * @dev: Target device.
66 *
67 * Increment the runtime PM usage counter of @dev if its runtime PM status is
68 * %RPM_ACTIVE and its runtime PM usage counter is greater than 0.
69 */
Sakari Ailusc1115662020-02-25 11:31:02 +020070static inline int pm_runtime_get_if_in_use(struct device *dev)
71{
72 return pm_runtime_get_if_active(dev, false);
73}
74
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +020075/**
76 * pm_suspend_ignore_children - Set runtime PM behavior regarding children.
77 * @dev: Target device.
78 * @enable: Whether or not to ignore possible dependencies on children.
79 *
80 * The dependencies of @dev on its children will not be taken into account by
81 * the runtime PM framework going forward if @enable is %true, or they will
82 * be taken into account otherwise.
83 */
Ulf Hansson372a12e2016-04-08 13:40:53 +020084static inline void pm_suspend_ignore_children(struct device *dev, bool enable)
85{
86 dev->power.ignore_children = enable;
87}
88
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +020089/**
90 * pm_runtime_get_noresume - Bump up runtime PM usage counter of a device.
91 * @dev: Target device.
92 */
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +020093static inline void pm_runtime_get_noresume(struct device *dev)
94{
95 atomic_inc(&dev->power.usage_count);
96}
97
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +020098/**
99 * pm_runtime_put_noidle - Drop runtime PM usage counter of a device.
100 * @dev: Target device.
101 *
102 * Decrement the runtime PM usage counter of @dev unless it is 0 already.
103 */
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200104static inline void pm_runtime_put_noidle(struct device *dev)
105{
106 atomic_add_unless(&dev->power.usage_count, -1, 0);
107}
108
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200109/**
110 * pm_runtime_suspended - Check whether or not a device is runtime-suspended.
111 * @dev: Target device.
112 *
113 * Return %true if runtime PM is enabled for @dev and its runtime PM status is
114 * %RPM_SUSPENDED, or %false otherwise.
115 *
116 * Note that the return value of this function can only be trusted if it is
117 * called under the runtime PM lock of @dev or under conditions in which
118 * runtime PM cannot be either disabled or enabled for @dev and its runtime PM
119 * status cannot change.
120 */
Rafael J. Wysockid690b2c2010-03-06 21:28:37 +0100121static inline bool pm_runtime_suspended(struct device *dev)
122{
Rafael J. Wysockif08f5a02010-12-16 17:11:58 +0100123 return dev->power.runtime_status == RPM_SUSPENDED
124 && !dev->power.disable_depth;
Rafael J. Wysockid690b2c2010-03-06 21:28:37 +0100125}
126
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200127/**
128 * pm_runtime_active - Check whether or not a device is runtime-active.
129 * @dev: Target device.
130 *
131 * Return %true if runtime PM is enabled for @dev and its runtime PM status is
132 * %RPM_ACTIVE, or %false otherwise.
133 *
134 * Note that the return value of this function can only be trusted if it is
135 * called under the runtime PM lock of @dev or under conditions in which
136 * runtime PM cannot be either disabled or enabled for @dev and its runtime PM
137 * status cannot change.
138 */
ShuoX Liufbadc582013-01-23 21:49:37 +0100139static inline bool pm_runtime_active(struct device *dev)
140{
141 return dev->power.runtime_status == RPM_ACTIVE
142 || dev->power.disable_depth;
143}
144
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200145/**
146 * pm_runtime_status_suspended - Check if runtime PM status is "suspended".
147 * @dev: Target device.
148 *
149 * Return %true if the runtime PM status of @dev is %RPM_SUSPENDED, or %false
150 * otherwise, regardless of whether or not runtime PM has been enabled for @dev.
151 *
152 * Note that the return value of this function can only be trusted if it is
153 * called under the runtime PM lock of @dev or under conditions in which the
154 * runtime PM status of @dev cannot change.
155 */
Kevin Hilmanf3393b62011-07-12 11:17:09 +0200156static inline bool pm_runtime_status_suspended(struct device *dev)
157{
158 return dev->power.runtime_status == RPM_SUSPENDED;
159}
160
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200161/**
162 * pm_runtime_enabled - Check if runtime PM is enabled.
163 * @dev: Target device.
164 *
165 * Return %true if runtime PM is enabled for @dev or %false otherwise.
166 *
167 * Note that the return value of this function can only be trusted if it is
168 * called under the runtime PM lock of @dev or under conditions in which
169 * runtime PM cannot be either disabled or enabled for @dev.
170 */
Rafael J. Wysocki4b31db82010-12-24 15:04:06 +0100171static inline bool pm_runtime_enabled(struct device *dev)
172{
173 return !dev->power.disable_depth;
174}
175
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200176/**
177 * pm_runtime_has_no_callbacks - Check if runtime PM callbacks may be present.
178 * @dev: Target device.
179 *
180 * Return %true if @dev is a special device without runtime PM callbacks or
181 * %false otherwise.
182 */
Rafael J. Wysocki9a787542020-05-28 16:45:14 +0200183static inline bool pm_runtime_has_no_callbacks(struct device *dev)
Rafael J. Wysockicb8f51b2011-02-08 23:26:02 +0100184{
Rafael J. Wysocki9a787542020-05-28 16:45:14 +0200185 return dev->power.no_callbacks;
Rafael J. Wysockicb8f51b2011-02-08 23:26:02 +0100186}
187
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200188/**
189 * pm_runtime_mark_last_busy - Update the last access time of a device.
190 * @dev: Target device.
191 *
192 * Update the last access time of @dev used by the runtime PM autosuspend
193 * mechanism to the current time as returned by ktime_get_mono_fast_ns().
194 */
Alan Stern15bcb91d2010-09-25 23:35:21 +0200195static inline void pm_runtime_mark_last_busy(struct device *dev)
196{
Vincent Guittot15efb472019-01-30 18:26:02 +0100197 WRITE_ONCE(dev->power.last_busy, ktime_get_mono_fast_ns());
Alan Stern15bcb91d2010-09-25 23:35:21 +0200198}
199
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200200/**
201 * pm_runtime_is_irq_safe - Check if runtime PM can work in interrupt context.
202 * @dev: Target device.
203 *
204 * Return %true if @dev has been marked as an "IRQ-safe" device (with respect
205 * to runtime PM), in which case its runtime PM callabcks can be expected to
206 * work correctly when invoked from interrupt handlers.
207 */
Krzysztof Kozlowski3fb15812014-11-14 09:47:25 +0100208static inline bool pm_runtime_is_irq_safe(struct device *dev)
209{
210 return dev->power.irq_safe;
211}
212
Vincent Guittot8a62ffe2018-12-21 11:33:54 +0100213extern u64 pm_runtime_suspended_time(struct device *dev);
214
Rafael J. Wysockid30d8192014-11-27 22:38:05 +0100215#else /* !CONFIG_PM */
216
217static inline bool queue_pm_work(struct work_struct *work) { return false; }
218
219static inline int pm_generic_runtime_suspend(struct device *dev) { return 0; }
220static inline int pm_generic_runtime_resume(struct device *dev) { return 0; }
221static inline int pm_runtime_force_suspend(struct device *dev) { return 0; }
222static inline int pm_runtime_force_resume(struct device *dev) { return 0; }
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200223
Alan Stern140a6c92010-09-25 23:35:07 +0200224static inline int __pm_runtime_idle(struct device *dev, int rpmflags)
225{
226 return -ENOSYS;
227}
228static inline int __pm_runtime_suspend(struct device *dev, int rpmflags)
229{
230 return -ENOSYS;
231}
232static inline int __pm_runtime_resume(struct device *dev, int rpmflags)
233{
234 return 1;
235}
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200236static inline int pm_schedule_suspend(struct device *dev, unsigned int delay)
237{
238 return -ENOSYS;
239}
Rafael J. Wysockia436b6a2015-12-17 02:54:26 +0100240static inline int pm_runtime_get_if_in_use(struct device *dev)
241{
242 return -EINVAL;
243}
Sakari Ailusc1115662020-02-25 11:31:02 +0200244static inline int pm_runtime_get_if_active(struct device *dev,
245 bool ign_usage_count)
246{
247 return -EINVAL;
248}
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200249static inline int __pm_runtime_set_status(struct device *dev,
250 unsigned int status) { return 0; }
251static inline int pm_runtime_barrier(struct device *dev) { return 0; }
252static inline void pm_runtime_enable(struct device *dev) {}
253static inline void __pm_runtime_disable(struct device *dev, bool c) {}
Rafael J. Wysocki53823632010-01-23 22:02:51 +0100254static inline void pm_runtime_allow(struct device *dev) {}
255static inline void pm_runtime_forbid(struct device *dev) {}
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200256
Ulf Hansson372a12e2016-04-08 13:40:53 +0200257static inline void pm_suspend_ignore_children(struct device *dev, bool enable) {}
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200258static inline void pm_runtime_get_noresume(struct device *dev) {}
259static inline void pm_runtime_put_noidle(struct device *dev) {}
Rafael J. Wysockid690b2c2010-03-06 21:28:37 +0100260static inline bool pm_runtime_suspended(struct device *dev) { return false; }
ShuoX Liufbadc582013-01-23 21:49:37 +0100261static inline bool pm_runtime_active(struct device *dev) { return true; }
Kevin Hilmanf3393b62011-07-12 11:17:09 +0200262static inline bool pm_runtime_status_suspended(struct device *dev) { return false; }
Rafael J. Wysocki4b31db82010-12-24 15:04:06 +0100263static inline bool pm_runtime_enabled(struct device *dev) { return false; }
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200264
Alan Stern7490e442010-09-25 23:35:15 +0200265static inline void pm_runtime_no_callbacks(struct device *dev) {}
Alan Sternc7b61de2010-12-01 00:14:42 +0100266static inline void pm_runtime_irq_safe(struct device *dev) {}
Krzysztof Kozlowski3fb15812014-11-14 09:47:25 +0100267static inline bool pm_runtime_is_irq_safe(struct device *dev) { return false; }
Rafael J. Wysocki2f60ba72010-05-10 23:09:30 +0200268
Rafael J. Wysockicb8f51b2011-02-08 23:26:02 +0100269static inline bool pm_runtime_callbacks_present(struct device *dev) { return false; }
Alan Stern15bcb91d2010-09-25 23:35:21 +0200270static inline void pm_runtime_mark_last_busy(struct device *dev) {}
271static inline void __pm_runtime_use_autosuspend(struct device *dev,
272 bool use) {}
273static inline void pm_runtime_set_autosuspend_delay(struct device *dev,
274 int delay) {}
Vincent Guittot8234f672018-12-14 15:22:25 +0100275static inline u64 pm_runtime_autosuspend_expiration(
Alan Stern15bcb91d2010-09-25 23:35:21 +0200276 struct device *dev) { return 0; }
Ming Leie8234072013-02-22 16:34:11 -0800277static inline void pm_runtime_set_memalloc_noio(struct device *dev,
278 bool enable){}
Rafael J. Wysocki21d5c572016-10-30 17:32:31 +0100279static inline void pm_runtime_clean_up_links(struct device *dev) {}
Rafael J. Wysockib06c0b2f2018-06-12 10:24:13 +0200280static inline void pm_runtime_get_suppliers(struct device *dev) {}
281static inline void pm_runtime_put_suppliers(struct device *dev) {}
Rafael J. Wysockibaa88092016-10-30 17:32:43 +0100282static inline void pm_runtime_new_link(struct device *dev) {}
283static inline void pm_runtime_drop_link(struct device *dev) {}
Alan Stern15bcb91d2010-09-25 23:35:21 +0200284
Rafael J. Wysockid30d8192014-11-27 22:38:05 +0100285#endif /* !CONFIG_PM */
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200286
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200287/**
288 * pm_runtime_idle - Conditionally set up autosuspend of a device or suspend it.
289 * @dev: Target device.
290 *
291 * Invoke the "idle check" callback of @dev and, depending on its return value,
292 * set up autosuspend of @dev or suspend it (depending on whether or not
293 * autosuspend has been enabled for it).
294 */
Alan Stern140a6c92010-09-25 23:35:07 +0200295static inline int pm_runtime_idle(struct device *dev)
296{
297 return __pm_runtime_idle(dev, 0);
298}
299
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200300/**
301 * pm_runtime_suspend - Suspend a device synchronously.
302 * @dev: Target device.
303 */
Alan Stern140a6c92010-09-25 23:35:07 +0200304static inline int pm_runtime_suspend(struct device *dev)
305{
306 return __pm_runtime_suspend(dev, 0);
307}
308
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200309/**
310 * pm_runtime_autosuspend - Set up autosuspend of a device or suspend it.
311 * @dev: Target device.
312 *
313 * Set up autosuspend of @dev or suspend it (depending on whether or not
314 * autosuspend is enabled for it) without engaging its "idle check" callback.
315 */
Alan Stern15bcb91d2010-09-25 23:35:21 +0200316static inline int pm_runtime_autosuspend(struct device *dev)
317{
318 return __pm_runtime_suspend(dev, RPM_AUTO);
319}
320
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200321/**
322 * pm_runtime_resume - Resume a device synchronously.
323 * @dev: Target device.
324 */
Alan Stern140a6c92010-09-25 23:35:07 +0200325static inline int pm_runtime_resume(struct device *dev)
326{
327 return __pm_runtime_resume(dev, 0);
328}
329
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200330/**
331 * pm_request_idle - Queue up "idle check" execution for a device.
332 * @dev: Target device.
333 *
334 * Queue up a work item to run an equivalent of pm_runtime_idle() for @dev
335 * asynchronously.
336 */
Alan Stern140a6c92010-09-25 23:35:07 +0200337static inline int pm_request_idle(struct device *dev)
338{
339 return __pm_runtime_idle(dev, RPM_ASYNC);
340}
341
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200342/**
343 * pm_request_resume - Queue up runtime-resume of a device.
344 * @dev: Target device.
345 */
Alan Stern140a6c92010-09-25 23:35:07 +0200346static inline int pm_request_resume(struct device *dev)
347{
348 return __pm_runtime_resume(dev, RPM_ASYNC);
349}
350
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200351/**
352 * pm_request_autosuspend - Queue up autosuspend of a device.
353 * @dev: Target device.
354 *
355 * Queue up a work item to run an equivalent pm_runtime_autosuspend() for @dev
356 * asynchronously.
357 */
Ming Lei5fc62aa2010-09-29 00:12:22 +0200358static inline int pm_request_autosuspend(struct device *dev)
359{
360 return __pm_runtime_suspend(dev, RPM_ASYNC | RPM_AUTO);
361}
362
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200363/**
364 * pm_runtime_get - Bump up usage counter and queue up resume of a device.
365 * @dev: Target device.
366 *
367 * Bump up the runtime PM usage counter of @dev and queue up a work item to
368 * carry out runtime-resume of it.
369 */
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200370static inline int pm_runtime_get(struct device *dev)
371{
Alan Stern140a6c92010-09-25 23:35:07 +0200372 return __pm_runtime_resume(dev, RPM_GET_PUT | RPM_ASYNC);
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200373}
374
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200375/**
376 * pm_runtime_get_sync - Bump up usage counter of a device and resume it.
377 * @dev: Target device.
378 *
379 * Bump up the runtime PM usage counter of @dev and carry out runtime-resume of
380 * it synchronously.
381 *
382 * The possible return values of this function are the same as for
383 * pm_runtime_resume() and the runtime PM usage counter of @dev remains
384 * incremented in all cases, even if it returns an error code.
385 */
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200386static inline int pm_runtime_get_sync(struct device *dev)
387{
Alan Stern140a6c92010-09-25 23:35:07 +0200388 return __pm_runtime_resume(dev, RPM_GET_PUT);
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200389}
390
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200391/**
392 * pm_runtime_put - Drop device usage counter and queue up "idle check" if 0.
393 * @dev: Target device.
394 *
395 * Decrement the runtime PM usage counter of @dev and if it turns out to be
396 * equal to 0, queue up a work item for @dev like in pm_request_idle().
397 */
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200398static inline int pm_runtime_put(struct device *dev)
399{
Alan Stern140a6c92010-09-25 23:35:07 +0200400 return __pm_runtime_idle(dev, RPM_GET_PUT | RPM_ASYNC);
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200401}
402
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200403/**
404 * pm_runtime_put_autosuspend - Drop device usage counter and queue autosuspend if 0.
405 * @dev: Target device.
406 *
407 * Decrement the runtime PM usage counter of @dev and if it turns out to be
408 * equal to 0, queue up a work item for @dev like in pm_request_autosuspend().
409 */
Alan Stern15bcb91d2010-09-25 23:35:21 +0200410static inline int pm_runtime_put_autosuspend(struct device *dev)
411{
412 return __pm_runtime_suspend(dev,
413 RPM_GET_PUT | RPM_ASYNC | RPM_AUTO);
414}
415
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200416/**
417 * pm_runtime_put_sync - Drop device usage counter and run "idle check" if 0.
418 * @dev: Target device.
419 *
420 * Decrement the runtime PM usage counter of @dev and if it turns out to be
421 * equal to 0, invoke the "idle check" callback of @dev and, depending on its
422 * return value, set up autosuspend of @dev or suspend it (depending on whether
423 * or not autosuspend has been enabled for it).
424 *
425 * The possible return values of this function are the same as for
426 * pm_runtime_idle() and the runtime PM usage counter of @dev remains
427 * decremented in all cases, even if it returns an error code.
428 */
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200429static inline int pm_runtime_put_sync(struct device *dev)
430{
Alan Stern140a6c92010-09-25 23:35:07 +0200431 return __pm_runtime_idle(dev, RPM_GET_PUT);
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200432}
433
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200434/**
435 * pm_runtime_put_sync_suspend - Drop device usage counter and suspend if 0.
436 * @dev: Target device.
437 *
438 * Decrement the runtime PM usage counter of @dev and if it turns out to be
439 * equal to 0, carry out runtime-suspend of @dev synchronously.
440 *
441 * The possible return values of this function are the same as for
442 * pm_runtime_suspend() and the runtime PM usage counter of @dev remains
443 * decremented in all cases, even if it returns an error code.
444 */
Alan Sternc7b61de2010-12-01 00:14:42 +0100445static inline int pm_runtime_put_sync_suspend(struct device *dev)
446{
447 return __pm_runtime_suspend(dev, RPM_GET_PUT);
448}
449
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200450/**
451 * pm_runtime_put_sync_autosuspend - Drop device usage counter and autosuspend if 0.
452 * @dev: Target device.
453 *
454 * Decrement the runtime PM usage counter of @dev and if it turns out to be
455 * equal to 0, set up autosuspend of @dev or suspend it synchronously (depending
456 * on whether or not autosuspend has been enabled for it).
457 *
458 * The possible return values of this function are the same as for
459 * pm_runtime_autosuspend() and the runtime PM usage counter of @dev remains
460 * decremented in all cases, even if it returns an error code.
461 */
Alan Stern15bcb91d2010-09-25 23:35:21 +0200462static inline int pm_runtime_put_sync_autosuspend(struct device *dev)
463{
464 return __pm_runtime_suspend(dev, RPM_GET_PUT | RPM_AUTO);
465}
466
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200467/**
468 * pm_runtime_set_active - Set runtime PM status to "active".
469 * @dev: Target device.
470 *
471 * Set the runtime PM status of @dev to %RPM_ACTIVE and ensure that dependencies
472 * of it will be taken into account.
473 *
474 * It is not valid to call this function for devices with runtime PM enabled.
475 */
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200476static inline int pm_runtime_set_active(struct device *dev)
477{
478 return __pm_runtime_set_status(dev, RPM_ACTIVE);
479}
480
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200481/**
Bean Huoaa9c9b32020-10-20 17:00:27 +0200482 * pm_runtime_set_suspended - Set runtime PM status to "suspended".
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200483 * @dev: Target device.
484 *
485 * Set the runtime PM status of @dev to %RPM_SUSPENDED and ensure that
486 * dependencies of it will be taken into account.
487 *
488 * It is not valid to call this function for devices with runtime PM enabled.
489 */
Ulf Hanssonb1a60992016-10-17 20:17:00 +0200490static inline int pm_runtime_set_suspended(struct device *dev)
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200491{
Ulf Hanssonb1a60992016-10-17 20:17:00 +0200492 return __pm_runtime_set_status(dev, RPM_SUSPENDED);
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200493}
494
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200495/**
496 * pm_runtime_disable - Disable runtime PM for a device.
497 * @dev: Target device.
498 *
499 * Prevent the runtime PM framework from working with @dev (by incrementing its
500 * "blocking" counter).
501 *
502 * For each invocation of this function for @dev there must be a matching
503 * pm_runtime_enable() call in order for runtime PM to be enabled for it.
504 */
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200505static inline void pm_runtime_disable(struct device *dev)
506{
507 __pm_runtime_disable(dev, true);
508}
509
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200510/**
511 * pm_runtime_use_autosuspend - Allow autosuspend to be used for a device.
512 * @dev: Target device.
513 *
514 * Allow the runtime PM autosuspend mechanism to be used for @dev whenever
515 * requested (or "autosuspend" will be handled as direct runtime-suspend for
516 * it).
517 */
Alan Stern15bcb91d2010-09-25 23:35:21 +0200518static inline void pm_runtime_use_autosuspend(struct device *dev)
519{
520 __pm_runtime_use_autosuspend(dev, true);
521}
522
Rafael J. Wysocki403d2d12020-07-31 19:03:26 +0200523/**
524 * pm_runtime_dont_use_autosuspend - Prevent autosuspend from being used.
525 * @dev: Target device.
526 *
527 * Prevent the runtime PM autosuspend mechanism from being used for @dev which
528 * means that "autosuspend" will be handled as direct runtime-suspend for it
529 * going forward.
530 */
Alan Stern15bcb91d2010-09-25 23:35:21 +0200531static inline void pm_runtime_dont_use_autosuspend(struct device *dev)
532{
533 __pm_runtime_use_autosuspend(dev, false);
534}
535
Rafael J. Wysocki5e928f72009-08-18 23:38:32 +0200536#endif