Skip to content

Commit c9a50b9

Browse files
committed
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
2 parents 3964f82 + 5126887 commit c9a50b9

File tree

4 files changed

+24
-0
lines changed

4 files changed

+24
-0
lines changed

drivers/hid/hid-ids.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,7 @@
509509
#define I2C_DEVICE_ID_GOODIX_01E8 0x01e8
510510
#define I2C_DEVICE_ID_GOODIX_01E9 0x01e9
511511
#define I2C_DEVICE_ID_GOODIX_01F0 0x01f0
512+
#define I2C_DEVICE_ID_GOODIX_0D42 0x0d42
512513

513514
#define USB_VENDOR_ID_GOODTOUCH 0x1aad
514515
#define USB_DEVICE_ID_GOODTOUCH_000f 0x000f
@@ -868,6 +869,7 @@
868869
#define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1 0xc539
869870
#define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1_1 0xc53f
870871
#define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_POWERPLAY 0xc53a
872+
#define USB_DEVICE_ID_LOGITECH_BOLT_RECEIVER 0xc548
871873
#define USB_DEVICE_ID_SPACETRAVELLER 0xc623
872874
#define USB_DEVICE_ID_SPACENAVIGATOR 0xc626
873875
#define USB_DEVICE_ID_DINOVO_DESKTOP 0xc704

drivers/hid/hid-lenovo.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,7 @@ static int lenovo_input_mapping(struct hid_device *hdev,
473473
return lenovo_input_mapping_tp10_ultrabook_kbd(hdev, hi, field,
474474
usage, bit, max);
475475
case USB_DEVICE_ID_LENOVO_X1_TAB:
476+
case USB_DEVICE_ID_LENOVO_X1_TAB3:
476477
return lenovo_input_mapping_x1_tab_kbd(hdev, hi, field, usage, bit, max);
477478
default:
478479
return 0;
@@ -583,6 +584,7 @@ static ssize_t attr_fn_lock_store(struct device *dev,
583584
break;
584585
case USB_DEVICE_ID_LENOVO_TP10UBKBD:
585586
case USB_DEVICE_ID_LENOVO_X1_TAB:
587+
case USB_DEVICE_ID_LENOVO_X1_TAB3:
586588
ret = lenovo_led_set_tp10ubkbd(hdev, TP10UBKBD_FN_LOCK_LED, value);
587589
if (ret)
588590
return ret;
@@ -776,6 +778,7 @@ static int lenovo_event(struct hid_device *hdev, struct hid_field *field,
776778
return lenovo_event_cptkbd(hdev, field, usage, value);
777779
case USB_DEVICE_ID_LENOVO_TP10UBKBD:
778780
case USB_DEVICE_ID_LENOVO_X1_TAB:
781+
case USB_DEVICE_ID_LENOVO_X1_TAB3:
779782
return lenovo_event_tp10ubkbd(hdev, field, usage, value);
780783
default:
781784
return 0;
@@ -1056,6 +1059,7 @@ static int lenovo_led_brightness_set(struct led_classdev *led_cdev,
10561059
break;
10571060
case USB_DEVICE_ID_LENOVO_TP10UBKBD:
10581061
case USB_DEVICE_ID_LENOVO_X1_TAB:
1062+
case USB_DEVICE_ID_LENOVO_X1_TAB3:
10591063
ret = lenovo_led_set_tp10ubkbd(hdev, tp10ubkbd_led[led_nr], value);
10601064
break;
10611065
}
@@ -1286,6 +1290,7 @@ static int lenovo_probe(struct hid_device *hdev,
12861290
break;
12871291
case USB_DEVICE_ID_LENOVO_TP10UBKBD:
12881292
case USB_DEVICE_ID_LENOVO_X1_TAB:
1293+
case USB_DEVICE_ID_LENOVO_X1_TAB3:
12891294
ret = lenovo_probe_tp10ubkbd(hdev);
12901295
break;
12911296
default:
@@ -1372,6 +1377,7 @@ static void lenovo_remove(struct hid_device *hdev)
13721377
break;
13731378
case USB_DEVICE_ID_LENOVO_TP10UBKBD:
13741379
case USB_DEVICE_ID_LENOVO_X1_TAB:
1380+
case USB_DEVICE_ID_LENOVO_X1_TAB3:
13751381
lenovo_remove_tp10ubkbd(hdev);
13761382
break;
13771383
}
@@ -1421,6 +1427,8 @@ static const struct hid_device_id lenovo_devices[] = {
14211427
*/
14221428
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
14231429
USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB) },
1430+
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
1431+
USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB3) },
14241432
{ }
14251433
};
14261434

drivers/hid/hid-multitouch.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2146,6 +2146,10 @@ static const struct hid_device_id mt_devices[] = {
21462146
HID_DEVICE(BUS_BLUETOOTH, HID_GROUP_MULTITOUCH_WIN_8,
21472147
USB_VENDOR_ID_LOGITECH,
21482148
USB_DEVICE_ID_LOGITECH_CASA_TOUCHPAD) },
2149+
{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
2150+
HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8,
2151+
USB_VENDOR_ID_LOGITECH,
2152+
USB_DEVICE_ID_LOGITECH_BOLT_RECEIVER) },
21492153

21502154
/* MosArt panels */
21512155
{ .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,

drivers/hid/i2c-hid/i2c-hid-core.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
#define I2C_HID_QUIRK_BAD_INPUT_SIZE BIT(3)
5151
#define I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET BIT(4)
5252
#define I2C_HID_QUIRK_NO_SLEEP_ON_SUSPEND BIT(5)
53+
#define I2C_HID_QUIRK_DELAY_WAKEUP_AFTER_RESUME BIT(6)
5354

5455
/* Command opcodes */
5556
#define I2C_HID_OPCODE_RESET 0x01
@@ -140,6 +141,8 @@ static const struct i2c_hid_quirks {
140141
{ USB_VENDOR_ID_ELAN, HID_ANY_ID,
141142
I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET |
142143
I2C_HID_QUIRK_BOGUS_IRQ },
144+
{ I2C_VENDOR_ID_GOODIX, I2C_DEVICE_ID_GOODIX_0D42,
145+
I2C_HID_QUIRK_DELAY_WAKEUP_AFTER_RESUME },
143146
{ 0, 0 }
144147
};
145148

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

987+
/* On Goodix 27c6:0d42 wait extra time before device wakeup.
988+
* It's not clear why but if we send wakeup too early, the device will
989+
* never trigger input interrupts.
990+
*/
991+
if (ihid->quirks & I2C_HID_QUIRK_DELAY_WAKEUP_AFTER_RESUME)
992+
msleep(1500);
993+
984994
/* Instead of resetting device, simply powers the device on. This
985995
* solves "incomplete reports" on Raydium devices 2386:3118 and
986996
* 2386:4B33 and fixes various SIS touchscreens no longer sending

0 commit comments

Comments
 (0)