Blame view

include/linux/pm_runtime.h 18 KB
55716d264   Thomas Gleixner   treewide: Replace...
1
  /* SPDX-License-Identifier: GPL-2.0-only */
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
2
3
4
5
  /*
   * pm_runtime.h - Device run-time power management helper functions.
   *
   * Copyright (C) 2009 Rafael J. Wysocki <rjw@sisk.pl>
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
6
7
8
9
10
11
   */
  
  #ifndef _LINUX_PM_RUNTIME_H
  #define _LINUX_PM_RUNTIME_H
  
  #include <linux/device.h>
246359d37   Paul Gortmaker   pm_runtime.h: exp...
12
  #include <linux/notifier.h>
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
13
  #include <linux/pm.h>
15bcb91d7   Alan Stern   PM / Runtime: Imp...
14
  #include <linux/jiffies.h>
3f9af0513   Alan Stern   PM / Runtime: Rep...
15
16
17
18
  /* Runtime PM flag argument bits */
  #define RPM_ASYNC		0x01	/* Request is asynchronous */
  #define RPM_NOWAIT		0x02	/* Don't wait for concurrent
  					    state change */
140a6c945   Alan Stern   PM / Runtime: Com...
19
20
  #define RPM_GET_PUT		0x04	/* Increment/decrement the
  					    usage_count */
15bcb91d7   Alan Stern   PM / Runtime: Imp...
21
  #define RPM_AUTO		0x08	/* Use autosuspend_delay */
3f9af0513   Alan Stern   PM / Runtime: Rep...
22

717e5d458   Ulf Hansson   PM / Runtime: Imp...
23
  #ifdef CONFIG_PM
28cb5ef16   Rafael J. Wysocki   PM: Create PM wor...
24
25
26
27
28
29
  extern struct workqueue_struct *pm_wq;
  
  static inline bool queue_pm_work(struct work_struct *work)
  {
  	return queue_work(pm_wq, work);
  }
717e5d458   Ulf Hansson   PM / Runtime: Imp...
30
31
  extern int pm_generic_runtime_suspend(struct device *dev);
  extern int pm_generic_runtime_resume(struct device *dev);
37f204164   Ulf Hansson   PM: Add pm_runtim...
32
33
  extern int pm_runtime_force_suspend(struct device *dev);
  extern int pm_runtime_force_resume(struct device *dev);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
34

140a6c945   Alan Stern   PM / Runtime: Com...
35
36
37
  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);
c111566be   Sakari Ailus   PM: runtime: Add ...
38
  extern int pm_runtime_get_if_active(struct device *dev, bool ign_usage_count);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
39
  extern int pm_schedule_suspend(struct device *dev, unsigned int delay);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
40
41
42
43
  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   Rafael J. Wysocki   PM / Runtime: Add...
44
45
  extern void pm_runtime_allow(struct device *dev);
  extern void pm_runtime_forbid(struct device *dev);
7490e4423   Alan Stern   PM / Runtime: Add...
46
  extern void pm_runtime_no_callbacks(struct device *dev);
c7b61de5b   Alan Stern   PM / Runtime: Add...
47
  extern void pm_runtime_irq_safe(struct device *dev);
15bcb91d7   Alan Stern   PM / Runtime: Imp...
48
49
  extern void __pm_runtime_use_autosuspend(struct device *dev, bool use);
  extern void pm_runtime_set_autosuspend_delay(struct device *dev, int delay);
8234f6734   Vincent Guittot   PM-runtime: Switc...
50
  extern u64 pm_runtime_autosuspend_expiration(struct device *dev);
00dc9ad18   Rafael J. Wysocki   PM / Runtime: Use...
51
52
  extern void pm_runtime_update_max_time_suspended(struct device *dev,
  						 s64 delta_ns);
e823407f7   Ming Lei   pm / runtime: int...
53
  extern void pm_runtime_set_memalloc_noio(struct device *dev, bool enable);
