Blame view

include/linux/pm_runtime.h 8.48 KB
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
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   Paul Gortmaker   pm_runtime.h: exp...
13
  #include <linux/notifier.h>
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
14
  #include <linux/pm.h>
15bcb91d7   Alan Stern   PM / Runtime: Imp...
15
  #include <linux/jiffies.h>
3f9af0513   Alan Stern   PM / Runtime: Rep...
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   Alan Stern   PM / Runtime: Com...
20
21
  #define RPM_GET_PUT		0x04	/* Increment/decrement the
  					    usage_count */
15bcb91d7   Alan Stern   PM / Runtime: Imp...
22
  #define RPM_AUTO		0x08	/* Use autosuspend_delay */
3f9af0513   Alan Stern   PM / Runtime: Rep...
23

717e5d458   Ulf Hansson   PM / Runtime: Imp...
24
  #ifdef CONFIG_PM
28cb5ef16   Rafael J. Wysocki   PM: Create PM wor...
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   Ulf Hansson   PM / Runtime: Imp...
31
32
  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...
33
34
  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...
35

140a6c945   Alan Stern   PM / Runtime: Com...
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   Rafael J. Wysocki   PM / runtime: Add...
39
  extern int pm_runtime_get_if_in_use(struct device *dev);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
40
  extern int pm_schedule_suspend(struct device *dev, unsigned int delay);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
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   Rafael J. Wysocki   PM / Runtime: Add...
45
46
  extern void pm_runtime_allow(struct device *dev);
  extern void pm_runtime_forbid(struct device *dev);
7490e4423   Alan Stern   PM / Runtime: Add...
47
  extern void pm_runtime_no_callbacks(struct device *dev);
c7b61de5b   Alan Stern   PM / Runtime: Add...
48
  extern void pm_runtime_irq_safe(struct device *dev);
15bcb91d7   Alan Stern   PM / Runtime: Imp...
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   Rafael J. Wysocki   PM / Runtime: Use...
52
53
  extern void pm_runtime_update_max_time_suspended(struct device *dev,
  						 s64 delta_ns);
e823407f7   Ming Lei   pm / runtime: int...
54
  extern void pm_runtime_set_memalloc_noio(struct device *dev, bool enable);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
55

372a12ed9   Ulf Hansson   PM / Runtime: Mov...
56
57
58
59
  static inline void pm_suspend_ignore_children(struct device *dev, bool enable)
  {
  	dev->power.ignore_children = enable;
  }
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
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   Rafael J. Wysocki   PM: Introduce cor...
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   Rafael J. Wysocki   PM: Add flag for ...
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   Rafael J. Wysocki   PM: Provide gener...
83
84
  static inline bool pm_runtime_suspended(struct device *dev)
  {
f08f5a0ad   Rafael J. Wysocki   PM / Runtime: Fix...
85
86
  	return dev->power.runtime_status == RPM_SUSPENDED
  		&& !dev->power.disable_depth;
d690b2cd2   Rafael J. Wysocki   PM: Provide gener...
87
  }
fbadc58dd   ShuoX Liu   PM / Runtime: Add...
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   Kevin Hilman   PM / Runtime: Add...
93
94
95
96
  static inline bool pm_runtime_status_suspended(struct device *dev)
  {
  	return dev->power.runtime_status == RPM_SUSPENDED;
  }
4b31db8a1   Rafael J. Wysocki   PM / Runtime: Gen...
97
98
99
100
  static inline bool pm_runtime_enabled(struct device *dev)
  {
  	return !dev->power.disable_depth;
  }
cb8f51bda   Rafael J. Wysocki   PM: Do not create...
101
102
103
104
  static inline bool pm_runtime_callbacks_present(struct device *dev)
  {
  	return !dev->power.no_callbacks;
  }
15bcb91d7   Alan Stern   PM / Runtime: Imp...
105
106
107
108
  static inline void pm_runtime_mark_last_busy(struct device *dev)
  {
  	ACCESS_ONCE(dev->power.last_busy) = jiffies;
  }
3fb1581ea   Krzysztof Kozlowski   ARM: 8199/1: PM /...
109
110
111
112
  static inline bool pm_runtime_is_irq_safe(struct device *dev)
  {
  	return dev->power.irq_safe;
  }
d30d819dc   Rafael J. Wysocki   PM: Drop CONFIG_P...
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   Rafael J. Wysocki   PM: Introduce cor...
121

