aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/laptops/thinkpad-acpi.txt3
-rw-r--r--drivers/platform/x86/thinkpad_acpi.c28
2 files changed, 26 insertions, 5 deletions
diff --git a/Documentation/laptops/thinkpad-acpi.txt b/Documentation/laptops/thinkpad-acpi.txt
index 1565eefd6fd5..4bc92ea93f25 100644
--- a/Documentation/laptops/thinkpad-acpi.txt
+++ b/Documentation/laptops/thinkpad-acpi.txt
@@ -534,6 +534,8 @@ Events that are never propagated by the driver:
5340x2404 System is waking up from hibernation to undock 5340x2404 System is waking up from hibernation to undock
5350x2405 System is waking up from hibernation to eject bay 5350x2405 System is waking up from hibernation to eject bay
5360x5010 Brightness level changed/control event 5360x5010 Brightness level changed/control event
5370x6000 KEYBOARD: Numlock key pressed
5380x6005 KEYBOARD: Fn key pressed (TO BE VERIFIED)
537 539
538Events that are propagated by the driver to userspace: 540Events that are propagated by the driver to userspace:
539 541
@@ -552,6 +554,7 @@ Events that are propagated by the driver to userspace:
5520x6021 ALARM: a sensor is too hot 5540x6021 ALARM: a sensor is too hot
5530x6022 ALARM: a sensor is extremely hot 5550x6022 ALARM: a sensor is extremely hot
5540x6030 System thermal table changed 5560x6030 System thermal table changed
5570x6040 Nvidia Optimus/AC adapter related (TO BE VERIFIED)
555 558
556Battery nearly empty alarms are a last resort attempt to get the 559Battery nearly empty alarms are a last resort attempt to get the
557operating system to hibernate or shutdown cleanly (0x2313), or shutdown 560operating system to hibernate or shutdown cleanly (0x2313), or shutdown
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
index 77f6e707a2a9..cdcd2388af2b 100644
--- a/drivers/platform/x86/thinkpad_acpi.c
+++ b/drivers/platform/x86/thinkpad_acpi.c
@@ -194,6 +194,10 @@ enum tpacpi_hkey_event_t {
194 TP_HKEY_EV_PEN_REMOVED = 0x500c, /* tablet pen removed */ 194 TP_HKEY_EV_PEN_REMOVED = 0x500c, /* tablet pen removed */
195 TP_HKEY_EV_BRGHT_CHANGED = 0x5010, /* backlight control event */ 195 TP_HKEY_EV_BRGHT_CHANGED = 0x5010, /* backlight control event */
196 196
197 /* Key-related user-interface events */
198 TP_HKEY_EV_KEY_NUMLOCK = 0x6000, /* NumLock key pressed */
199 TP_HKEY_EV_KEY_FN = 0x6005, /* Fn key pressed? E420 */
200
197 /* Thermal events */ 201 /* Thermal events */
198 TP_HKEY_EV_ALARM_BAT_HOT = 0x6011, /* battery too hot */ 202 TP_HKEY_EV_ALARM_BAT_HOT = 0x6011, /* battery too hot */
199 TP_HKEY_EV_ALARM_BAT_XHOT = 0x6012, /* battery critically hot */ 203 TP_HKEY_EV_ALARM_BAT_XHOT = 0x6012, /* battery critically hot */
@@ -201,6 +205,10 @@ enum tpacpi_hkey_event_t {
201 TP_HKEY_EV_ALARM_SENSOR_XHOT = 0x6022, /* sensor critically hot */ 205 TP_HKEY_EV_ALARM_SENSOR_XHOT = 0x6022, /* sensor critically hot */
202 TP_HKEY_EV_THM_TABLE_CHANGED = 0x6030, /* thermal table changed */ 206 TP_HKEY_EV_THM_TABLE_CHANGED = 0x6030, /* thermal table changed */
203 207
208 TP_HKEY_EV_UNK_6040 = 0x6040, /* Related to AC change?
209 some sort of APM hint,
210 W520 */
211
204 /* Misc */ 212 /* Misc */
205 TP_HKEY_EV_RFKILL_CHANGED = 0x7000, /* rfkill switch changed */ 213 TP_HKEY_EV_RFKILL_CHANGED = 0x7000, /* rfkill switch changed */
206}; 214};
@@ -3547,13 +3555,13 @@ static bool hotkey_notify_usrevent(const u32 hkey,
3547 3555
3548static void thermal_dump_all_sensors(void); 3556static void thermal_dump_all_sensors(void);
3549 3557
3550static bool hotkey_notify_thermal(const u32 hkey, 3558static bool hotkey_notify_6xxx(const u32 hkey,
3551 bool *send_acpi_ev, 3559 bool *send_acpi_ev,
3552 bool *ignore_acpi_ev) 3560 bool *ignore_acpi_ev)
3553{ 3561{
3554 bool known = true; 3562 bool known = true;
3555 3563
3556 /* 0x6000-0x6FFF: thermal alarms */ 3564 /* 0x6000-0x6FFF: thermal alarms/notices and keyboard events */
3557 *send_acpi_ev = true; 3565 *send_acpi_ev = true;
3558 *ignore_acpi_ev = false; 3566 *ignore_acpi_ev = false;
3559 3567
@@ -3582,8 +3590,17 @@ static bool hotkey_notify_thermal(const u32 hkey,
3582 "a sensor reports something is extremely hot!\n"); 3590 "a sensor reports something is extremely hot!\n");
3583 /* recommended action: immediate sleep/hibernate */ 3591 /* recommended action: immediate sleep/hibernate */
3584 break; 3592 break;
3593
3594 case TP_HKEY_EV_KEY_NUMLOCK:
3595 case TP_HKEY_EV_KEY_FN:
3596 /* key press events, we just ignore them as long as the EC
3597 * is still reporting them in the normal keyboard stream */
3598 *send_acpi_ev = false;
3599 *ignore_acpi_ev = true;
3600 return true;
3601
3585 default: 3602 default:
3586 pr_alert("THERMAL ALERT: unknown thermal alarm received\n"); 3603 pr_warn("unknown possible thermal alarm or keyboard event received\n");
3587 known = false; 3604 known = false;
3588 } 3605 }
3589 3606
@@ -3668,8 +3685,9 @@ static void hotkey_notify(struct ibm_struct *ibm, u32 event)
3668 &ignore_acpi_ev); 3685 &ignore_acpi_ev);
3669 break; 3686 break;
3670 case 6: 3687 case 6:
3671 /* 0x6000-0x6FFF: thermal alarms */ 3688 /* 0x6000-0x6FFF: thermal alarms/notices and
3672 known_ev = hotkey_notify_thermal(hkey, &send_acpi_ev, 3689 * keyboard events */
3690 known_ev = hotkey_notify_6xxx(hkey, &send_acpi_ev,
3673 &ignore_acpi_ev); 3691 &ignore_acpi_ev);
3674 break; 3692 break;
3675 case 7: 3693 case 7: