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

Pull HID fixes from Jiri Kosina:

- Various functionality / regression fixes for Logitech devices from
Hans de Goede

- Fix for (recently added) GPIO support in mcp2221 driver from Lars
Povlsen

- Power management handling fix/quirk in i2c-hid driver for certain
BIOSes that have strange aproach to power-cycle from Hans de Goede

- a few device ID additions and device-specific quirks

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid:
HID: logitech-dj: Fix Dinovo Mini when paired with a MX5x00 receiver
HID: logitech-dj: Fix an error in mse_bluetooth_descriptor
HID: Add Logitech Dinovo Edge battery quirk
HID: logitech-hidpp: Add HIDPP_CONSUMER_VENDOR_KEYS quirk for the Dinovo Edge
HID: logitech-dj: Handle quad/bluetooth keyboards with a builtin trackpad
HID: add HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE for Gamevice devices
HID: mcp2221: Fix GPIO output handling
HID: hid-sensor-hub: Fix issue with devices with no report ID
HID: i2c-hid: Put ACPI enumerated devices in D3 on shutdown
HID: add support for Sega Saturn
HID: cypress: Support Varmilo Keyboards' media hotkeys
HID: ite: Replace ABS_MISC 120/121 events with touchpad on/off keypresses
HID: logitech-hidpp: Add PID for MX Anywhere 2
HID: uclogic: Add ID for Trust Flex Design Tablet

