Skip to content

Commit 0b02818

Browse files
committed
Merge tag 'for-linus-2023020901' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid
Pull HID fixes from Benjamin Tissoires: - fix potential infinite loop with a badly crafted HID device (Xin Zhao) - fix regression from 6.1 in USB logitech devices potentially making their mouse wheel not working (Bastien Nocera) - clean up in AMD sensors, which fixes a long time resume bug (Mario Limonciello) - few device small fixes and quirks * tag 'for-linus-2023020901' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid: HID: Ignore battery for ELAN touchscreen 29DF on HP HID: amd_sfh: if no sensors are enabled, clean up HID: logitech: Disable hi-res scrolling on USB HID: core: Fix deadloop in hid_apply_multiplier. HID: Ignore battery for Elan touchscreen on Asus TP420IA HID: elecom: add support for TrackBall 056E:011C
2 parents 94a1f56 + ebebf05 commit 0b02818

File tree

8 files changed

+41
-7
lines changed

8 files changed

+41
-7
lines changed

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
227227
cl_data->num_hid_devices = amd_mp2_get_sensor_num(privdata, &cl_data->sensor_idx[0]);
228228
if (cl_data->num_hid_devices == 0)
229229
return -ENODEV;
230+
cl_data->is_any_sensor_enabled = false;
230231

231232
INIT_DELAYED_WORK(&cl_data->work, amd_sfh_work);
232233
INIT_DELAYED_WORK(&cl_data->work_buffer, amd_sfh_work_buffer);
@@ -287,6 +288,7 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
287288
status = amd_sfh_wait_for_response
288289
(privdata, cl_data->sensor_idx[i], SENSOR_ENABLED);
289290
if (status == SENSOR_ENABLED) {
291+
cl_data->is_any_sensor_enabled = true;
290292
cl_data->sensor_sts[i] = SENSOR_ENABLED;
291293
rc = amdtp_hid_probe(cl_data->cur_hid_dev, cl_data);
292294
if (rc) {
@@ -301,19 +303,26 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
301303
cl_data->sensor_sts[i]);
302304
goto cleanup;
303305
}
306+
} else {
307+
cl_data->sensor_sts[i] = SENSOR_DISABLED;
308+
dev_dbg(dev, "sid 0x%x (%s) status 0x%x\n",
309+
cl_data->sensor_idx[i],
310+
get_sensor_name(cl_data->sensor_idx[i]),
311+
cl_data->sensor_sts[i]);
304312
}
305313
dev_dbg(dev, "sid 0x%x (%s) status 0x%x\n",
306314
cl_data->sensor_idx[i], get_sensor_name(cl_data->sensor_idx[i]),
307315
cl_data->sensor_sts[i]);
308316
}
309-
if (mp2_ops->discovery_status && mp2_ops->discovery_status(privdata) == 0) {
317+
if (!cl_data->is_any_sensor_enabled ||
318+
(mp2_ops->discovery_status && mp2_ops->discovery_status(privdata) == 0)) {
310319
amd_sfh_hid_client_deinit(privdata);
311320
for (i = 0; i < cl_data->num_hid_devices; i++) {
312321
devm_kfree(dev, cl_data->feature_report[i]);
313322
devm_kfree(dev, in_data->input_report[i]);
314323
devm_kfree(dev, cl_data->report_descr[i]);
315324
}
316-
dev_warn(dev, "Failed to discover, sensors not enabled\n");
325+
dev_warn(dev, "Failed to discover, sensors not enabled is %d\n", cl_data->is_any_sensor_enabled);
317326
return -EOPNOTSUPP;
318327
}
319328
schedule_delayed_work(&cl_data->work_buffer, msecs_to_jiffies(AMD_SFH_IDLE_LOOP));

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ struct amd_input_data {
3232
struct amdtp_cl_data {
3333
u8 init_done;
3434
u32 cur_hid_dev;
35+
bool is_any_sensor_enabled;
3536
u32 hid_dev_count;
3637
u32 num_hid_devices;
3738
struct device_info *hid_devices;

drivers/hid/hid-core.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,6 +1202,7 @@ int hid_open_report(struct hid_device *device)
12021202
__u8 *end;
12031203
__u8 *next;
12041204
int ret;
1205+
int i;
12051206
static int (*dispatch_type[])(struct hid_parser *parser,
12061207
struct hid_item *item) = {
12071208
hid_parser_main,
@@ -1252,6 +1253,8 @@ int hid_open_report(struct hid_device *device)
12521253
goto err;
12531254
}
12541255
device->collection_size = HID_DEFAULT_NUM_COLLECTIONS;
1256+
for (i = 0; i < HID_DEFAULT_NUM_COLLECTIONS; i++)
1257+
device->collection[i].parent_idx = -1;
12551258

12561259
ret = -EINVAL;
12571260
while ((next = fetch_item(start, end, &item)) != NULL) {

drivers/hid/hid-elecom.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
* Copyright (c) 2017 Alex Manoussakis <[email protected]>
1313
* Copyright (c) 2017 Tomasz Kramkowski <[email protected]>
1414
* Copyright (c) 2020 YOSHIOKA Takuma <[email protected]>
15+
* Copyright (c) 2022 Takahiro Fujii <[email protected]>
1516
*/
1617

1718
/*
@@ -89,7 +90,7 @@ static __u8 *elecom_report_fixup(struct hid_device *hdev, __u8 *rdesc,
8990
case USB_DEVICE_ID_ELECOM_M_DT1URBK:
9091
case USB_DEVICE_ID_ELECOM_M_DT1DRBK:
9192
case USB_DEVICE_ID_ELECOM_M_HT1URBK:
92-
case USB_DEVICE_ID_ELECOM_M_HT1DRBK:
93+
case USB_DEVICE_ID_ELECOM_M_HT1DRBK_010D:
9394
/*
9495
* Report descriptor format:
9596
* 12: button bit count
@@ -99,6 +100,16 @@ static __u8 *elecom_report_fixup(struct hid_device *hdev, __u8 *rdesc,
99100
*/
100101
mouse_button_fixup(hdev, rdesc, *rsize, 12, 30, 14, 20, 8);
101102
break;
103+
case USB_DEVICE_ID_ELECOM_M_HT1DRBK_011C:
104+
/*
105+
* Report descriptor format:
106+
* 22: button bit count
107+
* 30: padding bit count
108+
* 24: button report size
109+
* 16: button usage maximum
110+
*/
111+
mouse_button_fixup(hdev, rdesc, *rsize, 22, 30, 24, 16, 8);
112+
break;
102113
}
103114
return rdesc;
104115
}
@@ -112,7 +123,8 @@ static const struct hid_device_id elecom_devices[] = {
112123
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1URBK) },
113124
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1DRBK) },
114125
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1URBK) },
115-
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1DRBK) },
126+
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1DRBK_010D) },
127+
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1DRBK_011C) },
116128
{ }
117129
};
118130
MODULE_DEVICE_TABLE(hid, elecom_devices);

