omap3530上移植AMT 6000 系列USB型触摸屏+tslib(11)

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

usbtouch->type->process_pkt(usbtouch, usbtouch->data, urb->actual_length);

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

static int usbtouch_open(struct input_dev *input)
{
    struct usbtouch_usb *usbtouch = input_get_drvdata(input);

usbtouch->irq->dev = usbtouch->udev;

if (!usbtouch->type->irq_always) {
        if (usb_submit_urb(usbtouch->irq, GFP_KERNEL))
          return -EIO;
    }

return 0;
}

static void usbtouch_close(struct input_dev *input)
{
    struct usbtouch_usb *usbtouch = input_get_drvdata(input);

if (!usbtouch->type->irq_always)
        usb_kill_urb(usbtouch->irq);
}


static void usbtouch_free_buffers(struct usb_device *udev,
                  struct usbtouch_usb *usbtouch)
{
    usb_buffer_free(udev, usbtouch->type->rept_size,
                    usbtouch->data, usbtouch->data_dma);
    kfree(usbtouch->buffer);
}


static int usbtouch_probe(struct usb_interface *intf,
              const struct usb_device_id *id)
{
    struct usbtouch_usb *usbtouch;
    struct input_dev *input_dev;
    struct usb_host_interface *interface;
    struct usb_endpoint_descriptor *endpoint;
    struct usb_device *udev = interface_to_usbdev(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;

usbtouch = kzalloc(sizeof(struct usbtouch_usb), GFP_KERNEL);
    input_dev = input_allocate_device();
    if (!usbtouch || !input_dev)
        goto out_free;

type = &usbtouch_dev_info[id->driver_info];
    usbtouch->type = type;
    if (!type->process_pkt)
        type->process_pkt = usbtouch_process_pkt;

usbtouch->data = usb_buffer_alloc(udev, type->rept_size,
                                      GFP_KERNEL, &usbtouch->data_dma);
    if (!usbtouch->data)
        goto out_free;

if (type->get_pkt_len) {
        usbtouch->buffer = kmalloc(type->rept_size, GFP_KERNEL);
        if (!usbtouch->buffer)
            goto out_free_buffers;
    }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwxzdz.html