Received: by 2002:ab2:6857:0:b0:1ef:ffd0:ce49 with SMTP id l23csp2583105lqp; Mon, 25 Mar 2024 03:30:53 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCWF8KqW7iDmk8yt+I1ANQbxkSvOPBGdheARvcYwFhnJ5CVOwCRTDmzPJf6XdMxzUCU8yXMyHJy+mVDuBlpgl4TJut9CIEQcdD22Af5y7g== X-Google-Smtp-Source: AGHT+IEbBdXi4/Aih4Jf0r5sFyELyRbx2jwdL7laxM/PEEjqnaIakRlqVXYQmmMKg4YN+Cfh5Wmz X-Received: by 2002:a17:902:7045:b0:1e0:acc0:6c2 with SMTP id h5-20020a170902704500b001e0acc006c2mr3893768plt.57.1711362653090; Mon, 25 Mar 2024 03:30:53 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1711362653; cv=pass; d=google.com; s=arc-20160816; b=nGdI142j6Q9Y2m6CdwJG6dXgtcCHYsxIjwQQy8GmCeS93ON5qzYalwCH5WojJj2lnN akPosNwlQ6uhzW5npQDTuHsP8N++2Tv7bT4+sQiBuzEn1s1Ye14kHP1LK3tWpSV6CkJ1 YPrvsDmkaVUI0YStBsvmUPFdWAsArWMCdYcZJyL5zSeqw1+h3iDSyTYpcRGh5K7jO8YC NsDqw8R8XbXaJhpQUxlPMe5SiJzzfAKCniyNwG4SaHygo4R4mzug3LHJVKfqWXMiwJPf 7yeM8jVzAJJ4R5bADAC6sr6C5NzLet3jqq2PJJwCT/47AplDawUAXydMh7WgLBdmz40w oLRQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=euBENl+6+8fpK8SPR4ciXjJmM3bgmBVX8DRgQfBGwYE=; fh=vSTrMoZsxl3//Kboz4HO9SlBz9zMvttrkeApKau3fxY=; b=eLB6dTPRyQugwAYsdTNpii2vVjBF6vfWG+CD4rvvEOo2dQzHknlTC2zWFac1iXwdOV Qrdmfso3hEvgSt7ZJcPNHskKvg0DIi3NsHKUSa/pON+Tqj85mez7ee2kMyuxIwcZSocv l7tSMyxxnhpcuEvmTPypDi83D/8W7xz8nUCvrjaN2aD5Au1ztlkap5oXsr0xjq4FDNKw 6Tv7pEemGfODGTVKBNzdEeFavSupoc1JpvTqyI/aRk0HZRa6RbkA489ePVTa9YLlxbmu IoqAQkUW887qXy48Cz+Z1soJvn6v+sBvxcVTiD3/ygdemOur2H168XR9VNRtbekUDcVX qVbQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=ic4yJkPb; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-116171-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-116171-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id lk7-20020a17090308c700b001e0cd897532si565347plb.10.2024.03.25.03.30.52 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Mar 2024 03:30:53 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-116171-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=ic4yJkPb; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-116171-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-116171-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id F27462A8320 for ; Mon, 25 Mar 2024 10:22:02 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id D55993B6951; Mon, 25 Mar 2024 03:33:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ic4yJkPb" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6580517BB0E; Sun, 24 Mar 2024 23:42:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711323752; cv=none; b=TTcyDlE5AWKBF+ic+QV9WiFkuHdTclESVEr8Du3HyBi7L3Nccsaewzy9oDMyFw5ldbW5FxukqAcLvqhcVi4+iLZqMuR6+l2k4yu934VGwFfdBp+0H0sMezhTSaAd5BB2qjPcfMA40XqqSAajspb53RG1BeP2MPCfc6eXZosex2A= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711323752; c=relaxed/simple; bh=EhfoDP/XImJDzEgHFjKQbGQJRU+kHbEc34Ec+kJzGOQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CR96TazX3IWDuRPi90WLm0ksuVC17U5EI12tBZDqk2IY2/VLR8DCuLGYIzHGDDae2XLu1i0QpuZuyTKgWl2EW4hQyNG9pGL4xl5UduPjL0YWTFUqSGNS/+3SzZeCSiGFy1KFN43F+PE4QpRrhcI6gBkRDo9bHt6COYb+PXn/Zg0= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ic4yJkPb; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id A3A17C433F1; Sun, 24 Mar 2024 23:42:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1711323752; bh=EhfoDP/XImJDzEgHFjKQbGQJRU+kHbEc34Ec+kJzGOQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ic4yJkPbI1P9IH5IbEOzli0jmdy0GmmPIxVGdhBglckzcSQEMk71QP7TKbz3yNk6x Z0uvwUYPd03+CnKxoViz5DbPyD+CgFSXwHAtDh3KqNkg9rwv8jgz1ALYvhLdi/R7pj dWxXvmPhFTzb6jGxbbToi6SslVrQcei2LS5GpwvVlPPrHyQtKg+1PggfQCvxF4lFS7 M29nYtXpI5tBrNFVsMR5xHV+7cPXKthf6Wb8FT2YhXcoZhEi78kS7Ti1tOc4ulXnNI uJT8F/36sIlVqJaHP4AlDG6th/p29mxYJ5yJCXhdyRb20WOngJXjEtLq6M0cQbKe9T nqgJZPPNAHjnw== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Mikhail Khvainitski , Jiri Kosina , Sasha Levin Subject: [PATCH 5.10 127/238] HID: lenovo: Add middleclick_workaround sysfs knob for cptkbd Date: Sun, 24 Mar 2024 19:38:35 -0400 Message-ID: <20240324234027.1354210-128-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240324234027.1354210-1-sashal@kernel.org> References: <20240324234027.1354210-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit From: Mikhail Khvainitski [ Upstream commit 2814646f76f8518326964f12ff20aaee70ba154d ] Previous attempt to autodetect well-behaving patched firmware introduced in commit 46a0a2c96f0f ("HID: lenovo: Detect quirk-free fw on cptkbd and stop applying workaround") has shown that there are false-positives on original firmware (on both 1st gen and 2nd gen keyboards) which causes the middle button click workaround to be mistakenly disabled. This commit adds explicit parameter to sysfs to control this workaround. Fixes: 46a0a2c96f0f ("HID: lenovo: Detect quirk-free fw on cptkbd and stop applying workaround") Fixes: 43527a0094c1 ("HID: lenovo: Restrict detection of patched firmware only to USB cptkbd") Signed-off-by: Mikhail Khvainitski Signed-off-by: Jiri Kosina Signed-off-by: Sasha Levin --- drivers/hid/hid-lenovo.c | 57 +++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c index 249af8d26fe78..c9fdeffbe1a9e 100644 --- a/drivers/hid/hid-lenovo.c +++ b/drivers/hid/hid-lenovo.c @@ -53,10 +53,10 @@ struct lenovo_drvdata { /* 0: Up * 1: Down (undecided) * 2: Scrolling - * 3: Patched firmware, disable workaround */ u8 middlebutton_state; bool fn_lock; + bool middleclick_workaround_cptkbd; }; #define map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, EV_KEY, (c)) @@ -418,6 +418,36 @@ static ssize_t attr_sensitivity_store_cptkbd(struct device *dev, return count; } +static ssize_t attr_middleclick_workaround_show_cptkbd(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct hid_device *hdev = to_hid_device(dev); + struct lenovo_drvdata *cptkbd_data = hid_get_drvdata(hdev); + + return snprintf(buf, PAGE_SIZE, "%u\n", + cptkbd_data->middleclick_workaround_cptkbd); +} + +static ssize_t attr_middleclick_workaround_store_cptkbd(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t count) +{ + struct hid_device *hdev = to_hid_device(dev); + struct lenovo_drvdata *cptkbd_data = hid_get_drvdata(hdev); + int value; + + if (kstrtoint(buf, 10, &value)) + return -EINVAL; + if (value < 0 || value > 1) + return -EINVAL; + + cptkbd_data->middleclick_workaround_cptkbd = !!value; + + return count; +} + static struct device_attribute dev_attr_fn_lock = __ATTR(fn_lock, S_IWUSR | S_IRUGO, @@ -429,10 +459,16 @@ static struct device_attribute dev_attr_sensitivity_cptkbd = attr_sensitivity_show_cptkbd, attr_sensitivity_store_cptkbd); +static struct device_attribute dev_attr_middleclick_workaround_cptkbd = + __ATTR(middleclick_workaround, S_IWUSR | S_IRUGO, + attr_middleclick_workaround_show_cptkbd, + attr_middleclick_workaround_store_cptkbd); + static struct attribute *lenovo_attributes_cptkbd[] = { &dev_attr_fn_lock.attr, &dev_attr_sensitivity_cptkbd.attr, + &dev_attr_middleclick_workaround_cptkbd.attr, NULL }; @@ -483,23 +519,7 @@ static int lenovo_event_cptkbd(struct hid_device *hdev, { struct lenovo_drvdata *cptkbd_data = hid_get_drvdata(hdev); - if (cptkbd_data->middlebutton_state != 3) { - /* REL_X and REL_Y events during middle button pressed - * are only possible on patched, bug-free firmware - * so set middlebutton_state to 3 - * to never apply workaround anymore - */ - if (hdev->product == USB_DEVICE_ID_LENOVO_CUSBKBD && - cptkbd_data->middlebutton_state == 1 && - usage->type == EV_REL && - (usage->code == REL_X || usage->code == REL_Y)) { - cptkbd_data->middlebutton_state = 3; - /* send middle button press which was hold before */ - input_event(field->hidinput->input, - EV_KEY, BTN_MIDDLE, 1); - input_sync(field->hidinput->input); - } - + if (cptkbd_data->middleclick_workaround_cptkbd) { /* "wheel" scroll events */ if (usage->type == EV_REL && (usage->code == REL_WHEEL || usage->code == REL_HWHEEL)) { @@ -976,6 +996,7 @@ static int lenovo_probe_cptkbd(struct hid_device *hdev) cptkbd_data->middlebutton_state = 0; cptkbd_data->fn_lock = true; cptkbd_data->sensitivity = 0x05; + cptkbd_data->middleclick_workaround_cptkbd = true; lenovo_features_set_cptkbd(hdev); ret = sysfs_create_group(&hdev->dev.kobj, &lenovo_attr_group_cptkbd); -- 2.43.0