]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge branch 'for-3.12/upstream' into for-next
authorJiri Kosina <jkosina@suse.cz>
Mon, 2 Sep 2013 11:38:50 +0000 (13:38 +0200)
committerJiri Kosina <jkosina@suse.cz>
Mon, 2 Sep 2013 11:38:50 +0000 (13:38 +0200)
1  2 
drivers/hid/hid-core.c
drivers/hid/hid-ids.h

diff --combined drivers/hid/hid-core.c
index 75253265c274dd8f8fd4274d3d38670ebc568f8f,3c28e5bf3675159a1bc9aeb7f127e83edf5d8b7c..de69a5c6729d34097293c3683e27855fa869a7c1
@@@ -677,61 -677,12 +677,61 @@@ static u8 *fetch_item(__u8 *start, __u
        return NULL;
  }
  
 -static void hid_scan_usage(struct hid_device *hid, u32 usage)
 +static void hid_scan_input_usage(struct hid_parser *parser, u32 usage)
  {
 +      struct hid_device *hid = parser->device;
 +
        if (usage == HID_DG_CONTACTID)
                hid->group = HID_GROUP_MULTITOUCH;
  }
  
 +static void hid_scan_feature_usage(struct hid_parser *parser, u32 usage)
 +{
 +      if (usage == 0xff0000c5 && parser->global.report_count == 256 &&
 +          parser->global.report_size == 8)
 +              parser->scan_flags |= HID_SCAN_FLAG_MT_WIN_8;
 +}
 +
 +static void hid_scan_collection(struct hid_parser *parser, unsigned type)
 +{
 +      struct hid_device *hid = parser->device;
 +
 +      if (((parser->global.usage_page << 16) == HID_UP_SENSOR) &&
 +          type == HID_COLLECTION_PHYSICAL)
 +              hid->group = HID_GROUP_SENSOR_HUB;
 +}
 +
 +static int hid_scan_main(struct hid_parser *parser, struct hid_item *item)
 +{
 +      __u32 data;
 +      int i;
 +
 +      data = item_udata(item);
 +
 +      switch (item->tag) {
 +      case HID_MAIN_ITEM_TAG_BEGIN_COLLECTION:
 +              hid_scan_collection(parser, data & 0xff);
 +              break;
 +      case HID_MAIN_ITEM_TAG_END_COLLECTION:
 +              break;
 +      case HID_MAIN_ITEM_TAG_INPUT:
 +              for (i = 0; i < parser->local.usage_index; i++)
 +                      hid_scan_input_usage(parser, parser->local.usage[i]);
 +              break;
 +      case HID_MAIN_ITEM_TAG_OUTPUT:
 +              break;
 +      case HID_MAIN_ITEM_TAG_FEATURE:
 +              for (i = 0; i < parser->local.usage_index; i++)
 +                      hid_scan_feature_usage(parser, parser->local.usage[i]);
 +              break;
 +      }
 +
 +      /* Reset the local parser environment */
 +      memset(&parser->local, 0, sizeof(parser->local));
 +
 +      return 0;
 +}
 +
  /*
   * Scan a report descriptor before the device is added to the bus.
   * Sets device groups and other properties that determine what driver
   */
  static int hid_scan_report(struct hid_device *hid)
  {
 -      unsigned int page = 0, delim = 0;
 +      struct hid_parser *parser;
 +      struct hid_item item;
        __u8 *start = hid->dev_rdesc;
        __u8 *end = start + hid->dev_rsize;
 -      unsigned int u, u_min = 0, u_max = 0;
 -      struct hid_item item;
 +      static int (*dispatch_type[])(struct hid_parser *parser,
 +                                    struct hid_item *item) = {
 +              hid_scan_main,
 +              hid_parser_global,
 +              hid_parser_local,
 +              hid_parser_reserved
 +      };
  
 +      parser = vzalloc(sizeof(struct hid_parser));
 +      if (!parser)
 +              return -ENOMEM;
 +
 +      parser->device = hid;
        hid->group = HID_GROUP_GENERIC;
 -      while ((start = fetch_item(start, end, &item)) != NULL) {
 -              if (item.format != HID_ITEM_FORMAT_SHORT)
 -                      return -EINVAL;
 -              if (item.type == HID_ITEM_TYPE_GLOBAL) {
 -                      if (item.tag == HID_GLOBAL_ITEM_TAG_USAGE_PAGE)
 -                              page = item_udata(&item) << 16;
 -              } else if (item.type == HID_ITEM_TYPE_LOCAL) {
 -                      if (delim > 1)
 -                              break;
 -                      u = item_udata(&item);
 -                      if (item.size <= 2)
 -                              u += page;
 -                      switch (item.tag) {
 -                      case HID_LOCAL_ITEM_TAG_DELIMITER:
 -                              delim += !!u;
 -                              break;
 -                      case HID_LOCAL_ITEM_TAG_USAGE:
 -                              hid_scan_usage(hid, u);
 -                              break;
 -                      case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM:
 -                              u_min = u;
 -                              break;
 -                      case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM:
 -                              u_max = u;
 -                              for (u = u_min; u <= u_max; u++)
 -                                      hid_scan_usage(hid, u);
 -                              break;
 -                      }
 -              } else if (page == HID_UP_SENSOR &&
 -                      item.type == HID_ITEM_TYPE_MAIN &&
 -                      item.tag == HID_MAIN_ITEM_TAG_BEGIN_COLLECTION &&
 -                      (item_udata(&item) & 0xff) == HID_COLLECTION_PHYSICAL)
 -                      hid->group = HID_GROUP_SENSOR_HUB;
 -      }
  
 +      /*
 +       * The parsing is simpler than the one in hid_open_report() as we should
 +       * be robust against hid errors. Those errors will be raised by
 +       * hid_open_report() anyway.
 +       */
 +      while ((start = fetch_item(start, end, &item)) != NULL)
 +              dispatch_type[item.type](parser, &item);
 +
 +      /*
 +       * Handle special flags set during scanning.
 +       */
 +      if ((parser->scan_flags & HID_SCAN_FLAG_MT_WIN_8) &&
 +          (hid->group == HID_GROUP_MULTITOUCH))
 +              hid->group = HID_GROUP_MULTITOUCH_WIN_8;
 +
 +      vfree(parser);
        return 0;
  }
  
