diff options
author | Henrique de Moraes Holschuh <hmh@hmh.eng.br> | 2006-11-24 08:47:13 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2006-12-07 01:38:43 -0500 |
commit | a12095c2b50c8a7c80517e37c00d6e6c863d43c5 (patch) | |
tree | 61f17cfdfa283430531e1b4749e2de93b2b0a812 /drivers/acpi | |
parent | 1c6a334e9c028c2b72c5350650cb14e6d5fdc232 (diff) |
ACPI: ibm-acpi: fix and extend fan control functions
This patch extend fan control functions, implementing enable/disable for
all write access modes, implementing level control for all level-capable
write access modes.
The patch also updates the documentation, explaining levels auto and
disengaged.
ABI changes:
1. Support level 0 as an equivalent to disable
2. Add support for level auto and level disengaged when doing
EC 0x2f fan control
3. Support enable/disable for all level-based write access modes
4. Add support for level command on FANS thinkpads, as per
thinkwiki reports
Signed-off-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
Diffstat (limited to 'drivers/acpi')
-rw-r--r-- | drivers/acpi/ibm_acpi.c | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/drivers/acpi/ibm_acpi.c b/drivers/acpi/ibm_acpi.c index ecb5ece79a37..4001ad193ddc 100644 --- a/drivers/acpi/ibm_acpi.c +++ b/drivers/acpi/ibm_acpi.c | |||
@@ -1833,10 +1833,13 @@ static int fan_init(void) | |||
1833 | IBMACPI_FAN_WR_ACPI_FANS; | 1833 | IBMACPI_FAN_WR_ACPI_FANS; |
1834 | fan_control_commands |= | 1834 | fan_control_commands |= |
1835 | IBMACPI_FAN_CMD_SPEED | | 1835 | IBMACPI_FAN_CMD_SPEED | |
1836 | IBMACPI_FAN_CMD_LEVEL | | ||
1836 | IBMACPI_FAN_CMD_ENABLE; | 1837 | IBMACPI_FAN_CMD_ENABLE; |
1837 | } else { | 1838 | } else { |
1838 | fan_control_access_mode = IBMACPI_FAN_WR_TPEC; | 1839 | fan_control_access_mode = IBMACPI_FAN_WR_TPEC; |
1839 | fan_control_commands |= IBMACPI_FAN_CMD_ENABLE; | 1840 | fan_control_commands |= |
1841 | IBMACPI_FAN_CMD_LEVEL | | ||
1842 | IBMACPI_FAN_CMD_ENABLE; | ||
1840 | } | 1843 | } |
1841 | } | 1844 | } |
1842 | } | 1845 | } |
@@ -1948,9 +1951,20 @@ static int fan_read(char *p) | |||
1948 | len += sprintf(p + len, "status:\t\tnot supported\n"); | 1951 | len += sprintf(p + len, "status:\t\tnot supported\n"); |
1949 | } | 1952 | } |
1950 | 1953 | ||
1951 | if (fan_control_commands & IBMACPI_FAN_CMD_LEVEL) | 1954 | if (fan_control_commands & IBMACPI_FAN_CMD_LEVEL) { |
1952 | len += sprintf(p + len, "commands:\tlevel <level>" | 1955 | len += sprintf(p + len, "commands:\tlevel <level>"); |
1953 | " (<level> is 0-7)\n"); | 1956 | |
1957 | switch (fan_control_access_mode) { | ||
1958 | case IBMACPI_FAN_WR_ACPI_SFAN: | ||
1959 | len += sprintf(p + len, " (<level> is 0-7)\n"); | ||
1960 | break; | ||
1961 | |||
1962 | default: | ||
1963 | len += sprintf(p + len, " (<level> is 0-7, " | ||
1964 | "auto, disengaged)\n"); | ||
1965 | break; | ||
1966 | } | ||
1967 | } | ||
1954 | 1968 | ||
1955 | if (fan_control_commands & IBMACPI_FAN_CMD_ENABLE) | 1969 | if (fan_control_commands & IBMACPI_FAN_CMD_ENABLE) |
1956 | len += sprintf(p + len, "commands:\tenable, disable\n"); | 1970 | len += sprintf(p + len, "commands:\tenable, disable\n"); |
@@ -1973,6 +1987,17 @@ static int fan_set_level(int level) | |||
1973 | return -EINVAL; | 1987 | return -EINVAL; |
1974 | break; | 1988 | break; |
1975 | 1989 | ||
1990 | case IBMACPI_FAN_WR_ACPI_FANS: | ||
1991 | case IBMACPI_FAN_WR_TPEC: | ||
1992 | if ((level != IBMACPI_FAN_EC_AUTO) && | ||
1993 | (level != IBMACPI_FAN_EC_DISENGAGED) && | ||
1994 | ((level < 0) || (level > 7))) | ||
1995 | return -EINVAL; | ||
1996 | |||
1997 | if (!acpi_ec_write(fan_status_offset, level)) | ||
1998 | return -EIO; | ||
1999 | break; | ||
2000 | |||
1976 | default: | 2001 | default: |
1977 | return -ENXIO; | 2002 | return -ENXIO; |
1978 | } | 2003 | } |
@@ -2060,7 +2085,11 @@ static int fan_write_cmd_level(const char *cmd, int *rc) | |||
2060 | { | 2085 | { |
2061 | int level; | 2086 | int level; |
2062 | 2087 | ||
2063 | if (sscanf(cmd, "level %d", &level) != 1) | 2088 | if (strlencmp(cmd, "level auto") == 0) |
2089 | level = IBMACPI_FAN_EC_AUTO; | ||
2090 | else if (strlencmp(cmd, "level disengaged") == 0) | ||
2091 | level = IBMACPI_FAN_EC_DISENGAGED; | ||
2092 | else if (sscanf(cmd, "level %d", &level) != 1) | ||
2064 | return 0; | 2093 | return 0; |
2065 | 2094 | ||
2066 | if ((*rc = fan_set_level(level)) == -ENXIO) | 2095 | if ((*rc = fan_set_level(level)) == -ENXIO) |