* Re: [PATCH v2] Apply the quirk HID_QUIRK_ALWAYS_POLL to the Edifier QR30 (2d99:a101).
From: Terry Junge @ 2025-11-12 5:20 UTC (permalink / raw)
To: Rodrigo Lugathe da Conceição Alves, michal.pecio
Cc: bentiss, dmitry.torokhov, jikos, linux-input, linux-sound,
linux-usb, linuxsound, stern
In-Reply-To: <20251112015356.1919586-1-lugathe2@gmail.com>
Hi Rodrigo,
You might want to wait a couple of days before sending a v3 so other
reviewers can get a chance to make comments.
You should include the HID: tag in the subject--
...] HID: Apply...
The patch should be sent
To: the HID subsystem maintainers
bentiss@kernel.org
jikos@kernel.org
Cc: at a minimum
linux-input@vger.kernel.org
linux-kernel@vger.kernel.org
plus any of the others already part of this thread.
On 11/11/2025 5:53 PM, Rodrigo Lugathe da Conceição Alves wrote:
> The USB speaker has a bug that causes it to reboot when changing the
> brightness using the physical knob.
>
> Add a new vendor and product ID entry in hid-ids.h, and register
> the corresponding device in hid-quirks.c with the required quirk.
>
> ---
> v2:
> - Fixed title
> - Simplified commit message
>
> Signed-off-by: Rodrigo Lugathe da Conceição Alves <lugathe2@gmail.com>
> ---
> drivers/hid/hid-ids.h | 3 +++
> drivers/hid/hid-quirks.c | 1 +
> 2 files changed, 4 insertions(+)
>
> diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
> index 0723b4b1c9ec..ece1bea0faa5 100644
> --- a/drivers/hid/hid-ids.h
> +++ b/drivers/hid/hid-ids.h
> @@ -734,6 +734,9 @@
> #define USB_VENDOR_ID_JESS2 0x0f30
> #define USB_DEVICE_ID_JESS2_COLOR_RUMBLE_PAD 0x0111
>
> +#define USB_VENDOR_ID_JIELI_TECHNOLOGY 0x2d99
> +#define USB_DEVICE_ID_EDIFIER_QR30 0xa101 /* EDIFIER Hal0 2.0 SE */
Vendor ID 0x2d99 belongs to Edifier International Limited not Jieli
Can you change to USB_VENDOR_ID_EDIFIER instead and move to the
alphabetically correct location?
> +
> #define USB_VENDOR_ID_KBGEAR 0x084e
> #define USB_DEVICE_ID_KBGEAR_JAMSTUDIO 0x1001
>
> diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
> index bcd4bccf1a7c..d104f4829d93 100644
> --- a/drivers/hid/hid-quirks.c
> +++ b/drivers/hid/hid-quirks.c
> @@ -110,6 +110,7 @@ static const struct hid_device_id hid_quirks[] = {
> { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_1f4a), HID_QUIRK_ALWAYS_POLL },
> { HID_USB_DEVICE(USB_VENDOR_ID_IDEACOM, USB_DEVICE_ID_IDEACOM_IDC6680), HID_QUIRK_MULTI_INPUT },
> { HID_USB_DEVICE(USB_VENDOR_ID_INNOMEDIA, USB_DEVICE_ID_INNEX_GENESIS_ATARI), HID_QUIRK_MULTI_INPUT },
> + { HID_USB_DEVICE(USB_VENDOR_ID_JIELI_TECHNOLOGY, USB_DEVICE_ID_EDIFIER_QR30), HID_QUIRK_ALWAYS_POLL },
as above mentioned rename and move
> { 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 },
Thanks for the patch!
Regards,
Terry Junge
^ permalink raw reply
* [PATCH v2] Apply the quirk HID_QUIRK_ALWAYS_POLL to the Edifier QR30 (2d99:a101).
From: Rodrigo Lugathe da Conceição Alves @ 2025-11-12 1:53 UTC (permalink / raw)
To: michal.pecio
Cc: bentiss, dmitry.torokhov, jikos, linux-input, linux-sound,
linux-usb, linuxhid, linuxsound, lugathe2, stern
In-Reply-To: <20251111203350.3c9a669e.michal.pecio@gmail.com>
The USB speaker has a bug that causes it to reboot when changing the
brightness using the physical knob.
Add a new vendor and product ID entry in hid-ids.h, and register
the corresponding device in hid-quirks.c with the required quirk.
---
v2:
- Fixed title
- Simplified commit message
Signed-off-by: Rodrigo Lugathe da Conceição Alves <lugathe2@gmail.com>
---
drivers/hid/hid-ids.h | 3 +++
drivers/hid/hid-quirks.c | 1 +
2 files changed, 4 insertions(+)
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 0723b4b1c9ec..ece1bea0faa5 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -734,6 +734,9 @@
#define USB_VENDOR_ID_JESS2 0x0f30
#define USB_DEVICE_ID_JESS2_COLOR_RUMBLE_PAD 0x0111
+#define USB_VENDOR_ID_JIELI_TECHNOLOGY 0x2d99
+#define USB_DEVICE_ID_EDIFIER_QR30 0xa101 /* EDIFIER Hal0 2.0 SE */
+
#define USB_VENDOR_ID_KBGEAR 0x084e
#define USB_DEVICE_ID_KBGEAR_JAMSTUDIO 0x1001
diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
index bcd4bccf1a7c..d104f4829d93 100644
--- a/drivers/hid/hid-quirks.c
+++ b/drivers/hid/hid-quirks.c
@@ -110,6 +110,7 @@ static const struct hid_device_id hid_quirks[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_1f4a), HID_QUIRK_ALWAYS_POLL },
{ HID_USB_DEVICE(USB_VENDOR_ID_IDEACOM, USB_DEVICE_ID_IDEACOM_IDC6680), HID_QUIRK_MULTI_INPUT },
{ HID_USB_DEVICE(USB_VENDOR_ID_INNOMEDIA, USB_DEVICE_ID_INNEX_GENESIS_ATARI), HID_QUIRK_MULTI_INPUT },
+ { HID_USB_DEVICE(USB_VENDOR_ID_JIELI_TECHNOLOGY, USB_DEVICE_ID_EDIFIER_QR30), 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.51.2
^ permalink raw reply related
* [PATCH v2] HID: playstation: Center initial joystick axes to prevent spurious events
From: Siarhei Vishniakou @ 2025-11-11 23:45 UTC (permalink / raw)
To: Jiri Kosina, Benjamin Tissoires, Roderick Colenbrander,
linux-input, linux-kernel
Cc: Siarhei Vishniakou
When a new PlayStation gamepad (DualShock 4 or DualSense) is initialized,
the input subsystem sets the default value for its absolute axes (e.g.,
ABS_X, ABS_Y) to 0.
However, the hardware's actual neutral/resting state for these joysticks
is 128 (0x80). This creates a mismatch.
When the first HID report arrives from the device, the driver sees the
resting value of 128. The kernel compares this to its initial state of 0
and incorrectly interprets this as a delta (0 -> 128). Consequently, it
generates EV_ABS events for this initial, non-existent movement.
This behavior can fail userspace 'sanity check' tests (e.g., in
Android CTS) that correctly assert no motion events should be generated
from a device that is already at rest.
This patch fixes the issue by explicitly setting the initial value of the
main joystick axes (e.g., ABS_X, ABS_Y, ABS_RX, ABS_RY) to 128 (0x80)
in the common ps_gamepad_create() function.
This aligns the kernel's initial state with the hardware's expected
neutral state, ensuring that the first report (at 128) produces no
delta and thus, no spurious event.
Signed-off-by: Siarhei Vishniakou <svv@google.com>
---
drivers/hid/hid-playstation.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c
index 1468fb11e39d..a145b5ea4405 100644
--- a/drivers/hid/hid-playstation.c
+++ b/drivers/hid/hid-playstation.c
@@ -718,11 +718,16 @@ static struct input_dev *ps_gamepad_create(struct hid_device *hdev,
if (IS_ERR(gamepad))
return ERR_CAST(gamepad);
+ /* Set initial resting state for joysticks to 128 (center) */
input_set_abs_params(gamepad, ABS_X, 0, 255, 0, 0);
+ gamepad->absinfo[ABS_X].value = 128;
input_set_abs_params(gamepad, ABS_Y, 0, 255, 0, 0);
+ gamepad->absinfo[ABS_Y].value = 128;
input_set_abs_params(gamepad, ABS_Z, 0, 255, 0, 0);
input_set_abs_params(gamepad, ABS_RX, 0, 255, 0, 0);
+ gamepad->absinfo[ABS_RX].value = 128;
input_set_abs_params(gamepad, ABS_RY, 0, 255, 0, 0);
+ gamepad->absinfo[ABS_RY].value = 128;
input_set_abs_params(gamepad, ABS_RZ, 0, 255, 0, 0);
input_set_abs_params(gamepad, ABS_HAT0X, -1, 1, 0, 0);
--
2.51.2.1041.gc1ab5b90ca-goog
^ permalink raw reply related
* Re: [PATCH] HID: playstation: Center initial joystick axes to prevent spurious events
From: Siarhei Vishniakou @ 2025-11-11 23:40 UTC (permalink / raw)
To: Jiri Kosina, Benjamin Tissoires, Roderick Colenbrander,
linux-input, linux-kernel
In-Reply-To: <20251111233818.4155828-1-svv@google.com>
вт, 11 нояб. 2025 г. в 15:38, Siarhei Vishniakou <svv@google.com>:
>
> When a new PlayStation gamepad (DualShock 4 or DualSense) is initialized,
> the input subsystem sets the default value for its absolute axes (e.g.,
> ABS_X, ABS_Y) to 0.
>
> However, the hardware's actual neutral/resting state for these joysticks
> is 128 (0x80). This creates a mismatch.
>
> When the first HID report arrives from the device, the driver sees the
> resting value of 128. The kernel compares this to its initial state of 0
> and incorrectly interprets this as a delta (0 -> 128). Consequently, it
> generates EV_ABS events for this initial, non-existent movement.
>
> This behavior can fail userspace 'sanity check' tests (e.g., in
> Android CTS) that correctly assert no motion events should be generated
> from a device that is already at rest.
>
> This patch fixes the issue by explicitly setting the initial value of the
> main joystick axes (e.g., ABS_X, ABS_Y, ABS_RX, ABS_RY) to 128 (0x80)
> in the common ps_gamepad_create() function.
>
> This aligns the kernel's initial state with the hardware's expected
> neutral state, ensuring that the first report (at 128) produces no
> delta and thus, no spurious event.
>
> Signed-off-by: Siarhei Vishniakou <svv@google.com>
> ---
> drivers/hid/hid-playstation.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c
> index 1468fb11e39d..fd9d3c901743 100644
> --- a/drivers/hid/hid-playstation.c
> +++ b/drivers/hid/hid-playstation.c
> @@ -718,12 +718,19 @@ static struct input_dev *ps_gamepad_create(struct hid_device *hdev,
> if (IS_ERR(gamepad))
> return ERR_CAST(gamepad);
>
> + /* Set initial resting state for joysticks to 128 (center) */
> input_set_abs_params(gamepad, ABS_X, 0, 255, 0, 0);
> + gamepad->absinfo[ABS_X].value = 128;
> input_set_abs_params(gamepad, ABS_Y, 0, 255, 0, 0);
> + gamepad->absinfo[ABS_Y].value = 128;
> input_set_abs_params(gamepad, ABS_Z, 0, 255, 0, 0);
> + gamepad->absinfo[ABS_Z].value = 128;
> input_set_abs_params(gamepad, ABS_RX, 0, 255, 0, 0);
> + gamepad->absinfo[ABS_RX].value = 128;
> input_set_abs_params(gamepad, ABS_RY, 0, 255, 0, 0);
> + gamepad->absinfo[ABS_RY].value = 128;
> input_set_abs_params(gamepad, ABS_RZ, 0, 255, 0, 0);
> + gamepad->absinfo[ABS_RZ].value = 128;
>
> input_set_abs_params(gamepad, ABS_HAT0X, -1, 1, 0, 0);
> input_set_abs_params(gamepad, ABS_HAT0Y, -1, 1, 0, 0);
> --
> 2.51.0.536.g15c5d4f767-goog
>
My apologies, I sent the wrong version of this patch. The values for
Z, RZ should not have changed. I will resend.
^ permalink raw reply
* [PATCH] HID: playstation: Center initial joystick axes to prevent spurious events
From: Siarhei Vishniakou @ 2025-11-11 23:38 UTC (permalink / raw)
To: Jiri Kosina, Benjamin Tissoires, Roderick Colenbrander,
linux-input, linux-kernel
Cc: Siarhei Vishniakou
When a new PlayStation gamepad (DualShock 4 or DualSense) is initialized,
the input subsystem sets the default value for its absolute axes (e.g.,
ABS_X, ABS_Y) to 0.
However, the hardware's actual neutral/resting state for these joysticks
is 128 (0x80). This creates a mismatch.
When the first HID report arrives from the device, the driver sees the
resting value of 128. The kernel compares this to its initial state of 0
and incorrectly interprets this as a delta (0 -> 128). Consequently, it
generates EV_ABS events for this initial, non-existent movement.
This behavior can fail userspace 'sanity check' tests (e.g., in
Android CTS) that correctly assert no motion events should be generated
from a device that is already at rest.
This patch fixes the issue by explicitly setting the initial value of the
main joystick axes (e.g., ABS_X, ABS_Y, ABS_RX, ABS_RY) to 128 (0x80)
in the common ps_gamepad_create() function.
This aligns the kernel's initial state with the hardware's expected
neutral state, ensuring that the first report (at 128) produces no
delta and thus, no spurious event.
Signed-off-by: Siarhei Vishniakou <svv@google.com>
---
drivers/hid/hid-playstation.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/hid/hid-playstation.c b/drivers/hid/hid-playstation.c
index 1468fb11e39d..fd9d3c901743 100644
--- a/drivers/hid/hid-playstation.c
+++ b/drivers/hid/hid-playstation.c
@@ -718,12 +718,19 @@ static struct input_dev *ps_gamepad_create(struct hid_device *hdev,
if (IS_ERR(gamepad))
return ERR_CAST(gamepad);
+ /* Set initial resting state for joysticks to 128 (center) */
input_set_abs_params(gamepad, ABS_X, 0, 255, 0, 0);
+ gamepad->absinfo[ABS_X].value = 128;
input_set_abs_params(gamepad, ABS_Y, 0, 255, 0, 0);
+ gamepad->absinfo[ABS_Y].value = 128;
input_set_abs_params(gamepad, ABS_Z, 0, 255, 0, 0);
+ gamepad->absinfo[ABS_Z].value = 128;
input_set_abs_params(gamepad, ABS_RX, 0, 255, 0, 0);
+ gamepad->absinfo[ABS_RX].value = 128;
input_set_abs_params(gamepad, ABS_RY, 0, 255, 0, 0);
+ gamepad->absinfo[ABS_RY].value = 128;
input_set_abs_params(gamepad, ABS_RZ, 0, 255, 0, 0);
+ gamepad->absinfo[ABS_RZ].value = 128;
input_set_abs_params(gamepad, ABS_HAT0X, -1, 1, 0, 0);
input_set_abs_params(gamepad, ABS_HAT0Y, -1, 1, 0, 0);
--
2.51.0.536.g15c5d4f767-goog
^ permalink raw reply related
* Re: [PATCH v2 2/2] HID: multitouch: Toggle touch surface on Elan touchpad on lid event
From: Dmitry Torokhov @ 2025-11-11 22:37 UTC (permalink / raw)
To: Jonathan Denose
Cc: Jiri Kosina, Benjamin Tissoires, linux-input, linux-kernel
In-Reply-To: <20251111-lid-switch-notifier-v2-2-789723d78d89@google.com>
Hi Jonathan,
On Tue, Nov 11, 2025 at 09:34:07PM +0000, Jonathan Denose wrote:
> Many touchpad modules have a pin which is expected to be connected to the
> lid angle sensor in laptops. The pin sends a signal to the touchpad module
> about the lid state and each touchpad vendor handles this notification in
> their firmware.
>
> The Elan touchpad with VID 323b does not always have this aforementioned
> pin, which then causes interference between the lid and the touchpad when
> the lid is closed. This interference causes a few seconds delay before the
> touchpad works again, or it causes it to be come completely unresponsive.
> To circumvent this hardware issue in software, implement a device quirk
> which will allow the hid-multitouch driver to register a notifier_block
> to listen for lid switch events. When the lid switch closes, the
> touchpad surface will be turned off and when the lid switch opens, the
> touchpad surgace will be turned on. This triggers recalibration which
> resolves interference issues when the lid is closed.
>
> Signed-off-by: Jonathan Denose <jdenose@google.com>
> ---
> drivers/hid/hid-multitouch.c | 32 +++++++++++++++++++++++++++++++-
> 1 file changed, 31 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
> index 2879e65cf303b1456311ac06115adda5a78a2600..9a89913c193bc110a0a821a901aebd97892c66bd 100644
> --- a/drivers/hid/hid-multitouch.c
> +++ b/drivers/hid/hid-multitouch.c
> @@ -35,6 +35,7 @@
> #include <linux/device.h>
> #include <linux/hid.h>
> #include <linux/module.h>
> +#include <linux/notifier.h>
> #include <linux/slab.h>
> #include <linux/input/mt.h>
> #include <linux/jiffies.h>
> @@ -76,6 +77,7 @@ MODULE_LICENSE("GPL");
> #define MT_QUIRK_DISABLE_WAKEUP BIT(21)
> #define MT_QUIRK_ORIENTATION_INVERT BIT(22)
> #define MT_QUIRK_APPLE_TOUCHBAR BIT(23)
> +#define MT_QUIRK_REGISTER_LID_NOTIFIER BIT(24)
>
> #define MT_INPUTMODE_TOUCHSCREEN 0x02
> #define MT_INPUTMODE_TOUCHPAD 0x03
> @@ -183,6 +185,8 @@ struct mt_device {
> struct list_head reports;
> };
>
> +static struct hid_device *lid_notify_hdev;
This should really be per-device.
> +
> static void mt_post_parse_default_settings(struct mt_device *td,
> struct mt_application *app);
> static void mt_post_parse(struct mt_device *td, struct mt_application *app);
> @@ -227,6 +231,7 @@ static void mt_post_parse(struct mt_device *td, struct mt_application *app);
> #define MT_CLS_SMART_TECH 0x0113
> #define MT_CLS_APPLE_TOUCHBAR 0x0114
> #define MT_CLS_SIS 0x0457
> +#define MT_CLS_REGISTER_LID_NOTIFIER 0x0115
>
> #define MT_DEFAULT_MAXCONTACT 10
> #define MT_MAX_MAXCONTACT 250
> @@ -327,7 +332,9 @@ static const struct mt_class mt_classes[] = {
> MT_QUIRK_CONTACT_CNT_ACCURATE |
> MT_QUIRK_WIN8_PTP_BUTTONS,
> .export_all_inputs = true },
> -
> + { .name = MT_CLS_REGISTER_LID_NOTIFIER,
> + .quirks = MT_QUIRK_REGISTER_LID_NOTIFIER,
> + .export_all_inputs = true },
> /*
> * vendor specific classes
> */
> @@ -1840,6 +1847,20 @@ static void mt_expired_timeout(struct timer_list *t)
> clear_bit_unlock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags);
> }
>
> +static int mt_input_notifier(struct notifier_block *nb, unsigned long action, void *dev)
> +{
> + if (action)
> + mt_set_modes(lid_notify_hdev, HID_LATENCY_NORMAL, TOUCHPAD_REPORT_NONE);
> + else if (!action)
> + mt_set_modes(lid_notify_hdev, HID_LATENCY_NORMAL, TOUCHPAD_REPORT_ALL);
> +
> + return 0;
> +}
> +
> +static struct notifier_block mt_lid_notifier_block = {
> + .notifier_call = mt_input_notifier
> +};
> +
> static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
> {
> int ret, i;
> @@ -1920,6 +1941,11 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
> if (hdev->vendor == USB_VENDOR_ID_SIS_TOUCH)
> hdev->quirks |= HID_QUIRK_NOGET;
>
> + if (mtclass->quirks & MT_CLS_REGISTER_LID_NOTIFIER) {
> + lid_notify_hdev = hdev;
> + register_lid_notifier(&mt_lid_notifier_block);
> + }
> +
> ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
> if (ret)
> return ret;
> @@ -2150,6 +2176,10 @@ static const struct hid_device_id mt_devices[] = {
> HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
> USB_VENDOR_ID_ELAN, 0x32ae) },
>
> + { .driver_data = MT_CLS_REGISTER_LID_NOTIFIER,
> + HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
> + USB_VENDOR_ID_ELAN, 0x323b) },
The need to have special handling of LID events is a quirk of board
design, not quire of a controller. So I think it needs to be triggered
by DMI quirk.
> +
> /* Elitegroup panel */
> { .driver_data = MT_CLS_SERIAL,
> MT_USB_DEVICE(USB_VENDOR_ID_ELITEGROUP,
>
Thanks.
--
Dmitry
^ permalink raw reply
* Re: [PATCH v2 1/2] Input: Add lid switch notifier
From: Dmitry Torokhov @ 2025-11-11 22:34 UTC (permalink / raw)
To: Jonathan Denose
Cc: Jiri Kosina, Benjamin Tissoires, linux-input, linux-kernel
In-Reply-To: <20251111-lid-switch-notifier-v2-1-789723d78d89@google.com>
Hi Jonathan,
On Tue, Nov 11, 2025 at 09:34:06PM +0000, Jonathan Denose wrote:
> This change creates a new input handler which can be included in the
> build via a new Kconfig option CONFIG_INPUT_LID_NOTIFIER. This input
> handler listens for lid switch events and publishes them through an
> atomic notification chain. Other modules may register for events
> through this notification chain with register_lid_notifier.
>
> Signed-off-by: Jonathan Denose <jdenose@google.com>
> ---
> drivers/input/Kconfig | 11 +++++
> drivers/input/Makefile | 1 +
> drivers/input/lid-notifier.c | 98 ++++++++++++++++++++++++++++++++++++++++++++
> include/linux/input.h | 2 +
> 4 files changed, 112 insertions(+)
>
> diff --git a/drivers/input/Kconfig b/drivers/input/Kconfig
> index 88ecdf5218ee9ba35e1efec6341f8605b621bd49..16f6d24fd04ac8cb5af9d36cc47155ea9be0e177 100644
> --- a/drivers/input/Kconfig
> +++ b/drivers/input/Kconfig
> @@ -38,6 +38,17 @@ config INPUT_LEDS
> To compile this driver as a module, choose M here: the
> module will be called input-leds.
>
> +config INPUT_LID_NOTIFIER
> + tristate "Include notifier for lid switch events"
> + help
> + Say Y here if you would like to create a notifier to publish lid switch
> + events.
> +
> + If unsure, say N.
> +
> + To compile this driver as a module, choose M here: the
> + module will be called lid-notifier.
I think this better not surfaced to users but rather interested drivers
'select' it.
> +
> config INPUT_FF_MEMLESS
> tristate "Support for memoryless force-feedback devices"
> help
> diff --git a/drivers/input/Makefile b/drivers/input/Makefile
> index 2cd6e1c9a77844fe09cd3d99533e5d3efb038c7d..1efdba04f79a97e2a122b9198341b18a1855b4b9 100644
> --- a/drivers/input/Makefile
> +++ b/drivers/input/Makefile
> @@ -15,6 +15,7 @@ obj-$(CONFIG_INPUT_MATRIXKMAP) += matrix-keymap.o
> obj-$(CONFIG_INPUT_VIVALDIFMAP) += vivaldi-fmap.o
>
> obj-$(CONFIG_INPUT_LEDS) += input-leds.o
> +obj-$(CONFIG_INPUT_LID_NOTIFIER) += lid-notifier.o
> obj-$(CONFIG_INPUT_MOUSEDEV) += mousedev.o
> obj-$(CONFIG_INPUT_JOYDEV) += joydev.o
> obj-$(CONFIG_INPUT_EVDEV) += evdev.o
> diff --git a/drivers/input/lid-notifier.c b/drivers/input/lid-notifier.c
> new file mode 100644
> index 0000000000000000000000000000000000000000..954b9855532dbd0514860e309d0b76982e947673
> --- /dev/null
> +++ b/drivers/input/lid-notifier.c
> @@ -0,0 +1,98 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Lid event notifier
> + *
> + * Copyright (c) 2025 Jonathan Denose <jdenose@google.com>
> + */
> +
> +#include <linux/device.h>
> +#include <linux/input.h>
> +#include <linux/notifier.h>
> +
> +static struct input_handler lid_handler;
> +static struct atomic_notifier_head input_notifier_head;
> +
> +int register_lid_notifier(struct notifier_block *notifier)
> +{
> + return atomic_notifier_chain_register(&input_notifier_head, notifier);
> +}
> +EXPORT_SYMBOL(register_lid_notifier);
I wonder if we want to expose the "raw" notifier or if we want to
provide a higher-level API that would allocate a notifier blocki, set up
the callback, and return a "cookie" that can be used to free notifier
block later. This way we do not need to worry that some enterprising
driver suppresses notifications for the rest by returning NOTIFY_STOP.
> +
> +static int lid_handler_connect(struct input_handler *handler,
> + struct input_dev *input_dev, const struct input_device_id *id)
Proper alignment of the arguments please.
> +{
> + struct input_handle *handle;
> + int error;
> +
> + handle = devm_kzalloc(&input_dev->dev, sizeof(struct input_handle), GFP_KERNEL);
This is not driver probe path so devm_kzalloc must not be used here.
Also "sizeof(*handle)".
> + if (!handle)
> + return -ENOMEM;
> +
> + handle->dev = input_dev;
> + handle->handler = handler;
> + handle->name = "lid";
> +
> + error = input_register_handle(handle);
> + if (error)
> + goto err_free_handle;
> +
> + error = input_open_device(handle);
> + if (error)
> + goto err_unregister_handle;
> +
> + return 0;
> +
> + err_unregister_handle:
> + input_unregister_handle(handle);
> + err_free_handle:
> + kfree(handle);
Just FYI: One must never use kfree() with devm_kalloc()ed memory.
> + return error;
> +}
> +
> +static void lid_handler_disconnect(struct input_handle *handle)
> +{
> + input_close_device(handle);
> + input_unregister_handle(handle);
kfree(handle);
> +}
> +
> +static void lid_handler_event(struct input_handle *handle, unsigned int type,
> + unsigned int code, int value)
> +{
> + if (type == EV_SW && code == SW_LID)
> + atomic_notifier_call_chain(&input_notifier_head, value, handle->dev);
Why do you need to pass the device from which SW_LID originated?
> +}
> +
> +static const struct input_device_id lid_handler_ids[] = {
> + {
> + .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_SWBIT
> + | INPUT_DEVICE_ID_MATCH_BUS,
> + .evbit = { BIT_MASK(EV_SW) },
> + .swbit = { [BIT_WORD(SW_LID)] = BIT_MASK(SW_LID) },
> + .bustype = 0x19
Why do we need to match in bus type? The LID does not have to always
come from ACPI.
> + },
> + { },
> +};
> +
> +static struct input_handler lid_handler = {
> + .connect = lid_handler_connect,
> + .disconnect = lid_handler_disconnect,
> + .event = lid_handler_event,
> + .name = "lid",
> + .id_table = lid_handler_ids
> +};
> +
> +static int __init lid_notifier_init(void)
> +{
> + return input_register_handler(&lid_handler);
> +}
> +module_init(lid_notifier_init);
> +
> +static void __exit lid_notifier_exit(void)
> +{
> + input_unregister_handler(&lid_handler);
> +}
> +module_exit(lid_notifier_exit);
> +
> +MODULE_AUTHOR("Jonathan Denose <jdenose@google.com>");
> +MODULE_DESCRIPTION("Lid event notifier");
> +MODULE_LICENSE("GPL");
> diff --git a/include/linux/input.h b/include/linux/input.h
> index 7d7cb0593a63e93c4906c49cde430188db2d1ab5..023eb92c77d9e8721d482b9787632a671671de08 100644
> --- a/include/linux/input.h
> +++ b/include/linux/input.h
> @@ -592,3 +592,5 @@ int input_ff_create_memless(struct input_dev *dev, void *data,
> int (*play_effect)(struct input_dev *, void *, struct ff_effect *));
>
> #endif
I think this should go into include/linux/lid-notifier.h.
> +
> +int register_lid_notifier(struct notifier_block *notifier);
Thanks.
--
Dmitry
^ permalink raw reply
* [PATCH v2 2/2] HID: multitouch: Toggle touch surface on Elan touchpad on lid event
From: Jonathan Denose @ 2025-11-11 21:34 UTC (permalink / raw)
To: Dmitry Torokhov, Jiri Kosina, Benjamin Tissoires
Cc: linux-input, linux-kernel, Jonathan Denose
In-Reply-To: <20251111-lid-switch-notifier-v2-0-789723d78d89@google.com>
Many touchpad modules have a pin which is expected to be connected to the
lid angle sensor in laptops. The pin sends a signal to the touchpad module
about the lid state and each touchpad vendor handles this notification in
their firmware.
The Elan touchpad with VID 323b does not always have this aforementioned
pin, which then causes interference between the lid and the touchpad when
the lid is closed. This interference causes a few seconds delay before the
touchpad works again, or it causes it to be come completely unresponsive.
To circumvent this hardware issue in software, implement a device quirk
which will allow the hid-multitouch driver to register a notifier_block
to listen for lid switch events. When the lid switch closes, the
touchpad surface will be turned off and when the lid switch opens, the
touchpad surgace will be turned on. This triggers recalibration which
resolves interference issues when the lid is closed.
Signed-off-by: Jonathan Denose <jdenose@google.com>
---
drivers/hid/hid-multitouch.c | 32 +++++++++++++++++++++++++++++++-
1 file changed, 31 insertions(+), 1 deletion(-)
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
index 2879e65cf303b1456311ac06115adda5a78a2600..9a89913c193bc110a0a821a901aebd97892c66bd 100644
--- a/drivers/hid/hid-multitouch.c
+++ b/drivers/hid/hid-multitouch.c
@@ -35,6 +35,7 @@
#include <linux/device.h>
#include <linux/hid.h>
#include <linux/module.h>
+#include <linux/notifier.h>
#include <linux/slab.h>
#include <linux/input/mt.h>
#include <linux/jiffies.h>
@@ -76,6 +77,7 @@ MODULE_LICENSE("GPL");
#define MT_QUIRK_DISABLE_WAKEUP BIT(21)
#define MT_QUIRK_ORIENTATION_INVERT BIT(22)
#define MT_QUIRK_APPLE_TOUCHBAR BIT(23)
+#define MT_QUIRK_REGISTER_LID_NOTIFIER BIT(24)
#define MT_INPUTMODE_TOUCHSCREEN 0x02
#define MT_INPUTMODE_TOUCHPAD 0x03
@@ -183,6 +185,8 @@ struct mt_device {
struct list_head reports;
};
+static struct hid_device *lid_notify_hdev;
+
static void mt_post_parse_default_settings(struct mt_device *td,
struct mt_application *app);
static void mt_post_parse(struct mt_device *td, struct mt_application *app);
@@ -227,6 +231,7 @@ static void mt_post_parse(struct mt_device *td, struct mt_application *app);
#define MT_CLS_SMART_TECH 0x0113
#define MT_CLS_APPLE_TOUCHBAR 0x0114
#define MT_CLS_SIS 0x0457
+#define MT_CLS_REGISTER_LID_NOTIFIER 0x0115
#define MT_DEFAULT_MAXCONTACT 10
#define MT_MAX_MAXCONTACT 250
@@ -327,7 +332,9 @@ static const struct mt_class mt_classes[] = {
MT_QUIRK_CONTACT_CNT_ACCURATE |
MT_QUIRK_WIN8_PTP_BUTTONS,
.export_all_inputs = true },
-
+ { .name = MT_CLS_REGISTER_LID_NOTIFIER,
+ .quirks = MT_QUIRK_REGISTER_LID_NOTIFIER,
+ .export_all_inputs = true },
/*
* vendor specific classes
*/
@@ -1840,6 +1847,20 @@ static void mt_expired_timeout(struct timer_list *t)
clear_bit_unlock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags);
}
+static int mt_input_notifier(struct notifier_block *nb, unsigned long action, void *dev)
+{
+ if (action)
+ mt_set_modes(lid_notify_hdev, HID_LATENCY_NORMAL, TOUCHPAD_REPORT_NONE);
+ else if (!action)
+ mt_set_modes(lid_notify_hdev, HID_LATENCY_NORMAL, TOUCHPAD_REPORT_ALL);
+
+ return 0;
+}
+
+static struct notifier_block mt_lid_notifier_block = {
+ .notifier_call = mt_input_notifier
+};
+
static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
{
int ret, i;
@@ -1920,6 +1941,11 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
if (hdev->vendor == USB_VENDOR_ID_SIS_TOUCH)
hdev->quirks |= HID_QUIRK_NOGET;
+ if (mtclass->quirks & MT_CLS_REGISTER_LID_NOTIFIER) {
+ lid_notify_hdev = hdev;
+ register_lid_notifier(&mt_lid_notifier_block);
+ }
+
ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
if (ret)
return ret;
@@ -2150,6 +2176,10 @@ static const struct hid_device_id mt_devices[] = {
HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
USB_VENDOR_ID_ELAN, 0x32ae) },
+ { .driver_data = MT_CLS_REGISTER_LID_NOTIFIER,
+ HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
+ USB_VENDOR_ID_ELAN, 0x323b) },
+
/* Elitegroup panel */
{ .driver_data = MT_CLS_SERIAL,
MT_USB_DEVICE(USB_VENDOR_ID_ELITEGROUP,
--
2.51.2.1041.gc1ab5b90ca-goog
^ permalink raw reply related
* [PATCH v2 1/2] Input: Add lid switch notifier
From: Jonathan Denose @ 2025-11-11 21:34 UTC (permalink / raw)
To: Dmitry Torokhov, Jiri Kosina, Benjamin Tissoires
Cc: linux-input, linux-kernel, Jonathan Denose
In-Reply-To: <20251111-lid-switch-notifier-v2-0-789723d78d89@google.com>
This change creates a new input handler which can be included in the
build via a new Kconfig option CONFIG_INPUT_LID_NOTIFIER. This input
handler listens for lid switch events and publishes them through an
atomic notification chain. Other modules may register for events
through this notification chain with register_lid_notifier.
Signed-off-by: Jonathan Denose <jdenose@google.com>
---
drivers/input/Kconfig | 11 +++++
drivers/input/Makefile | 1 +
drivers/input/lid-notifier.c | 98 ++++++++++++++++++++++++++++++++++++++++++++
include/linux/input.h | 2 +
4 files changed, 112 insertions(+)
diff --git a/drivers/input/Kconfig b/drivers/input/Kconfig
index 88ecdf5218ee9ba35e1efec6341f8605b621bd49..16f6d24fd04ac8cb5af9d36cc47155ea9be0e177 100644
--- a/drivers/input/Kconfig
+++ b/drivers/input/Kconfig
@@ -38,6 +38,17 @@ config INPUT_LEDS
To compile this driver as a module, choose M here: the
module will be called input-leds.
+config INPUT_LID_NOTIFIER
+ tristate "Include notifier for lid switch events"
+ help
+ Say Y here if you would like to create a notifier to publish lid switch
+ events.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called lid-notifier.
+
config INPUT_FF_MEMLESS
tristate "Support for memoryless force-feedback devices"
help
diff --git a/drivers/input/Makefile b/drivers/input/Makefile
index 2cd6e1c9a77844fe09cd3d99533e5d3efb038c7d..1efdba04f79a97e2a122b9198341b18a1855b4b9 100644
--- a/drivers/input/Makefile
+++ b/drivers/input/Makefile
@@ -15,6 +15,7 @@ obj-$(CONFIG_INPUT_MATRIXKMAP) += matrix-keymap.o
obj-$(CONFIG_INPUT_VIVALDIFMAP) += vivaldi-fmap.o
obj-$(CONFIG_INPUT_LEDS) += input-leds.o
+obj-$(CONFIG_INPUT_LID_NOTIFIER) += lid-notifier.o
obj-$(CONFIG_INPUT_MOUSEDEV) += mousedev.o
obj-$(CONFIG_INPUT_JOYDEV) += joydev.o
obj-$(CONFIG_INPUT_EVDEV) += evdev.o
diff --git a/drivers/input/lid-notifier.c b/drivers/input/lid-notifier.c
new file mode 100644
index 0000000000000000000000000000000000000000..954b9855532dbd0514860e309d0b76982e947673
--- /dev/null
+++ b/drivers/input/lid-notifier.c
@@ -0,0 +1,98 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Lid event notifier
+ *
+ * Copyright (c) 2025 Jonathan Denose <jdenose@google.com>
+ */
+
+#include <linux/device.h>
+#include <linux/input.h>
+#include <linux/notifier.h>
+
+static struct input_handler lid_handler;
+static struct atomic_notifier_head input_notifier_head;
+
+int register_lid_notifier(struct notifier_block *notifier)
+{
+ return atomic_notifier_chain_register(&input_notifier_head, notifier);
+}
+EXPORT_SYMBOL(register_lid_notifier);
+
+static int lid_handler_connect(struct input_handler *handler,
+ struct input_dev *input_dev, const struct input_device_id *id)
+{
+ struct input_handle *handle;
+ int error;
+
+ handle = devm_kzalloc(&input_dev->dev, sizeof(struct input_handle), GFP_KERNEL);
+ if (!handle)
+ return -ENOMEM;
+
+ handle->dev = input_dev;
+ handle->handler = handler;
+ handle->name = "lid";
+
+ error = input_register_handle(handle);
+ if (error)
+ goto err_free_handle;
+
+ error = input_open_device(handle);
+ if (error)
+ goto err_unregister_handle;
+
+ return 0;
+
+ err_unregister_handle:
+ input_unregister_handle(handle);
+ err_free_handle:
+ kfree(handle);
+ return error;
+}
+
+static void lid_handler_disconnect(struct input_handle *handle)
+{
+ input_close_device(handle);
+ input_unregister_handle(handle);
+}
+
+static void lid_handler_event(struct input_handle *handle, unsigned int type,
+ unsigned int code, int value)
+{
+ if (type == EV_SW && code == SW_LID)
+ atomic_notifier_call_chain(&input_notifier_head, value, handle->dev);
+}
+
+static const struct input_device_id lid_handler_ids[] = {
+ {
+ .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_SWBIT
+ | INPUT_DEVICE_ID_MATCH_BUS,
+ .evbit = { BIT_MASK(EV_SW) },
+ .swbit = { [BIT_WORD(SW_LID)] = BIT_MASK(SW_LID) },
+ .bustype = 0x19
+ },
+ { },
+};
+
+static struct input_handler lid_handler = {
+ .connect = lid_handler_connect,
+ .disconnect = lid_handler_disconnect,
+ .event = lid_handler_event,
+ .name = "lid",
+ .id_table = lid_handler_ids
+};
+
+static int __init lid_notifier_init(void)
+{
+ return input_register_handler(&lid_handler);
+}
+module_init(lid_notifier_init);
+
+static void __exit lid_notifier_exit(void)
+{
+ input_unregister_handler(&lid_handler);
+}
+module_exit(lid_notifier_exit);
+
+MODULE_AUTHOR("Jonathan Denose <jdenose@google.com>");
+MODULE_DESCRIPTION("Lid event notifier");
+MODULE_LICENSE("GPL");
diff --git a/include/linux/input.h b/include/linux/input.h
index 7d7cb0593a63e93c4906c49cde430188db2d1ab5..023eb92c77d9e8721d482b9787632a671671de08 100644
--- a/include/linux/input.h
+++ b/include/linux/input.h
@@ -592,3 +592,5 @@ int input_ff_create_memless(struct input_dev *dev, void *data,
int (*play_effect)(struct input_dev *, void *, struct ff_effect *));
#endif
+
+int register_lid_notifier(struct notifier_block *notifier);
--
2.51.2.1041.gc1ab5b90ca-goog
^ permalink raw reply related
* [PATCH v2 0/2] Implement lid-notifier for lid switch events
From: Jonathan Denose @ 2025-11-11 21:34 UTC (permalink / raw)
To: Dmitry Torokhov, Jiri Kosina, Benjamin Tissoires
Cc: linux-input, linux-kernel, Jonathan Denose
To circumvent a hardware issue where the touchpad is not physically
connected to the lid angle sensor, implement a notifier chain which
broadcasts lid switch events and a notifier_block which can be enabled
via a quirk to listen for those events turning the touchpad surface
on or off based on if the lid is open or closed. This will prevent
issues resulting from interference between the laptop lid and the
touchpad.
Signed-off-by: Jonathan Denose <jdenose@google.com>
---
Changes in v2:
- Remove notifier logic from input core and add lid-notifier module which exposes lid events
- Kconfig: Add CONFIG_INPUT_LID_NOTIFIER option to include lid-notifier
- Link to v1: https://lore.kernel.org/r/20251030-lid-switch-notifier-v1-0-c58dc9b1439d@google.com
---
Jonathan Denose (2):
Input: Add lid switch notifier
HID: multitouch: Toggle touch surface on Elan touchpad on lid event
drivers/hid/hid-multitouch.c | 32 ++++++++++++++-
drivers/input/Kconfig | 11 +++++
drivers/input/Makefile | 1 +
drivers/input/lid-notifier.c | 98 ++++++++++++++++++++++++++++++++++++++++++++
include/linux/input.h | 2 +
5 files changed, 143 insertions(+), 1 deletion(-)
---
base-commit: 3a8660878839faadb4f1a6dd72c3179c1df56787
change-id: 20251014-lid-switch-notifier-1cb9918d675d
Best regards,
--
Jonathan Denose <jdenose@google.com>
^ permalink raw reply
* Re: [PATCH 2/2] HID: i2c-hid: Add new FocalTech Touchscreen Chip
From: Doug Anderson @ 2025-11-11 21:17 UTC (permalink / raw)
To: daniel_peng
Cc: Dmitry Torokhov, linux-input, LKML, Benjamin Tissoires,
Jiri Kosina, Pin-yen Lin
In-Reply-To: <20251111093426.2.I47e028c511ad8fc86a44467ae228ba4fc984f7fe@changeid>
Hi,
On Mon, Nov 10, 2025 at 5:35 PM
<daniel_peng@pegatron.corp-partner.google.com> wrote:
>
> From: Daniel Peng <Daniel_Peng@pegatron.corp-partner.google.com>
>
> Information for touchscreen model HKO/RB116AS01-2 as below:
> - HID :FTSC1000
> - slave address:0X38
> - Interface:HID over I2C
> - Touch control lC:FT8112
> - I2C ID: PNP0C50
>
> Signed-off-by: Daniel Peng <Daniel_Peng@pegatron.corp-partner.google.com>
> ---
>
> drivers/hid/i2c-hid/i2c-hid-of-elan.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
The subject of your patch should probably be a little less generic and
include the ID of the chip you're adding support for. Like:
HID: i2c-hid: Add Focaltech FT8112
Other than that, this patch looks fine to me assuming the problems
with your bindings patch get worked out. You may also want to consider
using a different email address for sending since your bindings patch
showed up in my spam folder.
Reviewed-by: Douglas Anderson <dianders@chromium.org>
^ permalink raw reply
* Re: [PATCH] The Edifier QR30 USB speaker, identified as: Jieli Technology EDIFIER Hal0 2.0 SE 2d99:a101, reports a HID interface that needs HID_QUIRK_ALWAYS_POLL to ensure it does not crash when changing the RGB brightness with the physical knob.
From: Michal Pecio @ 2025-11-11 19:33 UTC (permalink / raw)
To: Rodrigo Lugathe da Conceição Alves
Cc: linuxhid, bentiss, dmitry.torokhov, jikos, linux-input,
linux-sound, linux-usb, linuxsound, stern
In-Reply-To: <20251111074205.1533558-1-lugathe2@gmail.com>
On Tue, 11 Nov 2025 04:42:05 -0300, Rodrigo Lugathe da Conceição Alves
wrote:
> Add a new vendor and product ID entry in hid-ids.h and register
> the corresponding device in hid-quirks.c with the required quirk.
>
> Signed-off-by: Rodrigo Lugathe da Conceição Alves <lugathe2@gmail.com>
Usually one would use a shorter title like "Apply quirk X to device Y"
and put explanation/justification in the longer commit message (above).
Regards,
Michal
^ permalink raw reply
* Re: [BUG] Edifier QR30 (2d99:a101, Jieli Technology) reboots itself when RGB brightness button is used under Linux
From: Alan Stern @ 2025-11-11 15:08 UTC (permalink / raw)
To: Terry Junge
Cc: The-Luga, Dmitry Torokhov, Michal Pecio, Terry Junge, linux-sound,
linux-usb, linux-input, Jiri Kosina, Benjamin Tissoires
In-Reply-To: <c6d506f7-f13b-4d57-a522-a2ccd09e7a1f@cosmicgizmosystems.com>
On Mon, Nov 10, 2025 at 09:11:25PM -0800, Terry Junge wrote:
>
>
> On 11/10/2025 3:48 PM, The-Luga wrote:
> >>> Are you sure?
> >>>
> >>> HID_QUIRK_ALWAYS_POLL = 0x400
> >>> would stop suspending the device.
> >>
> >> Actually, it forces the kernel to poll the device's IN endpoints even
> >> when no program is holding the device file open (see where
> >> usbhid_start() calls hid_start_in() if the ALWAYS_POLL quirk is set).
> >> This is exactly what the speaker seems to need.
> >>
> >> As a side effect, it prevents the device from being suspended. But that
> >> doesn't seem to be the important thing here.
>
> Polling for input reports is handled by the hardware at the interval
> requested by the device during enumeration.
Only if the kernel tells the hardware to poll.
(Also, the interval used by the hardware is what the kernel tells it to
use. Yes, the kernel generally does choose to use the interval
specified by the device, but it can use some other interval if it wants
to -- and in some cases it does.)
> There is no intervention by
> the kernel to poll for an input report. The only way the kernel can stop
> polling a device for input reports is to suspend it.
This is simply not true. Consider: Where would the hardware store the
report data sent in response to a poll if the kernel hadn't given it the
address of an input buffer?
> So ALWAYS_POLL means never suspend.
As Oliver explained, that's only partially accurate.
Alan Stern
^ permalink raw reply
* Re: [PATCH] HID: playstation: Fix memory leak in dualshock4_get_calibration_data()
From: Abdun Nihaal @ 2025-11-11 11:23 UTC (permalink / raw)
To: Markus Elfring
Cc: linux-input, Roderick Colenbrander, LKML, Benjamin Tissoires,
Jiri Kosina
In-Reply-To: <cc4923d4-a24c-47ff-876d-0fddc0b8ad1e@web.de>
On Mon, Nov 10, 2025 at 06:49:01PM +0100, Markus Elfring wrote:
> > The memory allocated for buf is not freed in the error paths when
> > ps_get_report() fails. Free buf before jumping to transfer_failed label
>
> Would an additional label become helpful for this function implementation?
In the function, the code present at the transfer_failed label is shared
between normal and error paths, and is not the traditional error path label,
that's why I put the kfree for the two cases immediately before the goto.
Regards,
Nihaal
^ permalink raw reply
* Re: [PATCH v3 1/4] firmware_loader: expand firmware error codes with up-to-date error
From: Marco Felsch @ 2025-11-11 11:01 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: Russ Weight, Luis Chamberlain, Greg Kroah-Hartman,
Rafael J. Wysocki, Andrew Morton, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Kamel Bouhara, Marco Felsch,
Henrik Rydberg, Danilo Krummrich, linux-kernel, devicetree,
linux-input
In-Reply-To: <20251016145205.244gsevx5tdloiqy@pengutronix.de>
On 25-10-16, Marco Felsch wrote:
> Hi all,
>
> On 25-09-20, Dmitry Torokhov wrote:
> > On Wed, Aug 27, 2025 at 03:29:33PM -0600, Russ Weight wrote:
> > >
> > > On Thu, Aug 21, 2025 at 07:26:36PM +0200, Marco Felsch wrote:
> > > > Add FW_UPLOAD_ERR_DUPLICATE to allow drivers to inform the firmware_loader
> > > > framework that the update is not required. This can be the case if the
> > > > user provided firmware matches the current running firmware.
> > > >
> > > > Sync lib/test_firmware.c accordingly.
> > > >
> > > > Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
> > >
> > > Reviewed-by: Russ Weight <russ.weight@linux.dev>
> >
> > Does this mean I should merge this through input tree?
>
> may I ask how this is planned to go further?
Gentle ping.
Regards,
Marco
>
> Regards,
> Marco
>
> >
> > Thanks.
> >
> > --
> > Dmitry
--
#gernperDu
#CallMeByMyFirstName
Pengutronix e.K. | |
Steuerwalder Str. 21 | https://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-9 |
^ permalink raw reply
* [RFC PATCH 1/1] HID: input: Add support for multiple batteries per device
From: Lucas Zampieri @ 2025-11-11 10:56 UTC (permalink / raw)
To: linux-input
Cc: Lucas Zampieri, linux-kernel, Jiri Kosina, Benjamin Tissoires,
Sebastian Reichel, linux-pm
In-Reply-To: <20251111105634.1684751-1-lzampier@redhat.com>
Add support for multiple batteries per HID device by introducing
struct hid_battery to encapsulate individual battery state and using
a list to track multiple batteries identified by report ID. The legacy
dev->battery field is maintained for backwards compatibility.
Signed-off-by: Lucas Zampieri <lzampier@redhat.com>
---
drivers/hid/hid-core.c | 4 +
drivers/hid/hid-input.c | 193 +++++++++++++++++++++++++++-------------
include/linux/hid.h | 42 ++++++++-
3 files changed, 176 insertions(+), 63 deletions(-)
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index a5b3a8ca2fcb..76d628547e9a 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -2990,6 +2990,10 @@ struct hid_device *hid_allocate_device(void)
mutex_init(&hdev->ll_open_lock);
kref_init(&hdev->ref);
+#ifdef CONFIG_HID_BATTERY_STRENGTH
+ INIT_LIST_HEAD(&hdev->batteries);
+#endif
+
ret = hid_bpf_device_init(hdev);
if (ret)
goto out_err;
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
index e56e7de53279..071df319775b 100644
--- a/drivers/hid/hid-input.c
+++ b/drivers/hid/hid-input.c
@@ -454,7 +454,8 @@ static int hidinput_get_battery_property(struct power_supply *psy,
enum power_supply_property prop,
union power_supply_propval *val)
{
- struct hid_device *dev = power_supply_get_drvdata(psy);
+ struct hid_battery *bat = power_supply_get_drvdata(psy);
+ struct hid_device *dev = bat->dev;
int value;
int ret = 0;
@@ -465,13 +466,13 @@ static int hidinput_get_battery_property(struct power_supply *psy,
break;
case POWER_SUPPLY_PROP_CAPACITY:
- if (dev->battery_status != HID_BATTERY_REPORTED &&
- !dev->battery_avoid_query) {
+ if (bat->status != HID_BATTERY_REPORTED &&
+ !bat->avoid_query) {
value = hidinput_query_battery_capacity(dev);
if (value < 0)
return value;
} else {
- value = dev->battery_capacity;
+ value = bat->capacity;
}
val->intval = value;
@@ -482,20 +483,20 @@ static int hidinput_get_battery_property(struct power_supply *psy,
break;
case POWER_SUPPLY_PROP_STATUS:
- if (dev->battery_status != HID_BATTERY_REPORTED &&
- !dev->battery_avoid_query) {
+ if (bat->status != HID_BATTERY_REPORTED &&
+ !bat->avoid_query) {
value = hidinput_query_battery_capacity(dev);
if (value < 0)
return value;
- dev->battery_capacity = value;
- dev->battery_status = HID_BATTERY_QUERIED;
+ bat->capacity = value;
+ bat->status = HID_BATTERY_QUERIED;
}
- if (dev->battery_status == HID_BATTERY_UNKNOWN)
+ if (bat->status == HID_BATTERY_UNKNOWN)
val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
else
- val->intval = dev->battery_charge_status;
+ val->intval = bat->charge_status;
break;
case POWER_SUPPLY_PROP_SCOPE:
@@ -513,33 +514,53 @@ static int hidinput_get_battery_property(struct power_supply *psy,
static int hidinput_setup_battery(struct hid_device *dev, unsigned report_type,
struct hid_field *field, bool is_percentage)
{
+ struct hid_battery *bat;
struct power_supply_desc *psy_desc;
- struct power_supply_config psy_cfg = { .drv_data = dev, };
+ struct power_supply_config psy_cfg;
unsigned quirks;
s32 min, max;
int error;
+ int battery_num = 0;
- if (dev->battery)
- return 0; /* already initialized? */
+ list_for_each_entry(bat, &dev->batteries, list) {
+ if (bat->report_id == field->report->id)
+ return 0; /* already initialized */
+ battery_num++;
+ }
quirks = find_battery_quirk(dev);
- hid_dbg(dev, "device %x:%x:%x %d quirks %d\n",
- dev->bus, dev->vendor, dev->product, dev->version, quirks);
+ hid_dbg(dev, "device %x:%x:%x %d quirks %d report_id %d\n",
+ dev->bus, dev->vendor, dev->product, dev->version, quirks,
+ field->report->id);
if (quirks & HID_BATTERY_QUIRK_IGNORE)
return 0;
- psy_desc = kzalloc(sizeof(*psy_desc), GFP_KERNEL);
- if (!psy_desc)
+ bat = kzalloc(sizeof(*bat), GFP_KERNEL);
+ if (!bat)
return -ENOMEM;
- psy_desc->name = kasprintf(GFP_KERNEL, "hid-%s-battery",
- strlen(dev->uniq) ?
- dev->uniq : dev_name(&dev->dev));
+ psy_desc = kzalloc(sizeof(*psy_desc), GFP_KERNEL);
+ if (!psy_desc) {
+ error = -ENOMEM;
+ goto err_free_bat;
+ }
+
+ /* Create unique name for each battery based on report ID */
+ if (battery_num == 0) {
+ psy_desc->name = kasprintf(GFP_KERNEL, "hid-%s-battery",
+ strlen(dev->uniq) ?
+ dev->uniq : dev_name(&dev->dev));
+ } else {
+ psy_desc->name = kasprintf(GFP_KERNEL, "hid-%s-battery-%d",
+ strlen(dev->uniq) ?
+ dev->uniq : dev_name(&dev->dev),
+ battery_num);
+ }
if (!psy_desc->name) {
error = -ENOMEM;
- goto err_free_mem;
+ goto err_free_desc;
}
psy_desc->type = POWER_SUPPLY_TYPE_BATTERY;
@@ -559,98 +580,148 @@ static int hidinput_setup_battery(struct hid_device *dev, unsigned report_type,
if (quirks & HID_BATTERY_QUIRK_FEATURE)
report_type = HID_FEATURE_REPORT;
- dev->battery_min = min;
- dev->battery_max = max;
- dev->battery_report_type = report_type;
- dev->battery_report_id = field->report->id;
- dev->battery_charge_status = POWER_SUPPLY_STATUS_DISCHARGING;
+ /* Initialize battery structure */
+ bat->dev = dev;
+ bat->min = min;
+ bat->max = max;
+ bat->report_type = report_type;
+ bat->report_id = field->report->id;
+ bat->charge_status = POWER_SUPPLY_STATUS_DISCHARGING;
+ bat->status = HID_BATTERY_UNKNOWN;
/*
* Stylus is normally not connected to the device and thus we
* can't query the device and get meaningful battery strength.
* We have to wait for the device to report it on its own.
*/
- dev->battery_avoid_query = report_type == HID_INPUT_REPORT &&
- field->physical == HID_DG_STYLUS;
+ bat->avoid_query = report_type == HID_INPUT_REPORT &&
+ field->physical == HID_DG_STYLUS;
if (quirks & HID_BATTERY_QUIRK_AVOID_QUERY)
- dev->battery_avoid_query = true;
+ bat->avoid_query = true;
- dev->battery = power_supply_register(&dev->dev, psy_desc, &psy_cfg);
- if (IS_ERR(dev->battery)) {
- error = PTR_ERR(dev->battery);
+ psy_cfg.drv_data = bat;
+ bat->ps = power_supply_register(&dev->dev, psy_desc, &psy_cfg);
+ if (IS_ERR(bat->ps)) {
+ error = PTR_ERR(bat->ps);
hid_warn(dev, "can't register power supply: %d\n", error);
goto err_free_name;
}
- power_supply_powers(dev->battery, &dev->dev);
+ power_supply_powers(bat->ps, &dev->dev);
+
+ list_add_tail(&bat->list, &dev->batteries);
+
+ /*
+ * The legacy single battery API is preserved by exposing the first
+ * discovered battery. Systems relying on a single battery view maintain
+ * unchanged behavior.
+ */
+ if (battery_num == 0) {
+ dev->battery = bat->ps;
+ dev->battery_min = bat->min;
+ dev->battery_max = bat->max;
+ dev->battery_report_type = bat->report_type;
+ dev->battery_report_id = bat->report_id;
+ dev->battery_charge_status = bat->charge_status;
+ dev->battery_status = bat->status;
+ dev->battery_avoid_query = bat->avoid_query;
+ }
+
return 0;
err_free_name:
kfree(psy_desc->name);
-err_free_mem:
+err_free_desc:
kfree(psy_desc);
- dev->battery = NULL;
+err_free_bat:
+ kfree(bat);
return error;
}
static void hidinput_cleanup_battery(struct hid_device *dev)
{
+ struct hid_battery *bat, *next;
const struct power_supply_desc *psy_desc;
- if (!dev->battery)
- return;
+ list_for_each_entry_safe(bat, next, &dev->batteries, list) {
+ psy_desc = bat->ps->desc;
+ power_supply_unregister(bat->ps);
+ kfree(psy_desc->name);
+ kfree(psy_desc);
+ list_del(&bat->list);
+ kfree(bat);
+ }
- psy_desc = dev->battery->desc;
- power_supply_unregister(dev->battery);
- kfree(psy_desc->name);
- kfree(psy_desc);
dev->battery = NULL;
}
-static bool hidinput_update_battery_charge_status(struct hid_device *dev,
+static struct hid_battery *hidinput_find_battery(struct hid_device *dev,
+ int report_id)
+{
+ struct hid_battery *bat;
+
+ list_for_each_entry(bat, &dev->batteries, list) {
+ if (bat->report_id == report_id)
+ return bat;
+ }
+ return NULL;
+}
+
+static bool hidinput_update_battery_charge_status(struct hid_battery *bat,
unsigned int usage, int value)
{
switch (usage) {
case HID_BAT_CHARGING:
- dev->battery_charge_status = value ?
- POWER_SUPPLY_STATUS_CHARGING :
- POWER_SUPPLY_STATUS_DISCHARGING;
+ bat->charge_status = value ?
+ POWER_SUPPLY_STATUS_CHARGING :
+ POWER_SUPPLY_STATUS_DISCHARGING;
+ if (bat->dev->battery == bat->ps)
+ bat->dev->battery_charge_status = bat->charge_status;
return true;
}
return false;
}
-static void hidinput_update_battery(struct hid_device *dev, unsigned int usage,
- int value)
+static void hidinput_update_battery(struct hid_device *dev, int report_id,
+ unsigned int usage, int value)
{
+ struct hid_battery *bat;
int capacity;
- if (!dev->battery)
+ bat = hidinput_find_battery(dev, report_id);
+ if (!bat)
return;
- if (hidinput_update_battery_charge_status(dev, usage, value)) {
- power_supply_changed(dev->battery);
+ if (hidinput_update_battery_charge_status(bat, usage, value)) {
+ power_supply_changed(bat->ps);
return;
}
if ((usage & HID_USAGE_PAGE) == HID_UP_DIGITIZER && value == 0)
return;
- if (value < dev->battery_min || value > dev->battery_max)
+ if (value < bat->min || value > bat->max)
return;
capacity = hidinput_scale_battery_capacity(dev, value);
- if (dev->battery_status != HID_BATTERY_REPORTED ||
- capacity != dev->battery_capacity ||
- ktime_after(ktime_get_coarse(), dev->battery_ratelimit_time)) {
- dev->battery_capacity = capacity;
- dev->battery_status = HID_BATTERY_REPORTED;
- dev->battery_ratelimit_time =
+ if (bat->status != HID_BATTERY_REPORTED ||
+ capacity != bat->capacity ||
+ ktime_after(ktime_get_coarse(), bat->ratelimit_time)) {
+ bat->capacity = capacity;
+ bat->status = HID_BATTERY_REPORTED;
+ bat->ratelimit_time =
ktime_add_ms(ktime_get_coarse(), 30 * 1000);
- power_supply_changed(dev->battery);
+
+ if (dev->battery == bat->ps) {
+ dev->battery_capacity = bat->capacity;
+ dev->battery_status = bat->status;
+ dev->battery_ratelimit_time = bat->ratelimit_time;
+ }
+
+ power_supply_changed(bat->ps);
}
}
#else /* !CONFIG_HID_BATTERY_STRENGTH */
@@ -664,8 +735,8 @@ static void hidinput_cleanup_battery(struct hid_device *dev)
{
}
-static void hidinput_update_battery(struct hid_device *dev, unsigned int usage,
- int value)
+static void hidinput_update_battery(struct hid_device *dev, int report_id,
+ unsigned int usage, int value)
{
}
#endif /* CONFIG_HID_BATTERY_STRENGTH */
@@ -1533,7 +1604,7 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct
return;
if (usage->type == EV_PWR) {
- hidinput_update_battery(hid, usage->hid, value);
+ hidinput_update_battery(hid, report->id, usage->hid, value);
return;
}
diff --git a/include/linux/hid.h b/include/linux/hid.h
index a4ddb94e3ee5..a6e36835fb3c 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -634,6 +634,36 @@ enum hid_battery_status {
HID_BATTERY_REPORTED, /* Device sent unsolicited battery strength report */
};
+/**
+ * struct hid_battery - represents a single battery power supply
+ * @list: list node for linking into hid_device's battery list
+ * @dev: pointer to the parent hid_device
+ * @ps: the power supply device
+ * @capacity: current battery capacity
+ * @min: minimum battery value
+ * @max: maximum battery value
+ * @report_type: type of report (HID_INPUT_REPORT, HID_FEATURE_REPORT)
+ * @report_id: report ID for this battery
+ * @charge_status: current charge status
+ * @status: battery status (unknown, queried, reported)
+ * @avoid_query: if true, don't query battery (wait for device reports)
+ * @ratelimit_time: time for rate limiting battery updates
+ */
+struct hid_battery {
+ struct list_head list;
+ struct hid_device *dev;
+ struct power_supply *ps;
+ __s32 capacity;
+ __s32 min;
+ __s32 max;
+ __s32 report_type;
+ __s32 report_id;
+ __s32 charge_status;
+ enum hid_battery_status status;
+ bool avoid_query;
+ ktime_t ratelimit_time;
+};
+
struct hid_driver;
struct hid_ll_driver;
@@ -670,8 +700,16 @@ struct hid_device {
#ifdef CONFIG_HID_BATTERY_STRENGTH
/*
* Power supply information for HID devices which report
- * battery strength. power_supply was successfully registered if
- * battery is non-NULL.
+ * battery strength. Each battery is tracked separately in the
+ * batteries list.
+ */
+ struct list_head batteries; /* List of hid_battery structures */
+
+ /*
+ * Legacy single battery support - kept for backwards compatibility.
+ * Points to the first battery in the list if any exists.
+ * power_supply was successfully registered if battery is non-NULL.
+ * DEPRECATED: New code should iterate through batteries list instead.
*/
struct power_supply *battery;
__s32 battery_capacity;
--
2.51.1
^ permalink raw reply related
* [RFC PATCH 0/1] HID: Add support for multiple batteries per device
From: Lucas Zampieri @ 2025-11-11 10:56 UTC (permalink / raw)
To: linux-input
Cc: Lucas Zampieri, linux-kernel, Jiri Kosina, Benjamin Tissoires,
Sebastian Reichel, linux-pm
This RFC introduces support for multiple batteries per HID device, addressing
a long-standing architectural limitation in the HID battery reporting subsystem.
## Background
The current HID implementation explicitly prevents multiple batteries per device
through an early return in hidinput_setup_battery() that enforces a single-battery
assumption. Linux treats peripheral batteries (scope=Device) differently from system
batteries, with desktop environments often displaying them separately or ignoring
them entirely. However, this design doesn't account for modern multi-battery hardware patterns.
## Problem Statement
Multiple battery scenarios that cannot be properly reported today:
1. Gaming headsets with charging docks (e.g., SteelSeries Arctis Nova Pro
Wireless) - headset battery reported, dock battery invisible
2. Graphics tablets with stylus batteries (Wacom) - requires driver-specific
workarounds
3. Wireless earbuds with per-earbud batteries plus charging case
4. Multi-device receivers (Logitech Unifying) - requires proprietary HID++
protocol parsing
This forces manufacturers to use proprietary protocols and vendor-specific
software. Community projects parse USB packets directly because standard HID
battery reporting cannot handle multi-battery scenarios.
## Why This Matters
The current limitation creates a cycle: OS lacks support, so manufacturers
implement proprietary protocols, which makes vendor software necessary, which
reduces pressure to fix the OS limitation. Improving HID core support for
multiple batteries would enable standardized reporting, reduce the need for
vendor software, improve OS integration, reduce driver duplication, and provide
a foundation for future multi-battery devices.
## Proposed Solution
This patch introduces struct hid_battery to encapsulate individual battery
state, adds a batteries list to struct hid_device for tracking multiple
batteries, and uses report ID-based identification. The implementation maintains
full backwards compatibility with existing single-battery code.
## Testing
Tested with split keyboard hardware. Each battery reports independently
through the power supply interface.
## Request for Comments
Is list-based storage appropriate or would another structure work better?
Should we support usage-based identification in addition to report ID for
devices using the same report ID? Is sequential naming (battery-N) sufficient
or should batteries have semantic role identifiers like "main", "stylus", "dock"?
To HID maintainers (Jiri Kosina, Benjamin Tissoires): Does this belong in
hid-input.c or should it be separate? Any concerns about the backwards
compatibility approach? Meaning, should I have removed the whole
dev->bat legacy mapping and use the new struct?
To power supply maintainers (Sebastian Reichel): Any issues with multiple
power_supply devices from a single HID device?
Related commits:
- c6838eeef2fb: HID: hid-input: occasionally report stylus battery
- a608dc1c0639: HID: input: map battery system charging
- fd2a9b29dc9c: HID: wacom: Remove AES power_supply after inactivity
Community projects demonstrating the need:
- HeadsetControl: https://github.com/Sapd/HeadsetControl
- Solaar: https://github.com/pwr-Solaar/Solaar
- OpenRazer: https://github.com/openrazer/openrazer
Lucas Zampieri (1):
HID: input: Add support for multiple batteries per device
drivers/hid/hid-core.c | 4 +
drivers/hid/hid-input.c | 193 +++++++++++++++++++++++++++-------------
include/linux/hid.h | 42 ++++++++-
3 files changed, 176 insertions(+), 63 deletions(-)
--
2.51.1
^ permalink raw reply
* Re: [BUG] Edifier QR30 (2d99:a101, Jieli Technology) reboots itself when RGB brightness button is used under Linux
From: Oliver Neukum @ 2025-11-11 9:16 UTC (permalink / raw)
To: Terry Junge, The-Luga, Alan Stern
Cc: Dmitry Torokhov, Michal Pecio, Terry Junge, linux-sound,
linux-usb, linux-input, Jiri Kosina, Benjamin Tissoires
In-Reply-To: <c6d506f7-f13b-4d57-a522-a2ccd09e7a1f@cosmicgizmosystems.com>
On 11.11.25 06:11, Terry Junge wrote:
> Polling for input reports is handled by the hardware at the interval
> requested by the device during enumeration. There is no intervention by
> the kernel to poll for an input report. The only way the kernel can stop
> polling a device for input reports is to suspend it.
>
> So ALWAYS_POLL means never suspend.
Hi,
that is not exactly correct. ALWAYS_POLL, means that
a) the device is always polled _while_ it is active
b) if the device is suspended remote wakeup is always requested
Regards
Oliver
^ permalink raw reply
* Re: [PATCH 1/2] dt-bindings: HID: i2c-hid: elan: Introduce FocalTech FT8112
From: Krzysztof Kozlowski @ 2025-11-11 9:10 UTC (permalink / raw)
To: Daniel Peng(彭博煜_Pegatron)
Cc: Dmitry Torokhov, linux-input@vger.kernel.org, LKML, Conor Dooley,
Krzysztof Kozlowski, Rob Herring, devicetree@vger.kernel.org,
daniel_peng@pegatron.corp-partner.google.com
In-Reply-To: <SEZPR06MB67428F386E3E56D0710AC7EBE7CFA@SEZPR06MB6742.apcprd06.prod.outlook.com>
On 11/11/2025 09:35, Daniel Peng(彭博煜_Pegatron) wrote:
> Remove added members.
>
> Sorry to send duplicated them. This is my first time to process the upstream.
> Could you help to confirm how to version my patches correctly?
And kernel docs don't explain that? There are multiple guidelines in
internet, multiple talks describing it, so I don't think that me
repeating the same again is needed.
Please version your patches correctly, e.g. use b4 or git format-patch
-vX, and add changelog in cover letter or under '---' of individual
patches describing changes from previous version.
Best regards,
Krzysztof
^ permalink raw reply
* RE: [PATCH 1/2] dt-bindings: HID: i2c-hid: elan: Introduce FocalTech FT8112
From: Daniel Peng(彭博煜_Pegatron) @ 2025-11-11 8:35 UTC (permalink / raw)
To: krzk@kernel.org
Cc: Dmitry Torokhov, linux-input@vger.kernel.org, LKML, Conor Dooley,
Krzysztof Kozlowski, Rob Herring, devicetree@vger.kernel.org,
daniel_peng@pegatron.corp-partner.google.com
In-Reply-To: <28eea826-09e4-4b0c-8845-50d4cf9bac7e@kernel.org>
Remove added members.
Sorry to send duplicated them. This is my first time to process the upstream.
Could you help to confirm how to version my patches correctly?
Thanks.
Best Regards.
Daniel
-----Original Message-----
From: krzk@kernel.org <krzk@kernel.org>
Sent: Tuesday, November 11, 2025 4:22 PM
To: Daniel Peng(彭博煜_Pegatron) <Daniel_Peng@pegatroncorp.com>; treapking@chromium.org
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>; linux-input@vger.kernel.org; LKML <linux-kernel@vger.kernel.org>; Conor Dooley <conor+dt@kernel.org>; Krzysztof Kozlowski <krzk+dt@kernel.org>; Rob Herring <robh@kernel.org>; devicetree@vger.kernel.org; Asher Huang(黃進南_Pegatron) <Asher_Huang@pegatroncorp.com>; daniel_peng@pegatron.corp-partner.google.com
Subject: Re: [PATCH 1/2] dt-bindings: HID: i2c-hid: elan: Introduce FocalTech FT8112
On 11/11/2025 08:50, Daniel Peng(彭博煜_Pegatron) wrote:
> Hi Pin-yen,
>
> I had re-submitted the 2 CLs to upstream. Please refer the attachments.
No, you duplicated them.
Please version your patches correctly.
>
>> +maintainers:
>> + - Dmitry Torokhov <dmitry.torokhov@gmail.com>
>
> List yourself as the maintainer of this binding file instead of the subsystem maintainer.
> [Daniel] What your mean is maintainers in this file should be Me
> right?(as below)
I don't understand what is the quote here and what is your response.
This is unreadable.
Please use STANDARD EMAIL format, not some odd Outlook style. We don't accept here Outlook or other crappy webclients.
>
>
> This e-mail and its attachment may contain information that is confidential or privileged, and are solely for the use of the individual to whom this e-mail is addressed. If you are not the intended recipient or have received it accidentally, please immediately notify the sender by reply e-mail and destroy all copies of this email and its attachment. Please be advised that any unauthorized use, disclosure, distribution or copying of this email or its attachment is strictly prohibited.
Don't ever send such confidential disclaimers. This means we should be ignoring your messages. Are you sure you want that?
Best regards,
Krzysztof
^ permalink raw reply
* Re: [PATCH 1/2] dt-bindings: HID: i2c-hid: elan: Introduce FocalTech FT8112
From: Krzysztof Kozlowski @ 2025-11-11 8:21 UTC (permalink / raw)
To: Daniel Peng(彭博煜_Pegatron),
treapking@chromium.org
Cc: Dmitry Torokhov, linux-input@vger.kernel.org, LKML, Conor Dooley,
Krzysztof Kozlowski, Rob Herring, devicetree@vger.kernel.org,
Asher Huang(黃進南_Pegatron),
daniel_peng@pegatron.corp-partner.google.com
In-Reply-To: <SEZPR06MB67427DD182968980F4C93C08E7CFA@SEZPR06MB6742.apcprd06.prod.outlook.com>
On 11/11/2025 08:50, Daniel Peng(彭博煜_Pegatron) wrote:
> Hi Pin-yen,
>
> I had re-submitted the 2 CLs to upstream. Please refer the attachments.
No, you duplicated them.
Please version your patches correctly.
>
>> +maintainers:
>> + - Dmitry Torokhov <dmitry.torokhov@gmail.com>
>
> List yourself as the maintainer of this binding file instead of the subsystem maintainer.
> [Daniel] What your mean is maintainers in this file should be Me right?(as below)
I don't understand what is the quote here and what is your response.
This is unreadable.
Please use STANDARD EMAIL format, not some odd Outlook style. We don't
accept here Outlook or other crappy webclients.
>
>
> This e-mail and its attachment may contain information that is confidential or privileged, and are solely for the use of the individual to whom this e-mail is addressed. If you are not the intended recipient or have received it accidentally, please immediately notify the sender by reply e-mail and destroy all copies of this email and its attachment. Please be advised that any unauthorized use, disclosure, distribution or copying of this email or its attachment is strictly prohibited.
Don't ever send such confidential disclaimers. This means we should be
ignoring your messages. Are you sure you want that?
Best regards,
Krzysztof
^ permalink raw reply
* Re: [PATCH 1/2] dt-bindings: input: i2c-hid: Introduce FocalTech FT8112
From: Krzysztof Kozlowski @ 2025-11-11 8:19 UTC (permalink / raw)
To: daniel_peng
Cc: Dmitry Torokhov, linux-input, LKML, Conor Dooley,
Krzysztof Kozlowski, Rob Herring, devicetree
In-Reply-To: <20251111143853.1.I76ee34ac45e1469dbeb11de0d1e47d794af7dc88@changeid>
On Tue, Nov 11, 2025 at 02:38:59PM +0800, daniel_peng@pegatron.corp-partner.google.com wrote:
> From: Daniel Peng <Daniel_Peng@pegatron.corp-partner.google.com>
>
> The FocalTech FT8112 touch screen chip same as Ilitek ili2901 controller
> has a reset gpio. The difference is that they have different
> post_gpio_reset_on_delay_ms.
> FocalTech FT8112 also uses 3.3V power supply.
>
> Signed-off-by: Daniel Peng <Daniel_Peng@pegatron.corp-partner.google.com>
You already sent this v1! And received review there.
Don't send duplicates. Instead version your patches properly and respond
to review at v1. Next patchset will be v3.
Anyway, this patch has the same issues as before, also bounced from your
own Google servers as spam.
You send it through Google, so at least you could be sure that Google
servers accept your own patches.
Best regards,
Krzysztof
^ permalink raw reply
* Re: [PATCH] The Edifier QR30 USB speaker, identified as: Jieli Technology EDIFIER Hal0 2.0 SE 2d99:a101, reports a HID interface that needs HID_QUIRK_ALWAYS_POLL to ensure it does not crash when changing the RGB brightness with the physical knob.
From: The-Luga @ 2025-11-11 8:08 UTC (permalink / raw)
To: linuxhid
Cc: bentiss, dmitry.torokhov, jikos, linux-input, linux-sound,
linux-usb, linuxsound, michal.pecio, stern
In-Reply-To: <20251111074205.1533558-1-lugathe2@gmail.com>
Thank you all! This was my first time contributing.
>ALSA and the rest are triggered to bump the volume up or down with the
>Consumer Control Volume Up and Volume Down events. Those HID usages are
>declared in the other HID interface but never fired as your testing shows.
Thank you for the suggestion! I might try something like that in the
future. For now, I’m happy mapping the codes of the speaker. Reverse
engineering is so much fun! I hope this patch helps others avoid the
frustration I experienced with this bug haha.
^ permalink raw reply
* RE: [PATCH 1/2] dt-bindings: HID: i2c-hid: elan: Introduce FocalTech FT8112
From: Daniel Peng(彭博煜_Pegatron) @ 2025-11-11 7:50 UTC (permalink / raw)
To: treapking@chromium.org
Cc: Dmitry Torokhov, linux-input@vger.kernel.org, LKML, Conor Dooley,
Krzysztof Kozlowski, Rob Herring, devicetree@vger.kernel.org,
Asher Huang(黃進南_Pegatron),
daniel_peng@pegatron.corp-partner.google.com
In-Reply-To: <CAEXTbpc9=Gt7QrFrtV60+EvKdmBGsVpJxg7yYaa6HfuGGB3OqQ@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 6264 bytes --]
Hi Pin-yen,
I had re-submitted the 2 CLs to upstream. Please refer the attachments.
> +maintainers:
> + - Dmitry Torokhov <dmitry.torokhov@gmail.com>
List yourself as the maintainer of this binding file instead of the subsystem maintainer.
[Daniel] What your mean is maintainers in this file should be Me right?(as below)
> +maintainers:
> + - Daniel Peng <Daniel_Peng@pegatron.corp-partner.google.com>
You have an extra '>' here. This should be caught by `make dt_binding_check`. Please check [1] and [2], and make sure the patches are tested before you send them out.
[Daniel] Yes. I had re-upload the patch again to remove the extra '>' in focaltech,ft8112.yaml.
Moreover, I confirm no error for focaltech,ft8112.yaml after running command "make dt_binding_check".
> +F: drivers/hid/
Why did you add this?
[Daniel] If not added this, the command ./scripts/checkpatch.pl 0001-dt-bindings-input-i2c-hid-Introduce-FocalTech-FT8112.patch would had 1 warning.
And the WARNING as below:
WARNING: added, moved or deleted files(s_, does MAINTAINERS need updating?
#21:
new file mode 100644
Thanks.
Best Regards.
Daniel
-----Original Message-----
From: daniel_peng+caf_=Daniel_Peng=pegatroncorp.com@pegatron.corp-partner.google.com <daniel_peng+caf_=Daniel_Peng=pegatroncorp.com@pegatron.corp-partner.google.com>
Sent: Tuesday, November 11, 2025 3:18 PM
To: daniel_peng@pegatron.corp-partner.google.com
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>; linux-input@vger.kernel.org; LKML <linux-kernel@vger.kernel.org>; Conor Dooley <conor+dt@kernel.org>; Krzysztof Kozlowski <krzk+dt@kernel.org>; Rob Herring <robh@kernel.org>; devicetree@vger.kernel.org
Subject: Re: [PATCH 1/2] dt-bindings: HID: i2c-hid: elan: Introduce FocalTech FT8112
Hi Daniel,
On Tue, Nov 11, 2025 at 9:34 AM
<daniel_peng@pegatron.corp-partner.google.com> wrote:
>
> From: Daniel Peng <Daniel_Peng@pegatron.corp-partner.google.com>
>
> The FocalTech FT8112 touch screen chip same as Ilitek ili2901
> controller has a reset gpio. The difference is that they have
> different post_gpio_reset_on_delay_ms.
> FocalTech FT8112 also uses 3.3V power supply.
>
> Signed-off-by: Daniel Peng
> <Daniel_Peng@pegatron.corp-partner.google.com>
> ---
>
> .../bindings/input/focaltech,ft8112.yaml | 66 +++++++++++++++++++
> MAINTAINERS | 1 +
> 2 files changed, 67 insertions(+)
> create mode 100644
> Documentation/devicetree/bindings/input/focaltech,ft8112.yaml
>
> diff --git
> a/Documentation/devicetree/bindings/input/focaltech,ft8112.yaml
> b/Documentation/devicetree/bindings/input/focaltech,ft8112.yaml
> new file mode 100644
> index 000000000000..391825b24fcb
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/input/focaltech,ft8112.yaml
> @@ -0,0 +1,66 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) %YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/input/focaltech,ft8112.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: FocalTech FT8112 touchscreen controller
> +
> +maintainers:
> + - Dmitry Torokhov <dmitry.torokhov@gmail.com>
List yourself as the maintainer of this binding file instead of the subsystem maintainer.
> +
> +description:
> + Supports the FocalTech FT8112 touchscreen controller.
> + This touchscreen controller uses the i2c-hid protocol with a reset GPIO.
> +
> +allOf:
> + - $ref: /schemas/input/touchscreen/touchscreen.yaml#
> +
> +properties:
> + compatible:
> + enum:
> + - focaltech,ft8112
> +
> + reg:
> + maxItems: 1
> +
> + interrupts:
> + maxItems: 1
> +
> + panel: true
> +
> + reset-gpios:
> + maxItems: 1
> +
> + vcc33-supply: true
> +
> + vccio-supply: true
> +
> +required:
> + - compatible
> + - reg
> + - interrupts
> + - vcc33-supply
> +
> +additionalProperties: false
> +
> +examples:
> + - |
> + #include <dt-bindings/gpio/gpio.h>
> + #include <dt-bindings/interrupt-controller/irq.h>
> +
> + i2c {
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + touchscreen@38 {
> + compatible = "focaltech,ft8112";
> + reg = <0x38>;
> +
> + interrupt-parent = <&pio>;
> + interrupts = <15 IRQ_TYPE_LEVEL_LOW>>;
You have an extra '>' here. This should be caught by `make dt_binding_check`. Please check [1] and [2], and make sure the patches are tested before you send them out.
[1]: https://www.kernel.org/doc/Documentation/devicetree/writing-schema.md
[2]: https://www.linaro.org/blog/tips-and-tricks-for-validating-devicetree-sources-with-the-devicetree-schema/
> +
> + reset-gpios = <&pio 126 GPIO_ACTIVE_LOW>;
> + vcc33-supply = <&pp3300_tchscr_x>;
> + };
> + };
> diff --git a/MAINTAINERS b/MAINTAINERS index
> ddecf1ef3bed..69f54515fe98 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -12326,6 +12326,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git
> F: Documentation/devicetree/bindings/input/
> F: Documentation/devicetree/bindings/serio/
> F: Documentation/input/
> +F: drivers/hid/
Why did you add this?
> F: drivers/input/
> F: include/dt-bindings/input/
> F: include/linux/gameport.h
Regards,
Pin-yen
This e-mail and its attachment may contain information that is confidential or privileged, and are solely for the use of the individual to whom this e-mail is addressed. If you are not the intended recipient or have received it accidentally, please immediately notify the sender by reply e-mail and destroy all copies of this email and its attachment. Please be advised that any unauthorized use, disclosure, distribution or copying of this email or its attachment is strictly prohibited.
本電子郵件及其附件可能含有機密或依法受特殊管制之資訊,僅供本電子郵件之受文者使用。台端如非本電子郵件之受文者或誤收本電子郵件,請立即回覆郵件通知寄件人,並銷毀本電子郵件之所有複本及附件。任何未經授權而使用、揭露、散佈或複製本電子郵件或其附件之行為,皆嚴格禁止 。
[-- Attachment #2: Type: message/rfc822, Size: 20509 bytes --]
From: "daniel_peng+caf_=Daniel_Peng=pegatroncorp.com@pegatron.corp-partner.google.com" <daniel_peng+caf_=Daniel_Peng=pegatroncorp.com@pegatron.corp-partner.google.com>
To: Dmitry Torokhov <dmitry.torokhov@gmail.com>, "linux-input@vger.kernel.org" <linux-input@vger.kernel.org>
Cc: LKML <linux-kernel@vger.kernel.org>, Daniel Peng <Daniel_Peng@pegatron.corp-partner.google.com>, Conor Dooley <conor+dt@kernel.org>, Krzysztof Kozlowski <krzk+dt@kernel.org>, Rob Herring <robh@kernel.org>, "devicetree@vger.kernel.org" <devicetree@vger.kernel.org>
Subject: [PATCH 1/2] dt-bindings: input: i2c-hid: Introduce FocalTech FT8112
Date: Tue, 11 Nov 2025 06:38:59 +0000
Message-ID: <20251111143853.1.I76ee34ac45e1469dbeb11de0d1e47d794af7dc88@changeid>
From: Daniel Peng <Daniel_Peng@pegatron.corp-partner.google.com>
The FocalTech FT8112 touch screen chip same as Ilitek ili2901 controller
has a reset gpio. The difference is that they have different
post_gpio_reset_on_delay_ms.
FocalTech FT8112 also uses 3.3V power supply.
Signed-off-by: Daniel Peng <Daniel_Peng@pegatron.corp-partner.google.com>
---
.../bindings/input/focaltech,ft8112.yaml | 66 +++++++++++++++++++
MAINTAINERS | 1 +
2 files changed, 67 insertions(+)
create mode 100644 Documentation/devicetree/bindings/input/focaltech,ft8112.yaml
diff --git a/Documentation/devicetree/bindings/input/focaltech,ft8112.yaml b/Documentation/devicetree/bindings/input/focaltech,ft8112.yaml
new file mode 100644
index 000000000000..114288787c98
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/focaltech,ft8112.yaml
@@ -0,0 +1,66 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/input/focaltech,ft8112.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: FocalTech FT8112 touchscreen controller
+
+maintainers:
+ - Dmitry Torokhov <dmitry.torokhov@gmail.com>
+
+description:
+ Supports the FocalTech FT8112 touchscreen controller.
+ This touchscreen controller uses the i2c-hid protocol with a reset GPIO.
+
+allOf:
+ - $ref: /schemas/input/touchscreen/touchscreen.yaml#
+
+properties:
+ compatible:
+ enum:
+ - focaltech,ft8112
+
+ reg:
+ maxItems: 1
+
+ interrupts:
+ maxItems: 1
+
+ panel: true
+
+ reset-gpios:
+ maxItems: 1
+
+ vcc33-supply: true
+
+ vccio-supply: true
+
+required:
+ - compatible
+ - reg
+ - interrupts
+ - vcc33-supply
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/gpio/gpio.h>
+ #include <dt-bindings/interrupt-controller/irq.h>
+
+ i2c {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ touchscreen@38 {
+ compatible = "focaltech,ft8112";
+ reg = <0x38>;
+
+ interrupt-parent = <&pio>;
+ interrupts = <15 IRQ_TYPE_LEVEL_LOW>;
+
+ reset-gpios = <&pio 126 GPIO_ACTIVE_LOW>;
+ vcc33-supply = <&pp3300_tchscr_x>;
+ };
+ };
diff --git a/MAINTAINERS b/MAINTAINERS
index ddecf1ef3bed..69f54515fe98 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -12326,6 +12326,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git
F: Documentation/devicetree/bindings/input/
F: Documentation/devicetree/bindings/serio/
F: Documentation/input/
+F: drivers/hid/
F: drivers/input/
F: include/dt-bindings/input/
F: include/linux/gameport.h
--
2.34.1
[-- Attachment #3: Type: message/rfc822, Size: 19265 bytes --]
From: "daniel_peng+caf_=Daniel_Peng=pegatroncorp.com@pegatron.corp-partner.google.com" <daniel_peng+caf_=Daniel_Peng=pegatroncorp.com@pegatron.corp-partner.google.com>
To: Dmitry Torokhov <dmitry.torokhov@gmail.com>, "linux-input@vger.kernel.org" <linux-input@vger.kernel.org>
Cc: LKML <linux-kernel@vger.kernel.org>, Daniel Peng <Daniel_Peng@pegatron.corp-partner.google.com>, Benjamin Tissoires <bentiss@kernel.org>, Douglas Anderson <dianders@chromium.org>, Jiri Kosina <jikos@kernel.org>, Pin-yen Lin <treapking@chromium.org>
Subject: [PATCH 2/2] HID: i2c-hid: Add new FocalTech Touchscreen Chip
Date: Tue, 11 Nov 2025 06:39:00 +0000
Message-ID: <20251111143853.2.Iad6f93df7a4436f6a84ed7b7493fc468c56ab750@changeid>
From: Daniel Peng <Daniel_Peng@pegatron.corp-partner.google.com>
Information for touchscreen model HKO/RB116AS01-2 as below:
- HID :FTSC1000
- slave address:0X38
- Interface:HID over I2C
- Touch control lC:FT8112
- I2C ID: PNP0C50
Signed-off-by: Daniel Peng <Daniel_Peng@pegatron.corp-partner.google.com>
---
drivers/hid/i2c-hid/i2c-hid-of-elan.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/drivers/hid/i2c-hid/i2c-hid-of-elan.c b/drivers/hid/i2c-hid/i2c-hid-of-elan.c
index 0215f217f6d8..b81fcc6ff49e 100644
--- a/drivers/hid/i2c-hid/i2c-hid-of-elan.c
+++ b/drivers/hid/i2c-hid/i2c-hid-of-elan.c
@@ -168,6 +168,13 @@ static const struct elan_i2c_hid_chip_data elan_ekth6a12nay_chip_data = {
.power_after_backlight = true,
};
+static const struct elan_i2c_hid_chip_data focaltech_ft8112_chip_data = {
+ .post_power_delay_ms = 10,
+ .post_gpio_reset_on_delay_ms = 150,
+ .hid_descriptor_address = 0x0001,
+ .main_supply_name = "vcc33",
+};
+
static const struct elan_i2c_hid_chip_data ilitek_ili9882t_chip_data = {
.post_power_delay_ms = 1,
.post_gpio_reset_on_delay_ms = 200,
@@ -191,6 +198,7 @@ static const struct elan_i2c_hid_chip_data ilitek_ili2901_chip_data = {
static const struct of_device_id elan_i2c_hid_of_match[] = {
{ .compatible = "elan,ekth6915", .data = &elan_ekth6915_chip_data },
{ .compatible = "elan,ekth6a12nay", .data = &elan_ekth6a12nay_chip_data },
+ { .compatible = "focaltech,ft8112", .data = &focaltech_ft8112_chip_data },
{ .compatible = "ilitek,ili9882t", .data = &ilitek_ili9882t_chip_data },
{ .compatible = "ilitek,ili2901", .data = &ilitek_ili2901_chip_data },
{ }
--
2.34.1
^ permalink raw reply related
* [PATCH] The Edifier QR30 USB speaker, identified as: Jieli Technology EDIFIER Hal0 2.0 SE 2d99:a101, reports a HID interface that needs HID_QUIRK_ALWAYS_POLL to ensure it does not crash when changing the RGB brightness with the physical knob.
From: Rodrigo Lugathe da Conceição Alves @ 2025-11-11 7:42 UTC (permalink / raw)
To: linuxhid
Cc: bentiss, dmitry.torokhov, jikos, linux-input, linux-sound,
linux-usb, linuxsound, lugathe2, michal.pecio, stern
In-Reply-To: <c6d506f7-f13b-4d57-a522-a2ccd09e7a1f@cosmicgizmosystems.com>
Add a new vendor and product ID entry in hid-ids.h and register
the corresponding device in hid-quirks.c with the required quirk.
Signed-off-by: Rodrigo Lugathe da Conceição Alves <lugathe2@gmail.com>
---
drivers/hid/hid-ids.h | 3 +++
drivers/hid/hid-quirks.c | 1 +
2 files changed, 4 insertions(+)
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 0723b4b1c9ec..ece1bea0faa5 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -734,6 +734,9 @@
#define USB_VENDOR_ID_JESS2 0x0f30
#define USB_DEVICE_ID_JESS2_COLOR_RUMBLE_PAD 0x0111
+#define USB_VENDOR_ID_JIELI_TECHNOLOGY 0x2d99
+#define USB_DEVICE_ID_EDIFIER_QR30 0xa101 /* EDIFIER Hal0 2.0 SE */
+
#define USB_VENDOR_ID_KBGEAR 0x084e
#define USB_DEVICE_ID_KBGEAR_JAMSTUDIO 0x1001
diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
index bcd4bccf1a7c..d104f4829d93 100644
--- a/drivers/hid/hid-quirks.c
+++ b/drivers/hid/hid-quirks.c
@@ -110,6 +110,7 @@ static const struct hid_device_id hid_quirks[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_1f4a), HID_QUIRK_ALWAYS_POLL },
{ HID_USB_DEVICE(USB_VENDOR_ID_IDEACOM, USB_DEVICE_ID_IDEACOM_IDC6680), HID_QUIRK_MULTI_INPUT },
{ HID_USB_DEVICE(USB_VENDOR_ID_INNOMEDIA, USB_DEVICE_ID_INNEX_GENESIS_ATARI), HID_QUIRK_MULTI_INPUT },
+ { HID_USB_DEVICE(USB_VENDOR_ID_JIELI_TECHNOLOGY, USB_DEVICE_ID_EDIFIER_QR30), 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.51.2
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox