/******************************************************************************
 * mtouchusb.c  --  Driver for Microtouch (Now 3M) USB Touchscreens
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 * Based upon original work by Radoslaw Garbacz (usb-support@ite.pl)
 *  (http://freshmeat.net/projects/3mtouchscreendriver)
 *
 * History
 *
 *  0.3 & 0.4  2002 (TEJ) tejohnson@yahoo.com
 *    Updated to 2.4.18, then 2.4.19
 *    Old version still relied on stealing a minor
 *
 *  0.5  02/26/2004 (TEJ) tejohnson@yahoo.com
 *    Complete rewrite using Linux Input in 2.6.3
 *    Unfortunately no calibration support at this time
 *
 *  1.4 04/25/2004 (TEJ) tejohnson@yahoo.com
 *    Changed reset from standard USB dev reset to vendor reset
 *    Changed data sent to host from compensated to raw coordinates
 *    Eliminated vendor/product module params
 *    Performed multiple successfull tests with an EXII-5010UC
 *
 *  1.5 02/27/2005 ddstreet@ieee.org
 *    Added module parameter to select raw or hw-calibrated coordinate reporting
 *
 *****************************************************************************/

#include <linux/config.h>

#ifdef CONFIG_USB_DEBUG
        #define DEBUG
#else
        #undef DEBUG
#endif

#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/input.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/usb.h>

#define MTOUCHUSB_MIN_XC                0x0
#define MTOUCHUSB_MAX_RAW_XC            0x4000
#define MTOUCHUSB_MAX_CALIB_XC          0xffff
#define MTOUCHUSB_XC_FUZZ               0x0
#define MTOUCHUSB_XC_FLAT               0x0
#define MTOUCHUSB_MIN_YC                0x0
#define MTOUCHUSB_MAX_RAW_YC            0x4000
#define MTOUCHUSB_MAX_CALIB_YC          0xffff
#define MTOUCHUSB_YC_FUZZ               0x0
#define MTOUCHUSB_YC_FLAT               0x0

#define MTOUCHUSB_ASYNC_REPORT          1
#define MTOUCHUSB_RESET                 7
#define MTOUCHUSB_REPORT_DATA_SIZE      11
#define MTOUCHUSB_REQ_CTRLLR_ID         10

#define MTOUCHUSB_GET_RAW_XC(data)      (data[8]<<8 | data[7])
#define MTOUCHUSB_GET_CALIB_XC(data)    (data[4]<<8 | data[3])
#define MTOUCHUSB_GET_RAW_YC(data)      (data[10]<<8 | data[9])
#define MTOUCHUSB_GET_CALIB_YC(data)    (data[6]<<8 | data[5])
#define MTOUCHUSB_GET_XC(data)          (raw_coordinates ? \
                                         MTOUCHUSB_GET_RAW_XC(data) : \
                                         MTOUCHUSB_GET_CALIB_XC(data))
#define MTOUCHUSB_GET_YC(data)          (raw_coordinates ? \
                                         MTOUCHUSB_GET_RAW_YC(data) : \
                                         MTOUCHUSB_GET_CALIB_YC(data))
#define MTOUCHUSB_GET_TOUCHED(data)     ((data[2] & 0x40) ? 1:0)

#define DRIVER_VERSION "v1.5"
#define DRIVER_AUTHOR "Todd E. Johnson, tejohnson@yahoo.com"
#define DRIVER_DESC "3M USB Touchscreen Driver"
#define DRIVER_LICENSE "GPL"

static int raw_coordinates = 1;

