Commit 8a20830f authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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
parents f02769e7 a8905238
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -438,6 +438,8 @@ static int appletb_kbd_probe(struct hid_device *hdev, const struct hid_device_id
	return 0;

close_hw:
	if (kbd->backlight_dev)
		put_device(&kbd->backlight_dev->dev);
	hid_hw_close(hdev);
stop_hw:
	hid_hw_stop(hdev);
@@ -453,6 +455,9 @@ static void appletb_kbd_remove(struct hid_device *hdev)
	input_unregister_handler(&kbd->inp_handler);
	timer_delete_sync(&kbd->inactivity_timer);

	if (kbd->backlight_dev)
		put_device(&kbd->backlight_dev->dev);

	hid_hw_close(hdev);
	hid_hw_stop(hdev);
}
+6 −0
Original line number Diff line number Diff line
@@ -312,6 +312,8 @@
#define USB_DEVICE_ID_ASUS_AK1D		0x1125
#define USB_DEVICE_ID_CHICONY_TOSHIBA_WT10A	0x1408
#define USB_DEVICE_ID_CHICONY_ACER_SWITCH12	0x1421
#define USB_DEVICE_ID_CHICONY_HP_5MP_CAMERA	0xb824
#define USB_DEVICE_ID_CHICONY_HP_5MP_CAMERA2	0xb82c

#define USB_VENDOR_ID_CHUNGHWAT		0x2247
#define USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH	0x0001
@@ -819,6 +821,7 @@
#define USB_DEVICE_ID_LENOVO_TPPRODOCK	0x6067
#define USB_DEVICE_ID_LENOVO_X1_COVER	0x6085
#define USB_DEVICE_ID_LENOVO_X1_TAB	0x60a3
#define USB_DEVICE_ID_LENOVO_X1_TAB2	0x60a4
#define USB_DEVICE_ID_LENOVO_X1_TAB3	0x60b5
#define USB_DEVICE_ID_LENOVO_X12_TAB	0x60fe
#define USB_DEVICE_ID_LENOVO_X12_TAB2	0x61ae
@@ -1525,4 +1528,7 @@
#define USB_VENDOR_ID_SIGNOTEC			0x2133
#define USB_DEVICE_ID_SIGNOTEC_VIEWSONIC_PD1011	0x0018

#define USB_VENDOR_ID_SMARTLINKTECHNOLOGY              0x4c4a
#define USB_DEVICE_ID_SMARTLINKTECHNOLOGY_4155         0x4155

#endif
+1 −1
Original line number Diff line number Diff line
@@ -2343,7 +2343,7 @@ int hidinput_connect(struct hid_device *hid, unsigned int force)
	}

	if (list_empty(&hid->inputs)) {
		hid_err(hid, "No inputs registered, leaving\n");
		hid_dbg(hid, "No inputs registered, leaving\n");
		goto out_unwind;
	}

