Linux Input/HID development
 help / color / mirror / Atom feed
From: Viktor Sharha <vsharha07@gmail.com>
To: Jiri Kosina <jikos@kernel.org>, Benjamin Tissoires <bentiss@kernel.org>
Cc: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org,
	Viktor Sharha <vsharha07@gmail.com>
Subject: [PATCH] HID: quirks: add ALWAYS_POLL quirk for Keychron Link receiver
Date: Wed, 28 Oct 2026 23:29:45 +0000	[thread overview]
Message-ID: <20261028232945.20169-1-vsharha07@gmail.com> (raw)

The Keychron Link 2.4 GHz receiver (3434:d030) exposes a joystick on an
interface of its own. Keychron's Hall-effect keyboards, such as the
K4 HE, send a burst of joystick reports on that interface every time
the user switches actuation profile, even when no profile uses the
joystick.

Desktop environments do not open joystick devices, so usbhid does not
poll that interface and the reports are never read. The receiver then
stops delivering keyboard input on its other interfaces until the host
re-enumerates it or the keyboard is switched to wired mode and back. A
key held during the switch also keeps auto-repeating, because its
release never arrives.

Holding the joystick device open, or booting with
usbhid.quirks=0x3434:0xd030:0x00000400, avoids the problem. Windows is
not affected, as it polls every HID interface.

Link: https://github.com/Keychron/qmk_firmware/issues/532
Signed-off-by: Viktor Sharha <vsharha07@gmail.com>
---
 drivers/hid/hid-ids.h    | 3 +++
 drivers/hid/hid-quirks.c | 2 ++
 2 files changed, 5 insertions(+)

diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 91319aa65..856181478 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -802,6 +802,9 @@
 #define USB_VENDOR_ID_KENSINGTON	0x047d
 #define USB_DEVICE_ID_KS_SLIMBLADE	0x2041
 
+#define USB_VENDOR_ID_KEYCHRON		0x3434
+#define USB_DEVICE_ID_KEYCHRON_LINK	0xd030
+
 #define USB_VENDOR_ID_KWORLD		0x1b80
 #define USB_DEVICE_ID_KWORLD_RADIO_FM700	0xd700
 
diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
index 793db001a..d56516aad 100644
--- a/drivers/hid/hid-quirks.c
+++ b/drivers/hid/hid-quirks.c
@@ -116,6 +116,8 @@ static const struct hid_device_id hid_quirks[] = {
 	{ HID_USB_DEVICE(USB_VENDOR_ID_INNOMEDIA, USB_DEVICE_ID_INNEX_GENESIS_ATARI), HID_QUIRK_MULTI_INPUT },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_JESS, USB_DEVICE_ID_AULA_MINI_60_HE_PRO),
 		HID_QUIRK_ALWAYS_POLL },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_KEYCHRON, USB_DEVICE_ID_KEYCHRON_LINK),
+		HID_QUIRK_ALWAYS_POLL },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_PIXART_USB_OPTICAL_MOUSE_ID2), HID_QUIRK_ALWAYS_POLL },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M406), HID_QUIRK_MULTI_INPUT },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M506), HID_QUIRK_MULTI_INPUT },
-- 
2.56.0


                 reply	other threads:[~2026-10-28 23:30 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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=20261028232945.20169-1-vsharha07@gmail.com \
    --to=vsharha07@gmail.com \
    --cc=bentiss@kernel.org \
    --cc=jikos@kernel.org \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@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