Takashi Iwai 395498
From 29f316a1d7e0a570be9a47fa283ece53a67cebb7 Mon Sep 17 00:00:00 2001
Takashi Iwai 395498
From: Takahiro Fujii <fujii@xaxxi.net>
Takashi Iwai 395498
Date: Fri, 20 Jan 2023 03:30:02 +0900
Takashi Iwai 395498
Subject: [PATCH] HID: elecom: add support for TrackBall 056E:011C
Takashi Iwai 395498
Git-commit: 29f316a1d7e0a570be9a47fa283ece53a67cebb7
Takashi Iwai 395498
Patch-mainline: v6.2-rc8
Takashi Iwai 395498
References: git-fixes
Takashi Iwai 395498
Takashi Iwai 395498
Make function buttons on ELECOM M-HT1DRBK trackball mouse work. This model
Takashi Iwai 395498
has two devices with different device IDs (010D and 011C). Both of
Takashi Iwai 395498
them misreports the number of buttons as 5 in the report descriptor, even
Takashi Iwai 395498
though they have 8 buttons. hid-elecom overwrites the report to fix them,
Takashi Iwai 395498
but supports only on 010D and does not work on 011C. This patch fixes
Takashi Iwai 395498
011C in the similar way but with specialized position parameters.
Takashi Iwai 395498
In fact, it is sufficient to rewrite only 17th byte (05 -> 08). However I
Takashi Iwai 395498
followed the existing way.
Takashi Iwai 395498
Takashi Iwai 395498
Signed-off-by: Takahiro Fujii <fujii@xaxxi.net>
Takashi Iwai 395498
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Takashi Iwai 395498
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 395498
Takashi Iwai 395498
---
Takashi Iwai 395498
 drivers/hid/hid-elecom.c | 16 ++++++++++++++--
Takashi Iwai 395498
 drivers/hid/hid-ids.h    |  3 ++-
Takashi Iwai 395498
 drivers/hid/hid-quirks.c |  3 ++-
Takashi Iwai 395498
 3 files changed, 18 insertions(+), 4 deletions(-)
Takashi Iwai 395498
Takashi Iwai 395498
diff --git a/drivers/hid/hid-elecom.c b/drivers/hid/hid-elecom.c
Takashi Iwai 395498
index e59e9911fc37..4fa45ee77503 100644
Takashi Iwai 395498
--- a/drivers/hid/hid-elecom.c
Takashi Iwai 395498
+++ b/drivers/hid/hid-elecom.c
Takashi Iwai 395498
@@ -12,6 +12,7 @@
Takashi Iwai 395498
  *  Copyright (c) 2017 Alex Manoussakis <amanou@gnu.org>
Takashi Iwai 395498
  *  Copyright (c) 2017 Tomasz Kramkowski <tk@the-tk.com>
Takashi Iwai 395498
  *  Copyright (c) 2020 YOSHIOKA Takuma <lo48576@hard-wi.red>
Takashi Iwai 395498
+ *  Copyright (c) 2022 Takahiro Fujii <fujii@xaxxi.net>
Takashi Iwai 395498
  */
Takashi Iwai 395498
 
Takashi Iwai 395498
 /*
Takashi Iwai 395498
@@ -89,7 +90,7 @@ static __u8 *elecom_report_fixup(struct hid_device *hdev, __u8 *rdesc,
Takashi Iwai 395498
 	case USB_DEVICE_ID_ELECOM_M_DT1URBK:
Takashi Iwai 395498
 	case USB_DEVICE_ID_ELECOM_M_DT1DRBK:
Takashi Iwai 395498
 	case USB_DEVICE_ID_ELECOM_M_HT1URBK:
Takashi Iwai 395498
-	case USB_DEVICE_ID_ELECOM_M_HT1DRBK:
Takashi Iwai 395498
+	case USB_DEVICE_ID_ELECOM_M_HT1DRBK_010D:
Takashi Iwai 395498
 		/*
Takashi Iwai 395498
 		 * Report descriptor format:
Takashi Iwai 395498
 		 * 12: button bit count
Takashi Iwai 395498
@@ -99,6 +100,16 @@ static __u8 *elecom_report_fixup(struct hid_device *hdev, __u8 *rdesc,
Takashi Iwai 395498
 		 */
