Skip to content

Commit 8a20830

Browse files
committed
Merge tag 'hid-for-linus-2025062701' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid
Pull HID fixes from Jiri Kosina: - fix for stalls during suspend/resume cycles with hid-nintendo (Daniel J. Ogorchock) - memory leak and reference count fixes in hid-wacom and in-appletb-kdb (Qasim Ijaz) - race condition (leading to kernel crash) fix during device removal in hid-wacom (Thomas Zeitlhofer) - fix for missed interrupt in intel-thc-hid (Intel-thc-hid:) - support for a bunch of new device IDs * tag 'hid-for-linus-2025062701' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid: HID: lenovo: Add support for ThinkPad X1 Tablet Thin Keyboard Gen2 HID: appletb-kbd: fix "appletb_backlight" backlight device reference counting HID: wacom: fix crash in wacom_aes_battery_handler() HID: intel-ish-hid: ipc: Add Wildcat Lake PCI device ID hid: intel-ish-hid: Use PCI_DEVICE_DATA() macro for ISH device table HID: lenovo: Restrict F7/9/11 mode to compact keyboards only HID: Add IGNORE quirk for SMARTLINKTECHNOLOGY HID: input: lower message severity of 'No inputs registered, leaving' to debug HID: quirks: Add quirk for 2 Chicony Electronics HP 5MP Cameras HID: Intel-thc-hid: Intel-quicki2c: Enhance QuickI2C reset flow HID: nintendo: avoid bluetooth suspend/resume stalls HID: wacom: fix kobject reference count leak HID: wacom: fix memory leak on sysfs attribute creation failure HID: wacom: fix memory leak on kobject creation failure
2 parents f02769e + a890523 commit 8a20830

File tree

11 files changed

+114
-13
lines changed

11 files changed

+114
-13
lines changed

drivers/hid/hid-appletb-kbd.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,8 @@ static int appletb_kbd_probe(struct hid_device *hdev, const struct hid_device_id
438438
return 0;
439439

440440
close_hw:
441+
if (kbd->backlight_dev)
442+
put_device(&kbd->backlight_dev->dev);
441443
hid_hw_close(hdev);
442444
stop_hw:
443445
hid_hw_stop(hdev);
@@ -453,6 +455,9 @@ static void appletb_kbd_remove(struct hid_device *hdev)
453455
input_unregister_handler(&kbd->inp_handler);
454456
timer_delete_sync(&kbd->inactivity_timer);
455457

458+
if (kbd->backlight_dev)
459+
put_device(&kbd->backlight_dev->dev);
460+
456461
hid_hw_close(hdev);
457462
hid_hw_stop(hdev);
458463
}

drivers/hid/hid-ids.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,8 @@
312312
#define USB_DEVICE_ID_ASUS_AK1D 0x1125
313313
#define USB_DEVICE_ID_CHICONY_TOSHIBA_WT10A 0x1408
314314
#define USB_DEVICE_ID_CHICONY_ACER_SWITCH12 0x1421
315+
#define USB_DEVICE_ID_CHICONY_HP_5MP_CAMERA 0xb824
316+
#define USB_DEVICE_ID_CHICONY_HP_5MP_CAMERA2 0xb82c
315317

316318
#define USB_VENDOR_ID_CHUNGHWAT 0x2247
317319
#define USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH 0x0001
@@ -819,6 +821,7 @@
819821
#define USB_DEVICE_ID_LENOVO_TPPRODOCK 0x6067
820822
#define USB_DEVICE_ID_LENOVO_X1_COVER 0x6085
821823
#define USB_DEVICE_ID_LENOVO_X1_TAB 0x60a3
824+
#define USB_DEVICE_ID_LENOVO_X1_TAB2 0x60a4
822825
#define USB_DEVICE_ID_LENOVO_X1_TAB3 0x60b5
823826
#define USB_DEVICE_ID_LENOVO_X12_TAB 0x60fe
824827
#define USB_DEVICE_ID_LENOVO_X12_TAB2 0x61ae
@@ -1525,4 +1528,7 @@
15251528
#define USB_VENDOR_ID_SIGNOTEC 0x2133
15261529
#define USB_DEVICE_ID_SIGNOTEC_VIEWSONIC_PD1011 0x0018
15271530