drivers/hid/hid-ids.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,8 @@
413413
#define I2C_DEVICE_ID_HP_ENVY_X360_15T_DR100 0x29CF
414414
#define I2C_DEVICE_ID_HP_ENVY_X360_EU0009NV 0x2CF9
415415
#define I2C_DEVICE_ID_HP_SPECTRE_X360_15 0x2817
416+
#define I2C_DEVICE_ID_HP_SPECTRE_X360_13_AW0020NG 0x29DF
417+
#define I2C_DEVICE_ID_ASUS_TP420IA_TOUCHSCREEN 0x2BC8
416418
#define USB_DEVICE_ID_ASUS_UX550VE_TOUCHSCREEN 0x2544
417419
#define USB_DEVICE_ID_ASUS_UX550_TOUCHSCREEN 0x2706
418420
#define I2C_DEVICE_ID_SURFACE_GO_TOUCHSCREEN 0x261A
@@ -428,7 +430,8 @@
428430
#define USB_DEVICE_ID_ELECOM_M_DT1URBK 0x00fe
429431
#define USB_DEVICE_ID_ELECOM_M_DT1DRBK 0x00ff
430432
#define USB_DEVICE_ID_ELECOM_M_HT1URBK 0x010c
431-
#define USB_DEVICE_ID_ELECOM_M_HT1DRBK 0x010d
433+
#define USB_DEVICE_ID_ELECOM_M_HT1DRBK_010D 0x010d
434+
#define USB_DEVICE_ID_ELECOM_M_HT1DRBK_011C 0x011c
432435

433436
#define USB_VENDOR_ID_DREAM_CHEEKY 0x1d34
434437
#define USB_DEVICE_ID_DREAM_CHEEKY_WN 0x0004

drivers/hid/hid-input.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,8 @@ static const struct hid_device_id hid_battery_quirks[] = {
370370
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH,
371371
USB_DEVICE_ID_LOGITECH_DINOVO_EDGE_KBD),
372372
HID_BATTERY_QUIRK_IGNORE },
373+
{ HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_ASUS_TP420IA_TOUCHSCREEN),
374+
HID_BATTERY_QUIRK_IGNORE },
373375
{ HID_USB_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ASUS_UX550_TOUCHSCREEN),
374376
HID_BATTERY_QUIRK_IGNORE },
375377
{ HID_USB_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ASUS_UX550VE_TOUCHSCREEN),
@@ -384,6 +386,8 @@ static const struct hid_device_id hid_battery_quirks[] = {
384386
HID_BATTERY_QUIRK_IGNORE },
385387
{ HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_HP_SPECTRE_X360_15),
386388
HID_BATTERY_QUIRK_IGNORE },
389+
{ HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_HP_SPECTRE_X360_13_AW0020NG),
390+
HID_BATTERY_QUIRK_IGNORE },
387391
{ HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_SURFACE_GO_TOUCHSCREEN),
388392
HID_BATTERY_QUIRK_IGNORE },
389393
{ HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_SURFACE_GO2_TOUCHSCREEN),

drivers/hid/hid-logitech-hidpp.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3978,7 +3978,8 @@ static void hidpp_connect_event(struct hidpp_device *hidpp)
39783978
}
39793979

39803980
hidpp_initialize_battery(hidpp);
3981-
hidpp_initialize_hires_scroll(hidpp);
3981+
if (!hid_is_usb(hidpp->hid_dev))
3982+
hidpp_initialize_hires_scroll(hidpp);
39823983

39833984
/* forward current battery state */
39843985
if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP10_BATTERY) {

drivers/hid/hid-quirks.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,8 @@ static const struct hid_device_id hid_have_special_driver[] = {
393393
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1URBK) },
394394
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1DRBK) },
395395
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1URBK) },
396-
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1DRBK) },
396+
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1DRBK_010D) },
397+
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_HT1DRBK_011C) },
397398
#endif
398399
#if IS_ENABLED(CONFIG_HID_ELO)
399400
{ HID_USB_DEVICE(USB_VENDOR_ID_ELO, 0x0009) },

0 commit comments

Comments
 (0)