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

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

Pull HID fixes from Jiri Kosina:

- memory leak fix in usbhid from Anirudh Rayabharam

- additions for a few new recognized generic key IDs from Dmitry
Torokhov

- Asus T101HA and Dell K15A quirks from Hans de Goede

- memory leak fix in amd_sfh from Basavaraj Natikar

- Win8 compatibility and Stylus fixes in multitouch driver from
Ahelenia Ziemiańska

- NULL pointer dereference fix in hid-magicmouse from Johan Hovold

- assorted other small fixes and device ID additions

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid: (33 commits)
HID: asus: Cleanup Asus T101HA keyboard-dock handling
HID: magicmouse: fix NULL-deref on disconnect
HID: intel-ish-hid: ipc: Add Alder Lake device IDs
HID: i2c-hid: fix format string mismatch
HID: amd_sfh: Fix memory leak in amd_sfh_work
HID: amd_sfh: Use devm_kzalloc() instead of kzalloc()
HID: ft260: improve error handling of ft260_hid_feature_report_get()
HID: magicmouse: fix crash when disconnecting Magic Trackpad 2
HID: gt683r: add missing MODULE_DEVICE_TABLE
HID: pidff: fix error return code in hid_pidff_init()
HID: logitech-hidpp: initialize level variable
HID: multitouch: Disable event reporting on suspend on the Asus T101HA touchpad
HID: core: Remove extraneous empty line before EXPORT_SYMBOL_GPL(hid_check_keys_pressed)
HID: hid-sensor-custom: Process failure of sensor_hub_set_feature()
HID: i2c-hid: Skip ELAN power-on command after reset
HID: usbhid: fix info leak in hid_submit_ctrl
HID: Add BUS_VIRTUAL to hid_connect logging
HID: multitouch: set Stylus suffix for Stylus-application devices, too
HID: multitouch: require Finger field to mark Win8 reports as MT
HID: remove the unnecessary redefinition of a macro
...