1531+
#define USB_VENDOR_ID_SMARTLINKTECHNOLOGY 0x4c4a
1532+
#define USB_DEVICE_ID_SMARTLINKTECHNOLOGY_4155 0x4155
1533+
15281534
#endif

drivers/hid/hid-input.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2343,7 +2343,7 @@ int hidinput_connect(struct hid_device *hid, unsigned int force)
23432343
}
23442344

23452345
if (list_empty(&hid->inputs)) {
2346-
hid_err(hid, "No inputs registered, leaving\n");
2346+
hid_dbg(hid, "No inputs registered, leaving\n");
23472347
goto out_unwind;
23482348
}
23492349

drivers/hid/hid-lenovo.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,7 @@ static int lenovo_input_mapping(struct hid_device *hdev,
492492
case USB_DEVICE_ID_LENOVO_X12_TAB:
493493
case USB_DEVICE_ID_LENOVO_X12_TAB2:
494494
case USB_DEVICE_ID_LENOVO_X1_TAB:
495+
case USB_DEVICE_ID_LENOVO_X1_TAB2:
495496
case USB_DEVICE_ID_LENOVO_X1_TAB3:
496497
return lenovo_input_mapping_x1_tab_kbd(hdev, hi, field, usage, bit, max);
497498
default:
@@ -548,11 +549,14 @@ static void lenovo_features_set_cptkbd(struct hid_device *hdev)
548549

549550
/*
550551
* Tell the keyboard a driver understands it, and turn F7, F9, F11 into
551-
* regular keys
552+
* regular keys (Compact only)
552553
*/
553-
ret = lenovo_send_cmd_cptkbd(hdev, 0x01, 0x03);
554-
if (ret)
555-
hid_warn(hdev, "Failed to switch F7/9/11 mode: %d\n", ret);
554+
if (hdev->product == USB_DEVICE_ID_LENOVO_CUSBKBD ||
555+
hdev->product == USB_DEVICE_ID_LENOVO_CBTKBD) {
556+
ret = lenovo_send_cmd_cptkbd(hdev, 0x01, 0x03);
557+
if (ret)
558+
hid_warn(hdev, "Failed to switch F7/9/11 mode: %d\n", ret);
559+
}
556560

557561
/* Switch middle button to native mode */
558562
ret = lenovo_send_cmd_cptkbd(hdev, 0x09, 0x01);
@@ -605,6 +609,7 @@ static ssize_t attr_fn_lock_store(struct device *dev,
605609
case USB_DEVICE_ID_LENOVO_X12_TAB2:
606610
case USB_DEVICE_ID_LENOVO_TP10UBKBD:
607611
case USB_DEVICE_ID_LENOVO_X1_TAB:
612+
case USB_DEVICE_ID_LENOVO_X1_TAB2:
608613
case USB_DEVICE_ID_LENOVO_X1_TAB3:
609614
ret = lenovo_led_set_tp10ubkbd(hdev, TP10UBKBD_FN_LOCK_LED, value);
610615
if (ret)
@@ -861,6 +866,7 @@ static int lenovo_event(struct hid_device *hdev, struct hid_field *field,
861866
case USB_DEVICE_ID_LENOVO_X12_TAB2:
862867
case USB_DEVICE_ID_LENOVO_TP10UBKBD:
863868
case USB_DEVICE_ID_LENOVO_X1_TAB:
869+
case USB_DEVICE_ID_LENOVO_X1_TAB2:
864870
case USB_DEVICE_ID_LENOVO_X1_TAB3:
865871
return lenovo_event_tp10ubkbd(hdev, field, usage, value);
866872
default:
@@ -1144,6 +1150,7 @@ static int lenovo_led_brightness_set(struct led_classdev *led_cdev,
11441150
case USB_DEVICE_ID_LENOVO_X12_TAB2:
11451151
case USB_DEVICE_ID_LENOVO_TP10UBKBD:
11461152
case USB_DEVICE_ID_LENOVO_X1_TAB:
1153+
case USB_DEVICE_ID_LENOVO_X1_TAB2:
11471154
case USB_DEVICE_ID_LENOVO_X1_TAB3:
11481155
ret = lenovo_led_set_tp10ubkbd(hdev, tp10ubkbd_led[led_nr], value);
11491156
break;
@@ -1384,6 +1391,7 @@ static int lenovo_probe(struct hid_device *hdev,
13841391
case USB_DEVICE_ID_LENOVO_X12_TAB2:
13851392
case USB_DEVICE_ID_LENOVO_TP10UBKBD:
13861393
case USB_DEVICE_ID_LENOVO_X1_TAB:
1394+
case USB_DEVICE_ID_LENOVO_X1_TAB2:
13871395
case USB_DEVICE_ID_LENOVO_X1_TAB3:
13881396
ret = lenovo_probe_tp10ubkbd(hdev);
13891397
break;
@@ -1473,6 +1481,7 @@ static void lenovo_remove(struct hid_device *hdev)
14731481
case USB_DEVICE_ID_LENOVO_X12_TAB2:
14741482
case USB_DEVICE_ID_LENOVO_TP10UBKBD:
14751483
case USB_DEVICE_ID_LENOVO_X1_TAB:
1484+
case USB_DEVICE_ID_LENOVO_X1_TAB2:
14761485
case USB_DEVICE_ID_LENOVO_X1_TAB3:
14771486
lenovo_remove_tp10ubkbd(hdev);
14781487
break;
@@ -1523,6 +1532,8 @@ static const struct hid_device_id lenovo_devices[] = {
15231532
*/
15241533
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
15251534
USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB) },
1535+
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
1536+
USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB2) },
15261537
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
15271538
USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB3) },
15281539
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,