Takashi Iwai 395498
 		mouse_button_fixup(hdev, rdesc, *rsize, 12, 30, 14, 20, 8);
Takashi Iwai 395498
 		break;
Takashi Iwai 395498
+	case USB_DEVICE_ID_ELECOM_M_HT1DRBK_011C:
Takashi Iwai 395498
+		/*
Takashi Iwai 395498
+		 * Report descriptor format:
Takashi Iwai 395498
+		 * 22: button bit count
Takashi Iwai 395498
+		 * 30: padding bit count
Takashi Iwai 395498
+		 * 24: button report size
Takashi Iwai 395498
+		 * 16: button usage maximum
Takashi Iwai 395498
+		 */
Takashi Iwai 395498
+		mouse_button_fixup(hdev, rdesc, *rsize, 22, 30, 24, 16, 8);
Takashi Iwai 395498
+		break;
Takashi Iwai 395498
 	}
Takashi Iwai 395498
 	return rdesc;
Takashi Iwai 395498
 }
Takashi Iwai 395498
@@ -112,7 +123,8 @@ static const struct hid_device_id elecom_devices[] = {
Takashi Iwai 395498
 	{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1URBK) },
Takashi Iwai 395498
 	{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1DRBK) },
Takashi Iwai 395498
 	{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1URBK) },
Takashi Iwai 395498
-	{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1DRBK) },
Takashi Iwai 395498
+	{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1DRBK_010D) },
Takashi Iwai 395498
+	{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1DRBK_011C) },
Takashi Iwai 395498
 	{ }
Takashi Iwai 395498
 };
Takashi Iwai 395498
 MODULE_DEVICE_TABLE(hid, elecom_devices);
Takashi Iwai 395498
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
Takashi Iwai 395498
index 0f8c11842a3a..d01d798ebedc 100644
Takashi Iwai 395498
--- a/drivers/hid/hid-ids.h
Takashi Iwai 395498
+++ b/drivers/hid/hid-ids.h
Takashi Iwai 395498
@@ -428,7 +428,8 @@
Takashi Iwai 395498
 #define USB_DEVICE_ID_ELECOM_M_DT1URBK	0x00fe
Takashi Iwai 395498
 #define USB_DEVICE_ID_ELECOM_M_DT1DRBK	0x00ff
Takashi Iwai 395498
 #define USB_DEVICE_ID_ELECOM_M_HT1URBK	0x010c
Takashi Iwai 395498
-#define USB_DEVICE_ID_ELECOM_M_HT1DRBK	0x010d
Takashi Iwai 395498
+#define USB_DEVICE_ID_ELECOM_M_HT1DRBK_010D	0x010d
Takashi Iwai 395498
+#define USB_DEVICE_ID_ELECOM_M_HT1DRBK_011C	0x011c
Takashi Iwai 395498
 
Takashi Iwai 395498
 #define USB_VENDOR_ID_DREAM_CHEEKY	0x1d34
Takashi Iwai 395498
 #define USB_DEVICE_ID_DREAM_CHEEKY_WN	0x0004
Takashi Iwai 395498
diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
Takashi Iwai 395498
index be3ad02573de..5bc91f68b374 100644
Takashi Iwai 395498
--- a/drivers/hid/hid-quirks.c
Takashi Iwai 395498
+++ b/drivers/hid/hid-quirks.c
Takashi Iwai 395498
@@ -393,7 +393,8 @@ static const struct hid_device_id hid_have_special_driver[] = {
Takashi Iwai 395498
 	{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1URBK) },
Takashi Iwai 395498
 	{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1DRBK) },
Takashi Iwai 395498
 	{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1URBK) },
Takashi Iwai 395498
-	{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1DRBK) },
Takashi Iwai 395498
+	{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1DRBK_010D) },
Takashi Iwai 395498
+	{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1DRBK_011C) },
Takashi Iwai 395498
 #endif
Takashi Iwai 395498
 #if IS_ENABLED(CONFIG_HID_ELO)
Takashi Iwai 395498
 	{ HID_USB_DEVICE(USB_VENDOR_ID_ELO, 0x0009) },
Takashi Iwai 395498
-- 
Takashi Iwai 395498
2.35.3
Takashi Iwai 395498