]> Pileus Git - ~andy/linux/commitdiff
HID: handle all multitouch devices through hid-multitouch
authorBenjamin Tissoires <benjamin.tissoires@enac.fr>
Tue, 6 Mar 2012 16:57:04 +0000 (17:57 +0100)
committerJiri Kosina <jkosina@suse.cz>
Mon, 12 Mar 2012 10:27:07 +0000 (11:27 +0100)
When the quirk HID_QUIRK_MULTITOUCH is present and when hid-multitouch
is loaded, let's pass the device to hid-multitouch even if it has
not been registered in hid-multitouch.

If any other driver wants to take precedence over hid-multitouch,
the usual way of adding it to hid_have_special_driver will work as
the quirk HID_QUIRK_MULTITOUCH won't be set by the generic hid layer.

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@enac.fr>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hid-core.c
drivers/hid/hid-multitouch.c

index 4f4143cc789b8928a0a2e05498cecbf461fa9338..05a0c9a35bf297c77f92dc2101606cb8998e6e47 100644 (file)
@@ -1232,7 +1232,6 @@ int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
                hdev->claimed |= HID_CLAIMED_INPUT;
        if (hdev->quirks & HID_QUIRK_MULTITOUCH) {
                /* this device should be handled by hid-multitouch, skip it */
-               hdev->quirks &= ~HID_QUIRK_MULTITOUCH;
                return -ENODEV;
        }
 
@@ -1667,6 +1666,10 @@ static int hid_bus_match(struct device *dev, struct device_driver *drv)
        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;
 
@@ -1691,8 +1694,11 @@ static int hid_device_probe(struct device *dev)
        if (!hdev->driver) {
                id = hid_match_device(hdev, hdrv);
                if (id == NULL) {
-                       ret = -ENODEV;
-                       goto unlock;
+                       if (!((hdev->quirks & HID_QUIRK_MULTITOUCH) &&
+                               !strncmp(hdrv->name, "hid-multitouch", 14))) {
+                               ret = -ENODEV;
+                               goto unlock;
+                       }
                }
 
                hdev->driver = hdrv;
index 2088ab4e5db5a1a4c353688804beac440d5166a4..a61ba42e1bffc2c77b2e647e53aafb0e01b33d27 100644 (file)
@@ -637,10 +637,12 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
        struct mt_device *td;
        struct mt_class *mtclass = mt_classes; /* MT_CLS_DEFAULT */
 
-       for (i = 0; mt_classes[i].name ; i++) {
-               if (id->driver_data == mt_classes[i].name) {
-                       mtclass = &(mt_classes[i]);
-                       break;
+       if (id) {
+               for (i = 0; mt_classes[i].name ; i++) {
+                       if (id->driver_data == mt_classes[i].name) {
+                               mtclass = &(mt_classes[i]);
+                               break;
+                       }
                }
        }
 
@@ -648,6 +650,7 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
         * 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) {