drivers/hid/hid-multitouch.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2132,12 +2132,18 @@ static const struct hid_device_id mt_devices[] = {
21322132
HID_DEVICE(BUS_I2C, HID_GROUP_GENERIC,
21332133
USB_VENDOR_ID_LG, I2C_DEVICE_ID_LG_7010) },
21342134

2135-
/* Lenovo X1 TAB Gen 2 */
2135+
/* Lenovo X1 TAB Gen 1 */
21362136
{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT,
21372137
HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8,
21382138
USB_VENDOR_ID_LENOVO,
21392139
USB_DEVICE_ID_LENOVO_X1_TAB) },
21402140

2141+
/* Lenovo X1 TAB Gen 2 */
2142+
{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT,
2143+
HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8,
2144+
USB_VENDOR_ID_LENOVO,
2145+
USB_DEVICE_ID_LENOVO_X1_TAB2) },
2146+
21412147
/* Lenovo X1 TAB Gen 3 */
21422148
{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT,
21432149
HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8,

drivers/hid/hid-nintendo.c

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,7 @@ enum joycon_ctlr_state {
308308
JOYCON_CTLR_STATE_INIT,
309309
JOYCON_CTLR_STATE_READ,
310310
JOYCON_CTLR_STATE_REMOVED,
311+
JOYCON_CTLR_STATE_SUSPENDED,
311312
};
312313

313314
/* Controller type received as part of device info */
@@ -2750,14 +2751,46 @@ static void nintendo_hid_remove(struct hid_device *hdev)
27502751

27512752
static int nintendo_hid_resume(struct hid_device *hdev)
27522753
{
2753-
int ret = joycon_init(hdev);
2754+
struct joycon_ctlr *ctlr = hid_get_drvdata(hdev);
2755+
int ret;
2756+
2757+
hid_dbg(hdev, "resume\n");
2758+
if (!joycon_using_usb(ctlr)) {
2759+
hid_dbg(hdev, "no-op resume for bt ctlr\n");
2760+
ctlr->ctlr_state = JOYCON_CTLR_STATE_READ;
2761+
return 0;
2762+
}
27542763

2764+
ret = joycon_init(hdev);
27552765
if (ret)
2756-
hid_err(hdev, "Failed to restore controller after resume");
2766+
hid_err(hdev,
2767+
"Failed to restore controller after resume: %d\n",
2768+
ret);
2769+
else
2770+
ctlr->ctlr_state = JOYCON_CTLR_STATE_READ;
27572771

27582772
return ret;
27592773
}
27602774

2775+
static int nintendo_hid_suspend(struct hid_device *hdev, pm_message_t message)
2776+
{
2777+
struct joycon_ctlr *ctlr = hid_get_drvdata(hdev);
2778+
2779+
hid_dbg(hdev, "suspend: %d\n", message.event);
2780+
/*
2781+
* Avoid any blocking loops in suspend/resume transitions.
2782+
*
2783+
* joycon_enforce_subcmd_rate() can result in repeated retries if for
2784+
* whatever reason the controller stops providing input reports.
2785+
*
2786+
* This has been observed with bluetooth controllers which lose
2787+
* connectivity prior to suspend (but not long enough to result in
2788+
* complete disconnection).
2789+
*/
2790+
ctlr->ctlr_state = JOYCON_CTLR_STATE_SUSPENDED;
2791+
return 0;
2792+
}
2793+
27612794
#endif
27622795

27632796
static const struct hid_device_id nintendo_hid_devices[] = {
@@ -2796,6 +2829,7 @@ static struct hid_driver nintendo_hid_driver = {
27962829

27972830
#ifdef CONFIG_PM
27982831
.resume = nintendo_hid_resume,
2832+
.suspend = nintendo_hid_suspend,
27992833
#endif
28002834
};
28012835
static int __init nintendo_init(void)

drivers/hid/hid-quirks.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -757,6 +757,8 @@ static const struct hid_device_id hid_ignore_list[] = {
757757
{ HID_USB_DEVICE(USB_VENDOR_ID_AVERMEDIA, USB_DEVICE_ID_AVER_FM_MR800) },
758758
{ HID_USB_DEVICE(USB_VENDOR_ID_AXENTIA, USB_DEVICE_ID_AXENTIA_FM_RADIO) },
759759
{ HID_USB_DEVICE(USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD) },
760+
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_HP_5MP_CAMERA) },
761+
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_HP_5MP_CAMERA2) },
760762
{ HID_USB_DEVICE(USB_VENDOR_ID_CIDC, 0x0103) },
761763
{ HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_RADIO_SI470X) },
762764
{ HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_RADIO_SI4713) },
@@ -904,6 +906,7 @@ static const struct hid_device_id hid_ignore_list[] = {
904906
#endif
905907
{ HID_USB_DEVICE(USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K) },
906908
{ HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_HP_5MP_CAMERA_5473) },
909+
{ HID_USB_DEVICE(USB_VENDOR_ID_SMARTLINKTECHNOLOGY, USB_DEVICE_ID_SMARTLINKTECHNOLOGY_4155) },
907910
{ }
908911
};
909912

