Merge branches 'for-4.13/multitouch', 'for-4.13/retrode', 'for-4.13/transport-open...
authorJiri Kosina <jkosina@suse.cz>
Mon, 10 Jul 2017 09:11:25 +0000 (11:11 +0200)
committerJiri Kosina <jkosina@suse.cz>
Mon, 10 Jul 2017 09:11:25 +0000 (11:11 +0200)
1  2  3  4  5  6 
drivers/hid/Kconfig
drivers/hid/Makefile
drivers/hid/hid-core.c
drivers/hid/hid-ids.h
drivers/hid/i2c-hid/i2c-hid.c
drivers/hid/wacom_wac.c
include/linux/hid.h

diff --combined drivers/hid/Kconfig
@@@@@@@ -275,12 -275,12 -275,12 -275,12 -275,10 -275,10 +275,12 @@@@@@@ config HID_EMS_F
         - Trio Linker Plus II
      
      config HID_ELECOM
    --  tristate "ELECOM BM084 bluetooth mouse"
    ++  tristate "ELECOM HID devices"
        depends on HID
        ---help---
    --  Support for the ELECOM BM084 (bluetooth mouse).
    ++  Support for ELECOM devices:
    ++    - BM084 Bluetooth Mouse
    ++    - DEFT Trackball (Wired and wireless)
      
      config HID_ELO
        tristate "ELO USB 4000/4500 touchscreen"
@@@@@@@ -388,13 -388,6 -388,6 -388,6 -386,6 -386,6 +388,13 @@@@@@@ config HID_ICAD
        To compile this driver as a module, choose M here: the
        module will be called hid-icade.
      
 +++++config HID_ITE
 +++++  tristate "ITE devices"
 +++++  depends on HID
 +++++  default !EXPERT
 +++++  ---help---
 +++++  Support for ITE devices not fully compliant with HID standard.
 +++++
      config HID_TWINHAN
        tristate "Twinhan IR remote control"
        depends on HID
@@@@@@@ -748,6 -741,6 -741,14 -741,6 -739,6 -739,6 +748,14 @@@@@@@ config HID_PRIMA
        Support for Primax devices that are not fully compliant with the
        HID standard.
      
++ +++config HID_RETRODE
++ +++  tristate "Retrode"
++ +++  depends on USB_HID
++ +++  ---help---
++ +++  Support for
++ +++
++ +++    * Retrode 2 cartridge and controller adapter
++ +++
      config HID_ROCCAT
        tristate "Roccat device support"
        depends on USB_HID
diff --combined drivers/hid/Makefile
@@@@@@@ -50,7 -50,6 -50,6 -50,6 -50,6 -50,6 +50,7 @@@@@@@ obj-$(CONFIG_HID_HOLTEK)      += hid-holtek-
      obj-$(CONFIG_HID_HOLTEK)  += hid-holtekff.o
      obj-$(CONFIG_HID_HYPERV_MOUSE)    += hid-hyperv.o
      obj-$(CONFIG_HID_ICADE)           += hid-icade.o
 +++++obj-$(CONFIG_HID_ITE)             += hid-ite.o
      obj-$(CONFIG_HID_KENSINGTON)      += hid-kensington.o
      obj-$(CONFIG_HID_KEYTOUCH)        += hid-keytouch.o
      obj-$(CONFIG_HID_KYE)             += hid-kye.o
@@@@@@@ -82,6 -81,6 -81,7 -81,6 -81,6 -81,6 +82,7 @@@@@@@ hid-picolcd-$(CONFIG_DEBUG_FS)                += hid-
      
      obj-$(CONFIG_HID_PLANTRONICS)     += hid-plantronics.o
      obj-$(CONFIG_HID_PRIMAX)  += hid-primax.o
++ +++obj-$(CONFIG_HID_RETRODE) += hid-retrode.o
      obj-$(CONFIG_HID_ROCCAT)  += hid-roccat.o hid-roccat-common.o \
        hid-roccat-arvo.o hid-roccat-isku.o hid-roccat-kone.o \
        hid-roccat-koneplus.o hid-roccat-konepure.o hid-roccat-kovaplus.o \
diff --combined drivers/hid/hid-core.c
@@@@@@@ -826,35 -826,35 -826,35 -826,11 -826,11 -826,11 +826,35 @@@@@@@ static int hid_scan_report(struct hid_d
                                 * hid-rmi should take care of them,
                                 * not hid-generic
                                 */
   ---                          if (IS_ENABLED(CONFIG_HID_RMI))
   ---                                  hid->group = HID_GROUP_RMI;
   +++                          hid->group = HID_GROUP_RMI;
                break;
        }
      
   +++  /* fall back to generic driver in case specific driver doesn't exist */
   +++  switch (hid->group) {
   +++  case HID_GROUP_MULTITOUCH_WIN_8:
   +++          /* fall-through */
   +++  case HID_GROUP_MULTITOUCH:
   +++          if (!IS_ENABLED(CONFIG_HID_MULTITOUCH))
   +++                  hid->group = HID_GROUP_GENERIC;
   +++          break;
   +++  case HID_GROUP_SENSOR_HUB:
   +++          if (!IS_ENABLED(CONFIG_HID_SENSOR_HUB))
   +++                  hid->group = HID_GROUP_GENERIC;
   +++          break;
   +++  case HID_GROUP_RMI:
   +++          if (!IS_ENABLED(CONFIG_HID_RMI))
   +++                  hid->group = HID_GROUP_GENERIC;
   +++          break;
   +++  case HID_GROUP_WACOM:
   +++          if (!IS_ENABLED(CONFIG_HID_WACOM))
   +++                  hid->group = HID_GROUP_GENERIC;
   +++          break;
   +++  case HID_GROUP_LOGITECH_DJ_DEVICE:
   +++          if (!IS_ENABLED(CONFIG_HID_LOGITECH_DJ))
   +++                  hid->group = HID_GROUP_GENERIC;
   +++          break;
   +++  }
        vfree(parser);
        return 0;
      }
@@@@@@@ -1070,7 -1070,7 -1070,7 -1046,7 -1046,7 -1046,7 +1070,7 @@@@@@@ static s32 snto32(__u32 value, unsigne
        case 16: return ((__s16)value);
        case 32: return ((__s32)value);
        }
---- -  return value & (1 << (n - 1)) ? value | (-1 << n) : value;
++++ +  return value & (1 << (n - 1)) ? value | (~0U << n) : value;
      }
      
      s32 hid_snto32(__u32 value, unsigned n)
@@@@@@@ -1774,6 -1774,6 -1774,6 -1750,94 -1750,6 -1750,6 +1774,94 @@@@@@@ void hid_disconnect(struct hid_device *
      }
      EXPORT_SYMBOL_GPL(hid_disconnect);
      
