diff mbox series

HID: add cmedia-fixup driver

Message ID 20210704104906.78490-1-linux@weissschuh.net
State New
Headers show
Series HID: add cmedia-fixup driver | expand

Commit Message

Thomas Weißschuh July 4, 2021, 10:49 a.m. UTC
This driver provides HID fixups for CMedia audio chips.
For now this enables the recognition of the microphone mute button for the
HS-100B.

Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
---
 drivers/hid/Kconfig            |  6 +++
 drivers/hid/Makefile           |  1 +
 drivers/hid/hid-cmedia-fixup.c | 82 ++++++++++++++++++++++++++++++++++
 drivers/hid/hid-ids.h          |  1 +
 drivers/hid/hid-quirks.c       |  3 ++
 5 files changed, 93 insertions(+)
 create mode 100644 drivers/hid/hid-cmedia-fixup.c


base-commit: df04fbe8680bfe07f3d7487eccff9f768bb02533

Comments

Jiri Kosina July 15, 2021, 7 p.m. UTC | #1
On Sun, 4 Jul 2021, Thomas Weißschuh wrote:

> This driver provides HID fixups for CMedia audio chips.

> For now this enables the recognition of the microphone mute button for the

> HS-100B.

> 

> Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>

> ---

>  drivers/hid/Kconfig            |  6 +++

>  drivers/hid/Makefile           |  1 +

>  drivers/hid/hid-cmedia-fixup.c | 82 ++++++++++++++++++++++++++++++++++

>  drivers/hid/hid-ids.h          |  1 +

>  drivers/hid/hid-quirks.c       |  3 ++

>  5 files changed, 93 insertions(+)

>  create mode 100644 drivers/hid/hid-cmedia-fixup.c


Can you please drop the '-fixup' from the driver name? We have quite a 
couple of drivers that do report descriptor modifications, but we're not 
using this '-fixup' naming scheme for them either.

Thanks,

-- 
Jiri Kosina
SUSE Labs
Thomas Weißschuh July 15, 2021, 7:08 p.m. UTC | #2
On Do, 2021-07-15T21:00+0200, Jiri Kosina wrote:
> On Sun, 4 Jul 2021, Thomas Weißschuh wrote:

> 

> > This driver provides HID fixups for CMedia audio chips.

> > For now this enables the recognition of the microphone mute button for the

> > HS-100B.

> > 

> > Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>

> > ---

> >  drivers/hid/Kconfig            |  6 +++

> >  drivers/hid/Makefile           |  1 +

> >  drivers/hid/hid-cmedia-fixup.c | 82 ++++++++++++++++++++++++++++++++++

> >  drivers/hid/hid-ids.h          |  1 +

> >  drivers/hid/hid-quirks.c       |  3 ++

> >  5 files changed, 93 insertions(+)

> >  create mode 100644 drivers/hid/hid-cmedia-fixup.c

> 

> Can you please drop the '-fixup' from the driver name? We have quite a 

> couple of drivers that do report descriptor modifications, but we're not 

> using this '-fixup' naming scheme for them either.


There is already an existing driver "hid-cmedia":
"HID driver for CMedia CM6533 audio jack controls".

This driver works in a completely different way from mine, so I thought to keep
them separate.
The idea was for the new driver to be a collection of simple, similar report fixups.

Should they be combined?

Thomas
Jiri Kosina July 15, 2021, 7:14 p.m. UTC | #3
On Thu, 15 Jul 2021, Thomas Weißschuh wrote:

> > > This driver provides HID fixups for CMedia audio chips.

> > > For now this enables the recognition of the microphone mute button for the

> > > HS-100B.

> > > 

> > > Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>

> > > ---

> > >  drivers/hid/Kconfig            |  6 +++

> > >  drivers/hid/Makefile           |  1 +

> > >  drivers/hid/hid-cmedia-fixup.c | 82 ++++++++++++++++++++++++++++++++++

> > >  drivers/hid/hid-ids.h          |  1 +

> > >  drivers/hid/hid-quirks.c       |  3 ++

> > >  5 files changed, 93 insertions(+)

> > >  create mode 100644 drivers/hid/hid-cmedia-fixup.c

> > 

> > Can you please drop the '-fixup' from the driver name? We have quite a 

