hid-for-linus-20241024
-----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIVAwUAZxq4J6Zi849r7WBJAQKPXA//UcjmEV+wEiRwFw/YNx4MvDSbiVYCsLO9 v2ZhPuiikZOyKzgUxT8+E6b4VHl6YXvkbUrPMjCEDno5VVST+1p78ifJbm0CFh35 r3OWFbtC/GGBznmZM1p7fuNYS6ORQOfyegHrtvR60Y7S39EdJplpQ0qtsrQlugJw GiSLtzUAMM1Zx84g/AlSXERvAnu1aYYNlbk3DCQOagAPj1/uoo707ec7xp2rG6Rq F5+rQG5NpZddQX6jeYYjmW3bcE7NWEEt0rOVEjwnWWR1Q9dDRE0rq7EgrLR8rJnP 5V1KFK7vXYci8zxcvFRWTO/0l4FMi6mVud/fc6FaflQueuj8ZRL8vSjP8EjtTYFl H2b2HLfeqdQgjCEErzQWW/5E67ViIfGQp7Qvtwkb8e6rz3ayzV0+mExXrOT0V0K4 dG8NhwV0ZFVZrLVEO0oDmy8JZBfEigRNobHP3lCBDNhtNUQL/qarKD+xbIDtm0oX 6pXBHQ1PJ1kidqCcyx3IkY0gnKgj1mtUeOSstGcj+yR4AomhLCexGNVM8nh7znE3 NpVY6ohj2Zci4uCWuw2tUXFXi7hA8A0QzVd5WUKYGP9FxPf5dZCakfOaLVvdSeuo bYnMFgbFwxE+7yzB7UcMfEP0q+wDM643TZehI+6mYRO6DPONBIrBNm/1EoabasU5 T5gVUmde2a0= =JyBC -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
c9a50b9090
@ -509,6 +509,7 @@
|
|||||||
#define I2C_DEVICE_ID_GOODIX_01E8 0x01e8
|
#define I2C_DEVICE_ID_GOODIX_01E8 0x01e8
|
||||||
#define I2C_DEVICE_ID_GOODIX_01E9 0x01e9
|
#define I2C_DEVICE_ID_GOODIX_01E9 0x01e9
|
||||||
#define I2C_DEVICE_ID_GOODIX_01F0 0x01f0
|
#define I2C_DEVICE_ID_GOODIX_01F0 0x01f0
|
||||||
|
#define I2C_DEVICE_ID_GOODIX_0D42 0x0d42
|
||||||
|
|
||||||
#define USB_VENDOR_ID_GOODTOUCH 0x1aad
|
#define USB_VENDOR_ID_GOODTOUCH 0x1aad
|
||||||
#define USB_DEVICE_ID_GOODTOUCH_000f 0x000f
|
#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 0xc539
|
||||||
#define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1_1 0xc53f
|
#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_NANO_RECEIVER_POWERPLAY 0xc53a
|
||||||
|
#define USB_DEVICE_ID_LOGITECH_BOLT_RECEIVER 0xc548
|
||||||
#define USB_DEVICE_ID_SPACETRAVELLER 0xc623
|
#define USB_DEVICE_ID_SPACETRAVELLER 0xc623
|
||||||
#define USB_DEVICE_ID_SPACENAVIGATOR 0xc626
|
#define USB_DEVICE_ID_SPACENAVIGATOR 0xc626
|
||||||
#define USB_DEVICE_ID_DINOVO_DESKTOP 0xc704
|
#define USB_DEVICE_ID_DINOVO_DESKTOP 0xc704
|
||||||
|
@ -473,6 +473,7 @@ static int lenovo_input_mapping(struct hid_device *hdev,
|
|||||||
return lenovo_input_mapping_tp10_ultrabook_kbd(hdev, hi, field,
|
return lenovo_input_mapping_tp10_ultrabook_kbd(hdev, hi, field,
|
||||||
usage, bit, max);
|
usage, bit, max);
|
||||||
case USB_DEVICE_ID_LENOVO_X1_TAB:
|
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);
|
return lenovo_input_mapping_x1_tab_kbd(hdev, hi, field, usage, bit, max);
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
@ -583,6 +584,7 @@ static ssize_t attr_fn_lock_store(struct device *dev,
|
|||||||
break;
|
break;
|
||||||
case USB_DEVICE_ID_LENOVO_TP10UBKBD:
|
case USB_DEVICE_ID_LENOVO_TP10UBKBD:
|
||||||
case USB_DEVICE_ID_LENOVO_X1_TAB:
|
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);
|
ret = lenovo_led_set_tp10ubkbd(hdev, TP10UBKBD_FN_LOCK_LED, value);
|
||||||
if (ret)
|
if (ret)
|
||||||
return 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);
|
return lenovo_event_cptkbd(hdev, field, usage, value);
|
||||||
case USB_DEVICE_ID_LENOVO_TP10UBKBD:
|
case USB_DEVICE_ID_LENOVO_TP10UBKBD:
|
||||||
case USB_DEVICE_ID_LENOVO_X1_TAB:
|
case USB_DEVICE_ID_LENOVO_X1_TAB:
|
||||||
|
case USB_DEVICE_ID_LENOVO_X1_TAB3:
|
||||||
return lenovo_event_tp10ubkbd(hdev, field, usage, value);
|
return lenovo_event_tp10ubkbd(hdev, field, usage, value);
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
@ -1056,6 +1059,7 @@ static int lenovo_led_brightness_set(struct led_classdev *led_cdev,
|
|||||||
break;
|
break;
|
||||||
case USB_DEVICE_ID_LENOVO_TP10UBKBD:
|
case USB_DEVICE_ID_LENOVO_TP10UBKBD:
|
||||||
case USB_DEVICE_ID_LENOVO_X1_TAB:
|
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);
|
ret = lenovo_led_set_tp10ubkbd(hdev, tp10ubkbd_led[led_nr], value);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1286,6 +1290,7 @@ static int lenovo_probe(struct hid_device *hdev,
|
|||||||
break;
|
break;
|
||||||
case USB_DEVICE_ID_LENOVO_TP10UBKBD:
|
case USB_DEVICE_ID_LENOVO_TP10UBKBD:
|
||||||
case USB_DEVICE_ID_LENOVO_X1_TAB:
|
case USB_DEVICE_ID_LENOVO_X1_TAB:
|
||||||
|
case USB_DEVICE_ID_LENOVO_X1_TAB3:
|
||||||
ret = lenovo_probe_tp10ubkbd(hdev);
|
ret = lenovo_probe_tp10ubkbd(hdev);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -1372,6 +1377,7 @@ static void lenovo_remove(struct hid_device *hdev)
|
|||||||
break;
|
break;
|
||||||
case USB_DEVICE_ID_LENOVO_TP10UBKBD:
|
case USB_DEVICE_ID_LENOVO_TP10UBKBD:
|
||||||
case USB_DEVICE_ID_LENOVO_X1_TAB:
|
case USB_DEVICE_ID_LENOVO_X1_TAB:
|
||||||
|
case USB_DEVICE_ID_LENOVO_X1_TAB3:
|
||||||
lenovo_remove_tp10ubkbd(hdev);
|
lenovo_remove_tp10ubkbd(hdev);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1421,6 +1427,8 @@ static const struct hid_device_id lenovo_devices[] = {
|
|||||||
*/
|
*/
|
||||||
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
|
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
|
||||||
USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB) },
|
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) },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2146,6 +2146,10 @@ static const struct hid_device_id mt_devices[] = {
|
|||||||
HID_DEVICE(BUS_BLUETOOTH, HID_GROUP_MULTITOUCH_WIN_8,
|
HID_DEVICE(BUS_BLUETOOTH, HID_GROUP_MULTITOUCH_WIN_8,
|
||||||
USB_VENDOR_ID_LOGITECH,
|
USB_VENDOR_ID_LOGITECH,
|
||||||
USB_DEVICE_ID_LOGITECH_CASA_TOUCHPAD) },
|
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 */
|
/* MosArt panels */
|
||||||
{ .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
|
{ .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
|
||||||
|
@ -50,6 +50,7 @@
|
|||||||
#define I2C_HID_QUIRK_BAD_INPUT_SIZE BIT(3)
|
#define I2C_HID_QUIRK_BAD_INPUT_SIZE BIT(3)
|
||||||
#define I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET BIT(4)
|
#define I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET BIT(4)
|
||||||
#define I2C_HID_QUIRK_NO_SLEEP_ON_SUSPEND BIT(5)
|
#define I2C_HID_QUIRK_NO_SLEEP_ON_SUSPEND BIT(5)
|
||||||
|
#define I2C_HID_QUIRK_DELAY_WAKEUP_AFTER_RESUME BIT(6)
|
||||||
|
|
||||||
/* Command opcodes */
|
/* Command opcodes */
|
||||||
#define I2C_HID_OPCODE_RESET 0x01
|
#define I2C_HID_OPCODE_RESET 0x01
|
||||||
@ -140,6 +141,8 @@ static const struct i2c_hid_quirks {
|
|||||||
{ USB_VENDOR_ID_ELAN, HID_ANY_ID,
|
{ USB_VENDOR_ID_ELAN, HID_ANY_ID,
|
||||||
I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET |
|
I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET |
|
||||||
I2C_HID_QUIRK_BOGUS_IRQ },
|
I2C_HID_QUIRK_BOGUS_IRQ },
|
||||||
|
{ I2C_VENDOR_ID_GOODIX, I2C_DEVICE_ID_GOODIX_0D42,
|
||||||
|
I2C_HID_QUIRK_DELAY_WAKEUP_AFTER_RESUME },
|
||||||
{ 0, 0 }
|
{ 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -981,6 +984,13 @@ static int i2c_hid_core_resume(struct i2c_hid *ihid)
|
|||||||
return -ENXIO;
|
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
|
/* Instead of resetting device, simply powers the device on. This
|
||||||
* solves "incomplete reports" on Raydium devices 2386:3118 and
|
* solves "incomplete reports" on Raydium devices 2386:3118 and
|
||||||
* 2386:4B33 and fixes various SIS touchscreens no longer sending
|
* 2386:4B33 and fixes various SIS touchscreens no longer sending
|
||||||
|
Loading…
Reference in New Issue
Block a user