diff options
Diffstat (limited to 'kernel/power/main.c')
-rw-r--r-- | kernel/power/main.c | 48 |
1 files changed, 24 insertions, 24 deletions
diff --git a/kernel/power/main.c b/kernel/power/main.c index 350b485b3b60..3cdf95b1dc92 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/resume-trace.h> | 20 | #include <linux/resume-trace.h> |
21 | #include <linux/freezer.h> | 21 | #include <linux/freezer.h> |
22 | #include <linux/vmstat.h> | 22 | #include <linux/vmstat.h> |
23 | #include <linux/syscalls.h> | ||
23 | 24 | ||
24 | #include "power.h" | 25 | #include "power.h" |
25 | 26 | ||
@@ -32,39 +33,32 @@ DEFINE_MUTEX(pm_mutex); | |||
32 | /* This is just an arbitrary number */ | 33 | /* This is just an arbitrary number */ |
33 | #define FREE_PAGE_NUMBER (100) | 34 | #define FREE_PAGE_NUMBER (100) |
34 | 35 | ||
35 | struct pm_ops *pm_ops; | 36 | static struct platform_suspend_ops *suspend_ops; |
36 | 37 | ||
37 | /** | 38 | /** |
38 | * pm_set_ops - Set the global power method table. | 39 | * suspend_set_ops - Set the global suspend method table. |
39 | * @ops: Pointer to ops structure. | 40 | * @ops: Pointer to ops structure. |
40 | */ | 41 | */ |
41 | 42 | ||
42 | void pm_set_ops(struct pm_ops * ops) | 43 | void suspend_set_ops(struct platform_suspend_ops *ops) |
43 | { | 44 | { |
44 | mutex_lock(&pm_mutex); | 45 | mutex_lock(&pm_mutex); |
45 | pm_ops = ops; | 46 | suspend_ops = ops; |
46 | mutex_unlock(&pm_mutex); | 47 | mutex_unlock(&pm_mutex); |
47 | } | 48 | } |
48 | 49 | ||
49 | /** | 50 | /** |
50 | * pm_valid_only_mem - generic memory-only valid callback | 51 | * suspend_valid_only_mem - generic memory-only valid callback |
51 | * | 52 | * |
52 | * pm_ops drivers that implement mem suspend only and only need | 53 | * Platform drivers that implement mem suspend only and only need |
53 | * to check for that in their .valid callback can use this instead | 54 | * to check for that in their .valid callback can use this instead |
54 | * of rolling their own .valid callback. | 55 | * of rolling their own .valid callback. |
55 | */ | 56 | */ |
56 | int pm_valid_only_mem(suspend_state_t state) | 57 | int suspend_valid_only_mem(suspend_state_t state) |
57 | { | 58 | { |
58 | return state == PM_SUSPEND_MEM; | 59 | return state == PM_SUSPEND_MEM; |
59 | } | 60 | } |
60 | 61 | ||
61 | |||
62 | static inline void pm_finish(suspend_state_t state) | ||
63 | { | ||
64 | if (pm_ops->finish) | ||
65 | pm_ops->finish(state); | ||
66 | } | ||
67 | |||
68 | /** | 62 | /** |
69 | * suspend_prepare - Do prep work before entering low-power state. | 63 | * suspend_prepare - Do prep work before entering low-power state. |
70 | * | 64 | * |
@@ -76,7 +70,7 @@ static int suspend_prepare(void) | |||
76 | int error; | 70 | int error; |
77 | unsigned int free_pages; | 71 | unsigned int free_pages; |
78 | 72 | ||
79 | if (!pm_ops || !pm_ops->enter) | 73 | if (!suspend_ops || !suspend_ops->enter) |
80 | return -EPERM; | 74 | return -EPERM; |
81 | 75 | ||
82 | error = pm_notifier_call_chain(PM_SUSPEND_PREPARE); | 76 | error = pm_notifier_call_chain(PM_SUSPEND_PREPARE); |
@@ -128,7 +122,7 @@ void __attribute__ ((weak)) arch_suspend_enable_irqs(void) | |||
128 | * | 122 | * |
129 | * This function should be called after devices have been suspended. | 123 | * This function should be called after devices have been suspended. |
130 | */ | 124 | */ |
131 | int suspend_enter(suspend_state_t state) | 125 | static int suspend_enter(suspend_state_t state) |
132 | { | 126 | { |
133 | int error = 0; | 127 | int error = 0; |
134 | 128 | ||
@@ -139,7 +133,7 @@ int suspend_enter(suspend_state_t state) | |||
139 | printk(KERN_ERR "Some devices failed to power down\n"); | 133 | printk(KERN_ERR "Some devices failed to power down\n"); |
140 | goto Done; | 134 | goto Done; |
141 | } | 135 | } |
142 | error = pm_ops->enter(state); | 136 | error = suspend_ops->enter(state); |
143 | device_power_up(); | 137 | device_power_up(); |
144 | Done: | 138 | Done: |
145 | arch_suspend_enable_irqs(); | 139 | arch_suspend_enable_irqs(); |
@@ -156,11 +150,11 @@ int suspend_devices_and_enter(suspend_state_t state) | |||
156 | { | 150 | { |
157 | int error; | 151 | int error; |
158 | 152 | ||
159 | if (!pm_ops) | 153 | if (!suspend_ops) |
160 | return -ENOSYS; | 154 | return -ENOSYS; |
161 | 155 | ||
162 | if (pm_ops->set_target) { | 156 | if (suspend_ops->set_target) { |
163 | error = pm_ops->set_target(state); | 157 | error = suspend_ops->set_target(state); |
164 | if (error) | 158 | if (error) |
165 | return error; | 159 | return error; |
166 | } | 160 | } |
@@ -170,8 +164,8 @@ int suspend_devices_and_enter(suspend_state_t state) | |||
170 | printk(KERN_ERR "Some devices failed to suspend\n"); | 164 | printk(KERN_ERR "Some devices failed to suspend\n"); |
171 | goto Resume_console; | 165 | goto Resume_console; |
172 | } | 166 | } |
173 | if (pm_ops->prepare) { | 167 | if (suspend_ops->prepare) { |
174 | error = pm_ops->prepare(state); | 168 | error = suspend_ops->prepare(); |
175 | if (error) | 169 | if (error) |
176 | goto Resume_devices; | 170 | goto Resume_devices; |
177 | } | 171 | } |
@@ -180,7 +174,8 @@ int suspend_devices_and_enter(suspend_state_t state) | |||
180 | suspend_enter(state); | 174 | suspend_enter(state); |
181 | 175 | ||
182 | enable_nonboot_cpus(); | 176 | enable_nonboot_cpus(); |
183 | pm_finish(state); | 177 | if (suspend_ops->finish) |
178 | suspend_ops->finish(); | ||
184 | Resume_devices: | 179 | Resume_devices: |
185 | device_resume(); | 180 | device_resume(); |
186 | Resume_console: | 181 | Resume_console: |
@@ -214,7 +209,7 @@ static inline int valid_state(suspend_state_t state) | |||
214 | /* All states need lowlevel support and need to be valid | 209 | /* All states need lowlevel support and need to be valid |
215 | * to the lowlevel implementation, no valid callback | 210 | * to the lowlevel implementation, no valid callback |
216 | * implies that none are valid. */ | 211 | * implies that none are valid. */ |
217 | if (!pm_ops || !pm_ops->valid || !pm_ops->valid(state)) | 212 | if (!suspend_ops || !suspend_ops->valid || !suspend_ops->valid(state)) |
218 | return 0; | 213 | return 0; |
219 | return 1; | 214 | return 1; |
220 | } | 215 | } |
@@ -236,9 +231,14 @@ static int enter_state(suspend_state_t state) | |||
236 | 231 | ||
237 | if (!valid_state(state)) | 232 | if (!valid_state(state)) |
238 | return -ENODEV; | 233 | return -ENODEV; |
234 | |||
239 | if (!mutex_trylock(&pm_mutex)) | 235 | if (!mutex_trylock(&pm_mutex)) |
240 | return -EBUSY; | 236 | return -EBUSY; |
241 | 237 | ||
238 | printk("Syncing filesystems ... "); | ||
239 | sys_sync(); | ||
240 | printk("done.\n"); | ||
241 | |||
242 | pr_debug("PM: Preparing system for %s sleep\n", pm_states[state]); | 242 | pr_debug("PM: Preparing system for %s sleep\n", pm_states[state]); |
243 | if ((error = suspend_prepare())) | 243 | if ((error = suspend_prepare())) |
244 | goto Unlock; | 244 | goto Unlock; |