aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenrique de Moraes Holschuh <hmh@hmh.eng.br>2011-06-05 15:22:34 -0400
committerMatthew Garrett <mjg@redhat.com>2011-07-07 10:39:00 -0400
commit2d43f671c8fb0fd72e896a8b31e15b98916f707d (patch)
treeb31d9bcadc44e11b4316e16704b6d77b98d86dc9
parentae821c1b2fff22a5b6002e093126156a6d7c8b7b (diff)
thinkpad-acpi: handle some new HKEY 0x60xx events
Handle some user interface events from the newer Lenovo models. We are likely to do something smart with these events in the future, for now, hide the ones we are already certain about from the user and userspace both. * Events 0x6000 and 0x6005 are key-related. 0x6005 is not properly identified yet. Ignore these events, and do not report them. * Event 0x6040 has not been properly identified yet, and we don't know if it is important (looks like it isn't, but still...). Keep reporting it. * Change the message the driver outputs on unknown 0x6xxx events, as all recent events are not related to thermal alarms. Degrade log level from ALERT to WARNING. Thanks to all users who reported these events or asked about them in a number of mailing lists. Your help is highly appreciated, even if I did took a lot of time to act on them. For that I apologise. I will list those that identified the reasons for the events as "reported-by", and I apologise in advance if I leave anyone out: it was not done on purpose, I made the mistake of not properly tagging all event report emails separately, and might have missed some. Signed-off-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br> Reported-by: Markus Malkusch <markus@malkusch.de> Reported-by: Peter Giles <g1l3sp@gmail.com> Signed-off-by: Matthew Garrett <mjg@redhat.com>
-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: