From nobody Mon Feb 9 15:04:28 2026 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 5AA13306489; Sun, 21 Dec 2025 23:43:42 +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=1766360623; cv=none; b=BnQ7X9K3c5H+8/TNYAMZoXpvKSHOmUjVcGbw/825042O6KQlCwOhfU45A/Lo1jEBoFvR61SiwQUlM3nqUvAVsQDNojJt1RzRksa72HpQ2+W9dT6T/cOPKxciFc8Mx0XIq58ZZEKApxkz42v9sN4Vb9FaakXmzOM10M6Y91UYEB4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766360623; c=relaxed/simple; bh=JtcYQIhQiysygEFTNPNuZGpUQYPoGdM3Vu5VA2utTM0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nSrdIlvqOi+4ldBLTk4QeXvioWhy9YD96rn54WAm/uiSwrftWHuzR9seJVG/xGCTZ7UPlqlU1rXzwV8k72bAqXzdouxwccU3s/6Yp16PqoKp9cX5/gocCuheKrTHHu7rlarord6GXKeNxCdTz5E0RA89aR9352FJXjsmTuhU8vA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=WUepClYs; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="WUepClYs" Received: by smtp.kernel.org (Postfix) with ESMTPS id A1959C16AAE; Sun, 21 Dec 2025 23:43:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1766360622; bh=JtcYQIhQiysygEFTNPNuZGpUQYPoGdM3Vu5VA2utTM0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=WUepClYskE0RIyLlU770AppBvd1jPvz2Zd+t8LqIUez+d3kJJS/QczIhZWjt6DVoB wgfQWkrRdWlCR2imzJ0/P9TmmTmla/KyVKVS10QjGzR6YZTgtAXhutAgsivy2bVxX8 HZRETIMMfW6QURpZNVr9v50xxmJCJjFuxRZhY2mGFxUweU/84IU/P6ivBFxB/qCqAH OQIFoeAnrOp93OJIqqBD9t2tfzoDaNBSXmexWLGCFSmiYB4JxzrWsXnQoSO8iLH96h MFLqp5MXLxeYUjc3urzDXu+p+Rr9vRMAn79NdtJtboPf+zmR62dRDUUud/9nF/bY2r /JJbDlr5oH2IQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 91533E66886; Sun, 21 Dec 2025 23:43:42 +0000 (UTC) From: Peter Hutterer via B4 Relay Date: Mon, 22 Dec 2025 09:43:34 +1000 Subject: [PATCH v2 1/4] HID: multitouch: set INPUT_PROP_PRESSUREPAD based on Digitizer/Button Type Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251222-wip-hid-pressurepad-v2-1-054ac9689bb7@who-t.net> References: <20251222-wip-hid-pressurepad-v2-0-054ac9689bb7@who-t.net> In-Reply-To: <20251222-wip-hid-pressurepad-v2-0-054ac9689bb7@who-t.net> To: Jiri Kosina , Benjamin Tissoires , Shuah Khan Cc: Dmitry Torokhov , linux-input@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Vadim Klishko , Peter Hutterer X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1766360621; l=2040; i=peter.hutterer@who-t.net; s=20251222; h=from:subject:message-id; bh=dMjDzKSeawsZaA/hN50AyJBSpCTU67tb7j/TTV1AREQ=; b=BTVFx0y3GbBgjF0Ne37a5wMKd6c7q0RVpqzBIyXM+0p+CNu1JARK3+Rtta4OVHxmwlR8oJxaZ /H7N8K9RNhOA3LEZPn23PoXieS5b9kMwB+MtobwchLj8i2Ud6YWxExS X-Developer-Key: i=peter.hutterer@who-t.net; a=ed25519; pk=QoL66HDbFudb9Xt36p2XxsSohZSHVHesRR9c0pI28a4= X-Endpoint-Received: by B4 Relay for peter.hutterer@who-t.net/20251222 with auth_id=582 X-Original-From: Peter Hutterer Reply-To: peter.hutterer@who-t.net From: Peter Hutterer A Digitizer/Button Type value of 1 indicates the device is a pressurepad, see https://learn.microsoft.com/en-us/windows-hardware/design/component-guideli= nes/touchpad-windows-precision-touchpad-collection#device-capabilities-feat= ure-report Signed-off-by: Peter Hutterer --- drivers/hid/hid-multitouch.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c index 179dc316b4b518d78bdc900d9fd15756c5eba83e..382e6f50c4f7e663af7d028abb8= be7cb2e6e7b8e 100644 --- a/drivers/hid/hid-multitouch.c +++ b/drivers/hid/hid-multitouch.c @@ -81,6 +81,7 @@ MODULE_LICENSE("GPL"); #define MT_INPUTMODE_TOUCHPAD 0x03 =20 #define MT_BUTTONTYPE_CLICKPAD 0 +#define MT_BUTTONTYPE_PRESSUREPAD 1 =20 enum latency_mode { HID_LATENCY_NORMAL =3D 0, @@ -179,6 +180,7 @@ struct mt_device { __u8 inputmode_value; /* InputMode HID feature value */ __u8 maxcontacts; bool is_buttonpad; /* is this device a button pad? */ + bool is_pressurepad; /* is this device a pressurepad? */ bool is_haptic_touchpad; /* is this device a haptic touchpad? */ bool serial_maybe; /* need to check for serial protocol */ =20 @@ -530,8 +532,14 @@ static void mt_feature_mapping(struct hid_device *hdev, } =20 mt_get_feature(hdev, field->report); - if (field->value[usage->usage_index] =3D=3D MT_BUTTONTYPE_CLICKPAD) + switch (field->value[usage->usage_index]) { + case MT_BUTTONTYPE_CLICKPAD: td->is_buttonpad =3D true; + break; + case MT_BUTTONTYPE_PRESSUREPAD: + td->is_pressurepad =3D true; + break; + } =20 break; case 0xff0000c5: @@ -1393,6 +1401,8 @@ static int mt_touch_input_configured(struct hid_devic= e *hdev, =20 if (td->is_buttonpad) __set_bit(INPUT_PROP_BUTTONPAD, input->propbit); + if (td->is_pressurepad) + __set_bit(INPUT_PROP_PRESSUREPAD, input->propbit); =20 app->pending_palm_slots =3D devm_kcalloc(&hi->input->dev, BITS_TO_LONGS(td->maxcontacts), --=20 2.51.1 From nobody Mon Feb 9 15:04:28 2026 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 5BD693090DB; Sun, 21 Dec 2025 23:43:43 +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=1766360623; cv=none; b=nXUMesESgS+BycO1u3vThcDbOcUYUGSp5/+dnpQKw8rc11n5TgoHhPGUXui/CeW9VG7yKYvJf9aWce9hyguDxXai3HaD1fU/cOYAp/bFavP1GWniIzLzXf38eJnr5iHcx1sxkarX+2nlLjOjVbd3+hbnl4crvl7fTzt4/g3xjms= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766360623; c=relaxed/simple; bh=TvL0lYhwjEOU5SVFqrUXzUoQOFLX3XGhJeHQ5qsjSXQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Wh6sgEn7adxcT4dv8EzctmiezHFRmkiKOnr76FO4I2JgLnBO5BwTL7Nvii2EdESkgQjInmcXyzhVUY6lUW+6VoI53wfp+sYmIWOwdfzv0hkGQ5fY1/luVDEPndWSeYoohQiZjIPVUW8hN+oFalZN2+Zwlez2BaqVtwA4j2wCncc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uogptWpF; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="uogptWpF" Received: by smtp.kernel.org (Postfix) with ESMTPS id AE416C116B1; Sun, 21 Dec 2025 23:43:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1766360622; bh=TvL0lYhwjEOU5SVFqrUXzUoQOFLX3XGhJeHQ5qsjSXQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=uogptWpFb5ZOJTMa+25BcPIAMnxcoZZsRM2H1MWSU9sVeaoqhYFNGY8fYXdVVsiN/ UOp4L2wPsQXtO4BFLaPWegXN70DM8roDOQLVnQYZIASuSohMFuc1pb42X3iWtuk3rU zhlPko2kEkSZzNJ5beEmU/2Zg+zsXTdOPUlG8EWYGnDN0oIEEvPHpU5RfSbSf2nnBV 7Abk1Ov6s3MyGBRSc9hpGVqcXEHTJsdGUi8T9aLZULDQBw1CFM0yrvsvfLu+2DT0tL JnaoDrMIrelnTvneGpX2UTK9OF6ect1tTy1YEmNYdryUKfQdlej5YmZzymYhcNwmSK BOdMDVYdfBrNg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id A075EE67497; Sun, 21 Dec 2025 23:43:42 +0000 (UTC) From: Peter Hutterer via B4 Relay Date: Mon, 22 Dec 2025 09:43:35 +1000 Subject: [PATCH v2 2/4] selftests/hid: require hidtools 0.12 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251222-wip-hid-pressurepad-v2-2-054ac9689bb7@who-t.net> References: <20251222-wip-hid-pressurepad-v2-0-054ac9689bb7@who-t.net> In-Reply-To: <20251222-wip-hid-pressurepad-v2-0-054ac9689bb7@who-t.net> To: Jiri Kosina , Benjamin Tissoires , Shuah Khan Cc: Dmitry Torokhov , linux-input@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Vadim Klishko , Peter Hutterer X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1766360621; l=1582; i=peter.hutterer@who-t.net; s=20251222; h=from:subject:message-id; bh=fQfZ3bxD/S+hRVj/cWNhZRvET046tgfhHw/kZkeYAeY=; b=Irf3O3Ipe4uzQyaldbyIlJrFDIdATLmhxOxoFK34R4jPutdlLj+xqvfUayd2FfGJSlaVrs57k 3T3JnOS2PzlCswCpdK9yGzd1KHN3kAWnapvEox5b8+UOSC/cCFFxij+ X-Developer-Key: i=peter.hutterer@who-t.net; a=ed25519; pk=QoL66HDbFudb9Xt36p2XxsSohZSHVHesRR9c0pI28a4= X-Endpoint-Received: by B4 Relay for peter.hutterer@who-t.net/20251222 with auth_id=582 X-Original-From: Peter Hutterer Reply-To: peter.hutterer@who-t.net From: Peter Hutterer Not all our tests really require it but since it's likely pip-installed anyway it's trivial to require the new version, just in case we want to start cleaning up other bits. Signed-off-by: Peter Hutterer --- tools/testing/selftests/hid/tests/conftest.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tools/testing/selftests/hid/tests/conftest.py b/tools/testing/= selftests/hid/tests/conftest.py index 1361ec981db6f79a58cf91e8732dcd7c05c47d38..985a535324b2fbe322e754e561d= 7af6898345b27 100644 --- a/tools/testing/selftests/hid/tests/conftest.py +++ b/tools/testing/selftests/hid/tests/conftest.py @@ -5,6 +5,7 @@ # Copyright (c) 2017 Benjamin Tissoires # Copyright (c) 2017 Red Hat, Inc. =20 +from packaging.version import Version import platform import pytest import re @@ -14,6 +15,19 @@ from .base import HIDTestUdevRule from pathlib import Path =20 =20 +@pytest.fixture(autouse=3DTrue) +def hidtools_version_check(): + HIDTOOLS_VERSION =3D "0.12" + try: + import hidtools + + version =3D hidtools.__version__ # type: ignore + if Version(version) < Version(HIDTOOLS_VERSION): + pytest.skip(reason=3Df"have hidtools {version}, require >=3D{H= IDTOOLS_VERSION}") + except Exception: + pytest.skip(reason=3Df"hidtools >=3D{HIDTOOLS_VERSION} required") + + # See the comment in HIDTestUdevRule, this doesn't set up but it will clean # up once the last test exited. @pytest.fixture(autouse=3DTrue, scope=3D"session") --=20 2.51.1 From nobody Mon Feb 9 15:04:28 2026 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 5A8E5305046; Sun, 21 Dec 2025 23:43:43 +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=1766360623; cv=none; b=gHMf6AMyRthgts7ckOfP20T+fWgji4poUjpOYz407jy1+7Ekz0s6kZR4q3YDqvcQcJRqnooUFAC/sOtZZqW+i2zOMzpO5UdGszAm6Ausk5geypStfruzl6WUUcVS/Fwly/FNHeJLcAY43B2GkYlwAH5uYp+7uSUTFmuD6GwXFF8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766360623; c=relaxed/simple; bh=YmzEJaws+KVzNjeNtRL/Vkx7+rrSIO7vPELP56G9EHs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kDVUHjraxmBtQ5iv2VJj3lMtLeV6ppcuHSE1SmEbOJrXvY6j6if1wj7vRl55MQ0ZJYX1WraVgAoaOuRUZGgwAXAb0BFww5Q/uuqKXiDp9tbGRbQoubqfW+STMN66llUWRuhTShT7HfcDA1Zu65UhzGZDHbCd2WqWqpj8DAJakKE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bQ+FPVbd; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="bQ+FPVbd" Received: by smtp.kernel.org (Postfix) with ESMTPS id B6047C19421; Sun, 21 Dec 2025 23:43:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1766360622; bh=YmzEJaws+KVzNjeNtRL/Vkx7+rrSIO7vPELP56G9EHs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=bQ+FPVbdUPDtMdp1V4jOVRnw3s1rUC3atJxa2/ysd8ooQysnQgsOXZPIFjc4RDlwy EwdBwcxa1WW6FlzAWRJunwjqhEnEgrHIid8SFtnDzXVKwB8vHwZwddAsWPR3fn2XMN goX1Ld+Y7n32Qpyci5k99fScpNX9VAlzvrMb6eOdtxeWjfd20Nf2EY+fFUgkQpx5Zk Kdu+/rRmiZi+TFmzxSdk27wSr96vwTWuM1Kuhy01NNddJe9sz51Jvwq8sM6zI4wF8p QgYeK1brId++ArJKgPOLZySeBMTKKpiYMqnYMAj9Yh15r9Acl1Xh2d8xpS7xLVyf/+ HatWto4fSe1+A== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id AFF36D68BD5; Sun, 21 Dec 2025 23:43:42 +0000 (UTC) From: Peter Hutterer via B4 Relay Date: Mon, 22 Dec 2025 09:43:36 +1000 Subject: [PATCH v2 3/4] selftests/hid: use a enum class for the different button types Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251222-wip-hid-pressurepad-v2-3-054ac9689bb7@who-t.net> References: <20251222-wip-hid-pressurepad-v2-0-054ac9689bb7@who-t.net> In-Reply-To: <20251222-wip-hid-pressurepad-v2-0-054ac9689bb7@who-t.net> To: Jiri Kosina , Benjamin Tissoires , Shuah Khan Cc: Dmitry Torokhov , linux-input@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Vadim Klishko , Peter Hutterer X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1766360621; l=7116; i=peter.hutterer@who-t.net; s=20251222; h=from:subject:message-id; bh=Lc3IOQF10ywFvV7hlfa4v/mu7pLgSPj6/TO/Ja4brfA=; b=be1TXsyc3klUOWVtg9Md0zXS1vSGB/carvnuIXFXabGv6/EIcszBj8qEa/lXtowogLGGmjuUn VUcWeCuDOOzCF/EM537qaOWU5ejZFfyzB5DSXXNd0uVkllCMcdSK+Hu X-Developer-Key: i=peter.hutterer@who-t.net; a=ed25519; pk=QoL66HDbFudb9Xt36p2XxsSohZSHVHesRR9c0pI28a4= X-Endpoint-Received: by B4 Relay for peter.hutterer@who-t.net/20251222 with auth_id=582 X-Original-From: Peter Hutterer Reply-To: peter.hutterer@who-t.net From: Peter Hutterer Instead of multiple spellings of a string-provided argument, let's make this a tad more type-safe and use an enum here. And while we do this fix the two wrong devices: - elan_04f3_313a (HP ZBook Fury 15) is discrete button pad - dell_044e_1220 (Dell Precision 7740) is a discrete button pad Equivalent hid-tools commit https://gitlab.freedesktop.org/libevdev/hid-tools/-/commit/8300a55bf4213c6a= 252cab8cb5b34c9ddb191625 Signed-off-by: Peter Hutterer --- .../testing/selftests/hid/tests/test_multitouch.py | 24 +++++++++++++-----= ---- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/tools/testing/selftests/hid/tests/test_multitouch.py b/tools/t= esting/selftests/hid/tests/test_multitouch.py index ece0ba8e7d34b75d42245e5936ecf804c46b0846..a06a087f00b6991f7514adf7f8c= 713bef1a43563 100644 --- a/tools/testing/selftests/hid/tests/test_multitouch.py +++ b/tools/testing/selftests/hid/tests/test_multitouch.py @@ -9,6 +9,7 @@ from . import base from hidtools.hut import HUT from hidtools.util import BusType +import enum import libevdev import logging import pytest @@ -232,11 +233,17 @@ class Digitizer(base.UHIDTestDevice): return 0 =20 =20 +class HIDButtonType(enum.IntEnum): + CLICKPAD =3D 0 + PRESSUREPAD =3D 1 + DISCRETE_BUTTONS =3D 2 + + class PTP(Digitizer): def __init__( self, name, - type=3D"Click Pad", + buttontype=3DHIDButtonType.CLICKPAD, rdesc_str=3DNone, rdesc=3DNone, application=3D"Touch Pad", @@ -244,11 +251,8 @@ class PTP(Digitizer): max_contacts=3DNone, input_info=3DNone, ): - self.type =3D type.lower().replace(" ", "") - if self.type =3D=3D "clickpad": - self.buttontype =3D 0 - else: # pressurepad - self.buttontype =3D 1 + self.buttontype =3D buttontype + self.clickpad_state =3D False self.left_state =3D False self.right_state =3D False @@ -983,7 +987,7 @@ class BaseTest: uhdev =3D self.uhdev evdev =3D uhdev.get_evdev() =20 - if uhdev.type =3D=3D "clickpad": + if uhdev.buttontype =3D=3D HIDButtonType.CLICKPAD: r =3D uhdev.event(click=3DTrue) events =3D uhdev.next_sync_events() self.debug_reports(r, uhdev, events) @@ -1918,7 +1922,7 @@ class Testdell_044e_1220(BaseTest.TestPTP): def create_device(self): return PTP( "uhid test dell_044e_1220", - type=3D"pressurepad", + buttontype=3DHIDButtonType.DISCRETE_BUTTONS, rdesc=3D"05 01 09 02 a1 01 85 01 09 01 a1 00 05 09 19 01 29 03= 15 00 25 01 75 01 95 03 81 02 95 05 81 01 05 01 09 30 09 31 15 81 25 7f 75= 08 95 02 81 06 09 38 95 01 81 06 05 0c 0a 38 02 81 06 c0 c0 05 0d 09 05 a1= 01 85 08 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03= 25 05 09 51 81 02 75 01 95 03 81 03 05 01 15 00 26 af 04 75 10 55 0e 65 11= 09 30 35 00 46 e8 03 95 01 81 02 26 7b 02 46 12 02 09 31 81 02 c0 55 0c 66= 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 05 0d 09 56 81 02 09 54 25= 05 95 01 75 08 81 02 05 09 19 01 29 03 25 01 75 01 95 03 81 02 95 05 81 03= 05 0d 85 09 09 55 75 08 95 01 25 05 b1 02 06 00 ff 85 0a 09 c5 15 00 26 ff= 00 75 08 96 00 01 b1 02 c0 06 01 ff 09 01 a1 01 85 03 09 01 15 00 26 ff 00= 95 1b 81 02 85 04 09 02 95 50 81 02 85 05 09 03 95 07 b1 02 85 06 09 04 81= 02 c0 06 02 ff 09 01 a1 01 85 07 09 02 95 86 75 08 b1 02 c0 05 0d 09 0e a1= 01 85 0b 09 22 a1 02 09 52 15 00 25 0a 75 08 95 01 b1 02 c0 09 22 a1 00 85= 0c 09 57 09 58 75 01 95=20 02 25 01 b1 02 95 06 b1 03 c0 c0", ) =20 @@ -2018,7 +2022,7 @@ class Testelan_04f3_313a(BaseTest.TestPTP): def create_device(self): return PTP( "uhid test elan_04f3_313a", - type=3D"touchpad", + buttontype=3DHIDButtonType.DISCRETE_BUTTONS, input_info=3D(BusType.I2C, 0x04F3, 0x313A), rdesc=3D"05 01 09 02 a1 01 85 01 09 01 a1 00 05 09 19 01 29 03= 15 00 25 01 75 01 95 03 81 02 95 05 81 03 05 01 09 30 09 31 15 81 25 7f 75= 08 95 02 81 06 75 08 95 05 81 03 c0 06 00 ff 09 01 85 0e 09 c5 15 00 26 ff= 00 75 08 95 04 b1 02 85 0a 09 c6 15 00 26 ff 00 75 08 95 04 b1 02 c0 06 00= ff 09 01 a1 01 85 5c 09 01 95 0b 75 08 81 06 85 0d 09 c5 15 00 26 ff 00 75= 08 95 04 b1 02 85 0c 09 c6 96 80 03 75 08 b1 02 85 0b 09 c7 95 82 75 08 b1= 02 c0 05 0d 09 05 a1 01 85 04 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75= 01 81 02 05 09 09 02 09 03 15 00 25 01 75 01 95 02 81 02 05 0d 95 01 75 04= 25 0f 09 51 81 02 05 01 15 00 26 d7 0e 75 10 55 0d 65 11 09 30 35 00 46 44= 2f 95 01 81 02 46 12 16 26 eb 06 26 eb 06 09 31 81 02 05 0d 15 00 25 64 95= 03 c0 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02= 09 54 25 7f 95 01 75 08 81 02 25 01 75 01 95 08 81 03 09 c5 75 08 95 02 81= 03 05 0d 85 02 09 55 09 59 75 04 95 02 25 0f b1 02 85 07 09 60 75 01 95 01= 15 00 25 01 b1 02 95 0f=20 b1 03 06 00 ff 06 00 ff 85 06 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0= 05 0d 09 0e a1 01 85 03 09 22 a1 00 09 52 15 00 25 0a 75 10 95 01 b1 02 c0= 09 22 a1 00 85 05 09 57 09 58 75 01 95 02 25 01 b1 02 95 0e b1 03 c0 c0 05= 01 09 02 a1 01 85 2a 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 75 01 95 03= 81 02 95 05 81 03 05 01 09 30 09 31 15 81 25 7f 35 81 45 7f 55 00 65 13 75= 08 95 02 81 06 75 08 95 05 81 03 c0 c0", ) @@ -2110,7 +2114,7 @@ class Testsipodev_0603_0002(BaseTest.TestPTP): def create_device(self): return PTP( "uhid test sipodev_0603_0002", - type=3D"clickpad", + buttontype=3DHIDButtonType.CLICKPAD, rdesc=3D"05 01 09 02 a1 01 85 03 09 01 a1 00 05 09 19 01 29 02= 25 01 75 01 95 02 81 02 95 06 81 03 05 01 09 30 09 31 15 80 25 7f 75 08 95= 02 81 06 c0 c0 05 0d 09 05 a1 01 85 04 09 22 a1 02 15 00 25 01 09 47 09 42= 95 02 75 01 81 02 75 01 95 02 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15= 00 26 44 0a 75 0c 55 0e 65 11 09 30 35 00 46 ac 03 95 01 81 02 46 fe 01 26= 34 05 75 0c 09 31 81 02 05 0d c0 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00= 00 75 10 95 01 09 56 81 02 09 54 25 0a 95 01 75 04 81 02 75 01 95 03 81 03= 05 09 09 01 25 01 75 01 95 01 81 02 05 0d 85 0a 09 55 09 59 75 04 95 02 25= 0f b1 02 85 0b 09 60 75 01 95 01 15 00 25 01 b1 02 95 07 b1 03 85 09 06 00= ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 0d 09 0e a1 01 85 06 09= 22 a1 02 09 52 15 00 25 0a 75 08 95 01 b1 02 c0 09 22 a1 00 85 07 09 57 09= 58 75 01 95 02 25 01 b1 02 95 06 b1 03 c0 c0 05 01 09 0c a1 01 85 08 15 00= 25 01 09 c6 75 01 95 01 81 06 75 07 81 03 c0 05 01 09 80 a1 01 85 01 15 00= 25 01 75 01 0a 81 00 0a=20 82 00 0a 83 00 95 03 81 06 95 05 81 01 c0 06 0c 00 09 01 a1 01 85 02 25 01= 15 00 75 01 0a b5 00 0a b6 00 0a b7 00 0a cd 00 0a e2 00 0a a2 00 0a e9 00= 0a ea 00 95 08 81 02 0a 83 01 0a 6f 00 0a 70 00 0a 88 01 0a 8a 01 0a 92 01= 0a a8 02 0a 24 02 95 08 81 02 0a 21 02 0a 23 02 0a 96 01 0a 25 02 0a 26 02= 0a 27 02 0a 23 02 0a b1 02 95 08 81 02 c0 06 00 ff 09 01 a1 01 85 05 15 00= 26 ff 00 19 01 29 02 75 08 95 05 b1 02 c0", ) =20 --=20 2.51.1 From nobody Mon Feb 9 15:04:28 2026 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 5B3E53074B1; Sun, 21 Dec 2025 23:43:43 +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=1766360623; cv=none; b=Cj9CM+QdSDt2iVHwwxOzyYL+UXeN1ijzi3J7HM3Bt07M3AD2TRqeh9UtowOUVQannhZDDjaD/EBQS7PA7M/Lu1v9FyOJf6dQy2zj+qUgzkw/YwPT0jMVYgktTkeXesfAzh01sLZ3R7SXd3SQAIAJgaeLONCKNt/iARa8lX5mXOo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766360623; c=relaxed/simple; bh=s19SV6BEo5VXqWPb8hRIefa7q2CeFinOU9Rrk+C+LCk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hRV9tJuwyD69DWY7miVljzDYk56VF9d/jqWcnUccfcFkkR/oWe+zVAjJEbt2fnFATP6XhueY0HhiZk9Y4GXuvHPtaTwVZTSLE8xzRIp2bXPLxa27sMhYyZnCQ68AFuwBi2h4Pf6sRekULbBYSjhqES4u2/R6GpcL6ne8qMHFNHc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=cMRicV4R; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="cMRicV4R" Received: by smtp.kernel.org (Postfix) with ESMTPS id C6488C2BC87; Sun, 21 Dec 2025 23:43:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1766360622; bh=s19SV6BEo5VXqWPb8hRIefa7q2CeFinOU9Rrk+C+LCk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=cMRicV4RM2drbaB3Fp930I87ScLRZAKq6zvlI6Ru8RKQ1OEIYJ1WgQH0h3WW9GciH CiXT5t8zROajzuzmpB9uokI8g49rnYUFGpoWYryTvf/GmjCX2wDr1px62PD9A/Prp5 82TCTTl4TlldvnD4yowz1VfkPoBbnlkaca7MzLKLlg+K6JS7eXdlq6Onz8y+Xv6CM9 3VRBilZcU3KPfA4PodwM5hZ9GlOgMla/778O503oDH1ogcnI04/uyeoBUYifBt0XJZ 2zqdAZ30BNb9r3+sdlkuEKWviJB2nqG+C7QT5mZWWX0RXbzdGCJOn1hbBxZVWuNXha r6htr60sZl/sA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id BE2B3E67498; Sun, 21 Dec 2025 23:43:42 +0000 (UTC) From: Peter Hutterer via B4 Relay Date: Mon, 22 Dec 2025 09:43:37 +1000 Subject: [PATCH v2 4/4] selftests/hid: add a test for the Digitizer/Button Type pressurepad Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251222-wip-hid-pressurepad-v2-4-054ac9689bb7@who-t.net> References: <20251222-wip-hid-pressurepad-v2-0-054ac9689bb7@who-t.net> In-Reply-To: <20251222-wip-hid-pressurepad-v2-0-054ac9689bb7@who-t.net> To: Jiri Kosina , Benjamin Tissoires , Shuah Khan Cc: Dmitry Torokhov , linux-input@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Vadim Klishko , Peter Hutterer X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1766360621; l=5561; i=peter.hutterer@who-t.net; s=20251222; h=from:subject:message-id; bh=j0qjZKwtNCCu5/YF3Pfm0aG8auUBK2LU4XnpWcX86SM=; b=5HPb77NTJCuJUrI8Fn6q1CovxvLMLMCWKWTaQuOhX9nyCuXuNpmTatCt7dBkrl+27MnoWp84z izgIrMvovXrADD6mRLuf++19y000n5mtL5vYvVZ6NGNFbintzIjNIol X-Developer-Key: i=peter.hutterer@who-t.net; a=ed25519; pk=QoL66HDbFudb9Xt36p2XxsSohZSHVHesRR9c0pI28a4= X-Endpoint-Received: by B4 Relay for peter.hutterer@who-t.net/20251222 with auth_id=582 X-Original-From: Peter Hutterer Reply-To: peter.hutterer@who-t.net From: Peter Hutterer We have to resort to a bit of a hack: python-libevdev gets the properties from libevdev at module init time. If libevdev hasn't been rebuilt with the new property it won't be automatically populated. So we hack around this by constructing the property manually. Signed-off-by: Peter Hutterer --- .../testing/selftests/hid/tests/test_multitouch.py | 39 ++++++++++++++++++= +--- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/hid/tests/test_multitouch.py b/tools/t= esting/selftests/hid/tests/test_multitouch.py index a06a087f00b6991f7514adf7f8c713bef1a43563..fa4fb2054bd4febb1d2497f2787= 944f538b27889 100644 --- a/tools/testing/selftests/hid/tests/test_multitouch.py +++ b/tools/testing/selftests/hid/tests/test_multitouch.py @@ -979,15 +979,36 @@ class BaseTest: assert libevdev.InputEvent(libevdev.EV_ABS.ABS_MT_ORIENTATION,= 90) in events =20 class TestPTP(TestWin8Multitouch): + def test_buttontype(self): + """Check for the right ButtonType.""" + uhdev =3D self.uhdev + assert uhdev is not None + evdev =3D uhdev.get_evdev() + + # If libevdev.so is not yet compiled with INPUT_PROP_PRESSUREP= AD + # python-libevdev won't have it either, let's fake it + if not getattr(libevdev, "INPUT_PROP_PRESSUREPAD", None): + prop =3D libevdev.InputProperty(name=3D"INPUT_PROP_PRESSUR= EPAD", value=3D0x7) + libevdev.INPUT_PROP_PRESSUREPAD =3D prop + libevdev.props.append(prop) + + if uhdev.buttontype =3D=3D HIDButtonType.CLICKPAD: + assert libevdev.INPUT_PROP_BUTTONPAD in evdev.properties + elif uhdev.buttontype =3D=3D HIDButtonType.PRESSUREPAD: + assert libevdev.INPUT_PROP_PRESSUREPAD in evdev.properties + else: + assert libevdev.INPUT_PROP_PRESSUREPAD not in evdev.proper= ties + assert libevdev.INPUT_PROP_BUTTONPAD not in evdev.properti= es + def test_ptp_buttons(self): """check for button reliability. - There are 2 types of touchpads: the click pads and the pressur= e pads. - Each should reliably report the BTN_LEFT events. + There are 3 types of touchpads: click pads + pressure pads and + those with discrete buttons. Each should reliably report the B= TN_LEFT events. """ uhdev =3D self.uhdev evdev =3D uhdev.get_evdev() =20 - if uhdev.buttontype =3D=3D HIDButtonType.CLICKPAD: + if uhdev.buttontype in [HIDButtonType.CLICKPAD, HIDButtonType.= PRESSUREPAD]: r =3D uhdev.event(click=3DTrue) events =3D uhdev.next_sync_events() self.debug_reports(r, uhdev, events) @@ -999,7 +1020,7 @@ class BaseTest: self.debug_reports(r, uhdev, events) assert libevdev.InputEvent(libevdev.EV_KEY.BTN_LEFT, 0) in= events assert evdev.value[libevdev.EV_KEY.BTN_LEFT] =3D=3D 0 - else: + elif uhdev.buttontype =3D=3D HIDButtonType.DISCRETE_BUTTONS: r =3D uhdev.event(left=3DTrue) events =3D uhdev.next_sync_events() self.debug_reports(r, uhdev, events) @@ -2062,6 +2083,16 @@ class Testite_06cb_2968(BaseTest.TestPTP): ) =20 =20 +class Testven_0488_108c(BaseTest.TestPTP): + def create_device(self): + return PTP( + "uhid test ven_0488_108c", + rdesc=3D"05 01 09 02 a1 01 85 06 09 01 a1 00 05 09 19 01 29 03= 15 00 25 01 95 03 75 01 81 02 95 01 75 05 81 03 05 01 09 30 09 31 09 38 15= 81 25 7f 75 08 95 03 81 06 c0 c0 05 0d 09 05 a1 01 85 01 05 0d 09 22 a1 02= 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 81= 03 05 01 15 00 26 ba 0d 75 10 55 0e 65 11 09 30 35 00 46 d0 05 95 01 81 02= 26 d0 06 46 bb 02 09 31 81 02 05 0d 95 01 75 10 26 ff 7f 46 ff 7f 09 30 81= 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 95 01 75= 03 25 05 09 51 81 02 81 03 05 01 15 00 26 ba 0d 75 10 55 0e 65 11 09 30 35= 00 46 d0 05 95 01 81 02 26 d0 06 46 bb 02 09 31 81 02 05 0d 95 01 75 10 26= ff 7f 46 ff 7f 09 30 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95= 02 75 01 81 02 95 01 75 03 25 05 09 51 81 02 81 03 05 01 15 00 26 ba 0d 75= 10 55 0e 65 11 09 30 35 00 46 d0 05 95 01 81 02 26 d0 06 46 bb 02 09 31 81= 02 05 0d 95 01 75 10 26 ff 7f 46 ff 7f 09 30 81 02 c0 55 0c 66 01 10 47 ff= ff 00 00 27 ff ff 00 00=20 75 10 95 01 05 0d 09 56 81 02 09 54 25 05 95 01 75 08 81 02 05 09 09 01 25= 01 75 01 95 01 81 02 95 07 81 03 05 0d 85 02 09 55 75 08 95 01 25 05 b1 02= 09 59 b1 02 06 00 ff 85 03 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 05 0e= 09 01 a1 02 85 13 09 23 15 00 25 64 75 08 95 01 b1 02 c0 c0 05 0d 09 0e a1= 01 85 04 09 22 a1 02 09 52 15 00 25 0a 75 08 95 01 b1 02 c0 09 22 a1 00 85= 05 09 57 09 58 75 01 95 02 25 01 b1 02 95 06 b1 03 c0 c0 06 01 ff 09 02 a1= 01 09 00 85 07 15 00 26 ff 00 75 08 96 12 02 b1 02 c0 06 00 ff 09 01 a1 01= 85 0d 15 00 26 ff 00 75 08 95 11 09 01 81 02 09 01 91 02 c0 05 0e 09 01 a1= 01 85 11 09 35 15 00 26 ff 00 75 08 95 17 b1 02 c0 06 81 ff 09 01 a1 01 09= 20 85 17 15 00 26 ff 00 75 08 95 3f 09 01 81 02 09 01 91 02 c0", + input_info=3D(0x18, 0x0488, 0x108C), + buttontype=3DHIDButtonType.PRESSUREPAD, + ) + + class Testn_trig_1b96_0c01(BaseTest.TestWin8Multitouch): def create_device(self): return Digitizer( --=20 2.51.1