+++ ++/**
+++ ++ * hid_hw_start - start underlying HW
+++ ++ * @hdev: hid device
+++ ++ * @connect_mask: which outputs to connect, see HID_CONNECT_*
+++ ++ *
+++ ++ * Call this in probe function *after* hid_parse. This will setup HW
+++ ++ * buffers and start the device (if not defeirred to device open).
+++ ++ * hid_hw_stop must be called if this was successful.
+++ ++ */
+++ ++int hid_hw_start(struct hid_device *hdev, unsigned int connect_mask)
+++ ++{
+++ ++  int error;
+++ ++
+++ ++  error = hdev->ll_driver->start(hdev);
+++ ++  if (error)
+++ ++          return error;
+++ ++
+++ ++  if (connect_mask) {
+++ ++          error = hid_connect(hdev, connect_mask);
+++ ++          if (error) {
+++ ++                  hdev->ll_driver->stop(hdev);
+++ ++                  return error;
+++ ++          }
+++ ++  }
+++ ++
+++ ++  return 0;
+++ ++}
+++ ++EXPORT_SYMBOL_GPL(hid_hw_start);
+++ ++
+++ ++/**
+++ ++ * hid_hw_stop - stop underlying HW
+++ ++ * @hdev: hid device
+++ ++ *
+++ ++ * This is usually called from remove function or from probe when something
+++ ++ * failed and hid_hw_start was called already.
+++ ++ */
+++ ++void hid_hw_stop(struct hid_device *hdev)
+++ ++{
+++ ++  hid_disconnect(hdev);
+++ ++  hdev->ll_driver->stop(hdev);
+++ ++}
+++ ++EXPORT_SYMBOL_GPL(hid_hw_stop);
+++ ++
+++ ++/**
+++ ++ * hid_hw_open - signal underlying HW to start delivering events
+++ ++ * @hdev: hid device
+++ ++ *
+++ ++ * Tell underlying HW to start delivering events from the device.
+++ ++ * This function should be called sometime after successful call
+++ ++ * to hid_hiw_start().
+++ ++ */
+++ ++int hid_hw_open(struct hid_device *hdev)
+++ ++{
+++ ++  int ret;
+++ ++
+++ ++  ret = mutex_lock_killable(&hdev->ll_open_lock);
+++ ++  if (ret)
+++ ++          return ret;
+++ ++
+++ ++  if (!hdev->ll_open_count++) {
+++ ++          ret = hdev->ll_driver->open(hdev);
+++ ++          if (ret)
+++ ++                  hdev->ll_open_count--;
+++ ++  }
+++ ++
+++ ++  mutex_unlock(&hdev->ll_open_lock);
+++ ++  return ret;
+++ ++}
+++ ++EXPORT_SYMBOL_GPL(hid_hw_open);
+++ ++
+++ ++/**
+++ ++ * hid_hw_close - signal underlaying HW to stop delivering events
+++ ++ *
+++ ++ * @hdev: hid device
+++ ++ *
+++ ++ * This function indicates that we are not interested in the events
+++ ++ * from this device anymore. Delivery of events may or may not stop,
+++ ++ * depending on the number of users still outstanding.
+++ ++ */
+++ ++void hid_hw_close(struct hid_device *hdev)
+++ ++{
+++ ++  mutex_lock(&hdev->ll_open_lock);
+++ ++  if (!--hdev->ll_open_count)
+++ ++          hdev->ll_driver->close(hdev);
+++ ++  mutex_unlock(&hdev->ll_open_lock);
+++ ++}
+++ ++EXPORT_SYMBOL_GPL(hid_hw_close);
+++ ++
      /*
       * A list of devices for which there is a specialized driver on HID bus.
       *
       * used as a driver. See hid_scan_report().
       */
      static const struct hid_device_id hid_have_special_driver[] = {
   +++#if IS_ENABLED(CONFIG_HID_A4TECH)
        { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) },
        { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) },
        { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_RP_649) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_ACCUTOUCH)
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_ACCUTOUCH_2216) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_ACRUX)
        { HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0x0802) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0xf705) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_ALPS)
        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY, USB_VENDOR_ID_ALPS_JP, HID_DEVICE_ID_ALPS_U1_DUAL) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_APPLE)
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE) },
   ---  { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICMOUSE) },
   ---  { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICTRACKPAD) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL2) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL3) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL5) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_ANSI) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_APPLEIR)
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL2) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL3) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL5) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_ASUS)
        { HID_I2C_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_I2C_KEYBOARD) },
        { HID_I2C_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_I2C_TOUCHPAD) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD1) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD2) },
    ++  { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_T100_KEYBOARD) },
 +++++  { HID_USB_DEVICE(USB_VENDOR_ID_JESS, USB_DEVICE_ID_ASUS_MD_5112) },
 +++++  { HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_ASUS_MD_5110) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_AUREAL)
        { HID_USB_DEVICE(USB_VENDOR_ID_AUREAL, USB_DEVICE_ID_AUREAL_W01RN) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_BELKIN)
        { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_BETOP_FF)
        { HID_USB_DEVICE(USB_VENDOR_ID_BETOP_2185BFM, 0x2208) },
        { HID_USB_DEVICE(USB_VENDOR_ID_BETOP_2185PC, 0x5506) },
        { HID_USB_DEVICE(USB_VENDOR_ID_BETOP_2185V2PC, 0x1850) },
        { HID_USB_DEVICE(USB_VENDOR_ID_BETOP_2185V2BFM, 0x5500) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE_2) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_CHERRY)
        { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_CHICONY)
        { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS2) },
 -----  { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_AK1D) },
 +++++  { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_ASUS_AK1D) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_ACER_SWITCH12) },
 --     { HID_USB_DEVICE(USB_VENDOR_ID_JESS, USB_DEVICE_ID_JESS_ZEN_AIO_KBD) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_CMEDIA)
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_CMEDIA, USB_DEVICE_ID_CM6533) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_CORSAIR)
        { HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K90) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_SCIMITAR_PRO_RGB) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_CREATIVELABS, USB_DEVICE_ID_PRODIKEYS_PCMIDI) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_CP2112)
        { HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_CP2112) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_CYPRESS)
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_3) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_4) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_DELCOM, USB_DEVICE_ID_DELCOM_VISUAL_IND) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_DRAGONRISE)
        { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0006) },
        { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0011) },
   ---#if IS_ENABLED(CONFIG_HID_MAYFLASH)
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_PS3) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_DOLPHINBAR) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_GAMECUBE1) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_GAMECUBE2) },
      #endif
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, USB_DEVICE_ID_DREAM_CHEEKY_WN) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, USB_DEVICE_ID_DREAM_CHEEKY_FA) },
   +++#if IS_ENABLED(CONFIG_HID_ELECOM)
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_BM084) },
    ++  { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_DEFT_WIRED) },
    ++  { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_DEFT_WIRELESS) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_ELO)
        { HID_USB_DEVICE(USB_VENDOR_ID_ELO, 0x0009) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ELO, 0x0030) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_ACCUTOUCH_2216) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_EMS_FF)
        { HID_USB_DEVICE(USB_VENDOR_ID_EMS, USB_DEVICE_ID_EMS_TRIO_LINKER_PLUS_II) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_EZKEY)
        { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_GEMBIRD)
        { HID_USB_DEVICE(USB_VENDOR_ID_GEMBIRD, USB_DEVICE_ID_GEMBIRD_JPD_DUALFORCE2) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0003) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_GFRM)
   +++        { HID_BLUETOOTH_DEVICE(0x58, 0x2000) },
   +++        { HID_BLUETOOTH_DEVICE(0x471, 0x2210) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_GREENASIA)
        { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0012) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_GT683R)
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_GYRATION)
        { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_3) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_HOLTEK)
        { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK, USB_DEVICE_ID_HOLTEK_ON_LINE_GRIP) },
        { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD) },
        { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A04A) },
        { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A072) },
        { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A081) },
        { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A0C2) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_HUION, USB_DEVICE_ID_HUION_TABLET) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_JESS, USB_DEVICE_ID_JESS_ZEN_AIO_KBD) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_JESS2, USB_DEVICE_ID_JESS2_COLOR_RUMBLE_PAD) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_ICADE)
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ION, USB_DEVICE_ID_ICADE) },
   +++#endif
 +++++#if IS_ENABLED(CONFIG_HID_ITE)
 +++++  { HID_USB_DEVICE(USB_VENDOR_ID_ITE, USB_DEVICE_ID_ITE8595) },
 +++++#endif
   +++#if IS_ENABLED(CONFIG_HID_KENSINGTON)
        { HID_USB_DEVICE(USB_VENDOR_ID_KENSINGTON, USB_DEVICE_ID_KS_SLIMBLADE) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_KEYTOUCH)
        { HID_USB_DEVICE(USB_VENDOR_ID_KEYTOUCH, USB_DEVICE_ID_KEYTOUCH_IEC) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_KYE)
        { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_MANTICORE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GX_IMPERATOR) },
        { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X) },
        { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_PENSKETCH_M912) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_LCPOWER)
        { HID_USB_DEVICE(USB_VENDOR_ID_LCPOWER, USB_DEVICE_ID_LCPOWER_LC1000 ) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_LED)
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_DELCOM, USB_DEVICE_ID_DELCOM_VISUAL_IND) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, USB_DEVICE_ID_DREAM_CHEEKY_WN) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, USB_DEVICE_ID_DREAM_CHEEKY_FA) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_LUXAFOR) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_RISO_KAGAKU, USB_DEVICE_ID_RI_KA_WEBMAIL) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_THINGM, USB_DEVICE_ID_BLINK1) },
   +++#endif
      #if IS_ENABLED(CONFIG_HID_LENOVO)
        { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_TPKBD) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_CUSBKBD) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_CBTKBD) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_TPPRODOCK) },
      #endif
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_LG, USB_DEVICE_ID_LG_MELFAS_MT) },
   +++#if IS_ENABLED(CONFIG_HID_LOGITECH)
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER_2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RECEIVER) },
   ---  { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3) },
   ---  { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_T651) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_DESKTOP) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_EDGE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_MINI) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2_2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G29_WHEEL) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G920_WHEEL) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_F3D) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_FFG ) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FORCE3D_PRO) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_DFGT_WHEEL) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G25_WHEEL) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G27_WHEEL) },
   ---#if IS_ENABLED(CONFIG_HID_LOGITECH_DJ)
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2) },
   ---#endif
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WII_WHEEL) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACETRAVELLER) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACENAVIGATOR) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD_BOOTLOADER) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_LUXAFOR) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_LOGITECH_HIDPP)
   +++  { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_T651) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G920_WHEEL) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_LOGITECH_DJ)
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_MAGICMOUSE)
   +++  { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICMOUSE) },
   +++  { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICTRACKPAD) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_MAYFLASH)
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_PS3) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_DOLPHINBAR) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_GAMECUBE1) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_GAMECUBE2) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_MICROSOFT)
        { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_COMFORT_MOUSE_4500) },
        { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_COMFORT_KEYBOARD) },
        { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV) },
        { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_600) },
        { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_3KV1) },
        { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_POWER_COVER) },
   +++  { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_MONTEREY)
        { HID_USB_DEVICE(USB_VENDOR_ID_MONTEREY, USB_DEVICE_ID_GENIUS_KB29E) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_MULTITOUCH)
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_LG, USB_DEVICE_ID_LG_MELFAS_MT) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_WIIMOTE)
   +++  { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, USB_DEVICE_ID_NINTENDO_WIIMOTE) },
   +++  { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, USB_DEVICE_ID_NINTENDO_WIIMOTE2) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_NTI)
        { HID_USB_DEVICE(USB_VENDOR_ID_NTI, USB_DEVICE_ID_USB_SUN) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_NTRIG)
        { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN) },
        { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_1) },
        { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_16) },
        { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_17) },
        { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_18) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_ORTEK)
        { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_PKB1700) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_WKB2000) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_PANTHERLORD)
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0003) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_JESS2, USB_DEVICE_ID_JESS2_COLOR_RUMBLE_PAD) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_PENMOUNT)
        { HID_USB_DEVICE(USB_VENDOR_ID_PENMOUNT, USB_DEVICE_ID_PENMOUNT_6000) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_PETALYNX)
        { HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_PICOLCD)
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD_BOOTLOADER) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_PLANTRONICS)
        { HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS, HID_ANY_ID) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_PRIMAX)
        { HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_KEYBOARD) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_RISO_KAGAKU, USB_DEVICE_ID_RI_KA_WEBMAIL) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_PRODIKEYS)
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_CREATIVELABS, USB_DEVICE_ID_PRODIKEYS_PCMIDI) },
   +++#endif