+206 -70
+17 -2
drivers/hid/Kconfig
··· 93 93 depends on HID 94 94 95 95 config HID_A4TECH 96 - tristate "A4 tech mice" 96 + tristate "A4TECH mice" 97 97 depends on HID 98 98 default !EXPERT 99 99 help 100 - Support for A4 tech X5 and WOP-35 / Trust 450L mice. 100 + Support for some A4TECH mice with two scroll wheels. 101 101 102 102 config HID_ACCUTOUCH 103 103 tristate "Accutouch touch device" ··· 921 921 depends on HID 922 922 help 923 923 Support for Samsung InfraRed remote control or keyboards. 924 + 925 + config HID_SEMITEK 926 + tristate "Semitek USB keyboards" 927 + depends on HID 928 + help 929 + Support for Semitek USB keyboards that are not fully compliant 930 + with the HID standard. 931 + 932 + There are many variants, including: 933 + - GK61, GK64, GK68, GK84, GK96, etc. 934 + - SK61, SK64, SK68, SK84, SK96, etc. 935 + - Dierya DK61/DK66 936 + - Tronsmart TK09R 937 + - Woo-dy 938 + - X-Bows Nature/Knight 924 939 925 940 config HID_SONY 926 941 tristate "Sony PS2/3/4 accessories"
+1
drivers/hid/Makefile
··· 106 106 obj-$(CONFIG_HID_RMI) += hid-rmi.o 107 107 obj-$(CONFIG_HID_SAITEK) += hid-saitek.o 108 108 obj-$(CONFIG_HID_SAMSUNG) += hid-samsung.o 109 + obj-$(CONFIG_HID_SEMITEK) += hid-semitek.o 109 110 obj-$(CONFIG_HID_SMARTJOYPLUS) += hid-sjoy.o 110 111 obj-$(CONFIG_HID_SONY) += hid-sony.o 111 112 obj-$(CONFIG_HID_SPEEDLINK) += hid-speedlink.o
+10 -9
drivers/hid/amd-sfh-hid/amd_sfh_client.c
··· 88 88 sensor_index = req_node->sensor_idx; 89 89 report_id = req_node->report_id; 90 90 node_type = req_node->report_type; 91 + kfree(req_node); 91 92 92 93 if (node_type == HID_FEATURE_REPORT) { 93 94 report_size = get_feature_report(sensor_index, report_id, ··· 143 142 int rc, i; 144 143 145 144 dev = &privdata->pdev->dev; 146 - cl_data = kzalloc(sizeof(*cl_data), GFP_KERNEL); 145 + cl_data = devm_kzalloc(dev, sizeof(*cl_data), GFP_KERNEL); 147 146 if (!cl_data) 148 147 return -ENOMEM; 149 148 ··· 176 175 rc = -EINVAL; 177 176 goto cleanup; 178 177 } 179 - cl_data->feature_report[i] = kzalloc(feature_report_size, GFP_KERNEL); 178 + cl_data->feature_report[i] = devm_kzalloc(dev, feature_report_size, GFP_KERNEL); 180 179 if (!cl_data->feature_report[i]) { 181 180 rc = -ENOMEM; 182 181 goto cleanup; 183 182 } 184 - cl_data->input_report[i] = kzalloc(input_report_size, GFP_KERNEL); 183 + cl_data->input_report[i] = devm_kzalloc(dev, input_report_size, GFP_KERNEL); 185 184 if (!cl_data->input_report[i]) { 186 185 rc = -ENOMEM; 187 186 goto cleanup; ··· 190 189 info.sensor_idx = cl_idx; 191 190 info.dma_address = cl_data->sensor_dma_addr[i]; 192 191 193 - cl_data->report_descr[i] = kzalloc(cl_data->report_descr_sz[i], GFP_KERNEL); 192 + cl_data->report_descr[i] = 193 + devm_kzalloc(dev, cl_data->report_descr_sz[i], GFP_KERNEL); 194 194 if (!cl_data->report_descr[i]) { 195 195 rc = -ENOMEM; 196 196 goto cleanup; ··· 216 214 cl_data->sensor_virt_addr[i], 217 215 cl_data->sensor_dma_addr[i]); 218 216 } 219 - kfree(cl_data->feature_report[i]); 220 - kfree(cl_data->input_report[i]); 221 - kfree(cl_data->report_descr[i]); 217 + devm_kfree(dev, cl_data->feature_report[i]); 218 + devm_kfree(dev, cl_data->input_report[i]); 219 + devm_kfree(dev, cl_data->report_descr[i]); 222 220 } 223 - kfree(cl_data); 221 + devm_kfree(dev, cl_data); 224 222 return rc; 225 223 } 226 224 ··· 243 241 cl_data->sensor_dma_addr[i]); 244 242 } 245 243 } 246 - kfree(cl_data); 247 244 return 0; 248 245 }
-3
drivers/hid/amd-sfh-hid/amd_sfh_hid.c
··· 162 162 int i; 163 163 164 164 for (i = 0; i < cli_data->num_hid_devices; ++i) { 165 - kfree(cli_data->feature_report[i]); 166 - kfree(cli_data->input_report[i]); 167 - kfree(cli_data->report_descr[i]); 168 165 if (cli_data->hid_sensor_hubs[i]) { 169 166 kfree(cli_data->hid_sensor_hubs[i]->driver_data); 170 167 hid_destroy_device(cli_data->hid_sensor_hubs[i]);
+2
drivers/hid/hid-a4tech.c
··· 147 147 .driver_data = A4_2WHEEL_MOUSE_HACK_B8 }, 148 148 { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_RP_649), 149 149 .driver_data = A4_2WHEEL_MOUSE_HACK_B8 }, 150 + { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_NB_95), 151 + .driver_data = A4_2WHEEL_MOUSE_HACK_B8 }, 150 152 { } 151 153 }; 152 154 MODULE_DEVICE_TABLE(hid, a4_devices);
+20 -12
drivers/hid/hid-asus.c
··· 79 79 #define QUIRK_T100_KEYBOARD BIT(6) 80 80 #define QUIRK_T100CHI BIT(7) 81 81 #define QUIRK_G752_KEYBOARD BIT(8) 82 - #define QUIRK_T101HA_DOCK BIT(9) 83 - #define QUIRK_T90CHI BIT(10) 84 - #define QUIRK_MEDION_E1239T BIT(11) 85 - #define QUIRK_ROG_NKEY_KEYBOARD BIT(12) 82 + #define QUIRK_T90CHI BIT(9) 83 + #define QUIRK_MEDION_E1239T BIT(10) 84 + #define QUIRK_ROG_NKEY_KEYBOARD BIT(11) 86 85 87 86 #define I2C_KEYBOARD_QUIRKS (QUIRK_FIX_NOTEBOOK_REPORT | \ 88 87 QUIRK_NO_INIT_REPORTS | \ ··· 334 335 if (drvdata->quirks & QUIRK_MEDION_E1239T) 335 336 return asus_e1239t_event(drvdata, data, size); 336 337 337 - if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD) { 338 + if (drvdata->quirks & QUIRK_USE_KBD_BACKLIGHT) { 338 339 /* 339 340 * Skip these report ID, the device emits a continuous stream associated 340 341 * with the AURA mode it is in which looks like an 'echo'. ··· 354 355 return -1; 355 356 } 356 357 } 358 + if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD) { 359 + /* 360 + * G713 and G733 send these codes on some keypresses, depending on 361 + * the key pressed it can trigger a shutdown event if not caught. 362 + */ 363 + if(data[0] == 0x02 && data[1] == 0x30) { 364 + return -1; 365 + } 366 + } 367 + 357 368 } 358 369 359 370 return 0; ··· 1081 1072 return ret; 1082 1073 } 1083 1074 1084 - /* use hid-multitouch for T101HA touchpad */ 1085 - if (id->driver_data & QUIRK_T101HA_DOCK && 1086 - hdev->collection->usage == HID_GD_MOUSE) 1087 - return -ENODEV; 1088 - 1089 1075 ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); 1090 1076 if (ret) { 1091 1077 hid_err(hdev, "Asus hw start failed: %d\n", ret); ··· 1234 1230 { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, 1235 1231 USB_DEVICE_ID_ASUSTEK_T100TAF_KEYBOARD), 1236 1232 QUIRK_T100_KEYBOARD | QUIRK_NO_CONSUMER_USAGES }, 1237 - { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, 1238 - USB_DEVICE_ID_ASUSTEK_T101HA_KEYBOARD), QUIRK_T101HA_DOCK }, 1239 1233 { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_ASUS_AK1D) }, 1240 1234 { HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_ASUS_MD_5110) }, 1241 1235 { HID_USB_DEVICE(USB_VENDOR_ID_JESS, USB_DEVICE_ID_ASUS_MD_5112) }, ··· 1241 1239 USB_DEVICE_ID_ASUSTEK_T100CHI_KEYBOARD), QUIRK_T100CHI }, 1242 1240 { HID_USB_DEVICE(USB_VENDOR_ID_ITE, USB_DEVICE_ID_ITE_MEDION_E1239T), 1243 1241 QUIRK_MEDION_E1239T }, 1242 + /* 1243 + * Note bind to the HID_GROUP_GENERIC group, so that we only bind to the keyboard 1244 + * part, while letting hid-multitouch.c handle the touchpad. 1245 + */ 1246 + { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, 1247 + USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_T101HA_KEYBOARD) }, 1244 1248 { } 1245 1249 }; 1246 1250 MODULE_DEVICE_TABLE(hid, asus_devices);
+3 -1
drivers/hid/hid-core.c
··· 2005 2005 case BUS_I2C: 2006 2006 bus = "I2C"; 2007 2007 break; 2008 + case BUS_VIRTUAL: 2009 + bus = "VIRTUAL"; 2010 + break; 2008 2011 default: 2009 2012 bus = "<UNKNOWN>"; 2010 2013 } ··· 2591 2588 2592 2589 return 0; 2593 2590 } 2594 - 2595 2591 EXPORT_SYMBOL_GPL(hid_check_keys_pressed); 2596 2592 2597 2593 static int __init hid_init(void)
+3
drivers/hid/hid-debug.c
··· 930 930 [KEY_APPSELECT] = "AppSelect", 931 931 [KEY_SCREENSAVER] = "ScreenSaver", 932 932 [KEY_VOICECOMMAND] = "VoiceCommand", 933 + [KEY_ASSISTANT] = "Assistant", 934 + [KEY_KBD_LAYOUT_NEXT] = "KbdLayoutNext", 935 + [KEY_EMOJI_PICKER] = "EmojiPicker", 933 936 [KEY_BRIGHTNESS_MIN] = "BrightnessMin", 934 937 [KEY_BRIGHTNESS_MAX] = "BrightnessMax", 935 938 [KEY_BRIGHTNESS_AUTO] = "BrightnessAuto",
+16 -13
drivers/hid/hid-ft260.c
··· 201 201 u8 address; /* 7-bit I2C address */ 202 202 u8 flag; /* I2C transaction condition */ 203 203 u8 length; /* data payload length */ 204 - u8 data[60]; /* data payload */ 204 + u8 data[FT260_WR_DATA_MAX]; /* data payload */ 205 205 } __packed; 206 206 207 207 struct ft260_i2c_read_request_report { ··· 249 249 250 250 ret = hid_hw_raw_request(hdev, report_id, buf, len, HID_FEATURE_REPORT, 251 251 HID_REQ_GET_REPORT); 252 - memcpy(data, buf, len); 252 + if (likely(ret == len)) 253 + memcpy(data, buf, len); 254 + else if (ret >= 0) 255 + ret = -EIO; 253 256 kfree(buf); 254 257 return ret; 255 258 } ··· 301 298 302 299 ret = ft260_hid_feature_report_get(hdev, FT260_I2C_STATUS, 303 300 (u8 *)&report, sizeof(report)); 304 - if (ret < 0) { 301 + if (unlikely(ret < 0)) { 305 302 hid_err(hdev, "failed to retrieve status: %d\n", ret); 306 303 return ret; 307 304 } ··· 431 428 432 429 struct ft260_i2c_write_request_report *rep = 433 430 (struct ft260_i2c_write_request_report *)dev->write_buf; 431 + 432 + if (data_len >= sizeof(rep->data)) 433 + return -EINVAL; 434 434 435 435 rep->address = addr; 436 436 rep->data[0] = cmd; ··· 727 721 728 722 ret = ft260_hid_feature_report_get(hdev, FT260_SYSTEM_SETTINGS, 729 723 (u8 *)cfg, len); 730 - if (ret != len) { 724 + if (ret < 0) { 731 725 hid_err(hdev, "failed to retrieve system status\n"); 732 - if (ret >= 0) 733 - return -EIO; 726 + return ret; 734 727 } 735 728 return 0; 736 729 } ··· 782 777 int ret; 783 778 784 779 ret = ft260_hid_feature_report_get(hdev, id, cfg, len); 785 - if (ret != len && ret >= 0) 786 - return -EIO; 780 + if (ret < 0) 781 + return ret; 787 782 788 783 return scnprintf(buf, PAGE_SIZE, "%hi\n", *field); 789 784 } ··· 794 789 int ret; 795 790 796 791 ret = ft260_hid_feature_report_get(hdev, id, cfg, len); 797 - if (ret != len && ret >= 0) 798 - return -EIO; 792 + if (ret < 0) 793 + return ret; 799 794 800 795 return scnprintf(buf, PAGE_SIZE, "%hi\n", le16_to_cpu(*field)); 801 796 } ··· 946 941 947 942 ret = ft260_hid_feature_report_get(hdev, FT260_CHIP_VERSION, 948 943 (u8 *)&version, sizeof(version)); 949 - if (ret != sizeof(version)) { 944 + if (ret < 0) { 950 945 hid_err(hdev, "failed to retrieve chip version\n"); 951 - if (ret >= 0) 952 - ret = -EIO; 953 946 goto err_hid_close; 954 947 } 955 948
+1
drivers/hid/hid-gt683r.c
··· 54 54 { HID_USB_DEVICE(USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL) }, 55 55 { } 56 56 }; 57 + MODULE_DEVICE_TABLE(hid, gt683r_led_id); 57 58 58 59 static void gt683r_brightness_set(struct led_classdev *led_cdev, 59 60 enum led_brightness brightness)
+7 -2
drivers/hid/hid-ids.h
··· 26 26 #define USB_DEVICE_ID_A4TECH_WCP32PU 0x0006 27 27 #define USB_DEVICE_ID_A4TECH_X5_005D 0x000a 28 28 #define USB_DEVICE_ID_A4TECH_RP_649 0x001a 29 + #define USB_DEVICE_ID_A4TECH_NB_95 0x022b 29 30 30 31 #define USB_VENDOR_ID_AASHIMA 0x06d6 31 32 #define USB_DEVICE_ID_AASHIMA_GAMEPAD 0x0025 ··· 300 299 301 300 #define USB_VENDOR_ID_CORSAIR 0x1b1c 302 301 #define USB_DEVICE_ID_CORSAIR_K90 0x1b02 303 - 304 - #define USB_VENDOR_ID_CORSAIR 0x1b1c 305 302 #define USB_DEVICE_ID_CORSAIR_K70R 0x1b09 306 303 #define USB_DEVICE_ID_CORSAIR_K95RGB 0x1b11 307 304 #define USB_DEVICE_ID_CORSAIR_M65RGB 0x1b12 ··· 750 751 #define USB_DEVICE_ID_LENOVO_X1_COVER 0x6085 751 752 #define USB_DEVICE_ID_LENOVO_X1_TAB 0x60a3 752 753 #define USB_DEVICE_ID_LENOVO_X1_TAB3 0x60b5 754 + #define USB_DEVICE_ID_LENOVO_OPTICAL_USB_MOUSE_600E 0x600e 753 755 #define USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_608D 0x608d 754 756 #define USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_6019 0x6019 755 757 #define USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_602E 0x602e ··· 1051 1051 #define USB_DEVICE_ID_SAITEK_X52 0x075c 1052 1052 #define USB_DEVICE_ID_SAITEK_X52_2 0x0255 1053 1053 #define USB_DEVICE_ID_SAITEK_X52_PRO 0x0762 1054 + #define USB_DEVICE_ID_SAITEK_X65 0x0b6a 1054 1055 1055 1056 #define USB_VENDOR_ID_SAMSUNG 0x0419 1056 1057 #define USB_DEVICE_ID_SAMSUNG_IR_REMOTE 0x0001 ··· 1060 1059 #define USB_VENDOR_ID_SEMICO 0x1a2c 1061 1060 #define USB_DEVICE_ID_SEMICO_USB_KEYKOARD 0x0023 1062 1061 #define USB_DEVICE_ID_SEMICO_USB_KEYKOARD2 0x0027 1062 + 1063 + #define USB_VENDOR_ID_SEMITEK 0x1ea7 1064 + #define USB_DEVICE_ID_SEMITEK_KEYBOARD 0x0907 1063 1065 1064 1066 #define USB_VENDOR_ID_SENNHEISER 0x1395 1065 1067 #define USB_DEVICE_ID_SENNHEISER_BTD500USB 0x002c ··· 1165 1161 #define USB_DEVICE_ID_SYNAPTICS_DELL_K12A 0x2819 1166 1162 #define USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012 0x2968 1167 1163 #define USB_DEVICE_ID_SYNAPTICS_TP_V103 0x5710 1164 + #define USB_DEVICE_ID_SYNAPTICS_DELL_K15A 0x6e21 1168 1165 #define USB_DEVICE_ID_SYNAPTICS_ACER_ONE_S1002 0x73f4 1169 1166 #define USB_DEVICE_ID_SYNAPTICS_ACER_ONE_S1003 0x73f5 1170 1167 #define USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5 0x81a7
+3
drivers/hid/hid-input.c
··· 964 964 965 965 case 0x0cd: map_key_clear(KEY_PLAYPAUSE); break; 966 966 case 0x0cf: map_key_clear(KEY_VOICECOMMAND); break; 967 + 968 + case 0x0d9: map_key_clear(KEY_EMOJI_PICKER); break; 969 + 967 970 case 0x0e0: map_abs_clear(ABS_VOLUME); break; 968 971 case 0x0e2: map_key_clear(KEY_MUTE); break; 969 972 case 0x0e5: map_key_clear(KEY_BASSBOOST); break;
+1
drivers/hid/hid-logitech-hidpp.c
··· 1263 1263 int status; 1264 1264 1265 1265 long flags = (long) data[2]; 1266 + *level = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN; 1266 1267 1267 1268 if (flags & 0x80) 1268 1269 switch (flags & 0x07) {
+5 -2
drivers/hid/hid-magicmouse.c
··· 693 693 if (id->vendor == USB_VENDOR_ID_APPLE && 694 694 id->product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD2 && 695 695 hdev->type != HID_TYPE_USBMOUSE) 696 - return 0; 696 + return -ENODEV; 697 697 698 698 msc = devm_kzalloc(&hdev->dev, sizeof(*msc), GFP_KERNEL); 699 699 if (msc == NULL) { ··· 779 779 static void magicmouse_remove(struct hid_device *hdev) 780 780 { 781 781 struct magicmouse_sc *msc = hid_get_drvdata(hdev); 782 - cancel_delayed_work_sync(&msc->work); 782 + 783 + if (msc) 784 + cancel_delayed_work_sync(&msc->work); 785 + 783 786 hid_hw_stop(hdev); 784 787 } 785 788
+37 -9
drivers/hid/hid-multitouch.c
··· 70 70 #define MT_QUIRK_WIN8_PTP_BUTTONS BIT(18) 71 71 #define MT_QUIRK_SEPARATE_APP_REPORT BIT(19) 72 72 #define MT_QUIRK_FORCE_MULTI_INPUT BIT(20) 73 + #define MT_QUIRK_DISABLE_WAKEUP BIT(21) 73 74 74 75 #define MT_INPUTMODE_TOUCHSCREEN 0x02 75 76 #define MT_INPUTMODE_TOUCHPAD 0x03 ··· 192 191 #define MT_CLS_EXPORT_ALL_INPUTS 0x0013 193 192 /* reserved 0x0014 */ 194 193 #define MT_CLS_WIN_8_FORCE_MULTI_INPUT 0x0015 194 + #define MT_CLS_WIN_8_DISABLE_WAKEUP 0x0016 195 195 196 196 /* vendor specific classes */ 197 197 #define MT_CLS_3M 0x0101 ··· 284 282 MT_QUIRK_STICKY_FINGERS | 285 283 MT_QUIRK_WIN8_PTP_BUTTONS | 286 284 MT_QUIRK_FORCE_MULTI_INPUT, 285 + .export_all_inputs = true }, 286 + { .name = MT_CLS_WIN_8_DISABLE_WAKEUP, 287 + .quirks = MT_QUIRK_ALWAYS_VALID | 288 + MT_QUIRK_IGNORE_DUPLICATES | 289 + MT_QUIRK_HOVERING | 290 + MT_QUIRK_CONTACT_CNT_ACCURATE | 291 + MT_QUIRK_STICKY_FINGERS | 292 + MT_QUIRK_WIN8_PTP_BUTTONS | 293 + MT_QUIRK_DISABLE_WAKEUP, 287 294 .export_all_inputs = true }, 288 295 289 296 /* ··· 615 604 if (!(HID_MAIN_ITEM_VARIABLE & field->flags)) 616 605 continue; 617 606 618 - for (n = 0; n < field->report_count; n++) { 619 - if (field->usage[n].hid == HID_DG_CONTACTID) 620 - rdata->is_mt_collection = true; 607 + if (field->logical == HID_DG_FINGER || td->hdev->group != HID_GROUP_MULTITOUCH_WIN_8) { 608 + for (n = 0; n < field->report_count; n++) { 609 + if (field->usage[n].hid == HID_DG_CONTACTID) { 610 + rdata->is_mt_collection = true; 611 + break; 612 + } 613 + } 621 614 } 622 615 } 623 616 ··· 774 759 return 1; 775 760 case HID_DG_CONFIDENCE: 776 761 if ((cls->name == MT_CLS_WIN_8 || 777 - cls->name == MT_CLS_WIN_8_FORCE_MULTI_INPUT) && 762 + cls->name == MT_CLS_WIN_8_FORCE_MULTI_INPUT || 763 + cls->name == MT_CLS_WIN_8_DISABLE_WAKEUP) && 778 764 (field->application == HID_DG_TOUCHPAD || 779 765 field->application == HID_DG_TOUCHSCREEN)) 780 766 app->quirks |= MT_QUIRK_CONFIDENCE; ··· 1592 1576 /* we do not set suffix = "Touchscreen" */ 1593 1577 hi->input->name = hdev->name; 1594 1578 break; 1595 - case HID_DG_STYLUS: 1596 - /* force BTN_STYLUS to allow tablet matching in udev */ 1597 - __set_bit(BTN_STYLUS, hi->input->keybit); 1598 - break; 1599 1579 case HID_VD_ASUS_CUSTOM_MEDIA_KEYS: 1600 1580 suffix = "Custom Media Keys"; 1601 1581 break; 1582 + case HID_DG_STYLUS: 1583 + /* force BTN_STYLUS to allow tablet matching in udev */ 1584 + __set_bit(BTN_STYLUS, hi->input->keybit); 1585 + fallthrough; 1602 1586 case HID_DG_PEN: 1603 1587 suffix = "Stylus"; 1604 1588 break; ··· 1765 1749 #ifdef CONFIG_PM 1766 1750 static int mt_suspend(struct hid_device *hdev, pm_message_t state) 1767 1751 { 1752 + struct mt_device *td = hid_get_drvdata(hdev); 1753 + 1768 1754 /* High latency is desirable for power savings during S3/S0ix */ 1769 - mt_set_modes(hdev, HID_LATENCY_HIGH, true, true); 1755 + if (td->mtclass.quirks & MT_QUIRK_DISABLE_WAKEUP) 1756 + mt_set_modes(hdev, HID_LATENCY_HIGH, false, false); 1757 + else 1758 + mt_set_modes(hdev, HID_LATENCY_HIGH, true, true); 1759 + 1770 1760 return 0; 1771 1761 } 1772 1762 ··· 1830 1808 { .driver_data = MT_CLS_EXPORT_ALL_INPUTS, 1831 1809 MT_USB_DEVICE(USB_VENDOR_ID_ANTON, 1832 1810 USB_DEVICE_ID_ANTON_TOUCH_PAD) }, 1811 + 1812 + /* Asus T101HA */ 1813 + { .driver_data = MT_CLS_WIN_8_DISABLE_WAKEUP, 1814 + HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8, 1815 + USB_VENDOR_ID_ASUSTEK, 1816 + USB_DEVICE_ID_ASUSTEK_T101HA_KEYBOARD) }, 1833 1817 1834 1818 /* Asus T304UA */ 1835 1819 { .driver_data = MT_CLS_ASUS,
+4
drivers/hid/hid-quirks.c
··· 110 110 { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_PENSKETCH_M912), HID_QUIRK_MULTI_INPUT }, 111 111 { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M406XE), HID_QUIRK_MULTI_INPUT }, 112 112 { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_PIXART_USB_OPTICAL_MOUSE_ID2), HID_QUIRK_ALWAYS_POLL }, 113 + { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_OPTICAL_USB_MOUSE_600E), HID_QUIRK_ALWAYS_POLL }, 113 114 { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_608D), HID_QUIRK_ALWAYS_POLL }, 114 115 { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_6019), HID_QUIRK_ALWAYS_POLL }, 115 116 { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_602E), HID_QUIRK_ALWAYS_POLL }, ··· 159 158 { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_X52), HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE }, 160 159 { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_X52_2), HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE }, 161 160 { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_X52_PRO), HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE }, 161 + { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_X65), HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE }, 162 162 { HID_USB_DEVICE(USB_VENDOR_ID_SEMICO, USB_DEVICE_ID_SEMICO_USB_KEYKOARD2), HID_QUIRK_NO_INIT_REPORTS }, 163 163 { HID_USB_DEVICE(USB_VENDOR_ID_SEMICO, USB_DEVICE_ID_SEMICO_USB_KEYKOARD), HID_QUIRK_NO_INIT_REPORTS }, 164 164 { HID_USB_DEVICE(USB_VENDOR_ID_SENNHEISER, USB_DEVICE_ID_SENNHEISER_BTD500USB), HID_QUIRK_NOGET }, ··· 178 176 { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_QUAD_HD), HID_QUIRK_NO_INIT_REPORTS }, 179 177 { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_TP_V103), HID_QUIRK_NO_INIT_REPORTS }, 180 178 { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_DELL_K12A), HID_QUIRK_NO_INIT_REPORTS }, 179 + { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_DELL_K15A), HID_QUIRK_NO_INIT_REPORTS }, 181 180 { HID_USB_DEVICE(USB_VENDOR_ID_TOPMAX, USB_DEVICE_ID_TOPMAX_COBRAPAD), HID_QUIRK_BADPAD }, 182 181 { HID_USB_DEVICE(USB_VENDOR_ID_TOUCHPACK, USB_DEVICE_ID_TOUCHPACK_RTS), HID_QUIRK_MULTI_INPUT }, 183 182 { HID_USB_DEVICE(USB_VENDOR_ID_TPV, USB_DEVICE_ID_TPV_OPTICAL_TOUCHSCREEN_8882), HID_QUIRK_NOGET }, ··· 214 211 { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) }, 215 212 { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) }, 216 213 { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_RP_649) }, 214 + { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_NB_95) }, 217 215 #endif 218 216 #if IS_ENABLED(CONFIG_HID_ACCUTOUCH) 219 217 { HID_USB_DEVICE(USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_ACCUTOUCH_2216) },
+40
drivers/hid/hid-semitek.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-or-later 2 + /* 3 + * HID driver for Semitek keyboards 4 + * 5 + * Copyright (c) 2021 Benjamin Moody 6 + */ 7 + 8 + #include <linux/device.h> 9 + #include <linux/hid.h> 10 + #include <linux/module.h> 11 + 12 + #include "hid-ids.h" 13 + 14 + static __u8 *semitek_report_fixup(struct hid_device *hdev, __u8 *rdesc, 15 + unsigned int *rsize) 16 + { 17 + /* In the report descriptor for interface 2, fix the incorrect 18 + description of report ID 0x04 (the report contains a 19 + bitmask, not an array of keycodes.) */ 20 + if (*rsize == 0xcb && rdesc[0x83] == 0x81 && rdesc[0x84] == 0x00) { 21 + hid_info(hdev, "fixing up Semitek report descriptor\n"); 22 + rdesc[0x84] = 0x02; 23 + } 24 + return rdesc; 25 + } 26 + 27 + static const struct hid_device_id semitek_devices[] = { 28 + { HID_USB_DEVICE(USB_VENDOR_ID_SEMITEK, USB_DEVICE_ID_SEMITEK_KEYBOARD) }, 29 + { } 30 + }; 31 + MODULE_DEVICE_TABLE(hid, semitek_devices); 32 + 33 + static struct hid_driver semitek_driver = { 34 + .name = "semitek", 35 + .id_table = semitek_devices, 36 + .report_fixup = semitek_report_fixup, 37 + }; 38 + module_hid_driver(semitek_driver); 39 + 40 + MODULE_LICENSE("GPL");
+5 -3
drivers/hid/hid-sensor-custom.c
··· 387 387 struct hid_sensor_custom *sensor_inst = dev_get_drvdata(dev); 388 388 int index, field_index, usage; 389 389 char name[HID_CUSTOM_NAME_LENGTH]; 390 - int value; 390 + int value, ret; 391 391 392 392 if (sscanf(attr->attr.name, "feature-%x-%x-%s", &index, &usage, 393 393 name) == 3) { ··· 403 403 404 404 report_id = sensor_inst->fields[field_index].attribute. 405 405 report_id; 406 - sensor_hub_set_feature(sensor_inst->hsdev, report_id, 407 - index, sizeof(value), &value); 406 + ret = sensor_hub_set_feature(sensor_inst->hsdev, report_id, 407 + index, sizeof(value), &value); 408 + if (ret) 409 + return ret; 408 410 } else 409 411 return -EINVAL; 410 412
+9 -4
drivers/hid/hid-sensor-hub.c
··· 209 209 buffer_size = buffer_size / sizeof(__s32); 210 210 if (buffer_size) { 211 211 for (i = 0; i < buffer_size; ++i) { 212 - hid_set_field(report->field[field_index], i, 213 - (__force __s32)cpu_to_le32(*buf32)); 212 + ret = hid_set_field(report->field[field_index], i, 213 + (__force __s32)cpu_to_le32(*buf32)); 214 + if (ret) 215 + goto done_proc; 216 + 214 217 ++buf32; 215 218 } 216 219 } 217 220 if (remaining_bytes) { 218 221 value = 0; 219 222 memcpy(&value, (u8 *)buf32, remaining_bytes); 220 - hid_set_field(report->field[field_index], i, 221 - (__force __s32)cpu_to_le32(value)); 223 + ret = hid_set_field(report->field[field_index], i, 224 + (__force __s32)cpu_to_le32(value)); 225 + if (ret) 226 + goto done_proc; 222 227 } 223 228 hid_hw_request(hsdev->hdev, report, HID_REQ_SET_REPORT); 224 229 hid_hw_wait(hsdev->hdev);
+1 -1
drivers/hid/hid-thrustmaster.c
··· 312 312 } 313 313 314 314 tm_wheel->change_request = kzalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL); 315 - if (!tm_wheel->model_request) { 315 + if (!tm_wheel->change_request) { 316 316 ret = -ENOMEM; 317 317 goto error5; 318 318 }
+10 -3
drivers/hid/i2c-hid/i2c-hid-core.c
··· 45 45 #define I2C_HID_QUIRK_BOGUS_IRQ BIT(4) 46 46 #define I2C_HID_QUIRK_RESET_ON_RESUME BIT(5) 47 47 #define I2C_HID_QUIRK_BAD_INPUT_SIZE BIT(6) 48 + #define I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET BIT(7) 48 49 49 50 50 51 /* flags */ ··· 179 178 I2C_HID_QUIRK_RESET_ON_RESUME }, 180 179 { USB_VENDOR_ID_ITE, I2C_DEVICE_ID_ITE_LENOVO_LEGION_Y720, 181 180 I2C_HID_QUIRK_BAD_INPUT_SIZE }, 181 + /* 182 + * Sending the wakeup after reset actually break ELAN touchscreen controller 183 + */ 184 + { USB_VENDOR_ID_ELAN, HID_ANY_ID, 185 + I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET }, 182 186 { 0, 0 } 183 187 }; 184 188 ··· 467 461 } 468 462 469 463 /* At least some SIS devices need this after reset */ 470 - ret = i2c_hid_set_power(client, I2C_HID_PWR_ON); 464 + if (!(ihid->quirks & I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET)) 465 + ret = i2c_hid_set_power(client, I2C_HID_PWR_ON); 471 466 472 467 out_unlock: 473 468 mutex_unlock(&ihid->reset_lock); ··· 997 990 hid->vendor = le16_to_cpu(ihid->hdesc.wVendorID); 998 991 hid->product = le16_to_cpu(ihid->hdesc.wProductID); 999 992 1000 - snprintf(hid->name, sizeof(hid->name), "%s %04hX:%04hX", 1001 - client->name, hid->vendor, hid->product); 993 + snprintf(hid->name, sizeof(hid->name), "%s %04X:%04X", 994 + client->name, (u16)hid->vendor, (u16)hid->product); 1002 995 strlcpy(hid->phys, dev_name(&client->dev), sizeof(hid->phys)); 1003 996 1004 997 ihid->quirks = i2c_hid_lookup_quirk(hid->vendor, hid->product);
+2
drivers/hid/intel-ish-hid/ipc/hw-ish.h
··· 28 28 #define EHL_Ax_DEVICE_ID 0x4BB3 29 29 #define TGL_LP_DEVICE_ID 0xA0FC 30 30 #define TGL_H_DEVICE_ID 0x43FC 31 + #define ADL_S_DEVICE_ID 0x7AF8 32 + #define ADL_P_DEVICE_ID 0x51FC 31 33 32 34 #define REVISION_ID_CHT_A0 0x6 33 35 #define REVISION_ID_CHT_Ax_SI 0x0
+2
drivers/hid/intel-ish-hid/ipc/pci-ish.c
··· 39 39 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, EHL_Ax_DEVICE_ID)}, 40 40 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, TGL_LP_DEVICE_ID)}, 41 41 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, TGL_H_DEVICE_ID)}, 42 + {PCI_DEVICE(PCI_VENDOR_ID_INTEL, ADL_S_DEVICE_ID)}, 43 + {PCI_DEVICE(PCI_VENDOR_ID_INTEL, ADL_P_DEVICE_ID)}, 42 44 {0, } 43 45 }; 44 46 MODULE_DEVICE_TABLE(pci, ish_pci_tbl);
+3 -3
drivers/hid/surface-hid/surface_hid_core.c
··· 168 168 169 169 shid->hid->dev.parent = shid->dev; 170 170 shid->hid->bus = BUS_HOST; 171 - shid->hid->vendor = cpu_to_le16(shid->attrs.vendor); 172 - shid->hid->product = cpu_to_le16(shid->attrs.product); 173 - shid->hid->version = cpu_to_le16(shid->hid_desc.hid_version); 171 + shid->hid->vendor = get_unaligned_le16(&shid->attrs.vendor); 172 + shid->hid->product = get_unaligned_le16(&shid->attrs.product); 173 + shid->hid->version = get_unaligned_le16(&shid->hid_desc.hid_version); 174 174 shid->hid->country = shid->hid_desc.country_code; 175 175 176 176 snprintf(shid->hid->name, sizeof(shid->hid->name), "Microsoft Surface %04X:%04X",
+1 -1
drivers/hid/usbhid/hid-core.c
··· 374 374 raw_report = usbhid->ctrl[usbhid->ctrltail].raw_report; 375 375 dir = usbhid->ctrl[usbhid->ctrltail].dir; 376 376 377 - len = ((report->size - 1) >> 3) + 1 + (report->id > 0); 377 + len = hid_report_len(report); 378 378 if (dir == USB_DIR_OUT) { 379 379 usbhid->urbctrl->pipe = usb_sndctrlpipe(hid_to_usb_dev(hid), 0); 380 380 usbhid->urbctrl->transfer_buffer_length = len;
+1
drivers/hid/usbhid/hid-pidff.c
··· 1292 1292 1293 1293 if (pidff->pool[PID_DEVICE_MANAGED_POOL].value && 1294 1294 pidff->pool[PID_DEVICE_MANAGED_POOL].value[0] == 0) { 1295 + error = -EPERM; 1295 1296 hid_notice(hid, 1296 1297 "device does not support device managed pool\n"); 1297 1298 goto fail;
+1 -2
include/linux/hid.h
··· 1167 1167 */ 1168 1168 static inline u32 hid_report_len(struct hid_report *report) 1169 1169 { 1170 - /* equivalent to DIV_ROUND_UP(report->size, 8) + !!(report->id > 0) */ 1171 - return ((report->size - 1) >> 3) + 1 + (report->id > 0); 1170 + return DIV_ROUND_UP(report->size, 8) + (report->id > 0); 1172 1171 } 1173 1172 1174 1173 int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, u32 size,
+1
include/uapi/linux/input-event-codes.h
··· 611 611 #define KEY_VOICECOMMAND 0x246 /* Listening Voice Command */ 612 612 #define KEY_ASSISTANT 0x247 /* AL Context-aware desktop assistant */ 613 613 #define KEY_KBD_LAYOUT_NEXT 0x248 /* AC Next Keyboard Layout Select */ 614 + #define KEY_EMOJI_PICKER 0x249 /* Show/hide emoji picker (HUTRR101) */ 614 615 615 616 #define KEY_BRIGHTNESS_MIN 0x250 /* Set Brightness to Minimum */ 616 617 #define KEY_BRIGHTNESS_MAX 0x251 /* Set Brightness to Maximum */