Skip to content

Commit 0678f56

Browse files
committed
Merge tag 'hid-for-linus-2025111901' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid
Pull HID fixes from Jiri Kosina: - memory leak fixes in hid-uclogic, hid-ntrig and hid-playstation drivers (Abdun Nihaal, Masami Ichikawa) - regression fix for playback handling in hid-pidff (Tomasz Pakuła) - initialization fix for some amd_sfh platforms (Mario Limonciello) - a few assorted device-specific ID additions and quirks * tag 'hid-for-linus-2025111901' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid: HID: uclogic: Fix potential memory leak in error path HID: playstation: Fix memory leak in dualshock4_get_calibration_data() HID: pidff: Fix needs_playback check HID: corsair-void: Use %pe for printing PTR_ERR HID: elecom: Add support for ELECOM M-XT3URBK (018F) HID: hid-input: Extend Elan ignore battery quirk to USB HID: hid-ntrig: Prevent memory leak in ntrig_report_version() HID: amd_sfh: Stop sensor before starting HID: apple: Add SONiX AK870 PRO to non_apple_keyboards quirk list HID: lenovo: fixup Lenovo Yoga Slim 7x Keyboard rdesc HID: quirks: work around VID/PID conflict for 0x4c4a/0x4155
2 parents 2df79e4 + a78eb69 commit 0678f56

12 files changed

Lines changed: 57 additions & 20 deletions

File tree

drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_init.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,8 @@ static int amd_sfh1_1_hid_client_init(struct amd_mp2_dev *privdata)
194194
if (rc)
195195
goto cleanup;
196196

197+
mp2_ops->stop(privdata, cl_data->sensor_idx[i]);
198+
amd_sfh_wait_for_response(privdata, cl_data->sensor_idx[i], DISABLE_SENSOR);
197199
writel(0, privdata->mmio + amd_get_p2c_val(privdata, 0));
198200
mp2_ops->start(privdata, info);
199201
status = amd_sfh_wait_for_response

