Blame view

include/linux/pm_runtime.h 7.85 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
25
26
  #ifdef CONFIG_PM
  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...
27
28
  extern int pm_runtime_force_suspend(struct device *dev);
  extern int pm_runtime_force_resume(struct device *dev);
717e5d458   Ulf Hansson   PM / Runtime: Imp...
29
30
31
  #else
  static inline int pm_generic_runtime_suspend(struct device *dev) { return 0; }
  static inline int pm_generic_runtime_resume(struct device *dev) { return 0; }
37f204164   Ulf Hansson   PM: Add pm_runtim...
32
33
  static inline int pm_runtime_force_suspend(struct device *dev) { return 0; }
  static inline int pm_runtime_force_resume(struct device *dev) { return 0; }
717e5d458   Ulf Hansson   PM / Runtime: Imp...
34
  #endif
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
35
36
37
  #ifdef CONFIG_PM_RUNTIME
  
  extern struct workqueue_struct *pm_wq;
140a6c945   Alan Stern   PM / Runtime: Com...
38
39
40
  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);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
41
  extern int pm_schedule_suspend(struct device *dev, unsigned int delay);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
42
43
44
45
  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...
46
47
  extern void pm_runtime_allow(struct device *dev);
  extern void pm_runtime_forbid(struct device *dev);
7490e4423   Alan Stern   PM / Runtime: Add...
48
  extern void pm_runtime_no_callbacks(struct device *dev);
c7b61de5b   Alan Stern   PM / Runtime: Add...
49
  extern void pm_runtime_irq_safe(struct device *dev);
15bcb91d7   Alan Stern   PM / Runtime: Imp...
50
51
52
  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...
53
54
  extern void pm_runtime_update_max_time_suspended(struct device *dev,
  						 s64 delta_ns);
e823407f7   Ming Lei   pm / runtime: int...
55
  extern void pm_runtime_set_memalloc_noio(struct device *dev, bool enable);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
56
57
58
59
60
61
  
  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...
62
63
64
65
66
67
68
69
70
  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 ...
71
72
73
74
75
76
77
78
79
  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...
80
81
  static inline bool pm_runtime_suspended(struct device *dev)
  {
f08f5a0ad   Rafael J. Wysocki   PM / Runtime: Fix...
82
83
  	return dev->power.runtime_status == RPM_SUSPENDED
  		&& !dev->power.disable_depth;
d690b2cd2   Rafael J. Wysocki   PM: Provide gener...
84
  }
fbadc58dd   ShuoX Liu   PM / Runtime: Add...
85
86
87
88
89
  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...
90
91
92
93
  static inline bool pm_runtime_status_suspended(struct device *dev)
  {
  	return dev->power.runtime_status == RPM_SUSPENDED;
  }
4b31db8a1   Rafael J. Wysocki   PM / Runtime: Gen...
94
95
96
97
  static inline bool pm_runtime_enabled(struct device *dev)
  {
  	return !dev->power.disable_depth;
  }
cb8f51bda   Rafael J. Wysocki   PM: Do not create...
98
99
100
101
  static inline bool pm_runtime_callbacks_present(struct device *dev)
  {
  	return !dev->power.no_callbacks;
  }
15bcb91d7   Alan Stern   PM / Runtime: Imp...
102
103
104
105
  static inline void pm_runtime_mark_last_busy(struct device *dev)
  {
  	ACCESS_ONCE(dev->power.last_busy) = jiffies;
  }
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
106
  #else /* !CONFIG_PM_RUNTIME */
140a6c945   Alan Stern   PM / Runtime: Com...
107
108
109
110
111
112
113
114
115
116
117
118
  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...
119
120
121
122
  static inline int pm_schedule_suspend(struct device *dev, unsigned int delay)
  {
  	return -ENOSYS;
  }
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
123
124
125
126
127
  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...
128
129
  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...
130
131
  
  static inline bool pm_children_suspended(struct device *dev) { return false; }
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
132
133
  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 ...
134
135
  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...
136
  static inline bool pm_runtime_suspended(struct device *dev) { return false; }
fbadc58dd   ShuoX Liu   PM / Runtime: Add...
137
  static inline bool pm_runtime_active(struct device *dev) { return true; }
f3393b62f   Kevin Hilman   PM / Runtime: Add...
138
  static inline bool pm_runtime_status_suspended(struct device *dev) { return false; }
4b31db8a1   Rafael J. Wysocki   PM / Runtime: Gen...
139
  static inline bool pm_runtime_enabled(struct device *dev) { return false; }
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
140

7490e4423   Alan Stern   PM / Runtime: Add...
141
  static inline void pm_runtime_no_callbacks(struct device *dev) {}
c7b61de5b   Alan Stern   PM / Runtime: Add...
142
  static inline void pm_runtime_irq_safe(struct device *dev) {}
2f60ba706   Rafael J. Wysocki   i2c: Fix bus-leve...
143

cb8f51bda   Rafael J. Wysocki   PM: Do not create...
144
  static inline bool pm_runtime_callbacks_present(struct device *dev) { return false; }
15bcb91d7   Alan Stern   PM / Runtime: Imp...
145
146
147
148
149
150
151
  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...
152
153
  static inline void pm_runtime_set_memalloc_noio(struct device *dev,
  						bool enable){}
15bcb91d7   Alan Stern   PM / Runtime: Imp...
154

5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
155
  #endif /* !CONFIG_PM_RUNTIME */
140a6c945   Alan Stern   PM / Runtime: Com...
156
157
158
159
160
161
162
163
164
  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...
165
166
167
168
  static inline int pm_runtime_autosuspend(struct device *dev)
  {
  	return __pm_runtime_suspend(dev, RPM_AUTO);
  }
140a6c945   Alan Stern   PM / Runtime: Com...
169
170
171
172
173
174
175
176
177
178
179
180
181
182
  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 ...
183
184
185
186
  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...
187
188
  static inline int pm_runtime_get(struct device *dev)
  {
140a6c945   Alan Stern   PM / Runtime: Com...
189
  	return __pm_runtime_resume(dev, RPM_GET_PUT | RPM_ASYNC);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
190
191
192
193
  }
  
  static inline int pm_runtime_get_sync(struct device *dev)
  {
140a6c945   Alan Stern   PM / Runtime: Com...
194
  	return __pm_runtime_resume(dev, RPM_GET_PUT);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
195
196
197
198
  }
  
  static inline int pm_runtime_put(struct device *dev)
  {
140a6c945   Alan Stern   PM / Runtime: Com...
199
  	return __pm_runtime_idle(dev, RPM_GET_PUT | RPM_ASYNC);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
200
  }
15bcb91d7   Alan Stern   PM / Runtime: Imp...
201
202
203
204
205
  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...
206
207
  static inline int pm_runtime_put_sync(struct device *dev)
  {
140a6c945   Alan Stern   PM / Runtime: Com...
208
  	return __pm_runtime_idle(dev, RPM_GET_PUT);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
209
  }
c7b61de5b   Alan Stern   PM / Runtime: Add...
210
211
212
213
  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...
214
215
216
217
  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...
218
219
220
221
222
223
224
225
226
227
228
229
230
231
  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...
232
233
234
235
236
237
238
239
240
  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...
241
  #endif