module_param(raw_coordinates, bool, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(raw_coordinates, "report raw coordinate values (y, default) or hardware-calibrated coordinate values (n)");

struct mtouch_usb {
        unsigned char *data;
        dma_addr_t data_dma;
        struct urb *irq;
        struct usb_device *udev;
        struct input_dev input;
        int open;
        char name[128];
        char phys[64];
};

static struct usb_device_id mtouchusb_devices [] = {
        { USB_DEVICE(0x0596, 0x0001) },
        { }
};

static void mtouchusb_irq(struct urb *urb, struct pt_regs *regs)
{
        struct mtouch_usb *mtouch = urb->context;
        int retval;

        switch (urb->status) {
                case 0:
                        /* success */
                        break;
                case -ETIMEDOUT:
                        /* this urb is timing out */
                        dbg("%s - urb timed out - was the device unplugged?",
                            __FUNCTION__);
                        return;
                case -ECONNRESET:
                case -ENOENT:
                case -ESHUTDOWN:
                        /* this urb is terminated, clean up */
                        dbg("%s - urb shutting down with status: %d",
                            __FUNCTION__, urb->status);
                        return;
                default:
                        dbg("%s - nonzero urb status received: %d",
                            __FUNCTION__, urb->status);
                        goto exit;
        }

        input_regs(&mtouch->input, regs);
        input_report_key(&mtouch->input, BTN_TOUCH,
                         MTOUCHUSB_GET_TOUCHED(mtouch->data));
        input_report_abs(&mtouch->input, ABS_X,
                         MTOUCHUSB_GET_XC(mtouch->data));
        input_report_abs(&mtouch->input, ABS_Y,
			 (raw_coordinates ? MTOUCHUSB_MAX_RAW_YC : MTOUCHUSB_MAX_CALIB_YC)
                         - MTOUCHUSB_GET_YC(mtouch->data));
        input_sync(&mtouch->input);

exit:
        retval = usb_submit_urb (urb, GFP_ATOMIC);
        if (retval)
                err ("%s - usb_submit_urb failed with result: %d",
                     __FUNCTION__, retval);
}

static int mtouchusb_open (struct input_dev *input)
{
        struct mtouch_usb *mtouch = input->private;

        if (mtouch->open++)
                return 0;

        mtouch->irq->dev = mtouch->udev;

        if (usb_submit_urb (mtouch->irq, GFP_ATOMIC)) {
                mtouch->open--;
                return -EIO;
        }

        return 0;
}

static void mtouchusb_close (struct input_dev *input)
{
        struct mtouch_usb *mtouch = input->private;

        if (!--mtouch->open)
                usb_kill_urb (mtouch->irq);
}

static int mtouchusb_alloc_buffers(struct usb_device *udev, struct mtouch_usb *mtouch)
{
        dbg("%s - called", __FUNCTION__);

        mtouch->data = usb_buffer_alloc(udev, MTOUCHUSB_REPORT_DATA_SIZE,
                                        SLAB_ATOMIC, &mtouch->data_dma);

        if (!mtouch->data)
                return -1;

        return 0;
}

static void mtouchusb_free_buffers(struct usb_device *udev, struct mtouch_usb *mtouch)
{
        dbg("%s - called", __FUNCTION__);

        if (mtouch->data)
                usb_buffer_free(udev, MTOUCHUSB_REPORT_DATA_SIZE,
                                mtouch->data, mtouch->data_dma);
}

static int mtouchusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
{
        struct mtouch_usb *mtouch;
        struct usb_host_interface *interface;
        struct usb_endpoint_descriptor *endpoint;
        struct usb_device *udev = interface_to_usbdev (intf);
        char path[64];
        int nRet;

        dbg("%s - called", __FUNCTION__);

        dbg("%s - setting interface", __FUNCTION__);
        interface = intf->cur_altsetting;

        dbg("%s - setting endpoint", __FUNCTION__);
        endpoint = &interface->endpoint[0].desc;

        if (!(mtouch = kmalloc (sizeof (struct mtouch_usb), GFP_KERNEL))) {
                err("%s - Out of memory.", __FUNCTION__);
                return -ENOMEM;
        }

        memset(mtouch, 0, sizeof(struct mtouch_usb));
        mtouch->udev = udev;

        dbg("%s - allocating buffers", __FUNCTION__);
        if (mtouchusb_alloc_buffers(udev, mtouch)) {
                mtouchusb_free_buffers(udev, mtouch);
                kfree(mtouch);
                return -ENOMEM;
        }

        mtouch->input.private = mtouch;
        mtouch->input.open = mtouchusb_open;
        mtouch->input.close = mtouchusb_close;

        usb_make_path(udev, path, 64);
        sprintf(mtouch->phys, "%s/input0", path);

        mtouch->input.name = mtouch->name;
        mtouch->input.phys = mtouch->phys;
        mtouch->input.id.bustype = BUS_USB;
        mtouch->input.id.vendor = le16_to_cpu(udev->descriptor.idVendor);
        mtouch->input.id.product = le16_to_cpu(udev->descriptor.idProduct);
        mtouch->input.id.version = le16_to_cpu(udev->descriptor.bcdDevice);
        mtouch->input.dev = &intf->dev;

        mtouch->input.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
        mtouch->input.absbit[0] = BIT(ABS_X) | BIT(ABS_Y);
        mtouch->input.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);

        /* Used to Scale Compensated Data and Flip Y */
        mtouch->input.absmin[ABS_X] =  MTOUCHUSB_MIN_XC;
        mtouch->input.absmax[ABS_X] =  raw_coordinates ? \
                                       MTOUCHUSB_MAX_RAW_XC : MTOUCHUSB_MAX_CALIB_XC;
        mtouch->input.absfuzz[ABS_X] = MTOUCHUSB_XC_FUZZ;
        mtouch->input.absflat[ABS_X] = MTOUCHUSB_XC_FLAT;
        mtouch->input.absmin[ABS_Y] =  MTOUCHUSB_MIN_YC;
        mtouch->input.absmax[ABS_Y] =  raw_coordinates ? \
                                       MTOUCHUSB_MAX_RAW_YC : MTOUCHUSB_MAX_CALIB_YC;
        mtouch->input.absfuzz[ABS_Y] = MTOUCHUSB_YC_FUZZ;
        mtouch->input.absflat[ABS_Y] = MTOUCHUSB_YC_FLAT;

	if (udev->manufacturer)
		strcat(mtouch->name, udev->manufacturer);
	if (udev->product)
		sprintf(mtouch->name, "%s %s", mtouch->name, udev->product);

        if (!strlen(mtouch->name))
                sprintf(mtouch->name, "USB Touchscreen %04x:%04x",
                        mtouch->input.id.vendor, mtouch->input.id.product);

        nRet = usb_control_msg(mtouch->udev,
                               usb_rcvctrlpipe(udev, 0),
                               MTOUCHUSB_RESET,
                               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__, nRet);

        dbg("%s - usb_alloc_urb: mtouch->irq", __FUNCTION__);
        mtouch->irq = usb_alloc_urb(0, GFP_KERNEL);
        if (!mtouch->irq) {
                dbg("%s - usb_alloc_urb failed: mtouch->irq", __FUNCTION__);
                mtouchusb_free_buffers(udev, mtouch);
                kfree(mtouch);
                return -ENOMEM;
        }

        dbg("%s - usb_fill_int_urb", __FUNCTION__);
        usb_fill_int_urb(mtouch->irq,
                         mtouch->udev,
                         usb_rcvintpipe(mtouch->udev, 0x81),
                         mtouch->data,
                         MTOUCHUSB_REPORT_DATA_SIZE,
                         mtouchusb_irq,
                         mtouch,
                         endpoint->bInterval);

        dbg("%s - input_register_device", __FUNCTION__);
        input_register_device(&mtouch->input);

        nRet = usb_control_msg(mtouch->udev,
                               usb_rcvctrlpipe(udev, 0),
                               MTOUCHUSB_ASYNC_REPORT,
                               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__, nRet);

        printk(KERN_INFO "input: %s on %s\n", mtouch->name, path);
        usb_set_intfdata(intf, mtouch);

        return 0;
}

