Commit 0db3bfc72adf0cb70f08dfe92e4040f64e25e205
Committed by
Jiri Kosina
1 parent
b77c3920e9
Exists in
master
and in
6 other branches
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 | }; |