Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

platform/x86: intel-vbtn: match power button on press rather than release

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>

authored by

Mario Limonciello and committed by
Darren Hart (VMware)
946da699 51391caf

+2 -2
+2 -2
drivers/platform/x86/intel-vbtn.c
··· 36 36 37 37 /* In theory, these are HID usages. */ 38 38 static const struct key_entry intel_vbtn_keymap[] = { 39 - { KE_IGNORE, 0xC0, { KEY_POWER } }, /* power key press */ 40 - { KE_KEY, 0xC1, { KEY_POWER } }, /* power key release */ 39 + { KE_KEY, 0xC0, { KEY_POWER } }, /* power key press */ 40 + { KE_IGNORE, 0xC1, { KEY_POWER } }, /* power key release */ 41 41 { KE_KEY, 0xC4, { KEY_VOLUMEUP } }, /* volume-up key press */ 42 42 { KE_IGNORE, 0xC5, { KEY_VOLUMEUP } }, /* volume-up key release */ 43 43 { KE_KEY, 0xC6, { KEY_VOLUMEDOWN } }, /* volume-down key press */