diff options
Diffstat (limited to 'kernel/power/main.c')
-rw-r--r-- | kernel/power/main.c | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/kernel/power/main.c b/kernel/power/main.c index 6d295c776794..873228c71dab 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c | |||
@@ -16,6 +16,8 @@ | |||
16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
17 | #include <linux/pm.h> | 17 | #include <linux/pm.h> |
18 | #include <linux/console.h> | 18 | #include <linux/console.h> |
19 | #include <linux/cpu.h> | ||
20 | #include <linux/resume-trace.h> | ||
19 | 21 | ||
20 | #include "power.h" | 22 | #include "power.h" |
21 | 23 | ||
@@ -51,7 +53,7 @@ void pm_set_ops(struct pm_ops * ops) | |||
51 | 53 | ||
52 | static int suspend_prepare(suspend_state_t state) | 54 | static int suspend_prepare(suspend_state_t state) |
53 | { | 55 | { |
54 | int error = 0; | 56 | int error; |
55 | unsigned int free_pages; | 57 | unsigned int free_pages; |
56 | 58 | ||
57 | if (!pm_ops || !pm_ops->enter) | 59 | if (!pm_ops || !pm_ops->enter) |
@@ -59,12 +61,9 @@ static int suspend_prepare(suspend_state_t state) | |||
59 | 61 | ||
60 | pm_prepare_console(); | 62 | pm_prepare_console(); |
61 | 63 | ||
62 | disable_nonboot_cpus(); | 64 | error = disable_nonboot_cpus(); |
63 | 65 | if (error) | |
64 | if (num_online_cpus() != 1) { | ||
65 | error = -EPERM; | ||
66 | goto Enable_cpu; | 66 | goto Enable_cpu; |
67 | } | ||
68 | 67 | ||
69 | if (freeze_processes()) { | 68 | if (freeze_processes()) { |
70 | error = -EAGAIN; | 69 | error = -EAGAIN; |
@@ -283,10 +282,39 @@ static ssize_t state_store(struct subsystem * subsys, const char * buf, size_t n | |||
283 | 282 | ||
284 | power_attr(state); | 283 | power_attr(state); |
285 | 284 | ||
285 | #ifdef CONFIG_PM_TRACE | ||
286 | int pm_trace_enabled; | ||
287 | |||
288 | static ssize_t pm_trace_show(struct subsystem * subsys, char * buf) | ||
289 | { | ||
290 | return sprintf(buf, "%d\n", pm_trace_enabled); | ||
291 | } | ||
292 | |||
293 | static ssize_t | ||
294 | pm_trace_store(struct subsystem * subsys, const char * buf, size_t n) | ||
295 | { | ||
296 | int val; | ||
297 | |||
298 | if (sscanf(buf, "%d", &val) == 1) { | ||
299 | pm_trace_enabled = !!val; | ||
300 | return n; | ||
301 | } | ||
302 | return -EINVAL; | ||
303 | } | ||
304 | |||
305 | power_attr(pm_trace); | ||
306 | |||
307 | static struct attribute * g[] = { | ||
308 | &state_attr.attr, | ||
309 | &pm_trace_attr.attr, | ||
310 | NULL, | ||
311 | }; | ||
312 | #else | ||
286 | static struct attribute * g[] = { | 313 | static struct attribute * g[] = { |
287 | &state_attr.attr, | 314 | &state_attr.attr, |
288 | NULL, | 315 | NULL, |
289 | }; | 316 | }; |
317 | #endif /* CONFIG_PM_TRACE */ | ||
290 | 318 | ||
291 | static struct attribute_group attr_group = { | 319 | static struct attribute_group attr_group = { |
292 | .attrs = g, | 320 | .attrs = g, |