Skip to content

Commit

Permalink
Input: wacom - handle split-sensor devices with internal hubs
Browse files Browse the repository at this point in the history
Like our other pen-and-touch products, the Cintiq 24HD touch needs data
to be shared between its two sensors to facilitate proximity-based palm
rejection.

Unlike other tablets that report sensor data through separate interfaces
of the same USB device, the Cintiq 24HD touch has separate USB devices
that are connected to an internal USB hub.

This patch makes it possible to designate the USB VID/PID of the other
device so that the two may share data.  To ensure we don't accidentally
link to a sensor from a physically separate device (if several have been
plugged in), we limit the search to siblings (i.e., devices directly
connected to the same hub).

Signed-off-by: Jason Gerecke <killertofu@gmail.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Jason Gerecke authored and Linus Torvalds committed Oct 25, 2012
1 parent 2008713 commit aea2bf6
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 2 deletions.
32 changes: 31 additions & 1 deletion drivers/input/tablet/wacom_sys.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down
3 changes: 2 additions & 1 deletion drivers/input/tablet/wacom_wac.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
2 changes: 2 additions & 0 deletions drivers/input/tablet/wacom_wac.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,8 @@ struct wacom_features {
int distance_fuzz;
unsigned quirks;
unsigned touch_max;
int oVid;
int oPid;
};

struct wacom_shared {
Expand Down

0 comments on commit aea2bf6

Please sign in to comment.