Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid
authorLinus Torvalds <torvalds@linux-foundation.org>
Sun, 22 Nov 2020 22:36:06 +0000 (14:36 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 22 Nov 2020 22:36:06 +0000 (14:36 -0800)
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

1  2 
drivers/hid/hid-logitech-dj.c

@@@ -328,7 -328,7 +328,7 @@@ static const char mse_bluetooth_descrip
        0x25, 0x01,             /*      LOGICAL_MAX (1)                 */
        0x75, 0x01,             /*      REPORT_SIZE (1)                 */
        0x95, 0x04,             /*      REPORT_COUNT (4)                */
-       0x81, 0x06,             /*      INPUT                           */
+       0x81, 0x02,             /*      INPUT (Data,Var,Abs)            */
        0xC0,                   /*    END_COLLECTION                    */
        0xC0,                   /*  END_COLLECTION                      */
  };
@@@ -820,7 -820,7 +820,7 @@@ static void logi_dj_recv_queue_unknown_
  {
        struct dj_workitem workitem = { .type = WORKITEM_TYPE_UNKNOWN };
  
 -      /* Rate limit queries done because of unhandeled reports to 2/sec */
 +      /* Rate limit queries done because of unhandled reports to 2/sec */
        if (time_before(jiffies, djrcv_dev->last_query + HZ / 2))
                return;
  
@@@ -866,11 -866,24 +866,24 @@@ static void logi_dj_recv_queue_notifica
        schedule_work(&djrcv_dev->work);
  }
  
+ /*
+  * Some quad/bluetooth keyboards have a builtin touchpad in this case we see
+  * only 1 paired device with a device_type of REPORT_TYPE_KEYBOARD. For the
+  * touchpad to work we must also forward mouse input reports to the dj_hiddev
+  * created for the keyboard (instead of forwarding them to a second paired
+  * device with a device_type of REPORT_TYPE_MOUSE as we normally would).
+  */
+ static const u16 kbd_builtin_touchpad_ids[] = {
+       0xb309, /* Dinovo Edge */
+       0xb30c, /* Dinovo Mini */
+ };
  static void logi_hidpp_dev_conn_notif_equad(struct hid_device *hdev,
                                            struct hidpp_event *hidpp_report,
                                            struct dj_workitem *workitem)
  {
        struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
+       int i, id;
  
        workitem->type = WORKITEM_TYPE_PAIRED;
        workitem->device_type = hidpp_report->params[HIDPP_PARAM_DEVICE_INFO] &
                workitem->reports_supported |= STD_KEYBOARD | MULTIMEDIA |
                                               POWER_KEYS | MEDIA_CENTER |
                                               HIDPP;
+               id = (workitem->quad_id_msb << 8) | workitem->quad_id_lsb;
+               for (i = 0; i < ARRAY_SIZE(kbd_builtin_touchpad_ids); i++) {
+                       if (id == kbd_builtin_touchpad_ids[i]) {
+                               workitem->reports_supported |= STD_MOUSE;
+                               break;
+                       }
+               }
                break;
        case REPORT_TYPE_MOUSE:
                workitem->reports_supported |= STD_MOUSE | HIDPP;