Commit c9a50b90 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'hid-for-linus-20241024' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid

Pull HID fixes from Jiri Kosina:
 "Device-specific functionality quirks for Thinkpad X1 Gen3, Logitech
  Bolt and some Goodix touchpads (Bartłomiej Maryńczak, Hans de Goede
  and Kenneth Albanowski)"

* tag 'hid-for-linus-20241024' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid:
  HID: lenovo: Add support for Thinkpad X1 Tablet Gen 3 keyboard
  HID: multitouch: Add quirk for Logitech Bolt receiver w/ Casa touchpad
  HID: i2c-hid: Delayed i2c resume wakeup for 0x0d42 Goodix touchpad
parents 3964f82a 51268879
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -509,6 +509,7 @@
#define I2C_DEVICE_ID_GOODIX_01E8	0x01e8
#define I2C_DEVICE_ID_GOODIX_01E9	0x01e9
#define I2C_DEVICE_ID_GOODIX_01F0	0x01f0
#define I2C_DEVICE_ID_GOODIX_0D42	0x0d42

#define USB_VENDOR_ID_GOODTOUCH		0x1aad
#define USB_DEVICE_ID_GOODTOUCH_000f	0x000f
@@ -868,6 +869,7 @@
#define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1	0xc539
#define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1_1	0xc53f
#define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_POWERPLAY	0xc53a
#define USB_DEVICE_ID_LOGITECH_BOLT_RECEIVER	0xc548
#define USB_DEVICE_ID_SPACETRAVELLER	0xc623
#define USB_DEVICE_ID_SPACENAVIGATOR	0xc626
#define USB_DEVICE_ID_DINOVO_DESKTOP	0xc704
+8 −0
Original line number Diff line number Diff line
@@ -473,6 +473,7 @@ static int lenovo_input_mapping(struct hid_device *hdev,
		return lenovo_input_mapping_tp10_ultrabook_kbd(hdev, hi, field,
							       usage, bit, max);
	case USB_DEVICE_ID_LENOVO_X1_TAB:
	case USB_DEVICE_ID_LENOVO_X1_TAB3:
		return lenovo_input_mapping_x1_tab_kbd(hdev, hi, field, usage, bit, max);
	default:
		return 0;
@@ -583,6 +584,7 @@ static ssize_t attr_fn_lock_store(struct device *dev,
		break;
	case USB_DEVICE_ID_LENOVO_TP10UBKBD:
	case USB_DEVICE_ID_LENOVO_X1_TAB:
	case USB_DEVICE_ID_LENOVO_X1_TAB3:
		ret = lenovo_led_set_tp10ubkbd(hdev, TP10UBKBD_FN_LOCK_LED, value);
		if (ret)
			return ret;
@@ -776,6 +778,7 @@ static int lenovo_event(struct hid_device *hdev, struct hid_field *field,
		return lenovo_event_cptkbd(hdev, field, usage, value);
	case USB_DEVICE_ID_LENOVO_TP10UBKBD:
	case USB_DEVICE_ID_LENOVO_X1_TAB:
	case USB_DEVICE_ID_LENOVO_X1_TAB3:
		return lenovo_event_tp10ubkbd(hdev, field, usage, value);
	default:
		return 0;
@@ -1056,6 +1059,7 @@ static int lenovo_led_brightness_set(struct led_classdev *led_cdev,
		break;
	case USB_DEVICE_ID_LENOVO_TP10UBKBD:
	case USB_DEVICE_ID_LENOVO_X1_TAB:
	case USB_DEVICE_ID_LENOVO_X1_TAB3:
		ret = lenovo_led_set_tp10ubkbd(hdev, tp10ubkbd_led[led_nr], value);
		break;
	}
@@ -1286,6 +1290,7 @@ static int lenovo_probe(struct hid_device *hdev,
		break;
	case USB_DEVICE_ID_LENOVO_TP10UBKBD:
	case USB_DEVICE_ID_LENOVO_X1_TAB:
	case USB_DEVICE_ID_LENOVO_X1_TAB3:
		ret = lenovo_probe_tp10ubkbd(hdev);
		break;
	default:
@@ -1372,6 +1377,7 @@ static void lenovo_remove(struct hid_device *hdev)
		break;
	case USB_DEVICE_ID_LENOVO_TP10UBKBD:
	case USB_DEVICE_ID_LENOVO_X1_TAB:
	case USB_DEVICE_ID_LENOVO_X1_TAB3:
		lenovo_remove_tp10ubkbd(hdev);
		break;
	}
@@ -1421,6 +1427,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_TAB3) },
	{ }
};

+4 −0
Original line number Diff line number Diff line
@@ -2146,6 +2146,10 @@ static const struct hid_device_id mt_devices[] = {
		HID_DEVICE(BUS_BLUETOOTH, HID_GROUP_MULTITOUCH_WIN_8,
			USB_VENDOR_ID_LOGITECH,
			USB_DEVICE_ID_LOGITECH_CASA_TOUCHPAD) },
	{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
		HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8,
			USB_VENDOR_ID_LOGITECH,
			USB_DEVICE_ID_LOGITECH_BOLT_RECEIVER) },

	/* MosArt panels */
	{ .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
+10 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@
#define I2C_HID_QUIRK_BAD_INPUT_SIZE		BIT(3)
#define I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET	BIT(4)
#define I2C_HID_QUIRK_NO_SLEEP_ON_SUSPEND	BIT(5)
#define I2C_HID_QUIRK_DELAY_WAKEUP_AFTER_RESUME BIT(6)

/* Command opcodes */
#define I2C_HID_OPCODE_RESET			0x01
@@ -140,6 +141,8 @@ static const struct i2c_hid_quirks {
	{ USB_VENDOR_ID_ELAN, HID_ANY_ID,
		 I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET |
		 I2C_HID_QUIRK_BOGUS_IRQ },
	{ I2C_VENDOR_ID_GOODIX, I2C_DEVICE_ID_GOODIX_0D42,
		 I2C_HID_QUIRK_DELAY_WAKEUP_AFTER_RESUME },
	{ 0, 0 }
};

@@ -981,6 +984,13 @@ static int i2c_hid_core_resume(struct i2c_hid *ihid)
		return -ENXIO;
	}

	/* On Goodix 27c6:0d42 wait extra time before device wakeup.
	 * It's not clear why but if we send wakeup too early, the device will
	 * never trigger input interrupts.
	 */
	if (ihid->quirks & I2C_HID_QUIRK_DELAY_WAKEUP_AFTER_RESUME)
		msleep(1500);

	/* Instead of resetting device, simply powers the device on. This
	 * solves "incomplete reports" on Raydium devices 2386:3118 and
	 * 2386:4B33 and fixes various SIS touchscreens no longer sending