++ +++#if IS_ENABLED(CONFIG_HID_RETRODE)
++ +++  { HID_USB_DEVICE(USB_VENDOR_ID_FUTURE_TECHNOLOGY, USB_DEVICE_ID_RETRODE2) },
++ +++#endif
   +++#if IS_ENABLED(CONFIG_HID_RMI)
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_COVER) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_RAZER, USB_DEVICE_ID_RAZER_BLADE_14) },
   +++#endif
      #if IS_ENABLED(CONFIG_HID_ROCCAT)
        { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ARVO) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ISKU) },
        { HID_USB_DEVICE(USB_VENDOR_ID_MADCATZ, USB_DEVICE_ID_MADCATZ_RAT5) },
        { HID_USB_DEVICE(USB_VENDOR_ID_MADCATZ, USB_DEVICE_ID_MADCATZ_RAT9) },
      #endif
   +++#if IS_ENABLED(CONFIG_HID_SAMSUNG)
        { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_SMARTJOYPLUS)
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_PLAYDOTCOM, USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SMARTJOY_PLUS) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SUPER_JOY_BOX_3) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_JOY_BOX_3_PRO) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_DUAL_BOX_PRO) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_JOY_BOX_5_PRO) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_SONY)
   +++  { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SMK, USB_DEVICE_ID_SMK_PS3_BDREMOTE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SINO_LITE, USB_DEVICE_ID_SINO_LITE_CONTROLLER) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_SPEEDLINK)
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_X_TENSIONS, USB_DEVICE_ID_SPEEDLINK_VAD_CEZANNE) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_STEELSERIES)
        { HID_USB_DEVICE(USB_VENDOR_ID_STEELSERIES, USB_DEVICE_ID_STEELSERIES_SRWS1) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_SUNPLUS)
        { HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_THINGM, USB_DEVICE_ID_BLINK1) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_THRUSTMASTER)
        { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb300) },
        { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb304) },
        { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb323) },
        { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb653) },
        { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654) },
        { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb65a) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_TIVO)
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE_BT) },
        { HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE_PRO) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_TOPSEED)
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE_2) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS) },
        { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) },
        { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED2, USB_DEVICE_ID_TOPSEED2_RF_COMBO) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_TWINHAN)
        { HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_UCLOGIC)
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_HUION, USB_DEVICE_ID_HUION_TABLET) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_HUION_TABLET) },
        { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_PF1209) },
        { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP4030U) },
        { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP5540U) },
        { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP1062) },
        { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_WIRELESS_TABLET_TWHL850) },
        { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_TWHA60) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_THQ, USB_DEVICE_ID_THQ_PS3_UDRAW) },
        { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_YIYNOVA_TABLET) },
        { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UGEE_TABLET_81) },
        { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UGEE_TABLET_45) },
        { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_DRAWIMAGE_G3) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_UGTIZER, USB_DEVICE_ID_UGTIZER_TABLET_GP0610) },
        { HID_USB_DEVICE(USB_VENDOR_ID_UGEE, USB_DEVICE_ID_UGEE_TABLET_EX07S) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SMARTJOY_PLUS) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SUPER_JOY_BOX_3) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_JOY_BOX_3_PRO) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_DUAL_BOX_PRO) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_JOY_BOX_5_PRO) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_PLAYDOTCOM, USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII) },
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_UGTIZER, USB_DEVICE_ID_UGTIZER_TABLET_GP0610) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_UDRAW_PS3)
   +++  { HID_USB_DEVICE(USB_VENDOR_ID_THQ, USB_DEVICE_ID_THQ_PS3_UDRAW) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_WALTOP)
        { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SLIM_TABLET_5_8_INCH) },
        { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SLIM_TABLET_12_1_INCH) },
        { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_Q_PAD) },
        { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_MEDIA_TABLET_10_6_INCH) },
        { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_MEDIA_TABLET_14_1_INCH) },
        { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SIRIUS_BATTERY_FREE_TABLET) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_X_TENSIONS, USB_DEVICE_ID_SPEEDLINK_VAD_CEZANNE) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_XINMO)
        { HID_USB_DEVICE(USB_VENDOR_ID_XIN_MO, USB_DEVICE_ID_XIN_MO_DUAL_ARCADE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_XIN_MO, USB_DEVICE_ID_THT_2P_ARCADE) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_ZEROPLUS)
        { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) },
   +++#endif
   +++#if IS_ENABLED(CONFIG_HID_ZYDACRON)
        { HID_USB_DEVICE(USB_VENDOR_ID_ZYDACRON, USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL) },
   ---
   ---  { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) },
   ---  { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, USB_DEVICE_ID_NINTENDO_WIIMOTE) },
   ---  { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, USB_DEVICE_ID_NINTENDO_WIIMOTE2) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_RAZER, USB_DEVICE_ID_RAZER_BLADE_14) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_CMEDIA, USB_DEVICE_ID_CM6533) },
   ---  { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_COVER) },
   +++#endif
        { }
      };
      
