Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp3390935ybp; Sun, 6 Oct 2019 10:54:09 -0700 (PDT) X-Google-Smtp-Source: APXvYqxL9QeI1pZ1461ePjHPw0P/pgsZdzXhNXSWYLT5O054cCchhGHqinmMAZwajk9cyOxWp6xF X-Received: by 2002:a50:fa09:: with SMTP id b9mr25571751edq.165.1570384449369; Sun, 06 Oct 2019 10:54:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570384449; cv=none; d=google.com; s=arc-20160816; b=Glu/rkjgeUzlxZ+fgbjMqXRxoRy6sTdqFElJWRr6sycrrKF28LOpWVPrAOJ+sjmcXg +HNCBYoy4T0ai8DWfZGzV3TSPuTnO4GLktr/NwyLJmdynGjvzh6Im9aYszqGtTGfsZ2a kCOq1aEjKmZbxOGb8TLnxCPKUQDWQ2Q/3FGu2QWe0KS2ADspZL/bdYcKeEJns5/l50Ad PScNDck0PBJxbAHvk3FZFh4xwgsqJ4ZuZjQizm/+SVJDyBCh/odJFwvKfyeRk3WsyOES VLIKbkTwkyeeIDx/XiuaYqe0k3nBKGBP9X9y+riRbbCzKBt90PSdJ+jyd9u4bE0aiRFx XKqA== 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=j6EHKvX6t+6bIPmiPH1BlFAdisCrZqeprcM2jjpE9DekVwBtg1MKoXPgjHwjnJVMZD ORa2Z/OgfBaIny6FJBdkhr09XF8pACkm8vtaxr8OjHJAwqRoVV0YjpcpuvVlbaAE0oxG SyiQ2TkClq6oHrO0UfgsUw1jALaocnI8qIFvwWQOkpVXNAk2nAQGTtxu3Ib4Wi4I9Me+ qvr0ZSbYjTzQh6TPgcur396zVb2lih27b0T80jbffSTTYLb1GlRByUfE3VmArXneqkLB rDX69WMxnymTPqbe/YUR9OJGKQyxgE05mxfqo1r07nnKrSkkKKajobrPG0sBka9vXW7n Wkrw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=WH98sc5+; 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 u14si7188417edq.167.2019.10.06.10.53.45; Sun, 06 Oct 2019 10:54:09 -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=WH98sc5+; 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 S1727607AbfJFRxo (ORCPT + 99 others); Sun, 6 Oct 2019 13:53:44 -0400 Received: from mail.kernel.org ([198.145.29.99]:36534 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729878AbfJFRhc (ORCPT ); Sun, 6 Oct 2019 13:37: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 4728B2053B; Sun, 6 Oct 2019 17:37:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1570383451; bh=fw70Y8GuPTIYaTwZ+t61VIeVfbkLgrEAuV3Y4OcKnl0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WH98sc5+yT/afyQGjtvWpCc1AIkVJEOjvOcGy1OKM9gPkc3QUWRpACsZAJafpNlFS OT9qsCZdzVCYjQy+3Yy1fHlOBgqi81w9j5evFvJdZW1ssuCykrPmsfccm8QdZyBWGj 3fueP6rF0cFetzxwl+ivDn6zEhW3zqjDhZIlh6h0= 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.2 109/137] HID: apple: Fix stuck function keys when using FN Date: Sun, 6 Oct 2019 19:21:33 +0200 Message-Id: <20191006171218.091778682@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191006171209.403038733@linuxfoundation.org> References: <20191006171209.403038733@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