drivers/hid/intel-ish-hid/ipc/hw-ish.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#define PCI_DEVICE_ID_INTEL_ISH_LNL_M 0xA845
3939
#define PCI_DEVICE_ID_INTEL_ISH_PTL_H 0xE345
4040
#define PCI_DEVICE_ID_INTEL_ISH_PTL_P 0xE445
41+
#define PCI_DEVICE_ID_INTEL_ISH_WCL 0x4D45
4142

4243
#define REVISION_ID_CHT_A0 0x6
4344
#define REVISION_ID_CHT_Ax_SI 0x0

drivers/hid/intel-ish-hid/ipc/pci-ish.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,12 @@ enum ishtp_driver_data_index {
2727
ISHTP_DRIVER_DATA_NONE,
2828
ISHTP_DRIVER_DATA_LNL_M,
2929
ISHTP_DRIVER_DATA_PTL,
30+
ISHTP_DRIVER_DATA_WCL,
3031
};
3132

3233
#define ISH_FW_GEN_LNL_M "lnlm"
3334
#define ISH_FW_GEN_PTL "ptl"
35+
#define ISH_FW_GEN_WCL "wcl"
3436

3537
#define ISH_FIRMWARE_PATH(gen) "intel/ish/ish_" gen ".bin"
3638
#define ISH_FIRMWARE_PATH_ALL "intel/ish/ish_*.bin"
@@ -42,6 +44,9 @@ static struct ishtp_driver_data ishtp_driver_data[] = {
4244
[ISHTP_DRIVER_DATA_PTL] = {
4345
.fw_generation = ISH_FW_GEN_PTL,
4446
},
47+
[ISHTP_DRIVER_DATA_WCL] = {
48+
.fw_generation = ISH_FW_GEN_WCL,
49+
},
4550
};
4651