> > couple of drivers that do report descriptor modifications, but we're not 

> > using this '-fixup' naming scheme for them either.

> 

> There is already an existing driver "hid-cmedia":

> "HID driver for CMedia CM6533 audio jack controls".

> 

> This driver works in a completely different way from mine, so I thought 

> to keep them separate. The idea was for the new driver to be a 

> collection of simple, similar report fixups.

> 

> Should they be combined?


If it's the same vendor, then yes. We generally (with exceptions, of 
course :) ) group the HID drivers by vendor, even if completely different 
quirks are needed for different devices from the same vendor.

Thanks,

-- 
Jiri Kosina
SUSE Labs
Thomas Weißschuh July 15, 2021, 7:45 p.m. UTC | #4
On Do, 2021-07-15T21:14+0200, Jiri Kosina wrote:
> On Thu, 15 Jul 2021, Thomas Weißschuh wrote:

> 

> > > > This driver provides HID fixups for CMedia audio chips.

> > > > For now this enables the recognition of the microphone mute button for the

> > > > HS-100B.

> > > > 

> > > > Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>

> > > > ---

> > > >  drivers/hid/Kconfig            |  6 +++

> > > >  drivers/hid/Makefile           |  1 +

> > > >  drivers/hid/hid-cmedia-fixup.c | 82 ++++++++++++++++++++++++++++++++++

> > > >  drivers/hid/hid-ids.h          |  1 +

> > > >  drivers/hid/hid-quirks.c       |  3 ++

> > > >  5 files changed, 93 insertions(+)

> > > >  create mode 100644 drivers/hid/hid-cmedia-fixup.c

> > > 

> > > Can you please drop the '-fixup' from the driver name? We have quite a 

> > > couple of drivers that do report descriptor modifications, but we're not 

> > > using this '-fixup' naming scheme for them either.

> > 

> > There is already an existing driver "hid-cmedia":

> > "HID driver for CMedia CM6533 audio jack controls".

> > 

> > This driver works in a completely different way from mine, so I thought 

> > to keep them separate. The idea was for the new driver to be a 

> > collection of simple, similar report fixups.

> > 

> > Should they be combined?

> 

> If it's the same vendor, then yes. We generally (with exceptions, of 

> course :) ) group the HID drivers by vendor, even if completely different 

> quirks are needed for different devices from the same vendor.


Will do.

Should I merge it into the existing `struct hid_driver` and do id checks in
every member function or declare a dedicated `struct hid_driver`?

Thanks!
Benjamin Tissoires July 20, 2021, 8:11 a.m. UTC | #5
On Thu, Jul 15, 2021 at 9:45 PM Thomas Weißschuh <linux@weissschuh.net> wrote:
>

> On Do, 2021-07-15T21:14+0200, Jiri Kosina wrote:

> > On Thu, 15 Jul 2021, Thomas Weißschuh wrote:

> >

> > > > > This driver provides HID fixups for CMedia audio chips.

> > > > > For now this enables the recognition of the microphone mute button for the

> > > > > HS-100B.

> > > > >

> > > > > Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>

> > > > > ---

> > > > >  drivers/hid/Kconfig            |  6 +++

> > > > >  drivers/hid/Makefile           |  1 +

> > > > >  drivers/hid/hid-cmedia-fixup.c | 82 ++++++++++++++++++++++++++++++++++

> > > > >  drivers/hid/hid-ids.h          |  1 +

> > > > >  drivers/hid/hid-quirks.c       |  3 ++

> > > > >  5 files changed, 93 insertions(+)

> > > > >  create mode 100644 drivers/hid/hid-cmedia-fixup.c

> > > >

> > > > Can you please drop the '-fixup' from the driver name? We have quite a

> > > > couple of drivers that do report descriptor modifications, but we're not

> > > > using this '-fixup' naming scheme for them either.

> > >

> > > There is already an existing driver "hid-cmedia":

> > > "HID driver for CMedia CM6533 audio jack controls".

> > >

> > > This driver works in a completely different way from mine, so I thought

> > > to keep them separate. The idea was for the new driver to be a

> > > collection of simple, similar report fixups.

> > >

> > > Should they be combined?

> >

> > If it's the same vendor, then yes. We generally (with exceptions, of

> > course :) ) group the HID drivers by vendor, even if completely different