@@@@@@@ -2911,6 -2907,6 -2910,6 -2835,7 -2744,6 -2744,6 +3002,7 @@@@@@@ struct hid_device *hid_allocate_device(
        spin_lock_init(&hdev->debug_list_lock);
        sema_init(&hdev->driver_lock, 1);
        sema_init(&hdev->driver_input_lock, 1);
+++ ++  mutex_init(&hdev->ll_open_lock);
      
        return hdev;
      }
diff --combined drivers/hid/hid-ids.h
      
      #define USB_VENDOR_ID_ALPS_JP             0x044E
      #define HID_DEVICE_ID_ALPS_U1_DUAL        0x120B
+ ++++#define HID_DEVICE_ID_ALPS_U1_DUAL_PTP    0x121F
+ ++++#define HID_DEVICE_ID_ALPS_U1_DUAL_3BTN_PTP       0x1220
      
      #define USB_VENDOR_ID_AMI         0x046b
      #define USB_DEVICE_ID_AMI_VIRT_KEYBOARD_AND_MOUSE 0xff10
      #define USB_VENDOR_ID_ASUSTEK             0x0b05
      #define USB_DEVICE_ID_ASUSTEK_LCM 0x1726
      #define USB_DEVICE_ID_ASUSTEK_LCM2        0x175b
    ++#define USB_DEVICE_ID_ASUSTEK_T100_KEYBOARD       0x17e0
      #define USB_DEVICE_ID_ASUSTEK_I2C_KEYBOARD        0x8585
      #define USB_DEVICE_ID_ASUSTEK_I2C_TOUCHPAD        0x0101
      #define USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD1 0x1854
      #define USB_DEVICE_ID_CHICONY_WIRELESS    0x0618
      #define USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE    0x1053
      #define USB_DEVICE_ID_CHICONY_WIRELESS2   0x1123
 -----#define USB_DEVICE_ID_CHICONY_AK1D        0x1125
 +++++#define USB_DEVICE_ID_ASUS_AK1D           0x1125
      #define USB_DEVICE_ID_CHICONY_ACER_SWITCH12       0x1421
      
      #define USB_VENDOR_ID_CHUNGHWAT           0x2247
      #define USB_VENDOR_ID_DELCOM              0x0fc5
      #define USB_DEVICE_ID_DELCOM_VISUAL_IND   0xb080
      
 + +++#define USB_VENDOR_ID_DELL                                0x413c
 + +++#define USB_DEVICE_ID_DELL_PIXART_USB_OPTICAL_MOUSE       0x301a
 + +++
      #define USB_VENDOR_ID_DELORME             0x1163
      #define USB_DEVICE_ID_DELORME_EARTHMATE   0x0100
      #define USB_DEVICE_ID_DELORME_EM_LT20     0x0200
      
      #define USB_VENDOR_ID_ELECOM              0x056e
      #define USB_DEVICE_ID_ELECOM_BM084        0x0061
    ++#define USB_DEVICE_ID_ELECOM_DEFT_WIRED   0x00fe
    ++#define USB_DEVICE_ID_ELECOM_DEFT_WIRELESS        0x00ff
      
      #define USB_VENDOR_ID_DREAM_CHEEKY        0x1d34
      #define USB_DEVICE_ID_DREAM_CHEEKY_WN     0x0004
      #define USB_VENDOR_ID_FUTABA            0x0547
      #define USB_DEVICE_ID_LED_DISPLAY       0x7000
      
++ +++#define USB_VENDOR_ID_FUTURE_TECHNOLOGY   0x0403
++ +++#define USB_DEVICE_ID_RETRODE2            0x97c1
++ +++
      #define USB_VENDOR_ID_ESSENTIAL_REALITY   0x0d7f
      #define USB_DEVICE_ID_ESSENTIAL_REALITY_P5 0x0100
      
      #define USB_VENDOR_ID_GOODTOUCH           0x1aad
      #define USB_DEVICE_ID_GOODTOUCH_000f      0x000f
      
+ ++++#define USB_VENDOR_ID_GOOGLE              0x18d1
+ ++++#define USB_DEVICE_ID_GOOGLE_TOUCH_ROSE   0x5028
+ ++++
      #define USB_VENDOR_ID_GOTOP               0x08f2
      #define USB_DEVICE_ID_SUPER_Q2            0x007f
      #define USB_DEVICE_ID_GOGOPEN             0x00ce
      #define USB_DEVICE_ID_ITE_LENOVO_YOGA   0x8386
      #define USB_DEVICE_ID_ITE_LENOVO_YOGA2  0x8350
      #define USB_DEVICE_ID_ITE_LENOVO_YOGA900  0x8396
 +++++#define USB_DEVICE_ID_ITE8595             0x8595
      
      #define USB_VENDOR_ID_JABRA               0x0b0e
      #define USB_DEVICE_ID_JABRA_SPEAK_410     0x0412
      
      #define USB_VENDOR_ID_JESS                0x0c45
      #define USB_DEVICE_ID_JESS_YUREX  0x1010
 -----#define USB_DEVICE_ID_JESS_ZEN_AIO_KBD    0x5112
 +++++#define USB_DEVICE_ID_ASUS_MD_5112        0x5112
      
      #define USB_VENDOR_ID_JESS2               0x0f30
      #define USB_DEVICE_ID_JESS2_COLOR_RUMBLE_PAD 0x0111
      
      #define USB_VENDOR_ID_TURBOX              0x062a
      #define USB_DEVICE_ID_TURBOX_KEYBOARD     0x0201
 +++++#define USB_DEVICE_ID_ASUS_MD_5110        0x5110
      #define USB_DEVICE_ID_TURBOX_TOUCHSCREEN_MOSART   0x7100
      
      #define USB_VENDOR_ID_TWINHAN             0x6253
      #include <linux/of.h>
      #include <linux/regulator/consumer.h>
      
---- -#include <linux/i2c/i2c-hid.h>
++++ +#include <linux/platform_data/i2c-hid.h>
      
      #include "../hid-ids.h"
      
