Blame view

include/linux/pm_runtime.h 7 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
  }
4b31db8a1   Rafael J. Wysocki   PM / Runtime: Gen...
79
80
81
82
  static inline bool pm_runtime_enabled(struct device *dev)
  {
  	return !dev->power.disable_depth;
  }
15bcb91d7   Alan Stern   PM / Runtime: Imp...
83
84
85
86
  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...
87
  #else /* !CONFIG_PM_RUNTIME */
140a6c945   Alan Stern   PM / Runtime: Com...
88
89
90
91
92
93
94
95
96
97
98
99
  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...
100
101
102
103
  static inline int pm_schedule_suspend(struct device *dev, unsigned int delay)
  {
  	return -ENOSYS;
  }
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
104
105
106
107
108
  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...
109
110
  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...
111
112
113
114
115
  
  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 ...
116
117
  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...
118
  static inline bool pm_runtime_suspended(struct device *dev) { return false; }
4b31db8a1   Rafael J. Wysocki   PM / Runtime: Gen...
119
  static inline bool pm_runtime_enabled(struct device *dev) { return false; }
5e928f77a   Rafael J. Wysocki   PM: Introduce cor...
120

2f60ba706   Rafael J. Wysocki   i2c: Fix bus-leve...
121
122
123
  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...
124
  static inline void pm_runtime_no_callbacks(struct device *dev) {}
c7b61de5b   Alan Stern   PM / Runtime: Add...
125
  static inline void pm_runtime_irq_safe(struct device *dev) {}
2f60ba706   Rafael J. Wysocki   i2c: Fix bus-leve...
126

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