diff options
author | Andi Kleen <ak@linux.intel.com> | 2012-01-25 18:09:08 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2012-01-26 19:48:12 -0500 |
commit | 9061e0e16700ef228837e96987ff51794c956197 (patch) | |
tree | 53d2ffa0fbc64f404848f4bfeb964d84cf08de36 | |
parent | b66b8b9a4a79087dde1b358a016e5c8739ccf186 (diff) |
ACPI: Load acpi-cpufreq from processor driver automatically
The only left over hole in automatic cpufreq driver loading was the loading
of ACPI cpufreq. This driver should be loaded when ACPI supports a _PDC
method and the CPU vendor wants to use acpi cpufreq.
Simply add a request module call to the acpi processor core driver
when this is true. This seems like the simplest solution for this.
Cc: Len Brown <lenb@kernel.org>
Signed-off-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Thomas Renninger <trenn@suse.de>
Acked-by: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/acpi/processor_driver.c | 1 | ||||
-rw-r--r-- | drivers/acpi/processor_perflib.c | 22 | ||||
-rw-r--r-- | include/acpi/processor.h | 1 |
3 files changed, 24 insertions, 0 deletions
diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c index 0034ede38710..e6920d0aca53 100644 --- a/drivers/acpi/processor_driver.c +++ b/drivers/acpi/processor_driver.c | |||
@@ -497,6 +497,7 @@ static int __cpuinit acpi_processor_add(struct acpi_device *device) | |||
497 | 497 | ||
498 | #ifdef CONFIG_CPU_FREQ | 498 | #ifdef CONFIG_CPU_FREQ |
499 | acpi_processor_ppc_has_changed(pr, 0); | 499 | acpi_processor_ppc_has_changed(pr, 0); |
500 | acpi_processor_load_module(pr); | ||
500 | #endif | 501 | #endif |
501 | acpi_processor_get_throttling_info(pr); | 502 | acpi_processor_get_throttling_info(pr); |
502 | acpi_processor_get_limit_info(pr); | 503 | acpi_processor_get_limit_info(pr); |
diff --git a/drivers/acpi/processor_perflib.c b/drivers/acpi/processor_perflib.c index 85b32376dad7..0af48a8554cd 100644 --- a/drivers/acpi/processor_perflib.c +++ b/drivers/acpi/processor_perflib.c | |||
@@ -240,6 +240,28 @@ void acpi_processor_ppc_exit(void) | |||
240 | acpi_processor_ppc_status &= ~PPC_REGISTERED; | 240 | acpi_processor_ppc_status &= ~PPC_REGISTERED; |
241 | } | 241 | } |
242 | 242 | ||
243 | /* | ||
244 | * Do a quick check if the systems looks like it should use ACPI | ||
245 | * cpufreq. We look at a _PCT method being available, but don't | ||
246 | * do a whole lot of sanity checks. | ||
247 | */ | ||
248 | void acpi_processor_load_module(struct acpi_processor *pr) | ||
249 | { | ||
250 | static int requested; | ||
251 | acpi_status status = 0; | ||
252 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | ||
253 | |||
254 | if (!arch_has_acpi_pdc() || requested) | ||
255 | return; | ||
256 | status = acpi_evaluate_object(pr->handle, "_PCT", NULL, &buffer); | ||
257 | if (!ACPI_FAILURE(status)) { | ||
258 | printk(KERN_INFO PREFIX "Requesting acpi_cpufreq\n"); | ||
259 | request_module_nowait("acpi_cpufreq"); | ||
260 | requested = 1; | ||
261 | } | ||
262 | kfree(buffer.pointer); | ||
263 | } | ||
264 | |||
243 | static int acpi_processor_get_performance_control(struct acpi_processor *pr) | 265 | static int acpi_processor_get_performance_control(struct acpi_processor *pr) |
244 | { | 266 | { |
245 | int result = 0; | 267 | int result = 0; |
diff --git a/include/acpi/processor.h b/include/acpi/processor.h index 610f6fb1bbc2..da57fdcc57d2 100644 --- a/include/acpi/processor.h +++ b/include/acpi/processor.h | |||
@@ -224,6 +224,7 @@ struct acpi_processor_errata { | |||
224 | } piix4; | 224 | } piix4; |
225 | }; | 225 | }; |
226 | 226 | ||
227 | extern void acpi_processor_load_module(struct acpi_processor *pr); | ||
227 | extern int acpi_processor_preregister_performance(struct | 228 | extern int acpi_processor_preregister_performance(struct |
228 | acpi_processor_performance | 229 | acpi_processor_performance |
229 | __percpu *performance); | 230 | __percpu *performance); |