platform/x86: intel-vbtn: match power button on press rather than release
authorMario Limonciello <mario.limonciello@dell.com>
Fri, 4 Aug 2017 17:00:06 +0000 (12:00 -0500)
committerDarren Hart (VMware) <dvhart@infradead.org>
Sat, 5 Aug 2017 21:37:19 +0000 (14:37 -0700)
This fixes a problem where the system gets stuck in a loop
unable to wakeup via power button in s2idle.

The problem happens because:
 - press power button:
   - system emits 0xc0 (power press), event ignored
   - system emits 0xc1 (power release), event processed,
     emited as KEY_POWER
   - set wakeup_mode to true
   - system goes to s2idle
 - press power button
   - system emits 0xc0 (power press), wakeup_mode is true,
     system wakes
   - system emits 0xc1 (power release), event processed,
     emited as KEY_POWER
   - system goes to s2idle again

To avoid this situation, process the presses (which matches what
intel-hid does too).

Verified on an Dell XPS 9365

Signed-off-by: Mario Limonciello <mario.limonciello@dell.com>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Darren Hart (VMware) <dvhart@infradead.org>
drivers/platform/x86/intel-vbtn.c

index 61f10637766108d253058a8b2aba48eb5bb77742..480926786cb8a39f62208cb55681e698822c1826 100644 (file)
@@ -36,8 +36,8 @@ static const struct acpi_device_id intel_vbtn_ids[] = {
 
 /* In theory, these are HID usages. */
 static const struct key_entry intel_vbtn_keymap[] = {
-       { KE_IGNORE, 0xC0, { KEY_POWER } },     /* power key press */
-       { KE_KEY, 0xC1, { KEY_POWER } },        /* power key release */
+       { KE_KEY, 0xC0, { KEY_POWER } },        /* power key press */
+       { KE_IGNORE, 0xC1, { KEY_POWER } },     /* power key release */
        { KE_KEY, 0xC4, { KEY_VOLUMEUP } },             /* volume-up key press */
        { KE_IGNORE, 0xC5, { KEY_VOLUMEUP } },          /* volume-up key release */
        { KE_KEY, 0xC6, { KEY_VOLUMEDOWN } },           /* volume-down key press */