Commit 0db3bfc72adf0cb70f08dfe92e4040f64e25e205

Authored by Benjamin Tissoires
Committed by Jiri Kosina
1 parent b77c3920e9

HID: multitouch: decide if hid-multitouch needs to handle mt devices

Now that hid-generic ignores all win7 compatible multitouch devices, this patch
allows hid-multitouch to catch them.  The idea is to rely on the quirk
HID_QUIRK_MULTITOUCH to drop the device if no ContactID is given.

There is the need for a blacklist here as other devices may need a special
driver (ntrig for instance).

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>

Showing 1 changed file with 43 additions and 4 deletions Side-by-side Diff

drivers/hid/hid-multitouch.c
... ... @@ -291,6 +291,7 @@
291 291 td->last_slot_field = usage->hid;
292 292 td->last_field_index = field->index;
293 293 td->last_mt_collection = usage->collection_index;
  294 + hdev->quirks &= ~HID_QUIRK_MULTITOUCH;
294 295 return 1;
295 296 case HID_DG_WIDTH:
296 297 hid_map_usage(hi, usage, bit, max,
297 298  
... ... @@ -529,12 +530,44 @@
529 530 }
530 531 }
531 532  
  533 +/* a list of devices for which there is a specialized multitouch driver */
  534 +static const struct hid_device_id mt_have_special_driver[] = {
  535 + { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, 0x0001) },
  536 + { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, 0x0006) },
  537 + { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA,
  538 + USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN) },
  539 + { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA,
  540 + USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH) },
  541 + { }
  542 +};
  543 +
  544 +static bool mt_match_one_id(struct hid_device *hdev,
  545 + const struct hid_device_id *id)
  546 +{
  547 + return id->bus == hdev->bus &&
  548 + (id->vendor == HID_ANY_ID || id->vendor == hdev->vendor) &&
  549 + (id->product == HID_ANY_ID || id->product == hdev->product);
  550 +}
  551 +
  552 +static const struct hid_device_id *mt_match_id(struct hid_device *hdev,
  553 + const struct hid_device_id *id)
  554 +{
  555 + for (; id->bus; id++)
  556 + if (mt_match_one_id(hdev, id))
  557 + return id;
  558 +
  559 + return NULL;
  560 +}
  561 +
532 562 static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
533 563 {
534 564 int ret, i;
535 565 struct mt_device *td;
536 566 struct mt_class *mtclass = mt_classes; /* MT_CLS_DEFAULT */
537 567  
  568 + if (mt_match_id(hdev, mt_have_special_driver))
  569 + return -ENODEV;
  570 +
538 571 for (i = 0; mt_classes[i].name ; i++) {
539 572 if (id->driver_data == mt_classes[i].name) {
540 573 mtclass = &(mt_classes[i]);
... ... @@ -542,10 +575,6 @@
542 575 }
543 576 }
544 577  
545   - /* This allows the driver to correctly support devices
546   - * that emit events over several HID messages.
547   - */
548   - hdev->quirks |= HID_QUIRK_NO_INPUT_SYNC;
549 578  
550 579 td = kzalloc(sizeof(struct mt_device), GFP_KERNEL);
551 580 if (!td) {
552 581  
... ... @@ -561,10 +590,16 @@
561 590 if (ret != 0)
562 591 goto fail;
563 592  
  593 + hdev->quirks |= HID_QUIRK_MULTITOUCH;
564 594 ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
565 595 if (ret)
566 596 goto fail;
567 597  
  598 + /* This allows the driver to correctly support devices
  599 + * that emit events over several HID messages.
  600 + */
  601 + hdev->quirks |= HID_QUIRK_NO_INPUT_SYNC;
  602 +
568 603 td->slots = kzalloc(td->maxcontacts * sizeof(struct mt_slot),
569 604 GFP_KERNEL);
570 605 if (!td->slots) {
... ... @@ -757,6 +792,10 @@
757 792 { .driver_data = MT_CLS_DEFAULT,
758 793 HID_USB_DEVICE(USB_VENDOR_ID_XAT,
759 794 USB_DEVICE_ID_XAT_CSR) },
  795 +
  796 + /* Rest of the world */
  797 + { .driver_data = MT_CLS_DEFAULT,
  798 + HID_USB_DEVICE(HID_ANY_ID, HID_ANY_ID) },
760 799  
761 800 { }
762 801 };