Blame view

include/linux/pm_runtime.h 7.42 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

5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
24
25
26
  #ifdef CONFIG_PM_RUNTIME
  
  extern struct workqueue_struct *pm_wq;
140a6c945   Alan Stern   PM / Runtime: Com...
27
28
29
  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...
30
  extern int pm_schedule_suspend(struct device *dev, unsigned int delay);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
31
32
33
34
  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...
35
36
  extern void pm_runtime_allow(struct device *dev);
  extern void pm_runtime_forbid(struct device *dev);
2f60ba706   Rafael J. Wysocki   i2c: Fix bus-leve...
37
38
39
  extern int pm_generic_runtime_idle(struct device *dev);
  extern int pm_generic_runtime_suspend(struct device *dev);
  extern int pm_generic_runtime_resume(struct device *dev);
7490e4423   Alan Stern   PM / Runtime: Add...
40
  extern void pm_runtime_no_callbacks(struct device *dev);
c7b61de5b   Alan Stern   PM / Runtime: Add...
41
  extern void pm_runtime_irq_safe(struct device *dev);
15bcb91d7   Alan Stern   PM / Runtime: Imp...
42
43
44
  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...
45
46
  extern void pm_runtime_update_max_time_suspended(struct device *dev,
  						 s64 delta_ns);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
47
48
49
50
51
52
  
  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...
53
54
55
56
57
58
59
60
61
  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 ...
62
63
64
65
66
67
68
69
70
  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...
71
72
  static inline bool pm_runtime_suspended(struct device *dev)
  {
f08f5a0ad   Rafael J. Wysocki   PM / Runtime: Fix...
73
74
  	return dev->power.runtime_status == RPM_SUSPENDED
  		&& !dev->power.disable_depth;
d690b2cd2   Rafael J. Wysocki   PM: Provide gener...
75
  }
f3393b62f   Kevin Hilman   PM / Runtime: Add...
76
77
78
79
  static inline bool pm_runtime_status_suspended(struct device *dev)
  {
  	return dev->power.runtime_status == RPM_SUSPENDED;
  }
4b31db8a1   Rafael J. Wysocki   PM / Runtime: Gen...
80
81
82
83
  static inline bool pm_runtime_enabled(struct device *dev)
  {
  	return !dev->power.disable_depth;
  }
cb8f51bda   Rafael J. Wysocki   PM: Do not create...
84
85
86
87
  static inline bool pm_runtime_callbacks_present(struct device *dev)
  {
  	return !dev->power.no_callbacks;
  }
15bcb91d7   Alan Stern   PM / Runtime: Imp...
88
89
90
91
  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...
92
  #else /* !CONFIG_PM_RUNTIME */
140a6c945   Alan Stern   PM / Runtime: Com...
93
94
95
96
97
98
99
100
101
102
103
104
  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...
105
106
107
108
  static inline int pm_schedule_suspend(struct device *dev, unsigned int delay)
  {
  	return -ENOSYS;
  }
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
109
110
111
112
113
  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...
114
115
  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...
116
117
  
  static inline bool pm_children_suspended(struct device *dev) { return false; }
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
118
119
  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 ...
120
121
  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...
122
  static inline bool pm_runtime_suspended(struct device *dev) { return false; }
f3393b62f   Kevin Hilman   PM / Runtime: Add...
123
  static inline bool pm_runtime_status_suspended(struct device *dev) { return false; }
4b31db8a1   Rafael J. Wysocki   PM / Runtime: Gen...
124
  static inline bool pm_runtime_enabled(struct device *dev) { return false; }
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
125

2f60ba706   Rafael J. Wysocki   i2c: Fix bus-leve...
126
127
128
  static inline int pm_generic_runtime_idle(struct device *dev) { return 0; }
  static inline int pm_generic_runtime_suspend(struct device *dev) { return 0; }
  static inline int pm_generic_runtime_resume(struct device *dev) { return 0; }
7490e4423   Alan Stern   PM / Runtime: Add...
129
  static inline void pm_runtime_no_callbacks(struct device *dev) {}
c7b61de5b   Alan Stern   PM / Runtime: Add...
130
  static inline void pm_runtime_irq_safe(struct device *dev) {}
2f60ba706   Rafael J. Wysocki   i2c: Fix bus-leve...
131

cb8f51bda   Rafael J. Wysocki   PM: Do not create...
132
  static inline bool pm_runtime_callbacks_present(struct device *dev) { return false; }
15bcb91d7   Alan Stern   PM / Runtime: Imp...
133
134
135
136
137
138
139
  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; }
00dc9ad18   Rafael J. Wysocki   PM / Runtime: Use...
140
141
  static inline void pm_runtime_update_max_time_suspended(struct device *dev,
  							s64 delta_ns) {}
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
142
  #endif /* !CONFIG_PM_RUNTIME */
140a6c945   Alan Stern   PM / Runtime: Com...
143
144
145
146
147
148
149
150
151
  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...
152
153
154
155
  static inline int pm_runtime_autosuspend(struct device *dev)
  {
  	return __pm_runtime_suspend(dev, RPM_AUTO);
  }
140a6c945   Alan Stern   PM / Runtime: Com...
156
157
158
159
160
161
162
163
164
165
166
167
168
169
  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 ...
170
171
172
173
  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...
174
175
  static inline int pm_runtime_get(struct device *dev)
  {
140a6c945   Alan Stern   PM / Runtime: Com...
176
  	return __pm_runtime_resume(dev, RPM_GET_PUT | RPM_ASYNC);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
177
178
179
180
  }
  
  static inline int pm_runtime_get_sync(struct device *dev)
  {
140a6c945   Alan Stern   PM / Runtime: Com...
181
  	return __pm_runtime_resume(dev, RPM_GET_PUT);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
182
183
184
185
  }
  
  static inline int pm_runtime_put(struct device *dev)
  {
140a6c945   Alan Stern   PM / Runtime: Com...
186
  	return __pm_runtime_idle(dev, RPM_GET_PUT | RPM_ASYNC);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
187
  }
15bcb91d7   Alan Stern   PM / Runtime: Imp...
188
189
190
191
192
  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...
193
194
  static inline int pm_runtime_put_sync(struct device *dev)
  {
140a6c945   Alan Stern   PM / Runtime: Com...
195
  	return __pm_runtime_idle(dev, RPM_GET_PUT);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
196
  }
c7b61de5b   Alan Stern   PM / Runtime: Add...
197
198
199
200
  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...
201
202
203
204
  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...
205
206
207
208
209
210
211
212
213
214
215
216
217
218
  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...
219
220
221
222
223
224
225
226
227
  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...
228
  #endif