]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * drivers/base/power/runtime.c - Handling dynamic device power management. | |
3 | * | |
4 | * Copyright (c) 2003 Patrick Mochel | |
5 | * Copyright (c) 2003 Open Source Development Lab | |
6 | * | |
7 | */ | |
8 | ||
9 | #include <linux/device.h> | |
10 | #include "power.h" | |
11 | ||
12 | ||
13 | static void runtime_resume(struct device * dev) | |
14 | { | |
15 | dev_dbg(dev, "resuming\n"); | |
ca078bae | 16 | if (!dev->power.power_state.event) |
1da177e4 LT |
17 | return; |
18 | if (!resume_device(dev)) | |
ca078bae | 19 | dev->power.power_state = PMSG_ON; |
1da177e4 LT |
20 | } |
21 | ||
22 | ||
23 | /** | |
24 | * dpm_runtime_resume - Power one device back on. | |
25 | * @dev: Device. | |
26 | * | |
27 | * Bring one device back to the on state by first powering it | |
28 | * on, then restoring state. We only operate on devices that aren't | |
29 | * already on. | |
30 | * FIXME: We need to handle devices that are in an unknown state. | |
31 | */ | |
32 | ||
33 | void dpm_runtime_resume(struct device * dev) | |
34 | { | |
35 | down(&dpm_sem); | |
36 | runtime_resume(dev); | |
37 | up(&dpm_sem); | |
38 | } | |
979d5199 | 39 | EXPORT_SYMBOL(dpm_runtime_resume); |
1da177e4 LT |
40 | |
41 | ||
42 | /** | |
43 | * dpm_runtime_suspend - Put one device in low-power state. | |
44 | * @dev: Device. | |
45 | * @state: State to enter. | |
46 | */ | |
47 | ||
48 | int dpm_runtime_suspend(struct device * dev, pm_message_t state) | |
49 | { | |
50 | int error = 0; | |
51 | ||
52 | down(&dpm_sem); | |
ca078bae | 53 | if (dev->power.power_state.event == state.event) |
1da177e4 LT |
54 | goto Done; |
55 | ||
ca078bae | 56 | if (dev->power.power_state.event) |
1da177e4 LT |
57 | runtime_resume(dev); |
58 | ||
59 | if (!(error = suspend_device(dev, state))) | |
60 | dev->power.power_state = state; | |
61 | Done: | |
62 | up(&dpm_sem); | |
63 | return error; | |
64 | } | |
65 | ||
66 | ||
67 | /** | |
68 | * dpm_set_power_state - Update power_state field. | |
69 | * @dev: Device. | |
70 | * @state: Power state device is in. | |
71 | * | |
72 | * This is an update mechanism for drivers to notify the core | |
73 | * what power state a device is in. Device probing code may not | |
74 | * always be able to tell, but we need accurate information to | |
75 | * work reliably. | |
76 | */ | |
77 | void dpm_set_power_state(struct device * dev, pm_message_t state) | |
78 | { | |
79 | down(&dpm_sem); | |
80 | dev->power.power_state = state; | |
81 | up(&dpm_sem); | |
82 | } |