Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp3394815ybp; Sun, 6 Oct 2019 11:00:10 -0700 (PDT) X-Google-Smtp-Source: APXvYqzDLxN4+LxhbPhRbHAIYvrKYacSyZbPNgRS/kPPg6IhTQ4QgByYJoxfxr8rpKIYN5LNWldc X-Received: by 2002:a50:9512:: with SMTP id u18mr25130431eda.182.1570384810659; Sun, 06 Oct 2019 11:00:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570384810; cv=none; d=google.com; s=arc-20160816; b=PkAhTFX6mySIhYH8ykbsja5vuBZilpLlgAIlNujYmACuaZMhI4GRVQFu86NX0uGNVI QpRhMDHgYjSJ/wnppZ/p9i2VU800yyV1plAl8O6f72CNIf/o3tEEZTOp+L1lmG14a01Y DpRSiQr2GCpUTo/JghMnaByLotipfNtqP4/DLKAkAZYNe1rWlyI/DkaK+9SBComt4EfT jEFL5ry7CEEArBdMBUmlwpKHZ0zz9F9MVGb4zJiazz9c2QZxf2+NV5+kRmojZYjpfLw+ 40BoSD7a/lK3XkmmUSUy3fz0pmhj+8NLJhDXi2ycbZ8rG8qOtgUcvC4Z1/HHhZMJD45+ z5kw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=vOPPaW0QXMKmLm58fA+RaNRRDLRhQo6WBtUQ9NOS9Gw=; b=fnZnRLqjd1XzCwVrPGyp9TbvgqEs5+Xdj+3J1C8p9dvgMfJWM6GkIkJCDKbqWEyhr0 ZO4kHfwRaSgS2T5vAWR5IIlFnPGJC9gGzu3AvaAbBoan2m5Hsc00oQ5eIwpAUCTQHn0n xTkflop9tzb7+J6FLTcr/AdPQYtiy75M8kinjduSlNJg5hF7CmXNHYZwtNS9nBnBU3sU /5E1fICyPusdNnHtOHaHHYhhXzFk08nufTwOaSQXsf6p1pVXpMqXUTBX8E+U/vFUsmZy 2nsXYWKIMGD8Q7n1hgtIxBOpZebuJw/jn5u88jpJkkICrIEVdCuZYyh12p/bjZ1780+/ TIMQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=oQ4Vt6xZ; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j4si8332465edl.192.2019.10.06.10.59.46; Sun, 06 Oct 2019 11:00:10 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=oQ4Vt6xZ; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729235AbfJFRad (ORCPT + 99 others); Sun, 6 Oct 2019 13:30:33 -0400 Received: from mail.kernel.org ([198.145.29.99]:56406 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727981AbfJFRab (ORCPT ); Sun, 6 Oct 2019 13:30:31 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 77BB32087E; Sun, 6 Oct 2019 17:30:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1570383030; bh=loZr7MLJpU4XU6TOPh2BVQXDVFm5QAyJaqArvekhQzo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oQ4Vt6xZkK/+gPLhJ0GqSt5BXK/R4s4H1y9S2ZVarnZVzWGndcPhlI7FHHYcgzyzL qex7o631UgA6FNTopkYPEsYuoe7x9Sq2ckiZAqfgw1/60b0S85MjIn+GdhtacPUprY NptodcaNucVzWKqbllxbixMwFbzxpVoU5bxwx/zg= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Joao Moreno , Benjamin Tissoires , Sasha Levin Subject: [PATCH 4.19 060/106] HID: apple: Fix stuck function keys when using FN Date: Sun, 6 Oct 2019 19:21:06 +0200 Message-Id: <20191006171149.254376705@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191006171124.641144086@linuxfoundation.org> References: <20191006171124.641144086@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Joao Moreno [ Upstream commit aec256d0ecd561036f188dbc8fa7924c47a9edfd ] This fixes an issue in which key down events for function keys would be repeatedly emitted even after the user has raised the physical key. For example, the driver fails to emit the F5 key up event when going through the following steps: - fnmode=1: hold FN, hold F5, release FN, release F5 - fnmode=2: hold F5, hold FN, release F5, release FN The repeated F5 key down events can be easily verified using xev. Signed-off-by: Joao Moreno Co-developed-by: Benjamin Tissoires Signed-off-by: Benjamin Tissoires Signed-off-by: Sasha Levin --- drivers/hid/hid-apple.c | 49 +++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c index 1cb41992aaa1f..d0a81a03ddbdd 100644 --- a/drivers/hid/hid-apple.c +++ b/drivers/hid/hid-apple.c @@ -57,7 +57,6 @@ MODULE_PARM_DESC(swap_opt_cmd, "Swap the Option (\"Alt\") and Command (\"Flag\") struct apple_sc { unsigned long quirks; unsigned int fn_on; - DECLARE_BITMAP(pressed_fn, KEY_CNT); DECLARE_BITMAP(pressed_numlock, KEY_CNT); }; @@ -184,6 +183,8 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input, { struct apple_sc *asc = hid_get_drvdata(hid); const struct apple_key_translation *trans, *table; + bool do_translate; + u16 code = 0; if (usage->code == KEY_FN) { asc->fn_on = !!value; @@ -192,8 +193,6 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input, } if (fnmode) { - int do_translate; - if (hid->product >= USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI && hid->product <= USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS) table = macbookair_fn_keys; @@ -205,25 +204,33 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input, trans = apple_find_translation (table, usage->code); if (trans) { - if (test_bit(usage->code, asc->pressed_fn)) - do_translate = 1; - else if (trans->flags & APPLE_FLAG_FKEY) - do_translate = (fnmode == 2 && asc->fn_on) || - (fnmode == 1 && !asc->fn_on); - else - do_translate = asc->fn_on; - - if (do_translate) { - if (value) - set_bit(usage->code, asc->pressed_fn); - else - clear_bit(usage->code, asc->pressed_fn); - - input_event(input, usage->type, trans->to, - value); - - return 1; + if (test_bit(trans->from, input->key)) + code = trans->from; + else if (test_bit(trans->to, input->key)) + code = trans->to; + + if (!code) { + if (trans->flags & APPLE_FLAG_FKEY) { + switch (fnmode) { + case 1: + do_translate = !asc->fn_on; + break; + case 2: + do_translate = asc->fn_on; + break; + default: + /* should never happen */ + do_translate = false; + } + } else { + do_translate = asc->fn_on; + } + + code = do_translate ? trans->to : trans->from; } + + input_event(input, usage->type, code, value); + return 1; } if (asc->quirks & APPLE_NUMLOCK_EMULATION && -- 2.20.1