diff options
Diffstat (limited to 'drivers/acpi/ibm_acpi.c')
-rw-r--r-- | drivers/acpi/ibm_acpi.c | 34 |
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 | ||
1981 | static int fan_set_enable(void) | 1982 | static 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 | } |