drivers/hid/hid-apple.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,7 @@ static const struct apple_key_translation swapped_fn_leftctrl_keys[] = {
355355

356356
static const struct apple_non_apple_keyboard non_apple_keyboards[] = {
357357
{ "SONiX USB DEVICE" },
358+
{ "SONiX AK870 PRO" },
358359
{ "Keychron" },
359360
{ "AONE" },
360361
{ "GANSS" },

drivers/hid/hid-corsair-void.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -553,9 +553,8 @@ static void corsair_void_add_battery(struct corsair_void_drvdata *drvdata)
553553

554554
if (IS_ERR(new_supply)) {
555555
hid_err(drvdata->hid_dev,
556-
"failed to register battery '%s' (reason: %ld)\n",
557-
drvdata->battery_desc.name,
558-
PTR_ERR(new_supply));
556+
"failed to register battery '%s' (reason: %pe)\n",
557+
drvdata->battery_desc.name, new_supply);
559558
return;
560559
}
561560

drivers/hid/hid-elecom.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ static const __u8 *elecom_report_fixup(struct hid_device *hdev, __u8 *rdesc,
7575
*/
7676
mouse_button_fixup(hdev, rdesc, *rsize, 20, 28, 22, 14, 8);
7777
break;
78-
case USB_DEVICE_ID_ELECOM_M_XT3URBK:
78+
case USB_DEVICE_ID_ELECOM_M_XT3URBK_00FB:
79+
case USB_DEVICE_ID_ELECOM_M_XT3URBK_018F:
7980
case USB_DEVICE_ID_ELECOM_M_XT3DRBK:
8081
case USB_DEVICE_ID_ELECOM_M_XT4DRBK:
8182
/*
@@ -119,7 +120,8 @@ static const __u8 *elecom_report_fixup(struct hid_device *hdev, __u8 *rdesc,
119120
static const struct hid_device_id elecom_devices[] = {
120121
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_BM084) },
121122
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XGL20DLBK) },
122-
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3URBK) },
123+
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3URBK_00FB) },
124+
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3URBK_018F) },
123125
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3DRBK) },
124126
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT4DRBK) },
125127
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1URBK) },

drivers/hid/hid-ids.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,8 @@
449449
#define USB_VENDOR_ID_ELECOM 0x056e
450450
#define USB_DEVICE_ID_ELECOM_BM084 0x0061
451451
#define USB_DEVICE_ID_ELECOM_M_XGL20DLBK 0x00e6
452-
#define USB_DEVICE_ID_ELECOM_M_XT3URBK 0x00fb
452+
#define USB_DEVICE_ID_ELECOM_M_XT3URBK_00FB 0x00fb
453+
#define USB_DEVICE_ID_ELECOM_M_XT3URBK_018F 0x018f
453454
#define USB_DEVICE_ID_ELECOM_M_XT3DRBK 0x00fc
454455
#define USB_DEVICE_ID_ELECOM_M_XT4DRBK 0x00fd
455456
#define USB_DEVICE_ID_ELECOM_M_DT1URBK 0x00fe
@@ -718,6 +719,7 @@
718719
#define USB_DEVICE_ID_ITE_LENOVO_YOGA2 0x8350
719720
#define I2C_DEVICE_ID_ITE_LENOVO_LEGION_Y720 0x837a
720721
#define USB_DEVICE_ID_ITE_LENOVO_YOGA900 0x8396
722+
#define I2C_DEVICE_ID_ITE_LENOVO_YOGA_SLIM_7X_KEYBOARD 0x8987
721723
#define USB_DEVICE_ID_ITE8595 0x8595
722724
#define USB_DEVICE_ID_ITE_MEDION_E1239T 0xce50
723725

@@ -1543,7 +1545,7 @@
15431545
#define USB_VENDOR_ID_SIGNOTEC 0x2133
15441546
#define USB_DEVICE_ID_SIGNOTEC_VIEWSONIC_PD1011 0x0018
15451547

1546-
#define USB_VENDOR_ID_SMARTLINKTECHNOLOGY 0x4c4a
1547-
#define USB_DEVICE_ID_SMARTLINKTECHNOLOGY_4155 0x4155
1548+
#define USB_VENDOR_ID_JIELI_SDK_DEFAULT 0x4c4a
1549+
#define USB_DEVICE_ID_JIELI_SDK_4155 0x4155
15481550

15491551
#endif

drivers/hid/hid-input.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -399,10 +399,11 @@ static const struct hid_device_id hid_battery_quirks[] = {
399399
{ HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_CHROMEBOOK_TROGDOR_POMPOM),
400400
HID_BATTERY_QUIRK_AVOID_QUERY },
401401
/*
402-
* Elan I2C-HID touchscreens seem to all report a non present battery,
403-
* set HID_BATTERY_QUIRK_IGNORE for all Elan I2C-HID devices.
402+
* Elan HID touchscreens seem to all report a non present battery,
403+
* set HID_BATTERY_QUIRK_IGNORE for all Elan I2C and USB HID devices.
404404
*/
405405
{ HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, HID_ANY_ID), HID_BATTERY_QUIRK_IGNORE },
406+
{ HID_USB_DEVICE(USB_VENDOR_ID_ELAN, HID_ANY_ID), HID_BATTERY_QUIRK_IGNORE },
406407
{}
407408
};
408409

drivers/hid/hid-lenovo.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,14 @@ static const __u8 lenovo_tpIIbtkbd_need_fixup_collection[] = {
148148
0x81, 0x01, /* Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position) */
149149
};
150150

151+
static const __u8 lenovo_yoga7x_kbd_need_fixup_collection[] = {
152+
0x15, 0x00, // Logical Minimum (0)
153+
0x25, 0x65, // Logical Maximum (101)
154+
0x05, 0x07, // Usage Page (Keyboard)
155+
0x19, 0x00, // Usage Minimum (0)
156+
0x29, 0xDD, // Usage Maximum (221)
157+
};
158+
151159
static const __u8 *lenovo_report_fixup(struct hid_device *hdev, __u8 *rdesc,
152160
unsigned int *rsize)
153161
{
@@ -177,6 +185,13 @@ static const __u8 *lenovo_report_fixup(struct hid_device *hdev, __u8 *rdesc,
177185
rdesc[260] = 0x01; /* report count (2) = 0x01 */
178186
}
179187
break;
188+
case I2C_DEVICE_ID_ITE_LENOVO_YOGA_SLIM_7X_KEYBOARD:
189+
if (*rsize == 176 &&
190+
memcmp(&rdesc[52], lenovo_yoga7x_kbd_need_fixup_collection,
191+
sizeof(lenovo_yoga7x_kbd_need_fixup_collection)) == 0) {
192+
rdesc[55] = rdesc[61]; // logical maximum = usage maximum
193+
}
194+
break;
180195
}
181196
return rdesc;
182197
}
@@ -1538,6 +1553,8 @@ static const struct hid_device_id lenovo_devices[] = {
15381553
USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X12_TAB) },
15391554
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
15401555
USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X12_TAB2) },
1556+
{ HID_DEVICE(BUS_I2C, HID_GROUP_GENERIC,
1557+
USB_VENDOR_ID_ITE, I2C_DEVICE_ID_ITE_LENOVO_YOGA_SLIM_7X_KEYBOARD) },
15411558
{ }
15421559
};
15431560

