Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * HID driver for Holtek gaming mice
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * Copyright (c) 2013 Christian Ohm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * Heavily inspired by various other HID drivers that adjust the report
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * descriptor.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <linux/hid.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <linux/usb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include "hid-ids.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19)  * The report descriptor of some Holtek based gaming mice specifies an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20)  * excessively large number of consumer usages (2^15), which is more than
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21)  * HID_MAX_USAGES. This prevents proper parsing of the report descriptor.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23)  * This driver fixes the report descriptor for:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24)  * - USB ID 04d9:a067, sold as Sharkoon Drakonia and Perixx MX-2000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25)  * - USB ID 04d9:a04a, sold as Tracer Sniper TRM-503, NOVA Gaming Slider X200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26)  *   and Zalman ZM-GM1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27)  * - USB ID 04d9:a081, sold as SHARKOON DarkGlider Gaming mouse
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28)  * - USB ID 04d9:a072, sold as LEETGION Hellion Gaming Mouse
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29)  * - USB ID 04d9:a0c2, sold as ETEKCITY Scroll T-140 Gaming Mouse
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) static __u8 *holtek_mouse_report_fixup(struct hid_device *hdev, __u8 *rdesc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 		unsigned int *rsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 	struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	if (intf->cur_altsetting->desc.bInterfaceNumber == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 		/* Change usage maximum and logical maximum from 0x7fff to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 		 * 0x2fff, so they don't exceed HID_MAX_USAGES */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 		switch (hdev->product) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 		case USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A067:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 		case USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A072:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 		case USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A0C2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 			if (*rsize >= 122 && rdesc[115] == 0xff && rdesc[116] == 0x7f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 					&& rdesc[120] == 0xff && rdesc[121] == 0x7f) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 				hid_info(hdev, "Fixing up report descriptor\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 				rdesc[116] = rdesc[121] = 0x2f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 		case USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A04A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 		case USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A070:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 		case USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A081:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 			if (*rsize >= 113 && rdesc[106] == 0xff && rdesc[107] == 0x7f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 					&& rdesc[111] == 0xff && rdesc[112] == 0x7f) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 				hid_info(hdev, "Fixing up report descriptor\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 				rdesc[107] = rdesc[112] = 0x2f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	return rdesc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) static int holtek_mouse_probe(struct hid_device *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 			      const struct hid_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	if (!hid_is_usb(hdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	ret = hid_parse(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 		hid_err(hdev, "hid parse failed: %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 		hid_err(hdev, "hw start failed: %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) static const struct hid_device_id holtek_mouse_devices[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	{ HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 			USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A067) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91)         { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 			USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A070) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	{ HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 			USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A04A) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	{ HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 			USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A072) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	{ HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 			USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A081) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	{ HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 			USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A0C2) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	{ }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) MODULE_DEVICE_TABLE(hid, holtek_mouse_devices);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) static struct hid_driver holtek_mouse_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	.name = "holtek_mouse",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	.id_table = holtek_mouse_devices,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	.report_fixup = holtek_mouse_report_fixup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	.probe = holtek_mouse_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) module_hid_driver(holtek_mouse_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) MODULE_LICENSE("GPL");