Hi, On Thu, Mar 28, 2019 at 4:34 AM Alex Henrie <alexhenrie24@xxxxxxxxx> wrote: > > This enables the power and equals keys on the Macally ikey keyboard. > > Based on the Cougar gaming keyboard HID driver, which uses the same > vendor ID. > > Signed-off-by: Alex Henrie <alexhenrie24@xxxxxxxxx> > --- > drivers/hid/Kconfig | 10 +++++++++ > drivers/hid/Makefile | 1 + > drivers/hid/hid-ids.h | 1 + > drivers/hid/hid-macally.c | 47 +++++++++++++++++++++++++++++++++++++++ > 4 files changed, 59 insertions(+) > create mode 100644 drivers/hid/hid-macally.c > > diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig > index 6ca8d322b487..aef4a2a690e1 100644 > --- a/drivers/hid/Kconfig > +++ b/drivers/hid/Kconfig > @@ -230,6 +230,16 @@ config HID_COUGAR > Supported devices: > - Cougar 500k Gaming Keyboard > > +config HID_MACALLY > + tristate "Macally devices" > + depends on HID > + help > + Support for Macally devices that are not fully compliant with the > + HID standard. > + > + supported devices: > + - Macally ikey keyboard > + > config HID_PRODIKEYS > tristate "Prodikeys PC-MIDI Keyboard support" > depends on HID && SND > diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile > index 170163b41303..44b9caea46a7 100644 > --- a/drivers/hid/Makefile > +++ b/drivers/hid/Makefile > @@ -65,6 +65,7 @@ obj-$(CONFIG_HID_LENOVO) += hid-lenovo.o > obj-$(CONFIG_HID_LOGITECH) += hid-logitech.o > obj-$(CONFIG_HID_LOGITECH_DJ) += hid-logitech-dj.o > obj-$(CONFIG_HID_LOGITECH_HIDPP) += hid-logitech-hidpp.o > +obj-$(CONFIG_HID_MACALLY) += hid-macally.o > obj-$(CONFIG_HID_MAGICMOUSE) += hid-magicmouse.o > obj-$(CONFIG_HID_MALTRON) += hid-maltron.o > obj-$(CONFIG_HID_MAYFLASH) += hid-mf.o > diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h > index b6d93f4ad037..aacc7534b076 100644 > --- a/drivers/hid/hid-ids.h > +++ b/drivers/hid/hid-ids.h > @@ -1034,6 +1034,7 @@ > #define USB_DEVICE_ID_SINO_LITE_CONTROLLER 0x3008 > > #define USB_VENDOR_ID_SOLID_YEAR 0x060b > +#define USB_DEVICE_ID_MACALLY_IKEY_KEYBOARD 0x0001 > #define USB_DEVICE_ID_COUGAR_500K_GAMING_KEYBOARD 0x500a > #define USB_DEVICE_ID_COUGAR_700K_GAMING_KEYBOARD 0x700a > > diff --git a/drivers/hid/hid-macally.c b/drivers/hid/hid-macally.c > new file mode 100644 > index 000000000000..6f62f059b795 > --- /dev/null > +++ b/drivers/hid/hid-macally.c > @@ -0,0 +1,47 @@ > +// SPDX-License-Identifier: GPL-2.0+ > +/* > + * HID driver for Macally devices > + * > + * Copyright (c) 2019 Alex Henrie <alexhenrie24@xxxxxxxxx> > + */ > + > +#include <linux/hid.h> > +#include <linux/module.h> > + > +#include "hid-ids.h" > + > +MODULE_AUTHOR("Alex Henrie <alexhenrie24@xxxxxxxxx>"); > +MODULE_DESCRIPTION("Macally devices"); > +MODULE_LICENSE("GPL"); > + > +/* > + * The Macally ikey keyboard says that its logical and usage maximums are both > + * 101, but the power key is 102 and the equals key is 103 > + */ > +static __u8 *macally_report_fixup(struct hid_device *hdev, __u8 *rdesc, > + unsigned int *rsize) > +{ > + if (hdev->product == USB_DEVICE_ID_MACALLY_IKEY_KEYBOARD) { As mentioned in 2/2, I have one tiny nitpick here: the driver only concerns this particular keyboard and PID, so there is no point in having a PID check here. Cheers, Benjamin > + if (*rsize >= 60 && rdesc[53] == 0x65 && rdesc[59] == 0x65) { > + hid_info(hdev, > + "fixing up Macally ikey keyboard report descriptor\n"); > + rdesc[53] = rdesc[59] = 0x67; > + } > + } > + return rdesc; > +} > + > +static struct hid_device_id macally_id_table[] = { > + { HID_USB_DEVICE(USB_VENDOR_ID_SOLID_YEAR, > + USB_DEVICE_ID_MACALLY_IKEY_KEYBOARD) }, > + { } > +}; > +MODULE_DEVICE_TABLE(hid, macally_id_table); > + > +static struct hid_driver macally_driver = { > + .name = "macally", > + .id_table = macally_id_table, > + .report_fixup = macally_report_fixup, > +}; > + > +module_hid_driver(macally_driver); > -- > 2.21.0 >