aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi
diff options
context:
space:
mode:
authorHenrique de Moraes Holschuh <hmh@hmh.eng.br>2006-11-24 08:47:12 -0500
committerLen Brown <len.brown@intel.com>2006-12-07 01:38:40 -0500
commit1c6a334e9c028c2b72c5350650cb14e6d5fdc232 (patch)
tree44ce8770489af1a27b01f8b3adfbe45769288421 /drivers/acpi
parentbab812a329cc244ca63c2675b0e05016518855ce (diff)
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>
Diffstat (limited to 'drivers/acpi')
-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)
1820 if (sfan_handle) { 1820 if (sfan_handle) {
1821 /* 570, 770x-JL */ 1821 /* 570, 770x-JL */
1822 fan_control_access_mode = IBMACPI_FAN_WR_ACPI_SFAN; 1822 fan_control_access_mode = IBMACPI_FAN_WR_ACPI_SFAN;
1823 fan_control_commands |= IBMACPI_FAN_CMD_LEVEL; 1823 fan_control_commands |=
1824 IBMACPI_FAN_CMD_LEVEL | IBMACPI_FAN_CMD_ENABLE;
1824 } else { 1825 } else {
1825 if (!gfan_handle) { 1826 if (!gfan_handle) {
1826 /* gfan without sfan means no fan control */ 1827 /* gfan without sfan means no fan control */
@@ -1980,10 +1981,34 @@ static int fan_set_level(int level)
1980 1981
1981static int fan_set_enable(void) 1982static int fan_set_enable(void)
1982{ 1983{
1984 u8 s;
1985 int rc;
1986
1983 switch (fan_control_access_mode) { 1987 switch (fan_control_access_mode) {
1984 case IBMACPI_FAN_WR_ACPI_FANS: 1988 case IBMACPI_FAN_WR_ACPI_FANS:
1985 case IBMACPI_FAN_WR_TPEC: 1989 case IBMACPI_FAN_WR_TPEC:
1986 if (!acpi_ec_write(fan_status_offset, 0x80)) 1990 if ((rc = fan_get_status(&s)) < 0)
1991 return rc;
1992
1993 /* Don't go out of emergency fan mode */
1994 if (s != 7)
1995 s = IBMACPI_FAN_EC_AUTO;
1996
1997 if (!acpi_ec_write(fan_status_offset, s))
1998 return -EIO;
1999 break;
2000
2001 case IBMACPI_FAN_WR_ACPI_SFAN:
2002 if ((rc = fan_get_status(&s)) < 0)
2003 return rc;
2004
2005 s &= 0x07;
2006
2007 /* Set fan to at least level 4 */
2008 if (s < 4)
2009 s = 4;
2010
2011 if (!acpi_evalf(sfan_handle, NULL, NULL, "vd", s))
1987 return -EIO; 2012 return -EIO;
1988 break; 2013 break;
1989 2014
@@ -2002,6 +2027,11 @@ static int fan_set_disable(void)
2002 return -EIO; 2027 return -EIO;
2003 break; 2028 break;
2004 2029
2030 case IBMACPI_FAN_WR_ACPI_SFAN:
2031 if (!acpi_evalf(sfan_handle, NULL, NULL, "vd", 0x00))
2032 return -EIO;
2033 break;
2034
2005 default: 2035 default:
2006 return -ENXIO; 2036 return -ENXIO;
2007 } 2037 }