Commit 8d179a9e authored by Benjamin Tissoires's avatar Benjamin Tissoires Committed by Jiri Kosina

HID: handle all multitouch devices through hid-multitouch

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: default avatarBenjamin Tissoires <benjamin.tissoires@enac.fr>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent ed9d5c96
...@@ -1232,7 +1232,6 @@ int hid_connect(struct hid_device *hdev, unsigned int connect_mask) ...@@ -1232,7 +1232,6 @@ int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
hdev->claimed |= HID_CLAIMED_INPUT; hdev->claimed |= HID_CLAIMED_INPUT;
if (hdev->quirks & HID_QUIRK_MULTITOUCH) { if (hdev->quirks & HID_QUIRK_MULTITOUCH) {
/* this device should be handled by hid-multitouch, skip it */ /* this device should be handled by hid-multitouch, skip it */
hdev->quirks &= ~HID_QUIRK_MULTITOUCH;
return -ENODEV; return -ENODEV;
} }
...@@ -1667,6 +1666,10 @@ static int hid_bus_match(struct device *dev, struct device_driver *drv) ...@@ -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_driver *hdrv = container_of(drv, struct hid_driver, driver);
struct hid_device *hdev = container_of(dev, struct hid_device, dev); 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)) if (!hid_match_device(hdev, hdrv))
return 0; return 0;
...@@ -1691,8 +1694,11 @@ static int hid_device_probe(struct device *dev) ...@@ -1691,8 +1694,11 @@ static int hid_device_probe(struct device *dev)
if (!hdev->driver) { if (!hdev->driver) {
id = hid_match_device(hdev, hdrv); id = hid_match_device(hdev, hdrv);
if (id == NULL) { if (id == NULL) {
ret = -ENODEV; if (!((hdev->quirks & HID_QUIRK_MULTITOUCH) &&
goto unlock; !strncmp(hdrv->name, "hid-multitouch", 14))) {
ret = -ENODEV;
goto unlock;
}
} }
hdev->driver = hdrv; hdev->driver = hdrv;
......
...@@ -637,10 +637,12 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) ...@@ -637,10 +637,12 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
struct mt_device *td; struct mt_device *td;
struct mt_class *mtclass = mt_classes; /* MT_CLS_DEFAULT */ struct mt_class *mtclass = mt_classes; /* MT_CLS_DEFAULT */
for (i = 0; mt_classes[i].name ; i++) { if (id) {
if (id->driver_data == mt_classes[i].name) { for (i = 0; mt_classes[i].name ; i++) {
mtclass = &(mt_classes[i]); if (id->driver_data == mt_classes[i].name) {
break; mtclass = &(mt_classes[i]);
break;
}
} }
} }
...@@ -648,6 +650,7 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) ...@@ -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. * that emit events over several HID messages.
*/ */
hdev->quirks |= HID_QUIRK_NO_INPUT_SYNC; hdev->quirks |= HID_QUIRK_NO_INPUT_SYNC;
hdev->quirks &= ~HID_QUIRK_MULTITOUCH;
td = kzalloc(sizeof(struct mt_device), GFP_KERNEL); td = kzalloc(sizeof(struct mt_device), GFP_KERNEL);
if (!td) { if (!td) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment