Merge branch 'release-2.6.27' of git://git.kernel.org/pub/scm/linux/kernel/git/ak...
[pandora-kernel.git] / drivers / input / touchscreen / usbtouchscreen.c
index 63f9664..fdd645c 100644 (file)
@@ -49,6 +49,7 @@
 #include <linux/init.h>
 #include <linux/usb.h>
 #include <linux/usb/input.h>
+#include <linux/hid.h>
 
 
 #define DRIVER_VERSION         "v0.6"
@@ -101,7 +102,7 @@ struct usbtouch_usb {
 
 /* device types */
 enum {
-       DEVTPYE_DUMMY = -1,
+       DEVTYPE_IGNORE = -1,
        DEVTYPE_EGALAX,
        DEVTYPE_PANJIT,
        DEVTYPE_3M,
@@ -115,8 +116,21 @@ enum {
        DEVTYPE_GOTOP,
 };
 
+#define USB_DEVICE_HID_CLASS(vend, prod) \
+       .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS \
+               | USB_DEVICE_ID_MATCH_DEVICE, \
+       .idVendor = (vend), \
+       .idProduct = (prod), \
+       .bInterfaceClass = USB_INTERFACE_CLASS_HID, \
+       .bInterfaceProtocol = USB_INTERFACE_PROTOCOL_MOUSE
+
 static struct usb_device_id usbtouch_devices[] = {
 #ifdef CONFIG_TOUCHSCREEN_USB_EGALAX
+       /* ignore the HID capable devices, handled by usbhid */
+       {USB_DEVICE_HID_CLASS(0x0eef, 0x0001), .driver_info = DEVTYPE_IGNORE},
+       {USB_DEVICE_HID_CLASS(0x0eef, 0x0002), .driver_info = DEVTYPE_IGNORE},
+
+       /* normal device IDs */
        {USB_DEVICE(0x3823, 0x0001), .driver_info = DEVTYPE_EGALAX},
        {USB_DEVICE(0x3823, 0x0002), .driver_info = DEVTYPE_EGALAX},
        {USB_DEVICE(0x0123, 0x0001), .driver_info = DEVTYPE_EGALAX},
@@ -262,7 +276,7 @@ static int mtouch_init(struct usbtouch_usb *usbtouch)
                              USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
                              1, 0, NULL, 0, USB_CTRL_SET_TIMEOUT);
        dbg("%s - usb_control_msg - MTOUCHUSB_RESET - bytes|err: %d",
-           __FUNCTION__, ret);
+           __func__, ret);
        if (ret < 0)
                return ret;
        msleep(150);
@@ -273,7 +287,7 @@ static int mtouch_init(struct usbtouch_usb *usbtouch)
                                      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
                                      1, 1, NULL, 0, USB_CTRL_SET_TIMEOUT);
                dbg("%s - usb_control_msg - MTOUCHUSB_ASYNC_REPORT - bytes|err: %d",
-                   __FUNCTION__, ret);
+                   __func__, ret);
                if (ret >= 0)
                        break;
                if (ret != -EPIPE)
@@ -396,9 +410,12 @@ static int gunze_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
 static int dmc_tsc10_init(struct usbtouch_usb *usbtouch)
 {
        struct usb_device *dev = usbtouch->udev;
-       int ret;
-       unsigned char buf[2];
+       int ret = -ENOMEM;
+       unsigned char *buf;
 
+       buf = kmalloc(2, GFP_KERNEL);
+       if (!buf)
+               goto err_nobuf;
        /* reset */
        buf[0] = buf[1] = 0xFF;
        ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0),
@@ -406,9 +423,11 @@ static int dmc_tsc10_init(struct usbtouch_usb *usbtouch)
                              USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
                              0, 0, buf, 2, USB_CTRL_SET_TIMEOUT);
        if (ret < 0)
-               return ret;
-       if (buf[0] != 0x06 || buf[1] != 0x00)
-               return -ENODEV;
+               goto err_out;
+       if (buf[0] != 0x06 || buf[1] != 0x00) {
+               ret = -ENODEV;
+               goto err_out;
+       }
 
        /* set coordinate output rate */
        buf[0] = buf[1] = 0xFF;
