From: "Mark Pearson" <mpearson-lenovo@squebb.ca>
To: "Hans de Goede" <johannes.goede@oss.qualcomm.com>,
"Derek J . Clark" <derekjohn.clark@gmail.com>,
"Jiri Kosina" <jikos@kernel.org>,
"Benjamin Tissoires" <bentiss@kernel.org>
Cc: linux-input@vger.kernel.org
Subject: Re: [PATCH] HID: lenovo: suppress spurious F23 key events on ThinkPad T14s gen6/7 snapdragon
Date: Tue, 10 Nov 2026 07:27:53 -0500 [thread overview]
Message-ID: <35bbae20-c166-4889-bce3-36453dda1cd7@app.fastmail.com> (raw)
In-Reply-To: <032eb56b-89b8-4b5e-b291-4d4955e87009@oss.qualcomm.com>
On Tue, Nov 10, 2026, at 4:36 AM, Hans de Goede wrote:
> Hi,
>
> On 10-Nov-26 01:49, Mark Pearson wrote:
>> Hi Hans
>>
>> On Mon, Nov 9, 2026, at 4:43 PM, Hans de Goede wrote:
>>> The Lenovo ThinkPad T14s gen6/7 snapdragon version I2C-HID keyboard sends
>>> spurirous F23 key-events when the Fn key is pressed/released. Leading to
>>
>> Minor - typo (spurirous)
>
> Ack.
>
>>> e.g. garbage ESC-sequences in the terminal when doing FN key combos.
>>>
>>> A hwdb entry was added to map these to KEY_UNKNOWN [1], but this also maps
>>> the F23 part of the left-meta + left-shift + F23 combo send by the co-pilot
>>> key to KEY_UNKNOWN making that key unusable.
>>>
>>> Add a raw_event filter which removes any 0x72 codes from the 6 scancodes
>>> reported in the standard HID keyboard boot protocol report, but only when
>>> the report's modifier byte is not 0x0a to preserve the F23 press event
>>> when the co-pilot key is pressed.
>>>
>> Interesting - I'd missed that.
>>
>> Should I be flagging this to the FW team? I think I'm unlikely to get anything fixed at this point realistically - so don't want to block the patch...but if there's something we can learn from this for maybe the next generation?
>
> For future hw it would be nice if just pressing Fn by itself would not send
> any spurious keypresses. Or at least not on the I2C-HID side. If this is
> an EC event instead we can just filter it in the EC driver.
>
Ack. Thanks - I'll let them know.
>
>>> Link: https://github.com/systemd/systemd/pull/44733 [1]
>>> Signed-off-by: Hans de Goede <johannes.goede@oss.qualcomm.com>
>>> ---
>>> drivers/hid/hid-ids.h | 1 +
>>> drivers/hid/hid-lenovo.c | 21 +++++++++++++++++++++
>>> 2 files changed, 22 insertions(+)
>>>
>>> diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
>>> index 994e8bc69924..70d18d32fe3c 100644
>>> --- a/drivers/hid/hid-ids.h
>>> +++ b/drivers/hid/hid-ids.h
>>> @@ -473,6 +473,7 @@
>>> #define USB_DEVICE_ID_EDIFIER_QR30 0xa101 /* EDIFIER Hal0 2.0 SE */
>>>
>>> #define USB_VENDOR_ID_ELAN 0x04f3
>>> +#define I2C_DEVICE_ID_ELAN_LENOVO_T14S_KEYBOARD 0x000d
>>> #define USB_DEVICE_ID_SB974D 0x0400
>>> #define USB_DEVICE_ID_TOSHIBA_CLICK_L9W 0x0401
>>> #define USB_DEVICE_ID_HP_X2 0x074d
>>> diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c
>>> index 30bd3f794243..e997d0cf2672 100644
>>> --- a/drivers/hid/hid-lenovo.c
>>> +++ b/drivers/hid/hid-lenovo.c
>>> @@ -812,6 +812,22 @@ static int lenovo_raw_event(struct hid_device *hdev,
>>> size >= 4 && report->id == 0x03))
>>> return lenovo_raw_event_TP_X12_tab(hdev, get_unaligned_le32(data));
>>>
>>> + /*
>>> + * Lenovo ThinkPad T14s gen6/7 snapdragon version filter out spurious
>>> + * F23 events when Fn key is pressed. F23 cannot be unmapped because of
>>> + * the copilot key sending left-meta + left-shift + F23. Filter report 8
>>> + * (keyboard) scancode 0x72 (F23) when the modifier byte is not 0x0a.
>>> + */
>>> + if (unlikely(hdev->product == I2C_DEVICE_ID_ELAN_LENOVO_T14S_KEYBOARD &&
>>> + size == 9 && data[0] == 8 && data[1] != 0x0a)) {
>>> + for (int i = 3; i < 9; i++)
>>> + if (data[i] == 0x72) {
>>> + memmove(&data[i], &data[i + 1], 8 - i);
>>> + data[8] = 0;
>>> + break;
>>> + }
>>> + }
>>> +
>>> return 0;
>>> }
>>>
>>> @@ -1393,6 +1409,10 @@ static int lenovo_probe(struct hid_device *hdev,
>>> {
>>> int ret;
>>>
>>> + /* Make the T14s keyboard trackpoint a separate input-device */
>>> + if (hdev->product == I2C_DEVICE_ID_ELAN_LENOVO_T14S_KEYBOARD)
>>> + hdev->quirks |= HID_QUIRK_INPUT_PER_APP;
>>> +
>>
>> Shouldn't this be in a separate commit?
>
> No this "quirk" is the default behavior of the hid-generic driver. This driver
> now will take over control from the hid-generic driver because of the device-id
> addition below.
>
> So setting this quirk preserves the existing default behavior.
>
Ah - my bad. Thanks for the explain.
>>
>>> ret = hid_parse(hdev);
>>> if (ret) {
>>> hid_err(hdev, "hid_parse failed\n");
>>> @@ -1558,6 +1578,7 @@ static const struct hid_device_id
>>> lenovo_devices[] = {
>>> { HID_USB_DEVICE(USB_VENDOR_ID_IBM,
>>> USB_DEVICE_ID_IBM_SCROLLPOINT_800DPI_OPTICAL_PRO) },
>>> { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO,
>>> USB_DEVICE_ID_LENOVO_SCROLLPOINT_OPTICAL) },
>>> { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO,
>>> USB_DEVICE_ID_LENOVO_TP10UBKBD) },
>>> + { HID_I2C_DEVICE(USB_VENDOR_ID_ELAN,
>>> I2C_DEVICE_ID_ELAN_LENOVO_T14S_KEYBOARD) },
>>> /*
>>> * Note bind to the HID_GROUP_GENERIC group, so that we only bind to
>>> the keyboard
>>> * part, while letting hid-multitouch.c handle the touchpad and
>>> trackpoint.
>>> --
>>> 2.56.0
>>
Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca>
Mark
prev parent reply other threads:[~2026-11-10 12:28 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-09 21:43 [PATCH] HID: lenovo: suppress spurious F23 key events on ThinkPad T14s gen6/7 snapdragon Hans de Goede
2026-11-10 0:49 ` Mark Pearson
2026-11-10 9:36 ` Hans de Goede
2026-11-10 12:27 ` Mark Pearson [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=35bbae20-c166-4889-bce3-36453dda1cd7@app.fastmail.com \
--to=mpearson-lenovo@squebb.ca \
--cc=bentiss@kernel.org \
--cc=derekjohn.clark@gmail.com \
--cc=jikos@kernel.org \
--cc=johannes.goede@oss.qualcomm.com \
--cc=linux-input@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox