]> rtime.felk.cvut.cz Git - linux-imx.git/commitdiff
Merge branch 'multitouch' into device-groups
authorJiri Kosina <jkosina@suse.cz>
Sat, 5 May 2012 21:30:42 +0000 (23:30 +0200)
committerJiri Kosina <jkosina@suse.cz>
Sat, 5 May 2012 21:31:15 +0000 (23:31 +0200)
I am merging multitouch branch into device-groups so that support
for Baanto device can be adjusted accordingly to the new autoloading
patches.

Signed-off-by: Jiri Kosina <jkosina@suse.cz>
1  2 
drivers/hid/hid-core.c
drivers/hid/hid-ids.h
drivers/hid/hid-multitouch.c

diff --combined drivers/hid/hid-core.c
index 0a107fe7e52876b40cace4322c45d9466abe7a92,7e7db307664f9b168aff7de3d3549004612d4d1d..df2ca0af855f38769ac159c073e5bf4192d4de68
@@@ -546,11 -546,12 +546,11 @@@ static void hid_free_report(struct hid_
  }
  
  /*
 - * Free a device structure, all reports, and all fields.
 + * Close report. This function returns the device
 + * state to the point prior to hid_open_report().
   */
 -
 -static void hid_device_release(struct device *dev)
 +static void hid_close_report(struct hid_device *device)
  {
 -      struct hid_device *device = container_of(dev, struct hid_device, dev);
        unsigned i, j;
  
        for (i = 0; i < HID_REPORT_TYPES; i++) {
                        if (report)
                                hid_free_report(report);
                }
 +              memset(report_enum, 0, sizeof(*report_enum));
 +              INIT_LIST_HEAD(&report_enum->report_list);
        }
  
        kfree(device->rdesc);
 +      device->rdesc = NULL;
 +      device->rsize = 0;
 +
        kfree(device->collection);
 -      kfree(device);
 +      device->collection = NULL;
 +      device->collection_size = 0;
 +      device->maxcollection = 0;
 +      device->maxapplication = 0;
 +
 +      device->status &= ~HID_STAT_PARSED;
 +}
 +
 +/*
 + * Free a device structure, all reports, and all fields.
 + */
 +
 +static void hid_device_release(struct device *dev)
 +{
 +      struct hid_device *hid = container_of(dev, struct hid_device, dev);
 +
 +      hid_close_report(hid);
 +      kfree(hid->dev_rdesc);
 +      kfree(hid);
  }
  
  /*
@@@ -658,60 -636,6 +658,60 @@@ static u8 *fetch_item(__u8 *start, __u
        return NULL;
  }
  
 +static void hid_scan_usage(struct hid_device *hid, u32 usage)
 +{
 +      if (usage == HID_DG_CONTACTID)
 +              hid->group = HID_GROUP_MULTITOUCH;
 +}
 +
 +/*
 + * Scan a report descriptor before the device is added to the bus.
 + * Sets device groups and other properties that determine what driver
 + * to load.
 + */
 +static int hid_scan_report(struct hid_device *hid)
 +{
 +      unsigned int page = 0, delim = 0;
 +      __u8 *start = hid->dev_rdesc;
 +      __u8 *end = start + hid->dev_rsize;
 +      unsigned int u, u_min = 0, u_max = 0;
 +      struct hid_item item;
 +
 +      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;
 +                      }
 +              }
 +      }
 +
 +      return 0;
 +}
 +
  /**
   * hid_parse_report - parse device report
   *
   * @start: report start
   * @size: report size
   *
 + * Allocate the device report as read by the bus driver. This function should
 + * only be called from parse() in ll drivers.
 + */
 +int hid_parse_report(struct hid_device *hid, __u8 *start, unsigned size)
 +{
 +      hid->dev_rdesc = kmemdup(start, size, GFP_KERNEL);
 +      if (!hid->dev_rdesc)
 +              return -ENOMEM;
 +      hid->dev_rsize = size;
 +      return 0;
 +}
 +EXPORT_SYMBOL_GPL(hid_parse_report);
 +
 +/**
 + * hid_open_report - open a driver-specific device report
 + *
 + * @device: hid device
 + *
   * Parse a report description into a hid_device structure. Reports are
   * enumerated, fields are attached to these reports.
   * 0 returned on success, otherwise nonzero error value.
 + *
 + * This function (or the equivalent hid_parse() macro) should only be
 + * called from probe() in drivers, before starting the device.
   */
 -int hid_parse_report(struct hid_device *device, __u8 *start,
 -              unsigned size)
 +int hid_open_report(struct hid_device *device)
  {
        struct hid_parser *parser;
        struct hid_item item;
 +      unsigned int size;
 +      __u8 *start;
        __u8 *end;
        int ret;
        static int (*dispatch_type[])(struct hid_parser *parser,
                hid_parser_reserved
        };
  
 +      if (WARN_ON(device->status & HID_STAT_PARSED))
 +              return -EBUSY;
 +
 +      start = device->dev_rdesc;
 +      if (WARN_ON(!start))
 +              return -ENODEV;
 +      size = device->dev_rsize;
 +
        if (device->driver->report_fixup)
                start = device->driver->report_fixup(device, start, &size);
  
        parser->device = device;
  
        end = start + size;
 +
 +      device->collection = kcalloc(HID_DEFAULT_NUM_COLLECTIONS,
 +                                   sizeof(struct hid_collection), GFP_KERNEL);
 +      if (!device->collection) {
 +              ret = -ENOMEM;
 +              goto err;
 +      }
 +      device->collection_size = HID_DEFAULT_NUM_COLLECTIONS;
 +
        ret = -EINVAL;
        while ((start = fetch_item(start, end, &item)) != NULL) {
  
                                goto err;
                        }
                        vfree(parser);
 +                      device->status |= HID_STAT_PARSED;
                        return 0;
                }
        }
        hid_err(device, "item fetching failed at offset %d\n", (int)(end - start));
  err:
        vfree(parser);
 +      hid_close_report(device);
        return ret;
  }
 -EXPORT_SYMBOL_GPL(hid_parse_report);
 +EXPORT_SYMBOL_GPL(hid_open_report);
  
  /*
   * Convert a signed n-bit integer to signed 32-bit integer. Common
@@@ -1275,8 -1158,7 +1275,8 @@@ EXPORT_SYMBOL_GPL(hid_input_report)
  static bool hid_match_one_id(struct hid_device *hdev,
                const struct hid_device_id *id)
  {
 -      return id->bus == hdev->bus &&
 +      return (id->bus == HID_BUS_ANY || id->bus == hdev->bus) &&
 +              (id->group == HID_GROUP_ANY || id->group == hdev->group) &&
                (id->vendor == HID_ANY_ID || id->vendor == hdev->vendor) &&
                (id->product == HID_ANY_ID || id->product == hdev->product);
  }
@@@ -1352,6 -1234,10 +1352,6 @@@ int hid_connect(struct hid_device *hdev
        if ((connect_mask & HID_CONNECT_HIDINPUT) && !hidinput_connect(hdev,
                                connect_mask & HID_CONNECT_HIDINPUT_FORCE))
                hdev->claimed |= HID_CLAIMED_INPUT;
 -      if (hdev->quirks & HID_QUIRK_MULTITOUCH) {
 -              /* this device should be handled by hid-multitouch, skip it */
 -              return -ENODEV;
 -      }
  
        if ((connect_mask & HID_CONNECT_HIDDEV) && hdev->hiddev_connect &&
                        !hdev->hiddev_connect(hdev,
@@@ -1428,10 -1314,13 +1428,10 @@@ EXPORT_SYMBOL_GPL(hid_disconnect)
  
  /* a list of devices for which there is a specialized driver on HID bus */
  static const struct hid_device_id hid_have_special_driver[] = {
 -      { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M1968) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M2256) },
        { 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) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0x0802) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_ACTIONSTAR, USB_DEVICE_ID_ACTIONSTAR_1011) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO) },
        { 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) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_T91MT) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUSTEK_MULTITOUCH_YFO) },
        { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_BAANTO, USB_DEVICE_ID_BAANTO_MT_190W2), },
        { 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_CANDO, USB_DEVICE_ID_CANDO_PIXCIR_MULTI_TOUCH) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH_10_1) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH_15_6) },
        { 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) },
        { 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_CHUNGHWAT, USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CREATIVELABS, USB_DEVICE_ID_PRODIKEYS_PCMIDI) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_CVTOUCH, USB_DEVICE_ID_CVTOUCH_SCREEN) },
        { 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_MOUSE) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_TRUETOUCH) },
        { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0006) },
        { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0011) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480D) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480E) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_720C) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7224) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_725E) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_726B) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72A1) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7302) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_A001) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_BM084) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2515) },
        { HID_USB_DEVICE(USB_VENDOR_ID_EMS, USB_DEVICE_ID_EMS_TRIO_LINKER_PLUS_II) },
        { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) },
 -      { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_FRUCTEL, USB_DEVICE_ID_GAMETEL_MT_MODE) },
        { 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_GENERAL_TOUCH, USB_DEVICE_ID_GENERAL_TOUCH_WIN7_TWOFINGERS) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_GOODTOUCH, USB_DEVICE_ID_GOODTOUCH_000f) },
        { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0003) },
        { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0012) },
        { 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) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_HANVON, USB_DEVICE_ID_HANVON_MULTITOUCH) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_HANVON_ALT, USB_DEVICE_ID_HANVON_ALT_MULTITOUCH) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_IDEACOM, USB_DEVICE_ID_IDEACOM_IDC6650) },
        { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK, USB_DEVICE_ID_HOLTEK_ON_LINE_GRIP) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_ILITEK, USB_DEVICE_ID_ILITEK_MULTITOUCH) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_IRTOUCHSYSTEMS, USB_DEVICE_ID_IRTOUCH_INFRARED_USB) },
        { HID_USB_DEVICE(USB_VENDOR_ID_KENSINGTON, USB_DEVICE_ID_KS_SLIMBLADE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_KEYTOUCH, USB_DEVICE_ID_KEYTOUCH_IEC) },
        { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) },
        { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LCPOWER, USB_DEVICE_ID_LCPOWER_LC1000 ) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_LG, USB_DEVICE_ID_LG_MULTITOUCH) },
        { 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_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_LUMIO, USB_DEVICE_ID_CRYSTALTOUCH) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, USB_DEVICE_ID_CRYSTALTOUCH_DUAL) },
        { 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_MICROSOFT, USB_DEVICE_ID_MS_COMFORT_MOUSE_4500) },
        { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_18) },
        { 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_PANASONIC, USB_DEVICE_ID_PANABOARD_UBT780) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_PANASONIC, USB_DEVICE_ID_PANABOARD_UBT880) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_PENMOUNT, USB_DEVICE_ID_PENMOUNT_PCI) },
        { HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN1) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_KEYBOARD) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH) },
        { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ARVO) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_STANTUM, USB_DEVICE_ID_MTP) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_STM, USB_DEVICE_ID_MTP_STM) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_SITRONIX, USB_DEVICE_ID_MTP_SITRONIX) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) },
        { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb300) },
        { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb304) },
        { HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE) },
        { 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) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_TOUCH_INTL, USB_DEVICE_ID_TOUCH_INTL_MULTI_TOUCH) },
        { HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_TOUCHSCREEN_MOSART) },
        { 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_WP8060U) },
        { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP1062) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_UNITEC, USB_DEVICE_ID_UNITEC_USB_TOUCH_0709) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_UNITEC, USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19) },
        { 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_WALTOP, USB_DEVICE_ID_WALTOP_PID_0038) },
        { 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_XAT, USB_DEVICE_ID_XAT_CSR) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_SPX) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_MPX) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_CSR) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_SPX1) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_MPX1) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_CSR1) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_SPX2) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_MPX2) },
 -      { HID_USB_DEVICE(USB_VENDOR_ID_XIROKU, USB_DEVICE_ID_XIROKU_CSR2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_X_TENSIONS, USB_DEVICE_ID_SPEEDLINK_VAD_CEZANNE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) },
@@@ -1687,7 -1632,6 +1688,7 @@@ static ssize_t store_new_id(struct devi
                return -ENOMEM;
  
        dynid->id.bus = bus;
 +      dynid->id.group = HID_GROUP_ANY;
        dynid->id.vendor = vendor;
        dynid->id.product = product;
        dynid->id.driver_data = driver_data;
@@@ -1736,7 -1680,18 +1737,7 @@@ static int hid_bus_match(struct device 
        struct hid_driver *hdrv = container_of(drv, struct hid_driver, driver);
        struct hid_device *hdev = container_of(dev, struct hid_device, dev);
  
 -      if ((hdev->quirks & HID_QUIRK_MULTITOUCH) &&
 -              !strncmp(hdrv->name, "hid-multitouch", 14))
 -              return 1;
 -
 -      if (!hid_match_device(hdev, hdrv))
 -              return 0;
 -
 -      /* generic wants all that don't have specialized driver */
 -      if (!strncmp(hdrv->name, "generic-", 8) && !hid_ignore_special_drivers)
 -              return !hid_match_id(hdev, hid_have_special_driver);
 -
 -      return 1;
 +      return hid_match_device(hdev, hdrv) != NULL;
  }
  
  static int hid_device_probe(struct device *dev)
        if (!hdev->driver) {
                id = hid_match_device(hdev, hdrv);
                if (id == NULL) {
 -                      if (!((hdev->quirks & HID_QUIRK_MULTITOUCH) &&
 -                              !strncmp(hdrv->name, "hid-multitouch", 14))) {
 -                              ret = -ENODEV;
 -                              goto unlock;
 -                      }
 +                      ret = -ENODEV;
 +                      goto unlock;
                }
  
                hdev->driver = hdrv;
                if (hdrv->probe) {
                        ret = hdrv->probe(hdev, id);
                } else { /* default probe */
 -                      ret = hid_parse(hdev);
 +                      ret = hid_open_report(hdev);
                        if (!ret)
                                ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
                }
 -              if (ret)
 +              if (ret) {
 +                      hid_close_report(hdev);
                        hdev->driver = NULL;
 +              }
        }
  unlock:
        up(&hdev->driver_lock);
@@@ -1789,7 -1745,6 +1790,7 @@@ static int hid_device_remove(struct dev
                        hdrv->remove(hdev);
                else /* default remove */
                        hid_hw_stop(hdev);
 +              hid_close_report(hdev);
                hdev->driver = NULL;
        }
  
        return 0;
  }
  
 +static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
 +                           char *buf)
 +{
 +      struct hid_device *hdev = container_of(dev, struct hid_device, dev);
 +      int len;
 +
 +      len = snprintf(buf, PAGE_SIZE, "hid:b%04Xg%04Xv%08Xp%08X\n",
 +                     hdev->bus, hdev->group, hdev->vendor, hdev->product);
 +
 +      return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len;
 +}
 +
 +static struct device_attribute hid_dev_attrs[] = {
 +      __ATTR_RO(modalias),
 +      __ATTR_NULL,
 +};
 +
  static int hid_uevent(struct device *dev, struct kobj_uevent_env *env)
  {
        struct hid_device *hdev = container_of(dev, struct hid_device, dev);
        if (add_uevent_var(env, "HID_UNIQ=%s", hdev->uniq))
                return -ENOMEM;
  
 -      if (add_uevent_var(env, "MODALIAS=hid:b%04Xv%08Xp%08X",
 -                      hdev->bus, hdev->vendor, hdev->product))
 +      if (add_uevent_var(env, "MODALIAS=hid:b%04Xg%04Xv%08Xp%08X",
 +                         hdev->bus, hdev->group, hdev->vendor, hdev->product))
                return -ENOMEM;
  
        return 0;
  
  static struct bus_type hid_bus_type = {
        .name           = "hid",
 +      .dev_attrs      = hid_dev_attrs,
        .match          = hid_bus_match,
        .probe          = hid_device_probe,
        .remove         = hid_device_remove,
@@@ -1999,16 -1936,6 +2000,16 @@@ static const struct hid_device_id hid_i
        { HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0004) },
        { HID_USB_DEVICE(USB_VENDOR_ID_PHILIPS, USB_DEVICE_ID_PHILIPS_IEEE802154_DONGLE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_POWERCOM, USB_DEVICE_ID_POWERCOM_UPS) },
 +#if defined(CONFIG_MOUSE_SYNAPTICS_USB) || defined(CONFIG_MOUSE_SYNAPTICS_USB_MODULE)
 +      { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_TP) },
 +      { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_INT_TP) },
 +      { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_CPAD) },
 +      { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_STICK) },
 +      { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_WP) },
 +      { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_COMP_TP) },
 +      { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_WTP) },
 +      { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_DPAD) },
 +#endif
        { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LABPRO) },
        { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP) },
        { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP) },