+15 −4
Original line number Diff line number Diff line
@@ -492,6 +492,7 @@ static int lenovo_input_mapping(struct hid_device *hdev,
	case USB_DEVICE_ID_LENOVO_X12_TAB:
	case USB_DEVICE_ID_LENOVO_X12_TAB2:
	case USB_DEVICE_ID_LENOVO_X1_TAB:
	case USB_DEVICE_ID_LENOVO_X1_TAB2:
	case USB_DEVICE_ID_LENOVO_X1_TAB3:
		return lenovo_input_mapping_x1_tab_kbd(hdev, hi, field, usage, bit, max);
	default:
@@ -548,11 +549,14 @@ static void lenovo_features_set_cptkbd(struct hid_device *hdev)

	/*
	 * Tell the keyboard a driver understands it, and turn F7, F9, F11 into
	 * regular keys
	 * regular keys (Compact only)
	 */
	if (hdev->product == USB_DEVICE_ID_LENOVO_CUSBKBD ||
	    hdev->product == USB_DEVICE_ID_LENOVO_CBTKBD) {
		ret = lenovo_send_cmd_cptkbd(hdev, 0x01, 0x03);
		if (ret)
			hid_warn(hdev, "Failed to switch F7/9/11 mode: %d\n", ret);
	}

	/* Switch middle button to native mode */
	ret = lenovo_send_cmd_cptkbd(hdev, 0x09, 0x01);
@@ -605,6 +609,7 @@ static ssize_t attr_fn_lock_store(struct device *dev,
	case USB_DEVICE_ID_LENOVO_X12_TAB2:
	case USB_DEVICE_ID_LENOVO_TP10UBKBD:
	case USB_DEVICE_ID_LENOVO_X1_TAB:
	case USB_DEVICE_ID_LENOVO_X1_TAB2:
	case USB_DEVICE_ID_LENOVO_X1_TAB3:
		ret = lenovo_led_set_tp10ubkbd(hdev, TP10UBKBD_FN_LOCK_LED, value);
		if (ret)
@@ -861,6 +866,7 @@ static int lenovo_event(struct hid_device *hdev, struct hid_field *field,
	case USB_DEVICE_ID_LENOVO_X12_TAB2:
	case USB_DEVICE_ID_LENOVO_TP10UBKBD:
	case USB_DEVICE_ID_LENOVO_X1_TAB:
	case USB_DEVICE_ID_LENOVO_X1_TAB2:
	case USB_DEVICE_ID_LENOVO_X1_TAB3:
		return lenovo_event_tp10ubkbd(hdev, field, usage, value);
	default:
@@ -1144,6 +1150,7 @@ static int lenovo_led_brightness_set(struct led_classdev *led_cdev,
	case USB_DEVICE_ID_LENOVO_X12_TAB2:
	case USB_DEVICE_ID_LENOVO_TP10UBKBD:
	case USB_DEVICE_ID_LENOVO_X1_TAB:
	case USB_DEVICE_ID_LENOVO_X1_TAB2:
	case USB_DEVICE_ID_LENOVO_X1_TAB3:
		ret = lenovo_led_set_tp10ubkbd(hdev, tp10ubkbd_led[led_nr], value);
		break;
@@ -1384,6 +1391,7 @@ static int lenovo_probe(struct hid_device *hdev,
	case USB_DEVICE_ID_LENOVO_X12_TAB2:
	case USB_DEVICE_ID_LENOVO_TP10UBKBD:
	case USB_DEVICE_ID_LENOVO_X1_TAB:
	case USB_DEVICE_ID_LENOVO_X1_TAB2:
	case USB_DEVICE_ID_LENOVO_X1_TAB3:
		ret = lenovo_probe_tp10ubkbd(hdev);
		break;
@@ -1473,6 +1481,7 @@ static void lenovo_remove(struct hid_device *hdev)
	case USB_DEVICE_ID_LENOVO_X12_TAB2:
	case USB_DEVICE_ID_LENOVO_TP10UBKBD:
	case USB_DEVICE_ID_LENOVO_X1_TAB:
	case USB_DEVICE_ID_LENOVO_X1_TAB2:
	case USB_DEVICE_ID_LENOVO_X1_TAB3:
		lenovo_remove_tp10ubkbd(hdev);
		break;
@@ -1523,6 +1532,8 @@ static const struct hid_device_id lenovo_devices[] = {
	 */
	{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
		     USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB) },
	{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
		     USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB2) },
	{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
		     USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB3) },
	{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
+7 −1
Original line number Diff line number Diff line
@@ -2132,12 +2132,18 @@ static const struct hid_device_id mt_devices[] = {
		HID_DEVICE(BUS_I2C, HID_GROUP_GENERIC,
			USB_VENDOR_ID_LG, I2C_DEVICE_ID_LG_7010) },

	/* Lenovo X1 TAB Gen 2 */
	/* Lenovo X1 TAB Gen 1 */
	{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT,
		HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8,
			   USB_VENDOR_ID_LENOVO,
			   USB_DEVICE_ID_LENOVO_X1_TAB) },

	/* Lenovo X1 TAB Gen 2 */
	{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT,
		HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8,
			   USB_VENDOR_ID_LENOVO,
			   USB_DEVICE_ID_LENOVO_X1_TAB2) },

	/* Lenovo X1 TAB Gen 3 */
	{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT,
		HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8,
Loading