b06c0b2f0   Rafael J. Wysocki   Revert "PM / runt...
54
55
  extern void pm_runtime_get_suppliers(struct device *dev);
  extern void pm_runtime_put_suppliers(struct device *dev);
baa8809f6   Rafael J. Wysocki   PM / runtime: Opt...
56
  extern void pm_runtime_new_link(struct device *dev);
e0e398e20   Rafael J. Wysocki   PM: runtime: Drop...
57
  extern void pm_runtime_drop_link(struct device_link *link);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
58

403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
59
60
61
62
63
64
65
  /**
   * pm_runtime_get_if_in_use - Conditionally bump up runtime PM usage counter.
   * @dev: Target device.
   *
   * Increment the runtime PM usage counter of @dev if its runtime PM status is
   * %RPM_ACTIVE and its runtime PM usage counter is greater than 0.
   */
c111566be   Sakari Ailus   PM: runtime: Add ...
66
67
68
69
  static inline int pm_runtime_get_if_in_use(struct device *dev)
  {
  	return pm_runtime_get_if_active(dev, false);
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
70
71
72
73
74
75
76
77
78
  /**
   * pm_suspend_ignore_children - Set runtime PM behavior regarding children.
   * @dev: Target device.
   * @enable: Whether or not to ignore possible dependencies on children.
   *
   * The dependencies of @dev on its children will not be taken into account by
   * the runtime PM framework going forward if @enable is %true, or they will
   * be taken into account otherwise.
   */
372a12ed9   Ulf Hansson   PM / Runtime: Mov...
79
80
81
82
  static inline void pm_suspend_ignore_children(struct device *dev, bool enable)
  {
  	dev->power.ignore_children = enable;
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
83
84
85
86
  /**
   * pm_runtime_get_noresume - Bump up runtime PM usage counter of a device.
   * @dev: Target device.
   */
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
87
88
89
90
  static inline void pm_runtime_get_noresume(struct device *dev)
  {
  	atomic_inc(&dev->power.usage_count);
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
91
92
93
94
95
96
  /**
   * pm_runtime_put_noidle - Drop runtime PM usage counter of a device.
   * @dev: Target device.
   *
   * Decrement the runtime PM usage counter of @dev unless it is 0 already.
   */
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
97
98
99
100
  static inline void pm_runtime_put_noidle(struct device *dev)
  {
  	atomic_add_unless(&dev->power.usage_count, -1, 0);
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
101
102
103
104
105
106
107
108
109
110
111
112
  /**
   * pm_runtime_suspended - Check whether or not a device is runtime-suspended.
   * @dev: Target device.
   *
   * Return %true if runtime PM is enabled for @dev and its runtime PM status is
   * %RPM_SUSPENDED, or %false otherwise.
   *
   * Note that the return value of this function can only be trusted if it is
   * called under the runtime PM lock of @dev or under conditions in which
   * runtime PM cannot be either disabled or enabled for @dev and its runtime PM
   * status cannot change.
   */
d690b2cd2   Rafael J. Wysocki   PM: Provide gener...
113
114
  static inline bool pm_runtime_suspended(struct device *dev)
  {
f08f5a0ad   Rafael J. Wysocki   PM / Runtime: Fix...
115
116
  	return dev->power.runtime_status == RPM_SUSPENDED
  		&& !dev->power.disable_depth;
d690b2cd2   Rafael J. Wysocki   PM: Provide gener...
117
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
118
119
120
121
122
123
124
125
126
127
128
129
  /**
   * pm_runtime_active - Check whether or not a device is runtime-active.
   * @dev: Target device.
   *
   * Return %true if runtime PM is enabled for @dev and its runtime PM status is
   * %RPM_ACTIVE, or %false otherwise.
   *
   * Note that the return value of this function can only be trusted if it is
   * called under the runtime PM lock of @dev or under conditions in which
   * runtime PM cannot be either disabled or enabled for @dev and its runtime PM
   * status cannot change.
   */
fbadc58dd   ShuoX Liu   PM / Runtime: Add...
130
131
132
133
134
  static inline bool pm_runtime_active(struct device *dev)
  {
  	return dev->power.runtime_status == RPM_ACTIVE
  		|| dev->power.disable_depth;
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
135
136
137
138
139
140
141
142
143
144
145
  /**
   * pm_runtime_status_suspended - Check if runtime PM status is "suspended".
   * @dev: Target device.
   *
   * Return %true if the runtime PM status of @dev is %RPM_SUSPENDED, or %false
   * otherwise, regardless of whether or not runtime PM has been enabled for @dev.
   *
   * Note that the return value of this function can only be trusted if it is
   * called under the runtime PM lock of @dev or under conditions in which the
   * runtime PM status of @dev cannot change.
   */
f3393b62f   Kevin Hilman   PM / Runtime: Add...
146
147
148
149
  static inline bool pm_runtime_status_suspended(struct device *dev)
  {
  	return dev->power.runtime_status == RPM_SUSPENDED;
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
150
151
152
153
154
155
156
157
158
159
  /**
   * pm_runtime_enabled - Check if runtime PM is enabled.
   * @dev: Target device.
   *
   * Return %true if runtime PM is enabled for @dev or %false otherwise.
   *
   * Note that the return value of this function can only be trusted if it is
   * called under the runtime PM lock of @dev or under conditions in which
   * runtime PM cannot be either disabled or enabled for @dev.
   */
4b31db8a1   Rafael J. Wysocki   PM / Runtime: Gen...
160
161
162
163
  static inline bool pm_runtime_enabled(struct device *dev)
  {
  	return !dev->power.disable_depth;
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
164
165
166
167
168
169
170
  /**
   * pm_runtime_has_no_callbacks - Check if runtime PM callbacks may be present.
   * @dev: Target device.
   *
   * Return %true if @dev is a special device without runtime PM callbacks or
   * %false otherwise.
   */
9a7875461   Rafael J. Wysocki   PM: runtime: Repl...
171
  static inline bool pm_runtime_has_no_callbacks(struct device *dev)
cb8f51bda   Rafael J. Wysocki   PM: Do not create...
172
  {
9a7875461   Rafael J. Wysocki   PM: runtime: Repl...
173
  	return dev->power.no_callbacks;
cb8f51bda   Rafael J. Wysocki   PM: Do not create...
174
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
175
176
177
178
179
180
181
  /**
   * pm_runtime_mark_last_busy - Update the last access time of a device.
   * @dev: Target device.
   *
   * Update the last access time of @dev used by the runtime PM autosuspend
   * mechanism to the current time as returned by ktime_get_mono_fast_ns().
   */
15bcb91d7   Alan Stern   PM / Runtime: Imp...
182
183
  static inline void pm_runtime_mark_last_busy(struct device *dev)
  {
15efb47dc   Vincent Guittot   PM-runtime: Fix d...
184
  	WRITE_ONCE(dev->power.last_busy, ktime_get_mono_fast_ns());
15bcb91d7   Alan Stern   PM / Runtime: Imp...
185
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
186
187
188
189
190
191
192
193
  /**
   * pm_runtime_is_irq_safe - Check if runtime PM can work in interrupt context.
   * @dev: Target device.
   *
   * Return %true if @dev has been marked as an "IRQ-safe" device (with respect
   * to runtime PM), in which case its runtime PM callabcks can be expected to
   * work correctly when invoked from interrupt handlers.
   */
3fb1581ea   Krzysztof Kozlowski   ARM: 8199/1: PM /...
194
195
196
197
  static inline bool pm_runtime_is_irq_safe(struct device *dev)
  {
  	return dev->power.irq_safe;
  }
8a62ffe27   Vincent Guittot   PM-runtime: Add n...
198
  extern u64 pm_runtime_suspended_time(struct device *dev);
d30d819dc   Rafael J. Wysocki   PM: Drop CONFIG_P...
199
200
201
202
203
204
205
206
  #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   Rafael J. Wysocki   PM: Introduce cor...
207

140a6c945   Alan Stern   PM / Runtime: Com...
208
209
210
211
212
213
214
215
216
217
218
219
  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   Rafael J. Wysocki   PM: Introduce cor...
220
221
222
223
  static inline int pm_schedule_suspend(struct device *dev, unsigned int delay)
  {
  	return -ENOSYS;
  }
a436b6a19   Rafael J. Wysocki   PM / runtime: Add...
224
225
226
227
  static inline int pm_runtime_get_if_in_use(struct device *dev)
  {
  	return -EINVAL;
  }
c111566be   Sakari Ailus   PM: runtime: Add ...
228
229
230
231
232
  static inline int pm_runtime_get_if_active(struct device *dev,
  					   bool ign_usage_count)
  {
  	return -EINVAL;
  }
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
233
234
235
236
237
  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   Rafael J. Wysocki   PM / Runtime: Add...
238
239
  static inline void pm_runtime_allow(struct device *dev) {}
  static inline void pm_runtime_forbid(struct device *dev) {}
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
240

372a12ed9   Ulf Hansson   PM / Runtime: Mov...
241
  static inline void pm_suspend_ignore_children(struct device *dev, bool enable) {}
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
242
243
  static inline void pm_runtime_get_noresume(struct device *dev) {}
  static inline void pm_runtime_put_noidle(struct device *dev) {}
d690b2cd2   Rafael J. Wysocki   PM: Provide gener...
244
  static inline bool pm_runtime_suspended(struct device *dev) { return false; }
fbadc58dd   ShuoX Liu   PM / Runtime: Add...
245
  static inline bool pm_runtime_active(struct device *dev) { return true; }
f3393b62f   Kevin Hilman   PM / Runtime: Add...
246
  static inline bool pm_runtime_status_suspended(struct device *dev) { return false; }
4b31db8a1   Rafael J. Wysocki   PM / Runtime: Gen...
247
  static inline bool pm_runtime_enabled(struct device *dev) { return false; }
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
248

7490e4423   Alan Stern   PM / Runtime: Add...
249
  static inline void pm_runtime_no_callbacks(struct device *dev) {}
c7b61de5b   Alan Stern   PM / Runtime: Add...
250
  static inline void pm_runtime_irq_safe(struct device *dev) {}
3fb1581ea   Krzysztof Kozlowski   ARM: 8199/1: PM /...
251
  static inline bool pm_runtime_is_irq_safe(struct device *dev) { return false; }
2f60ba706   Rafael J. Wysocki   i2c: Fix bus-leve...
252

cb8f51bda   Rafael J. Wysocki   PM: Do not create...
253
  static inline bool pm_runtime_callbacks_present(struct device *dev) { return false; }
15bcb91d7   Alan Stern   PM / Runtime: Imp...
254
255
256
257
258
  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) {}
8234f6734   Vincent Guittot   PM-runtime: Switc...
259
  static inline u64 pm_runtime_autosuspend_expiration(
15bcb91d7   Alan Stern   PM / Runtime: Imp...
260
  				struct device *dev) { return 0; }
e823407f7   Ming Lei   pm / runtime: int...
261
262
  static inline void pm_runtime_set_memalloc_noio(struct device *dev,
  						bool enable){}
b06c0b2f0   Rafael J. Wysocki   Revert "PM / runt...
263
264
  static inline void pm_runtime_get_suppliers(struct device *dev) {}
  static inline void pm_runtime_put_suppliers(struct device *dev) {}
baa8809f6   Rafael J. Wysocki   PM / runtime: Opt...
265
  static inline void pm_runtime_new_link(struct device *dev) {}
e0e398e20   Rafael J. Wysocki   PM: runtime: Drop...
266
  static inline void pm_runtime_drop_link(struct device_link *link) {}
15bcb91d7   Alan Stern   PM / Runtime: Imp...
267

d30d819dc   Rafael J. Wysocki   PM: Drop CONFIG_P...
268
  #endif /* !CONFIG_PM */
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
269

403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
270
271
272
273
274
275
276
277
  /**
   * pm_runtime_idle - Conditionally set up autosuspend of a device or suspend it.
   * @dev: Target device.
   *
   * Invoke the "idle check" callback of @dev and, depending on its return value,
   * set up autosuspend of @dev or suspend it (depending on whether or not
   * autosuspend has been enabled for it).
   */
140a6c945   Alan Stern   PM / Runtime: Com...
278
279
280
281
  static inline int pm_runtime_idle(struct device *dev)
  {
  	return __pm_runtime_idle(dev, 0);
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
282
283
284
285
  /**
   * pm_runtime_suspend - Suspend a device synchronously.
   * @dev: Target device.
   */
140a6c945   Alan Stern   PM / Runtime: Com...
286
287
288
289
  static inline int pm_runtime_suspend(struct device *dev)
  {
  	return __pm_runtime_suspend(dev, 0);
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
290
291
292
293
294
295
296
  /**
   * pm_runtime_autosuspend - Set up autosuspend of a device or suspend it.
   * @dev: Target device.
   *
   * Set up autosuspend of @dev or suspend it (depending on whether or not
   * autosuspend is enabled for it) without engaging its "idle check" callback.
   */
15bcb91d7   Alan Stern   PM / Runtime: Imp...
297
298
299
300
  static inline int pm_runtime_autosuspend(struct device *dev)
  {
  	return __pm_runtime_suspend(dev, RPM_AUTO);
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
301
302
303
304
  /**
   * pm_runtime_resume - Resume a device synchronously.
   * @dev: Target device.
   */
140a6c945   Alan Stern   PM / Runtime: Com...
305
306
307
308
  static inline int pm_runtime_resume(struct device *dev)
  {
  	return __pm_runtime_resume(dev, 0);
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
309
310
311
312
313
314
315
  /**
   * pm_request_idle - Queue up "idle check" execution for a device.
   * @dev: Target device.
   *
   * Queue up a work item to run an equivalent of pm_runtime_idle() for @dev
   * asynchronously.
   */
140a6c945   Alan Stern   PM / Runtime: Com...
316
317
318
319
  static inline int pm_request_idle(struct device *dev)
  {
  	return __pm_runtime_idle(dev, RPM_ASYNC);
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
320
321
322
323
  /**
   * pm_request_resume - Queue up runtime-resume of a device.
   * @dev: Target device.
   */
140a6c945   Alan Stern   PM / Runtime: Com...
324
325
326
327
  static inline int pm_request_resume(struct device *dev)
  {
  	return __pm_runtime_resume(dev, RPM_ASYNC);
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
328
329
330
331
332
333
334
  /**
   * pm_request_autosuspend - Queue up autosuspend of a device.
   * @dev: Target device.
   *
   * Queue up a work item to run an equivalent pm_runtime_autosuspend() for @dev
   * asynchronously.
   */
5fc62aad4   Ming Lei   PM: runtime: add ...
335
336
337
338
  static inline int pm_request_autosuspend(struct device *dev)
  {
  	return __pm_runtime_suspend(dev, RPM_ASYNC | RPM_AUTO);
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
339
340
341
342
343
344
345
  /**
   * pm_runtime_get - Bump up usage counter and queue up resume of a device.
   * @dev: Target device.
   *
   * Bump up the runtime PM usage counter of @dev and queue up a work item to
   * carry out runtime-resume of it.
   */
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
346
347
  static inline int pm_runtime_get(struct device *dev)
  {
140a6c945   Alan Stern   PM / Runtime: Com...
348
  	return __pm_runtime_resume(dev, RPM_GET_PUT | RPM_ASYNC);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
349
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
350
351
352
353
354
355
356
357
358
359
360
  /**
   * pm_runtime_get_sync - Bump up usage counter of a device and resume it.
   * @dev: Target device.
   *
   * Bump up the runtime PM usage counter of @dev and carry out runtime-resume of
   * it synchronously.
   *
   * The possible return values of this function are the same as for
   * pm_runtime_resume() and the runtime PM usage counter of @dev remains
   * incremented in all cases, even if it returns an error code.
   */
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
361
362
  static inline int pm_runtime_get_sync(struct device *dev)
  {
140a6c945   Alan Stern   PM / Runtime: Com...
363
  	return __pm_runtime_resume(dev, RPM_GET_PUT);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
364
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
365
  /**
dd8088d5a   Zhang Qilong   PM: runtime: Add ...
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
   * pm_runtime_resume_and_get - Bump up usage counter of a device and resume it.
   * @dev: Target device.
   *
   * Resume @dev synchronously and if that is successful, increment its runtime
   * PM usage counter. Return 0 if the runtime PM usage counter of @dev has been
   * incremented or a negative error code otherwise.
   */
  static inline int pm_runtime_resume_and_get(struct device *dev)
  {
  	int ret;
  
  	ret = __pm_runtime_resume(dev, RPM_GET_PUT);
  	if (ret < 0) {
  		pm_runtime_put_noidle(dev);
  		return ret;
  	}
  
  	return 0;
  }
  
  /**
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
387
388
389
390
391
392
   * pm_runtime_put - Drop device usage counter and queue up "idle check" if 0.
   * @dev: Target device.
   *
   * Decrement the runtime PM usage counter of @dev and if it turns out to be
   * equal to 0, queue up a work item for @dev like in pm_request_idle().
   */
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
393
394
  static inline int pm_runtime_put(struct device *dev)
  {
140a6c945   Alan Stern   PM / Runtime: Com...
395
  	return __pm_runtime_idle(dev, RPM_GET_PUT | RPM_ASYNC);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
396
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
397
398
399
400
401
402
403
  /**
   * pm_runtime_put_autosuspend - Drop device usage counter and queue autosuspend if 0.
   * @dev: Target device.
   *
   * Decrement the runtime PM usage counter of @dev and if it turns out to be
   * equal to 0, queue up a work item for @dev like in pm_request_autosuspend().
   */
15bcb91d7   Alan Stern   PM / Runtime: Imp...
404
405
406
407
408
  static inline int pm_runtime_put_autosuspend(struct device *dev)
  {
  	return __pm_runtime_suspend(dev,
  	    RPM_GET_PUT | RPM_ASYNC | RPM_AUTO);
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
409
410
411
412
413
414
415
416
417
418
419
420
421
  /**
   * pm_runtime_put_sync - Drop device usage counter and run "idle check" if 0.
   * @dev: Target device.
   *
   * Decrement the runtime PM usage counter of @dev and if it turns out to be
   * equal to 0, invoke the "idle check" callback of @dev and, depending on its
   * return value, set up autosuspend of @dev or suspend it (depending on whether
   * or not autosuspend has been enabled for it).
   *
   * The possible return values of this function are the same as for
   * pm_runtime_idle() and the runtime PM usage counter of @dev remains
   * decremented in all cases, even if it returns an error code.
   */
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
422
423
  static inline int pm_runtime_put_sync(struct device *dev)
  {
140a6c945   Alan Stern   PM / Runtime: Com...
424
  	return __pm_runtime_idle(dev, RPM_GET_PUT);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
425
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
426
427
428
429
430
431
432
433
434
435
436
  /**
   * pm_runtime_put_sync_suspend - Drop device usage counter and suspend if 0.
   * @dev: Target device.
   *
   * Decrement the runtime PM usage counter of @dev and if it turns out to be
   * equal to 0, carry out runtime-suspend of @dev synchronously.
   *
   * The possible return values of this function are the same as for
   * pm_runtime_suspend() and the runtime PM usage counter of @dev remains
   * decremented in all cases, even if it returns an error code.
   */
c7b61de5b   Alan Stern   PM / Runtime: Add...
437
438
439
440
  static inline int pm_runtime_put_sync_suspend(struct device *dev)
  {
  	return __pm_runtime_suspend(dev, RPM_GET_PUT);
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
441
442
443
444
445
446
447
448
449
450
451
452
  /**
   * pm_runtime_put_sync_autosuspend - Drop device usage counter and autosuspend if 0.
   * @dev: Target device.
   *
   * Decrement the runtime PM usage counter of @dev and if it turns out to be
   * equal to 0, set up autosuspend of @dev or suspend it synchronously (depending
   * on whether or not autosuspend has been enabled for it).
   *
   * The possible return values of this function are the same as for
   * pm_runtime_autosuspend() and the runtime PM usage counter of @dev remains
   * decremented in all cases, even if it returns an error code.
   */
15bcb91d7   Alan Stern   PM / Runtime: Imp...
453
454
455
456
  static inline int pm_runtime_put_sync_autosuspend(struct device *dev)
  {
  	return __pm_runtime_suspend(dev, RPM_GET_PUT | RPM_AUTO);
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
457
458
459
460
461
462
463
464
465
  /**
   * pm_runtime_set_active - Set runtime PM status to "active".
   * @dev: Target device.
   *
   * Set the runtime PM status of @dev to %RPM_ACTIVE and ensure that dependencies
   * of it will be taken into account.
   *
   * It is not valid to call this function for devices with runtime PM enabled.
   */
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
466
467
468
469
  static inline int pm_runtime_set_active(struct device *dev)
  {
  	return __pm_runtime_set_status(dev, RPM_ACTIVE);
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
470
  /**
aa9c9b3f3   Bean Huo   PM: runtime: Fix ...
471
   * pm_runtime_set_suspended - Set runtime PM status to "suspended".
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
472
473
474
475
476
477
478
   * @dev: Target device.
   *
   * Set the runtime PM status of @dev to %RPM_SUSPENDED and ensure that
   * dependencies of it will be taken into account.
   *
   * It is not valid to call this function for devices with runtime PM enabled.
   */
b1a60995a   Ulf Hansson   PM / Runtime: Con...
479
  static inline int pm_runtime_set_suspended(struct device *dev)
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
480
  {
b1a60995a   Ulf Hansson   PM / Runtime: Con...
481
  	return __pm_runtime_set_status(dev, RPM_SUSPENDED);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
482
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
483
484
485
486
487
488
489
490
491
492
  /**
   * pm_runtime_disable - Disable runtime PM for a device.
   * @dev: Target device.
   *
   * Prevent the runtime PM framework from working with @dev (by incrementing its
   * "blocking" counter).
   *
   * For each invocation of this function for @dev there must be a matching
   * pm_runtime_enable() call in order for runtime PM to be enabled for it.
   */
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
493
494
495
496
  static inline void pm_runtime_disable(struct device *dev)
  {
  	__pm_runtime_disable(dev, true);
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
497
498
499
500
501
502
503
504
  /**
   * pm_runtime_use_autosuspend - Allow autosuspend to be used for a device.
   * @dev: Target device.
   *
   * Allow the runtime PM autosuspend mechanism to be used for @dev whenever
   * requested (or "autosuspend" will be handled as direct runtime-suspend for
   * it).
   */
15bcb91d7   Alan Stern   PM / Runtime: Imp...
505
506
507
508
  static inline void pm_runtime_use_autosuspend(struct device *dev)
  {
  	__pm_runtime_use_autosuspend(dev, true);
  }
403d2d116   Rafael J. Wysocki   PM: runtime: Add ...
509
510
511
512
513
514
515
516
  /**
   * pm_runtime_dont_use_autosuspend - Prevent autosuspend from being used.
   * @dev: Target device.
   *
   * Prevent the runtime PM autosuspend mechanism from being used for @dev which
   * means that "autosuspend" will be handled as direct runtime-suspend for it
   * going forward.
   */
15bcb91d7   Alan Stern   PM / Runtime: Imp...
517
518
519
520
  static inline void pm_runtime_dont_use_autosuspend(struct device *dev)
  {
  	__pm_runtime_use_autosuspend(dev, false);
  }
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
521
  #endif