+39 -5
drivers/hid/hid-cypress.c
··· 23 23 #define CP_2WHEEL_MOUSE_HACK 0x02 24 24 #define CP_2WHEEL_MOUSE_HACK_ON 0x04 25 25 26 + #define VA_INVAL_LOGICAL_BOUNDARY 0x08 27 + 26 28 /* 27 29 * Some USB barcode readers from cypress have usage min and usage max in 28 30 * the wrong order 29 31 */ 30 - static __u8 *cp_report_fixup(struct hid_device *hdev, __u8 *rdesc, 32 + static __u8 *cp_rdesc_fixup(struct hid_device *hdev, __u8 *rdesc, 31 33 unsigned int *rsize) 32 34 { 33 - unsigned long quirks = (unsigned long)hid_get_drvdata(hdev); 34 35 unsigned int i; 35 - 36 - if (!(quirks & CP_RDESC_SWAPPED_MIN_MAX)) 37 - return rdesc; 38 36 39 37 if (*rsize < 4) 40 38 return rdesc; ··· 43 45 rdesc[i + 2] = 0x29; 44 46 swap(rdesc[i + 3], rdesc[i + 1]); 45 47 } 48 + return rdesc; 49 + } 50 + 51 + static __u8 *va_logical_boundary_fixup(struct hid_device *hdev, __u8 *rdesc, 52 + unsigned int *rsize) 53 + { 54 + /* 55 + * Varmilo VA104M (with VID Cypress and device ID 07B1) incorrectly 56 + * reports Logical Minimum of its Consumer Control device as 572 57 + * (0x02 0x3c). Fix this by setting its Logical Minimum to zero. 58 + */ 59 + if (*rsize == 25 && 60 + rdesc[0] == 0x05 && rdesc[1] == 0x0c && 61 + rdesc[2] == 0x09 && rdesc[3] == 0x01 && 62 + rdesc[6] == 0x19 && rdesc[7] == 0x00 && 63 + rdesc[11] == 0x16 && rdesc[12] == 0x3c && rdesc[13] == 0x02) { 64 + hid_info(hdev, 65 + "fixing up varmilo VA104M consumer control report descriptor\n"); 66 + rdesc[12] = 0x00; 67 + rdesc[13] = 0x00; 68 + } 69 + return rdesc; 70 + } 71 + 72 + static __u8 *cp_report_fixup(struct hid_device *hdev, __u8 *rdesc, 73 + unsigned int *rsize) 74 + { 75 + unsigned long quirks = (unsigned long)hid_get_drvdata(hdev); 76 + 77 + if (quirks & CP_RDESC_SWAPPED_MIN_MAX) 78 + rdesc = cp_rdesc_fixup(hdev, rdesc, rsize); 79 + if (quirks & VA_INVAL_LOGICAL_BOUNDARY) 80 + rdesc = va_logical_boundary_fixup(hdev, rdesc, rsize); 81 + 46 82 return rdesc; 47 83 } 48 84 ··· 160 128 .driver_data = CP_RDESC_SWAPPED_MIN_MAX }, 161 129 { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE), 162 130 .driver_data = CP_2WHEEL_MOUSE_HACK }, 131 + { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_VARMILO_VA104M_07B1), 132 + .driver_data = VA_INVAL_LOGICAL_BOUNDARY }, 163 133 { } 164 134 }; 165 135 MODULE_DEVICE_TABLE(hid, cp_devices);
+9
drivers/hid/hid-ids.h
··· 331 331 #define USB_DEVICE_ID_CYPRESS_BARCODE_4 0xed81 332 332 #define USB_DEVICE_ID_CYPRESS_TRUETOUCH 0xc001 333 333 334 + #define USB_DEVICE_ID_CYPRESS_VARMILO_VA104M_07B1 0X07b1 335 + 334 336 #define USB_VENDOR_ID_DATA_MODUL 0x7374 335 337 #define USB_VENDOR_ID_DATA_MODUL_EASYMAXTOUCH 0x1201 336 338 ··· 445 443 #define USB_VENDOR_ID_FRUCTEL 0x25B6 446 444 #define USB_DEVICE_ID_GAMETEL_MT_MODE 0x0002 447 445 446 + #define USB_VENDOR_ID_GAMEVICE 0x27F8 447 + #define USB_DEVICE_ID_GAMEVICE_GV186 0x0BBE 448 + #define USB_DEVICE_ID_GAMEVICE_KISHI 0x0BBF 449 + 448 450 #define USB_VENDOR_ID_GAMERON 0x0810 449 451 #define USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR 0x0001 450 452 #define USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR 0x0002 ··· 491 485 #define USB_DEVICE_ID_PENPOWER 0x00f4 492 486 493 487 #define USB_VENDOR_ID_GREENASIA 0x0e8f 488 + #define USB_DEVICE_ID_GREENASIA_DUAL_SAT_ADAPTOR 0x3010 494 489 #define USB_DEVICE_ID_GREENASIA_DUAL_USB_JOYPAD 0x3013 495 490 496 491 #define USB_VENDOR_ID_GRETAGMACBETH 0x0971 ··· 750 743 #define USB_VENDOR_ID_LOGITECH 0x046d 751 744 #define USB_DEVICE_ID_LOGITECH_AUDIOHUB 0x0a0e 752 745 #define USB_DEVICE_ID_LOGITECH_T651 0xb00c 746 + #define USB_DEVICE_ID_LOGITECH_DINOVO_EDGE_KBD 0xb309 753 747 #define USB_DEVICE_ID_LOGITECH_C007 0xc007 754 748 #define USB_DEVICE_ID_LOGITECH_C077 0xc077 755 749 #define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101 ··· 1306 1298 1307 1299 #define USB_VENDOR_ID_UGTIZER 0x2179 1308 1300 #define USB_DEVICE_ID_UGTIZER_TABLET_GP0610 0x0053 1301 + #define USB_DEVICE_ID_UGTIZER_TABLET_GT5040 0x0077 1309 1302 1310 1303 #define USB_VENDOR_ID_VIEWSONIC 0x0543 1311 1304 #define USB_DEVICE_ID_VIEWSONIC_PD1011 0xe621
+3
drivers/hid/hid-input.c
··· 319 319 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ASUSTEK, 320 320 USB_DEVICE_ID_ASUSTEK_T100CHI_KEYBOARD), 321 321 HID_BATTERY_QUIRK_IGNORE }, 322 + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 323 + USB_DEVICE_ID_LOGITECH_DINOVO_EDGE_KBD), 324 + HID_BATTERY_QUIRK_IGNORE }, 322 325 {} 323 326 }; 324 327
+60 -1
drivers/hid/hid-ite.c
··· 11 11 12 12 #include "hid-ids.h" 13 13 14 + #define QUIRK_TOUCHPAD_ON_OFF_REPORT BIT(0) 15 + 16 + static __u8 *ite_report_fixup(struct hid_device *hdev, __u8 *rdesc, unsigned int *rsize) 17 + { 18 + unsigned long quirks = (unsigned long)hid_get_drvdata(hdev); 19 + 20 + if (quirks & QUIRK_TOUCHPAD_ON_OFF_REPORT) { 21 + if (*rsize == 188 && rdesc[162] == 0x81 && rdesc[163] == 0x02) { 22 + hid_info(hdev, "Fixing up ITE keyboard report descriptor\n"); 23 + rdesc[163] = HID_MAIN_ITEM_RELATIVE; 24 + } 25 + } 26 + 27 + return rdesc; 28 + } 29 + 30 + static int ite_input_mapping(struct hid_device *hdev, 31 + struct hid_input *hi, struct hid_field *field, 32 + struct hid_usage *usage, unsigned long **bit, 33 + int *max) 34 + { 35 + 36 + unsigned long quirks = (unsigned long)hid_get_drvdata(hdev); 37 + 38 + if ((quirks & QUIRK_TOUCHPAD_ON_OFF_REPORT) && 39 + (usage->hid & HID_USAGE_PAGE) == 0x00880000) { 40 + if (usage->hid == 0x00880078) { 41 + /* Touchpad on, userspace expects F22 for this */ 42 + hid_map_usage_clear(hi, usage, bit, max, EV_KEY, KEY_F22); 43 + return 1; 44 + } 45 + if (usage->hid == 0x00880079) { 46 + /* Touchpad off, userspace expects F23 for this */ 47 + hid_map_usage_clear(hi, usage, bit, max, EV_KEY, KEY_F23); 48 + return 1; 49 + } 50 + return -1; 51 + } 52 + 53 + return 0; 54 + } 55 + 14 56 static int ite_event(struct hid_device *hdev, struct hid_field *field, 15 57 struct hid_usage *usage, __s32 value) 16 58 { ··· 79 37 return 0; 80 38 } 81 39 40 + static int ite_probe(struct hid_device *hdev, const struct hid_device_id *id) 41 + { 42 + int ret; 43 + 44 + hid_set_drvdata(hdev, (void *)id->driver_data); 45 + 46 + ret = hid_open_report(hdev); 47 + if (ret) 48 + return ret; 49 + 50 + return hid_hw_start(hdev, HID_CONNECT_DEFAULT); 51 + } 52 + 82 53 static const struct hid_device_id ite_devices[] = { 83 54 { HID_USB_DEVICE(USB_VENDOR_ID_ITE, USB_DEVICE_ID_ITE8595) }, 84 55 { HID_USB_DEVICE(USB_VENDOR_ID_258A, USB_DEVICE_ID_258A_6A88) }, 85 56 /* ITE8595 USB kbd ctlr, with Synaptics touchpad connected to it. */ 86 57 { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, 87 58 USB_VENDOR_ID_SYNAPTICS, 88 - USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012) }, 59 + USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012), 60 + .driver_data = QUIRK_TOUCHPAD_ON_OFF_REPORT }, 89 61 /* ITE8910 USB kbd ctlr, with Synaptics touchpad connected to it. */ 90 62 { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, 91 63 USB_VENDOR_ID_SYNAPTICS, ··· 111 55 static struct hid_driver ite_driver = { 112 56 .name = "itetech", 113 57 .id_table = ite_devices, 58 + .probe = ite_probe, 59 + .report_fixup = ite_report_fixup, 60 + .input_mapping = ite_input_mapping, 114 61 .event = ite_event, 115 62 }; 116 63 module_hid_driver(ite_driver);
+21 -1
drivers/hid/hid-logitech-dj.c
··· 328 328 0x25, 0x01, /* LOGICAL_MAX (1) */ 329 329 0x75, 0x01, /* REPORT_SIZE (1) */ 330 330 0x95, 0x04, /* REPORT_COUNT (4) */ 331 - 0x81, 0x06, /* INPUT */ 331 + 0x81, 0x02, /* INPUT (Data,Var,Abs) */ 332 332 0xC0, /* END_COLLECTION */ 333 333 0xC0, /* END_COLLECTION */ 334 334 }; ··· 866 866 schedule_work(&djrcv_dev->work); 867 867 } 868 868 869 + /* 870 + * Some quad/bluetooth keyboards have a builtin touchpad in this case we see 871 + * only 1 paired device with a device_type of REPORT_TYPE_KEYBOARD. For the 872 + * touchpad to work we must also forward mouse input reports to the dj_hiddev 873 + * created for the keyboard (instead of forwarding them to a second paired 874 + * device with a device_type of REPORT_TYPE_MOUSE as we normally would). 875 + */ 876 + static const u16 kbd_builtin_touchpad_ids[] = { 877 + 0xb309, /* Dinovo Edge */ 878 + 0xb30c, /* Dinovo Mini */ 879 + }; 880 + 869 881 static void logi_hidpp_dev_conn_notif_equad(struct hid_device *hdev, 870 882 struct hidpp_event *hidpp_report, 871 883 struct dj_workitem *workitem) 872 884 { 873 885 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); 886 + int i, id; 874 887 875 888 workitem->type = WORKITEM_TYPE_PAIRED; 876 889 workitem->device_type = hidpp_report->params[HIDPP_PARAM_DEVICE_INFO] & ··· 895 882 workitem->reports_supported |= STD_KEYBOARD | MULTIMEDIA | 896 883 POWER_KEYS | MEDIA_CENTER | 897 884 HIDPP; 885 + id = (workitem->quad_id_msb << 8) | workitem->quad_id_lsb; 886 + for (i = 0; i < ARRAY_SIZE(kbd_builtin_touchpad_ids); i++) { 887 + if (id == kbd_builtin_touchpad_ids[i]) { 888 + workitem->reports_supported |= STD_MOUSE; 889 + break; 890 + } 891 + } 898 892 break; 899 893 case REPORT_TYPE_MOUSE: 900 894 workitem->reports_supported |= STD_MOUSE | HIDPP;
+32
drivers/hid/hid-logitech-hidpp.c
··· 93 93 #define HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS BIT(3) 94 94 #define HIDPP_CAPABILITY_BATTERY_VOLTAGE BIT(4) 95 95 96 + #define lg_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, EV_KEY, (c)) 97 + 96 98 /* 97 99 * There are two hidpp protocols in use, the first version hidpp10 is known 98 100 * as register access protocol or RAP, the second version hidpp20 is known as ··· 2953 2951 } 2954 2952 2955 2953 /* -------------------------------------------------------------------------- */ 2954 + /* Logitech Dinovo Mini keyboard with builtin touchpad */ 2955 + /* -------------------------------------------------------------------------- */ 2956 + #define DINOVO_MINI_PRODUCT_ID 0xb30c 2957 + 2958 + static int lg_dinovo_input_mapping(struct hid_device *hdev, struct hid_input *hi, 2959 + struct hid_field *field, struct hid_usage *usage, 2960 + unsigned long **bit, int *max) 2961 + { 2962 + if ((usage->hid & HID_USAGE_PAGE) != HID_UP_LOGIVENDOR) 2963 + return 0; 2964 + 2965 + switch (usage->hid & HID_USAGE) { 2966 + case 0x00d: lg_map_key_clear(KEY_MEDIA); break; 2967 + default: 2968 + return 0; 2969 + } 2970 + return 1; 2971 + } 2972 + 2973 + /* -------------------------------------------------------------------------- */ 2956 2974 /* HID++1.0 devices which use HID++ reports for their wheels */ 2957 2975 /* -------------------------------------------------------------------------- */ 2958 2976 static int hidpp10_wheel_connect(struct hidpp_device *hidpp) ··· 3206 3184 else if (hidpp->quirks & HIDPP_QUIRK_CLASS_M560 && 3207 3185 field->application != HID_GD_MOUSE) 3208 3186 return m560_input_mapping(hdev, hi, field, usage, bit, max); 3187 + 3188 + if (hdev->product == DINOVO_MINI_PRODUCT_ID) 3189 + return lg_dinovo_input_mapping(hdev, hi, field, usage, bit, max); 3209 3190 3210 3191 return 0; 3211 3192 } ··· 3972 3947 LDJ_DEVICE(0x405e), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 }, 3973 3948 { /* Mouse Logitech MX Anywhere 2 */ 3974 3949 LDJ_DEVICE(0x404a), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 }, 3950 + { LDJ_DEVICE(0x4072), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 }, 3975 3951 { LDJ_DEVICE(0xb013), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 }, 3976 3952 { LDJ_DEVICE(0xb018), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 }, 3977 3953 { LDJ_DEVICE(0xb01f), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 }, ··· 3996 3970 .driver_data = HIDPP_QUIRK_CLASS_K750 }, 3997 3971 { /* Keyboard MX5000 (Bluetooth-receiver in HID proxy mode) */ 3998 3972 LDJ_DEVICE(0xb305), 3973 + .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS }, 3974 + { /* Dinovo Edge (Bluetooth-receiver in HID proxy mode) */ 3975 + LDJ_DEVICE(0xb309), 3999 3976 .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS }, 4000 3977 { /* Keyboard MX5500 (Bluetooth-receiver in HID proxy mode) */ 4001 3978 LDJ_DEVICE(0xb30b), ··· 4041 4012 4042 4013 { /* MX5000 keyboard over Bluetooth */ 4043 4014 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb305), 4015 + .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS }, 4016 + { /* Dinovo Edge keyboard over Bluetooth */ 4017 + HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb309), 4044 4018 .driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS }, 4045 4019 { /* MX5500 keyboard over Bluetooth */ 4046 4020 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb30b),
+39 -9
drivers/hid/hid-mcp2221.c
··· 49 49 MCP2221_ALT_F_NOT_GPIOD = 0xEF, 50 50 }; 51 51 52 + /* MCP GPIO direction encoding */ 53 + enum { 54 + MCP2221_DIR_OUT = 0x00, 55 + MCP2221_DIR_IN = 0x01, 56 + }; 57 + 58 + #define MCP_NGPIO 4 59 + 60 + /* MCP GPIO set command layout */ 61 + struct mcp_set_gpio { 62 + u8 cmd; 63 + u8 dummy; 64 + struct { 65 + u8 change_value; 66 + u8 value; 67 + u8 change_direction; 68 + u8 direction; 69 + } gpio[MCP_NGPIO]; 70 + } __packed; 71 + 72 + /* MCP GPIO get command layout */ 73 + struct mcp_get_gpio { 74 + u8 cmd; 75 + u8 dummy; 76 + struct { 77 + u8 direction; 78 + u8 value; 79 + } gpio[MCP_NGPIO]; 80 + } __packed; 81 + 52 82 /* 53 83 * There is no way to distinguish responses. Therefore next command 54 84 * is sent only after response to previous has been received. Mutex ··· 572 542 573 543 mcp->txbuf[0] = MCP2221_GPIO_GET; 574 544 575 - mcp->gp_idx = (offset + 1) * 2; 545 + mcp->gp_idx = offsetof(struct mcp_get_gpio, gpio[offset].value); 576 546 577 547 mutex_lock(&mcp->lock); 578 548 ret = mcp_send_data_req_status(mcp, mcp->txbuf, 1); ··· 589 559 memset(mcp->txbuf, 0, 18); 590 560 mcp->txbuf[0] = MCP2221_GPIO_SET; 591 561 592 - mcp->gp_idx = ((offset + 1) * 4) - 1; 562 + mcp->gp_idx = offsetof(struct mcp_set_gpio, gpio[offset].value); 593 563 594 564 mcp->txbuf[mcp->gp_idx - 1] = 1; 595 565 mcp->txbuf[mcp->gp_idx] = !!value; ··· 605 575 memset(mcp->txbuf, 0, 18); 606 576 mcp->txbuf[0] = MCP2221_GPIO_SET; 607 577 608 - mcp->gp_idx = (offset + 1) * 5; 578 + mcp->gp_idx = offsetof(struct mcp_set_gpio, gpio[offset].direction); 609 579 610 580 mcp->txbuf[mcp->gp_idx - 1] = 1; 611 581 mcp->txbuf[mcp->gp_idx] = val; ··· 620 590 struct mcp2221 *mcp = gpiochip_get_data(gc); 621 591 622 592 mutex_lock(&mcp->lock); 623 - ret = mcp_gpio_dir_set(mcp, offset, 0); 593 + ret = mcp_gpio_dir_set(mcp, offset, MCP2221_DIR_IN); 624 594 mutex_unlock(&mcp->lock); 625 595 626 596 return ret; ··· 633 603 struct mcp2221 *mcp = gpiochip_get_data(gc); 634 604 635 605 mutex_lock(&mcp->lock); 636 - ret = mcp_gpio_dir_set(mcp, offset, 1); 606 + ret = mcp_gpio_dir_set(mcp, offset, MCP2221_DIR_OUT); 637 607 mutex_unlock(&mcp->lock); 638 608 639 609 /* Can't configure as output, bailout early */ ··· 653 623 654 624 mcp->txbuf[0] = MCP2221_GPIO_GET; 655 625 656 - mcp->gp_idx = (offset + 1) * 2; 626 + mcp->gp_idx = offsetof(struct mcp_get_gpio, gpio[offset].direction); 657 627 658 628 mutex_lock(&mcp->lock); 659 629 ret = mcp_send_data_req_status(mcp, mcp->txbuf, 1); ··· 662 632 if (ret) 663 633 return ret; 664 634 665 - if (mcp->gpio_dir) 635 + if (mcp->gpio_dir == MCP2221_DIR_IN) 666 636 return GPIO_LINE_DIRECTION_IN; 667 637 668 638 return GPIO_LINE_DIRECTION_OUT; ··· 788 758 mcp->status = -ENOENT; 789 759 } else { 790 760 mcp->status = !!data[mcp->gp_idx]; 791 - mcp->gpio_dir = !!data[mcp->gp_idx + 1]; 761 + mcp->gpio_dir = data[mcp->gp_idx + 1]; 792 762 } 793 763 break; 794 764 default: ··· 890 860 mcp->gc->get_direction = mcp_gpio_get_direction; 891 861 mcp->gc->set = mcp_gpio_set; 892 862 mcp->gc->get = mcp_gpio_get; 893 - mcp->gc->ngpio = 4; 863 + mcp->gc->ngpio = MCP_NGPIO; 894 864 mcp->gc->base = -1; 895 865 mcp->gc->can_sleep = 1; 896 866 mcp->gc->parent = &hdev->dev;
+5
drivers/hid/hid-quirks.c
··· 83 83 { HID_USB_DEVICE(USB_VENDOR_ID_FORMOSA, USB_DEVICE_ID_FORMOSA_IR_RECEIVER), HID_QUIRK_NO_INIT_REPORTS }, 84 84 { HID_USB_DEVICE(USB_VENDOR_ID_FREESCALE, USB_DEVICE_ID_FREESCALE_MX28), HID_QUIRK_NOGET }, 85 85 { HID_USB_DEVICE(USB_VENDOR_ID_FUTABA, USB_DEVICE_ID_LED_DISPLAY), HID_QUIRK_NO_INIT_REPORTS }, 86 + { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, USB_DEVICE_ID_GREENASIA_DUAL_SAT_ADAPTOR), HID_QUIRK_MULTI_INPUT }, 86 87 { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, USB_DEVICE_ID_GREENASIA_DUAL_USB_JOYPAD), HID_QUIRK_MULTI_INPUT }, 88 + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_GAMEVICE, USB_DEVICE_ID_GAMEVICE_GV186), 89 + HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE }, 90 + { HID_USB_DEVICE(USB_VENDOR_ID_GAMEVICE, USB_DEVICE_ID_GAMEVICE_KISHI), 91 + HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE }, 87 92 { HID_USB_DEVICE(USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_DRIVING), HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, 88 93 { HID_USB_DEVICE(USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FIGHTING), HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, 89 94 { HID_USB_DEVICE(USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FLYING), HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
+2 -1
drivers/hid/hid-sensor-hub.c
··· 483 483 return 1; 484 484 485 485 ptr = raw_data; 486 - ptr++; /* Skip report id */ 486 + if (report->id) 487 + ptr++; /* Skip report id */ 487 488 488 489 spin_lock_irqsave(&pdata->lock, flags); 489 490
+2
drivers/hid/hid-uclogic-core.c
··· 385 385 USB_DEVICE_ID_UCLOGIC_DRAWIMAGE_G3) }, 386 386 { HID_USB_DEVICE(USB_VENDOR_ID_UGTIZER, 387 387 USB_DEVICE_ID_UGTIZER_TABLET_GP0610) }, 388 + { HID_USB_DEVICE(USB_VENDOR_ID_UGTIZER, 389 + USB_DEVICE_ID_UGTIZER_TABLET_GT5040) }, 388 390 { HID_USB_DEVICE(USB_VENDOR_ID_UGEE, 389 391 USB_DEVICE_ID_UGEE_TABLET_G5) }, 390 392 { HID_USB_DEVICE(USB_VENDOR_ID_UGEE,
+2
drivers/hid/hid-uclogic-params.c
··· 997 997 break; 998 998 case VID_PID(USB_VENDOR_ID_UGTIZER, 999 999 USB_DEVICE_ID_UGTIZER_TABLET_GP0610): 1000 + case VID_PID(USB_VENDOR_ID_UGTIZER, 1001 + USB_DEVICE_ID_UGTIZER_TABLET_GT5040): 1000 1002 case VID_PID(USB_VENDOR_ID_UGEE, 1001 1003 USB_DEVICE_ID_UGEE_XPPEN_TABLET_G540): 1002 1004 case VID_PID(USB_VENDOR_ID_UGEE,
+9
drivers/hid/i2c-hid/i2c-hid-core.c
··· 943 943 } 944 944 } 945 945 946 + static void i2c_hid_acpi_shutdown(struct device *dev) 947 + { 948 + acpi_device_set_power(ACPI_COMPANION(dev), ACPI_STATE_D3_COLD); 949 + } 950 + 946 951 static const struct acpi_device_id i2c_hid_acpi_match[] = { 947 952 {"ACPI0C50", 0 }, 948 953 {"PNP0C50", 0 }, ··· 964 959 static inline void i2c_hid_acpi_fix_up_power(struct device *dev) {} 965 960 966 961 static inline void i2c_hid_acpi_enable_wakeup(struct device *dev) {} 962 + 963 + static inline void i2c_hid_acpi_shutdown(struct device *dev) {} 967 964 #endif 968 965 969 966 #ifdef CONFIG_OF ··· 1182 1175 1183 1176 i2c_hid_set_power(client, I2C_HID_PWR_SLEEP); 1184 1177 free_irq(client->irq, ihid); 1178 + 1179 + i2c_hid_acpi_shutdown(&client->dev); 1185 1180 } 1186 1181 1187 1182 #ifdef CONFIG_PM_SLEEP