diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c index 7dbebea..de2b164 100644 --- a/drivers/acpi/thermal.c +++ b/drivers/acpi/thermal.c @@ -96,6 +96,10 @@ static int psv; module_param(psv, int, 0644); MODULE_PARM_DESC(psv, "Disable or override all passive trip points."); +static int temp_b4_trip; +module_param(temp_b4_trip, int, 0); +MODULE_PARM_DESC(temp_b4_trip, "Get the temperature before initializing trip points."); + static int acpi_thermal_add(struct acpi_device *device); static int acpi_thermal_remove(struct acpi_device *device, int type); static int acpi_thermal_resume(struct acpi_device *device); @@ -941,27 +945,41 @@ static int acpi_thermal_get_info(struct acpi_thermal *tz) if (!tz) return -EINVAL; - /* Get trip points [_CRT, _PSV, etc.] (required) */ - result = acpi_thermal_get_trip_points(tz); - if (result) + if( temp_b4_trip ) + { /* some CPUs, eg AMD K8 need temperature before trip points can be obtained */ + /* Get temperature [_TMP] (required) */ + result = acpi_thermal_get_temperature(tz); + if (result) return result; - - /* Get temperature [_TMP] (required) */ - result = acpi_thermal_get_temperature(tz); - if (result) + + /* Get trip points [_CRT, _PSV, etc.] (required) */ + result = acpi_thermal_get_trip_points(tz); + if (result) return result; - + }else + { /* newer x86_64s need trip points set before temperature obtained */ + /* Get trip points [_CRT, _PSV, etc.] (required) */ + result = acpi_thermal_get_trip_points(tz); + if (result) + return result; + + /* Get temperature [_TMP] (required) */ + result = acpi_thermal_get_temperature(tz); + if (result) + return result; + } + /* Set the cooling mode [_SCP] to active cooling (default) */ result = acpi_thermal_set_cooling_mode(tz, ACPI_THERMAL_MODE_ACTIVE); if (!result) tz->flags.cooling_mode = 1; - + /* Get default polling frequency [_TZP] (optional) */ if (tzp) tz->polling_frequency = tzp; else acpi_thermal_get_polling_frequency(tz); - + return 0; } @@ -1110,6 +1128,14 @@ static int thermal_psv(const struct dmi_system_id *d) { return 0; } +static int thermal_temp_b4_trip(const struct dmi_system_id *d) { + + printk(KERN_NOTICE "ACPI: %s detected: : " + "getting temperature before trip point initialisation\n", d->ident); + temp_b4_trip = 1; + return 0; +} + static struct dmi_system_id thermal_dmi_table[] __initdata = { /* * Award BIOS on this AOpen makes thermal control almost worthless. @@ -1147,6 +1173,14 @@ static struct dmi_system_id thermal_dmi_table[] __initdata = { DMI_MATCH(DMI_BOARD_NAME, "7ZX"), }, }, + { + .callback = thermal_temp_b4_trip, + .ident = "HP 6715b laptop", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq 6715b"), + }, + }, {} };