Commit 57bcfce3 authored by Ping Cheng's avatar Ping Cheng Committed by Dmitry Torokhov

Input: wacom - not all multi-interface devices support touch

Some multi-interface devices support expresskeys on a separate interface,
such as Bamboo; some multi-interface devices do not support touch at all,
such as Pen only Intuos5. Make sure we report the right device names.
Tested-by: default avatarJason Gerecke <killertofu@gmail.com>
Signed-off-by: default avatarPing Cheng <pingc@wacom.com>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent a4da4752
...@@ -1188,34 +1188,47 @@ static void wacom_wireless_work(struct work_struct *work) ...@@ -1188,34 +1188,47 @@ static void wacom_wireless_work(struct work_struct *work)
wacom_wac1->features = wacom_wac1->features =
*((struct wacom_features *)id->driver_info); *((struct wacom_features *)id->driver_info);
wacom_wac1->features.device_type = BTN_TOOL_PEN; wacom_wac1->features.device_type = BTN_TOOL_PEN;
snprintf(wacom_wac1->name, WACOM_NAME_MAX, "%s (WL) Pen",
wacom_wac1->features.name);
error = wacom_register_input(wacom1); error = wacom_register_input(wacom1);
if (error) if (error)
goto fail1; goto fail;
/* Touch interface */ /* Touch interface */
wacom_wac2->features = if (wacom_wac1->features.touch_max) {
*((struct wacom_features *)id->driver_info); wacom_wac2->features =
wacom_wac2->features.pktlen = WACOM_PKGLEN_BBTOUCH3; *((struct wacom_features *)id->driver_info);
wacom_wac2->features.device_type = BTN_TOOL_FINGER; wacom_wac2->features.pktlen = WACOM_PKGLEN_BBTOUCH3;
wacom_wac2->features.x_max = wacom_wac2->features.y_max = 4096; wacom_wac2->features.device_type = BTN_TOOL_FINGER;
error = wacom_register_input(wacom2); wacom_wac2->features.x_max = wacom_wac2->features.y_max = 4096;
if (error) if (wacom_wac2->features.touch_max)
goto fail2; snprintf(wacom_wac2->name, WACOM_NAME_MAX,
"%s (WL) Finger",wacom_wac2->features.name);
else
snprintf(wacom_wac2->name, WACOM_NAME_MAX,
"%s (WL) Pad",wacom_wac2->features.name);
error = wacom_register_input(wacom2);
if (error)
goto fail;
}
error = wacom_initialize_battery(wacom); error = wacom_initialize_battery(wacom);
if (error) if (error)
goto fail3; goto fail;
} }
return; return;
fail3: fail:
input_unregister_device(wacom_wac2->input); if (wacom_wac2->input) {
wacom_wac2->input = NULL; input_unregister_device(wacom_wac2->input);
fail2: wacom_wac2->input = NULL;
input_unregister_device(wacom_wac1->input); }
wacom_wac1->input = NULL;
fail1: if (wacom_wac1->input) {
input_unregister_device(wacom_wac1->input);
wacom_wac1->input = NULL;
}
return; return;
} }
...@@ -1332,10 +1345,12 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i ...@@ -1332,10 +1345,12 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
struct usb_device *other_dev; struct usb_device *other_dev;
/* Append the device type to the name */ /* Append the device type to the name */
strlcat(wacom_wac->name, if (features->device_type != BTN_TOOL_FINGER)
features->device_type == BTN_TOOL_PEN ? strlcat(wacom_wac->name, " Pen", WACOM_NAME_MAX);
" Pen" : " Finger", else if (features->touch_max)
sizeof(wacom_wac->name)); strlcat(wacom_wac->name, " Finger", WACOM_NAME_MAX);
else
strlcat(wacom_wac->name, " Pad", WACOM_NAME_MAX);
other_dev = wacom_get_sibling(dev, features->oVid, features->oPid); other_dev = wacom_get_sibling(dev, features->oVid, features->oPid);
if (other_dev == NULL || wacom_get_usbdev_data(other_dev) == NULL) if (other_dev == NULL || wacom_get_usbdev_data(other_dev) == NULL)
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
/* maximum packet length for USB devices */ /* maximum packet length for USB devices */
#define WACOM_PKGLEN_MAX 64 #define WACOM_PKGLEN_MAX 64
#define WACOM_NAME_MAX 64
/* packet length for individual models */ /* packet length for individual models */
#define WACOM_PKGLEN_PENPRTN 7 #define WACOM_PKGLEN_PENPRTN 7
#define WACOM_PKGLEN_GRAPHIRE 8 #define WACOM_PKGLEN_GRAPHIRE 8
...@@ -130,7 +132,7 @@ struct wacom_shared { ...@@ -130,7 +132,7 @@ struct wacom_shared {
}; };
struct wacom_wac { struct wacom_wac {
char name[64]; char name[WACOM_NAME_MAX];
unsigned char *data; unsigned char *data;
int tool[2]; int tool[2];
int id[2]; int id[2];
......
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