From mboxrd@z Thu Jan 1 00:00:00 1970 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 81A083F9FB; Mon, 30 Jun 2025 21:01:33 +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=1751317293; cv=none; b=lU/6IXZoFzLA0MDMF1oypVzJYOdYveUFjZQyvGXEUfboTmSQIIseuZgRVjsWb5+sXPGf2wkZqNpcp0Rt3FaxWv/Xj1qNSnnzLeXq2uscIGcGEtSIg2xj+TafrQT0rGFWIvU3/LVSOBaUWIDi0KDowjN8LHSOcn+XGLibqmCrg5w= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751317293; c=relaxed/simple; bh=qOWiTWWIvEKkSSQt+R/h1mpw4Yt08nrhZNBQp0rU7pw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Hzl7zaQPKsozS4G0C42T0hM7NQyFL+wU4Qv0tH8/356WQ+wM7BNlck/UFz2ujkdy67ERh3CPXzZHW/lCBLfMGLJc9fyPVLct0K1AgL175MyOKewqI6oWkaxAc6XfzkwqtpW1vGjUipdDwNU+YMITd+vtvOpxgTDZL4OVl7tgq10= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=DoTJUXQN; 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="DoTJUXQN" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6BAF4C4CEEB; Mon, 30 Jun 2025 21:01:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1751317293; bh=qOWiTWWIvEKkSSQt+R/h1mpw4Yt08nrhZNBQp0rU7pw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DoTJUXQNngNNeE3UqjzDsQGj84s6qH9+ekfeXI5vTwSAY/sJ3dzfFqoam0ymTi6JA FwYeyOc9iagCWRt94upndoDn9nCYJPN0bVsBmfww67AokPWQ28RuL1Ag6TuXe5DjHd CAcQd74HQrWpgCMpK+13Fq8dZJdfJd/vX1Yl9jANIW+pEtel4q+BXp7kgDq8TPrLbY eGaPgAkI4XXXJgKjBGU8cMvfsQrGSJ/j9ZtQjuh1JckW2Zne1NRThKzC1zO41TSdeX OFWBgliFvFz8f8gCYUXKWnWLuPiPAgM79VRXNKNIvZMT2e21qdQtknlVoXg7j4GkTL ksBvbTFfp9uuw== From: Sasha Levin To: patches@lists.linux.dev, stable@vger.kernel.org Cc: Akira Inoue , Jiri Kosina , Sasha Levin , jikos@kernel.org, bentiss@kernel.org, linux-input@vger.kernel.org Subject: [PATCH AUTOSEL 6.1 06/10] HID: lenovo: Add support for ThinkPad X1 Tablet Thin Keyboard Gen2 Date: Mon, 30 Jun 2025 16:47:13 -0400 Message-Id: <20250630204718.1359222-6-sashal@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250630204718.1359222-1-sashal@kernel.org> References: <20250630204718.1359222-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore X-stable-base: Linux 6.1.142 Content-Transfer-Encoding: 8bit From: Akira Inoue [ Upstream commit a8905238c3bbe13db90065ed74682418f23830c3 ] Add "Thinkpad X1 Tablet Gen 2 Keyboard" PID to hid-lenovo driver to fix trackpoint not working issue. Signed-off-by: Akira Inoue Signed-off-by: Jiri Kosina Signed-off-by: Sasha Levin --- **YES** This commit should be backported to stable kernel trees. Here's my extensive analysis: ## Commit Analysis This commit adds support for the ThinkPad X1 Tablet Thin Keyboard Gen2 by adding its USB device ID (0x60a4) to the hid-lenovo driver. The primary issue being fixed is that the trackpoint (pointing stick) is non-functional without this patch. ## Code Changes Examination 1. **drivers/hid/hid-ids.h**: Adds `USB_DEVICE_ID_LENOVO_X1_TAB2` with value 0x60a4. This follows the existing pattern where X1_TAB is 0x60a3 and X1_TAB3 is 0x60b5. 2. **drivers/hid/hid-lenovo.c**: The device ID is added to 7 locations: - `lenovo_input_mapping()`: Enables X1 tablet keyboard-specific input mappings - `attr_fn_lock_store()`: Enables FnLock LED control functionality - `lenovo_event()`: Handles special key events - `lenovo_led_brightness_set()`: Controls mute/micmute LED indicators - `lenovo_probe()`: Initializes device with tp10ubkbd infrastructure - `lenovo_remove()`: Cleanup handling - `lenovo_devices[]`: Device table entry with HID_GROUP_GENERIC 3. **drivers/hid/hid-multitouch.c**: Adds multitouch support with `MT_CLS_WIN_8_FORCE_MULTI_INPUT` class, consistent with other X1 Tablet devices. ## Stable Backport Criteria This commit meets all the stable kernel backporting criteria: 1. **Fixes a real bug**: The trackpoint is completely non-functional without this patch, affecting users who own this hardware. 2. **Small and contained**: The changes are minimal - just adding a device ID to existing code paths. No new functionality or architectural changes. 3. **Obviously correct**: The pattern is identical to existing X1 Tablet support (Gen1 and Gen3). The commit follows established conventions. 4. **Low risk**: Cannot affect any other hardware since it's guarded by specific device ID checks. 5. **Hardware enablement**: This is pure hardware enablement for a specific device that doesn't work at all without this patch. ## Comparison with Similar Commits Looking at the provided similar commits: - Commits adding X1 Tablet Gen3 support (Similar #2) and X12 Tab Gen2 support (Similar #4) were marked YES for backporting - Both fixed similar issues (non-working buttons, trackpoint, FnLock) - This commit follows the exact same pattern The commit marked NO (Similar #1) only added partial multitouch support without the full hid-lenovo driver integration, which is why it wasn't suitable for stable. ## Conclusion This is a textbook example of a commit that should be backported to stable kernels. It enables basic functionality (trackpoint) for specific hardware that is completely broken without it, using minimal, well- tested code patterns that cannot regress other devices. drivers/hid/hid-ids.h | 1 + drivers/hid/hid-lenovo.c | 8 ++++++++ drivers/hid/hid-multitouch.c | 8 +++++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index e078d2ac92c87..60e30cc9d6ff7 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -790,6 +790,7 @@ #define USB_DEVICE_ID_LENOVO_TPPRODOCK 0x6067 #define USB_DEVICE_ID_LENOVO_X1_COVER 0x6085 #define USB_DEVICE_ID_LENOVO_X1_TAB 0x60a3 +#define USB_DEVICE_ID_LENOVO_X1_TAB2 0x60a4 #define USB_DEVICE_ID_LENOVO_X1_TAB3 0x60b5 #define USB_DEVICE_ID_LENOVO_X12_TAB 0x60fe #define USB_DEVICE_ID_LENOVO_X12_TAB2 0x61ae diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c index a4062f617ba20..90e8b6a0a873d 100644 --- a/drivers/hid/hid-lenovo.c +++ b/drivers/hid/hid-lenovo.c @@ -473,6 +473,7 @@ static int lenovo_input_mapping(struct hid_device *hdev, return lenovo_input_mapping_tp10_ultrabook_kbd(hdev, hi, field, usage, bit, max); case USB_DEVICE_ID_LENOVO_X1_TAB: + case USB_DEVICE_ID_LENOVO_X1_TAB2: case USB_DEVICE_ID_LENOVO_X1_TAB3: return lenovo_input_mapping_x1_tab_kbd(hdev, hi, field, usage, bit, max); default: @@ -584,6 +585,7 @@ static ssize_t attr_fn_lock_store(struct device *dev, break; case USB_DEVICE_ID_LENOVO_TP10UBKBD: case USB_DEVICE_ID_LENOVO_X1_TAB: + case USB_DEVICE_ID_LENOVO_X1_TAB2: case USB_DEVICE_ID_LENOVO_X1_TAB3: ret = lenovo_led_set_tp10ubkbd(hdev, TP10UBKBD_FN_LOCK_LED, value); if (ret) @@ -779,6 +781,7 @@ static int lenovo_event(struct hid_device *hdev, struct hid_field *field, return lenovo_event_cptkbd(hdev, field, usage, value); case USB_DEVICE_ID_LENOVO_TP10UBKBD: case USB_DEVICE_ID_LENOVO_X1_TAB: + case USB_DEVICE_ID_LENOVO_X1_TAB2: case USB_DEVICE_ID_LENOVO_X1_TAB3: return lenovo_event_tp10ubkbd(hdev, field, usage, value); default: @@ -1062,6 +1065,7 @@ static int lenovo_led_brightness_set(struct led_classdev *led_cdev, break; case USB_DEVICE_ID_LENOVO_TP10UBKBD: case USB_DEVICE_ID_LENOVO_X1_TAB: + case USB_DEVICE_ID_LENOVO_X1_TAB2: case USB_DEVICE_ID_LENOVO_X1_TAB3: ret = lenovo_led_set_tp10ubkbd(hdev, tp10ubkbd_led[led_nr], value); break; @@ -1293,6 +1297,7 @@ static int lenovo_probe(struct hid_device *hdev, break; case USB_DEVICE_ID_LENOVO_TP10UBKBD: case USB_DEVICE_ID_LENOVO_X1_TAB: + case USB_DEVICE_ID_LENOVO_X1_TAB2: case USB_DEVICE_ID_LENOVO_X1_TAB3: ret = lenovo_probe_tp10ubkbd(hdev); break; @@ -1380,6 +1385,7 @@ static void lenovo_remove(struct hid_device *hdev) break; case USB_DEVICE_ID_LENOVO_TP10UBKBD: case USB_DEVICE_ID_LENOVO_X1_TAB: + case USB_DEVICE_ID_LENOVO_X1_TAB2: case USB_DEVICE_ID_LENOVO_X1_TAB3: lenovo_remove_tp10ubkbd(hdev); break; @@ -1430,6 +1436,8 @@ static const struct hid_device_id lenovo_devices[] = { */ { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB) }, + { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, + USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB2) }, { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB3) }, { } diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c index 6386043aab0bb..becd4c1ccf93c 100644 --- a/drivers/hid/hid-multitouch.c +++ b/drivers/hid/hid-multitouch.c @@ -2110,12 +2110,18 @@ static const struct hid_device_id mt_devices[] = { HID_DEVICE(BUS_I2C, HID_GROUP_GENERIC, USB_VENDOR_ID_LG, I2C_DEVICE_ID_LG_7010) }, - /* Lenovo X1 TAB Gen 2 */ + /* Lenovo X1 TAB Gen 1 */ { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT, HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8, USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB) }, + /* Lenovo X1 TAB Gen 2 */ + { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT, + HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8, + USB_VENDOR_ID_LENOVO, + USB_DEVICE_ID_LENOVO_X1_TAB2) }, + /* Lenovo X1 TAB Gen 3 */ { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT, HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8, -- 2.39.5