Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

+114 -13
+5
drivers/hid/hid-appletb-kbd.c
··· 438 438 return 0; 439 439 440 440 close_hw: 441 + if (kbd->backlight_dev) 442 + put_device(&kbd->backlight_dev->dev); 441 443 hid_hw_close(hdev); 442 444 stop_hw: 443 445 hid_hw_stop(hdev); ··· 454 452 455 453 input_unregister_handler(&kbd->inp_handler); 456 454 timer_delete_sync(&kbd->inactivity_timer); 455 + 456 + if (kbd->backlight_dev) 457 + put_device(&kbd->backlight_dev->dev); 457 458 458 459 hid_hw_close(hdev); 459 460 hid_hw_stop(hdev);
+6
drivers/hid/hid-ids.h
··· 312 312 #define USB_DEVICE_ID_ASUS_AK1D 0x1125 313 313 #define USB_DEVICE_ID_CHICONY_TOSHIBA_WT10A 0x1408 314 314 #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 315 317 316 318 #define USB_VENDOR_ID_CHUNGHWAT 0x2247 317 319 #define USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH 0x0001 ··· 821 819 #define USB_DEVICE_ID_LENOVO_TPPRODOCK 0x6067 822 820 #define USB_DEVICE_ID_LENOVO_X1_COVER 0x6085 823 821 #define USB_DEVICE_ID_LENOVO_X1_TAB 0x60a3 822 + #define USB_DEVICE_ID_LENOVO_X1_TAB2 0x60a4 824 823 #define USB_DEVICE_ID_LENOVO_X1_TAB3 0x60b5 825 824 #define USB_DEVICE_ID_LENOVO_X12_TAB 0x60fe 826 825 #define USB_DEVICE_ID_LENOVO_X12_TAB2 0x61ae ··· 1527 1524 1528 1525 #define USB_VENDOR_ID_SIGNOTEC 0x2133 1529 1526 #define USB_DEVICE_ID_SIGNOTEC_VIEWSONIC_PD1011 0x0018 1527 + 1528 + #define USB_VENDOR_ID_SMARTLINKTECHNOLOGY 0x4c4a 1529 + #define USB_DEVICE_ID_SMARTLINKTECHNOLOGY_4155 0x4155 1530 1530 1531 1531 #endif
+1 -1
drivers/hid/hid-input.c
··· 2343 2343 } 2344 2344 2345 2345 if (list_empty(&hid->inputs)) { 2346 - hid_err(hid, "No inputs registered, leaving\n"); 2346 + hid_dbg(hid, "No inputs registered, leaving\n"); 2347 2347 goto out_unwind; 2348 2348 } 2349 2349
+15 -4
drivers/hid/hid-lenovo.c
··· 492 492 case USB_DEVICE_ID_LENOVO_X12_TAB: 493 493 case USB_DEVICE_ID_LENOVO_X12_TAB2: 494 494 case USB_DEVICE_ID_LENOVO_X1_TAB: 495 + case USB_DEVICE_ID_LENOVO_X1_TAB2: 495 496 case USB_DEVICE_ID_LENOVO_X1_TAB3: 496 497 return lenovo_input_mapping_x1_tab_kbd(hdev, hi, field, usage, bit, max); 497 498 default: ··· 549 548 550 549 /* 551 550 * Tell the keyboard a driver understands it, and turn F7, F9, F11 into 552 - * regular keys 551 + * regular keys (Compact only) 553 552 */ 554 - ret = lenovo_send_cmd_cptkbd(hdev, 0x01, 0x03); 555 - if (ret) 556 - hid_warn(hdev, "Failed to switch F7/9/11 mode: %d\n", ret); 553 + if (hdev->product == USB_DEVICE_ID_LENOVO_CUSBKBD || 554 + hdev->product == USB_DEVICE_ID_LENOVO_CBTKBD) { 555 + ret = lenovo_send_cmd_cptkbd(hdev, 0x01, 0x03); 556 + if (ret) 557 + hid_warn(hdev, "Failed to switch F7/9/11 mode: %d\n", ret); 558 + } 557 559 558 560 /* Switch middle button to native mode */ 559 561 ret = lenovo_send_cmd_cptkbd(hdev, 0x09, 0x01); ··· 609 605 case USB_DEVICE_ID_LENOVO_X12_TAB2: 610 606 case USB_DEVICE_ID_LENOVO_TP10UBKBD: 611 607 case USB_DEVICE_ID_LENOVO_X1_TAB: 608 + case USB_DEVICE_ID_LENOVO_X1_TAB2: 612 609 case USB_DEVICE_ID_LENOVO_X1_TAB3: 613 610 ret = lenovo_led_set_tp10ubkbd(hdev, TP10UBKBD_FN_LOCK_LED, value); 614 611 if (ret) ··· 866 861 case USB_DEVICE_ID_LENOVO_X12_TAB2: 867 862 case USB_DEVICE_ID_LENOVO_TP10UBKBD: 868 863 case USB_DEVICE_ID_LENOVO_X1_TAB: 864 + case USB_DEVICE_ID_LENOVO_X1_TAB2: 869 865 case USB_DEVICE_ID_LENOVO_X1_TAB3: 870 866 return lenovo_event_tp10ubkbd(hdev, field, usage, value); 871 867 default: ··· 1150 1144 case USB_DEVICE_ID_LENOVO_X12_TAB2: 1151 1145 case USB_DEVICE_ID_LENOVO_TP10UBKBD: 1152 1146 case USB_DEVICE_ID_LENOVO_X1_TAB: 1147 + case USB_DEVICE_ID_LENOVO_X1_TAB2: 1153 1148 case USB_DEVICE_ID_LENOVO_X1_TAB3: 1154 1149 ret = lenovo_led_set_tp10ubkbd(hdev, tp10ubkbd_led[led_nr], value); 1155 1150 break; ··· 1391 1384 case USB_DEVICE_ID_LENOVO_X12_TAB2: 1392 1385 case USB_DEVICE_ID_LENOVO_TP10UBKBD: 1393 1386 case USB_DEVICE_ID_LENOVO_X1_TAB: 1387 + case USB_DEVICE_ID_LENOVO_X1_TAB2: 1394 1388 case USB_DEVICE_ID_LENOVO_X1_TAB3: 1395 1389 ret = lenovo_probe_tp10ubkbd(hdev); 1396 1390 break; ··· 1481 1473 case USB_DEVICE_ID_LENOVO_X12_TAB2: 1482 1474 case USB_DEVICE_ID_LENOVO_TP10UBKBD: 1483 1475 case USB_DEVICE_ID_LENOVO_X1_TAB: 1476 + case USB_DEVICE_ID_LENOVO_X1_TAB2: 1484 1477 case USB_DEVICE_ID_LENOVO_X1_TAB3: 1485 1478 lenovo_remove_tp10ubkbd(hdev); 1486 1479 break; ··· 1532 1523 */ 1533 1524 { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, 1534 1525 USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB) }, 1526 + { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, 1527 + USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB2) }, 1535 1528 { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, 1536 1529 USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB3) }, 1537 1530 { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
+7 -1
drivers/hid/hid-multitouch.c
··· 2132 2132 HID_DEVICE(BUS_I2C, HID_GROUP_GENERIC, 2133 2133 USB_VENDOR_ID_LG, I2C_DEVICE_ID_LG_7010) }, 2134 2134 2135 - /* Lenovo X1 TAB Gen 2 */ 2135 + /* Lenovo X1 TAB Gen 1 */ 2136 2136 { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT, 2137 2137 HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8, 2138 2138 USB_VENDOR_ID_LENOVO, 2139 2139 USB_DEVICE_ID_LENOVO_X1_TAB) }, 2140 + 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) }, 2140 2146 2141 2147 /* Lenovo X1 TAB Gen 3 */ 2142 2148 { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT,
+36 -2
drivers/hid/hid-nintendo.c
··· 308 308 JOYCON_CTLR_STATE_INIT, 309 309 JOYCON_CTLR_STATE_READ, 310 310 JOYCON_CTLR_STATE_REMOVED, 311 + JOYCON_CTLR_STATE_SUSPENDED, 311 312 }; 312 313 313 314 /* Controller type received as part of device info */ ··· 2751 2750 2752 2751 static int nintendo_hid_resume(struct hid_device *hdev) 2753 2752 { 2754 - int ret = joycon_init(hdev); 2753 + struct joycon_ctlr *ctlr = hid_get_drvdata(hdev); 2754 + int ret; 2755 2755 2756 + hid_dbg(hdev, "resume\n"); 2757 + if (!joycon_using_usb(ctlr)) { 2758 + hid_dbg(hdev, "no-op resume for bt ctlr\n"); 2759 + ctlr->ctlr_state = JOYCON_CTLR_STATE_READ; 2760 + return 0; 2761 + } 2762 + 2763 + ret = joycon_init(hdev); 2756 2764 if (ret) 2757 - hid_err(hdev, "Failed to restore controller after resume"); 2765 + hid_err(hdev, 2766 + "Failed to restore controller after resume: %d\n", 2767 + ret); 2768 + else 2769 + ctlr->ctlr_state = JOYCON_CTLR_STATE_READ; 2758 2770 2759 2771 return ret; 2772 + } 2773 + 2774 + static int nintendo_hid_suspend(struct hid_device *hdev, pm_message_t message) 2775 + { 2776 + struct joycon_ctlr *ctlr = hid_get_drvdata(hdev); 2777 + 2778 + hid_dbg(hdev, "suspend: %d\n", message.event); 2779 + /* 2780 + * Avoid any blocking loops in suspend/resume transitions. 2781 + * 2782 + * joycon_enforce_subcmd_rate() can result in repeated retries if for 2783 + * whatever reason the controller stops providing input reports. 2784 + * 2785 + * This has been observed with bluetooth controllers which lose 2786 + * connectivity prior to suspend (but not long enough to result in 2787 + * complete disconnection). 2788 + */ 2789 + ctlr->ctlr_state = JOYCON_CTLR_STATE_SUSPENDED; 2790 + return 0; 2760 2791 } 2761 2792 2762 2793 #endif ··· 2829 2796 2830 2797 #ifdef CONFIG_PM 2831 2798 .resume = nintendo_hid_resume, 2799 + .suspend = nintendo_hid_suspend, 2832 2800 #endif 2833 2801 }; 2834 2802 static int __init nintendo_init(void)
+3
drivers/hid/hid-quirks.c
··· 757 757 { HID_USB_DEVICE(USB_VENDOR_ID_AVERMEDIA, USB_DEVICE_ID_AVER_FM_MR800) }, 758 758 { HID_USB_DEVICE(USB_VENDOR_ID_AXENTIA, USB_DEVICE_ID_AXENTIA_FM_RADIO) }, 759 759 { 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) }, 760 762 { HID_USB_DEVICE(USB_VENDOR_ID_CIDC, 0x0103) }, 761 763 { HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_RADIO_SI470X) }, 762 764 { HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_RADIO_SI4713) }, ··· 906 904 #endif 907 905 { HID_USB_DEVICE(USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K) }, 908 906 { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_HP_5MP_CAMERA_5473) }, 907 + { HID_USB_DEVICE(USB_VENDOR_ID_SMARTLINKTECHNOLOGY, USB_DEVICE_ID_SMARTLINKTECHNOLOGY_4155) }, 909 908 { } 910 909 }; 911 910
+1
drivers/hid/intel-ish-hid/ipc/hw-ish.h
··· 38 38 #define PCI_DEVICE_ID_INTEL_ISH_LNL_M 0xA845 39 39 #define PCI_DEVICE_ID_INTEL_ISH_PTL_H 0xE345 40 40 #define PCI_DEVICE_ID_INTEL_ISH_PTL_P 0xE445 41 + #define PCI_DEVICE_ID_INTEL_ISH_WCL 0x4D45 41 42 42 43 #define REVISION_ID_CHT_A0 0x6 43 44 #define REVISION_ID_CHT_Ax_SI 0x0
+9 -3
drivers/hid/intel-ish-hid/ipc/pci-ish.c
··· 27 27 ISHTP_DRIVER_DATA_NONE, 28 28 ISHTP_DRIVER_DATA_LNL_M, 29 29 ISHTP_DRIVER_DATA_PTL, 30 + ISHTP_DRIVER_DATA_WCL, 30 31 }; 31 32 32 33 #define ISH_FW_GEN_LNL_M "lnlm" 33 34 #define ISH_FW_GEN_PTL "ptl" 35 + #define ISH_FW_GEN_WCL "wcl" 34 36 35 37 #define ISH_FIRMWARE_PATH(gen) "intel/ish/ish_" gen ".bin" 36 38 #define ISH_FIRMWARE_PATH_ALL "intel/ish/ish_*.bin" ··· 43 41 }, 44 42 [ISHTP_DRIVER_DATA_PTL] = { 45 43 .fw_generation = ISH_FW_GEN_PTL, 44 + }, 45 + [ISHTP_DRIVER_DATA_WCL] = { 46 + .fw_generation = ISH_FW_GEN_WCL, 46 47 }, 47 48 }; 48 49 ··· 72 67 {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ISH_MTL_P)}, 73 68 {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ISH_ARL_H)}, 74 69 {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ISH_ARL_S)}, 75 - {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ISH_LNL_M), .driver_data = ISHTP_DRIVER_DATA_LNL_M}, 76 - {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ISH_PTL_H), .driver_data = ISHTP_DRIVER_DATA_PTL}, 77 - {PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ISH_PTL_P), .driver_data = ISHTP_DRIVER_DATA_PTL}, 70 + {PCI_DEVICE_DATA(INTEL, ISH_LNL_M, ISHTP_DRIVER_DATA_LNL_M)}, 71 + {PCI_DEVICE_DATA(INTEL, ISH_PTL_H, ISHTP_DRIVER_DATA_PTL)}, 72 + {PCI_DEVICE_DATA(INTEL, ISH_PTL_P, ISHTP_DRIVER_DATA_PTL)}, 73 + {PCI_DEVICE_DATA(INTEL, ISH_WCL, ISHTP_DRIVER_DATA_WCL)}, 78 74 {} 79 75 }; 80 76 MODULE_DEVICE_TABLE(pci, ish_pci_tbl);
+25 -1
drivers/hid/intel-thc-hid/intel-quicki2c/quicki2c-protocol.c
··· 4 4 #include <linux/bitfield.h> 5 5 #include <linux/hid.h> 6 6 #include <linux/hid-over-i2c.h> 7 + #include <linux/unaligned.h> 7 8 8 9 #include "intel-thc-dev.h" 9 10 #include "intel-thc-dma.h" ··· 201 200 202 201 int quicki2c_reset(struct quicki2c_device *qcdev) 203 202 { 203 + u16 input_reg = le16_to_cpu(qcdev->dev_desc.input_reg); 204 + size_t read_len = HIDI2C_LENGTH_LEN; 205 + u32 prd_len = read_len; 204 206 int ret; 205 207 206 208 qcdev->reset_ack = false; ··· 217 213 218 214 ret = wait_event_interruptible_timeout(qcdev->reset_ack_wq, qcdev->reset_ack, 219 215 HIDI2C_RESET_TIMEOUT * HZ); 220 - if (ret <= 0 || !qcdev->reset_ack) { 216 + if (qcdev->reset_ack) 217 + return 0; 218 + 219 + /* 220 + * Manually read reset response if it wasn't received, in case reset interrupt 221 + * was missed by touch device or THC hardware. 222 + */ 223 + ret = thc_tic_pio_read(qcdev->thc_hw, input_reg, read_len, &prd_len, 224 + (u32 *)qcdev->input_buf); 225 + if (ret) { 226 + dev_err_once(qcdev->dev, "Read Reset Response failed, ret %d\n", ret); 227 + return ret; 228 + } 229 + 230 + /* 231 + * Check response packet length, it's first 16 bits of packet. 232 + * If response packet length is zero, it's reset response, otherwise not. 233 + */ 234 + if (get_unaligned_le16(qcdev->input_buf)) { 221 235 dev_err_once(qcdev->dev, 222 236 "Wait reset response timed out ret:%d timeout:%ds\n", 223 237 ret, HIDI2C_RESET_TIMEOUT); 224 238 return -ETIMEDOUT; 225 239 } 240 + 241 + qcdev->reset_ack = true; 226 242 227 243 return 0; 228 244 }
+6 -1
drivers/hid/wacom_sys.c
··· 2048 2048 2049 2049 remote->remote_dir = kobject_create_and_add("wacom_remote", 2050 2050 &wacom->hdev->dev.kobj); 2051 - if (!remote->remote_dir) 2051 + if (!remote->remote_dir) { 2052 + kfifo_free(&remote->remote_fifo); 2052 2053 return -ENOMEM; 2054 + } 2053 2055 2054 2056 error = sysfs_create_files(remote->remote_dir, remote_unpair_attrs); 2055 2057 2056 2058 if (error) { 2057 2059 hid_err(wacom->hdev, 2058 2060 "cannot create sysfs group err: %d\n", error); 2061 + kfifo_free(&remote->remote_fifo); 2062 + kobject_put(remote->remote_dir); 2059 2063 return error; 2060 2064 } 2061 2065 ··· 2905 2901 hid_hw_stop(hdev); 2906 2902 2907 2903 cancel_delayed_work_sync(&wacom->init_work); 2904 + cancel_delayed_work_sync(&wacom->aes_battery_work); 2908 2905 cancel_work_sync(&wacom->wireless_work); 2909 2906 cancel_work_sync(&wacom->battery_work); 2910 2907 cancel_work_sync(&wacom->remote_work);