140a6c945   Alan Stern   PM / Runtime: Com...
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   Rafael J. Wysocki   PM: Introduce cor...
134
135
136
137
  static inline int pm_schedule_suspend(struct device *dev, unsigned int delay)
  {
  	return -ENOSYS;
  }
a436b6a19   Rafael J. Wysocki   PM / runtime: Add...
138
139
140
141
  static inline int pm_runtime_get_if_in_use(struct device *dev)
  {
  	return -EINVAL;
  }
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
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   Rafael J. Wysocki   PM / Runtime: Add...
147
148
  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...
149

372a12ed9   Ulf Hansson   PM / Runtime: Mov...
150
  static inline void pm_suspend_ignore_children(struct device *dev, bool enable) {}
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
151
  static inline bool pm_children_suspended(struct device *dev) { return false; }
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
152
153
  static inline void pm_runtime_get_noresume(struct device *dev) {}
  static inline void pm_runtime_put_noidle(struct device *dev) {}
7a1a8eb58   Rafael J. Wysocki   PM: Add flag for ...
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   Rafael J. Wysocki   PM: Provide gener...
156
  static inline bool pm_runtime_suspended(struct device *dev) { return false; }
fbadc58dd   ShuoX Liu   PM / Runtime: Add...
157
  static inline bool pm_runtime_active(struct device *dev) { return true; }
f3393b62f   Kevin Hilman   PM / Runtime: Add...
158
  static inline bool pm_runtime_status_suspended(struct device *dev) { return false; }
4b31db8a1   Rafael J. Wysocki   PM / Runtime: Gen...
159
  static inline bool pm_runtime_enabled(struct device *dev) { return false; }
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
160

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

cb8f51bda   Rafael J. Wysocki   PM: Do not create...
165
  static inline bool pm_runtime_callbacks_present(struct device *dev) { return false; }
15bcb91d7   Alan Stern   PM / Runtime: Imp...
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   Ming Lei   pm / runtime: int...
173
174
  static inline void pm_runtime_set_memalloc_noio(struct device *dev,
  						bool enable){}
15bcb91d7   Alan Stern   PM / Runtime: Imp...
175

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

140a6c945   Alan Stern   PM / Runtime: Com...
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   Alan Stern   PM / Runtime: Imp...
187
188
189
190
  static inline int pm_runtime_autosuspend(struct device *dev)
  {
  	return __pm_runtime_suspend(dev, RPM_AUTO);
  }
140a6c945   Alan Stern   PM / Runtime: Com...
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   Ming Lei   PM: runtime: add ...
205
206
207
208
  static inline int pm_request_autosuspend(struct device *dev)
  {
  	return __pm_runtime_suspend(dev, RPM_ASYNC | RPM_AUTO);
  }
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
209
210
  static inline int pm_runtime_get(struct device *dev)
  {
140a6c945   Alan Stern   PM / Runtime: Com...
211
  	return __pm_runtime_resume(dev, RPM_GET_PUT | RPM_ASYNC);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
212
213
214
215
  }
  
  static inline int pm_runtime_get_sync(struct device *dev)
  {
140a6c945   Alan Stern   PM / Runtime: Com...
216
  	return __pm_runtime_resume(dev, RPM_GET_PUT);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
217
218
219
220
  }
  
  static inline int pm_runtime_put(struct device *dev)
  {
140a6c945   Alan Stern   PM / Runtime: Com...
221
  	return __pm_runtime_idle(dev, RPM_GET_PUT | RPM_ASYNC);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
222
  }
15bcb91d7   Alan Stern   PM / Runtime: Imp...
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   Rafael J. Wysocki   PM: Introduce cor...
228
229
  static inline int pm_runtime_put_sync(struct device *dev)
  {
140a6c945   Alan Stern   PM / Runtime: Com...
230
  	return __pm_runtime_idle(dev, RPM_GET_PUT);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
231
  }
c7b61de5b   Alan Stern   PM / Runtime: Add...
232
233
234
235
  static inline int pm_runtime_put_sync_suspend(struct device *dev)
  {
  	return __pm_runtime_suspend(dev, RPM_GET_PUT);
  }
15bcb91d7   Alan Stern   PM / Runtime: Imp...
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   Rafael J. Wysocki   PM: Introduce cor...
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   Alan Stern   PM / Runtime: Imp...
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   Rafael J. Wysocki   PM: Introduce cor...
263
  #endif