@@@@@@@ -743,18 -743,18 -743,18 -743,12 -743,18 -743,18 +743,12 @@@@@@@ static int i2c_hid_open(struct hid_devi
        struct i2c_hid *ihid = i2c_get_clientdata(client);
        int ret = 0;
      
--- --  mutex_lock(&i2c_hid_open_mut);
--- --  if (!hid->open++) {
--- --          ret = pm_runtime_get_sync(&client->dev);
--- --          if (ret < 0) {
--- --                  hid->open--;
--- --                  goto done;
--- --          }
--- --          set_bit(I2C_HID_STARTED, &ihid->flags);
--- --  }
--- --done:
--- --  mutex_unlock(&i2c_hid_open_mut);
--- --  return ret < 0 ? ret : 0;
+++ ++  ret = pm_runtime_get_sync(&client->dev);
+++ ++  if (ret < 0)
+++ ++          return ret;
+++ ++
+++ ++  set_bit(I2C_HID_STARTED, &ihid->flags);
+++ ++  return 0;
      }
      
      static void i2c_hid_close(struct hid_device *hid)
        struct i2c_client *client = hid->driver_data;
        struct i2c_hid *ihid = i2c_get_clientdata(client);
      
--- --  /* protecting hid->open to make sure we don't restart
--- --   * data acquistion due to a resumption we no longer
--- --   * care about
--- --   */
--- --  mutex_lock(&i2c_hid_open_mut);
--- --  if (!--hid->open) {
--- --          clear_bit(I2C_HID_STARTED, &ihid->flags);
+++ ++  clear_bit(I2C_HID_STARTED, &ihid->flags);
      
--- --          /* Save some power */
--- --          pm_runtime_put(&client->dev);
--- --  }
--- --  mutex_unlock(&i2c_hid_open_mut);
+++ ++  /* Save some power */
+++ ++  pm_runtime_put(&client->dev);
      }
      
      static int i2c_hid_power(struct hid_device *hid, int lvl)