> > quirks are needed for different devices from the same vendor.

>

> Will do.

>

> Should I merge it into the existing `struct hid_driver` and do id checks in

> every member function or declare a dedicated `struct hid_driver`?


Adding checks for every function is less than ideal because that would
add useless calls for every raw event.
But adding a new `struct hid_driver` is tempting given how different
the 2 drivers are. However, you would have to write a new
module_init/exit for it to register 2 drivers.

Worse case, if you can not create 2 drivers in one module, you could
always not set `.raw_event` in the main `struct hid_driver`, and
assign it in the `.probe` once you know which device you are facing.
In both cases, this is not something we already have in the HID
subsystem, but we need a first, right?

I also have a small nitpick on the patch itself, will comment in the
original submission email.

Cheers,
Benjamin

>

> Thanks!

>
Benjamin Tissoires July 20, 2021, 8:12 a.m. UTC | #6
On Sun, Jul 4, 2021 at 12:49 PM Thomas Weißschuh <linux@weissschuh.net> wrote:
>

> This driver provides HID fixups for CMedia audio chips.

> For now this enables the recognition of the microphone mute button for the

> HS-100B.

>

> Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>

> ---

>  drivers/hid/Kconfig            |  6 +++

>  drivers/hid/Makefile           |  1 +

>  drivers/hid/hid-cmedia-fixup.c | 82 ++++++++++++++++++++++++++++++++++

>  drivers/hid/hid-ids.h          |  1 +

>  drivers/hid/hid-quirks.c       |  3 ++

>  5 files changed, 93 insertions(+)

>  create mode 100644 drivers/hid/hid-cmedia-fixup.c

>

> diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig

> index 160554903ef9..5e139c93f75a 100644

> --- a/drivers/hid/Kconfig

> +++ b/drivers/hid/Kconfig

> @@ -264,6 +264,12 @@ config HID_CMEDIA

>         help

>         Support for CMedia CM6533 HID audio jack controls.

>

> +config HID_CMEDIA_FIXUP

> +       tristate "CMedia hid fixup"

> +       depends on HID

> +       help

> +       Fixups for CMedia based audio chips.

> +

>  config HID_CP2112

>         tristate "Silicon Labs CP2112 HID USB-to-SMBus Bridge support"

>         depends on USB_HID && HIDRAW && I2C && GPIOLIB

> diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile

> index 1ea1a7c0b20f..66d6b06ce4d2 100644

> --- a/drivers/hid/Makefile

> +++ b/drivers/hid/Makefile

> @@ -36,6 +36,7 @@ obj-$(CONFIG_HID_BIGBEN_FF)   += hid-bigbenff.o

>  obj-$(CONFIG_HID_CHERRY)       += hid-cherry.o

>  obj-$(CONFIG_HID_CHICONY)      += hid-chicony.o

>  obj-$(CONFIG_HID_CMEDIA)       += hid-cmedia.o

> +obj-$(CONFIG_HID_CMEDIA_FIXUP) += hid-cmedia-fixup.o

>  obj-$(CONFIG_HID_CORSAIR)      += hid-corsair.o

>  obj-$(CONFIG_HID_COUGAR)       += hid-cougar.o

>  obj-$(CONFIG_HID_CP2112)       += hid-cp2112.o

> diff --git a/drivers/hid/hid-cmedia-fixup.c b/drivers/hid/hid-cmedia-fixup.c

> new file mode 100644

> index 000000000000..c9a984ea6f0a

> --- /dev/null

> +++ b/drivers/hid/hid-cmedia-fixup.c

> @@ -0,0 +1,82 @@

> +// SPDX-License-Identifier: GPL-2.0-only

> +/*

> + * HID driver containing fixups for CMedia audio chips.

> + *

> + * Copyright (C) 2021 Thomas Weißschuh <thomas@weissschuh.net>

> + */

> +

> +#include <linux/device.h>

> +#include <linux/hid.h>

> +#include <linux/module.h>

> +#include "hid-ids.h"

> +

> +#define HS100B_RDESC_ORIG_SIZE 60

> +

> +/* Fixed report descriptor of HS-100B audio chip

> + * Bit 4 is an abolute Microphone mute usage instead of being unassigned.

> + */