static void mtouchusb_disconnect(struct usb_interface *intf)
{
        struct mtouch_usb *mtouch = usb_get_intfdata (intf);

        dbg("%s - called", __FUNCTION__);
        usb_set_intfdata(intf, NULL);
        if (mtouch) {
                dbg("%s - mtouch is initialized, cleaning up", __FUNCTION__);
                usb_kill_urb(mtouch->irq);
                input_unregister_device(&mtouch->input);
                usb_free_urb(mtouch->irq);
                mtouchusb_free_buffers(interface_to_usbdev(intf), mtouch);
                kfree(mtouch);
        }
}

MODULE_DEVICE_TABLE (usb, mtouchusb_devices);

static struct usb_driver mtouchusb_driver = {
        .owner =      THIS_MODULE,
        .name =       "mtouchusb",
        .probe =      mtouchusb_probe,
        .disconnect = mtouchusb_disconnect,
        .id_table =   mtouchusb_devices,
};

static int __init mtouchusb_init(void) {
        dbg("%s - called", __FUNCTION__);
        return usb_register(&mtouchusb_driver);
}

static void __exit mtouchusb_cleanup(void) {
        dbg("%s - called", __FUNCTION__);
        usb_deregister(&mtouchusb_driver);
}

module_init(mtouchusb_init);
module_exit(mtouchusb_cleanup);

MODULE_AUTHOR( DRIVER_AUTHOR );
MODULE_DESCRIPTION( DRIVER_DESC );
MODULE_LICENSE("GPL");
