Skip to content

Commit

Permalink
ACPI : Set FAN device to correct state in boot phase
Browse files Browse the repository at this point in the history
Subject:ACPI: Set FAN device to correct state in boot phase
From: Zhao Yakui <yakui.zhao@intel.com>

On some laptops when ACPI FAN driver is loaded, maybe the FAN device will be
turned on. But if the temperature is below the threshold, the corresponding
FAN device should be turned off in the course of loading thermal driver.

So it is necessary to set the FAN device to the correct state in course of loading
the thermal driver.

http://bugzilla.kernel.org/show_bug.cgi?id=8049

Signed-off-by: Zhao Yakui <yakui.zhao@intel.com>
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
Signed-off-by: Andi Kleen <ak@linux.intel.com>
  • Loading branch information
Zhao Yakui authored and Andi Kleen committed Jul 17, 2008
1 parent c2c7890 commit ea51011
Showing 1 changed file with 43 additions and 0 deletions.
43 changes: 43 additions & 0 deletions drivers/acpi/thermal.c
Original file line number Diff line number Diff line change
Expand Up @@ -769,6 +769,47 @@ static void acpi_thermal_run(unsigned long data)
acpi_os_execute(OSL_GPE_HANDLER, acpi_thermal_check, (void *)data);
}

static void acpi_thermal_active_off(void *data)
{
int result = 0;
struct acpi_thermal *tz = data;
int i = 0;
int j = 0;
struct acpi_thermal_active *active = NULL;

if (!tz) {
printk(KERN_ERR PREFIX "Invalid (NULL) context\n");
return;
}

result = acpi_thermal_get_temperature(tz);
if (result)
return;

for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
active = &(tz->trips.active[i]);
if (!active || !active->flags.valid)
break;
if (tz->temperature >= active->temperature) {
/*
* If the thermal temperature is greater than the
* active threshod, unnecessary to turn off the
* the active cooling device.
*/
continue;
}
/*
* Below Threshold?
* ----------------
* Turn OFF all cooling devices associated with this
* threshold.
*/
for (j = 0; j < active->devices.count; j++)
result = acpi_bus_set_power(active->devices.handles[j],
ACPI_STATE_D3);
}
}

static void acpi_thermal_check(void *data)
{
int result = 0;
Expand Down Expand Up @@ -1624,6 +1665,8 @@ static int acpi_thermal_add(struct acpi_device *device)

init_timer(&tz->timer);

acpi_thermal_active_off(tz);

acpi_thermal_check(tz);

status = acpi_install_notify_handler(device->handle,
Expand Down

0 comments on commit ea51011

Please sign in to comment.