> +static __u8 hs100b_rdesc_fixed[] = {

> +       0x05, 0x0C,         /*  Usage Page (Consumer),          */

> +       0x09, 0x01,         /*  Usage (Consumer Control),       */

> +       0xA1, 0x01,         /*  Collection (Application),       */

> +       0x15, 0x00,         /*      Logical Minimum (0),        */

> +       0x25, 0x01,         /*      Logical Maximum (1),        */

> +       0x09, 0xE9,         /*      Usage (Volume Inc),         */

> +       0x09, 0xEA,         /*      Usage (Volume Dec),         */

> +       0x75, 0x01,         /*      Report Size (1),            */

> +       0x95, 0x02,         /*      Report Count (2),           */

> +       0x81, 0x02,         /*      Input (Variable),           */

> +       0x09, 0xE2,         /*      Usage (Mute),               */

> +       0x95, 0x01,         /*      Report Count (1),           */

> +       0x81, 0x06,         /*      Input (Variable, Relative), */

> +       0x05, 0x0B,         /*      Usage Page (Telephony),     */

> +       0x09, 0x2F,         /*      Usage (2Fh),                */

> +       0x81, 0x02,         /*      Input (Variable),           */

> +       0x09, 0x20,         /*      Usage (20h),                */

> +       0x81, 0x06,         /*      Input (Variable, Relative), */

> +       0x05, 0x0C,         /*      Usage Page (Consumer),      */

> +       0x09, 0x00,         /*      Usage (00h),                */

> +       0x95, 0x03,         /*      Report Count (3),           */

> +       0x81, 0x02,         /*      Input (Variable),           */

> +       0x26, 0xFF, 0x00,   /*      Logical Maximum (255),      */

> +       0x09, 0x00,         /*      Usage (00h),                */

> +       0x75, 0x08,         /*      Report Size (8),            */

> +       0x95, 0x03,         /*      Report Count (3),           */

> +       0x81, 0x02,         /*      Input (Variable),           */

> +       0x09, 0x00,         /*      Usage (00h),                */

> +       0x95, 0x04,         /*      Report Count (4),           */

> +       0x91, 0x02,         /*      Output (Variable),          */

> +       0xC0                /*  End Collection                  */

> +};

> +

> +static __u8 *cmhid_fixup_report_fixup(struct hid_device *hdev, __u8 *rdesc,

> +                                     unsigned int *rsize)

> +{

> +       switch (hdev->product) {

> +       case USB_DEVICE_ID_CMEDIA_HS100B:

> +               if (*rsize == HS100B_RDESC_ORIG_SIZE) {

> +                       hid_info(hdev, "Fixing CMedia HS-100B report descriptor\n");

> +                       rdesc = hs100b_rdesc_fixed;

> +                       *rsize = sizeof(hs100b_rdesc_fixed);

> +               }

> +               break;

> +       }

> +       return rdesc;

> +}

> +

> +static const struct hid_device_id cmhid_fixup_devices[] = {

> +       { HID_USB_DEVICE(USB_VENDOR_ID_CMEDIA, USB_DEVICE_ID_CMEDIA_HS100B) },

> +       { }

> +};

> +

> +static struct hid_driver cmhid_fixup_driver = {

> +       .name = "cmedia_fixups",

> +       .id_table = cmhid_fixup_devices,

> +       .report_fixup = cmhid_fixup_report_fixup,

> +};

> +module_hid_driver(cmhid_fixup_driver);

> +

> +MODULE_DEVICE_TABLE(hid, cmhid_fixup_devices);

> +MODULE_AUTHOR("Thomas Weißschuh <thomas@weissschuh.net>");

> +MODULE_DESCRIPTION("CMedia HID fixup");

> +MODULE_LICENSE("GPL");

> diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h

> index 8f1893e68112..6864e4e6ac8b 100644

> --- a/drivers/hid/hid-ids.h

> +++ b/drivers/hid/hid-ids.h

> @@ -292,6 +292,7 @@

>

>  #define USB_VENDOR_ID_CMEDIA           0x0d8c

>  #define USB_DEVICE_ID_CM109            0x000e

> +#define USB_DEVICE_ID_CMEDIA_HS100B    0x0014

>  #define USB_DEVICE_ID_CM6533           0x0022