@@@@@@@ -897,15 -897,15 -897,15 -883,15 -897,6 -897,6 +883,15 @@@@@@@ static int i2c_hid_acpi_pdata(struct i2
        return 0;
      }
      
    ++static void i2c_hid_acpi_fix_up_power(struct device *dev)
    ++{
    ++  acpi_handle handle = ACPI_HANDLE(dev);
    ++  struct acpi_device *adev;
    ++
    ++  if (handle && acpi_bus_get_device(handle, &adev) == 0)
    ++          acpi_device_fix_up_power(adev);
    ++}
    ++
      static const struct acpi_device_id i2c_hid_acpi_match[] = {
        {"ACPI0C50", 0 },
        {"PNP0C50", 0 },
@@@@@@@ -918,8 -918,8 -918,8 -904,8 -909,6 -909,6 +904,8 @@@@@@@ static inline int i2c_hid_acpi_pdata(st
      {
        return -ENODEV;
      }
    ++
    ++static inline void i2c_hid_acpi_fix_up_power(struct device *dev) {}
      #endif
      
      #ifdef CONFIG_OF
@@@@@@@ -1041,8 -1041,8 -1041,8 -1027,8 -1030,6 -1030,6 +1027,8 @@@@@@@ static int i2c_hid_probe(struct i2c_cli
        if (ret < 0)
                goto err_regulator;
      
    ++  i2c_hid_acpi_fix_up_power(&client->dev);
    ++
        pm_runtime_get_noresume(&client->dev);
        pm_runtime_set_active(&client->dev);
        pm_runtime_enable(&client->dev);
diff --combined drivers/hid/wacom_wac.c
@@@@@@@ -57,15 -57,15 -57,15 -57,15 -57,15 -57,18 +57,18 @@@@@@@ static unsigned short batcap_gr[8] = { 
      static unsigned short batcap_i4[8] = { 1, 15, 30, 45, 60, 70, 85, 100 };
      
      static void __wacom_notify_battery(struct wacom_battery *battery,
-----                              int bat_capacity, bool bat_charging,
-----                              bool bat_connected, bool ps_connected)
+++++                              int bat_status, int bat_capacity,
+++++                              bool bat_charging, bool bat_connected,
+++++                              bool ps_connected)
      {
-----   bool changed = battery->battery_capacity != bat_capacity  ||
+++++   bool changed = battery->bat_status       != bat_status    ||
+++++                  battery->battery_capacity != bat_capacity  ||
                       battery->bat_charging     != bat_charging  ||
                       battery->bat_connected    != bat_connected ||
                       battery->ps_connected     != ps_connected;
      
        if (changed) {
+++++           battery->bat_status = bat_status;
                battery->battery_capacity = bat_capacity;
                battery->bat_charging = bat_charging;
                battery->bat_connected = bat_connected;
      }
      
      static void wacom_notify_battery(struct wacom_wac *wacom_wac,
-----   int bat_capacity, bool bat_charging, bool bat_connected,
-----   bool ps_connected)
+++++   int bat_status, int bat_capacity, bool bat_charging,
+++++   bool bat_connected, bool ps_connected)
      {
        struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
      
-----   __wacom_notify_battery(&wacom->battery, bat_capacity, bat_charging,
-----                          bat_connected, ps_connected);
+++++   __wacom_notify_battery(&wacom->battery, bat_status, bat_capacity,
+++++                          bat_charging, bat_connected, ps_connected);
      }
      
      static int wacom_penpartner_irq(struct wacom_wac *wacom)
@@@@@@@ -448,8 -448,8 -448,8 -448,8 -448,8 -451,9 +451,9 @@@@@@@ static int wacom_graphire_irq(struct wa
                rw = (data[7] >> 2 & 0x07);
                battery_capacity = batcap_gr[rw];
                ps_connected = rw == 7;
-----           wacom_notify_battery(wacom, battery_capacity, ps_connected,
-----                                1, ps_connected);
+++++           wacom_notify_battery(wacom, WACOM_POWER_SUPPLY_STATUS_AUTO,
+++++                                battery_capacity, ps_connected, 1,
+++++                                ps_connected);
        }
      exit:
        return retval;
@@@@@@@ -1071,7 -1071,7 -1071,7 -1071,7 -1071,7 -1075,8 +1075,8 @@@@@@@ static int wacom_remote_irq(struct waco
                        wacom->led.groups[i].select = touch_ring_mode;
        }
      
-----   __wacom_notify_battery(&remote->remotes[index].battery, bat_percent,
+++++   __wacom_notify_battery(&remote->remotes[index].battery,
+++++                           WACOM_POWER_SUPPLY_STATUS_AUTO, bat_percent,
                                bat_charging, 1, bat_charging);
      
      out:
@@@@@@@ -1157,7 -1157,7 -1157,7 -1157,7 -1157,7 -1162,8 +1162,8 @@@@@@@ static int wacom_intuos_bt_irq(struct w
                bat_charging = (power_raw & 0x08) ? 1 : 0;
                ps_connected = (power_raw & 0x10) ? 1 : 0;
                battery_capacity = batcap_i4[power_raw & 0x07];
-----           wacom_notify_battery(wacom, battery_capacity, bat_charging,
+++++           wacom_notify_battery(wacom, WACOM_POWER_SUPPLY_STATUS_AUTO,
+++++                                battery_capacity, bat_charging,
                                     battery_capacity || bat_charging,
                                     ps_connected);
                break;
@@@@@@@ -1334,7 -1334,7 -1334,7 -1334,7 -1334,7 -1340,8 +1340,8 @@@@@@@ static void wacom_intuos_pro2_bt_batter
        bool chg = data[284] & 0x80;
        int battery_status = data[284] & 0x7F;
      
-----   wacom_notify_battery(wacom, battery_status, chg, 1, chg);
+++++   wacom_notify_battery(wacom, WACOM_POWER_SUPPLY_STATUS_AUTO,
+++++                        battery_status, chg, 1, chg);
      }
      
      static int wacom_intuos_pro2_bt_irq(struct wacom_wac *wacom, size_t len)
@@@@@@@ -1571,38 -1571,38 -1571,38 -1571,38 -1571,37 -1578,37 +1578,38 @@@@@@@ static int wacom_tpc_irq(struct wacom_w
      {
        unsigned char *data = wacom->data;
      
    --  if (wacom->pen_input)
    ++  if (wacom->pen_input) {
                dev_dbg(wacom->pen_input->dev.parent,
                        "%s: received report #%d\n", __func__, data[0]);
    --  else if (wacom->touch_input)
    ++
    ++          if (len == WACOM_PKGLEN_PENABLED ||
    ++              data[0] == WACOM_REPORT_PENABLED)
    ++                  return wacom_tpc_pen(wacom);
    ++  }
    ++  else if (wacom->touch_input) {
                dev_dbg(wacom->touch_input->dev.parent,
                        "%s: received report #%d\n", __func__, data[0]);
      
    --  switch (len) {
    --  case WACOM_PKGLEN_TPC1FG:
    --          return wacom_tpc_single_touch(wacom, len);
    - 
    -   case WACOM_PKGLEN_TPC2FG:
    -           return wacom_tpc_mt_touch(wacom);
    ++          switch (len) {
    ++          case WACOM_PKGLEN_TPC1FG:
    ++                  return wacom_tpc_single_touch(wacom, len);
      
    -   case WACOM_PKGLEN_PENABLED:
    -           return wacom_tpc_pen(wacom);
     -  case WACOM_PKGLEN_TPC2FG:
     -          return wacom_tpc_mt_touch(wacom);
    ++          case WACOM_PKGLEN_TPC2FG:
    ++                  return wacom_tpc_mt_touch(wacom);
      
    -   default:
    -           switch (data[0]) {
    -           case WACOM_REPORT_TPC1FG:
    -           case WACOM_REPORT_TPCHID:
    -           case WACOM_REPORT_TPCST:
    -           case WACOM_REPORT_TPC1FGE:
    -                   return wacom_tpc_single_touch(wacom, len);
     -  case WACOM_PKGLEN_PENABLED:
     -          return wacom_tpc_pen(wacom);
    ++          default:
    ++                  switch (data[0]) {
    ++                  case WACOM_REPORT_TPC1FG:
    ++                  case WACOM_REPORT_TPCHID:
    ++                  case WACOM_REPORT_TPCST:
    ++                  case WACOM_REPORT_TPC1FGE:
    ++                          return wacom_tpc_single_touch(wacom, len);
      
     -  default:
     -          switch (data[0]) {
     -          case WACOM_REPORT_TPC1FG:
     -          case WACOM_REPORT_TPCHID:
     -          case WACOM_REPORT_TPCST:
     -          case WACOM_REPORT_TPC1FGE:
     -                  return wacom_tpc_single_touch(wacom, len);
     -
    --          case WACOM_REPORT_TPCMT:
    --          case WACOM_REPORT_TPCMT2:
    --                  return wacom_mt_touch(wacom);
    ++                  case WACOM_REPORT_TPCMT:
    ++                  case WACOM_REPORT_TPCMT2:
    ++                          return wacom_mt_touch(wacom);
      
    --          case WACOM_REPORT_PENABLED:
    --                  return wacom_tpc_pen(wacom);
    ++                  }
                }
        }
      
@@@@@@@ -1696,20 -1696,20 -1696,20 -1696,20 -1695,20 -1702,92 +1703,92 @@@@@@@ static void wacom_map_usage(struct inpu
        }
      }
      
----- static void wacom_wac_pad_usage_mapping(struct hid_device *hdev,
+++++ static void wacom_wac_battery_usage_mapping(struct hid_device *hdev,
                struct hid_field *field, struct hid_usage *usage)
      {
        struct wacom *wacom = hid_get_drvdata(hdev);
        struct wacom_wac *wacom_wac = &wacom->wacom_wac;
        struct wacom_features *features = &wacom_wac->features;
-----   struct input_dev *input = wacom_wac->pad_input;
        unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
      
        switch (equivalent_usage) {
+++++   case HID_DG_BATTERYSTRENGTH:
        case WACOM_HID_WD_BATTERY_LEVEL:
        case WACOM_HID_WD_BATTERY_CHARGING:
                features->quirks |= WACOM_QUIRK_BATTERY;
                break;
+++++   }
+++++ }
+++++ 
+++++ static void wacom_wac_battery_event(struct hid_device *hdev, struct hid_field *field,
+++++           struct hid_usage *usage, __s32 value)
+++++ {
+++++   struct wacom *wacom = hid_get_drvdata(hdev);
+++++   struct wacom_wac *wacom_wac = &wacom->wacom_wac;
+++++   unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
+++++ 
+++++   switch (equivalent_usage) {
+++++   case HID_DG_BATTERYSTRENGTH:
+++++           if (value == 0) {
+++++                   wacom_wac->hid_data.bat_status = POWER_SUPPLY_STATUS_UNKNOWN;
+++++           }
+++++           else {
+++++                   value = value * 100 / (field->logical_maximum - field->logical_minimum);
+++++                   wacom_wac->hid_data.battery_capacity = value;
+++++                   wacom_wac->hid_data.bat_connected = 1;
+++++                   wacom_wac->hid_data.bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO;
+++++           }
+++++           break;
+++++   case WACOM_HID_WD_BATTERY_LEVEL:
+++++           value = value * 100 / (field->logical_maximum - field->logical_minimum);
+++++           wacom_wac->hid_data.battery_capacity = value;
+++++           wacom_wac->hid_data.bat_connected = 1;
+++++           wacom_wac->hid_data.bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO;
+++++           break;
+++++   case WACOM_HID_WD_BATTERY_CHARGING:
+++++           wacom_wac->hid_data.bat_charging = value;
+++++           wacom_wac->hid_data.ps_connected = value;
+++++           wacom_wac->hid_data.bat_connected = 1;
+++++           wacom_wac->hid_data.bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO;
+++++           break;
+++++   }
+++++ }
+++++ 
+++++ static void wacom_wac_battery_pre_report(struct hid_device *hdev,
+++++           struct hid_report *report)
+++++ {
+++++   return;
+++++ }
+++++ 
+++++ static void wacom_wac_battery_report(struct hid_device *hdev,
+++++           struct hid_report *report)
+++++ {
+++++   struct wacom *wacom = hid_get_drvdata(hdev);
+++++   struct wacom_wac *wacom_wac = &wacom->wacom_wac;
+++++   struct wacom_features *features = &wacom_wac->features;
+++++ 
+++++   if (features->quirks & WACOM_QUIRK_BATTERY) {
+++++           int status = wacom_wac->hid_data.bat_status;
+++++           int capacity = wacom_wac->hid_data.battery_capacity;
+++++           bool charging = wacom_wac->hid_data.bat_charging;
+++++           bool connected = wacom_wac->hid_data.bat_connected;
+++++           bool powered = wacom_wac->hid_data.ps_connected;
+++++ 
+++++           wacom_notify_battery(wacom_wac, status, capacity, charging,
+++++                                connected, powered);
+++++   }
+++++ }
+++++ 
+++++ static void wacom_wac_pad_usage_mapping(struct hid_device *hdev,
+++++           struct hid_field *field, struct hid_usage *usage)
+++++ {
+++++   struct wacom *wacom = hid_get_drvdata(hdev);
+++++   struct wacom_wac *wacom_wac = &wacom->wacom_wac;
+++++   struct wacom_features *features = &wacom_wac->features;
+++++   struct input_dev *input = wacom_wac->pad_input;
+++++   unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
+++++ 
+++++   switch (equivalent_usage) {
        case WACOM_HID_WD_ACCELEROMETER_X:
                __set_bit(INPUT_PROP_ACCELEROMETER, input->propbit);
                wacom_map_usage(input, usage, field, EV_ABS, ABS_X, 0);
        }
      }
      
----- static void wacom_wac_pad_battery_event(struct hid_device *hdev, struct hid_field *field,
-----           struct hid_usage *usage, __s32 value)
----- {
-----   struct wacom *wacom = hid_get_drvdata(hdev);
-----   struct wacom_wac *wacom_wac = &wacom->wacom_wac;
-----   unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
----- 
-----   switch (equivalent_usage) {
-----   case WACOM_HID_WD_BATTERY_LEVEL:
-----           wacom_wac->hid_data.battery_capacity = value;
-----           wacom_wac->hid_data.bat_connected = 1;
-----           break;
----- 
-----   case WACOM_HID_WD_BATTERY_CHARGING:
-----           wacom_wac->hid_data.bat_charging = value;
-----           wacom_wac->hid_data.ps_connected = value;
-----           wacom_wac->hid_data.bat_connected = 1;
-----           break;
-----   }
----- }
----- 
      static void wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field,
                struct hid_usage *usage, __s32 value)
      {
@@@@@@@ -1897,24 -1897,24 -1897,24 -1897,24 -1896,24 -1954,6 +1955,6 @@@@@@@ static void wacom_wac_pad_pre_report(st
        wacom_wac->hid_data.inrange_state = 0;
      }
      
----- static void wacom_wac_pad_battery_report(struct hid_device *hdev,
-----           struct hid_report *report)
----- {
-----   struct wacom *wacom = hid_get_drvdata(hdev);
-----   struct wacom_wac *wacom_wac = &wacom->wacom_wac;
-----   struct wacom_features *features = &wacom_wac->features;
----- 
-----   if (features->quirks & WACOM_QUIRK_BATTERY) {
-----           int capacity = wacom_wac->hid_data.battery_capacity;
-----           bool charging = wacom_wac->hid_data.bat_charging;
-----           bool connected = wacom_wac->hid_data.bat_connected;
-----           bool powered = wacom_wac->hid_data.ps_connected;
----- 
-----           wacom_notify_battery(wacom_wac, capacity, charging,
-----                                connected, powered);
-----   }
----- }
----- 
      static void wacom_wac_pad_report(struct hid_device *hdev,
                struct hid_report *report)
      {
@@@@@@@ -1960,9 -1960,9 -1960,9 -1960,9 -1959,9 -1999,6 +2000,6 @@@@@@@ static void wacom_wac_pen_usage_mapping
        case HID_DG_INRANGE:
                wacom_map_usage(input, usage, field, EV_KEY, BTN_TOOL_PEN, 0);
                break;
-----   case HID_DG_BATTERYSTRENGTH:
-----           features->quirks |= WACOM_QUIRK_BATTERY;
-----           break;
        case HID_DG_INVERT:
                wacom_map_usage(input, usage, field, EV_KEY,
                                BTN_TOOL_RUBBER, 0);
@@@@@@@ -2035,10 -2035,10 -2035,10 -2035,10 -2034,10 -2071,6 +2072,6 @@@@@@@ static void wacom_wac_pen_event(struct 
                if (!(features->quirks & WACOM_QUIRK_SENSE))
                        wacom_wac->hid_data.sense_state = value;
                return;
-----   case HID_DG_BATTERYSTRENGTH:
-----           wacom_wac->hid_data.battery_capacity = value;
-----           wacom_wac->hid_data.bat_connected = 1;
-----           break;
        case HID_DG_INVERT:
                wacom_wac->hid_data.invert_state = value;
                return;
                return;
        case WACOM_HID_WD_OFFSETLEFT:
                if (features->offset_left && value != features->offset_left)
-----                   hid_warn(hdev, "%s: overriding exising left offset "
+++++                   hid_warn(hdev, "%s: overriding existing left offset "
                                 "%d -> %d\n", __func__, value,
                                 features->offset_left);
                features->offset_left = value;
                return;
        case WACOM_HID_WD_OFFSETRIGHT:
                if (features->offset_right && value != features->offset_right)
-----                   hid_warn(hdev, "%s: overriding exising right offset "
+++++                   hid_warn(hdev, "%s: overriding existing right offset "
                                 "%d -> %d\n", __func__, value,
                                 features->offset_right);
                features->offset_right = value;
                return;
        case WACOM_HID_WD_OFFSETTOP:
                if (features->offset_top && value != features->offset_top)
-----                   hid_warn(hdev, "%s: overriding exising top offset "
+++++                   hid_warn(hdev, "%s: overriding existing top offset "
                                 "%d -> %d\n", __func__, value,
                                 features->offset_top);
                features->offset_top = value;
                return;
        case WACOM_HID_WD_OFFSETBOTTOM:
                if (features->offset_bottom && value != features->offset_bottom)
-----                   hid_warn(hdev, "%s: overriding exising bottom offset "
+++++                   hid_warn(hdev, "%s: overriding existing bottom offset "
                                 "%d -> %d\n", __func__, value,
                                 features->offset_bottom);
                features->offset_bottom = value;
@@@@@@@ -2395,7 -2395,7 -2395,7 -2395,7 -2394,7 -2427,10 +2428,10 @@@@@@@ void wacom_wac_usage_mapping(struct hid
        if (WACOM_DIRECT_DEVICE(field))
                features->device_type |= WACOM_DEVICETYPE_DIRECT;
      
-----   if (WACOM_PAD_FIELD(field))
+++++   /* usage tests must precede field tests */
+++++   if (WACOM_BATTERY_USAGE(usage))
+++++           wacom_wac_battery_usage_mapping(hdev, field, usage);
+++++   else if (WACOM_PAD_FIELD(field))
                wacom_wac_pad_usage_mapping(hdev, field, usage);
        else if (WACOM_PEN_FIELD(field))
                wacom_wac_pen_usage_mapping(hdev, field, usage);
@@@@@@@ -2414,11 -2414,11 -2414,11 -2414,11 -2413,11 -2449,12 +2450,12 @@@@@@@ void wacom_wac_event(struct hid_device 
        if (value > field->logical_maximum || value < field->logical_minimum)
                return;
      
-----   if (WACOM_PAD_FIELD(field)) {
-----           wacom_wac_pad_battery_event(hdev, field, usage, value);
-----           if (wacom->wacom_wac.pad_input)
-----                   wacom_wac_pad_event(hdev, field, usage, value);
-----   } else if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input)
+++++   /* usage tests must precede field tests */
+++++   if (WACOM_BATTERY_USAGE(usage))
+++++           wacom_wac_battery_event(hdev, field, usage, value);
+++++   else if (WACOM_PAD_FIELD(field) && wacom->wacom_wac.pad_input)
+++++           wacom_wac_pad_event(hdev, field, usage, value);
+++++   else if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input)
                wacom_wac_pen_event(hdev, field, usage, value);
        else if (WACOM_FINGER_FIELD(field) && wacom->wacom_wac.touch_input)
                wacom_wac_finger_event(hdev, field, usage, value);
@@@@@@@ -2452,6 -2452,6 -2452,6 -2452,6 -2451,6 -2488,8 +2489,8 @@@@@@@ void wacom_wac_report(struct hid_devic
        if (wacom_wac->features.type != HID_GENERIC)
                return;
      
+++++   wacom_wac_battery_pre_report(hdev, report);
+++++ 
        if (WACOM_PAD_FIELD(field) && wacom->wacom_wac.pad_input)
                wacom_wac_pad_pre_report(hdev, report);
        else if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input)
        if (report->type != HID_INPUT_REPORT)
                return;
      
-----   if (WACOM_PAD_FIELD(field)) {
-----           wacom_wac_pad_battery_report(hdev, report);
-----           if (wacom->wacom_wac.pad_input)
-----                   wacom_wac_pad_report(hdev, report);
-----   else if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input)
+++++   wacom_wac_battery_report(hdev, report);
+++++ 
+++++   if (WACOM_PAD_FIELD(field) && wacom->wacom_wac.pad_input)
+++++           wacom_wac_pad_report(hdev, report);
+++++   else if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input)
                wacom_wac_pen_report(hdev, report);
        else if (WACOM_FINGER_FIELD(field) && wacom->wacom_wac.touch_input)
                wacom_wac_finger_report(hdev, report);
@@@@@@@ -2813,13 -2813,13 -2813,13 -2813,13 -2812,13 -2851,14 +2852,14 @@@@@@@ static int wacom_wireless_irq(struct wa
                        wacom_schedule_work(wacom, WACOM_WORKER_WIRELESS);
                }
      
-----           wacom_notify_battery(wacom, battery, charging, 1, 0);
+++++           wacom_notify_battery(wacom, WACOM_POWER_SUPPLY_STATUS_AUTO,
+++++                                battery, charging, 1, 0);
      
        } else if (wacom->pid != 0) {
                /* disconnected while previously connected */
                wacom->pid = 0;
                wacom_schedule_work(wacom, WACOM_WORKER_WIRELESS);
-----           wacom_notify_battery(wacom, 0, 0, 0, 0);
+++++           wacom_notify_battery(wacom, POWER_SUPPLY_STATUS_UNKNOWN, 0, 0, 0, 0);
        }
      
        return 0;
@@@@@@@ -2847,8 -2847,8 -2847,8 -2847,8 -2846,8 -2886,8 +2887,8 @@@@@@@ static int wacom_status_irq(struct waco
                int battery = (data[8] & 0x3f) * 100 / 31;
                bool charging = !!(data[8] & 0x80);
      
-----           wacom_notify_battery(wacom_wac, battery, charging,
-----                                battery || charging, 1);
+++++           wacom_notify_battery(wacom_wac, WACOM_POWER_SUPPLY_STATUS_AUTO,
+++++                                battery, charging, battery || charging, 1);
      
                if (!wacom->battery.battery &&
                    !(features->quirks & WACOM_QUIRK_BATTERY)) {
                 wacom->battery.battery) {
                features->quirks &= ~WACOM_QUIRK_BATTERY;
                wacom_schedule_work(wacom_wac, WACOM_WORKER_BATTERY);
-----           wacom_notify_battery(wacom_wac, 0, 0, 0, 0);
+++++           wacom_notify_battery(wacom_wac, POWER_SUPPLY_STATUS_UNKNOWN, 0, 0, 0, 0);
        }
        return 0;
      }
diff --combined include/linux/hid.h
      #include <linux/workqueue.h>
      #include <linux/input.h>
      #include <linux/semaphore.h>
+++ ++#include <linux/mutex.h>
      #include <linux/power_supply.h>
      #include <uapi/linux/hid.h>
      
@@@@@@@ -182,11 -182,6 -182,6 -183,6 -182,6 -182,6 +183,11 @@@@@@@ struct hid_item 
      #define HID_GD_KEYBOARD           0x00010006
      #define HID_GD_KEYPAD             0x00010007
      #define HID_GD_MULTIAXIS  0x00010008
 +++++/*
 +++++ * Microsoft Win8 Wireless Radio Controls extensions CA, see:
 +++++ * http://www.usb.org/developers/hidpage/HUTRR40RadioHIDUsagesFinal.pdf
 +++++ */
 +++++#define HID_GD_WIRELESS_RADIO_CTLS        0x0001000c
      #define HID_GD_X          0x00010030
      #define HID_GD_Y          0x00010031
      #define HID_GD_Z          0x00010032
      #define HID_GD_DOWN               0x00010091
      #define HID_GD_RIGHT              0x00010092
      #define HID_GD_LEFT               0x00010093
 +++++/* Microsoft Win8 Wireless Radio Controls CA usage codes */
 +++++#define HID_GD_RFKILL_BTN 0x000100c6
 +++++#define HID_GD_RFKILL_LED 0x000100c7
 +++++#define HID_GD_RFKILL_SWITCH      0x000100c8
      
      #define HID_DC_BATTERYSTRENGTH    0x00060020
      
@@@@@@@ -529,7 -520,7 -520,7 -521,10 -520,7 -520,7 +530,10 @@@@@@@ struct hid_device {                                                  /* device rep
        struct semaphore driver_input_lock;                             /* protects the current driver */
        struct device dev;                                              /* device */
        struct hid_driver *driver;
+++ ++
        struct hid_ll_driver *ll_driver;
+++ ++  struct mutex ll_open_lock;
+++ ++  unsigned int ll_open_count;
      
      #ifdef CONFIG_HID_BATTERY_STRENGTH
        /*
        void *hiddev;                                                   /* The hiddev structure */
        void *hidraw;
      
--- --  int open;                                                       /* is the device open by anyone? */
        char name[128];                                                 /* Device name */
        char phys[64];                                                  /* Device physical location */
        char uniq[64];                                                  /* Device unique identifier (serial #) */
@@@@@@@ -946,69 -937,69 -937,69 -940,11 -937,69 -937,69 +949,11 @@@@@@@ static inline int __must_check hid_pars
        return hid_open_report(hdev);
      }
      
--- --/**
--- -- * hid_hw_start - start underlaying HW
--- -- *
--- -- * @hdev: hid device
--- -- * @connect_mask: which outputs to connect, see HID_CONNECT_*
--- -- *
--- -- * Call this in probe function *after* hid_parse. This will setup HW buffers
--- -- * and start the device (if not deffered to device open). hid_hw_stop must be
--- -- * called if this was successful.
--- -- */
--- --static inline int __must_check hid_hw_start(struct hid_device *hdev,
--- --          unsigned int connect_mask)
--- --{
--- --  int ret = hdev->ll_driver->start(hdev);
--- --  if (ret || !connect_mask)
--- --          return ret;
--- --  ret = hid_connect(hdev, connect_mask);
--- --  if (ret)
--- --          hdev->ll_driver->stop(hdev);
--- --  return ret;
--- --}
--- --
--- --/**
--- -- * hid_hw_stop - stop underlaying HW
--- -- *
--- -- * @hdev: hid device
--- -- *
--- -- * This is usually called from remove function or from probe when something
--- -- * failed and hid_hw_start was called already.
--- -- */
--- --static inline void hid_hw_stop(struct hid_device *hdev)
--- --{
--- --  hid_disconnect(hdev);
--- --  hdev->ll_driver->stop(hdev);
--- --}
--- --
--- --/**
--- -- * hid_hw_open - signal underlaying HW to start delivering events
--- -- *
--- -- * @hdev: hid device
--- -- *
--- -- * Tell underlying HW to start delivering events from the device.
--- -- * This function should be called sometime after successful call
--- -- * to hid_hiw_start().
--- -- */
--- --static inline int __must_check hid_hw_open(struct hid_device *hdev)
--- --{
--- --  return hdev->ll_driver->open(hdev);
--- --}
--- --
--- --/**
--- -- * hid_hw_close - signal underlaying HW to stop delivering events
--- -- *
--- -- * @hdev: hid device
--- -- *
--- -- * This function indicates that we are not interested in the events
--- -- * from this device anymore. Delivery of events may or may not stop,
--- -- * depending on the number of users still outstanding.
--- -- */
--- --static inline void hid_hw_close(struct hid_device *hdev)
--- --{
--- --  hdev->ll_driver->close(hdev);
--- --}
+++ ++int __must_check hid_hw_start(struct hid_device *hdev,
+++ ++                        unsigned int connect_mask);
+++ ++void hid_hw_stop(struct hid_device *hdev);
+++ ++int __must_check hid_hw_open(struct hid_device *hdev);
+++ ++void hid_hw_close(struct hid_device *hdev);
      
      /**
       * hid_hw_power - requests underlying HW to go into given power mode