From patchwork Tue Jun 28 07:25:50 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?TWljaGHFgiBLxJlwaWXFhA==?= X-Patchwork-Id: 9202179 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 351FB60757 for ; Tue, 28 Jun 2016 07:26:05 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 26777285E8 for ; Tue, 28 Jun 2016 07:26:05 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1A261285F3; Tue, 28 Jun 2016 07:26:05 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7FC96285E8 for ; Tue, 28 Jun 2016 07:26:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752080AbcF1H0C (ORCPT ); Tue, 28 Jun 2016 03:26:02 -0400 Received: from mail-wm0-f65.google.com ([74.125.82.65]:36016 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752021AbcF1H0B (ORCPT ); Tue, 28 Jun 2016 03:26:01 -0400 Received: by mail-wm0-f65.google.com with SMTP id c82so3368722wme.3 for ; Tue, 28 Jun 2016 00:26:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kempniu.pl; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=zQCoinvnFjYKIp2Ep8MZG2NE0xoBes232IjKN43X+30=; b=t6ezNnyI7KU5IKTfJTv1hMF2uZZm6aWuCDB6Q1gZKh8VzzUDPrzVyu5FUGWSGc04dn eUscFIQOMghPGBdJt5xkJuv+37ima5dLZu0fMOWhfI1MxLQebQYpRhxjwmTr7te6Zbxm 1ZCONIQxXG7sq5KG6ffecr9Uz/11173Fg4CBA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=zQCoinvnFjYKIp2Ep8MZG2NE0xoBes232IjKN43X+30=; b=Uoa9XvSIZjAvVIb/sufV4jft3SyXRwRqr/jwwSKshV6HIR0K+xmKUpUTCdb+JUkIej m1vaQ4QXq4VFwwHLq7ZOUfMVozHe42n+Xq6oHCrvgMLAd7d/4wFTCV7BhISnW+eGHXQs S6Ju3M6CeomZEM+CGeEhysxGc2U3ojZO/naFbJ1mtfT9smCfIAL8+npoJwgdyFqsVdnT D9pBDm6d+0xMR9UwL1MzeN51aJMpCrmcrJGVWVt9qOvx6Y0+xSr+fRnPtm2Cs0qHMBux d0duzAqTASMXo1tJSlODhDampV9aMJMbsXx3aFWdv55L9bk93sRsmfpkEVMhRWq68mb3 kbLg== X-Gm-Message-State: ALyK8tJhv84+R9pxEOdZOkEFm0YlWNp56RYtzdw2QxUMqg7MxS3/V0Kp+fnZ/IPDOHYdyQ== X-Received: by 10.28.228.69 with SMTP id b66mr13594671wmh.25.1467098759542; Tue, 28 Jun 2016 00:25:59 -0700 (PDT) Received: from eudyptula.hq.kempniu.pl. (eudyptula.hq.kempniu.pl. [2001:6a0:200:83b0::fd5a]) by smtp.googlemail.com with ESMTPSA id bu7sm295852wjc.42.2016.06.28.00.25.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 28 Jun 2016 00:25:58 -0700 (PDT) From: =?UTF-8?q?Micha=C5=82=20K=C4=99pie=C5=84?= To: Jonathan Woithe , Darren Hart Cc: Jan-Marek Glogowski , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3] fujitsu-laptop: Support touchpad toggle hotkey on Skylake-based models Date: Tue, 28 Jun 2016 09:25:50 +0200 Message-Id: <1467098750-2742-1-git-send-email-kernel@kempniu.pl> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <20160628010609.GC26713@marvin.atrad.com.au> References: <20160628010609.GC26713@marvin.atrad.com.au> MIME-Version: 1.0 Sender: platform-driver-x86-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: platform-driver-x86@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Haswell-based Fujitsu laptops (Lifebook E734/E744/E754) have a touchpad toggle hotkey (Fn+F4) which is handled transparently to the operating system: while an ACPI notification is sent to FUJ02B1 when Fn+F4 is pressed, touchpad state is properly toggled without any explicit support for this operation in fujitsu-laptop. Skylake-based models (Lifebook E736/E746/E756) also have that hotkey, but the touchpad is not toggled transparently to the operating system. When Fn+F4 is pressed, an ACPI notification is sent to FUJ02E3. A subsequent call to S000 (FUNC_RFKILL) can be used to determine whether the touchpad toggle hotkey was pressed so that an input event can be sent to userspace. Relevant ACPI code: Method (_L21, 0, NotSerialized) { ... If (AHKF) { Notify (\_SB.FEXT, 0x80) } ... } Method (S000, 3, Serialized) { Name (_T_0, Zero) Local0 = Zero While (One) { _T_0 = Arg0 If (_T_0 == Zero) { Local0 |= 0x04000000 Local0 |= 0x02000000 Local0 |= 0x00020000 Local0 |= 0x0200 Local0 |= 0x0100 Local0 |= 0x20 } ElseIf (_T_0 == One) { ... If (AHKF & 0x08) { Local0 |= 0x04000000 AHKF ^= 0x08 } ... } ... Break } Return (Local0) } Pressing Fn+F4 raises GPE 0x21 and sets bit 3 in AHKF. This in turn results in bit 26 being set in the value returned by FUNC_RFKILL called with 1 as its first argument. On Skylake-based models, bit 26 is also set in the value returned by FUNC_RFKILL called with 0 as its first argument (this value is saved in fujitsu_hotkey->rfkill_supported upon module initialization), which suggests that this bit is set on models which do not handle touchpad toggling transparently to the operating system. Note that bit 3 is cleared in AHKF once FUNC_RFKILL is called with 1 as its first argument, which requires fujitsu-laptop to handle this hotkey in a different manner than the other, GIRB-based hotkeys: two input events (press and release) are immediately sent once Fn+F4 is pressed. Reported-and-tested-by: Jan-Marek Glogowski Signed-off-by: Michał Kępień Acked-by: Jonathan Woithe --- Changes from v2: - edited code comment so that it defines "some models" more precisely. Changes from v1: - added KEY_TOUCHPAD_TOGGLE to the FUJ02E3 input device's key bitmap, - added code comment. drivers/platform/x86/fujitsu-laptop.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/platform/x86/fujitsu-laptop.c b/drivers/platform/x86/fujitsu-laptop.c index ce41bc3..36cd743 100644 --- a/drivers/platform/x86/fujitsu-laptop.c +++ b/drivers/platform/x86/fujitsu-laptop.c @@ -856,6 +856,7 @@ static int acpi_fujitsu_hotkey_add(struct acpi_device *device) set_bit(fujitsu->keycode3, input->keybit); set_bit(fujitsu->keycode4, input->keybit); set_bit(fujitsu->keycode5, input->keybit); + set_bit(KEY_TOUCHPAD_TOGGLE, input->keybit); set_bit(KEY_UNKNOWN, input->keybit); error = input_register_device(input); @@ -1060,6 +1061,19 @@ static void acpi_fujitsu_hotkey_notify(struct acpi_device *device, u32 event) } } + /* On some models (first seen on the Skylake-based Lifebook + * E736/E746/E756), the touchpad toggle hotkey (Fn+F4) is + * handled in software; its state is queried using FUNC_RFKILL + */ + if ((fujitsu_hotkey->rfkill_supported & BIT(26)) && + (call_fext_func(FUNC_RFKILL, 0x1, 0x0, 0x0) & BIT(26))) { + keycode = KEY_TOUCHPAD_TOGGLE; + input_report_key(input, keycode, 1); + input_sync(input); + input_report_key(input, keycode, 0); + input_sync(input); + } + break; default: keycode = KEY_UNKNOWN;