diff options
-rw-r--r-- | drivers/acpi/processor_core.c | 2 | ||||
-rw-r--r-- | drivers/acpi/processor_idle.c | 19 | ||||
-rw-r--r-- | include/acpi/processor.h | 2 |
3 files changed, 22 insertions, 1 deletions
diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c index 2afb3d2086b3..9f11dc296cdd 100644 --- a/drivers/acpi/processor_core.c +++ b/drivers/acpi/processor_core.c | |||
@@ -102,6 +102,8 @@ static struct acpi_driver acpi_processor_driver = { | |||
102 | .add = acpi_processor_add, | 102 | .add = acpi_processor_add, |
103 | .remove = acpi_processor_remove, | 103 | .remove = acpi_processor_remove, |
104 | .start = acpi_processor_start, | 104 | .start = acpi_processor_start, |
105 | .suspend = acpi_processor_suspend, | ||
106 | .resume = acpi_processor_resume, | ||
105 | }, | 107 | }, |
106 | }; | 108 | }; |
107 | 109 | ||
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index d9b8af763e1e..f18261368e76 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
@@ -325,6 +325,23 @@ static void acpi_state_timer_broadcast(struct acpi_processor *pr, | |||
325 | 325 | ||
326 | #endif | 326 | #endif |
327 | 327 | ||
328 | /* | ||
329 | * Suspend / resume control | ||
330 | */ | ||
331 | static int acpi_idle_suspend; | ||
332 | |||
333 | int acpi_processor_suspend(struct acpi_device * device, pm_message_t state) | ||
334 | { | ||
335 | acpi_idle_suspend = 1; | ||
336 | return 0; | ||
337 | } | ||
338 | |||
339 | int acpi_processor_resume(struct acpi_device * device) | ||
340 | { | ||
341 | acpi_idle_suspend = 0; | ||
342 | return 0; | ||
343 | } | ||
344 | |||
328 | static void acpi_processor_idle(void) | 345 | static void acpi_processor_idle(void) |
329 | { | 346 | { |
330 | struct acpi_processor *pr = NULL; | 347 | struct acpi_processor *pr = NULL; |
@@ -355,7 +372,7 @@ static void acpi_processor_idle(void) | |||
355 | } | 372 | } |
356 | 373 | ||
357 | cx = pr->power.state; | 374 | cx = pr->power.state; |
358 | if (!cx) { | 375 | if (!cx || acpi_idle_suspend) { |
359 | if (pm_idle_save) | 376 | if (pm_idle_save) |
360 | pm_idle_save(); | 377 | pm_idle_save(); |
361 | else | 378 | else |
diff --git a/include/acpi/processor.h b/include/acpi/processor.h index ec3ffdadb4d2..99934a999e66 100644 --- a/include/acpi/processor.h +++ b/include/acpi/processor.h | |||
@@ -320,6 +320,8 @@ int acpi_processor_power_init(struct acpi_processor *pr, | |||
320 | int acpi_processor_cst_has_changed(struct acpi_processor *pr); | 320 | int acpi_processor_cst_has_changed(struct acpi_processor *pr); |
321 | int acpi_processor_power_exit(struct acpi_processor *pr, | 321 | int acpi_processor_power_exit(struct acpi_processor *pr, |
322 | struct acpi_device *device); | 322 | struct acpi_device *device); |
323 | int acpi_processor_suspend(struct acpi_device * device, pm_message_t state); | ||
324 | int acpi_processor_resume(struct acpi_device * device); | ||
323 | 325 | ||
324 | /* in processor_thermal.c */ | 326 | /* in processor_thermal.c */ |
325 | int acpi_processor_get_limit_info(struct acpi_processor *pr); | 327 | int acpi_processor_get_limit_info(struct acpi_processor *pr); |