@@@ -2090,16 -2017,6 +2091,16 @@@ static bool hid_ignore(struct hid_devic
                if (hdev->product >= USB_DEVICE_ID_LOGITECH_HARMONY_FIRST &&
                                hdev->product <= USB_DEVICE_ID_LOGITECH_HARMONY_LAST)
                        return true;
 +              /*
 +               * The Keene FM transmitter USB device has the same USB ID as
 +               * the Logitech AudioHub Speaker, but it should ignore the hid.
 +               * Check if the name is that of the Keene device.
 +               * For reference: the name of the AudioHub is
 +               * "HOLTEK  AudioHub Speaker".
 +               */
 +              if (hdev->product == USB_DEVICE_ID_LOGITECH_AUDIOHUB &&
 +                      !strcmp(hdev->name, "HOLTEK  B-LINK USB Audio  "))
 +                              return true;
                break;
        case USB_VENDOR_ID_SOUNDGRAPH:
                if (hdev->product >= USB_DEVICE_ID_SOUNDGRAPH_IMON_FIRST &&
@@@ -2139,26 -2056,6 +2140,26 @@@ int hid_add_device(struct hid_device *h
              && (hid_ignore(hdev) || (hdev->quirks & HID_QUIRK_IGNORE)))
                return -ENODEV;
  
 +      /*
 +       * Read the device report descriptor once and use as template
 +       * for the driver-specific modifications.
 +       */
 +      ret = hdev->ll_driver->parse(hdev);
 +      if (ret)
 +              return ret;
 +      if (!hdev->dev_rdesc)
 +              return -ENODEV;
 +
 +      /*
 +       * Scan generic devices for group information
 +       */
 +      if (hid_ignore_special_drivers ||
 +          !hid_match_id(hdev, hid_have_special_driver)) {
 +              ret = hid_scan_report(hdev);
 +              if (ret)
 +                      hid_warn(hdev, "bad device descriptor (%d)\n", ret);
 +      }
 +
        /* XXX hack, any other cleaner solution after the driver core
         * is converted to allow more than 20 bytes as the device name? */
        dev_set_name(&hdev->dev, "%04X:%04X:%04X.%04X", hdev->bus,
@@@ -2187,6 -2084,7 +2188,6 @@@ EXPORT_SYMBOL_GPL(hid_add_device)
  struct hid_device *hid_allocate_device(void)
  {
        struct hid_device *hdev;
 -      unsigned int i;
        int ret = -ENOMEM;
  
        hdev = kzalloc(sizeof(*hdev), GFP_KERNEL);
        hdev->dev.release = hid_device_release;
        hdev->dev.bus = &hid_bus_type;
  
 -      hdev->collection = kcalloc(HID_DEFAULT_NUM_COLLECTIONS,
 -                      sizeof(struct hid_collection), GFP_KERNEL);
 -      if (hdev->collection == NULL)
 -              goto err;
 -      hdev->collection_size = HID_DEFAULT_NUM_COLLECTIONS;
 -
 -      for (i = 0; i < HID_REPORT_TYPES; i++)
 -              INIT_LIST_HEAD(&hdev->report_enum[i].report_list);
 +      hid_close_report(hdev);
  
        init_waitqueue_head(&hdev->debug_wait);
        INIT_LIST_HEAD(&hdev->debug_list);
        sema_init(&hdev->driver_lock, 1);
  
        return hdev;
 -err:
 -      put_device(&hdev->dev);
 -      return ERR_PTR(ret);
  }
  EXPORT_SYMBOL_GPL(hid_allocate_device);
  
@@@ -2214,9 -2122,6 +2215,9 @@@ static void hid_remove_device(struct hi
                hid_debug_unregister(hdev);
                hdev->status &= ~HID_STAT_ADDED;
        }
 +      kfree(hdev->dev_rdesc);
 +      hdev->dev_rdesc = NULL;
 +      hdev->dev_rsize = 0;
  }
  
  /**
diff --combined drivers/hid/hid-ids.h
index e39aecb1f9f28def0a0490a3de0ef29021f49ede,dbcbf30d68d94e97cc89316c4cdb4aa783cc89f9..e44932af8da27290b6b356f4598482f7288adb52
  #define USB_VENDOR_ID_AVERMEDIA               0x07ca
  #define USB_DEVICE_ID_AVER_FM_MR800   0xb800
  
+ #define USB_VENDOR_ID_BAANTO          0x2453
+ #define USB_DEVICE_ID_BAANTO_MT_190W2 0x0100
  #define USB_VENDOR_ID_BELKIN          0x050d
  #define USB_DEVICE_ID_FLIP_KVM                0x3201
  
  #define USB_DEVICE_ID_LG_MULTITOUCH   0x0064
  
  #define USB_VENDOR_ID_LOGITECH                0x046d
 +#define USB_DEVICE_ID_LOGITECH_AUDIOHUB 0x0a0e
  #define USB_DEVICE_ID_LOGITECH_RECEIVER       0xc101
  #define USB_DEVICE_ID_LOGITECH_HARMONY_FIRST  0xc110
  #define USB_DEVICE_ID_LOGITECH_HARMONY_LAST 0xc14f
  #define USB_DEVICE_ID_SYMBOL_SCANNER_1        0x0800
  #define USB_DEVICE_ID_SYMBOL_SCANNER_2        0x1300
  
 +#define USB_VENDOR_ID_SYNAPTICS               0x06cb
 +#define USB_DEVICE_ID_SYNAPTICS_TP    0x0001
 +#define USB_DEVICE_ID_SYNAPTICS_INT_TP        0x0002
 +#define USB_DEVICE_ID_SYNAPTICS_CPAD  0x0003
 +#define USB_DEVICE_ID_SYNAPTICS_TS    0x0006
 +#define USB_DEVICE_ID_SYNAPTICS_STICK 0x0007
 +#define USB_DEVICE_ID_SYNAPTICS_WP    0x0008
 +#define USB_DEVICE_ID_SYNAPTICS_COMP_TP       0x0009
 +#define USB_DEVICE_ID_SYNAPTICS_WTP   0x0010
 +#define USB_DEVICE_ID_SYNAPTICS_DPAD  0x0013
 +
  #define USB_VENDOR_ID_THRUSTMASTER    0x044f
  
  #define USB_VENDOR_ID_TIVO            0x150a
index b10c2044d893badbe482d7e756461cb419a44853,b929883e8a5b4fdc973d57dcf7090457eca71645..ece7cef915a98452d249c1aeed3c2085c244b020
@@@ -110,9 -110,6 +110,9 @@@ struct mt_device 
  
  #define MT_DEFAULT_MAXCONTACT 10
  
 +#define MT_USB_DEVICE(v, p)   HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH, v, p)
 +#define MT_BT_DEVICE(v, p)    HID_DEVICE(BUS_BLUETOOTH, HID_GROUP_MULTITOUCH, v, p)
 +
  /*
   * these device-dependent functions determine what slot corresponds
   * to a valid contact that was just read.
@@@ -638,21 -635,6 +638,21 @@@ static void mt_set_maxcontacts(struct h
        }
  }
  
 +static void mt_post_parse_default_settings(struct mt_device *td)
 +{
 +      __s32 quirks = td->mtclass.quirks;
 +
 +      /* unknown serial device needs special quirks */
 +      if (td->touches_by_report == 1) {
 +              quirks |= MT_QUIRK_ALWAYS_VALID;
 +              quirks &= ~MT_QUIRK_NOT_SEEN_MEANS_UP;
 +              quirks &= ~MT_QUIRK_VALID_IS_INRANGE;
 +              quirks &= ~MT_QUIRK_VALID_IS_CONFIDENCE;
 +      }
 +
 +      td->mtclass.quirks = quirks;
 +}
 +
  static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
  {
        int ret, i;
         * that emit events over several HID messages.
         */
        hdev->quirks |= HID_QUIRK_NO_INPUT_SYNC;
 -      hdev->quirks &= ~HID_QUIRK_MULTITOUCH;
  
        td = kzalloc(sizeof(struct mt_device), GFP_KERNEL);
        if (!td) {
        if (ret)
                goto fail;
  
 -      if (!id && td->touches_by_report == 1) {
 -              /* the device has been sent by hid-generic */
 -              mtclass = &td->mtclass;
 -              mtclass->quirks |= MT_QUIRK_ALWAYS_VALID;
 -              mtclass->quirks &= ~MT_QUIRK_NOT_SEEN_MEANS_UP;
 -              mtclass->quirks &= ~MT_QUIRK_VALID_IS_INRANGE;
 -              mtclass->quirks &= ~MT_QUIRK_VALID_IS_CONFIDENCE;
 -      }
 +      if (id->vendor == HID_ANY_ID && id->product == HID_ANY_ID)
 +              mt_post_parse_default_settings(td);
  
        td->slots = kzalloc(td->maxcontacts * sizeof(struct mt_slot),
                                GFP_KERNEL);
@@@ -738,50 -727,54 +738,54 @@@ static const struct hid_device_id mt_de
  
        /* 3M panels */
        { .driver_data = MT_CLS_3M,
 -              HID_USB_DEVICE(USB_VENDOR_ID_3M,
 +              MT_USB_DEVICE(USB_VENDOR_ID_3M,
                        USB_DEVICE_ID_3M1968) },
        { .driver_data = MT_CLS_3M,
 -              HID_USB_DEVICE(USB_VENDOR_ID_3M,
 +              MT_USB_DEVICE(USB_VENDOR_ID_3M,
                        USB_DEVICE_ID_3M2256) },
        { .driver_data = MT_CLS_3M,
 -              HID_USB_DEVICE(USB_VENDOR_ID_3M,
 +              MT_USB_DEVICE(USB_VENDOR_ID_3M,
                        USB_DEVICE_ID_3M3266) },
  
        /* ActionStar panels */
        { .driver_data = MT_CLS_DEFAULT,
 -              HID_USB_DEVICE(USB_VENDOR_ID_ACTIONSTAR,
 +              MT_USB_DEVICE(USB_VENDOR_ID_ACTIONSTAR,
                        USB_DEVICE_ID_ACTIONSTAR_1011) },
  
        /* Atmel panels */
        { .driver_data = MT_CLS_SERIAL,
 -              HID_USB_DEVICE(USB_VENDOR_ID_ATMEL,
 +              MT_USB_DEVICE(USB_VENDOR_ID_ATMEL,
                        USB_DEVICE_ID_ATMEL_MULTITOUCH) },
        { .driver_data = MT_CLS_SERIAL,
 -              HID_USB_DEVICE(USB_VENDOR_ID_ATMEL,
 +              MT_USB_DEVICE(USB_VENDOR_ID_ATMEL,
                        USB_DEVICE_ID_ATMEL_MXT_DIGITIZER) },
  
+       /* Baanto multitouch devices */
+       { .driver_data = MT_CLS_DEFAULT,
+               HID_USB_DEVICE(USB_VENDOR_ID_BAANTO,
+                       USB_DEVICE_ID_BAANTO_MT_190W2) },
        /* Cando panels */
        { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER,
 -              HID_USB_DEVICE(USB_VENDOR_ID_CANDO,
 +              MT_USB_DEVICE(USB_VENDOR_ID_CANDO,
                        USB_DEVICE_ID_CANDO_MULTI_TOUCH) },
        { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER,
 -              HID_USB_DEVICE(USB_VENDOR_ID_CANDO,
 +              MT_USB_DEVICE(USB_VENDOR_ID_CANDO,
                        USB_DEVICE_ID_CANDO_MULTI_TOUCH_10_1) },
        { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER,
 -              HID_USB_DEVICE(USB_VENDOR_ID_CANDO,
 +              MT_USB_DEVICE(USB_VENDOR_ID_CANDO,
                        USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6) },
        { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER,
 -              HID_USB_DEVICE(USB_VENDOR_ID_CANDO,
 +              MT_USB_DEVICE(USB_VENDOR_ID_CANDO,
                        USB_DEVICE_ID_CANDO_MULTI_TOUCH_15_6) },
  
        /* Chunghwa Telecom touch panels */
        {  .driver_data = MT_CLS_DEFAULT,
 -              HID_USB_DEVICE(USB_VENDOR_ID_CHUNGHWAT,
 +              MT_USB_DEVICE(USB_VENDOR_ID_CHUNGHWAT,
                        USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH) },
  
        /* CVTouch panels */
        { .driver_data = MT_CLS_DEFAULT,
 -              HID_USB_DEVICE(USB_VENDOR_ID_CVTOUCH,
 +              MT_USB_DEVICE(USB_VENDOR_ID_CVTOUCH,
                        USB_DEVICE_ID_CVTOUCH_SCREEN) },
  
        /* Cypress panel */
  
        /* eGalax devices (resistive) */
        { .driver_data = MT_CLS_EGALAX,
 -              HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
 +              MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
                        USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480D) },
        { .driver_data = MT_CLS_EGALAX,
 -              HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
 +              MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
                        USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_480E) },
  
        /* eGalax devices (capacitive) */
        { .driver_data = MT_CLS_EGALAX,
 -              HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
 +              MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
                        USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_720C) },
        { .driver_data = MT_CLS_EGALAX_SERIAL,
 -              HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
 +              MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
                        USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7207) },
        { .driver_data = MT_CLS_EGALAX_SERIAL,
 -              HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
 +              MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
                        USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_725E) },
        { .driver_data = MT_CLS_EGALAX_SERIAL,
 -              HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
 +              MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
                        USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7224) },
        { .driver_data = MT_CLS_EGALAX_SERIAL,
 -              HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
 +              MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
                        USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_722A) },
        { .driver_data = MT_CLS_EGALAX,
 -              HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
 +              MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
                        USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_726B) },
        { .driver_data = MT_CLS_EGALAX_SERIAL,
 -              HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
 +              MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
                        USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7262) },
        { .driver_data = MT_CLS_EGALAX,
 -              HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
 +              MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
                        USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72A1) },
        { .driver_data = MT_CLS_EGALAX_SERIAL,
 -              HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
 +              MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
                        USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72AA) },
        { .driver_data = MT_CLS_EGALAX,
 -              HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
 +              MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
                        USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72FA) },
        { .driver_data = MT_CLS_EGALAX,
 -              HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
 +              MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
                        USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7302) },
        { .driver_data = MT_CLS_EGALAX_SERIAL,
 -              HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
 +              MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
                        USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7349) },
        { .driver_data = MT_CLS_EGALAX_SERIAL,
 -              HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
 +              MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
                        USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_A001) },
  
        /* Elo TouchSystems IntelliTouch Plus panel */
        { .driver_data = MT_CLS_DUAL_NSMU_CONTACTID,
 -              HID_USB_DEVICE(USB_VENDOR_ID_ELO,
 +              MT_USB_DEVICE(USB_VENDOR_ID_ELO,
                        USB_DEVICE_ID_ELO_TS2515) },
  
        /* GeneralTouch panel */
        { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER,
 -              HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH,
 +              MT_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH,
                        USB_DEVICE_ID_GENERAL_TOUCH_WIN7_TWOFINGERS) },
  
        /* Gametel game controller */
        { .driver_data = MT_CLS_DEFAULT,
 -              HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_FRUCTEL,
 +              MT_BT_DEVICE(USB_VENDOR_ID_FRUCTEL,
                        USB_DEVICE_ID_GAMETEL_MT_MODE) },
  
        /* GoodTouch panels */
        { .driver_data = MT_CLS_DEFAULT,
 -              HID_USB_DEVICE(USB_VENDOR_ID_GOODTOUCH,
 +              MT_USB_DEVICE(USB_VENDOR_ID_GOODTOUCH,
                        USB_DEVICE_ID_GOODTOUCH_000f) },
  
        /* Hanvon panels */
        { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID,
 -              HID_USB_DEVICE(USB_VENDOR_ID_HANVON_ALT,
 +              MT_USB_DEVICE(USB_VENDOR_ID_HANVON_ALT,
                        USB_DEVICE_ID_HANVON_ALT_MULTITOUCH) },
  
        /* Ideacom panel */
        { .driver_data = MT_CLS_SERIAL,
 -              HID_USB_DEVICE(USB_VENDOR_ID_IDEACOM,
 +              MT_USB_DEVICE(USB_VENDOR_ID_IDEACOM,
                        USB_DEVICE_ID_IDEACOM_IDC6650) },
        { .driver_data = MT_CLS_SERIAL,
 -              HID_USB_DEVICE(USB_VENDOR_ID_IDEACOM,
 +              MT_USB_DEVICE(USB_VENDOR_ID_IDEACOM,
                        USB_DEVICE_ID_IDEACOM_IDC6651) },
  
        /* Ilitek dual touch panel */
        {  .driver_data = MT_CLS_DEFAULT,
 -              HID_USB_DEVICE(USB_VENDOR_ID_ILITEK,
 +              MT_USB_DEVICE(USB_VENDOR_ID_ILITEK,
                        USB_DEVICE_ID_ILITEK_MULTITOUCH) },
  
        /* IRTOUCH panels */
        { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID,
 -              HID_USB_DEVICE(USB_VENDOR_ID_IRTOUCHSYSTEMS,
 +              MT_USB_DEVICE(USB_VENDOR_ID_IRTOUCHSYSTEMS,
                        USB_DEVICE_ID_IRTOUCH_INFRARED_USB) },
  
        /* LG Display panels */
        { .driver_data = MT_CLS_DEFAULT,
 -              HID_USB_DEVICE(USB_VENDOR_ID_LG,
 +              MT_USB_DEVICE(USB_VENDOR_ID_LG,
                        USB_DEVICE_ID_LG_MULTITOUCH) },
  
        /* Lumio panels */
        { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
 -              HID_USB_DEVICE(USB_VENDOR_ID_LUMIO,
 +              MT_USB_DEVICE(USB_VENDOR_ID_LUMIO,
                        USB_DEVICE_ID_CRYSTALTOUCH) },
        { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
 -              HID_USB_DEVICE(USB_VENDOR_ID_LUMIO,
 +              MT_USB_DEVICE(USB_VENDOR_ID_LUMIO,
                        USB_DEVICE_ID_CRYSTALTOUCH_DUAL) },
  
        /* MosArt panels */
        { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
 -              HID_USB_DEVICE(USB_VENDOR_ID_ASUS,
 +              MT_USB_DEVICE(USB_VENDOR_ID_ASUS,
                        USB_DEVICE_ID_ASUS_T91MT)},
        { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
 -              HID_USB_DEVICE(USB_VENDOR_ID_ASUS,
 +              MT_USB_DEVICE(USB_VENDOR_ID_ASUS,
                        USB_DEVICE_ID_ASUSTEK_MULTITOUCH_YFO) },
        { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
 -              HID_USB_DEVICE(USB_VENDOR_ID_TURBOX,
 +              MT_USB_DEVICE(USB_VENDOR_ID_TURBOX,
                        USB_DEVICE_ID_TURBOX_TOUCHSCREEN_MOSART) },
  
        /* Panasonic panels */
        { .driver_data = MT_CLS_PANASONIC,
 -              HID_USB_DEVICE(USB_VENDOR_ID_PANASONIC,
 +              MT_USB_DEVICE(USB_VENDOR_ID_PANASONIC,
                        USB_DEVICE_ID_PANABOARD_UBT780) },
        { .driver_data = MT_CLS_PANASONIC,
 -              HID_USB_DEVICE(USB_VENDOR_ID_PANASONIC,
 +              MT_USB_DEVICE(USB_VENDOR_ID_PANASONIC,
                        USB_DEVICE_ID_PANABOARD_UBT880) },
  
        /* PenMount panels */
        { .driver_data = MT_CLS_CONFIDENCE,
 -              HID_USB_DEVICE(USB_VENDOR_ID_PENMOUNT,
 +              MT_USB_DEVICE(USB_VENDOR_ID_PENMOUNT,
                        USB_DEVICE_ID_PENMOUNT_PCI) },
  
        /* PixArt optical touch screen */
        { .driver_data = MT_CLS_INRANGE_CONTACTNUMBER,
 -              HID_USB_DEVICE(USB_VENDOR_ID_PIXART,
 +              MT_USB_DEVICE(USB_VENDOR_ID_PIXART,
                        USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN) },
        { .driver_data = MT_CLS_INRANGE_CONTACTNUMBER,
 -              HID_USB_DEVICE(USB_VENDOR_ID_PIXART,
 +              MT_USB_DEVICE(USB_VENDOR_ID_PIXART,
                        USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN1) },
        { .driver_data = MT_CLS_INRANGE_CONTACTNUMBER,
 -              HID_USB_DEVICE(USB_VENDOR_ID_PIXART,
 +              MT_USB_DEVICE(USB_VENDOR_ID_PIXART,
                        USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN2) },
  
        /* PixCir-based panels */
        { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID,
 -              HID_USB_DEVICE(USB_VENDOR_ID_HANVON,
 +              MT_USB_DEVICE(USB_VENDOR_ID_HANVON,
                        USB_DEVICE_ID_HANVON_MULTITOUCH) },
        { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID,
 -              HID_USB_DEVICE(USB_VENDOR_ID_CANDO,
 +              MT_USB_DEVICE(USB_VENDOR_ID_CANDO,
                        USB_DEVICE_ID_CANDO_PIXCIR_MULTI_TOUCH) },
  
        /* Quanta-based panels */
        { .driver_data = MT_CLS_CONFIDENCE_CONTACT_ID,
 -              HID_USB_DEVICE(USB_VENDOR_ID_QUANTA,
 +              MT_USB_DEVICE(USB_VENDOR_ID_QUANTA,
                        USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH) },
        { .driver_data = MT_CLS_CONFIDENCE_CONTACT_ID,
 -              HID_USB_DEVICE(USB_VENDOR_ID_QUANTA,
 +              MT_USB_DEVICE(USB_VENDOR_ID_QUANTA,
                        USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3001) },
        { .driver_data = MT_CLS_CONFIDENCE_CONTACT_ID,
 -              HID_USB_DEVICE(USB_VENDOR_ID_QUANTA,
 +              MT_USB_DEVICE(USB_VENDOR_ID_QUANTA,
                        USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3008) },
  
        /* Stantum panels */
        { .driver_data = MT_CLS_CONFIDENCE,
 -              HID_USB_DEVICE(USB_VENDOR_ID_STANTUM,
 +              MT_USB_DEVICE(USB_VENDOR_ID_STANTUM,
                        USB_DEVICE_ID_MTP)},
        { .driver_data = MT_CLS_CONFIDENCE,
 -              HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_STM,
 +              MT_USB_DEVICE(USB_VENDOR_ID_STANTUM_STM,
                        USB_DEVICE_ID_MTP_STM)},
        { .driver_data = MT_CLS_CONFIDENCE,
 -              HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_SITRONIX,
 +              MT_USB_DEVICE(USB_VENDOR_ID_STANTUM_SITRONIX,
                        USB_DEVICE_ID_MTP_SITRONIX)},
  
        /* TopSeed panels */
        { .driver_data = MT_CLS_TOPSEED,
 -              HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED2,
 +              MT_USB_DEVICE(USB_VENDOR_ID_TOPSEED2,
                        USB_DEVICE_ID_TOPSEED2_PERIPAD_701) },
  
        /* Touch International panels */
        { .driver_data = MT_CLS_DEFAULT,
 -              HID_USB_DEVICE(USB_VENDOR_ID_TOUCH_INTL,
 +              MT_USB_DEVICE(USB_VENDOR_ID_TOUCH_INTL,
                        USB_DEVICE_ID_TOUCH_INTL_MULTI_TOUCH) },
  
        /* Unitec panels */
        { .driver_data = MT_CLS_DEFAULT,
 -              HID_USB_DEVICE(USB_VENDOR_ID_UNITEC,
 +              MT_USB_DEVICE(USB_VENDOR_ID_UNITEC,
                        USB_DEVICE_ID_UNITEC_USB_TOUCH_0709) },
        { .driver_data = MT_CLS_DEFAULT,
 -              HID_USB_DEVICE(USB_VENDOR_ID_UNITEC,
 +              MT_USB_DEVICE(USB_VENDOR_ID_UNITEC,
                        USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19) },
        /* XAT */
        { .driver_data = MT_CLS_DEFAULT,
 -              HID_USB_DEVICE(USB_VENDOR_ID_XAT,
 +              MT_USB_DEVICE(USB_VENDOR_ID_XAT,
                        USB_DEVICE_ID_XAT_CSR) },
  
        /* Xiroku */
        { .driver_data = MT_CLS_DEFAULT,
 -              HID_USB_DEVICE(USB_VENDOR_ID_XIROKU,
 +              MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
                        USB_DEVICE_ID_XIROKU_SPX) },
        { .driver_data = MT_CLS_DEFAULT,
 -              HID_USB_DEVICE(USB_VENDOR_ID_XIROKU,
 +              MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
                        USB_DEVICE_ID_XIROKU_MPX) },
        { .driver_data = MT_CLS_DEFAULT,
 -              HID_USB_DEVICE(USB_VENDOR_ID_XIROKU,
 +              MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
                        USB_DEVICE_ID_XIROKU_CSR) },
        { .driver_data = MT_CLS_DEFAULT,
 -              HID_USB_DEVICE(USB_VENDOR_ID_XIROKU,
 +              MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
                        USB_DEVICE_ID_XIROKU_SPX1) },
        { .driver_data = MT_CLS_DEFAULT,
 -              HID_USB_DEVICE(USB_VENDOR_ID_XIROKU,
 +              MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
                        USB_DEVICE_ID_XIROKU_MPX1) },
        { .driver_data = MT_CLS_DEFAULT,
 -              HID_USB_DEVICE(USB_VENDOR_ID_XIROKU,
 +              MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
                        USB_DEVICE_ID_XIROKU_CSR1) },
        { .driver_data = MT_CLS_DEFAULT,
 -              HID_USB_DEVICE(USB_VENDOR_ID_XIROKU,
 +              MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
                        USB_DEVICE_ID_XIROKU_SPX2) },
        { .driver_data = MT_CLS_DEFAULT,
 -              HID_USB_DEVICE(USB_VENDOR_ID_XIROKU,
 +              MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
                        USB_DEVICE_ID_XIROKU_MPX2) },
        { .driver_data = MT_CLS_DEFAULT,
 -              HID_USB_DEVICE(USB_VENDOR_ID_XIROKU,
 +              MT_USB_DEVICE(USB_VENDOR_ID_XIROKU,
                        USB_DEVICE_ID_XIROKU_CSR2) },
  
 +      /* Generic MT device */
 +      { HID_DEVICE(HID_BUS_ANY, HID_GROUP_MULTITOUCH, HID_ANY_ID, HID_ANY_ID) },
        { }
  };
  MODULE_DEVICE_TABLE(hid, mt_devices);