diff options
-rw-r--r-- | Documentation/laptops/thinkpad-acpi.txt | 1 | ||||
-rw-r--r-- | drivers/platform/x86/thinkpad_acpi.c | 46 |
2 files changed, 42 insertions, 5 deletions
diff --git a/Documentation/laptops/thinkpad-acpi.txt b/Documentation/laptops/thinkpad-acpi.txt index abbbe78a003b..25ed43d0a21f 100644 --- a/Documentation/laptops/thinkpad-acpi.txt +++ b/Documentation/laptops/thinkpad-acpi.txt | |||
@@ -1497,6 +1497,7 @@ to enable more than one output class, just add their values. | |||
1497 | 0x0004 RF Transmitter control (RFKILL) | 1497 | 0x0004 RF Transmitter control (RFKILL) |
1498 | (bluetooth, WWAN, UWB...) | 1498 | (bluetooth, WWAN, UWB...) |
1499 | 0x0008 HKEY event interface, hotkeys | 1499 | 0x0008 HKEY event interface, hotkeys |
1500 | 0x0010 Fan control | ||
1500 | 1501 | ||
1501 | There is also a kernel build option to enable more debugging | 1502 | There is also a kernel build option to enable more debugging |
1502 | information, which may be necessary to debug driver problems. | 1503 | information, which may be necessary to debug driver problems. |
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index 0a4796a246ea..4eec77032a71 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c | |||
@@ -191,6 +191,7 @@ enum { | |||
191 | #define TPACPI_DBG_EXIT 0x0002 | 191 | #define TPACPI_DBG_EXIT 0x0002 |
192 | #define TPACPI_DBG_RFKILL 0x0004 | 192 | #define TPACPI_DBG_RFKILL 0x0004 |
193 | #define TPACPI_DBG_HKEY 0x0008 | 193 | #define TPACPI_DBG_HKEY 0x0008 |
194 | #define TPACPI_DBG_FAN 0x0010 | ||
194 | 195 | ||
195 | #define onoff(status, bit) ((status) & (1 << (bit)) ? "on" : "off") | 196 | #define onoff(status, bit) ((status) & (1 << (bit)) ? "on" : "off") |
196 | #define enabled(status, bit) ((status) & (1 << (bit)) ? "enabled" : "disabled") | 197 | #define enabled(status, bit) ((status) & (1 << (bit)) ? "enabled" : "disabled") |
@@ -6271,6 +6272,9 @@ static int fan_set_level(int level) | |||
6271 | default: | 6272 | default: |
6272 | return -ENXIO; | 6273 | return -ENXIO; |
6273 | } | 6274 | } |
6275 | |||
6276 | vdbg_printk(TPACPI_DBG_FAN, | ||
6277 | "fan control: set fan control register to 0x%02x\n", level); | ||
6274 | return 0; | 6278 | return 0; |
6275 | } | 6279 | } |
6276 | 6280 | ||
@@ -6348,6 +6352,11 @@ static int fan_set_enable(void) | |||
6348 | } | 6352 | } |
6349 | 6353 | ||
6350 | mutex_unlock(&fan_mutex); | 6354 | mutex_unlock(&fan_mutex); |
6355 | |||
6356 | if (!rc) | ||
6357 | vdbg_printk(TPACPI_DBG_FAN, | ||
6358 | "fan control: set fan control register to 0x%02x\n", | ||
6359 | s); | ||
6351 | return rc; | 6360 | return rc; |
6352 | } | 6361 | } |
6353 | 6362 | ||
@@ -6384,6 +6393,9 @@ static int fan_set_disable(void) | |||
6384 | rc = -ENXIO; | 6393 | rc = -ENXIO; |
6385 | } | 6394 | } |
6386 | 6395 | ||
6396 | if (!rc) | ||
6397 | vdbg_printk(TPACPI_DBG_FAN, | ||
6398 | "fan control: set fan control register to 0\n"); | ||
6387 | 6399 | ||
6388 | mutex_unlock(&fan_mutex); | 6400 | mutex_unlock(&fan_mutex); |
6389 | return rc; | 6401 | return rc; |
@@ -6512,6 +6524,9 @@ static ssize_t fan_pwm1_enable_store(struct device *dev, | |||
6512 | if (parse_strtoul(buf, 2, &t)) | 6524 | if (parse_strtoul(buf, 2, &t)) |
6513 | return -EINVAL; | 6525 | return -EINVAL; |
6514 | 6526 | ||
6527 | tpacpi_disclose_usertask("hwmon pwm1_enable", | ||
6528 | "set fan mode to %lu\n", t); | ||
6529 | |||
6515 | switch (t) { | 6530 | switch (t) { |
6516 | case 0: | 6531 | case 0: |
6517 | level = TP_EC_FAN_FULLSPEED; | 6532 | level = TP_EC_FAN_FULLSPEED; |
@@ -6577,6 +6592,9 @@ static ssize_t fan_pwm1_store(struct device *dev, | |||
6577 | if (parse_strtoul(buf, 255, &s)) | 6592 | if (parse_strtoul(buf, 255, &s)) |
6578 | return -EINVAL; | 6593 | return -EINVAL; |
6579 | 6594 | ||
6595 | tpacpi_disclose_usertask("hwmon pwm1", | ||
6596 | "set fan speed to %lu\n", s); | ||
6597 | |||
6580 | /* scale down from 0-255 to 0-7 */ | 6598 | /* scale down from 0-255 to 0-7 */ |
6581 | newlevel = (s >> 5) & 0x07; | 6599 | newlevel = (s >> 5) & 0x07; |
6582 | 6600 | ||
@@ -6643,6 +6661,8 @@ static ssize_t fan_fan_watchdog_store(struct device_driver *drv, | |||
6643 | fan_watchdog_maxinterval = t; | 6661 | fan_watchdog_maxinterval = t; |
6644 | fan_watchdog_reset(); | 6662 | fan_watchdog_reset(); |
6645 | 6663 | ||
6664 | tpacpi_disclose_usertask("fan_watchdog", "set to %lu\n", t); | ||
6665 | |||
6646 | return count; | 6666 | return count; |
6647 | } | 6667 | } |
6648 | 6668 | ||
@@ -6664,7 +6684,8 @@ static int __init fan_init(struct ibm_init_struct *iibm) | |||
6664 | { | 6684 | { |
6665 | int rc; | 6685 | int rc; |
6666 | 6686 | ||
6667 | vdbg_printk(TPACPI_DBG_INIT, "initializing fan subdriver\n"); | 6687 | vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_FAN, |
6688 | "initializing fan subdriver\n"); | ||
6668 | 6689 | ||
6669 | mutex_init(&fan_mutex); | 6690 | mutex_init(&fan_mutex); |
6670 | fan_status_access_mode = TPACPI_FAN_NONE; | 6691 | fan_status_access_mode = TPACPI_FAN_NONE; |
@@ -6723,7 +6744,8 @@ static int __init fan_init(struct ibm_init_struct *iibm) | |||
6723 | } | 6744 | } |
6724 | } | 6745 | } |
6725 | 6746 | ||
6726 | vdbg_printk(TPACPI_DBG_INIT, "fan is %s, modes %d, %d\n", | 6747 | vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_FAN, |
6748 | "fan is %s, modes %d, %d\n", | ||
6727 | str_supported(fan_status_access_mode != TPACPI_FAN_NONE || | 6749 | str_supported(fan_status_access_mode != TPACPI_FAN_NONE || |
6728 | fan_control_access_mode != TPACPI_FAN_WR_NONE), | 6750 | fan_control_access_mode != TPACPI_FAN_WR_NONE), |
6729 | fan_status_access_mode, fan_control_access_mode); | 6751 | fan_status_access_mode, fan_control_access_mode); |
@@ -6732,7 +6754,7 @@ static int __init fan_init(struct ibm_init_struct *iibm) | |||
6732 | if (!fan_control_allowed) { | 6754 | if (!fan_control_allowed) { |
6733 | fan_control_access_mode = TPACPI_FAN_WR_NONE; | 6755 | fan_control_access_mode = TPACPI_FAN_WR_NONE; |
6734 | fan_control_commands = 0; | 6756 | fan_control_commands = 0; |
6735 | dbg_printk(TPACPI_DBG_INIT, | 6757 | dbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_FAN, |
6736 | "fan control features disabled by parameter\n"); | 6758 | "fan control features disabled by parameter\n"); |
6737 | } | 6759 | } |
6738 | 6760 | ||
@@ -6761,7 +6783,7 @@ static int __init fan_init(struct ibm_init_struct *iibm) | |||
6761 | 6783 | ||
6762 | static void fan_exit(void) | 6784 | static void fan_exit(void) |
6763 | { | 6785 | { |
6764 | vdbg_printk(TPACPI_DBG_EXIT, | 6786 | vdbg_printk(TPACPI_DBG_EXIT | TPACPI_DBG_FAN, |
6765 | "cancelling any pending fan watchdog tasks\n"); | 6787 | "cancelling any pending fan watchdog tasks\n"); |
6766 | 6788 | ||
6767 | /* FIXME: can we really do this unconditionally? */ | 6789 | /* FIXME: can we really do this unconditionally? */ |
@@ -6942,6 +6964,9 @@ static int fan_write_cmd_level(const char *cmd, int *rc) | |||
6942 | if (*rc == -ENXIO) | 6964 | if (*rc == -ENXIO) |
6943 | printk(TPACPI_ERR "level command accepted for unsupported " | 6965 | printk(TPACPI_ERR "level command accepted for unsupported " |
6944 | "access mode %d", fan_control_access_mode); | 6966 | "access mode %d", fan_control_access_mode); |
6967 | else if (!*rc) | ||
6968 | tpacpi_disclose_usertask("procfs fan", | ||
6969 | "set level to %d\n", level); | ||
6945 | 6970 | ||
6946 | return 1; | 6971 | return 1; |
6947 | } | 6972 | } |
@@ -6955,6 +6980,8 @@ static int fan_write_cmd_enable(const char *cmd, int *rc) | |||
6955 | if (*rc == -ENXIO) | 6980 | if (*rc == -ENXIO) |
6956 | printk(TPACPI_ERR "enable command accepted for unsupported " | 6981 | printk(TPACPI_ERR "enable command accepted for unsupported " |
6957 | "access mode %d", fan_control_access_mode); | 6982 | "access mode %d", fan_control_access_mode); |
6983 | else if (!*rc) | ||
6984 | tpacpi_disclose_usertask("procfs fan", "enable\n"); | ||
6958 | 6985 | ||
6959 | return 1; | 6986 | return 1; |
6960 | } | 6987 | } |
@@ -6968,6 +6995,8 @@ static int fan_write_cmd_disable(const char *cmd, int *rc) | |||
6968 | if (*rc == -ENXIO) | 6995 | if (*rc == -ENXIO) |
6969 | printk(TPACPI_ERR "disable command accepted for unsupported " | 6996 | printk(TPACPI_ERR "disable command accepted for unsupported " |
6970 | "access mode %d", fan_control_access_mode); | 6997 | "access mode %d", fan_control_access_mode); |
6998 | else if (!*rc) | ||
6999 | tpacpi_disclose_usertask("procfs fan", "disable\n"); | ||
6971 | 7000 | ||
6972 | return 1; | 7001 | return 1; |
6973 | } | 7002 | } |
@@ -6986,6 +7015,9 @@ static int fan_write_cmd_speed(const char *cmd, int *rc) | |||
6986 | if (*rc == -ENXIO) | 7015 | if (*rc == -ENXIO) |
6987 | printk(TPACPI_ERR "speed command accepted for unsupported " | 7016 | printk(TPACPI_ERR "speed command accepted for unsupported " |
6988 | "access mode %d", fan_control_access_mode); | 7017 | "access mode %d", fan_control_access_mode); |
7018 | else if (!*rc) | ||
7019 | tpacpi_disclose_usertask("procfs fan", | ||
7020 | "set speed to %d\n", speed); | ||
6989 | 7021 | ||
6990 | return 1; | 7022 | return 1; |
6991 | } | 7023 | } |
@@ -6999,8 +7031,12 @@ static int fan_write_cmd_watchdog(const char *cmd, int *rc) | |||
6999 | 7031 | ||
7000 | if (interval < 0 || interval > 120) | 7032 | if (interval < 0 || interval > 120) |
7001 | *rc = -EINVAL; | 7033 | *rc = -EINVAL; |
7002 | else | 7034 | else { |
7003 | fan_watchdog_maxinterval = interval; | 7035 | fan_watchdog_maxinterval = interval; |
7036 | tpacpi_disclose_usertask("procfs fan", | ||
7037 | "set watchdog timer to %d\n", | ||
7038 | interval); | ||
7039 | } | ||
7004 | 7040 | ||
7005 | return 1; | 7041 | return 1; |
7006 | } | 7042 | } |