aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/platform
diff options
context:
space:
mode:
authorStefan Seyfried <stefan.seyfried@googlemail.com>2014-03-02 12:01:19 -0500
committerMatthew Garrett <matthew.garrett@nebula.com>2014-04-06 12:58:11 -0400
commit58c688657c73a6a87aa9ea414d510b5827cec298 (patch)
treebf9f4d95bc4a054c5cf1c542595c4bbcda00cceb /drivers/platform
parent18a1a7a1d862ae0794a0179473d08a414dd49234 (diff)
Fix sleep / suspend keys for Toughbook CF-51
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 <seife+kernel@b1-systems.com> 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 <seife+kernel@b1-systems.com> Signed-off-by: Matthew Garrett <matthew.garrett@nebula.com>
Diffstat (limited to 'drivers/platform')
-rw-r--r--drivers/platform/x86/panasonic-laptop.c11
1 files changed, 11 insertions, 0 deletions
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 = {
449 449
450/* hotkey input device driver */ 450/* hotkey input device driver */
451 451
452static int sleep_keydown_seen;
452static void acpi_pcc_generate_keyinput(struct pcc_acpi *pcc) 453static void acpi_pcc_generate_keyinput(struct pcc_acpi *pcc)
453{ 454{
454 struct input_dev *hotk_input_dev = pcc->input_dev; 455 struct input_dev *hotk_input_dev = pcc->input_dev;
@@ -462,6 +463,16 @@ static void acpi_pcc_generate_keyinput(struct pcc_acpi *pcc)
462 "error getting hotkey status\n")); 463 "error getting hotkey status\n"));
463 return; 464 return;
464 } 465 }
466
467 /* hack: some firmware sends no key down for sleep / hibernate */
468 if ((result & 0xf) == 0x7 || (result & 0xf) == 0xa) {
469 if (result & 0x80)
470 sleep_keydown_seen = 1;
471 if (!sleep_keydown_seen)
472 sparse_keymap_report_event(hotk_input_dev,
473 result & 0xf, 0x80, false);
474 }
475
465 if (!sparse_keymap_report_event(hotk_input_dev, 476 if (!sparse_keymap_report_event(hotk_input_dev,
466 result & 0xf, result & 0x80, false)) 477 result & 0xf, result & 0x80, false))
467 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 478 ACPI_DEBUG_PRINT((ACPI_DB_ERROR,