>

>  #define USB_VENDOR_ID_CODEMERCS                0x07c0

> diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c

> index 51b39bda9a9d..7776aa13ee27 100644

> --- a/drivers/hid/hid-quirks.c

> +++ b/drivers/hid/hid-quirks.c

> @@ -346,6 +346,9 @@ static const struct hid_device_id hid_have_special_driver[] = {

>  #if IS_ENABLED(CONFIG_HID_CMEDIA)

>         { HID_USB_DEVICE(USB_VENDOR_ID_CMEDIA, USB_DEVICE_ID_CM6533) },

>  #endif

> +#if IS_ENABLED(CONFIG_HID_CMEDIA_FIXUP)

> +       { HID_USB_DEVICE(USB_VENDOR_ID_CMEDIA, USB_DEVICE_ID_CMEDIA_HS100B) },

> +#endif


FWIW, this hunk should be dropped entirely if the driver works without it.

Cheers,
Benjamin

>  #if IS_ENABLED(CONFIG_HID_CORSAIR)

>         { HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K90) },

>         { HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_GLAIVE_RGB) },

>

> base-commit: df04fbe8680bfe07f3d7487eccff9f768bb02533

> --

> 2.32.0

>
diff mbox series

Patch

diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
index 160554903ef9..5e139c93f75a 100644
--- a/drivers/hid/Kconfig
+++ b/drivers/hid/Kconfig
@@ -264,6 +264,12 @@  config HID_CMEDIA
 	help
 	Support for CMedia CM6533 HID audio jack controls.
 
+config HID_CMEDIA_FIXUP
+	tristate "CMedia hid fixup"
+	depends on HID
+	help
+	Fixups for CMedia based audio chips.
+
 config HID_CP2112
 	tristate "Silicon Labs CP2112 HID USB-to-SMBus Bridge support"
 	depends on USB_HID && HIDRAW && I2C && GPIOLIB
diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
index 1ea1a7c0b20f..66d6b06ce4d2 100644
--- a/drivers/hid/Makefile
+++ b/drivers/hid/Makefile
@@ -36,6 +36,7 @@  obj-$(CONFIG_HID_BIGBEN_FF)	+= hid-bigbenff.o
 obj-$(CONFIG_HID_CHERRY)	+= hid-cherry.o
 obj-$(CONFIG_HID_CHICONY)	+= hid-chicony.o
 obj-$(CONFIG_HID_CMEDIA)	+= hid-cmedia.o
+obj-$(CONFIG_HID_CMEDIA_FIXUP)	+= hid-cmedia-fixup.o
 obj-$(CONFIG_HID_CORSAIR)	+= hid-corsair.o
 obj-$(CONFIG_HID_COUGAR)	+= hid-cougar.o
 obj-$(CONFIG_HID_CP2112)	+= hid-cp2112.o
