Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+36 −21
Original line number Diff line number Diff line
@@ -1188,34 +1188,47 @@ static void wacom_wireless_work(struct work_struct *work)
		wacom_wac1->features =
			*((struct wacom_features *)id->driver_info);
		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);
		if (error)
			goto fail1;
			goto fail;

		/* Touch interface */
		if (wacom_wac1->features.touch_max) {
			wacom_wac2->features =
				*((struct wacom_features *)id->driver_info);
			wacom_wac2->features.pktlen = WACOM_PKGLEN_BBTOUCH3;
			wacom_wac2->features.device_type = BTN_TOOL_FINGER;
			wacom_wac2->features.x_max = wacom_wac2->features.y_max = 4096;
			if (wacom_wac2->features.touch_max)
				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 fail2;
				goto fail;
		}

		error = wacom_initialize_battery(wacom);
		if (error)
			goto fail3;
			goto fail;
	}

	return;

fail3:
fail:
	if (wacom_wac2->input) {
		input_unregister_device(wacom_wac2->input);
		wacom_wac2->input = NULL;
fail2:
	}

	if (wacom_wac1->input) {
		input_unregister_device(wacom_wac1->input);
		wacom_wac1->input = NULL;
fail1:
	}
	return;
}

@@ -1332,10 +1345,12 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
		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));
		if (features->device_type != BTN_TOOL_FINGER)
			strlcat(wacom_wac->name, " Pen", WACOM_NAME_MAX);
		else if (features->touch_max)
			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);
		if (other_dev == NULL || wacom_get_usbdev_data(other_dev) == NULL)
+3 −1
Original line number Diff line number Diff line
@@ -14,6 +14,8 @@
/* maximum packet length for USB devices */
#define WACOM_PKGLEN_MAX	64

#define WACOM_NAME_MAX		64

/* packet length for individual models */
#define WACOM_PKGLEN_PENPRTN	 7
#define WACOM_PKGLEN_GRAPHIRE	 8
@@ -130,7 +132,7 @@ struct wacom_shared {
};

struct wacom_wac {
	char name[64];
	char name[WACOM_NAME_MAX];
	unsigned char *data;
	int tool[2];
	int id[2];