Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp3387349ybp; Sun, 6 Oct 2019 10:49:03 -0700 (PDT) X-Google-Smtp-Source: APXvYqz/KLlrwNFcb3d1jt32BKXhNfXK9aWd2YTMxgZLsZc+yn8FC82HRyDM5V2iWTQECY5CZpO/ X-Received: by 2002:a50:ab58:: with SMTP id t24mr25443324edc.131.1570384143741; Sun, 06 Oct 2019 10:49:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570384143; cv=none; d=google.com; s=arc-20160816; b=TaJalXuF60m9nIqKB+Uvr2GSbq1uPnmYpIzj0/3njASCxaKXXBlSiI+sGe3oryMaPU 08QHMtpRrZWzvV4U5LzPH5HflwpHZBeLuIYMLGZ4aRJlSI2ZLDcDSOZnE7uSetXYkgDS 0+QQRFEX4AlQj+fAnZbMMzZjsHF4UHrvrC0zf6pAdq7jUNyVj6EIcQyCERHaRptNHOva wFjSMjZ0WTRrwnJ2O8V+uQDVS0RnGWFG9WAKL7ADmpkwiwLSWldLt+phdmA3mtRQhgax UPNDLaI7iafbSrP+27yz8dZr3JbQRG3NyycePydNH0Gkk/Z8Zrb7FvciBiQFtakEI4L8 9Ohw== 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=yRsps2E67/9I7IeTmgnd/FJXGKDQYBQXi7ZnJkRuyYc=; b=oCWgQXK4xF3Yl+Vl2o82bk7en7gl7ItSgQZlKu2MQ2FF8ftCN5Z7vtrorS/+rM6lbi vmgD2O8oURipM1+99IDukxpvo0y/moG+abLgtdzvPzV9HYp/zoXNobjPVG5bx7a5Wgyw xecUhbtQVozdkkczB8x8XUwqTR+0Q+t2MMdHa9cRe3lLKbh2jxjadWefbfFgOhALSHk/ ZvyMOSih9yKaxz9BeTrAvTqEodiIeJbb1k2E4y9pB48q2Ricdnf/f60xlV/g3mU9Bf81 DM45iuBN9uRtLCb+bkGyhNOf2L6T+INxFyWNoel7blj5a3mwJfcZUMhxqg68bXqrQuGj 4Rlg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=iuKlhzvK; 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 c19si8250138ede.360.2019.10.06.10.48.39; Sun, 06 Oct 2019 10:49:03 -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=iuKlhzvK; 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 S1731541AbfJFRng (ORCPT + 99 others); Sun, 6 Oct 2019 13:43:36 -0400 Received: from mail.kernel.org ([198.145.29.99]:43504 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730946AbfJFRnc (ORCPT ); Sun, 6 Oct 2019 13:43:32 -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 C980221479; Sun, 6 Oct 2019 17:43:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1570383811; bh=fw70Y8GuPTIYaTwZ+t61VIeVfbkLgrEAuV3Y4OcKnl0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=iuKlhzvKDB9CotsZyB+UI08RWt2V6WSH5RLtcdHXEzwBukUUo5AciZxHd5I174jDp aMR4ECgpP8+70lIU3LpxmVexcZT3OIFXvlkMY9OKxuL3F3gF0KJx8AH2Q4j4PmtZf5 iLuyPz3YkydE/KTQeqHqUBgNhx2alck09ZsjAmEI= 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 5.3 104/166] HID: apple: Fix stuck function keys when using FN Date: Sun, 6 Oct 2019 19:21:10 +0200 Message-Id: <20191006171222.267311775@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191006171212.850660298@linuxfoundation.org> References: <20191006171212.850660298@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 81df62f48c4c3..6ac8becc2372e 100644 --- a/drivers/hid/hid-apple.c +++ b/drivers/hid/hid-apple.c @@ -54,7 +54,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); }; @@ -181,6 +180,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; @@ -189,8 +190,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; @@ -202,25 +201,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