usbtouchscreen.c revision d05e84e6cb21cca16987813fd3c271ebaed4233d
1/******************************************************************************
2 * usbtouchscreen.c
3 * Driver for USB Touchscreens, supporting those devices:
4 *  - eGalax Touchkit
5 *    includes eTurboTouch CT-410/510/700
6 *  - 3M/Microtouch  EX II series
7 *  - ITM
8 *  - PanJit TouchSet
9 *  - eTurboTouch
10 *  - Gunze AHL61
11 *  - DMC TSC-10/25
12 *
13 * Copyright (C) 2004-2006 by Daniel Ritz <daniel.ritz@gmx.ch>
14 * Copyright (C) by Todd E. Johnson (mtouchusb.c)
15 *
16 * This program is free software; you can redistribute it and/or
17 * modify it under the terms of the GNU General Public License as
18 * published by the Free Software Foundation; either version 2 of the
19 * License, or (at your option) any later version.
20 *
21 * This program is distributed in the hope that it will be useful, but
22 * WITHOUT ANY WARRANTY; without even the implied warranty of
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24 * General Public License for more details.
25 *
26 * You should have received a copy of the GNU General Public License
27 * along with this program; if not, write to the Free Software
28 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29 *
30 * Driver is based on touchkitusb.c
31 * - ITM parts are from itmtouch.c
32 * - 3M parts are from mtouchusb.c
33 * - PanJit parts are from an unmerged driver by Lanslott Gish
34 * - DMC TSC 10/25 are from Holger Schurig, with ideas from an unmerged
35 *   driver from Marius Vollmer
36 *
37 *****************************************************************************/
38
39//#define DEBUG
40
41#include <linux/kernel.h>
42#include <linux/slab.h>
43#include <linux/input.h>
44#include <linux/module.h>
45#include <linux/init.h>
46#include <linux/usb.h>
47#include <linux/usb/input.h>
48
49
50#define DRIVER_VERSION		"v0.5"
51#define DRIVER_AUTHOR		"Daniel Ritz <daniel.ritz@gmx.ch>"
52#define DRIVER_DESC		"USB Touchscreen Driver"
53
54static int swap_xy;
55module_param(swap_xy, bool, 0644);
56MODULE_PARM_DESC(swap_xy, "If set X and Y axes are swapped.");
57
58/* device specifc data/functions */
59struct usbtouch_usb;
60struct usbtouch_device_info {
61	int min_xc, max_xc;
62	int min_yc, max_yc;
63	int min_press, max_press;
64	int rept_size;
65	int flags;
66
67	void (*process_pkt) (struct usbtouch_usb *usbtouch, unsigned char *pkt, int len);
68	int  (*get_pkt_len) (unsigned char *pkt, int len);
69	int  (*read_data)   (struct usbtouch_usb *usbtouch, unsigned char *pkt);
70	int  (*init)        (struct usbtouch_usb *usbtouch);
71};
72
73#define USBTOUCH_FLG_BUFFER	0x01
74
75
76/* a usbtouch device */
77struct usbtouch_usb {
78	unsigned char *data;
79	dma_addr_t data_dma;
80	unsigned char *buffer;
81	int buf_len;
82	struct urb *irq;
83	struct usb_device *udev;
84	struct input_dev *input;
85	struct usbtouch_device_info *type;
86	char name[128];
87	char phys[64];
88
89	int x, y;
90	int touch, press;
91};
92
93
94#if defined(CONFIG_USB_TOUCHSCREEN_EGALAX) || defined(CONFIG_USB_TOUCHSCREEN_ETURBO)
95#define MULTI_PACKET
96#endif
97
98#ifdef MULTI_PACKET
99static void usbtouch_process_multi(struct usbtouch_usb *usbtouch,
100                                   unsigned char *pkt, int len);
101#endif
102
103/* device types */
104enum {
105	DEVTPYE_DUMMY = -1,
106	DEVTYPE_EGALAX,
107	DEVTYPE_PANJIT,
108	DEVTYPE_3M,
109	DEVTYPE_ITM,
110	DEVTYPE_ETURBO,
111	DEVTYPE_GUNZE,
112	DEVTYPE_DMC_TSC10,
113};
114
115static struct usb_device_id usbtouch_devices[] = {
116#ifdef CONFIG_USB_TOUCHSCREEN_EGALAX
117	{USB_DEVICE(0x3823, 0x0001), .driver_info = DEVTYPE_EGALAX},
118	{USB_DEVICE(0x3823, 0x0002), .driver_info = DEVTYPE_EGALAX},
119	{USB_DEVICE(0x0123, 0x0001), .driver_info = DEVTYPE_EGALAX},
120	{USB_DEVICE(0x0eef, 0x0001), .driver_info = DEVTYPE_EGALAX},
121	{USB_DEVICE(0x0eef, 0x0002), .driver_info = DEVTYPE_EGALAX},
122	{USB_DEVICE(0x1234, 0x0001), .driver_info = DEVTYPE_EGALAX},
123	{USB_DEVICE(0x1234, 0x0002), .driver_info = DEVTYPE_EGALAX},
124#endif
125
126#ifdef CONFIG_USB_TOUCHSCREEN_PANJIT
127	{USB_DEVICE(0x134c, 0x0001), .driver_info = DEVTYPE_PANJIT},
128	{USB_DEVICE(0x134c, 0x0002), .driver_info = DEVTYPE_PANJIT},
129	{USB_DEVICE(0x134c, 0x0003), .driver_info = DEVTYPE_PANJIT},
130	{USB_DEVICE(0x134c, 0x0004), .driver_info = DEVTYPE_PANJIT},
131#endif
132
133#ifdef CONFIG_USB_TOUCHSCREEN_3M
134	{USB_DEVICE(0x0596, 0x0001), .driver_info = DEVTYPE_3M},
135#endif
136
137#ifdef CONFIG_USB_TOUCHSCREEN_ITM
138	{USB_DEVICE(0x0403, 0xf9e9), .driver_info = DEVTYPE_ITM},
139#endif
140
141#ifdef CONFIG_USB_TOUCHSCREEN_ETURBO
142	{USB_DEVICE(0x1234, 0x5678), .driver_info = DEVTYPE_ETURBO},
143#endif
144
145#ifdef CONFIG_USB_TOUCHSCREEN_GUNZE
146	{USB_DEVICE(0x0637, 0x0001), .driver_info = DEVTYPE_GUNZE},
147#endif
148
149#ifdef CONFIG_USB_TOUCHSCREEN_DMC_TSC10
150	{USB_DEVICE(0x0afa, 0x03e8), .driver_info = DEVTYPE_DMC_TSC10},
151#endif
152
153	{}
154};
155
156
157/*****************************************************************************
158 * eGalax part
159 */
160
161#ifdef CONFIG_USB_TOUCHSCREEN_EGALAX
162
163#define EGALAX_PKT_TYPE_MASK		0xFE
164#define EGALAX_PKT_TYPE_REPT		0x80
165#define EGALAX_PKT_TYPE_DIAG		0x0A
166
167static int egalax_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
168{
169	if ((pkt[0] & EGALAX_PKT_TYPE_MASK) != EGALAX_PKT_TYPE_REPT)
170		return 0;
171
172	dev->x = ((pkt[3] & 0x0F) << 7) | (pkt[4] & 0x7F);
173	dev->y = ((pkt[1] & 0x0F) << 7) | (pkt[2] & 0x7F);
174	dev->touch = pkt[0] & 0x01;
175
176	return 1;
177}
178
179static int egalax_get_pkt_len(unsigned char *buf, int len)
180{
181	switch (buf[0] & EGALAX_PKT_TYPE_MASK) {
182	case EGALAX_PKT_TYPE_REPT:
183		return 5;
184
185	case EGALAX_PKT_TYPE_DIAG:
186		if (len < 2)
187			return -1;
188
189		return buf[1] + 2;
190	}
191
192	return 0;
193}
194#endif
195
196
197/*****************************************************************************
198 * PanJit Part
199 */
200#ifdef CONFIG_USB_TOUCHSCREEN_PANJIT
201static int panjit_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
202{
203	dev->x = ((pkt[2] & 0x0F) << 8) | pkt[1];
204	dev->y = ((pkt[4] & 0x0F) << 8) | pkt[3];
205	dev->touch = pkt[0] & 0x01;
206
207	return 1;
208}
209#endif
210
211
212/*****************************************************************************
213 * 3M/Microtouch Part
214 */
215#ifdef CONFIG_USB_TOUCHSCREEN_3M
216
217#define MTOUCHUSB_ASYNC_REPORT          1
218#define MTOUCHUSB_RESET                 7
219#define MTOUCHUSB_REQ_CTRLLR_ID         10
220
221static int mtouch_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
222{
223	dev->x = (pkt[8] << 8) | pkt[7];
224	dev->y = (pkt[10] << 8) | pkt[9];
225	dev->touch = (pkt[2] & 0x40) ? 1 : 0;
226
227	return 1;
228}
229
230static int mtouch_init(struct usbtouch_usb *usbtouch)
231{
232	int ret, i;
233
234	ret = usb_control_msg(usbtouch->udev, usb_rcvctrlpipe(usbtouch->udev, 0),
235	                      MTOUCHUSB_RESET,
236	                      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
237	                      1, 0, NULL, 0, USB_CTRL_SET_TIMEOUT);
238	dbg("%s - usb_control_msg - MTOUCHUSB_RESET - bytes|err: %d",
239	    __FUNCTION__, ret);
240	if (ret < 0)
241		return ret;
242	msleep(150);
243
244	for (i = 0; i < 3; i++) {
245		ret = usb_control_msg(usbtouch->udev, usb_rcvctrlpipe(usbtouch->udev, 0),
246				      MTOUCHUSB_ASYNC_REPORT,
247				      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
248				      1, 1, NULL, 0, USB_CTRL_SET_TIMEOUT);
249		dbg("%s - usb_control_msg - MTOUCHUSB_ASYNC_REPORT - bytes|err: %d",
250		    __FUNCTION__, ret);
251		if (ret >= 0)
252			break;
253		if (ret != -EPIPE)
254			return ret;
255	}
256
257	return 0;
258}
259#endif
260
261
262/*****************************************************************************
263 * ITM Part
264 */
265#ifdef CONFIG_USB_TOUCHSCREEN_ITM
266static int itm_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
267{
268	int touch;
269	/*
270	 * ITM devices report invalid x/y data if not touched.
271	 * if the screen was touched before but is not touched any more
272	 * report touch as 0 with the last valid x/y data once. then stop
273	 * reporting data until touched again.
274	 */
275	dev->press = ((pkt[2] & 0x01) << 7) | (pkt[5] & 0x7F);
276
277	touch = ~pkt[7] & 0x20;
278	if (!touch) {
279		if (dev->touch) {
280			dev->touch = 0;
281			return 1;
282		}
283
284		return 0;
285	}
286
287	dev->x = ((pkt[0] & 0x1F) << 7) | (pkt[3] & 0x7F);
288	dev->y = ((pkt[1] & 0x1F) << 7) | (pkt[4] & 0x7F);
289	dev->touch = touch;
290
291	return 1;
292}
293#endif
294
295
296/*****************************************************************************
297 * eTurboTouch part
298 */
299#ifdef CONFIG_USB_TOUCHSCREEN_ETURBO
300static int eturbo_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
301{
302	unsigned int shift;
303
304	/* packets should start with sync */
305	if (!(pkt[0] & 0x80))
306		return 0;
307
308	shift = (6 - (pkt[0] & 0x03));
309	dev->x = ((pkt[3] << 7) | pkt[4]) >> shift;
310	dev->y = ((pkt[1] << 7) | pkt[2]) >> shift;
311	dev->touch = (pkt[0] & 0x10) ? 1 : 0;
312
313	return 1;
314}
315
316static int eturbo_get_pkt_len(unsigned char *buf, int len)
317{
318	if (buf[0] & 0x80)
319		return 5;
320	if (buf[0] == 0x01)
321		return 3;
322	return 0;
323}
324#endif
325
326
327/*****************************************************************************
328 * Gunze part
329 */
330#ifdef CONFIG_USB_TOUCHSCREEN_GUNZE
331static int gunze_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
332{
333	if (!(pkt[0] & 0x80) || ((pkt[1] | pkt[2] | pkt[3]) & 0x80))
334		return 0;
335
336	dev->x = ((pkt[0] & 0x1F) << 7) | (pkt[2] & 0x7F);
337	dev->y = ((pkt[1] & 0x1F) << 7) | (pkt[3] & 0x7F);
338	dev->touch = pkt[0] & 0x20;
339
340	return 1;
341}
342#endif
343
344/*****************************************************************************
345 * DMC TSC-10/25 Part
346 *
347 * Documentation about the controller and it's protocol can be found at
348 *   http://www.dmccoltd.com/files/controler/tsc10usb_pi_e.pdf
349 *   http://www.dmccoltd.com/files/controler/tsc25_usb_e.pdf
350 */
351#ifdef CONFIG_USB_TOUCHSCREEN_DMC_TSC10
352
353/* supported data rates. currently using 130 */
354#define TSC10_RATE_POINT	0x50
355#define TSC10_RATE_30		0x40
356#define TSC10_RATE_50		0x41
357#define TSC10_RATE_80		0x42
358#define TSC10_RATE_100		0x43
359#define TSC10_RATE_130		0x44
360#define TSC10_RATE_150		0x45
361
362/* commands */
363#define TSC10_CMD_RESET		0x55
364#define TSC10_CMD_RATE		0x05
365#define TSC10_CMD_DATA1		0x01
366
367static int dmc_tsc10_init(struct usbtouch_usb *usbtouch)
368{
369	struct usb_device *dev = usbtouch->udev;
370	int ret;
371	unsigned char buf[2];
372
373	/* reset */
374	buf[0] = buf[1] = 0xFF;
375	ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0),
376	                      TSC10_CMD_RESET,
377	                      USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
378	                      0, 0, buf, 2, USB_CTRL_SET_TIMEOUT);
379	if (ret < 0)
380		return ret;
381	if (buf[0] != 0x06 || buf[1] != 0x00)
382		return -ENODEV;
383
384	/* set coordinate output rate */
385	buf[0] = buf[1] = 0xFF;
386	ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0),
387	                      TSC10_CMD_RATE,
388	                      USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
389	                      TSC10_RATE_150, 0, buf, 2, USB_CTRL_SET_TIMEOUT);
390	if (ret < 0)
391		return ret;
392	if (buf[0] != 0x06 || buf[1] != 0x00)
393		return -ENODEV;
394
395	/* start sending data */
396	ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0),
397	                      TSC10_CMD_DATA1,
398	                      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
399	                      0, 0, NULL, 0, USB_CTRL_SET_TIMEOUT);
400	if (ret < 0)
401		return ret;
402
403	return 0;
404}
405
406
407static int dmc_tsc10_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
408{
409	dev->x = ((pkt[2] & 0x03) << 8) | pkt[1];
410	dev->y = ((pkt[4] & 0x03) << 8) | pkt[3];
411	dev->touch = pkt[0] & 0x01;
412
413	return 1;
414}
415#endif
416
417
418/*****************************************************************************
419 * the different device descriptors
420 */
421static struct usbtouch_device_info usbtouch_dev_info[] = {
422#ifdef CONFIG_USB_TOUCHSCREEN_EGALAX
423	[DEVTYPE_EGALAX] = {
424		.min_xc		= 0x0,
425		.max_xc		= 0x07ff,
426		.min_yc		= 0x0,
427		.max_yc		= 0x07ff,
428		.rept_size	= 16,
429		.flags		= USBTOUCH_FLG_BUFFER,
430		.process_pkt	= usbtouch_process_multi,
431		.get_pkt_len	= egalax_get_pkt_len,
432		.read_data	= egalax_read_data,
433	},
434#endif
435
436#ifdef CONFIG_USB_TOUCHSCREEN_PANJIT
437	[DEVTYPE_PANJIT] = {
438		.min_xc		= 0x0,
439		.max_xc		= 0x0fff,
440		.min_yc		= 0x0,
441		.max_yc		= 0x0fff,
442		.rept_size	= 8,
443		.read_data	= panjit_read_data,
444	},
445#endif
446
447#ifdef CONFIG_USB_TOUCHSCREEN_3M
448	[DEVTYPE_3M] = {
449		.min_xc		= 0x0,
450		.max_xc		= 0x4000,
451		.min_yc		= 0x0,
452		.max_yc		= 0x4000,
453		.rept_size	= 11,
454		.read_data	= mtouch_read_data,
455		.init		= mtouch_init,
456	},
457#endif
458
459#ifdef CONFIG_USB_TOUCHSCREEN_ITM
460	[DEVTYPE_ITM] = {
461		.min_xc		= 0x0,
462		.max_xc		= 0x0fff,
463		.min_yc		= 0x0,
464		.max_yc		= 0x0fff,
465		.max_press	= 0xff,
466		.rept_size	= 8,
467		.read_data	= itm_read_data,
468	},
469#endif
470
471#ifdef CONFIG_USB_TOUCHSCREEN_ETURBO
472	[DEVTYPE_ETURBO] = {
473		.min_xc		= 0x0,
474		.max_xc		= 0x07ff,
475		.min_yc		= 0x0,
476		.max_yc		= 0x07ff,
477		.rept_size	= 8,
478		.flags		= USBTOUCH_FLG_BUFFER,
479		.process_pkt	= usbtouch_process_multi,
480		.get_pkt_len	= eturbo_get_pkt_len,
481		.read_data	= eturbo_read_data,
482	},
483#endif
484
485#ifdef CONFIG_USB_TOUCHSCREEN_GUNZE
486	[DEVTYPE_GUNZE] = {
487		.min_xc		= 0x0,
488		.max_xc		= 0x0fff,
489		.min_yc		= 0x0,
490		.max_yc		= 0x0fff,
491		.rept_size	= 4,
492		.read_data	= gunze_read_data,
493	},
494#endif
495
496#ifdef CONFIG_USB_TOUCHSCREEN_DMC_TSC10
497	[DEVTYPE_DMC_TSC10] = {
498		.min_xc		= 0x0,
499		.max_xc		= 0x03ff,
500		.min_yc		= 0x0,
501		.max_yc		= 0x03ff,
502		.rept_size	= 5,
503		.init		= dmc_tsc10_init,
504		.read_data	= dmc_tsc10_read_data,
505	},
506#endif
507};
508
509
510/*****************************************************************************
511 * Generic Part
512 */
513static void usbtouch_process_pkt(struct usbtouch_usb *usbtouch,
514                                 unsigned char *pkt, int len)
515{
516	struct usbtouch_device_info *type = usbtouch->type;
517
518	if (!type->read_data(usbtouch, pkt))
519			return;
520
521	input_report_key(usbtouch->input, BTN_TOUCH, usbtouch->touch);
522
523	if (swap_xy) {
524		input_report_abs(usbtouch->input, ABS_X, usbtouch->y);
525		input_report_abs(usbtouch->input, ABS_Y, usbtouch->x);
526	} else {
527		input_report_abs(usbtouch->input, ABS_X, usbtouch->x);
528		input_report_abs(usbtouch->input, ABS_Y, usbtouch->y);
529	}
530	if (type->max_press)
531		input_report_abs(usbtouch->input, ABS_PRESSURE, usbtouch->press);
532	input_sync(usbtouch->input);
533}
534
535
536#ifdef MULTI_PACKET
537static void usbtouch_process_multi(struct usbtouch_usb *usbtouch,
538                                   unsigned char *pkt, int len)
539{
540	unsigned char *buffer;
541	int pkt_len, pos, buf_len, tmp;
542
543	/* process buffer */
544	if (unlikely(usbtouch->buf_len)) {
545		/* try to get size */
546		pkt_len = usbtouch->type->get_pkt_len(
547				usbtouch->buffer, usbtouch->buf_len);
548
549		/* drop? */
550		if (unlikely(!pkt_len))
551			goto out_flush_buf;
552
553		/* need to append -pkt_len bytes before able to get size */
554		if (unlikely(pkt_len < 0)) {
555			int append = -pkt_len;
556			if (unlikely(append > len))
557			       append = len;
558			if (usbtouch->buf_len + append >= usbtouch->type->rept_size)
559				goto out_flush_buf;
560			memcpy(usbtouch->buffer + usbtouch->buf_len, pkt, append);
561			usbtouch->buf_len += append;
562
563			pkt_len = usbtouch->type->get_pkt_len(
564					usbtouch->buffer, usbtouch->buf_len);
565			if (pkt_len < 0)
566				return;
567		}
568
569		/* append */
570		tmp = pkt_len - usbtouch->buf_len;
571		if (usbtouch->buf_len + tmp >= usbtouch->type->rept_size)
572			goto out_flush_buf;
573		memcpy(usbtouch->buffer + usbtouch->buf_len, pkt, tmp);
574		usbtouch_process_pkt(usbtouch, usbtouch->buffer, pkt_len);
575
576		buffer = pkt + tmp;
577		buf_len = len - tmp;
578	} else {
579		buffer = pkt;
580		buf_len = len;
581	}
582
583	/* loop over the received packet, process */
584	pos = 0;
585	while (pos < buf_len) {
586		/* get packet len */
587		pkt_len = usbtouch->type->get_pkt_len(buffer + pos, len);
588
589		/* unknown packet: drop everything */
590		if (unlikely(!pkt_len))
591			goto out_flush_buf;
592
593		/* full packet: process */
594		if (likely((pkt_len > 0) && (pkt_len <= buf_len - pos))) {
595			usbtouch_process_pkt(usbtouch, buffer + pos, pkt_len);
596		} else {
597			/* incomplete packet: save in buffer */
598			memcpy(usbtouch->buffer, buffer + pos, buf_len - pos);
599			usbtouch->buf_len = buf_len - pos;
600			return;
601		}
602		pos += pkt_len;
603	}
604
605out_flush_buf:
606	usbtouch->buf_len = 0;
607	return;
608}
609#endif
610
611
612static void usbtouch_irq(struct urb *urb)
613{
614	struct usbtouch_usb *usbtouch = urb->context;
615	int retval;
616
617	switch (urb->status) {
618	case 0:
619		/* success */
620		break;
621	case -ETIME:
622		/* this urb is timing out */
623		dbg("%s - urb timed out - was the device unplugged?",
624		    __FUNCTION__);
625		return;
626	case -ECONNRESET:
627	case -ENOENT:
628	case -ESHUTDOWN:
629		/* this urb is terminated, clean up */
630		dbg("%s - urb shutting down with status: %d",
631		    __FUNCTION__, urb->status);
632		return;
633	default:
634		dbg("%s - nonzero urb status received: %d",
635		    __FUNCTION__, urb->status);
636		goto exit;
637	}
638
639	usbtouch->type->process_pkt(usbtouch, usbtouch->data, urb->actual_length);
640
641exit:
642	retval = usb_submit_urb(urb, GFP_ATOMIC);
643	if (retval)
644		err("%s - usb_submit_urb failed with result: %d",
645		    __FUNCTION__, retval);
646}
647
648static int usbtouch_open(struct input_dev *input)
649{
650	struct usbtouch_usb *usbtouch = input_get_drvdata(input);
651
652	usbtouch->irq->dev = usbtouch->udev;
653
654	if (usb_submit_urb(usbtouch->irq, GFP_KERNEL))
655		return -EIO;
656
657	return 0;
658}
659
660static void usbtouch_close(struct input_dev *input)
661{
662	struct usbtouch_usb *usbtouch = input_get_drvdata(input);
663
664	usb_kill_urb(usbtouch->irq);
665}
666
667
668static void usbtouch_free_buffers(struct usb_device *udev,
669				  struct usbtouch_usb *usbtouch)
670{
671	usb_buffer_free(udev, usbtouch->type->rept_size,
672	                usbtouch->data, usbtouch->data_dma);
673	kfree(usbtouch->buffer);
674}
675
676
677static int usbtouch_probe(struct usb_interface *intf,
678			  const struct usb_device_id *id)
679{
680	struct usbtouch_usb *usbtouch;
681	struct input_dev *input_dev;
682	struct usb_host_interface *interface;
683	struct usb_endpoint_descriptor *endpoint;
684	struct usb_device *udev = interface_to_usbdev(intf);
685	struct usbtouch_device_info *type;
686	int err = -ENOMEM;
687
688	interface = intf->cur_altsetting;
689	endpoint = &interface->endpoint[0].desc;
690
691	usbtouch = kzalloc(sizeof(struct usbtouch_usb), GFP_KERNEL);
692	input_dev = input_allocate_device();
693	if (!usbtouch || !input_dev)
694		goto out_free;
695
696	type = &usbtouch_dev_info[id->driver_info];
697	usbtouch->type = type;
698	if (!type->process_pkt)
699		type->process_pkt = usbtouch_process_pkt;
700
701	usbtouch->data = usb_buffer_alloc(udev, type->rept_size,
702	                                  GFP_KERNEL, &usbtouch->data_dma);
703	if (!usbtouch->data)
704		goto out_free;
705
706	if (type->flags & USBTOUCH_FLG_BUFFER) {
707		usbtouch->buffer = kmalloc(type->rept_size, GFP_KERNEL);
708		if (!usbtouch->buffer)
709			goto out_free_buffers;
710	}
711
712	usbtouch->irq = usb_alloc_urb(0, GFP_KERNEL);
713	if (!usbtouch->irq) {
714		dbg("%s - usb_alloc_urb failed: usbtouch->irq", __FUNCTION__);
715		goto out_free_buffers;
716	}
717
718	usbtouch->udev = udev;
719	usbtouch->input = input_dev;
720
721	if (udev->manufacturer)
722		strlcpy(usbtouch->name, udev->manufacturer, sizeof(usbtouch->name));
723
724	if (udev->product) {
725		if (udev->manufacturer)
726			strlcat(usbtouch->name, " ", sizeof(usbtouch->name));
727		strlcat(usbtouch->name, udev->product, sizeof(usbtouch->name));
728	}
729
730	if (!strlen(usbtouch->name))
731		snprintf(usbtouch->name, sizeof(usbtouch->name),
732			"USB Touchscreen %04x:%04x",
733			 le16_to_cpu(udev->descriptor.idVendor),
734			 le16_to_cpu(udev->descriptor.idProduct));
735
736	usb_make_path(udev, usbtouch->phys, sizeof(usbtouch->phys));
737	strlcpy(usbtouch->phys, "/input0", sizeof(usbtouch->phys));
738
739	input_dev->name = usbtouch->name;
740	input_dev->phys = usbtouch->phys;
741	usb_to_input_id(udev, &input_dev->id);
742	input_dev->dev.parent = &intf->dev;
743
744	input_set_drvdata(input_dev, usbtouch);
745
746	input_dev->open = usbtouch_open;
747	input_dev->close = usbtouch_close;
748
749	input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
750	input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);
751	input_set_abs_params(input_dev, ABS_X, type->min_xc, type->max_xc, 0, 0);
752	input_set_abs_params(input_dev, ABS_Y, type->min_yc, type->max_yc, 0, 0);
753	if (type->max_press)
754		input_set_abs_params(input_dev, ABS_PRESSURE, type->min_press,
755		                     type->max_press, 0, 0);
756
757	usb_fill_int_urb(usbtouch->irq, usbtouch->udev,
758			 usb_rcvintpipe(usbtouch->udev, endpoint->bEndpointAddress),
759			 usbtouch->data, type->rept_size,
760			 usbtouch_irq, usbtouch, endpoint->bInterval);
761
762	usbtouch->irq->dev = usbtouch->udev;
763	usbtouch->irq->transfer_dma = usbtouch->data_dma;
764	usbtouch->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
765
766	/* device specific init */
767	if (type->init) {
768		err = type->init(usbtouch);
769		if (err) {
770			dbg("%s - type->init() failed, err: %d", __FUNCTION__, err);
771			goto out_free_buffers;
772		}
773	}
774
775	err = input_register_device(usbtouch->input);
776	if (err) {
777		dbg("%s - input_register_device failed, err: %d", __FUNCTION__, err);
778		goto out_free_buffers;
779	}
780
781	usb_set_intfdata(intf, usbtouch);
782
783	return 0;
784
785out_free_buffers:
786	usbtouch_free_buffers(udev, usbtouch);
787out_free:
788	input_free_device(input_dev);
789	kfree(usbtouch);
790	return err;
791}
792
793static void usbtouch_disconnect(struct usb_interface *intf)
794{
795	struct usbtouch_usb *usbtouch = usb_get_intfdata(intf);
796
797	dbg("%s - called", __FUNCTION__);
798
799	if (!usbtouch)
800		return;
801
802	dbg("%s - usbtouch is initialized, cleaning up", __FUNCTION__);
803	usb_set_intfdata(intf, NULL);
804	usb_kill_urb(usbtouch->irq);
805	input_unregister_device(usbtouch->input);
806	usb_free_urb(usbtouch->irq);
807	usbtouch_free_buffers(interface_to_usbdev(intf), usbtouch);
808	kfree(usbtouch);
809}
810
811MODULE_DEVICE_TABLE(usb, usbtouch_devices);
812
813static struct usb_driver usbtouch_driver = {
814	.name		= "usbtouchscreen",
815	.probe		= usbtouch_probe,
816	.disconnect	= usbtouch_disconnect,
817	.id_table	= usbtouch_devices,
818};
819
820static int __init usbtouch_init(void)
821{
822	return usb_register(&usbtouch_driver);
823}
824
825static void __exit usbtouch_cleanup(void)
826{
827	usb_deregister(&usbtouch_driver);
828}
829
830module_init(usbtouch_init);
831module_exit(usbtouch_cleanup);
832
833MODULE_AUTHOR(DRIVER_AUTHOR);
834MODULE_DESCRIPTION(DRIVER_DESC);
835MODULE_LICENSE("GPL");
836
837MODULE_ALIAS("touchkitusb");
838MODULE_ALIAS("itmtouch");
839MODULE_ALIAS("mtouchusb");
840