summaryrefslogtreecommitdiffstats
path: root/drivers/acpi/thermal.c
diff options
context:
space:
mode:
authorKonstantin Karasyov <konstantin.a.karasyov@intel.com>2006-07-10 04:44:26 -0700
committerLinus Torvalds <torvalds@g5.osdl.org>2006-07-10 13:24:18 -0700
commitbed936f7eab946c60170bc92a1aea597da158e02 (patch)
tree746083d8c8172dc240d4d50c91a563c1aa05944e /drivers/acpi/thermal.c
parent868e81b8ada8fa05bdc08b5e6fa73307caaeab6d (diff)
downloadlinux-stable-bed936f7eab946c60170bc92a1aea597da158e02.tar.gz
linux-stable-bed936f7eab946c60170bc92a1aea597da158e02.tar.bz2
linux-stable-bed936f7eab946c60170bc92a1aea597da158e02.zip
[PATCH] ACPI: fix fan/thermal resume
Daniel Ritz <daniel.ritz-ml@swissonline.ch> says: The acpi driver suspend/resume patches that went in recently caused a regression on my box (toshiba tecra 8000 laptop): after resume from swsusp the fan turns on keeping blowing cold air out of my notebook. before the patches, the fan was off and would only make noise when required. it's the same thing described in bugzilla.kernel.org #5000. the acpi suspend/resume patches or at least parts of them originate in this bug. now the last patch in the report (attach id 8438) actually fixes the problem - for me and the reporter. this is a trimmed down version of that patch. Signed-off-by: Daniel Ritz <daniel.ritz@gmx.ch> Cc: Len Brown <len.brown@intel.com> Cc: Sanjoy Mahajan <sanjoy@mrao.cam.ac.uk> Cc: Pavel Machek <pavel@suse.cz> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/acpi/thermal.c')
-rw-r--r--drivers/acpi/thermal.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c
index 503c0b99db12..fdba4879603f 100644
--- a/drivers/acpi/thermal.c
+++ b/drivers/acpi/thermal.c
@@ -1359,13 +1359,28 @@ static int acpi_thermal_remove(struct acpi_device *device, int type)
static int acpi_thermal_resume(struct acpi_device *device, int state)
{
struct acpi_thermal *tz = NULL;
+ int i;
if (!device || !acpi_driver_data(device))
return -EINVAL;
tz = (struct acpi_thermal *)acpi_driver_data(device);
- acpi_thermal_check(tz);
+ acpi_thermal_get_temperature(tz);
+
+ for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
+ if (tz->trips.active[i].flags.valid) {
+ tz->temperature = tz->trips.active[i].temperature;
+ tz->trips.active[i].flags.enabled = 0;
+
+ acpi_thermal_active(tz);
+
+ tz->state.active |= tz->trips.active[i].flags.enabled;
+ tz->state.active_index = i;
+ }
+ }
+
+ acpi_thermal_check(tz);
return AE_OK;
}