1 /*
2  * drivers/input/tablet/wacom_sys.c
3  *
4  *  USB Wacom tablet support - system specific code
5  */
6 
7 /*
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  */
13 
14 #include "wacom_wac.h"
15 #include "wacom.h"
16 
17 /* defines to get HID report descriptor */
18 #define HID_DEVICET_HID		(USB_TYPE_CLASS | 0x01)
19 #define HID_DEVICET_REPORT	(USB_TYPE_CLASS | 0x02)
20 #define HID_USAGE_UNDEFINED		0x00
21 #define HID_USAGE_PAGE			0x05
22 #define HID_USAGE_PAGE_DIGITIZER	0x0d
23 #define HID_USAGE_PAGE_DESKTOP		0x01
24 #define HID_USAGE			0x09
25 #define HID_USAGE_X			0x30
26 #define HID_USAGE_Y			0x31
27 #define HID_USAGE_X_TILT		0x3d
28 #define HID_USAGE_Y_TILT		0x3e
29 #define HID_USAGE_FINGER		0x22
30 #define HID_USAGE_STYLUS		0x20
31 #define HID_COLLECTION			0xc0
32 
33 enum {
34 	WCM_UNDEFINED = 0,
35 	WCM_DESKTOP,
36 	WCM_DIGITIZER,
37 };
38 
39 struct hid_descriptor {
40 	struct usb_descriptor_header header;
41 	__le16   bcdHID;
42 	u8       bCountryCode;
43 	u8       bNumDescriptors;
44 	u8       bDescriptorType;
45 	__le16   wDescriptorLength;
46 } __attribute__ ((packed));
47 
48 /* defines to get/set USB message */
49 #define USB_REQ_GET_REPORT	0x01
50 #define USB_REQ_SET_REPORT	0x09
51 #define WAC_HID_FEATURE_REPORT	0x03
52 
usb_get_report(struct usb_interface * intf,unsigned char type,unsigned char id,void * buf,int size)53 static int usb_get_report(struct usb_interface *intf, unsigned char type,
54 				unsigned char id, void *buf, int size)
55 {
56 	return usb_control_msg(interface_to_usbdev(intf),
57 		usb_rcvctrlpipe(interface_to_usbdev(intf), 0),
58 		USB_REQ_GET_REPORT, USB_TYPE_CLASS | USB_RECIP_INTERFACE,
59 		(type << 8) + id, intf->altsetting[0].desc.bInterfaceNumber,
60 		buf, size, 100);
61 }
62 
usb_set_report(struct usb_interface * intf,unsigned char type,unsigned char id,void * buf,int size)63 static int usb_set_report(struct usb_interface *intf, unsigned char type,
64 				unsigned char id, void *buf, int size)
65 {
66 	return usb_control_msg(interface_to_usbdev(intf),
67 		usb_sndctrlpipe(interface_to_usbdev(intf), 0),
68                 USB_REQ_SET_REPORT, USB_TYPE_CLASS | USB_RECIP_INTERFACE,
69                 (type << 8) + id, intf->altsetting[0].desc.bInterfaceNumber,
70 		buf, size, 1000);
71 }
72 
wacom_sys_irq(struct urb * urb)73 static void wacom_sys_irq(struct urb *urb)
74 {
75 	struct wacom *wacom = urb->context;
76 	int retval;
77 
78 	switch (urb->status) {
79 	case 0:
80 		/* success */
81 		break;
82 	case -ECONNRESET:
83 	case -ENOENT:
84 	case -ESHUTDOWN:
85 		/* this urb is terminated, clean up */
86 		dbg("%s - urb shutting down with status: %d", __func__, urb->status);
87 		return;
88 	default:
89 		dbg("%s - nonzero urb status received: %d", __func__, urb->status);
90 		goto exit;
91 	}
92 
93 	wacom_wac_irq(&wacom->wacom_wac, urb->actual_length);
94 
95  exit:
96 	usb_mark_last_busy(wacom->usbdev);
97 	retval = usb_submit_urb(urb, GFP_ATOMIC);
98 	if (retval)
99 		err ("%s - usb_submit_urb failed with result %d",
100 		     __func__, retval);
101 }
102 
wacom_open(struct input_dev * dev)103 static int wacom_open(struct input_dev *dev)
104 {
105 	struct wacom *wacom = input_get_drvdata(dev);
106 	int retval = 0;
107 
108 	if (usb_autopm_get_interface(wacom->intf) < 0)
109 		return -EIO;
110 
111 	mutex_lock(&wacom->lock);
112 
113 	if (usb_submit_urb(wacom->irq, GFP_KERNEL)) {
114 		retval = -EIO;
115 		goto out;
116 	}
117 
118 	wacom->open = true;
119 	wacom->intf->needs_remote_wakeup = 1;
120 
121 out:
122 	mutex_unlock(&wacom->lock);
123 	usb_autopm_put_interface(wacom->intf);
124 	return retval;
125 }
126 
wacom_close(struct input_dev * dev)127 static void wacom_close(struct input_dev *dev)
128 {
129 	struct wacom *wacom = input_get_drvdata(dev);
130 	int autopm_error;
131 
132 	autopm_error = usb_autopm_get_interface(wacom->intf);
133 
134 	mutex_lock(&wacom->lock);
135 	usb_kill_urb(wacom->irq);
136 	wacom->open = false;
137 	wacom->intf->needs_remote_wakeup = 0;
138 	mutex_unlock(&wacom->lock);
139 
140 	if (!autopm_error)
141 		usb_autopm_put_interface(wacom->intf);
142 }
143 
wacom_parse_hid(struct usb_interface * intf,struct hid_descriptor * hid_desc,struct wacom_features * features)144 static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hid_desc,
145 			   struct wacom_features *features)
146 {
147 	struct usb_device *dev = interface_to_usbdev(intf);
148 	char limit = 0;
149 	/* result has to be defined as int for some devices */
150 	int result = 0;
151 	int i = 0, usage = WCM_UNDEFINED, finger = 0, pen = 0;
152 	unsigned char *report;
153 
154 	report = kzalloc(hid_desc->wDescriptorLength, GFP_KERNEL);
155 	if (!report)
156 		return -ENOMEM;
157 
158 	/* retrive report descriptors */
159 	do {
160 		result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
161 			USB_REQ_GET_DESCRIPTOR,
162 			USB_RECIP_INTERFACE | USB_DIR_IN,
163 			HID_DEVICET_REPORT << 8,
164 			intf->altsetting[0].desc.bInterfaceNumber, /* interface */
165 			report,
166 			hid_desc->wDescriptorLength,
167 			5000); /* 5 secs */
168 	} while (result < 0 && limit++ < 5);
169 
170 	/* No need to parse the Descriptor. It isn't an error though */
171 	if (result < 0)
172 		goto out;
173 
174 	for (i = 0; i < hid_desc->wDescriptorLength; i++) {
175 
176 		switch (report[i]) {
177 		case HID_USAGE_PAGE:
178 			switch (report[i + 1]) {
179 			case HID_USAGE_PAGE_DIGITIZER:
180 				usage = WCM_DIGITIZER;
181 				i++;
182 				break;
183 
184 			case HID_USAGE_PAGE_DESKTOP:
185 				usage = WCM_DESKTOP;
186 				i++;
187 				break;
188 			}
189 			break;
190 
191 		case HID_USAGE:
192 			switch (report[i + 1]) {
193 			case HID_USAGE_X:
194 				if (usage == WCM_DESKTOP) {
195 					if (finger) {
196 						features->device_type = BTN_TOOL_FINGER;
197 						if (features->type == TABLETPC2FG) {
198 							/* need to reset back */
199 							features->pktlen = WACOM_PKGLEN_TPC2FG;
200 							features->device_type = BTN_TOOL_DOUBLETAP;
201 						}
202 						if (features->type == BAMBOO_PT) {
203 							/* need to reset back */
204 							features->pktlen = WACOM_PKGLEN_BBTOUCH;
205 							features->device_type = BTN_TOOL_DOUBLETAP;
206 							features->x_phy =
207 								get_unaligned_le16(&report[i + 5]);
208 							features->x_max =
209 								get_unaligned_le16(&report[i + 8]);
210 							i += 15;
211 						} else {
212 							features->x_max =
213 								get_unaligned_le16(&report[i + 3]);
214 							features->x_phy =
215 								get_unaligned_le16(&report[i + 6]);
216 							features->unit = report[i + 9];
217 							features->unitExpo = report[i + 11];
218 							i += 12;
219 						}
220 					} else if (pen) {
221 						/* penabled only accepts exact bytes of data */
222 						if (features->type == TABLETPC2FG)
223 							features->pktlen = WACOM_PKGLEN_GRAPHIRE;
224 						if (features->type == BAMBOO_PT)
225 							features->pktlen = WACOM_PKGLEN_BBFUN;
226 						features->device_type = BTN_TOOL_PEN;
227 						features->x_max =
228 							get_unaligned_le16(&report[i + 3]);
229 						i += 4;
230 					}
231 				} else if (usage == WCM_DIGITIZER) {
232 					/* max pressure isn't reported
233 					features->pressure_max = (unsigned short)
234 							(report[i+4] << 8  | report[i + 3]);
235 					*/
236 					features->pressure_max = 255;
237 					i += 4;
238 				}
239 				break;
240 
241 			case HID_USAGE_Y:
242 				if (usage == WCM_DESKTOP) {
243 					if (finger) {
244 						features->device_type = BTN_TOOL_FINGER;
245 						if (features->type == TABLETPC2FG) {
246 							/* need to reset back */
247 							features->pktlen = WACOM_PKGLEN_TPC2FG;
248 							features->device_type = BTN_TOOL_DOUBLETAP;
249 							features->y_max =
250 								get_unaligned_le16(&report[i + 3]);
251 							features->y_phy =
252 								get_unaligned_le16(&report[i + 6]);
253 							i += 7;
254 						} else if (features->type == BAMBOO_PT) {
255 							/* need to reset back */
256 							features->pktlen = WACOM_PKGLEN_BBTOUCH;
257 							features->device_type = BTN_TOOL_DOUBLETAP;
258 							features->y_phy =
259 								get_unaligned_le16(&report[i + 3]);
260 							features->y_max =
261 								get_unaligned_le16(&report[i + 6]);
262 							i += 12;
263 						} else {
264 							features->y_max =
265 								features->x_max;
266 							features->y_phy =
267 								get_unaligned_le16(&report[i + 3]);
268 							i += 4;
269 						}
270 					} else if (pen) {
271 						/* penabled only accepts exact bytes of data */
272 						if (features->type == TABLETPC2FG)
273 							features->pktlen = WACOM_PKGLEN_GRAPHIRE;
274 						if (features->type == BAMBOO_PT)
275 							features->pktlen = WACOM_PKGLEN_BBFUN;
276 						features->device_type = BTN_TOOL_PEN;
277 						features->y_max =
278 							get_unaligned_le16(&report[i + 3]);
279 						i += 4;
280 					}
281 				}
282 				break;
283 
284 			case HID_USAGE_FINGER:
285 				finger = 1;
286 				i++;
287 				break;
288 
289 			case HID_USAGE_STYLUS:
290 				pen = 1;
291 				i++;
292 				break;
293 
294 			case HID_USAGE_UNDEFINED:
295 				if (usage == WCM_DESKTOP && finger) /* capacity */
296 					features->pressure_max =
297 						get_unaligned_le16(&report[i + 3]);
298 				i += 4;
299 				break;
300 			}
301 			break;
302 
303 		case HID_COLLECTION:
304 			/* reset UsagePage and Finger */
305 			finger = usage = 0;
306 			break;
307 		}
308 	}
309 
310  out:
311 	result = 0;
312 	kfree(report);
313 	return result;
314 }
315 
wacom_query_tablet_data(struct usb_interface * intf,struct wacom_features * features)316 static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_features *features)
317 {
318 	unsigned char *rep_data;
319 	int limit = 0, report_id = 2;
320 	int error = -ENOMEM;
321 
322 	rep_data = kmalloc(2, GFP_KERNEL);
323 	if (!rep_data)
324 		return error;
325 
326 	/* ask to report tablet data if it is 2FGT Tablet PC or
327 	 * not a Tablet PC */
328 	if (features->type == TABLETPC2FG) {
329 		do {
330 			rep_data[0] = 3;
331 			rep_data[1] = 4;
332 			report_id = 3;
333 			error = usb_set_report(intf, WAC_HID_FEATURE_REPORT,
334 				report_id, rep_data, 2);
335 			if (error >= 0)
336 				error = usb_get_report(intf,
337 					WAC_HID_FEATURE_REPORT, report_id,
338 					rep_data, 3);
339 		} while ((error < 0 || rep_data[1] != 4) && limit++ < 5);
340 	} else if (features->type != TABLETPC) {
341 		do {
342 			rep_data[0] = 2;
343 			rep_data[1] = 2;
344 			error = usb_set_report(intf, WAC_HID_FEATURE_REPORT,
345 				report_id, rep_data, 2);
346 			if (error >= 0)
347 				error = usb_get_report(intf,
348 					WAC_HID_FEATURE_REPORT, report_id,
349 					rep_data, 2);
350 		} while ((error < 0 || rep_data[1] != 2) && limit++ < 5);
351 	}
352 
353 	kfree(rep_data);
354 
355 	return error < 0 ? error : 0;
356 }
357 
wacom_retrieve_hid_descriptor(struct usb_interface * intf,struct wacom_features * features)358 static int wacom_retrieve_hid_descriptor(struct usb_interface *intf,
359 		struct wacom_features *features)
360 {
361 	int error = 0;
362 	struct usb_host_interface *interface = intf->cur_altsetting;
363 	struct hid_descriptor *hid_desc;
364 
365 	/* default features */
366 	features->device_type = BTN_TOOL_PEN;
367 	features->x_fuzz = 4;
368 	features->y_fuzz = 4;
369 	features->pressure_fuzz = 0;
370 	features->distance_fuzz = 0;
371 
372 	/* only Tablet PCs and Bamboo P&T need to retrieve the info */
373 	if ((features->type != TABLETPC) && (features->type != TABLETPC2FG) &&
374 	    (features->type != BAMBOO_PT))
375 		goto out;
376 
377 	if (usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc)) {
378 		if (usb_get_extra_descriptor(&interface->endpoint[0],
379 				HID_DEVICET_REPORT, &hid_desc)) {
380 			printk("wacom: can not retrieve extra class descriptor\n");
381 			error = 1;
382 			goto out;
383 		}
384 	}
385 	error = wacom_parse_hid(intf, hid_desc, features);
386 	if (error)
387 		goto out;
388 
389  out:
390 	return error;
391 }
392 
393 struct wacom_usbdev_data {
394 	struct list_head list;
395 	struct kref kref;
396 	struct usb_device *dev;
397 	struct wacom_shared shared;
398 };
399 
400 static LIST_HEAD(wacom_udev_list);
401 static DEFINE_MUTEX(wacom_udev_list_lock);
402 
wacom_get_usbdev_data(struct usb_device * dev)403 static struct wacom_usbdev_data *wacom_get_usbdev_data(struct usb_device *dev)
404 {
405 	struct wacom_usbdev_data *data;
406 
407 	list_for_each_entry(data, &wacom_udev_list, list) {
408 		if (data->dev == dev) {
409 			kref_get(&data->kref);
410 			return data;
411 		}
412 	}
413 
414 	return NULL;
415 }
416 
wacom_add_shared_data(struct wacom_wac * wacom,struct usb_device * dev)417 static int wacom_add_shared_data(struct wacom_wac *wacom,
418 				 struct usb_device *dev)
419 {
420 	struct wacom_usbdev_data *data;
421 	int retval = 0;
422 
423 	mutex_lock(&wacom_udev_list_lock);
424 
425 	data = wacom_get_usbdev_data(dev);
426 	if (!data) {
427 		data = kzalloc(sizeof(struct wacom_usbdev_data), GFP_KERNEL);
428 		if (!data) {
429 			retval = -ENOMEM;
430 			goto out;
431 		}
432 
433 		kref_init(&data->kref);
434 		data->dev = dev;
435 		list_add_tail(&data->list, &wacom_udev_list);
436 	}
437 
438 	wacom->shared = &data->shared;
439 
440 out:
441 	mutex_unlock(&wacom_udev_list_lock);
442 	return retval;
443 }
444 
wacom_release_shared_data(struct kref * kref)445 static void wacom_release_shared_data(struct kref *kref)
446 {
447 	struct wacom_usbdev_data *data =
448 		container_of(kref, struct wacom_usbdev_data, kref);
449 
450 	mutex_lock(&wacom_udev_list_lock);
451 	list_del(&data->list);
452 	mutex_unlock(&wacom_udev_list_lock);
453 
454 	kfree(data);
455 }
456 
wacom_remove_shared_data(struct wacom_wac * wacom)457 static void wacom_remove_shared_data(struct wacom_wac *wacom)
458 {
459 	struct wacom_usbdev_data *data;
460 
461 	if (wacom->shared) {
462 		data = container_of(wacom->shared, struct wacom_usbdev_data, shared);
463 		kref_put(&data->kref, wacom_release_shared_data);
464 		wacom->shared = NULL;
465 	}
466 }
467 
wacom_probe(struct usb_interface * intf,const struct usb_device_id * id)468 static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id)
469 {
470 	struct usb_device *dev = interface_to_usbdev(intf);
471 	struct usb_endpoint_descriptor *endpoint;
472 	struct wacom *wacom;
473 	struct wacom_wac *wacom_wac;
474 	struct wacom_features *features;
475 	struct input_dev *input_dev;
476 	int error;
477 
478 	if (!id->driver_info)
479 		return -EINVAL;
480 
481 	wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL);
482 	input_dev = input_allocate_device();
483 	if (!wacom || !input_dev) {
484 		error = -ENOMEM;
485 		goto fail1;
486 	}
487 
488 	wacom_wac = &wacom->wacom_wac;
489 	wacom_wac->features = *((struct wacom_features *)id->driver_info);
490 	features = &wacom_wac->features;
491 	if (features->pktlen > WACOM_PKGLEN_MAX) {
492 		error = -EINVAL;
493 		goto fail1;
494 	}
495 
496 	wacom_wac->data = usb_alloc_coherent(dev, WACOM_PKGLEN_MAX,
497 					     GFP_KERNEL, &wacom->data_dma);
498 	if (!wacom_wac->data) {
499 		error = -ENOMEM;
500 		goto fail1;
501 	}
502 
503 	wacom->irq = usb_alloc_urb(0, GFP_KERNEL);
504 	if (!wacom->irq) {
505 		error = -ENOMEM;
506 		goto fail2;
507 	}
508 
509 	wacom->usbdev = dev;
510 	wacom->intf = intf;
511 	mutex_init(&wacom->lock);
512 	usb_make_path(dev, wacom->phys, sizeof(wacom->phys));
513 	strlcat(wacom->phys, "/input0", sizeof(wacom->phys));
514 
515 	wacom_wac->input = input_dev;
516 
517 	endpoint = &intf->cur_altsetting->endpoint[0].desc;
518 
519 	/* Retrieve the physical and logical size for OEM devices */
520 	error = wacom_retrieve_hid_descriptor(intf, features);
521 	if (error)
522 		goto fail3;
523 
524 	wacom_setup_device_quirks(features);
525 
526 	strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name));
527 
528 	if (features->quirks & WACOM_QUIRK_MULTI_INPUT) {
529 		/* Append the device type to the name */
530 		strlcat(wacom_wac->name,
531 			features->device_type == BTN_TOOL_PEN ?
532 				" Pen" : " Finger",
533 			sizeof(wacom_wac->name));
534 
535 		error = wacom_add_shared_data(wacom_wac, dev);
536 		if (error)
537 			goto fail3;
538 	}
539 
540 	input_dev->name = wacom_wac->name;
541 	input_dev->dev.parent = &intf->dev;
542 	input_dev->open = wacom_open;
543 	input_dev->close = wacom_close;
544 	usb_to_input_id(dev, &input_dev->id);
545 	input_set_drvdata(input_dev, wacom);
546 
547 	wacom_setup_input_capabilities(input_dev, wacom_wac);
548 
549 	usb_fill_int_urb(wacom->irq, dev,
550 			 usb_rcvintpipe(dev, endpoint->bEndpointAddress),
551 			 wacom_wac->data, features->pktlen,
552 			 wacom_sys_irq, wacom, endpoint->bInterval);
553 	wacom->irq->transfer_dma = wacom->data_dma;
554 	wacom->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
555 
556 	error = input_register_device(input_dev);
557 	if (error)
558 		goto fail4;
559 
560 	/* Note that if query fails it is not a hard failure */
561 	wacom_query_tablet_data(intf, features);
562 
563 	usb_set_intfdata(intf, wacom);
564 	return 0;
565 
566  fail4:	wacom_remove_shared_data(wacom_wac);
567  fail3:	usb_free_urb(wacom->irq);
568  fail2:	usb_free_coherent(dev, WACOM_PKGLEN_MAX, wacom_wac->data, wacom->data_dma);
569  fail1:	input_free_device(input_dev);
570 	kfree(wacom);
571 	return error;
572 }
573 
wacom_disconnect(struct usb_interface * intf)574 static void wacom_disconnect(struct usb_interface *intf)
575 {
576 	struct wacom *wacom = usb_get_intfdata(intf);
577 
578 	usb_set_intfdata(intf, NULL);
579 
580 	usb_kill_urb(wacom->irq);
581 	input_unregister_device(wacom->wacom_wac.input);
582 	usb_free_urb(wacom->irq);
583 	usb_free_coherent(interface_to_usbdev(intf), WACOM_PKGLEN_MAX,
584 			wacom->wacom_wac.data, wacom->data_dma);
585 	wacom_remove_shared_data(&wacom->wacom_wac);
586 	kfree(wacom);
587 }
588 
wacom_suspend(struct usb_interface * intf,pm_message_t message)589 static int wacom_suspend(struct usb_interface *intf, pm_message_t message)
590 {
591 	struct wacom *wacom = usb_get_intfdata(intf);
592 
593 	mutex_lock(&wacom->lock);
594 	usb_kill_urb(wacom->irq);
595 	mutex_unlock(&wacom->lock);
596 
597 	return 0;
598 }
599 
wacom_resume(struct usb_interface * intf)600 static int wacom_resume(struct usb_interface *intf)
601 {
602 	struct wacom *wacom = usb_get_intfdata(intf);
603 	struct wacom_features *features = &wacom->wacom_wac.features;
604 	int rv;
605 
606 	mutex_lock(&wacom->lock);
607 
608 	/* switch to wacom mode first */
609 	wacom_query_tablet_data(intf, features);
610 
611 	if (wacom->open)
612 		rv = usb_submit_urb(wacom->irq, GFP_NOIO);
613 	else
614 		rv = 0;
615 
616 	mutex_unlock(&wacom->lock);
617 
618 	return rv;
619 }
620 
wacom_reset_resume(struct usb_interface * intf)621 static int wacom_reset_resume(struct usb_interface *intf)
622 {
623 	return wacom_resume(intf);
624 }
625 
626 static struct usb_driver wacom_driver = {
627 	.name =		"wacom",
628 	.id_table =	wacom_ids,
629 	.probe =	wacom_probe,
630 	.disconnect =	wacom_disconnect,
631 	.suspend =	wacom_suspend,
632 	.resume =	wacom_resume,
633 	.reset_resume =	wacom_reset_resume,
634 	.supports_autosuspend = 1,
635 };
636 
wacom_init(void)637 static int __init wacom_init(void)
638 {
639 	int result;
640 
641 	result = usb_register(&wacom_driver);
642 	if (result == 0)
643 		printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":"
644 		       DRIVER_DESC "\n");
645 	return result;
646 }
647 
wacom_exit(void)648 static void __exit wacom_exit(void)
649 {
650 	usb_deregister(&wacom_driver);
651 }
652 
653 module_init(wacom_init);
654 module_exit(wacom_exit);
655