drivers/hid/hid-ntrig.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -142,13 +142,13 @@ static void ntrig_report_version(struct hid_device *hdev)
142142
int ret;
143143
char buf[20];
144144
struct usb_device *usb_dev = hid_to_usb_dev(hdev);
145-
unsigned char *data = kmalloc(8, GFP_KERNEL);
145+
unsigned char *data __free(kfree) = kmalloc(8, GFP_KERNEL);
146146

147147
if (!hid_is_usb(hdev))
148148
return;
149149

150150
if (!data)
151-
goto err_free;
151+
return;
152152

153153
ret = usb_control_msg(usb_dev, usb_rcvctrlpipe(usb_dev, 0),
154154
USB_REQ_CLEAR_FEATURE,
@@ -163,9 +163,6 @@ static void ntrig_report_version(struct hid_device *hdev)
163163
hid_info(hdev, "Firmware version: %s (%02x%02x %02x%02x)\n",
164164
buf, data[2], data[3], data[4], data[5]);
165165
}
166-
167-
err_free:
168-
kfree(data);
169166
}
170167

171168
static ssize_t show_phys_width(struct device *dev,

drivers/hid/hid-playstation.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1942,6 +1942,7 @@ static int dualshock4_get_calibration_data(struct dualshock4 *ds4)
19421942
"Failed to retrieve DualShock4 calibration info: %d\n",
19431943
ret);
19441944
ret = -EILSEQ;
1945+
kfree(buf);
19451946
goto transfer_failed;
19461947
} else {
19471948
break;
@@ -1959,6 +1960,7 @@ static int dualshock4_get_calibration_data(struct dualshock4 *ds4)
19591960

19601961
if (ret) {
19611962
hid_warn(hdev, "Failed to retrieve DualShock4 calibration info: %d\n", ret);
1963+
kfree(buf);
19621964
goto transfer_failed;
19631965
}
19641966
}

drivers/hid/hid-quirks.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,8 @@ static const struct hid_device_id hid_have_special_driver[] = {
410410
#if IS_ENABLED(CONFIG_HID_ELECOM)
411411
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_BM084) },
412412
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XGL20DLBK) },
413-
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3URBK) },
413+
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3URBK_00FB) },
414+
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3URBK_018F) },
414415
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3DRBK) },
415416
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT4DRBK) },
416417
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_DT1URBK) },
@@ -915,7 +916,6 @@ static const struct hid_device_id hid_ignore_list[] = {
915916
#endif
916917
{ HID_USB_DEVICE(USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K) },
917918
{ HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_HP_5MP_CAMERA_5473) },
918-
{ HID_USB_DEVICE(USB_VENDOR_ID_SMARTLINKTECHNOLOGY, USB_DEVICE_ID_SMARTLINKTECHNOLOGY_4155) },
919919
{ }
920920
};
921921

@@ -1064,6 +1064,18 @@ bool hid_ignore(struct hid_device *hdev)
10641064
strlen(elan_acpi_id[i].id)))
10651065
return true;
10661066
break;
1067+
case USB_VENDOR_ID_JIELI_SDK_DEFAULT:
1068+
/*
1069+
* Multiple USB devices with identical IDs (mic & touchscreen).
1070+
* The touch screen requires hid core processing, but the
1071+
* microphone does not. They can be distinguished by manufacturer
1072+
* and serial number.
1073+
*/
1074+
if (hdev->product == USB_DEVICE_ID_JIELI_SDK_4155 &&
1075+
strncmp(hdev->name, "SmartlinkTechnology", 19) == 0 &&
1076+
strncmp(hdev->uniq, "20201111000001", 14) == 0)
1077+
return true;
1078+
break;
10671079
}
10681080

10691081
if (hdev->type == HID_TYPE_USBMOUSE &&

0 commit comments

Comments
 (0)