94
95
* __pm_generic_call - Generic suspend/freeze/poweroff/thaw subsystem callback.
95
96
* @dev: Device to handle.
96
97
* @event: PM transition of the system under way.
98
* @bool: Whether or not this is the "noirq" stage.
98
100
* If the device has not been suspended at run time, execute the
99
101
* suspend/freeze/poweroff/thaw callback provided by its driver, if defined, and
100
102
* return its error code. Otherwise, return zero.
102
static int __pm_generic_call(struct device *dev, int event)
104
static int __pm_generic_call(struct device *dev, int event, bool noirq)
104
106
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
105
107
int (*callback)(struct device *);
134
* pm_generic_suspend_noirq - Generic suspend_noirq callback for subsystems.
135
* @dev: Device to suspend.
137
int pm_generic_suspend_noirq(struct device *dev)
139
return __pm_generic_call(dev, PM_EVENT_SUSPEND, true);
141
EXPORT_SYMBOL_GPL(pm_generic_suspend_noirq);
132
144
* pm_generic_suspend - Generic suspend callback for subsystems.
133
145
* @dev: Device to suspend.
135
147
int pm_generic_suspend(struct device *dev)
137
return __pm_generic_call(dev, PM_EVENT_SUSPEND);
149
return __pm_generic_call(dev, PM_EVENT_SUSPEND, false);
139
151
EXPORT_SYMBOL_GPL(pm_generic_suspend);
154
* pm_generic_freeze_noirq - Generic freeze_noirq callback for subsystems.
155
* @dev: Device to freeze.
157
int pm_generic_freeze_noirq(struct device *dev)
159
return __pm_generic_call(dev, PM_EVENT_FREEZE, true);
161
EXPORT_SYMBOL_GPL(pm_generic_freeze_noirq);
142
164
* pm_generic_freeze - Generic freeze callback for subsystems.
143
165
* @dev: Device to freeze.
145
167
int pm_generic_freeze(struct device *dev)
147
return __pm_generic_call(dev, PM_EVENT_FREEZE);
169
return __pm_generic_call(dev, PM_EVENT_FREEZE, false);
149
171
EXPORT_SYMBOL_GPL(pm_generic_freeze);
174
* pm_generic_poweroff_noirq - Generic poweroff_noirq callback for subsystems.
175
* @dev: Device to handle.
177
int pm_generic_poweroff_noirq(struct device *dev)
179
return __pm_generic_call(dev, PM_EVENT_HIBERNATE, true);
181
EXPORT_SYMBOL_GPL(pm_generic_poweroff_noirq);
152
184
* pm_generic_poweroff - Generic poweroff callback for subsystems.
153
185
* @dev: Device to handle.
155
187
int pm_generic_poweroff(struct device *dev)
157
return __pm_generic_call(dev, PM_EVENT_HIBERNATE);
189
return __pm_generic_call(dev, PM_EVENT_HIBERNATE, false);
159
191
EXPORT_SYMBOL_GPL(pm_generic_poweroff);
194
* pm_generic_thaw_noirq - Generic thaw_noirq callback for subsystems.
195
* @dev: Device to thaw.
197
int pm_generic_thaw_noirq(struct device *dev)
199
return __pm_generic_call(dev, PM_EVENT_THAW, true);
201
EXPORT_SYMBOL_GPL(pm_generic_thaw_noirq);
162
204
* pm_generic_thaw - Generic thaw callback for subsystems.
163
205
* @dev: Device to thaw.
165
207
int pm_generic_thaw(struct device *dev)
167
return __pm_generic_call(dev, PM_EVENT_THAW);
209
return __pm_generic_call(dev, PM_EVENT_THAW, false);
169
211
EXPORT_SYMBOL_GPL(pm_generic_thaw);
172
214
* __pm_generic_resume - Generic resume/restore callback for subsystems.
173
215
* @dev: Device to handle.
174
216
* @event: PM transition of the system under way.
217
* @bool: Whether or not this is the "noirq" stage.
176
219
* Execute the resume/resotre callback provided by the @dev's driver, if
177
220
* defined. If it returns 0, change the device's runtime PM status to 'active'.
178
221
* Return the callback's error code.
180
static int __pm_generic_resume(struct device *dev, int event)
223
static int __pm_generic_resume(struct device *dev, int event, bool noirq)
182
225
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
183
226
int (*callback)(struct device *);
258
* pm_generic_resume_noirq - Generic resume_noirq callback for subsystems.
259
* @dev: Device to resume.
261
int pm_generic_resume_noirq(struct device *dev)
263
return __pm_generic_resume(dev, PM_EVENT_RESUME, true);
265
EXPORT_SYMBOL_GPL(pm_generic_resume_noirq);
215
268
* pm_generic_resume - Generic resume callback for subsystems.
216
269
* @dev: Device to resume.
218
271
int pm_generic_resume(struct device *dev)
220
return __pm_generic_resume(dev, PM_EVENT_RESUME);
273
return __pm_generic_resume(dev, PM_EVENT_RESUME, false);
222
275
EXPORT_SYMBOL_GPL(pm_generic_resume);
278
* pm_generic_restore_noirq - Generic restore_noirq callback for subsystems.
279
* @dev: Device to restore.
281
int pm_generic_restore_noirq(struct device *dev)
283
return __pm_generic_resume(dev, PM_EVENT_RESTORE, true);
285
EXPORT_SYMBOL_GPL(pm_generic_restore_noirq);
225
288
* pm_generic_restore - Generic restore callback for subsystems.
226
289
* @dev: Device to restore.
228
291
int pm_generic_restore(struct device *dev)
230
return __pm_generic_resume(dev, PM_EVENT_RESTORE);
293
return __pm_generic_resume(dev, PM_EVENT_RESTORE, false);
232
295
EXPORT_SYMBOL_GPL(pm_generic_restore);
256
319
#ifdef CONFIG_PM_SLEEP
257
320
.prepare = pm_generic_prepare,
258
321
.suspend = pm_generic_suspend,
322
.suspend_noirq = pm_generic_suspend_noirq,
259
323
.resume = pm_generic_resume,
324
.resume_noirq = pm_generic_resume_noirq,
260
325
.freeze = pm_generic_freeze,
326
.freeze_noirq = pm_generic_freeze_noirq,
261
327
.thaw = pm_generic_thaw,
328
.thaw_noirq = pm_generic_thaw_noirq,
262
329
.poweroff = pm_generic_poweroff,
330
.poweroff_noirq = pm_generic_poweroff_noirq,
263
331
.restore = pm_generic_restore,
332
.restore_noirq = pm_generic_restore_noirq,
264
333
.complete = pm_generic_complete,
266
335
#ifdef CONFIG_PM_RUNTIME