diff --git a/drivers/hid/hid-cmedia-fixup.c b/drivers/hid/hid-cmedia-fixup.c
new file mode 100644
index 000000000000..c9a984ea6f0a
--- /dev/null
+++ b/drivers/hid/hid-cmedia-fixup.c
@@ -0,0 +1,82 @@ 
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * HID driver containing fixups for CMedia audio chips.
+ *
+ * Copyright (C) 2021 Thomas Weißschuh <thomas@weissschuh.net>
+ */
+
+#include <linux/device.h>
+#include <linux/hid.h>
+#include <linux/module.h>
+#include "hid-ids.h"
+
+#define HS100B_RDESC_ORIG_SIZE 60
+
+/* Fixed report descriptor of HS-100B audio chip
+ * Bit 4 is an abolute Microphone mute usage instead of being unassigned.
+ */
+static __u8 hs100b_rdesc_fixed[] = {
+	0x05, 0x0C,         /*  Usage Page (Consumer),          */
+	0x09, 0x01,         /*  Usage (Consumer Control),       */
+	0xA1, 0x01,         /*  Collection (Application),       */
+	0x15, 0x00,         /*      Logical Minimum (0),        */
+	0x25, 0x01,         /*      Logical Maximum (1),        */
+	0x09, 0xE9,         /*      Usage (Volume Inc),         */
+	0x09, 0xEA,         /*      Usage (Volume Dec),         */
+	0x75, 0x01,         /*      Report Size (1),            */
+	0x95, 0x02,         /*      Report Count (2),           */
+	0x81, 0x02,         /*      Input (Variable),           */
+	0x09, 0xE2,         /*      Usage (Mute),               */
+	0x95, 0x01,         /*      Report Count (1),           */
+	0x81, 0x06,         /*      Input (Variable, Relative), */
+	0x05, 0x0B,         /*      Usage Page (Telephony),     */
+	0x09, 0x2F,         /*      Usage (2Fh),                */
+	0x81, 0x02,         /*      Input (Variable),           */
+	0x09, 0x20,         /*      Usage (20h),                */
+	0x81, 0x06,         /*      Input (Variable, Relative), */
+	0x05, 0x0C,         /*      Usage Page (Consumer),      */
+	0x09, 0x00,         /*      Usage (00h),                */
+	0x95, 0x03,         /*      Report Count (3),           */
+	0x81, 0x02,         /*      Input (Variable),           */
+	0x26, 0xFF, 0x00,   /*      Logical Maximum (255),      */
+	0x09, 0x00,         /*      Usage (00h),                */
+	0x75, 0x08,         /*      Report Size (8),            */
+	0x95, 0x03,         /*      Report Count (3),           */
+	0x81, 0x02,         /*      Input (Variable),           */
+	0x09, 0x00,         /*      Usage (00h),                */
+	0x95, 0x04,         /*      Report Count (4),           */
+	0x91, 0x02,         /*      Output (Variable),          */
+	0xC0                /*  End Collection                  */
+};
+
+static __u8 *cmhid_fixup_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+				      unsigned int *rsize)
+{
+	switch (hdev->product) {
+	case USB_DEVICE_ID_CMEDIA_HS100B:
+		if (*rsize == HS100B_RDESC_ORIG_SIZE) {
+			hid_info(hdev, "Fixing CMedia HS-100B report descriptor\n");
+			rdesc = hs100b_rdesc_fixed;
+			*rsize = sizeof(hs100b_rdesc_fixed);
+		}
+		break;
+	}
+	return rdesc;
+}
+
+static const struct hid_device_id cmhid_fixup_devices[] = {
+	{ HID_USB_DEVICE(USB_VENDOR_ID_CMEDIA, USB_DEVICE_ID_CMEDIA_HS100B) },
+	{ }
+};
+
+static struct hid_driver cmhid_fixup_driver = {
+	.name = "cmedia_fixups",
+	.id_table = cmhid_fixup_devices,
+	.report_fixup = cmhid_fixup_report_fixup,
+};
+module_hid_driver(cmhid_fixup_driver);
+
+MODULE_DEVICE_TABLE(hid, cmhid_fixup_devices);
+MODULE_AUTHOR("Thomas Weißschuh <thomas@weissschuh.net>");
+MODULE_DESCRIPTION("CMedia HID fixup");
+MODULE_LICENSE("GPL");
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 8f1893e68112..6864e4e6ac8b 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -292,6 +292,7 @@ 
 
 #define USB_VENDOR_ID_CMEDIA		0x0d8c
 #define USB_DEVICE_ID_CM109		0x000e
+#define USB_DEVICE_ID_CMEDIA_HS100B	0x0014
 #define USB_DEVICE_ID_CM6533		0x0022
 
 #define USB_VENDOR_ID_CODEMERCS		0x07c0
diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
index 51b39bda9a9d..7776aa13ee27 100644
--- a/drivers/hid/hid-quirks.c
+++ b/drivers/hid/hid-quirks.c
@@ -346,6 +346,9 @@  static const struct hid_device_id hid_have_special_driver[] = {
 #if IS_ENABLED(CONFIG_HID_CMEDIA)
 	{ HID_USB_DEVICE(USB_VENDOR_ID_CMEDIA, USB_DEVICE_ID_CM6533) },
 #endif
+#if IS_ENABLED(CONFIG_HID_CMEDIA_FIXUP)
+	{ HID_USB_DEVICE(USB_VENDOR_ID_CMEDIA, USB_DEVICE_ID_CMEDIA_HS100B) },
+#endif
 #if IS_ENABLED(CONFIG_HID_CORSAIR)
 	{ HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K90) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_GLAIVE_RGB) },