From 81586906816cadbbfca6e5f2ad6a6ba791d09819 Mon Sep 17 00:00:00 2001 From: Jason Gerecke Date: Sun, 21 Oct 2012 00:38:03 -0700 Subject: [PATCH] --- yaml --- r: 334847 b: refs/heads/master c: aea2bf6a57a9e4596bfad164f986ba10ddc6adf3 h: refs/heads/master i: 334845: 3602185643e63e411ea0c8b490521547e6272bed 334843: 35b27db0b0bb96ce401ab06a7bcd7024c6f14f45 334839: 11f52bf195c5bd0a3e5b4d05761ca0e8fe41559f 334831: 7c3fdbb82c67168e2efd0f97a1b37222d5b21b9a 334815: d9e8f5d43f1755aa1e8820abd1e09b6cb72e7bd6 334783: 95c713b594169eb31ac93f95cfe2cfaffec4d224 334719: f093f316ff32eb575a29a0c723cfc74cf3b0982c 334591: 83ecf23a3ab3748b8cfb74f996a7e83c0bac5e07 334335: 5a9100354ca3efbcedce883e4211e6ed14ba6df1 333823: 57a241b461ab44410fb256eecf6c0280954c5313 v: v3 --- [refs] | 2 +- trunk/drivers/input/tablet/wacom_sys.c | 32 +++++++++++++++++++++++++- trunk/drivers/input/tablet/wacom_wac.c | 3 ++- trunk/drivers/input/tablet/wacom_wac.h | 2 ++ 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index d2b3ccd93f96..f20161dd6ceb 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 2008713c7174e5c0f207bac684c6df0939047009 +refs/heads/master: aea2bf6a57a9e4596bfad164f986ba10ddc6adf3 diff --git a/trunk/drivers/input/tablet/wacom_sys.c b/trunk/drivers/input/tablet/wacom_sys.c index 9edf9806cff9..8b89e15bcf32 100644 --- a/trunk/drivers/input/tablet/wacom_sys.c +++ b/trunk/drivers/input/tablet/wacom_sys.c @@ -613,6 +613,30 @@ struct wacom_usbdev_data { static LIST_HEAD(wacom_udev_list); static DEFINE_MUTEX(wacom_udev_list_lock); +static struct usb_device *wacom_get_sibling(struct usb_device *dev, int vendor, int product) +{ + int port1; + struct usb_device *sibling; + + if (vendor == 0 && product == 0) + return dev; + + if (dev->parent == NULL) + return NULL; + + usb_hub_for_each_child(dev->parent, port1, sibling) { + struct usb_device_descriptor *d; + if (sibling == NULL) + continue; + + d = &sibling->descriptor; + if (d->idVendor == vendor && d->idProduct == product) + return sibling; + } + + return NULL; +} + static struct wacom_usbdev_data *wacom_get_usbdev_data(struct usb_device *dev) { struct wacom_usbdev_data *data; @@ -1257,13 +1281,19 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name)); if (features->quirks & WACOM_QUIRK_MULTI_INPUT) { + struct usb_device *other_dev; + /* Append the device type to the name */ strlcat(wacom_wac->name, features->device_type == BTN_TOOL_PEN ? " Pen" : " Finger", sizeof(wacom_wac->name)); - error = wacom_add_shared_data(wacom_wac, dev); + + other_dev = wacom_get_sibling(dev, features->oVid, features->oPid); + if (other_dev == NULL || wacom_get_usbdev_data(other_dev) == NULL) + other_dev = dev; + error = wacom_add_shared_data(wacom_wac, other_dev); if (error) goto fail3; } diff --git a/trunk/drivers/input/tablet/wacom_wac.c b/trunk/drivers/input/tablet/wacom_wac.c index c3468c8dbd89..21d1f4eaff53 100644 --- a/trunk/drivers/input/tablet/wacom_wac.c +++ b/trunk/drivers/input/tablet/wacom_wac.c @@ -1340,7 +1340,8 @@ void wacom_setup_device_quirks(struct wacom_features *features) /* these device have multiple inputs */ if (features->type >= WIRELESS || - (features->type >= INTUOS5S && features->type <= INTUOS5L)) + (features->type >= INTUOS5S && features->type <= INTUOS5L) || + (features->oVid && features->oPid)) features->quirks |= WACOM_QUIRK_MULTI_INPUT; /* quirk for bamboo touch with 2 low res touches */ diff --git a/trunk/drivers/input/tablet/wacom_wac.h b/trunk/drivers/input/tablet/wacom_wac.h index 96c185cc301e..3f926ec19ef9 100644 --- a/trunk/drivers/input/tablet/wacom_wac.h +++ b/trunk/drivers/input/tablet/wacom_wac.h @@ -109,6 +109,8 @@ struct wacom_features { int distance_fuzz; unsigned quirks; unsigned touch_max; + int oVid; + int oPid; }; struct wacom_shared {