diff options
author | Jody McIntyre <scjody@modernduck.com> | 2005-12-05 15:52:41 -0500 |
---|---|---|
committer | Jody McIntyre <scjody@modernduck.com> | 2005-12-05 15:52:41 -0500 |
commit | c4fc108a8275f5eb77c9859725643a6870d20ef6 (patch) | |
tree | de7ce4af8e49ad2504fc270594124ec8ec874857 /drivers/acpi | |
parent | 741854e4f9a23421e194df8d846899172ff393d6 (diff) | |
parent | e4f5c82a92c2a546a16af1614114eec19120e40a (diff) |
Merge with http://kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
Diffstat (limited to 'drivers/acpi')
-rw-r--r-- | drivers/acpi/Kconfig | 1 | ||||
-rw-r--r-- | drivers/acpi/Makefile | 2 | ||||
-rw-r--r-- | drivers/acpi/processor_core.c | 15 | ||||
-rw-r--r-- | drivers/acpi/processor_idle.c | 51 | ||||
-rw-r--r-- | drivers/acpi/processor_thermal.c | 38 | ||||
-rw-r--r-- | drivers/acpi/scan.c | 2 | ||||
-rw-r--r-- | drivers/acpi/thermal.c | 163 | ||||
-rw-r--r-- | drivers/acpi/video.c | 2 |
8 files changed, 165 insertions, 109 deletions
diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig index fe1e8126fbae..fce21c257523 100644 --- a/drivers/acpi/Kconfig +++ b/drivers/acpi/Kconfig | |||
@@ -197,7 +197,6 @@ config ACPI_ASUS | |||
197 | config ACPI_IBM | 197 | config ACPI_IBM |
198 | tristate "IBM ThinkPad Laptop Extras" | 198 | tristate "IBM ThinkPad Laptop Extras" |
199 | depends on X86 | 199 | depends on X86 |
200 | default y | ||
201 | ---help--- | 200 | ---help--- |
202 | This is a Linux ACPI driver for the IBM ThinkPad laptops. It adds | 201 | This is a Linux ACPI driver for the IBM ThinkPad laptops. It adds |
203 | support for Fn-Fx key combinations, Bluetooth control, video | 202 | support for Fn-Fx key combinations, Bluetooth control, video |
diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile index a18243488c66..5984b4f6715a 100644 --- a/drivers/acpi/Makefile +++ b/drivers/acpi/Makefile | |||
@@ -16,7 +16,7 @@ EXTRA_CFLAGS += $(ACPI_CFLAGS) | |||
16 | # ACPI Boot-Time Table Parsing | 16 | # ACPI Boot-Time Table Parsing |
17 | # | 17 | # |
18 | obj-y += tables.o | 18 | obj-y += tables.o |
19 | obj-y += blacklist.o | 19 | obj-$(CONFIG_X86) += blacklist.o |
20 | 20 | ||
21 | # | 21 | # |
22 | # ACPI Core Subsystem (Interpreter) | 22 | # ACPI Core Subsystem (Interpreter) |
diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c index 421792562642..0c561c571f29 100644 --- a/drivers/acpi/processor_core.c +++ b/drivers/acpi/processor_core.c | |||
@@ -543,6 +543,8 @@ static int acpi_processor_get_info(struct acpi_processor *pr) | |||
543 | return_VALUE(0); | 543 | return_VALUE(0); |
544 | } | 544 | } |
545 | 545 | ||
546 | static void *processor_device_array[NR_CPUS]; | ||
547 | |||
546 | static int acpi_processor_start(struct acpi_device *device) | 548 | static int acpi_processor_start(struct acpi_device *device) |
547 | { | 549 | { |
548 | int result = 0; | 550 | int result = 0; |
@@ -561,6 +563,19 @@ static int acpi_processor_start(struct acpi_device *device) | |||
561 | 563 | ||
562 | BUG_ON((pr->id >= NR_CPUS) || (pr->id < 0)); | 564 | BUG_ON((pr->id >= NR_CPUS) || (pr->id < 0)); |
563 | 565 | ||
566 | /* | ||
567 | * Buggy BIOS check | ||
568 | * ACPI id of processors can be reported wrongly by the BIOS. | ||
569 | * Don't trust it blindly | ||
570 | */ | ||
571 | if (processor_device_array[pr->id] != NULL && | ||
572 | processor_device_array[pr->id] != (void *)device) { | ||
573 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "BIOS reporting wrong ACPI id" | ||
574 | "for the processor\n")); | ||
575 | return_VALUE(-ENODEV); | ||
576 | } | ||
577 | processor_device_array[pr->id] = (void *)device; | ||
578 | |||
564 | processors[pr->id] = pr; | 579 | processors[pr->id] = pr; |
565 | 580 | ||
566 | result = acpi_processor_add_fs(device); | 581 | result = acpi_processor_add_fs(device); |
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 70d8a6ec0920..5f51057518b0 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
@@ -169,15 +169,11 @@ acpi_processor_power_activate(struct acpi_processor *pr, | |||
169 | 169 | ||
170 | static void acpi_safe_halt(void) | 170 | static void acpi_safe_halt(void) |
171 | { | 171 | { |
172 | int polling = test_thread_flag(TIF_POLLING_NRFLAG); | 172 | clear_thread_flag(TIF_POLLING_NRFLAG); |
173 | if (polling) { | 173 | smp_mb__after_clear_bit(); |
174 | clear_thread_flag(TIF_POLLING_NRFLAG); | ||
175 | smp_mb__after_clear_bit(); | ||
176 | } | ||
177 | if (!need_resched()) | 174 | if (!need_resched()) |
178 | safe_halt(); | 175 | safe_halt(); |
179 | if (polling) | 176 | set_thread_flag(TIF_POLLING_NRFLAG); |
180 | set_thread_flag(TIF_POLLING_NRFLAG); | ||
181 | } | 177 | } |
182 | 178 | ||
183 | static atomic_t c3_cpu_count; | 179 | static atomic_t c3_cpu_count; |
@@ -280,11 +276,31 @@ static void acpi_processor_idle(void) | |||
280 | 276 | ||
281 | cx->usage++; | 277 | cx->usage++; |
282 | 278 | ||
279 | #ifdef CONFIG_HOTPLUG_CPU | ||
280 | /* | ||
281 | * Check for P_LVL2_UP flag before entering C2 and above on | ||
282 | * an SMP system. We do it here instead of doing it at _CST/P_LVL | ||
283 | * detection phase, to work cleanly with logical CPU hotplug. | ||
284 | */ | ||
285 | if ((cx->type != ACPI_STATE_C1) && (num_online_cpus() > 1) && | ||
286 | !pr->flags.has_cst && acpi_fadt.plvl2_up) | ||
287 | cx->type = ACPI_STATE_C1; | ||
288 | #endif | ||
283 | /* | 289 | /* |
284 | * Sleep: | 290 | * Sleep: |
285 | * ------ | 291 | * ------ |
286 | * Invoke the current Cx state to put the processor to sleep. | 292 | * Invoke the current Cx state to put the processor to sleep. |
287 | */ | 293 | */ |
294 | if (cx->type == ACPI_STATE_C2 || cx->type == ACPI_STATE_C3) { | ||
295 | clear_thread_flag(TIF_POLLING_NRFLAG); | ||
296 | smp_mb__after_clear_bit(); | ||
297 | if (need_resched()) { | ||
298 | set_thread_flag(TIF_POLLING_NRFLAG); | ||
299 | local_irq_enable(); | ||
300 | return; | ||
301 | } | ||
302 | } | ||
303 | |||
288 | switch (cx->type) { | 304 | switch (cx->type) { |
289 | 305 | ||
290 | case ACPI_STATE_C1: | 306 | case ACPI_STATE_C1: |
@@ -317,6 +333,7 @@ static void acpi_processor_idle(void) | |||
317 | t2 = inl(acpi_fadt.xpm_tmr_blk.address); | 333 | t2 = inl(acpi_fadt.xpm_tmr_blk.address); |
318 | /* Re-enable interrupts */ | 334 | /* Re-enable interrupts */ |
319 | local_irq_enable(); | 335 | local_irq_enable(); |
336 | set_thread_flag(TIF_POLLING_NRFLAG); | ||
320 | /* Compute time (ticks) that we were actually asleep */ | 337 | /* Compute time (ticks) that we were actually asleep */ |
321 | sleep_ticks = | 338 | sleep_ticks = |
322 | ticks_elapsed(t1, t2) - cx->latency_ticks - C2_OVERHEAD; | 339 | ticks_elapsed(t1, t2) - cx->latency_ticks - C2_OVERHEAD; |
@@ -356,6 +373,7 @@ static void acpi_processor_idle(void) | |||
356 | 373 | ||
357 | /* Re-enable interrupts */ | 374 | /* Re-enable interrupts */ |
358 | local_irq_enable(); | 375 | local_irq_enable(); |
376 | set_thread_flag(TIF_POLLING_NRFLAG); | ||
359 | /* Compute time (ticks) that we were actually asleep */ | 377 | /* Compute time (ticks) that we were actually asleep */ |
360 | sleep_ticks = | 378 | sleep_ticks = |
361 | ticks_elapsed(t1, t2) - cx->latency_ticks - C3_OVERHEAD; | 379 | ticks_elapsed(t1, t2) - cx->latency_ticks - C3_OVERHEAD; |
@@ -534,6 +552,15 @@ static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr) | |||
534 | pr->power.states[ACPI_STATE_C0].valid = 1; | 552 | pr->power.states[ACPI_STATE_C0].valid = 1; |
535 | pr->power.states[ACPI_STATE_C1].valid = 1; | 553 | pr->power.states[ACPI_STATE_C1].valid = 1; |
536 | 554 | ||
555 | #ifndef CONFIG_HOTPLUG_CPU | ||
556 | /* | ||
557 | * Check for P_LVL2_UP flag before entering C2 and above on | ||
558 | * an SMP system. | ||
559 | */ | ||
560 | if ((num_online_cpus() > 1) && acpi_fadt.plvl2_up) | ||
561 | return_VALUE(-ENODEV); | ||
562 | #endif | ||
563 | |||
537 | /* determine C2 and C3 address from pblk */ | 564 | /* determine C2 and C3 address from pblk */ |
538 | pr->power.states[ACPI_STATE_C2].address = pr->pblk + 4; | 565 | pr->power.states[ACPI_STATE_C2].address = pr->pblk + 4; |
539 | pr->power.states[ACPI_STATE_C3].address = pr->pblk + 5; | 566 | pr->power.states[ACPI_STATE_C3].address = pr->pblk + 5; |
@@ -690,7 +717,7 @@ static int acpi_processor_get_power_info_cst(struct acpi_processor *pr) | |||
690 | 717 | ||
691 | /* Validate number of power states discovered */ | 718 | /* Validate number of power states discovered */ |
692 | if (pr->power.count < 2) | 719 | if (pr->power.count < 2) |
693 | status = -ENODEV; | 720 | status = -EFAULT; |
694 | 721 | ||
695 | end: | 722 | end: |
696 | acpi_os_free(buffer.pointer); | 723 | acpi_os_free(buffer.pointer); |
@@ -841,11 +868,11 @@ static int acpi_processor_get_power_info(struct acpi_processor *pr) | |||
841 | * this function */ | 868 | * this function */ |
842 | 869 | ||
843 | result = acpi_processor_get_power_info_cst(pr); | 870 | result = acpi_processor_get_power_info_cst(pr); |
844 | if ((result) || (acpi_processor_power_verify(pr) < 2)) { | 871 | if (result == -ENODEV) |
845 | result = acpi_processor_get_power_info_fadt(pr); | 872 | result = acpi_processor_get_power_info_fadt(pr); |
846 | if ((result) || (acpi_processor_power_verify(pr) < 2)) | 873 | |
847 | result = acpi_processor_get_power_info_default_c1(pr); | 874 | if ((result) || (acpi_processor_power_verify(pr) < 2)) |
848 | } | 875 | result = acpi_processor_get_power_info_default_c1(pr); |
849 | 876 | ||
850 | /* | 877 | /* |
851 | * Set Default Policy | 878 | * Set Default Policy |
diff --git a/drivers/acpi/processor_thermal.c b/drivers/acpi/processor_thermal.c index 37528c3b64b0..f37584015324 100644 --- a/drivers/acpi/processor_thermal.c +++ b/drivers/acpi/processor_thermal.c | |||
@@ -101,9 +101,7 @@ static unsigned int acpi_thermal_cpufreq_is_init = 0; | |||
101 | static int cpu_has_cpufreq(unsigned int cpu) | 101 | static int cpu_has_cpufreq(unsigned int cpu) |
102 | { | 102 | { |
103 | struct cpufreq_policy policy; | 103 | struct cpufreq_policy policy; |
104 | if (!acpi_thermal_cpufreq_is_init) | 104 | if (!acpi_thermal_cpufreq_is_init || cpufreq_get_policy(&policy, cpu)) |
105 | return -ENODEV; | ||
106 | if (!cpufreq_get_policy(&policy, cpu)) | ||
107 | return -ENODEV; | 105 | return -ENODEV; |
108 | return 0; | 106 | return 0; |
109 | } | 107 | } |
@@ -127,13 +125,13 @@ static int acpi_thermal_cpufreq_decrease(unsigned int cpu) | |||
127 | if (!cpu_has_cpufreq(cpu)) | 125 | if (!cpu_has_cpufreq(cpu)) |
128 | return -ENODEV; | 126 | return -ENODEV; |
129 | 127 | ||
130 | if (cpufreq_thermal_reduction_pctg[cpu] >= 20) { | 128 | if (cpufreq_thermal_reduction_pctg[cpu] > 20) |
131 | cpufreq_thermal_reduction_pctg[cpu] -= 20; | 129 | cpufreq_thermal_reduction_pctg[cpu] -= 20; |
132 | cpufreq_update_policy(cpu); | 130 | else |
133 | return 0; | 131 | cpufreq_thermal_reduction_pctg[cpu] = 0; |
134 | } | 132 | cpufreq_update_policy(cpu); |
135 | 133 | /* We reached max freq again and can leave passive mode */ | |
136 | return -ERANGE; | 134 | return !cpufreq_thermal_reduction_pctg[cpu]; |
137 | } | 135 | } |
138 | 136 | ||
139 | static int acpi_thermal_cpufreq_notifier(struct notifier_block *nb, | 137 | static int acpi_thermal_cpufreq_notifier(struct notifier_block *nb, |
@@ -200,7 +198,7 @@ int acpi_processor_set_thermal_limit(acpi_handle handle, int type) | |||
200 | int result = 0; | 198 | int result = 0; |
201 | struct acpi_processor *pr = NULL; | 199 | struct acpi_processor *pr = NULL; |
202 | struct acpi_device *device = NULL; | 200 | struct acpi_device *device = NULL; |
203 | int tx = 0; | 201 | int tx = 0, max_tx_px = 0; |
204 | 202 | ||
205 | ACPI_FUNCTION_TRACE("acpi_processor_set_thermal_limit"); | 203 | ACPI_FUNCTION_TRACE("acpi_processor_set_thermal_limit"); |
206 | 204 | ||
@@ -259,19 +257,27 @@ int acpi_processor_set_thermal_limit(acpi_handle handle, int type) | |||
259 | /* if going down: T-states first, P-states later */ | 257 | /* if going down: T-states first, P-states later */ |
260 | 258 | ||
261 | if (pr->flags.throttling) { | 259 | if (pr->flags.throttling) { |
262 | if (tx == 0) | 260 | if (tx == 0) { |
261 | max_tx_px = 1; | ||
263 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 262 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
264 | "At minimum throttling state\n")); | 263 | "At minimum throttling state\n")); |
265 | else { | 264 | } else { |
266 | tx--; | 265 | tx--; |
267 | goto end; | 266 | goto end; |
268 | } | 267 | } |
269 | } | 268 | } |
270 | 269 | ||
271 | result = acpi_thermal_cpufreq_decrease(pr->id); | 270 | result = acpi_thermal_cpufreq_decrease(pr->id); |
272 | if (result == -ERANGE) | 271 | if (result) { |
272 | /* | ||
273 | * We only could get -ERANGE, 1 or 0. | ||
274 | * In the first two cases we reached max freq again. | ||
275 | */ | ||
273 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 276 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
274 | "At minimum performance state\n")); | 277 | "At minimum performance state\n")); |
278 | max_tx_px = 1; | ||
279 | } else | ||
280 | max_tx_px = 0; | ||
275 | 281 | ||
276 | break; | 282 | break; |
277 | } | 283 | } |
@@ -290,8 +296,10 @@ int acpi_processor_set_thermal_limit(acpi_handle handle, int type) | |||
290 | pr->limit.thermal.px, pr->limit.thermal.tx)); | 296 | pr->limit.thermal.px, pr->limit.thermal.tx)); |
291 | } else | 297 | } else |
292 | result = 0; | 298 | result = 0; |
293 | 299 | if (max_tx_px) | |
294 | return_VALUE(result); | 300 | return_VALUE(1); |
301 | else | ||
302 | return_VALUE(result); | ||
295 | } | 303 | } |
296 | 304 | ||
297 | int acpi_processor_get_limit_info(struct acpi_processor *pr) | 305 | int acpi_processor_get_limit_info(struct acpi_processor *pr) |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 23e2c6968a11..31218e1d2a18 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
@@ -1110,7 +1110,7 @@ acpi_add_single_object(struct acpi_device **child, | |||
1110 | * | 1110 | * |
1111 | * TBD: Assumes LDM provides driver hot-plug capability. | 1111 | * TBD: Assumes LDM provides driver hot-plug capability. |
1112 | */ | 1112 | */ |
1113 | result = acpi_bus_find_driver(device); | 1113 | acpi_bus_find_driver(device); |
1114 | 1114 | ||
1115 | end: | 1115 | end: |
1116 | if (!result) | 1116 | if (!result) |
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c index a24847c08f7f..19f3ea48475e 100644 --- a/drivers/acpi/thermal.c +++ b/drivers/acpi/thermal.c | |||
@@ -72,7 +72,7 @@ | |||
72 | #define _COMPONENT ACPI_THERMAL_COMPONENT | 72 | #define _COMPONENT ACPI_THERMAL_COMPONENT |
73 | ACPI_MODULE_NAME("acpi_thermal") | 73 | ACPI_MODULE_NAME("acpi_thermal") |
74 | 74 | ||
75 | MODULE_AUTHOR("Paul Diefenbaugh"); | 75 | MODULE_AUTHOR("Paul Diefenbaugh"); |
76 | MODULE_DESCRIPTION(ACPI_THERMAL_DRIVER_NAME); | 76 | MODULE_DESCRIPTION(ACPI_THERMAL_DRIVER_NAME); |
77 | MODULE_LICENSE("GPL"); | 77 | MODULE_LICENSE("GPL"); |
78 | 78 | ||
@@ -517,9 +517,9 @@ static int acpi_thermal_hot(struct acpi_thermal *tz) | |||
517 | return_VALUE(0); | 517 | return_VALUE(0); |
518 | } | 518 | } |
519 | 519 | ||
520 | static int acpi_thermal_passive(struct acpi_thermal *tz) | 520 | static void acpi_thermal_passive(struct acpi_thermal *tz) |
521 | { | 521 | { |
522 | int result = 0; | 522 | int result = 1; |
523 | struct acpi_thermal_passive *passive = NULL; | 523 | struct acpi_thermal_passive *passive = NULL; |
524 | int trend = 0; | 524 | int trend = 0; |
525 | int i = 0; | 525 | int i = 0; |
@@ -527,7 +527,7 @@ static int acpi_thermal_passive(struct acpi_thermal *tz) | |||
527 | ACPI_FUNCTION_TRACE("acpi_thermal_passive"); | 527 | ACPI_FUNCTION_TRACE("acpi_thermal_passive"); |
528 | 528 | ||
529 | if (!tz || !tz->trips.passive.flags.valid) | 529 | if (!tz || !tz->trips.passive.flags.valid) |
530 | return_VALUE(-EINVAL); | 530 | return; |
531 | 531 | ||
532 | passive = &(tz->trips.passive); | 532 | passive = &(tz->trips.passive); |
533 | 533 | ||
@@ -547,7 +547,7 @@ static int acpi_thermal_passive(struct acpi_thermal *tz) | |||
547 | trend, passive->tc1, tz->temperature, | 547 | trend, passive->tc1, tz->temperature, |
548 | tz->last_temperature, passive->tc2, | 548 | tz->last_temperature, passive->tc2, |
549 | tz->temperature, passive->temperature)); | 549 | tz->temperature, passive->temperature)); |
550 | tz->trips.passive.flags.enabled = 1; | 550 | passive->flags.enabled = 1; |
551 | /* Heating up? */ | 551 | /* Heating up? */ |
552 | if (trend > 0) | 552 | if (trend > 0) |
553 | for (i = 0; i < passive->devices.count; i++) | 553 | for (i = 0; i < passive->devices.count; i++) |
@@ -556,12 +556,32 @@ static int acpi_thermal_passive(struct acpi_thermal *tz) | |||
556 | handles[i], | 556 | handles[i], |
557 | ACPI_PROCESSOR_LIMIT_INCREMENT); | 557 | ACPI_PROCESSOR_LIMIT_INCREMENT); |
558 | /* Cooling off? */ | 558 | /* Cooling off? */ |
559 | else if (trend < 0) | 559 | else if (trend < 0) { |
560 | for (i = 0; i < passive->devices.count; i++) | 560 | for (i = 0; i < passive->devices.count; i++) |
561 | acpi_processor_set_thermal_limit(passive-> | 561 | /* |
562 | devices. | 562 | * assume that we are on highest |
563 | handles[i], | 563 | * freq/lowest thrott and can leave |
564 | ACPI_PROCESSOR_LIMIT_DECREMENT); | 564 | * passive mode, even in error case |
565 | */ | ||
566 | if (!acpi_processor_set_thermal_limit | ||
567 | (passive->devices.handles[i], | ||
568 | ACPI_PROCESSOR_LIMIT_DECREMENT)) | ||
569 | result = 0; | ||
570 | /* | ||
571 | * Leave cooling mode, even if the temp might | ||
572 | * higher than trip point This is because some | ||
573 | * machines might have long thermal polling | ||
574 | * frequencies (tsp) defined. We will fall back | ||
575 | * into passive mode in next cycle (probably quicker) | ||
576 | */ | ||
577 | if (result) { | ||
578 | passive->flags.enabled = 0; | ||
579 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
580 | "Disabling passive cooling, still above threshold," | ||
581 | " but we are cooling down\n")); | ||
582 | } | ||
583 | } | ||
584 | return; | ||
565 | } | 585 | } |
566 | 586 | ||
567 | /* | 587 | /* |
@@ -571,23 +591,21 @@ static int acpi_thermal_passive(struct acpi_thermal *tz) | |||
571 | * and avoid thrashing around the passive trip point. Note that we | 591 | * and avoid thrashing around the passive trip point. Note that we |
572 | * assume symmetry. | 592 | * assume symmetry. |
573 | */ | 593 | */ |
574 | else if (tz->trips.passive.flags.enabled) { | 594 | if (!passive->flags.enabled) |
575 | for (i = 0; i < passive->devices.count; i++) | 595 | return; |
576 | result = | 596 | for (i = 0; i < passive->devices.count; i++) |
577 | acpi_processor_set_thermal_limit(passive->devices. | 597 | if (!acpi_processor_set_thermal_limit |
578 | handles[i], | 598 | (passive->devices.handles[i], |
579 | ACPI_PROCESSOR_LIMIT_DECREMENT); | 599 | ACPI_PROCESSOR_LIMIT_DECREMENT)) |
580 | if (result == 1) { | 600 | result = 0; |
581 | tz->trips.passive.flags.enabled = 0; | 601 | if (result) { |
582 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 602 | passive->flags.enabled = 0; |
583 | "Disabling passive cooling (zone is cool)\n")); | 603 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
584 | } | 604 | "Disabling passive cooling (zone is cool)\n")); |
585 | } | 605 | } |
586 | |||
587 | return_VALUE(0); | ||
588 | } | 606 | } |
589 | 607 | ||
590 | static int acpi_thermal_active(struct acpi_thermal *tz) | 608 | static void acpi_thermal_active(struct acpi_thermal *tz) |
591 | { | 609 | { |
592 | int result = 0; | 610 | int result = 0; |
593 | struct acpi_thermal_active *active = NULL; | 611 | struct acpi_thermal_active *active = NULL; |
@@ -598,74 +616,66 @@ static int acpi_thermal_active(struct acpi_thermal *tz) | |||
598 | ACPI_FUNCTION_TRACE("acpi_thermal_active"); | 616 | ACPI_FUNCTION_TRACE("acpi_thermal_active"); |
599 | 617 | ||
600 | if (!tz) | 618 | if (!tz) |
601 | return_VALUE(-EINVAL); | 619 | return; |
602 | 620 | ||
603 | for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) { | 621 | for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) { |
604 | |||
605 | active = &(tz->trips.active[i]); | 622 | active = &(tz->trips.active[i]); |
606 | if (!active || !active->flags.valid) | 623 | if (!active || !active->flags.valid) |
607 | break; | 624 | break; |
608 | |||
609 | /* | ||
610 | * Above Threshold? | ||
611 | * ---------------- | ||
612 | * If not already enabled, turn ON all cooling devices | ||
613 | * associated with this active threshold. | ||
614 | */ | ||
615 | if (tz->temperature >= active->temperature) { | 625 | if (tz->temperature >= active->temperature) { |
626 | /* | ||
627 | * Above Threshold? | ||
628 | * ---------------- | ||
629 | * If not already enabled, turn ON all cooling devices | ||
630 | * associated with this active threshold. | ||
631 | */ | ||
616 | if (active->temperature > maxtemp) | 632 | if (active->temperature > maxtemp) |
617 | tz->state.active_index = i, maxtemp = | 633 | tz->state.active_index = i; |
618 | active->temperature; | 634 | maxtemp = active->temperature; |
619 | if (!active->flags.enabled) { | 635 | if (active->flags.enabled) |
620 | for (j = 0; j < active->devices.count; j++) { | 636 | continue; |
621 | result = | ||
622 | acpi_bus_set_power(active->devices. | ||
623 | handles[j], | ||
624 | ACPI_STATE_D0); | ||
625 | if (result) { | ||
626 | ACPI_DEBUG_PRINT((ACPI_DB_WARN, | ||
627 | "Unable to turn cooling device [%p] 'on'\n", | ||
628 | active-> | ||
629 | devices. | ||
630 | handles[j])); | ||
631 | continue; | ||
632 | } | ||
633 | active->flags.enabled = 1; | ||
634 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
635 | "Cooling device [%p] now 'on'\n", | ||
636 | active->devices. | ||
637 | handles[j])); | ||
638 | } | ||
639 | } | ||
640 | } | ||
641 | /* | ||
642 | * Below Threshold? | ||
643 | * ---------------- | ||
644 | * Turn OFF all cooling devices associated with this | ||
645 | * threshold. | ||
646 | */ | ||
647 | else if (active->flags.enabled) { | ||
648 | for (j = 0; j < active->devices.count; j++) { | 637 | for (j = 0; j < active->devices.count; j++) { |
649 | result = | 638 | result = |
650 | acpi_bus_set_power(active->devices. | 639 | acpi_bus_set_power(active->devices. |
651 | handles[j], | 640 | handles[j], |
652 | ACPI_STATE_D3); | 641 | ACPI_STATE_D0); |
653 | if (result) { | 642 | if (result) { |
654 | ACPI_DEBUG_PRINT((ACPI_DB_WARN, | 643 | ACPI_DEBUG_PRINT((ACPI_DB_WARN, |
655 | "Unable to turn cooling device [%p] 'off'\n", | 644 | "Unable to turn cooling device [%p] 'on'\n", |
656 | active->devices. | 645 | active->devices. |
657 | handles[j])); | 646 | handles[j])); |
658 | continue; | 647 | continue; |
659 | } | 648 | } |
660 | active->flags.enabled = 0; | 649 | active->flags.enabled = 1; |
661 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 650 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
662 | "Cooling device [%p] now 'off'\n", | 651 | "Cooling device [%p] now 'on'\n", |
663 | active->devices.handles[j])); | 652 | active->devices.handles[j])); |
664 | } | 653 | } |
654 | continue; | ||
655 | } | ||
656 | if (!active->flags.enabled) | ||
657 | continue; | ||
658 | /* | ||
659 | * Below Threshold? | ||
660 | * ---------------- | ||
661 | * Turn OFF all cooling devices associated with this | ||
662 | * threshold. | ||
663 | */ | ||
664 | for (j = 0; j < active->devices.count; j++) { | ||
665 | result = acpi_bus_set_power(active->devices.handles[j], | ||
666 | ACPI_STATE_D3); | ||
667 | if (result) { | ||
668 | ACPI_DEBUG_PRINT((ACPI_DB_WARN, | ||
669 | "Unable to turn cooling device [%p] 'off'\n", | ||
670 | active->devices.handles[j])); | ||
671 | continue; | ||
672 | } | ||
673 | active->flags.enabled = 0; | ||
674 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
675 | "Cooling device [%p] now 'off'\n", | ||
676 | active->devices.handles[j])); | ||
665 | } | 677 | } |
666 | } | 678 | } |
667 | |||
668 | return_VALUE(0); | ||
669 | } | 679 | } |
670 | 680 | ||
671 | static void acpi_thermal_check(void *context); | 681 | static void acpi_thermal_check(void *context); |
@@ -744,15 +754,12 @@ static void acpi_thermal_check(void *data) | |||
744 | * Again, separated from the above two to allow independent policy | 754 | * Again, separated from the above two to allow independent policy |
745 | * decisions. | 755 | * decisions. |
746 | */ | 756 | */ |
747 | if (tz->trips.critical.flags.enabled) | 757 | tz->state.critical = tz->trips.critical.flags.enabled; |
748 | tz->state.critical = 1; | 758 | tz->state.hot = tz->trips.hot.flags.enabled; |
749 | if (tz->trips.hot.flags.enabled) | 759 | tz->state.passive = tz->trips.passive.flags.enabled; |
750 | tz->state.hot = 1; | 760 | tz->state.active = 0; |
751 | if (tz->trips.passive.flags.enabled) | ||
752 | tz->state.passive = 1; | ||
753 | for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) | 761 | for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) |
754 | if (tz->trips.active[i].flags.enabled) | 762 | tz->state.active |= tz->trips.active[i].flags.enabled; |
755 | tz->state.active = 1; | ||
756 | 763 | ||
757 | /* | 764 | /* |
758 | * Calculate Sleep Time | 765 | * Calculate Sleep Time |
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index f051b151580d..d10668f14699 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
@@ -812,7 +812,7 @@ acpi_video_device_write_brightness(struct file *file, | |||
812 | 812 | ||
813 | ACPI_FUNCTION_TRACE("acpi_video_device_write_brightness"); | 813 | ACPI_FUNCTION_TRACE("acpi_video_device_write_brightness"); |
814 | 814 | ||
815 | if (!dev || count + 1 > sizeof str) | 815 | if (!dev || !dev->brightness || count + 1 > sizeof str) |
816 | return_VALUE(-EINVAL); | 816 | return_VALUE(-EINVAL); |
817 | 817 | ||
818 | if (copy_from_user(str, buffer, count)) | 818 | if (copy_from_user(str, buffer, count)) |