diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c index 2b65e8c9d75f327b330147ae1aa92f23abc9dde0..92a37f230cac6fe94dacb567bbd9b1c49fa055be 100644 --- a/drivers/acpi/processor_core.c +++ b/drivers/acpi/processor_core.c @@ -627,7 +627,7 @@ acpi_processor_notify ( pr->performance_platform_limit); break; case ACPI_PROCESSOR_NOTIFY_POWER: - /* TBD */ + acpi_processor_cst_has_changed(pr); acpi_bus_generate_event(device, event, 0); break; default: diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 4883ecb738a85a302983755f634dd937fae7d051..5ca0c957ed682eb6c60087baa65f0e39251b5097 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c @@ -778,6 +778,32 @@ int acpi_processor_get_power_info ( return_VALUE(0); } +int acpi_processor_cst_has_changed (struct acpi_processor *pr) +{ + int result = 0; + + ACPI_FUNCTION_TRACE("acpi_processor_cst_has_changed"); + + if (!pr) + return_VALUE(-EINVAL); + + if (errata.smp) { + return_VALUE(-ENODEV); + } + + /* Fall back to the default idle loop */ + pm_idle = pm_idle_save; + pm_idle_save = NULL; + + pr->flags.power = 0; + result = acpi_processor_get_power_info(pr); + if (pr->flags.power == 1) { + pm_idle_save = pm_idle; + pm_idle = acpi_processor_idle; + } + + return_VALUE(result); +} /* proc interface */ @@ -859,3 +885,4 @@ struct file_operations acpi_processor_power_fops = { .llseek = seq_lseek, .release = single_release, }; + diff --git a/include/acpi/processor.h b/include/acpi/processor.h index 780e2ada96d82694f2dd34ccf9db82f01ce90188..97e86952dbe58517e67607877a4ca2dabd3325f3 100644 --- a/include/acpi/processor.h +++ b/include/acpi/processor.h @@ -215,6 +215,7 @@ void acpi_processor_idle (void); int acpi_processor_get_power_info (struct acpi_processor *pr); extern struct file_operations acpi_processor_power_fops; int no_c2c3(struct dmi_system_id *id); +int acpi_processor_cst_has_changed (struct acpi_processor *pr); /* in processor_thermal.c */ int acpi_processor_get_limit_info (struct acpi_processor *pr);