@@ -417,20 +436,22 @@ static int dmc_tsc10_init(struct usbtouch_usb *usbtouch)
                              USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
                              TSC10_RATE_150, 0, buf, 2, USB_CTRL_SET_TIMEOUT);
        if (ret < 0)
-               return ret;
+               goto err_out;
        if ((buf[0] != 0x06 || buf[1] != 0x00) &&
-           (buf[0] != 0x15 || buf[1] != 0x01))
-               return -ENODEV;
+           (buf[0] != 0x15 || buf[1] != 0x01)) {
+               ret = -ENODEV;
+               goto err_out;
+       }
 
        /* start sending data */
        ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0),
                              TSC10_CMD_DATA1,
                              USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
                              0, 0, NULL, 0, USB_CTRL_SET_TIMEOUT);
-       if (ret < 0)
-               return ret;
-
-       return 0;
+err_out:
+       kfree(buf);
+err_nobuf:
+       return ret;
 }
 
 
@@ -786,18 +807,18 @@ static void usbtouch_irq(struct urb *urb)
        case -ETIME:
                /* this urb is timing out */
                dbg("%s - urb timed out - was the device unplugged?",
-                   __FUNCTION__);
+                   __func__);
                return;
        case -ECONNRESET:
        case -ENOENT:
        case -ESHUTDOWN:
                /* this urb is terminated, clean up */
                dbg("%s - urb shutting down with status: %d",
-                   __FUNCTION__, urb->status);
+                   __func__, urb->status);
                return;
        default:
                dbg("%s - nonzero urb status received: %d",
-                   __FUNCTION__, urb->status);
+                   __func__, urb->status);
                goto exit;
        }
 
@@ -807,7 +828,7 @@ exit:
        retval = usb_submit_urb(urb, GFP_ATOMIC);
        if (retval)
                err("%s - usb_submit_urb failed with result: %d",
-                   __FUNCTION__, retval);
+                   __func__, retval);
 }
 
 static int usbtouch_open(struct input_dev *input)
@@ -850,6 +871,10 @@ static int usbtouch_probe(struct usb_interface *intf,
        struct usbtouch_device_info *type;
        int err = -ENOMEM;
 
+       /* some devices are ignored */
+       if (id->driver_info == DEVTYPE_IGNORE)
+               return -ENODEV;
+
        interface = intf->cur_altsetting;
        endpoint = &interface->endpoint[0].desc;
 
@@ -876,7 +901,7 @@ static int usbtouch_probe(struct usb_interface *intf,
 
        usbtouch->irq = usb_alloc_urb(0, GFP_KERNEL);
        if (!usbtouch->irq) {
-               dbg("%s - usb_alloc_urb failed: usbtouch->irq", __FUNCTION__);
+               dbg("%s - usb_alloc_urb failed: usbtouch->irq", __func__);
                goto out_free_buffers;
        }
 
@@ -932,14 +957,14 @@ static int usbtouch_probe(struct usb_interface *intf,
        if (type->init) {
                err = type->init(usbtouch);
                if (err) {
-                       dbg("%s - type->init() failed, err: %d", __FUNCTION__, err);
+                       dbg("%s - type->init() failed, err: %d", __func__, err);
                        goto out_free_buffers;
                }
        }
 
        err = input_register_device(usbtouch->input);
        if (err) {
-               dbg("%s - input_register_device failed, err: %d", __FUNCTION__, err);
+               dbg("%s - input_register_device failed, err: %d", __func__, err);
                goto out_free_buffers;
        }
 
@@ -959,12 +984,12 @@ static void usbtouch_disconnect(struct usb_interface *intf)
 {
        struct usbtouch_usb *usbtouch = usb_get_intfdata(intf);
 
-       dbg("%s - called", __FUNCTION__);
+       dbg("%s - called", __func__);
 
        if (!usbtouch)
                return;
 
-       dbg("%s - usbtouch is initialized, cleaning up", __FUNCTION__);
+       dbg("%s - usbtouch is initialized, cleaning up", __func__);
        usb_set_intfdata(intf, NULL);
        usb_kill_urb(usbtouch->irq);
        input_unregister_device(usbtouch->input);