diff options
Diffstat (limited to 'kernel/power/main.c')
| -rw-r--r-- | kernel/power/main.c | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/kernel/power/main.c b/kernel/power/main.c index cdf0f07af92f..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; |
| @@ -145,7 +144,7 @@ static void suspend_finish(suspend_state_t state) | |||
| 145 | 144 | ||
| 146 | 145 | ||
| 147 | 146 | ||
| 148 | static char *pm_states[PM_SUSPEND_MAX] = { | 147 | static const char * const pm_states[PM_SUSPEND_MAX] = { |
| 149 | [PM_SUSPEND_STANDBY] = "standby", | 148 | [PM_SUSPEND_STANDBY] = "standby", |
| 150 | [PM_SUSPEND_MEM] = "mem", | 149 | [PM_SUSPEND_MEM] = "mem", |
| 151 | #ifdef CONFIG_SOFTWARE_SUSPEND | 150 | #ifdef CONFIG_SOFTWARE_SUSPEND |
| @@ -262,7 +261,7 @@ static ssize_t state_show(struct subsystem * subsys, char * buf) | |||
| 262 | static ssize_t state_store(struct subsystem * subsys, const char * buf, size_t n) | 261 | static ssize_t state_store(struct subsystem * subsys, const char * buf, size_t n) |
| 263 | { | 262 | { |
| 264 | suspend_state_t state = PM_SUSPEND_STANDBY; | 263 | suspend_state_t state = PM_SUSPEND_STANDBY; |
| 265 | char ** s; | 264 | const char * const *s; |
| 266 | char *p; | 265 | char *p; |
| 267 | int error; | 266 | int error; |
| 268 | int len; | 267 | int len; |
| @@ -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, |
