From 4ac4d6d99fa965a0ad918de379ea6e94d3611fbb Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 2 Mar 2014 18:01:19 +0100 Subject: [PATCH] Fix sleep / suspend keys for Toughbook CF-51 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Hi all, my panasonic cf-51 does no longer react to the suspend and hibernate keys. I cannot tell when this started since I no longer use the machine on a daily basis, but I suspect it started when userspace switched from using /proc/acpi/event to the input layer, wich was quite some time ago ;-) Today I investigated the issue and found that the firmware simply does not generate any event on "key down" for those keys, but only on "key up". The attached patch works around the problem. Best regards, Stefan -- Stefan Seyfried Linux Consultant & Developer -- GPG Key: 0x731B665B B1 Systems GmbH Osterfeldstraße 7 / 85088 Vohburg / http://www.b1-systems.de GF: Ralph Dehner / Unternehmenssitz: Vohburg / AG: Ingolstadt,HRB 3537 >From 7c96fee748cfd3e64732a7ac142f5dea07d7379f Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 2 Mar 2014 17:50:01 +0100 Subject: [PATCH] panasonic-laptop: fix sleep keys on CF-51 At least on my CF-51, both sleep and hibernate keys do not generate "key down" events, only "key up". Because of this, the input layer does ignore both keys. The work around is to generate a key down event before the key up. To avoid double events on non-broken firmware, this is only done if no key down is ever seen for those keys. Signed-off-by: Stefan Seyfried Signed-off-by: Matthew Garrett --- drivers/platform/x86/panasonic-laptop.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/platform/x86/panasonic-laptop.c b/drivers/platform/x86/panasonic-laptop.c index 609d38779b26..3f870972247c 100644 --- a/drivers/platform/x86/panasonic-laptop.c +++ b/drivers/platform/x86/panasonic-laptop.c @@ -449,6 +449,7 @@ static struct attribute_group pcc_attr_group = { /* hotkey input device driver */ +static int sleep_keydown_seen; static void acpi_pcc_generate_keyinput(struct pcc_acpi *pcc) { struct input_dev *hotk_input_dev = pcc->input_dev; @@ -462,6 +463,16 @@ static void acpi_pcc_generate_keyinput(struct pcc_acpi *pcc) "error getting hotkey status\n")); return; } + + /* hack: some firmware sends no key down for sleep / hibernate */ + if ((result & 0xf) == 0x7 || (result & 0xf) == 0xa) { + if (result & 0x80) + sleep_keydown_seen = 1; + if (!sleep_keydown_seen) + sparse_keymap_report_event(hotk_input_dev, + result & 0xf, 0x80, false); + } + if (!sparse_keymap_report_event(hotk_input_dev, result & 0xf, result & 0x80, false)) ACPI_DEBUG_PRINT((ACPI_DB_ERROR, -- 2.39.5