4752
static const struct pci_device_id ish_pci_tbl[] = {
@@ -67,9 +72,10 @@ static const struct pci_device_id ish_pci_tbl[] = {
6772
{PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ISH_MTL_P)},
6873
{PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ISH_ARL_H)},
6974
{PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ISH_ARL_S)},
70-
{PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ISH_LNL_M), .driver_data = ISHTP_DRIVER_DATA_LNL_M},
71-
{PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ISH_PTL_H), .driver_data = ISHTP_DRIVER_DATA_PTL},
72-
{PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ISH_PTL_P), .driver_data = ISHTP_DRIVER_DATA_PTL},
75+
{PCI_DEVICE_DATA(INTEL, ISH_LNL_M, ISHTP_DRIVER_DATA_LNL_M)},
76+
{PCI_DEVICE_DATA(INTEL, ISH_PTL_H, ISHTP_DRIVER_DATA_PTL)},
77+
{PCI_DEVICE_DATA(INTEL, ISH_PTL_P, ISHTP_DRIVER_DATA_PTL)},
78+
{PCI_DEVICE_DATA(INTEL, ISH_WCL, ISHTP_DRIVER_DATA_WCL)},
7379
{}
7480
};
7581
MODULE_DEVICE_TABLE(pci, ish_pci_tbl);

drivers/hid/intel-thc-hid/intel-quicki2c/quicki2c-protocol.c

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <linux/bitfield.h>
55
#include <linux/hid.h>
66
#include <linux/hid-over-i2c.h>
7+
#include <linux/unaligned.h>
78

89
#include "intel-thc-dev.h"
910
#include "intel-thc-dma.h"
@@ -200,6 +201,9 @@ int quicki2c_set_report(struct quicki2c_device *qcdev, u8 report_type,
200201

201202
int quicki2c_reset(struct quicki2c_device *qcdev)
202203
{
204+
u16 input_reg = le16_to_cpu(qcdev->dev_desc.input_reg);
205+
size_t read_len = HIDI2C_LENGTH_LEN;
206+
u32 prd_len = read_len;
203207
int ret;
204208

205209
qcdev->reset_ack = false;
@@ -213,12 +217,32 @@ int quicki2c_reset(struct quicki2c_device *qcdev)
213217

214218
ret = wait_event_interruptible_timeout(qcdev->reset_ack_wq, qcdev->reset_ack,
215219
HIDI2C_RESET_TIMEOUT * HZ);
216-
if (ret <= 0 || !qcdev->reset_ack) {
220+
if (qcdev->reset_ack)
221+
return 0;
222+
223+
/*
224+
* Manually read reset response if it wasn't received, in case reset interrupt
225+
* was missed by touch device or THC hardware.
226+
*/
227+
ret = thc_tic_pio_read(qcdev->thc_hw, input_reg, read_len, &prd_len,
228+
(u32 *)qcdev->input_buf);
229+
if (ret) {
230+
dev_err_once(qcdev->dev, "Read Reset Response failed, ret %d\n", ret);
231+
return ret;
232+
}
233+
234+
/*
235+
* Check response packet length, it's first 16 bits of packet.
236+
* If response packet length is zero, it's reset response, otherwise not.
237+
*/
238+
if (get_unaligned_le16(qcdev->input_buf)) {
217239
dev_err_once(qcdev->dev,
218240
"Wait reset response timed out ret:%d timeout:%ds\n",
219241
ret, HIDI2C_RESET_TIMEOUT);
220242
return -ETIMEDOUT;
221243
}
222244

245+
qcdev->reset_ack = true;
246+
223247
return 0;
224248
}

0 commit comments

Comments
 (0)