summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenrique de Moraes Holschuh <hmh@hmh.eng.br>2006-11-24 14:47:12 +0100
committerLen Brown <len.brown@intel.com>2006-12-07 07:38:40 +0100
commit1c6a334e9c028c2b72c5350650cb14e6d5fdc232 (patch)
tree44ce8770489af1a27b01f8b3adfbe45769288421
parentACPI: ibm-acpi: extend fan status functions (diff)
downloadlinux-1c6a334e9c028c2b72c5350650cb14e6d5fdc232.tar.xz
linux-1c6a334e9c028c2b72c5350650cb14e6d5fdc232.zip
ACPI: ibm-acpi: fix and extend fan enable
This patch fix fan enable to attempt to do the right thing and not slow down the fan if it is forced to the maximum speed. It also extends fan enable to work on older thinkpads. ABI changes: 1. Support enable/disable for all level-based write access modes Signed-off-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
-rw-r--r--drivers/acpi/ibm_acpi.c34
1 files changed, 32 insertions, 2 deletions
diff --git a/drivers/acpi/ibm_acpi.c b/drivers/acpi/ibm_acpi.c
index b6ad2ed5fd6c..ecb5ece79a37 100644
--- a/drivers/acpi/ibm_acpi.c
+++ b/drivers/acpi/ibm_acpi.c
@@ -1820,7 +1820,8 @@ static int fan_init(void)
if (sfan_handle) {
/* 570, 770x-JL */
fan_control_access_mode = IBMACPI_FAN_WR_ACPI_SFAN;
- fan_control_commands |= IBMACPI_FAN_CMD_LEVEL;
+ fan_control_commands |=
+ IBMACPI_FAN_CMD_LEVEL | IBMACPI_FAN_CMD_ENABLE;
} else {
if (!gfan_handle) {
/* gfan without sfan means no fan control */
@@ -1980,10 +1981,34 @@ static int fan_set_level(int level)
static int fan_set_enable(void)
{
+ u8 s;
+ int rc;
+
switch (fan_control_access_mode) {
case IBMACPI_FAN_WR_ACPI_FANS:
case IBMACPI_FAN_WR_TPEC:
- if (!acpi_ec_write(fan_status_offset, 0x80))
+ if ((rc = fan_get_status(&s)) < 0)
+ return rc;
+
+ /* Don't go out of emergency fan mode */
+ if (s != 7)
+ s = IBMACPI_FAN_EC_AUTO;
+
+ if (!acpi_ec_write(fan_status_offset, s))
+ return -EIO;
+ break;
+
+ case IBMACPI_FAN_WR_ACPI_SFAN:
+ if ((rc = fan_get_status(&s)) < 0)
+ return rc;
+
+ s &= 0x07;
+
+ /* Set fan to at least level 4 */
+ if (s < 4)
+ s = 4;
+
+ if (!acpi_evalf(sfan_handle, NULL, NULL, "vd", s))
return -EIO;
break;
@@ -2002,6 +2027,11 @@ static int fan_set_disable(void)
return -EIO;
break;
+ case IBMACPI_FAN_WR_ACPI_SFAN:
+ if (!acpi_evalf(sfan_handle, NULL, NULL, "vd", 0x00))
+ return -EIO;
+ break;
+
default:
return -ENXIO;
}