Skip to content

Commit 6e44365

Browse files
committed
Merge tag 'hid-for-linus-2024081901' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid
Pull HID fixes from Jiri Kosina: - memory corruption fixes for hid-cougar (Camila Alvarez) and hid-amd_sfh (Olivier Sobrie) - fix for regression in Wacom driver of twist gesture handling (Jason Gerecke) - two new device IDs for hid-multitouch (Dmitry Savin) and hid-asus (Luke D. Jones) * tag 'hid-for-linus-2024081901' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid: HID: wacom: Defer calculation of resolution until resolution_code is known HID: multitouch: Add support for GT7868Q HID: amd_sfh: free driver_data after destroying hid device hid-asus: add ROG Ally X prod ID to quirk list HID: cougar: fix slab-out-of-bounds Read in cougar_report_fixup
2 parents b0da640 + 1b8f9c1 commit 6e44365

File tree

6 files changed

+46
-3
lines changed

6 files changed

+46
-3
lines changed

drivers/hid/amd-sfh-hid/amd_sfh_hid.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,11 +171,13 @@ int amdtp_hid_probe(u32 cur_hid_dev, struct amdtp_cl_data *cli_data)
171171
void amdtp_hid_remove(struct amdtp_cl_data *cli_data)
172172
{
173173
int i;
174+
struct amdtp_hid_data *hid_data;
174175

175176
for (i = 0; i < cli_data->num_hid_devices; ++i) {
176177
if (cli_data->hid_sensor_hubs[i]) {
177-
kfree(cli_data->hid_sensor_hubs[i]->driver_data);
178+
hid_data = cli_data->hid_sensor_hubs[i]->driver_data;
178179
hid_destroy_device(cli_data->hid_sensor_hubs[i]);
180+
kfree(hid_data);
179181
cli_data->hid_sensor_hubs[i] = NULL;
180182
}
181183
}

drivers/hid/hid-asus.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1248,6 +1248,9 @@ static const struct hid_device_id asus_devices[] = {
12481248
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK,
12491249
USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY),
12501250
QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD },
1251+
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK,
1252+
USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY_X),
1253+
QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD },
12511254
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK,
12521255
USB_DEVICE_ID_ASUSTEK_ROG_CLAYMORE_II_KEYBOARD),
12531256
QUIRK_ROG_CLAYMORE_II_KEYBOARD },

drivers/hid/hid-cougar.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ static void cougar_fix_g6_mapping(void)
106106
static __u8 *cougar_report_fixup(struct hid_device *hdev, __u8 *rdesc,
107107
unsigned int *rsize)
108108
{
109-
if (rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
109+
if (*rsize >= 117 && rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
110110
(rdesc[115] | rdesc[116] << 8) >= HID_MAX_USAGES) {
111111
hid_info(hdev,
112112
"usage count exceeds max: fixing up report descriptor\n");

drivers/hid/hid-ids.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@
210210
#define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD3 0x1a30
211211
#define USB_DEVICE_ID_ASUSTEK_ROG_Z13_LIGHTBAR 0x18c6
212212
#define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY 0x1abe
213+
#define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY_X 0x1b4c
213214
#define USB_DEVICE_ID_ASUSTEK_ROG_CLAYMORE_II_KEYBOARD 0x196b
214215
#define USB_DEVICE_ID_ASUSTEK_FX503VD_KEYBOARD 0x1869
215216

@@ -520,6 +521,8 @@
520521
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_E100 0xe100
521522

522523
#define I2C_VENDOR_ID_GOODIX 0x27c6
524+
#define I2C_DEVICE_ID_GOODIX_01E8 0x01e8
525+
#define I2C_DEVICE_ID_GOODIX_01E9 0x01e9
523526
#define I2C_DEVICE_ID_GOODIX_01F0 0x01f0
524527

525528
#define USB_VENDOR_ID_GOODTOUCH 0x1aad

drivers/hid/hid-multitouch.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1441,6 +1441,30 @@ static int mt_event(struct hid_device *hid, struct hid_field *field,
14411441
return 0;
14421442
}
14431443

1444+
static __u8 *mt_report_fixup(struct hid_device *hdev, __u8 *rdesc,
1445+
unsigned int *size)
1446+
{
1447+
if (hdev->vendor == I2C_VENDOR_ID_GOODIX &&
1448+
(hdev->product == I2C_DEVICE_ID_GOODIX_01E8 ||
1449+
hdev->product == I2C_DEVICE_ID_GOODIX_01E9)) {
1450+
if (rdesc[607] == 0x15) {
1451+
rdesc[607] = 0x25;
1452+
dev_info(
1453+
&hdev->dev,
1454+
"GT7868Q report descriptor fixup is applied.\n");
1455+
} else {
1456+
dev_info(
1457+
&hdev->dev,
1458+
"The byte is not expected for fixing the report descriptor. \
1459+
It's possible that the touchpad firmware is not suitable for applying the fix. \
1460+
got: %x\n",
1461+
rdesc[607]);
1462+
}
1463+
}
1464+
1465+
return rdesc;
1466+
}
1467+
14441468
static void mt_report(struct hid_device *hid, struct hid_report *report)
14451469
{
14461470
struct mt_device *td = hid_get_drvdata(hid);
@@ -2035,6 +2059,14 @@ static const struct hid_device_id mt_devices[] = {
20352059
MT_BT_DEVICE(USB_VENDOR_ID_FRUCTEL,
20362060
USB_DEVICE_ID_GAMETEL_MT_MODE) },
20372061

2062+
/* Goodix GT7868Q devices */
2063+
{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
2064+
HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,
2065+
I2C_DEVICE_ID_GOODIX_01E8) },
2066+
{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
2067+
HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,
2068+
I2C_DEVICE_ID_GOODIX_01E8) },
2069+
20382070
/* GoodTouch panels */
20392071
{ .driver_data = MT_CLS_NSMU,
20402072
MT_USB_DEVICE(USB_VENDOR_ID_GOODTOUCH,
@@ -2270,6 +2302,7 @@ static struct hid_driver mt_driver = {
22702302
.feature_mapping = mt_feature_mapping,
22712303
.usage_table = mt_grabbed_usages,
22722304
.event = mt_event,
2305+
.report_fixup = mt_report_fixup,
22732306
.report = mt_report,
22742307
.suspend = pm_ptr(mt_suspend),
22752308
.reset_resume = pm_ptr(mt_reset_resume),

drivers/hid/wacom_wac.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1878,12 +1878,14 @@ static void wacom_map_usage(struct input_dev *input, struct hid_usage *usage,
18781878
int fmax = field->logical_maximum;
18791879
unsigned int equivalent_usage = wacom_equivalent_usage(usage->hid);
18801880
int resolution_code = code;
1881-
int resolution = hidinput_calc_abs_res(field, resolution_code);
1881+
int resolution;
18821882

18831883
if (equivalent_usage == HID_DG_TWIST) {
18841884
resolution_code = ABS_RZ;
18851885
}
18861886

1887+
resolution = hidinput_calc_abs_res(field, resolution_code);
1888+
18871889
if (equivalent_usage == HID_GD_X) {
18881890
fmin += features->offset_left;
18891891
fmax -= features->offset_right;

0 commit comments

Comments
 (0)