Skip to content

Commit

Permalink
ACPI: thermal: add DMI hooks to handle AOpen's broken Award BIOS
Browse files Browse the repository at this point in the history
Use DMI to:
1. enable polling (BIOS thermal events are broken)
2. disable active trip points (BIOS fan control is broken)
3. disable passive trip point (BIOS hard-codes it too low)

The actual temperature reading does work,
and with the aid of polling, the critical
trip point should work too.

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

Signed-off-by: Len Brown <len.brown@intel.com>
  • Loading branch information
Len Brown committed Aug 12, 2007
1 parent f8707ec commit 0b5bfa1
Showing 1 changed file with 65 additions and 0 deletions.
65 changes: 65 additions & 0 deletions drivers/acpi/thermal.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/dmi.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/proc_fs.h>
Expand Down Expand Up @@ -1328,10 +1329,74 @@ static int acpi_thermal_resume(struct acpi_device *device)
return AE_OK;
}

#ifdef CONFIG_DMI
static int thermal_act(struct dmi_system_id *d) {

if (act == 0) {
printk(KERN_NOTICE "ACPI: %s detected: "
"disabling all active thermal trip points\n", d->ident);
act = -1;
}
return 0;
}
static int thermal_tzp(struct dmi_system_id *d) {

if (tzp == 0) {
printk(KERN_NOTICE "ACPI: %s detected: "
"enabling thermal zone polling\n", d->ident);
tzp = 300; /* 300 dS = 30 Seconds */
}
return 0;
}
static int thermal_psv(struct dmi_system_id *d) {

if (psv == 0) {
printk(KERN_NOTICE "ACPI: %s detected: "
"disabling all passive thermal trip points\n", d->ident);
psv = -1;
}
return 0;
}

static struct dmi_system_id thermal_dmi_table[] __initdata = {
/*
* Award BIOS on this AOpen makes thermal control almost worthless.
* http://bugzilla.kernel.org/show_bug.cgi?id=8842
*/
{
.callback = thermal_act,
.ident = "AOpen i915GMm-HFS",
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "AOpen"),
DMI_MATCH(DMI_BOARD_NAME, "i915GMm-HFS"),
},
},
{
.callback = thermal_psv,
.ident = "AOpen i915GMm-HFS",
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "AOpen"),
DMI_MATCH(DMI_BOARD_NAME, "i915GMm-HFS"),
},
},
{
.callback = thermal_tzp,
.ident = "AOpen i915GMm-HFS",
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "AOpen"),
DMI_MATCH(DMI_BOARD_NAME, "i915GMm-HFS"),
},
},
{}
};
#endif /* CONFIG_DMI */

static int __init acpi_thermal_init(void)
{
int result = 0;

dmi_check_system(thermal_dmi_table);

if (off) {
printk(KERN_NOTICE "ACPI: thermal control disabled\n");
return -ENODEV;
Expand Down

0 comments on commit 0b5bfa1

Please sign in to comment.