Path: blob/master/drivers/input/touchscreen/usbtouchscreen.c
15111 views
/******************************************************************************1* usbtouchscreen.c2* Driver for USB Touchscreens, supporting those devices:3* - eGalax Touchkit4* includes eTurboTouch CT-410/510/7005* - 3M/Microtouch EX II series6* - ITM7* - PanJit TouchSet8* - eTurboTouch9* - Gunze AHL6110* - DMC TSC-10/2511* - IRTOUCHSYSTEMS/UNITOP12* - IdealTEK URTC100013* - General Touch14* - GoTop Super_Q2/GogoPen/PenPower tablets15* - JASTEC USB touch controller/DigiTech DTR-02U16* - Zytronic capacitive touchscreen17* - NEXIO/iNexio18*19* Copyright (C) 2004-2007 by Daniel Ritz <[email protected]>20* Copyright (C) by Todd E. Johnson (mtouchusb.c)21*22* This program is free software; you can redistribute it and/or23* modify it under the terms of the GNU General Public License as24* published by the Free Software Foundation; either version 2 of the25* License, or (at your option) any later version.26*27* This program is distributed in the hope that it will be useful, but28* WITHOUT ANY WARRANTY; without even the implied warranty of29* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU30* General Public License for more details.31*32* You should have received a copy of the GNU General Public License33* along with this program; if not, write to the Free Software34* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.35*36* Driver is based on touchkitusb.c37* - ITM parts are from itmtouch.c38* - 3M parts are from mtouchusb.c39* - PanJit parts are from an unmerged driver by Lanslott Gish40* - DMC TSC 10/25 are from Holger Schurig, with ideas from an unmerged41* driver from Marius Vollmer42*43*****************************************************************************/4445//#define DEBUG4647#include <linux/kernel.h>48#include <linux/slab.h>49#include <linux/input.h>50#include <linux/module.h>51#include <linux/init.h>52#include <linux/usb.h>53#include <linux/usb/input.h>54#include <linux/hid.h>555657#define DRIVER_VERSION "v0.6"58#define DRIVER_AUTHOR "Daniel Ritz <[email protected]>"59#define DRIVER_DESC "USB Touchscreen Driver"6061static int swap_xy;62module_param(swap_xy, bool, 0644);63MODULE_PARM_DESC(swap_xy, "If set X and Y axes are swapped.");6465static int hwcalib_xy;66module_param(hwcalib_xy, bool, 0644);67MODULE_PARM_DESC(hwcalib_xy, "If set hw-calibrated X/Y are used if available");6869/* device specifc data/functions */70struct usbtouch_usb;71struct usbtouch_device_info {72int min_xc, max_xc;73int min_yc, max_yc;74int min_press, max_press;75int rept_size;7677/*78* Always service the USB devices irq not just when the input device is79* open. This is useful when devices have a watchdog which prevents us80* from periodically polling the device. Leave this unset unless your81* touchscreen device requires it, as it does consume more of the USB82* bandwidth.83*/84bool irq_always;8586void (*process_pkt) (struct usbtouch_usb *usbtouch, unsigned char *pkt, int len);8788/*89* used to get the packet len. possible return values:90* > 0: packet len91* = 0: skip one byte92* < 0: -return value more bytes needed93*/94int (*get_pkt_len) (unsigned char *pkt, int len);9596int (*read_data) (struct usbtouch_usb *usbtouch, unsigned char *pkt);97int (*alloc) (struct usbtouch_usb *usbtouch);98int (*init) (struct usbtouch_usb *usbtouch);99void (*exit) (struct usbtouch_usb *usbtouch);100};101102/* a usbtouch device */103struct usbtouch_usb {104unsigned char *data;105dma_addr_t data_dma;106unsigned char *buffer;107int buf_len;108struct urb *irq;109struct usb_interface *interface;110struct input_dev *input;111struct usbtouch_device_info *type;112char name[128];113char phys[64];114void *priv;115116int x, y;117int touch, press;118};119120121/* device types */122enum {123DEVTYPE_IGNORE = -1,124DEVTYPE_EGALAX,125DEVTYPE_PANJIT,126DEVTYPE_3M,127DEVTYPE_ITM,128DEVTYPE_ETURBO,129DEVTYPE_GUNZE,130DEVTYPE_DMC_TSC10,131DEVTYPE_IRTOUCH,132DEVTYPE_IDEALTEK,133DEVTYPE_GENERAL_TOUCH,134DEVTYPE_GOTOP,135DEVTYPE_JASTEC,136DEVTYPE_E2I,137DEVTYPE_ZYTRONIC,138DEVTYPE_TC45USB,139DEVTYPE_NEXIO,140};141142#define USB_DEVICE_HID_CLASS(vend, prod) \143.match_flags = USB_DEVICE_ID_MATCH_INT_CLASS \144| USB_DEVICE_ID_MATCH_INT_PROTOCOL \145| USB_DEVICE_ID_MATCH_DEVICE, \146.idVendor = (vend), \147.idProduct = (prod), \148.bInterfaceClass = USB_INTERFACE_CLASS_HID, \149.bInterfaceProtocol = USB_INTERFACE_PROTOCOL_MOUSE150151static const struct usb_device_id usbtouch_devices[] = {152#ifdef CONFIG_TOUCHSCREEN_USB_EGALAX153/* ignore the HID capable devices, handled by usbhid */154{USB_DEVICE_HID_CLASS(0x0eef, 0x0001), .driver_info = DEVTYPE_IGNORE},155{USB_DEVICE_HID_CLASS(0x0eef, 0x0002), .driver_info = DEVTYPE_IGNORE},156157/* normal device IDs */158{USB_DEVICE(0x3823, 0x0001), .driver_info = DEVTYPE_EGALAX},159{USB_DEVICE(0x3823, 0x0002), .driver_info = DEVTYPE_EGALAX},160{USB_DEVICE(0x0123, 0x0001), .driver_info = DEVTYPE_EGALAX},161{USB_DEVICE(0x0eef, 0x0001), .driver_info = DEVTYPE_EGALAX},162{USB_DEVICE(0x0eef, 0x0002), .driver_info = DEVTYPE_EGALAX},163{USB_DEVICE(0x1234, 0x0001), .driver_info = DEVTYPE_EGALAX},164{USB_DEVICE(0x1234, 0x0002), .driver_info = DEVTYPE_EGALAX},165#endif166167#ifdef CONFIG_TOUCHSCREEN_USB_PANJIT168{USB_DEVICE(0x134c, 0x0001), .driver_info = DEVTYPE_PANJIT},169{USB_DEVICE(0x134c, 0x0002), .driver_info = DEVTYPE_PANJIT},170{USB_DEVICE(0x134c, 0x0003), .driver_info = DEVTYPE_PANJIT},171{USB_DEVICE(0x134c, 0x0004), .driver_info = DEVTYPE_PANJIT},172#endif173174#ifdef CONFIG_TOUCHSCREEN_USB_3M175{USB_DEVICE(0x0596, 0x0001), .driver_info = DEVTYPE_3M},176#endif177178#ifdef CONFIG_TOUCHSCREEN_USB_ITM179{USB_DEVICE(0x0403, 0xf9e9), .driver_info = DEVTYPE_ITM},180{USB_DEVICE(0x16e3, 0xf9e9), .driver_info = DEVTYPE_ITM},181#endif182183#ifdef CONFIG_TOUCHSCREEN_USB_ETURBO184{USB_DEVICE(0x1234, 0x5678), .driver_info = DEVTYPE_ETURBO},185#endif186187#ifdef CONFIG_TOUCHSCREEN_USB_GUNZE188{USB_DEVICE(0x0637, 0x0001), .driver_info = DEVTYPE_GUNZE},189#endif190191#ifdef CONFIG_TOUCHSCREEN_USB_DMC_TSC10192{USB_DEVICE(0x0afa, 0x03e8), .driver_info = DEVTYPE_DMC_TSC10},193#endif194195#ifdef CONFIG_TOUCHSCREEN_USB_IRTOUCH196{USB_DEVICE(0x595a, 0x0001), .driver_info = DEVTYPE_IRTOUCH},197{USB_DEVICE(0x6615, 0x0001), .driver_info = DEVTYPE_IRTOUCH},198#endif199200#ifdef CONFIG_TOUCHSCREEN_USB_IDEALTEK201{USB_DEVICE(0x1391, 0x1000), .driver_info = DEVTYPE_IDEALTEK},202#endif203204#ifdef CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH205{USB_DEVICE(0x0dfc, 0x0001), .driver_info = DEVTYPE_GENERAL_TOUCH},206#endif207208#ifdef CONFIG_TOUCHSCREEN_USB_GOTOP209{USB_DEVICE(0x08f2, 0x007f), .driver_info = DEVTYPE_GOTOP},210{USB_DEVICE(0x08f2, 0x00ce), .driver_info = DEVTYPE_GOTOP},211{USB_DEVICE(0x08f2, 0x00f4), .driver_info = DEVTYPE_GOTOP},212#endif213214#ifdef CONFIG_TOUCHSCREEN_USB_JASTEC215{USB_DEVICE(0x0f92, 0x0001), .driver_info = DEVTYPE_JASTEC},216#endif217218#ifdef CONFIG_TOUCHSCREEN_USB_E2I219{USB_DEVICE(0x1ac7, 0x0001), .driver_info = DEVTYPE_E2I},220#endif221222#ifdef CONFIG_TOUCHSCREEN_USB_ZYTRONIC223{USB_DEVICE(0x14c8, 0x0003), .driver_info = DEVTYPE_ZYTRONIC},224#endif225226#ifdef CONFIG_TOUCHSCREEN_USB_ETT_TC45USB227/* TC5UH */228{USB_DEVICE(0x0664, 0x0309), .driver_info = DEVTYPE_TC45USB},229/* TC4UM */230{USB_DEVICE(0x0664, 0x0306), .driver_info = DEVTYPE_TC45USB},231#endif232233#ifdef CONFIG_TOUCHSCREEN_USB_NEXIO234/* data interface only */235{USB_DEVICE_AND_INTERFACE_INFO(0x10f0, 0x2002, 0x0a, 0x00, 0x00),236.driver_info = DEVTYPE_NEXIO},237{USB_DEVICE_AND_INTERFACE_INFO(0x1870, 0x0001, 0x0a, 0x00, 0x00),238.driver_info = DEVTYPE_NEXIO},239#endif240241{}242};243244245/*****************************************************************************246* e2i Part247*/248249#ifdef CONFIG_TOUCHSCREEN_USB_E2I250static int e2i_init(struct usbtouch_usb *usbtouch)251{252int ret;253struct usb_device *udev = interface_to_usbdev(usbtouch->interface);254255ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),2560x01, 0x02, 0x0000, 0x0081,257NULL, 0, USB_CTRL_SET_TIMEOUT);258259dbg("%s - usb_control_msg - E2I_RESET - bytes|err: %d",260__func__, ret);261return ret;262}263264static int e2i_read_data(struct usbtouch_usb *dev, unsigned char *pkt)265{266int tmp = (pkt[0] << 8) | pkt[1];267dev->x = (pkt[2] << 8) | pkt[3];268dev->y = (pkt[4] << 8) | pkt[5];269270tmp = tmp - 0xA000;271dev->touch = (tmp > 0);272dev->press = (tmp > 0 ? tmp : 0);273274return 1;275}276#endif277278279/*****************************************************************************280* eGalax part281*/282283#ifdef CONFIG_TOUCHSCREEN_USB_EGALAX284285#ifndef MULTI_PACKET286#define MULTI_PACKET287#endif288289#define EGALAX_PKT_TYPE_MASK 0xFE290#define EGALAX_PKT_TYPE_REPT 0x80291#define EGALAX_PKT_TYPE_DIAG 0x0A292293static int egalax_read_data(struct usbtouch_usb *dev, unsigned char *pkt)294{295if ((pkt[0] & EGALAX_PKT_TYPE_MASK) != EGALAX_PKT_TYPE_REPT)296return 0;297298dev->x = ((pkt[3] & 0x0F) << 7) | (pkt[4] & 0x7F);299dev->y = ((pkt[1] & 0x0F) << 7) | (pkt[2] & 0x7F);300dev->touch = pkt[0] & 0x01;301302return 1;303}304305static int egalax_get_pkt_len(unsigned char *buf, int len)306{307switch (buf[0] & EGALAX_PKT_TYPE_MASK) {308case EGALAX_PKT_TYPE_REPT:309return 5;310311case EGALAX_PKT_TYPE_DIAG:312if (len < 2)313return -1;314315return buf[1] + 2;316}317318return 0;319}320#endif321322323/*****************************************************************************324* PanJit Part325*/326#ifdef CONFIG_TOUCHSCREEN_USB_PANJIT327static int panjit_read_data(struct usbtouch_usb *dev, unsigned char *pkt)328{329dev->x = ((pkt[2] & 0x0F) << 8) | pkt[1];330dev->y = ((pkt[4] & 0x0F) << 8) | pkt[3];331dev->touch = pkt[0] & 0x01;332333return 1;334}335#endif336337338/*****************************************************************************339* 3M/Microtouch Part340*/341#ifdef CONFIG_TOUCHSCREEN_USB_3M342343#define MTOUCHUSB_ASYNC_REPORT 1344#define MTOUCHUSB_RESET 7345#define MTOUCHUSB_REQ_CTRLLR_ID 10346347static int mtouch_read_data(struct usbtouch_usb *dev, unsigned char *pkt)348{349if (hwcalib_xy) {350dev->x = (pkt[4] << 8) | pkt[3];351dev->y = 0xffff - ((pkt[6] << 8) | pkt[5]);352} else {353dev->x = (pkt[8] << 8) | pkt[7];354dev->y = (pkt[10] << 8) | pkt[9];355}356dev->touch = (pkt[2] & 0x40) ? 1 : 0;357358return 1;359}360361static int mtouch_init(struct usbtouch_usb *usbtouch)362{363int ret, i;364struct usb_device *udev = interface_to_usbdev(usbtouch->interface);365366ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),367MTOUCHUSB_RESET,368USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,3691, 0, NULL, 0, USB_CTRL_SET_TIMEOUT);370dbg("%s - usb_control_msg - MTOUCHUSB_RESET - bytes|err: %d",371__func__, ret);372if (ret < 0)373return ret;374msleep(150);375376for (i = 0; i < 3; i++) {377ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),378MTOUCHUSB_ASYNC_REPORT,379USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,3801, 1, NULL, 0, USB_CTRL_SET_TIMEOUT);381dbg("%s - usb_control_msg - MTOUCHUSB_ASYNC_REPORT - bytes|err: %d",382__func__, ret);383if (ret >= 0)384break;385if (ret != -EPIPE)386return ret;387}388389/* Default min/max xy are the raw values, override if using hw-calib */390if (hwcalib_xy) {391input_set_abs_params(usbtouch->input, ABS_X, 0, 0xffff, 0, 0);392input_set_abs_params(usbtouch->input, ABS_Y, 0, 0xffff, 0, 0);393}394395return 0;396}397#endif398399400/*****************************************************************************401* ITM Part402*/403#ifdef CONFIG_TOUCHSCREEN_USB_ITM404static int itm_read_data(struct usbtouch_usb *dev, unsigned char *pkt)405{406int touch;407/*408* ITM devices report invalid x/y data if not touched.409* if the screen was touched before but is not touched any more410* report touch as 0 with the last valid x/y data once. then stop411* reporting data until touched again.412*/413dev->press = ((pkt[2] & 0x01) << 7) | (pkt[5] & 0x7F);414415touch = ~pkt[7] & 0x20;416if (!touch) {417if (dev->touch) {418dev->touch = 0;419return 1;420}421422return 0;423}424425dev->x = ((pkt[0] & 0x1F) << 7) | (pkt[3] & 0x7F);426dev->y = ((pkt[1] & 0x1F) << 7) | (pkt[4] & 0x7F);427dev->touch = touch;428429return 1;430}431#endif432433434/*****************************************************************************435* eTurboTouch part436*/437#ifdef CONFIG_TOUCHSCREEN_USB_ETURBO438#ifndef MULTI_PACKET439#define MULTI_PACKET440#endif441static int eturbo_read_data(struct usbtouch_usb *dev, unsigned char *pkt)442{443unsigned int shift;444445/* packets should start with sync */446if (!(pkt[0] & 0x80))447return 0;448449shift = (6 - (pkt[0] & 0x03));450dev->x = ((pkt[3] << 7) | pkt[4]) >> shift;451dev->y = ((pkt[1] << 7) | pkt[2]) >> shift;452dev->touch = (pkt[0] & 0x10) ? 1 : 0;453454return 1;455}456457static int eturbo_get_pkt_len(unsigned char *buf, int len)458{459if (buf[0] & 0x80)460return 5;461if (buf[0] == 0x01)462return 3;463return 0;464}465#endif466467468/*****************************************************************************469* Gunze part470*/471#ifdef CONFIG_TOUCHSCREEN_USB_GUNZE472static int gunze_read_data(struct usbtouch_usb *dev, unsigned char *pkt)473{474if (!(pkt[0] & 0x80) || ((pkt[1] | pkt[2] | pkt[3]) & 0x80))475return 0;476477dev->x = ((pkt[0] & 0x1F) << 7) | (pkt[2] & 0x7F);478dev->y = ((pkt[1] & 0x1F) << 7) | (pkt[3] & 0x7F);479dev->touch = pkt[0] & 0x20;480481return 1;482}483#endif484485/*****************************************************************************486* DMC TSC-10/25 Part487*488* Documentation about the controller and it's protocol can be found at489* http://www.dmccoltd.com/files/controler/tsc10usb_pi_e.pdf490* http://www.dmccoltd.com/files/controler/tsc25_usb_e.pdf491*/492#ifdef CONFIG_TOUCHSCREEN_USB_DMC_TSC10493494/* supported data rates. currently using 130 */495#define TSC10_RATE_POINT 0x50496#define TSC10_RATE_30 0x40497#define TSC10_RATE_50 0x41498#define TSC10_RATE_80 0x42499#define TSC10_RATE_100 0x43500#define TSC10_RATE_130 0x44501#define TSC10_RATE_150 0x45502503/* commands */504#define TSC10_CMD_RESET 0x55505#define TSC10_CMD_RATE 0x05506#define TSC10_CMD_DATA1 0x01507508static int dmc_tsc10_init(struct usbtouch_usb *usbtouch)509{510struct usb_device *dev = interface_to_usbdev(usbtouch->interface);511int ret = -ENOMEM;512unsigned char *buf;513514buf = kmalloc(2, GFP_NOIO);515if (!buf)516goto err_nobuf;517/* reset */518buf[0] = buf[1] = 0xFF;519ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0),520TSC10_CMD_RESET,521USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,5220, 0, buf, 2, USB_CTRL_SET_TIMEOUT);523if (ret < 0)524goto err_out;525if (buf[0] != 0x06) {526ret = -ENODEV;527goto err_out;528}529530/* set coordinate output rate */531buf[0] = buf[1] = 0xFF;532ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0),533TSC10_CMD_RATE,534USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,535TSC10_RATE_150, 0, buf, 2, USB_CTRL_SET_TIMEOUT);536if (ret < 0)537goto err_out;538if ((buf[0] != 0x06) && (buf[0] != 0x15 || buf[1] != 0x01)) {539ret = -ENODEV;540goto err_out;541}542543/* start sending data */544ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0),545TSC10_CMD_DATA1,546USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,5470, 0, NULL, 0, USB_CTRL_SET_TIMEOUT);548err_out:549kfree(buf);550err_nobuf:551return ret;552}553554555static int dmc_tsc10_read_data(struct usbtouch_usb *dev, unsigned char *pkt)556{557dev->x = ((pkt[2] & 0x03) << 8) | pkt[1];558dev->y = ((pkt[4] & 0x03) << 8) | pkt[3];559dev->touch = pkt[0] & 0x01;560561return 1;562}563#endif564565566/*****************************************************************************567* IRTOUCH Part568*/569#ifdef CONFIG_TOUCHSCREEN_USB_IRTOUCH570static int irtouch_read_data(struct usbtouch_usb *dev, unsigned char *pkt)571{572dev->x = (pkt[3] << 8) | pkt[2];573dev->y = (pkt[5] << 8) | pkt[4];574dev->touch = (pkt[1] & 0x03) ? 1 : 0;575576return 1;577}578#endif579580/*****************************************************************************581* ET&T TC5UH/TC4UM part582*/583#ifdef CONFIG_TOUCHSCREEN_USB_ETT_TC45USB584static int tc45usb_read_data(struct usbtouch_usb *dev, unsigned char *pkt)585{586dev->x = ((pkt[2] & 0x0F) << 8) | pkt[1];587dev->y = ((pkt[4] & 0x0F) << 8) | pkt[3];588dev->touch = pkt[0] & 0x01;589590return 1;591}592#endif593594/*****************************************************************************595* IdealTEK URTC1000 Part596*/597#ifdef CONFIG_TOUCHSCREEN_USB_IDEALTEK598#ifndef MULTI_PACKET599#define MULTI_PACKET600#endif601static int idealtek_get_pkt_len(unsigned char *buf, int len)602{603if (buf[0] & 0x80)604return 5;605if (buf[0] == 0x01)606return len;607return 0;608}609610static int idealtek_read_data(struct usbtouch_usb *dev, unsigned char *pkt)611{612switch (pkt[0] & 0x98) {613case 0x88:614/* touch data in IdealTEK mode */615dev->x = (pkt[1] << 5) | (pkt[2] >> 2);616dev->y = (pkt[3] << 5) | (pkt[4] >> 2);617dev->touch = (pkt[0] & 0x40) ? 1 : 0;618return 1;619620case 0x98:621/* touch data in MT emulation mode */622dev->x = (pkt[2] << 5) | (pkt[1] >> 2);623dev->y = (pkt[4] << 5) | (pkt[3] >> 2);624dev->touch = (pkt[0] & 0x40) ? 1 : 0;625return 1;626627default:628return 0;629}630}631#endif632633/*****************************************************************************634* General Touch Part635*/636#ifdef CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH637static int general_touch_read_data(struct usbtouch_usb *dev, unsigned char *pkt)638{639dev->x = (pkt[2] << 8) | pkt[1];640dev->y = (pkt[4] << 8) | pkt[3];641dev->press = pkt[5] & 0xff;642dev->touch = pkt[0] & 0x01;643644return 1;645}646#endif647648/*****************************************************************************649* GoTop Part650*/651#ifdef CONFIG_TOUCHSCREEN_USB_GOTOP652static int gotop_read_data(struct usbtouch_usb *dev, unsigned char *pkt)653{654dev->x = ((pkt[1] & 0x38) << 4) | pkt[2];655dev->y = ((pkt[1] & 0x07) << 7) | pkt[3];656dev->touch = pkt[0] & 0x01;657658return 1;659}660#endif661662/*****************************************************************************663* JASTEC Part664*/665#ifdef CONFIG_TOUCHSCREEN_USB_JASTEC666static int jastec_read_data(struct usbtouch_usb *dev, unsigned char *pkt)667{668dev->x = ((pkt[0] & 0x3f) << 6) | (pkt[2] & 0x3f);669dev->y = ((pkt[1] & 0x3f) << 6) | (pkt[3] & 0x3f);670dev->touch = (pkt[0] & 0x40) >> 6;671672return 1;673}674#endif675676/*****************************************************************************677* Zytronic Part678*/679#ifdef CONFIG_TOUCHSCREEN_USB_ZYTRONIC680static int zytronic_read_data(struct usbtouch_usb *dev, unsigned char *pkt)681{682switch (pkt[0]) {683case 0x3A: /* command response */684dbg("%s: Command response %d", __func__, pkt[1]);685break;686687case 0xC0: /* down */688dev->x = (pkt[1] & 0x7f) | ((pkt[2] & 0x07) << 7);689dev->y = (pkt[3] & 0x7f) | ((pkt[4] & 0x07) << 7);690dev->touch = 1;691dbg("%s: down %d,%d", __func__, dev->x, dev->y);692return 1;693694case 0x80: /* up */695dev->x = (pkt[1] & 0x7f) | ((pkt[2] & 0x07) << 7);696dev->y = (pkt[3] & 0x7f) | ((pkt[4] & 0x07) << 7);697dev->touch = 0;698dbg("%s: up %d,%d", __func__, dev->x, dev->y);699return 1;700701default:702dbg("%s: Unknown return %d", __func__, pkt[0]);703break;704}705706return 0;707}708#endif709710/*****************************************************************************711* NEXIO Part712*/713#ifdef CONFIG_TOUCHSCREEN_USB_NEXIO714715#define NEXIO_TIMEOUT 5000716#define NEXIO_BUFSIZE 1024717#define NEXIO_THRESHOLD 50718719struct nexio_priv {720struct urb *ack;721unsigned char *ack_buf;722};723724struct nexio_touch_packet {725u8 flags; /* 0xe1 = touch, 0xe1 = release */726__be16 data_len; /* total bytes of touch data */727__be16 x_len; /* bytes for X axis */728__be16 y_len; /* bytes for Y axis */729u8 data[];730} __attribute__ ((packed));731732static unsigned char nexio_ack_pkt[2] = { 0xaa, 0x02 };733static unsigned char nexio_init_pkt[4] = { 0x82, 0x04, 0x0a, 0x0f };734735static void nexio_ack_complete(struct urb *urb)736{737}738739static int nexio_alloc(struct usbtouch_usb *usbtouch)740{741struct nexio_priv *priv;742int ret = -ENOMEM;743744usbtouch->priv = kmalloc(sizeof(struct nexio_priv), GFP_KERNEL);745if (!usbtouch->priv)746goto out_buf;747748priv = usbtouch->priv;749750priv->ack_buf = kmemdup(nexio_ack_pkt, sizeof(nexio_ack_pkt),751GFP_KERNEL);752if (!priv->ack_buf)753goto err_priv;754755priv->ack = usb_alloc_urb(0, GFP_KERNEL);756if (!priv->ack) {757dbg("%s - usb_alloc_urb failed: usbtouch->ack", __func__);758goto err_ack_buf;759}760761return 0;762763err_ack_buf:764kfree(priv->ack_buf);765err_priv:766kfree(priv);767out_buf:768return ret;769}770771static int nexio_init(struct usbtouch_usb *usbtouch)772{773struct usb_device *dev = interface_to_usbdev(usbtouch->interface);774struct usb_host_interface *interface = usbtouch->interface->cur_altsetting;775struct nexio_priv *priv = usbtouch->priv;776int ret = -ENOMEM;777int actual_len, i;778unsigned char *buf;779char *firmware_ver = NULL, *device_name = NULL;780int input_ep = 0, output_ep = 0;781782/* find first input and output endpoint */783for (i = 0; i < interface->desc.bNumEndpoints; i++) {784if (!input_ep &&785usb_endpoint_dir_in(&interface->endpoint[i].desc))786input_ep = interface->endpoint[i].desc.bEndpointAddress;787if (!output_ep &&788usb_endpoint_dir_out(&interface->endpoint[i].desc))789output_ep = interface->endpoint[i].desc.bEndpointAddress;790}791if (!input_ep || !output_ep)792return -ENXIO;793794buf = kmalloc(NEXIO_BUFSIZE, GFP_NOIO);795if (!buf)796goto out_buf;797798/* two empty reads */799for (i = 0; i < 2; i++) {800ret = usb_bulk_msg(dev, usb_rcvbulkpipe(dev, input_ep),801buf, NEXIO_BUFSIZE, &actual_len,802NEXIO_TIMEOUT);803if (ret < 0)804goto out_buf;805}806807/* send init command */808memcpy(buf, nexio_init_pkt, sizeof(nexio_init_pkt));809ret = usb_bulk_msg(dev, usb_sndbulkpipe(dev, output_ep),810buf, sizeof(nexio_init_pkt), &actual_len,811NEXIO_TIMEOUT);812if (ret < 0)813goto out_buf;814815/* read replies */816for (i = 0; i < 3; i++) {817memset(buf, 0, NEXIO_BUFSIZE);818ret = usb_bulk_msg(dev, usb_rcvbulkpipe(dev, input_ep),819buf, NEXIO_BUFSIZE, &actual_len,820NEXIO_TIMEOUT);821if (ret < 0 || actual_len < 1 || buf[1] != actual_len)822continue;823switch (buf[0]) {824case 0x83: /* firmware version */825if (!firmware_ver)826firmware_ver = kstrdup(&buf[2], GFP_NOIO);827break;828case 0x84: /* device name */829if (!device_name)830device_name = kstrdup(&buf[2], GFP_NOIO);831break;832}833}834835printk(KERN_INFO "Nexio device: %s, firmware version: %s\n",836device_name, firmware_ver);837838kfree(firmware_ver);839kfree(device_name);840841usb_fill_bulk_urb(priv->ack, dev, usb_sndbulkpipe(dev, output_ep),842priv->ack_buf, sizeof(nexio_ack_pkt),843nexio_ack_complete, usbtouch);844ret = 0;845846out_buf:847kfree(buf);848return ret;849}850851static void nexio_exit(struct usbtouch_usb *usbtouch)852{853struct nexio_priv *priv = usbtouch->priv;854855usb_kill_urb(priv->ack);856usb_free_urb(priv->ack);857kfree(priv->ack_buf);858kfree(priv);859}860861static int nexio_read_data(struct usbtouch_usb *usbtouch, unsigned char *pkt)862{863struct nexio_touch_packet *packet = (void *) pkt;864struct nexio_priv *priv = usbtouch->priv;865unsigned int data_len = be16_to_cpu(packet->data_len);866unsigned int x_len = be16_to_cpu(packet->x_len);867unsigned int y_len = be16_to_cpu(packet->y_len);868int x, y, begin_x, begin_y, end_x, end_y, w, h, ret;869870/* got touch data? */871if ((pkt[0] & 0xe0) != 0xe0)872return 0;873874if (data_len > 0xff)875data_len -= 0x100;876if (x_len > 0xff)877x_len -= 0x80;878879/* send ACK */880ret = usb_submit_urb(priv->ack, GFP_ATOMIC);881882if (!usbtouch->type->max_xc) {883usbtouch->type->max_xc = 2 * x_len;884input_set_abs_params(usbtouch->input, ABS_X,8850, usbtouch->type->max_xc, 0, 0);886usbtouch->type->max_yc = 2 * y_len;887input_set_abs_params(usbtouch->input, ABS_Y,8880, usbtouch->type->max_yc, 0, 0);889}890/*891* The device reports state of IR sensors on X and Y axes.892* Each byte represents "darkness" percentage (0-100) of one element.893* 17" touchscreen reports only 64 x 52 bytes so the resolution is low.894* This also means that there's a limited multi-touch capability but895* it's disabled (and untested) here as there's no X driver for that.896*/897begin_x = end_x = begin_y = end_y = -1;898for (x = 0; x < x_len; x++) {899if (begin_x == -1 && packet->data[x] > NEXIO_THRESHOLD) {900begin_x = x;901continue;902}903if (end_x == -1 && begin_x != -1 && packet->data[x] < NEXIO_THRESHOLD) {904end_x = x - 1;905for (y = x_len; y < data_len; y++) {906if (begin_y == -1 && packet->data[y] > NEXIO_THRESHOLD) {907begin_y = y - x_len;908continue;909}910if (end_y == -1 &&911begin_y != -1 && packet->data[y] < NEXIO_THRESHOLD) {912end_y = y - 1 - x_len;913w = end_x - begin_x;914h = end_y - begin_y;915#if 0916/* multi-touch */917input_report_abs(usbtouch->input,918ABS_MT_TOUCH_MAJOR, max(w,h));919input_report_abs(usbtouch->input,920ABS_MT_TOUCH_MINOR, min(x,h));921input_report_abs(usbtouch->input,922ABS_MT_POSITION_X, 2*begin_x+w);923input_report_abs(usbtouch->input,924ABS_MT_POSITION_Y, 2*begin_y+h);925input_report_abs(usbtouch->input,926ABS_MT_ORIENTATION, w > h);927input_mt_sync(usbtouch->input);928#endif929/* single touch */930usbtouch->x = 2 * begin_x + w;931usbtouch->y = 2 * begin_y + h;932usbtouch->touch = packet->flags & 0x01;933begin_y = end_y = -1;934return 1;935}936}937begin_x = end_x = -1;938}939940}941return 0;942}943#endif944945946/*****************************************************************************947* the different device descriptors948*/949#ifdef MULTI_PACKET950static void usbtouch_process_multi(struct usbtouch_usb *usbtouch,951unsigned char *pkt, int len);952#endif953954static struct usbtouch_device_info usbtouch_dev_info[] = {955#ifdef CONFIG_TOUCHSCREEN_USB_EGALAX956[DEVTYPE_EGALAX] = {957.min_xc = 0x0,958.max_xc = 0x07ff,959.min_yc = 0x0,960.max_yc = 0x07ff,961.rept_size = 16,962.process_pkt = usbtouch_process_multi,963.get_pkt_len = egalax_get_pkt_len,964.read_data = egalax_read_data,965},966#endif967968#ifdef CONFIG_TOUCHSCREEN_USB_PANJIT969[DEVTYPE_PANJIT] = {970.min_xc = 0x0,971.max_xc = 0x0fff,972.min_yc = 0x0,973.max_yc = 0x0fff,974.rept_size = 8,975.read_data = panjit_read_data,976},977#endif978979#ifdef CONFIG_TOUCHSCREEN_USB_3M980[DEVTYPE_3M] = {981.min_xc = 0x0,982.max_xc = 0x4000,983.min_yc = 0x0,984.max_yc = 0x4000,985.rept_size = 11,986.read_data = mtouch_read_data,987.init = mtouch_init,988},989#endif990991#ifdef CONFIG_TOUCHSCREEN_USB_ITM992[DEVTYPE_ITM] = {993.min_xc = 0x0,994.max_xc = 0x0fff,995.min_yc = 0x0,996.max_yc = 0x0fff,997.max_press = 0xff,998.rept_size = 8,999.read_data = itm_read_data,1000},1001#endif10021003#ifdef CONFIG_TOUCHSCREEN_USB_ETURBO1004[DEVTYPE_ETURBO] = {1005.min_xc = 0x0,1006.max_xc = 0x07ff,1007.min_yc = 0x0,1008.max_yc = 0x07ff,1009.rept_size = 8,1010.process_pkt = usbtouch_process_multi,1011.get_pkt_len = eturbo_get_pkt_len,1012.read_data = eturbo_read_data,1013},1014#endif10151016#ifdef CONFIG_TOUCHSCREEN_USB_GUNZE1017[DEVTYPE_GUNZE] = {1018.min_xc = 0x0,1019.max_xc = 0x0fff,1020.min_yc = 0x0,1021.max_yc = 0x0fff,1022.rept_size = 4,1023.read_data = gunze_read_data,1024},1025#endif10261027#ifdef CONFIG_TOUCHSCREEN_USB_DMC_TSC101028[DEVTYPE_DMC_TSC10] = {1029.min_xc = 0x0,1030.max_xc = 0x03ff,1031.min_yc = 0x0,1032.max_yc = 0x03ff,1033.rept_size = 5,1034.init = dmc_tsc10_init,1035.read_data = dmc_tsc10_read_data,1036},1037#endif10381039#ifdef CONFIG_TOUCHSCREEN_USB_IRTOUCH1040[DEVTYPE_IRTOUCH] = {1041.min_xc = 0x0,1042.max_xc = 0x0fff,1043.min_yc = 0x0,1044.max_yc = 0x0fff,1045.rept_size = 8,1046.read_data = irtouch_read_data,1047},1048#endif10491050#ifdef CONFIG_TOUCHSCREEN_USB_IDEALTEK1051[DEVTYPE_IDEALTEK] = {1052.min_xc = 0x0,1053.max_xc = 0x0fff,1054.min_yc = 0x0,1055.max_yc = 0x0fff,1056.rept_size = 8,1057.process_pkt = usbtouch_process_multi,1058.get_pkt_len = idealtek_get_pkt_len,1059.read_data = idealtek_read_data,1060},1061#endif10621063#ifdef CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH1064[DEVTYPE_GENERAL_TOUCH] = {1065.min_xc = 0x0,1066.max_xc = 0x7fff,1067.min_yc = 0x0,1068.max_yc = 0x7fff,1069.rept_size = 7,1070.read_data = general_touch_read_data,1071},1072#endif10731074#ifdef CONFIG_TOUCHSCREEN_USB_GOTOP1075[DEVTYPE_GOTOP] = {1076.min_xc = 0x0,1077.max_xc = 0x03ff,1078.min_yc = 0x0,1079.max_yc = 0x03ff,1080.rept_size = 4,1081.read_data = gotop_read_data,1082},1083#endif10841085#ifdef CONFIG_TOUCHSCREEN_USB_JASTEC1086[DEVTYPE_JASTEC] = {1087.min_xc = 0x0,1088.max_xc = 0x0fff,1089.min_yc = 0x0,1090.max_yc = 0x0fff,1091.rept_size = 4,1092.read_data = jastec_read_data,1093},1094#endif10951096#ifdef CONFIG_TOUCHSCREEN_USB_E2I1097[DEVTYPE_E2I] = {1098.min_xc = 0x0,1099.max_xc = 0x7fff,1100.min_yc = 0x0,1101.max_yc = 0x7fff,1102.rept_size = 6,1103.init = e2i_init,1104.read_data = e2i_read_data,1105},1106#endif11071108#ifdef CONFIG_TOUCHSCREEN_USB_ZYTRONIC1109[DEVTYPE_ZYTRONIC] = {1110.min_xc = 0x0,1111.max_xc = 0x03ff,1112.min_yc = 0x0,1113.max_yc = 0x03ff,1114.rept_size = 5,1115.read_data = zytronic_read_data,1116.irq_always = true,1117},1118#endif11191120#ifdef CONFIG_TOUCHSCREEN_USB_ETT_TC45USB1121[DEVTYPE_TC45USB] = {1122.min_xc = 0x0,1123.max_xc = 0x0fff,1124.min_yc = 0x0,1125.max_yc = 0x0fff,1126.rept_size = 5,1127.read_data = tc45usb_read_data,1128},1129#endif11301131#ifdef CONFIG_TOUCHSCREEN_USB_NEXIO1132[DEVTYPE_NEXIO] = {1133.rept_size = 1024,1134.irq_always = true,1135.read_data = nexio_read_data,1136.alloc = nexio_alloc,1137.init = nexio_init,1138.exit = nexio_exit,1139},1140#endif1141};114211431144/*****************************************************************************1145* Generic Part1146*/1147static void usbtouch_process_pkt(struct usbtouch_usb *usbtouch,1148unsigned char *pkt, int len)1149{1150struct usbtouch_device_info *type = usbtouch->type;11511152if (!type->read_data(usbtouch, pkt))1153return;11541155input_report_key(usbtouch->input, BTN_TOUCH, usbtouch->touch);11561157if (swap_xy) {1158input_report_abs(usbtouch->input, ABS_X, usbtouch->y);1159input_report_abs(usbtouch->input, ABS_Y, usbtouch->x);1160} else {1161input_report_abs(usbtouch->input, ABS_X, usbtouch->x);1162input_report_abs(usbtouch->input, ABS_Y, usbtouch->y);1163}1164if (type->max_press)1165input_report_abs(usbtouch->input, ABS_PRESSURE, usbtouch->press);1166input_sync(usbtouch->input);1167}116811691170#ifdef MULTI_PACKET1171static void usbtouch_process_multi(struct usbtouch_usb *usbtouch,1172unsigned char *pkt, int len)1173{1174unsigned char *buffer;1175int pkt_len, pos, buf_len, tmp;11761177/* process buffer */1178if (unlikely(usbtouch->buf_len)) {1179/* try to get size */1180pkt_len = usbtouch->type->get_pkt_len(1181usbtouch->buffer, usbtouch->buf_len);11821183/* drop? */1184if (unlikely(!pkt_len))1185goto out_flush_buf;11861187/* need to append -pkt_len bytes before able to get size */1188if (unlikely(pkt_len < 0)) {1189int append = -pkt_len;1190if (unlikely(append > len))1191append = len;1192if (usbtouch->buf_len + append >= usbtouch->type->rept_size)1193goto out_flush_buf;1194memcpy(usbtouch->buffer + usbtouch->buf_len, pkt, append);1195usbtouch->buf_len += append;11961197pkt_len = usbtouch->type->get_pkt_len(1198usbtouch->buffer, usbtouch->buf_len);1199if (pkt_len < 0)1200return;1201}12021203/* append */1204tmp = pkt_len - usbtouch->buf_len;1205if (usbtouch->buf_len + tmp >= usbtouch->type->rept_size)1206goto out_flush_buf;1207memcpy(usbtouch->buffer + usbtouch->buf_len, pkt, tmp);1208usbtouch_process_pkt(usbtouch, usbtouch->buffer, pkt_len);12091210buffer = pkt + tmp;1211buf_len = len - tmp;1212} else {1213buffer = pkt;1214buf_len = len;1215}12161217/* loop over the received packet, process */1218pos = 0;1219while (pos < buf_len) {1220/* get packet len */1221pkt_len = usbtouch->type->get_pkt_len(buffer + pos,1222buf_len - pos);12231224/* unknown packet: skip one byte */1225if (unlikely(!pkt_len)) {1226pos++;1227continue;1228}12291230/* full packet: process */1231if (likely((pkt_len > 0) && (pkt_len <= buf_len - pos))) {1232usbtouch_process_pkt(usbtouch, buffer + pos, pkt_len);1233} else {1234/* incomplete packet: save in buffer */1235memcpy(usbtouch->buffer, buffer + pos, buf_len - pos);1236usbtouch->buf_len = buf_len - pos;1237return;1238}1239pos += pkt_len;1240}12411242out_flush_buf:1243usbtouch->buf_len = 0;1244return;1245}1246#endif124712481249static void usbtouch_irq(struct urb *urb)1250{1251struct usbtouch_usb *usbtouch = urb->context;1252int retval;12531254switch (urb->status) {1255case 0:1256/* success */1257break;1258case -ETIME:1259/* this urb is timing out */1260dbg("%s - urb timed out - was the device unplugged?",1261__func__);1262return;1263case -ECONNRESET:1264case -ENOENT:1265case -ESHUTDOWN:1266case -EPIPE:1267/* this urb is terminated, clean up */1268dbg("%s - urb shutting down with status: %d",1269__func__, urb->status);1270return;1271default:1272dbg("%s - nonzero urb status received: %d",1273__func__, urb->status);1274goto exit;1275}12761277usbtouch->type->process_pkt(usbtouch, usbtouch->data, urb->actual_length);12781279exit:1280usb_mark_last_busy(interface_to_usbdev(usbtouch->interface));1281retval = usb_submit_urb(urb, GFP_ATOMIC);1282if (retval)1283err("%s - usb_submit_urb failed with result: %d",1284__func__, retval);1285}12861287static int usbtouch_open(struct input_dev *input)1288{1289struct usbtouch_usb *usbtouch = input_get_drvdata(input);1290int r;12911292usbtouch->irq->dev = interface_to_usbdev(usbtouch->interface);12931294r = usb_autopm_get_interface(usbtouch->interface) ? -EIO : 0;1295if (r < 0)1296goto out;12971298if (!usbtouch->type->irq_always) {1299if (usb_submit_urb(usbtouch->irq, GFP_KERNEL)) {1300r = -EIO;1301goto out_put;1302}1303}13041305usbtouch->interface->needs_remote_wakeup = 1;1306out_put:1307usb_autopm_put_interface(usbtouch->interface);1308out:1309return r;1310}13111312static void usbtouch_close(struct input_dev *input)1313{1314struct usbtouch_usb *usbtouch = input_get_drvdata(input);1315int r;13161317if (!usbtouch->type->irq_always)1318usb_kill_urb(usbtouch->irq);1319r = usb_autopm_get_interface(usbtouch->interface);1320usbtouch->interface->needs_remote_wakeup = 0;1321if (!r)1322usb_autopm_put_interface(usbtouch->interface);1323}13241325static int usbtouch_suspend1326(struct usb_interface *intf, pm_message_t message)1327{1328struct usbtouch_usb *usbtouch = usb_get_intfdata(intf);13291330usb_kill_urb(usbtouch->irq);13311332return 0;1333}13341335static int usbtouch_resume(struct usb_interface *intf)1336{1337struct usbtouch_usb *usbtouch = usb_get_intfdata(intf);1338struct input_dev *input = usbtouch->input;1339int result = 0;13401341mutex_lock(&input->mutex);1342if (input->users || usbtouch->type->irq_always)1343result = usb_submit_urb(usbtouch->irq, GFP_NOIO);1344mutex_unlock(&input->mutex);13451346return result;1347}13481349static int usbtouch_reset_resume(struct usb_interface *intf)1350{1351struct usbtouch_usb *usbtouch = usb_get_intfdata(intf);1352struct input_dev *input = usbtouch->input;1353int err = 0;13541355/* reinit the device */1356if (usbtouch->type->init) {1357err = usbtouch->type->init(usbtouch);1358if (err) {1359dbg("%s - type->init() failed, err: %d",1360__func__, err);1361return err;1362}1363}13641365/* restart IO if needed */1366mutex_lock(&input->mutex);1367if (input->users)1368err = usb_submit_urb(usbtouch->irq, GFP_NOIO);1369mutex_unlock(&input->mutex);13701371return err;1372}13731374static void usbtouch_free_buffers(struct usb_device *udev,1375struct usbtouch_usb *usbtouch)1376{1377usb_free_coherent(udev, usbtouch->type->rept_size,1378usbtouch->data, usbtouch->data_dma);1379kfree(usbtouch->buffer);1380}13811382static struct usb_endpoint_descriptor *1383usbtouch_get_input_endpoint(struct usb_host_interface *interface)1384{1385int i;13861387for (i = 0; i < interface->desc.bNumEndpoints; i++)1388if (usb_endpoint_dir_in(&interface->endpoint[i].desc))1389return &interface->endpoint[i].desc;13901391return NULL;1392}13931394static int usbtouch_probe(struct usb_interface *intf,1395const struct usb_device_id *id)1396{1397struct usbtouch_usb *usbtouch;1398struct input_dev *input_dev;1399struct usb_endpoint_descriptor *endpoint;1400struct usb_device *udev = interface_to_usbdev(intf);1401struct usbtouch_device_info *type;1402int err = -ENOMEM;14031404/* some devices are ignored */1405if (id->driver_info == DEVTYPE_IGNORE)1406return -ENODEV;14071408endpoint = usbtouch_get_input_endpoint(intf->cur_altsetting);1409if (!endpoint)1410return -ENXIO;14111412usbtouch = kzalloc(sizeof(struct usbtouch_usb), GFP_KERNEL);1413input_dev = input_allocate_device();1414if (!usbtouch || !input_dev)1415goto out_free;14161417type = &usbtouch_dev_info[id->driver_info];1418usbtouch->type = type;1419if (!type->process_pkt)1420type->process_pkt = usbtouch_process_pkt;14211422usbtouch->data = usb_alloc_coherent(udev, type->rept_size,1423GFP_KERNEL, &usbtouch->data_dma);1424if (!usbtouch->data)1425goto out_free;14261427if (type->get_pkt_len) {1428usbtouch->buffer = kmalloc(type->rept_size, GFP_KERNEL);1429if (!usbtouch->buffer)1430goto out_free_buffers;1431}14321433usbtouch->irq = usb_alloc_urb(0, GFP_KERNEL);1434if (!usbtouch->irq) {1435dbg("%s - usb_alloc_urb failed: usbtouch->irq", __func__);1436goto out_free_buffers;1437}14381439usbtouch->interface = intf;1440usbtouch->input = input_dev;14411442if (udev->manufacturer)1443strlcpy(usbtouch->name, udev->manufacturer, sizeof(usbtouch->name));14441445if (udev->product) {1446if (udev->manufacturer)1447strlcat(usbtouch->name, " ", sizeof(usbtouch->name));1448strlcat(usbtouch->name, udev->product, sizeof(usbtouch->name));1449}14501451if (!strlen(usbtouch->name))1452snprintf(usbtouch->name, sizeof(usbtouch->name),1453"USB Touchscreen %04x:%04x",1454le16_to_cpu(udev->descriptor.idVendor),1455le16_to_cpu(udev->descriptor.idProduct));14561457usb_make_path(udev, usbtouch->phys, sizeof(usbtouch->phys));1458strlcat(usbtouch->phys, "/input0", sizeof(usbtouch->phys));14591460input_dev->name = usbtouch->name;1461input_dev->phys = usbtouch->phys;1462usb_to_input_id(udev, &input_dev->id);1463input_dev->dev.parent = &intf->dev;14641465input_set_drvdata(input_dev, usbtouch);14661467input_dev->open = usbtouch_open;1468input_dev->close = usbtouch_close;14691470input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);1471input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);1472input_set_abs_params(input_dev, ABS_X, type->min_xc, type->max_xc, 0, 0);1473input_set_abs_params(input_dev, ABS_Y, type->min_yc, type->max_yc, 0, 0);1474if (type->max_press)1475input_set_abs_params(input_dev, ABS_PRESSURE, type->min_press,1476type->max_press, 0, 0);14771478if (usb_endpoint_type(endpoint) == USB_ENDPOINT_XFER_INT)1479usb_fill_int_urb(usbtouch->irq, udev,1480usb_rcvintpipe(udev, endpoint->bEndpointAddress),1481usbtouch->data, type->rept_size,1482usbtouch_irq, usbtouch, endpoint->bInterval);1483else1484usb_fill_bulk_urb(usbtouch->irq, udev,1485usb_rcvbulkpipe(udev, endpoint->bEndpointAddress),1486usbtouch->data, type->rept_size,1487usbtouch_irq, usbtouch);14881489usbtouch->irq->dev = udev;1490usbtouch->irq->transfer_dma = usbtouch->data_dma;1491usbtouch->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;14921493/* device specific allocations */1494if (type->alloc) {1495err = type->alloc(usbtouch);1496if (err) {1497dbg("%s - type->alloc() failed, err: %d", __func__, err);1498goto out_free_urb;1499}1500}15011502/* device specific initialisation*/1503if (type->init) {1504err = type->init(usbtouch);1505if (err) {1506dbg("%s - type->init() failed, err: %d", __func__, err);1507goto out_do_exit;1508}1509}15101511err = input_register_device(usbtouch->input);1512if (err) {1513dbg("%s - input_register_device failed, err: %d", __func__, err);1514goto out_do_exit;1515}15161517usb_set_intfdata(intf, usbtouch);15181519if (usbtouch->type->irq_always) {1520/* this can't fail */1521usb_autopm_get_interface(intf);1522err = usb_submit_urb(usbtouch->irq, GFP_KERNEL);1523if (err) {1524usb_autopm_put_interface(intf);1525err("%s - usb_submit_urb failed with result: %d",1526__func__, err);1527goto out_unregister_input;1528}1529}15301531return 0;15321533out_unregister_input:1534input_unregister_device(input_dev);1535input_dev = NULL;1536out_do_exit:1537if (type->exit)1538type->exit(usbtouch);1539out_free_urb:1540usb_free_urb(usbtouch->irq);1541out_free_buffers:1542usbtouch_free_buffers(udev, usbtouch);1543out_free:1544input_free_device(input_dev);1545kfree(usbtouch);1546return err;1547}15481549static void usbtouch_disconnect(struct usb_interface *intf)1550{1551struct usbtouch_usb *usbtouch = usb_get_intfdata(intf);15521553dbg("%s - called", __func__);15541555if (!usbtouch)1556return;15571558dbg("%s - usbtouch is initialized, cleaning up", __func__);1559usb_set_intfdata(intf, NULL);1560/* this will stop IO via close */1561input_unregister_device(usbtouch->input);1562usb_free_urb(usbtouch->irq);1563if (usbtouch->type->exit)1564usbtouch->type->exit(usbtouch);1565usbtouch_free_buffers(interface_to_usbdev(intf), usbtouch);1566kfree(usbtouch);1567}15681569MODULE_DEVICE_TABLE(usb, usbtouch_devices);15701571static struct usb_driver usbtouch_driver = {1572.name = "usbtouchscreen",1573.probe = usbtouch_probe,1574.disconnect = usbtouch_disconnect,1575.suspend = usbtouch_suspend,1576.resume = usbtouch_resume,1577.reset_resume = usbtouch_reset_resume,1578.id_table = usbtouch_devices,1579.supports_autosuspend = 1,1580};15811582static int __init usbtouch_init(void)1583{1584return usb_register(&usbtouch_driver);1585}15861587static void __exit usbtouch_cleanup(void)1588{1589usb_deregister(&usbtouch_driver);1590}15911592module_init(usbtouch_init);1593module_exit(usbtouch_cleanup);15941595MODULE_AUTHOR(DRIVER_AUTHOR);1596MODULE_DESCRIPTION(DRIVER_DESC);1597MODULE_LICENSE("GPL");15981599MODULE_ALIAS("touchkitusb");1600MODULE_ALIAS("itmtouch");1601MODULE_ALIAS("mtouchusb");160216031604