@@@ -1606,9 -1564,6 +1606,9 @@@ static const struct hid_device_id hid_h
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_ANSI) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS) },
 +      { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI) },
 +      { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ISO) },
 +      { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_JIS) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ISKU) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONEPLUS) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONEPURE) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONEPURE_OPTICAL) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KOVAPLUS) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_LUA) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_PYRA_WIRED) },
@@@ -2253,9 -2209,6 +2254,9 @@@ static const struct hid_device_id hid_m
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_ANSI) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS) },
 +      { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI) },
 +      { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ISO) },
 +      { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_JIS) },
        { 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) },
        { }
diff --combined drivers/hid/hid-ids.h
index f8c2c047e239d77db9c797053cac604f5759aade,6ad292eee4ce5911471ec9645361d72415fb704c..9386df57f19587b93e35ca50a0617077420eb007
  #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS   0x023b
  #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI  0x0255
  #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO   0x0256
 +#define USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI  0x0291
 +#define USB_DEVICE_ID_APPLE_WELLSPRING8_ISO   0x0292
 +#define USB_DEVICE_ID_APPLE_WELLSPRING8_JIS   0x0293
  #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY  0x030a
  #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY   0x030b
  #define USB_DEVICE_ID_APPLE_IRCONTROL 0x8240
  #define USB_DEVICE_ID_ROCCAT_KONE     0x2ced
  #define USB_DEVICE_ID_ROCCAT_KONEPLUS 0x2d51
  #define USB_DEVICE_ID_ROCCAT_KONEPURE 0x2dbe
+ #define USB_DEVICE_ID_ROCCAT_KONEPURE_OPTICAL 0x2db4
  #define USB_DEVICE_ID_ROCCAT_KONEXTD  0x2e22
  #define USB_DEVICE_ID_ROCCAT_KOVAPLUS 0x2d50
  #define USB_DEVICE_ID_ROCCAT_LUA      0x2c2e