Blame view

include/linux/pm_runtime.h 8.43 KB
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
1
2
3
4
5
6
7
8
9
10
11
12
13
  /*
   * 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>
  #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

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

2f60ba706   Rafael J. Wysocki   i2c: Fix bus-leve...
130
131
132
  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...
133
  static inline void pm_runtime_no_callbacks(struct device *dev) {}
c7b61de5b   Alan Stern   PM / Runtime: Add...
134
  static inline void pm_runtime_irq_safe(struct device *dev) {}
2f60ba706   Rafael J. Wysocki   i2c: Fix bus-leve...
135

cb8f51bda   Rafael J. Wysocki   PM: Do not create...
136
  static inline bool pm_runtime_callbacks_present(struct device *dev) { return false; }
15bcb91d7   Alan Stern   PM / Runtime: Imp...
137
138
139
140
141
142
143
  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; }
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
144
  #endif /* !CONFIG_PM_RUNTIME */
140a6c945   Alan Stern   PM / Runtime: Com...
145
146
147
148
149
150
151
152
153
  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...
154
155
156
157
  static inline int pm_runtime_autosuspend(struct device *dev)
  {
  	return __pm_runtime_suspend(dev, RPM_AUTO);
  }
140a6c945   Alan Stern   PM / Runtime: Com...
158
159
160
161
162
163
164
165
166
167
168
169
170
171
  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 ...
172
173
174
175
  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...
176
177
  static inline int pm_runtime_get(struct device *dev)
  {
140a6c945   Alan Stern   PM / Runtime: Com...
178
  	return __pm_runtime_resume(dev, RPM_GET_PUT | RPM_ASYNC);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
179
180
181
182
  }
  
  static inline int pm_runtime_get_sync(struct device *dev)
  {
140a6c945   Alan Stern   PM / Runtime: Com...
183
  	return __pm_runtime_resume(dev, RPM_GET_PUT);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
184
185
186
187
  }
  
  static inline int pm_runtime_put(struct device *dev)
  {
140a6c945   Alan Stern   PM / Runtime: Com...
188
  	return __pm_runtime_idle(dev, RPM_GET_PUT | RPM_ASYNC);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
189
  }
15bcb91d7   Alan Stern   PM / Runtime: Imp...
190
191
192
193
194
  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...
195
196
  static inline int pm_runtime_put_sync(struct device *dev)
  {
140a6c945   Alan Stern   PM / Runtime: Com...
197
  	return __pm_runtime_idle(dev, RPM_GET_PUT);
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
198
  }
c7b61de5b   Alan Stern   PM / Runtime: Add...
199
200
201
202
  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...
203
204
205
206
  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...
207
208
209
210
211
212
213
214
215
216
217
218
219
220
  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...
221
222
223
224
225
226
227
228
229
  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);
  }
85eb8c8d0   Rafael J. Wysocki   PM / Runtime: Gen...
230
231
  struct pm_clk_notifier_block {
  	struct notifier_block nb;
564b905ab   Rafael J. Wysocki   PM / Domains: Ren...
232
  	struct dev_pm_domain *pm_domain;
85eb8c8d0   Rafael J. Wysocki   PM / Runtime: Gen...
233
234
  	char *con_ids[];
  };
b7b95920a   Rafael J. Wysocki   PM: Allow the clo...
235
  #ifdef CONFIG_PM_CLK
3d5c30367   Rafael J. Wysocki   PM: Rename clock ...
236
237
238
239
240
241
  extern int pm_clk_init(struct device *dev);
  extern void pm_clk_destroy(struct device *dev);
  extern int pm_clk_add(struct device *dev, const char *con_id);
  extern void pm_clk_remove(struct device *dev, const char *con_id);
  extern int pm_clk_suspend(struct device *dev);
  extern int pm_clk_resume(struct device *dev);
85eb8c8d0   Rafael J. Wysocki   PM / Runtime: Gen...
242
  #else
3d5c30367   Rafael J. Wysocki   PM: Rename clock ...
243
  static inline int pm_clk_init(struct device *dev)
85eb8c8d0   Rafael J. Wysocki   PM / Runtime: Gen...
244
245
246
  {
  	return -EINVAL;
  }
3d5c30367   Rafael J. Wysocki   PM: Rename clock ...
247
  static inline void pm_clk_destroy(struct device *dev)
85eb8c8d0   Rafael J. Wysocki   PM / Runtime: Gen...
248
249
  {
  }
3d5c30367   Rafael J. Wysocki   PM: Rename clock ...
250
  static inline int pm_clk_add(struct device *dev, const char *con_id)
85eb8c8d0   Rafael J. Wysocki   PM / Runtime: Gen...
251
252
253
  {
  	return -EINVAL;
  }
3d5c30367   Rafael J. Wysocki   PM: Rename clock ...
254
  static inline void pm_clk_remove(struct device *dev, const char *con_id)
85eb8c8d0   Rafael J. Wysocki   PM / Runtime: Gen...
255
256
  {
  }
3d5c30367   Rafael J. Wysocki   PM: Rename clock ...
257
258
  #define pm_clk_suspend	NULL
  #define pm_clk_resume	NULL
85eb8c8d0   Rafael J. Wysocki   PM / Runtime: Gen...
259
260
261
  #endif
  
  #ifdef CONFIG_HAVE_CLK
3d5c30367   Rafael J. Wysocki   PM: Rename clock ...
262
  extern void pm_clk_add_notifier(struct bus_type *bus,
85eb8c8d0   Rafael J. Wysocki   PM / Runtime: Gen...
263
264
  					struct pm_clk_notifier_block *clknb);
  #else
3d5c30367   Rafael J. Wysocki   PM: Rename clock ...
265
  static inline void pm_clk_add_notifier(struct bus_type *bus,
85eb8c8d0   Rafael J. Wysocki   PM / Runtime: Gen...
266
267
268
269
  					struct pm_clk_notifier_block *clknb)
  {
  }
  #endif
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
270
  #endif