[PATCH] drivers/usb/input: convert to dynamic input_dev allocation
authorDmitry Torokhov <dtor_core@ameritech.net>
Thu, 15 Sep 2005 07:01:47 +0000 (02:01 -0500)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 28 Oct 2005 16:52:52 +0000 (09:52 -0700)
Input: convert drivers/iusb/input to dynamic input_dev allocation

This is required for input_dev sysfs integration

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
21 files changed:
drivers/usb/input/acecad.c
drivers/usb/input/aiptek.c
drivers/usb/input/appletouch.c
drivers/usb/input/ati_remote.c
drivers/usb/input/hid-core.c
drivers/usb/input/hid-input.c
drivers/usb/input/hid-lgff.c
drivers/usb/input/hid-tmff.c
drivers/usb/input/hid.h
drivers/usb/input/itmtouch.c
drivers/usb/input/kbtab.c
drivers/usb/input/keyspan_remote.c
drivers/usb/input/mtouchusb.c
drivers/usb/input/pid.c
drivers/usb/input/powermate.c
drivers/usb/input/touchkitusb.c
drivers/usb/input/usbkbd.c
drivers/usb/input/usbmouse.c
drivers/usb/input/wacom.c
drivers/usb/input/xpad.c
drivers/usb/input/yealink.c

index 74f8760..a32558b 100644 (file)
@@ -53,7 +53,7 @@ struct usb_acecad {
        char name[128];
        char phys[64];
        struct usb_device *usbdev;
-       struct input_dev dev;
+       struct input_dev *input;
        struct urb *irq;
 
        signed char *data;
@@ -64,7 +64,7 @@ static void usb_acecad_irq(struct urb *urb, struct pt_regs *regs)
 {
        struct usb_acecad *acecad = urb->context;
        unsigned char *data = acecad->data;
-       struct input_dev *dev = &acecad->dev;
+       struct input_dev *dev = acecad->input;
        int prox, status;
 
        switch (urb->status) {
@@ -135,8 +135,8 @@ static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_
        struct usb_host_interface *interface = intf->cur_altsetting;
        struct usb_endpoint_descriptor *endpoint;
        struct usb_acecad *acecad;
+       struct input_dev *input_dev;
        int pipe, maxp;
-       char path[64];
 
        if (interface->desc.bNumEndpoints != 1)
                return -ENODEV;
@@ -153,8 +153,9 @@ static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_
        maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
 
        acecad = kzalloc(sizeof(struct usb_acecad), GFP_KERNEL);
-       if (!acecad)
-               return -ENOMEM;
+       input_dev = input_allocate_device();
+       if (!acecad || !input_dev)
+               goto fail1;
 
        acecad->data = usb_buffer_alloc(dev, 8, SLAB_KERNEL, &acecad->data_dma);
        if (!acecad->data)
@@ -164,6 +165,9 @@ static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_
        if (!acecad->irq)
                goto fail2;
 
+       acecad->usbdev = dev;
+       acecad->input = input_dev;
+
        if (dev->manufacturer)
                strlcpy(acecad->name, dev->manufacturer, sizeof(acecad->name));
 
@@ -173,48 +177,48 @@ static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_
                strlcat(acecad->name, dev->product, sizeof(acecad->name));
        }
 
-       usb_make_path(dev, path, sizeof(path));
-       snprintf(acecad->phys, sizeof(acecad->phys), "%s/input0", path);
+       usb_make_path(dev, acecad->phys, sizeof(acecad->phys));
+       strlcat(acecad->phys, "/input0", sizeof(acecad->phys));
 
-       acecad->usbdev = dev;
+       input_dev->name = acecad->name;
+       input_dev->phys = acecad->phys;
+       usb_to_input_id(dev, &input_dev->id);
+       input_dev->cdev.dev = &intf->dev;
+       input_dev->private = acecad;
 
-       acecad->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
-       acecad->dev.absbit[0] = BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE);
-       acecad->dev.keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
-       acecad->dev.keybit[LONG(BTN_DIGI)] = BIT(BTN_TOOL_PEN) |BIT(BTN_TOUCH) | BIT(BTN_STYLUS) | BIT(BTN_STYLUS2);
+       input_dev->open = usb_acecad_open;
+       input_dev->close = usb_acecad_close;
+
+       input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
+       input_dev->absbit[0] = BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE);
+       input_dev->keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
+       input_dev->keybit[LONG(BTN_DIGI)] = BIT(BTN_TOOL_PEN) |BIT(BTN_TOUCH) | BIT(BTN_STYLUS) | BIT(BTN_STYLUS2);
 
        switch (id->driver_info) {
                case 0:
-                       acecad->dev.absmax[ABS_X] = 5000;
-                       acecad->dev.absmax[ABS_Y] = 3750;
-                       acecad->dev.absmax[ABS_PRESSURE] = 512;
+                       input_dev->absmax[ABS_X] = 5000;
+                       input_dev->absmax[ABS_Y] = 3750;
+                       input_dev->absmax[ABS_PRESSURE] = 512;
                        if (!strlen(acecad->name))
                                snprintf(acecad->name, sizeof(acecad->name),
                                        "USB Acecad Flair Tablet %04x:%04x",
-                                       dev->descriptor.idVendor, dev->descriptor.idProduct);
+                                       le16_to_cpu(dev->descriptor.idVendor),
+                                       le16_to_cpu(dev->descriptor.idProduct));
                        break;
                case 1:
-                       acecad->dev.absmax[ABS_X] = 3000;
-                       acecad->dev.absmax[ABS_Y] = 2250;
-                       acecad->dev.absmax[ABS_PRESSURE] = 1024;
+                       input_dev->absmax[ABS_X] = 3000;
+                       input_dev->absmax[ABS_Y] = 2250;
+                       input_dev->absmax[ABS_PRESSURE] = 1024;
                        if (!strlen(acecad->name))
                                snprintf(acecad->name, sizeof(acecad->name),
                                        "USB Acecad 302 Tablet %04x:%04x",
-                                       dev->descriptor.idVendor, dev->descriptor.idProduct);
+                                       le16_to_cpu(dev->descriptor.idVendor),
+                                       le16_to_cpu(dev->descriptor.idProduct));
                        break;
        }
 
-       acecad->dev.absfuzz[ABS_X] = 4;
-       acecad->dev.absfuzz[ABS_Y] = 4;
-
-       acecad->dev.private = acecad;
-       acecad->dev.open = usb_acecad_open;
-       acecad->dev.close = usb_acecad_close;
-
-       acecad->dev.name = acecad->name;
-       acecad->dev.phys = acecad->phys;
-       usb_to_input_id(dev, &acecad->dev.id);
-       acecad->dev.dev = &intf->dev;
+       input_dev->absfuzz[ABS_X] = 4;
+       input_dev->absfuzz[ABS_Y] = 4;
 
        usb_fill_int_urb(acecad->irq, dev, pipe,
                        acecad->data, maxp > 8 ? 8 : maxp,
@@ -222,17 +226,15 @@ static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_
        acecad->irq->transfer_dma = acecad->data_dma;
        acecad->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 
-       input_register_device(&acecad->dev);
-
-       printk(KERN_INFO "input: %s with packet size %d on %s\n",
-               acecad->name, maxp, path);
+       input_register_device(acecad->input);
 
        usb_set_intfdata(intf, acecad);
 
        return 0;
 
  fail2:        usb_buffer_free(dev, 8, acecad->data, acecad->data_dma);
- fail1:        kfree(acecad);
+ fail1: input_free_device(input_dev);
+       kfree(acecad);
        return -ENOMEM;
 }
 
@@ -243,7 +245,7 @@ static void usb_acecad_disconnect(struct usb_interface *intf)
        usb_set_intfdata(intf, NULL);
        if (acecad) {
                usb_kill_urb(acecad->irq);
-               input_unregister_device(&acecad->dev);
+               input_unregister_device(acecad->input);
                usb_free_urb(acecad->irq);
                usb_buffer_free(interface_to_usbdev(intf), 10, acecad->data, acecad->data_dma);
                kfree(acecad);
index cd0cbfe..1c52053 100644 (file)
@@ -317,7 +317,7 @@ struct aiptek_settings {
 };
 
 struct aiptek {
-       struct input_dev inputdev;              /* input device struct           */
+       struct input_dev *inputdev;             /* input device struct           */
        struct usb_device *usbdev;              /* usb device struct             */
        struct urb *urb;                        /* urb for incoming reports      */
        dma_addr_t data_dma;                    /* our dma stuffage              */
@@ -402,7 +402,7 @@ static void aiptek_irq(struct urb *urb, struct pt_regs *regs)
 {
        struct aiptek *aiptek = urb->context;
        unsigned char *data = aiptek->data;
-       struct input_dev *inputdev = &aiptek->inputdev;
+       struct input_dev *inputdev = aiptek->inputdev;
        int jitterable = 0;
        int retval, macro, x, y, z, left, right, middle, p, dv, tip, bs, pck;
 
@@ -955,20 +955,20 @@ static int aiptek_program_tablet(struct aiptek *aiptek)
        /* Query getXextension */
        if ((ret = aiptek_query(aiptek, 0x01, 0x00)) < 0)
                return ret;
-       aiptek->inputdev.absmin[ABS_X] = 0;
-       aiptek->inputdev.absmax[ABS_X] = ret - 1;
+       aiptek->inputdev->absmin[ABS_X] = 0;
+       aiptek->inputdev->absmax[ABS_X] = ret - 1;
 
        /* Query getYextension */
        if ((ret = aiptek_query(aiptek, 0x01, 0x01)) < 0)
                return ret;
-       aiptek->inputdev.absmin[ABS_Y] = 0;
-       aiptek->inputdev.absmax[ABS_Y] = ret - 1;
+       aiptek->inputdev->absmin[ABS_Y] = 0;
+       aiptek->inputdev->absmax[ABS_Y] = ret - 1;
 
        /* Query getPressureLevels */
        if ((ret = aiptek_query(aiptek, 0x08, 0x00)) < 0)
                return ret;
-       aiptek->inputdev.absmin[ABS_PRESSURE] = 0;
-       aiptek->inputdev.absmax[ABS_PRESSURE] = ret - 1;
+       aiptek->inputdev->absmin[ABS_PRESSURE] = 0;
+       aiptek->inputdev->absmax[ABS_PRESSURE] = ret - 1;
 
        /* Depending on whether we are in absolute or relative mode, we will
         * do a switchToTablet(absolute) or switchToMouse(relative) command.
@@ -1025,8 +1025,8 @@ static ssize_t show_tabletSize(struct device *dev, struct device_attribute *attr
                return 0;
 
        return snprintf(buf, PAGE_SIZE, "%dx%d\n",
-                       aiptek->inputdev.absmax[ABS_X] + 1,
-                       aiptek->inputdev.absmax[ABS_Y] + 1);
+                       aiptek->inputdev->absmax[ABS_X] + 1,
+                       aiptek->inputdev->absmax[ABS_Y] + 1);
 }
 
 /* These structs define the sysfs files, param #1 is the name of the
@@ -1048,7 +1048,7 @@ static ssize_t show_tabletProductId(struct device *dev, struct device_attribute
                return 0;
 
        return snprintf(buf, PAGE_SIZE, "0x%04x\n",
-                       aiptek->inputdev.id.product);
+                       aiptek->inputdev->id.product);
 }
 
 static DEVICE_ATTR(product_id, S_IRUGO, show_tabletProductId, NULL);
@@ -1063,7 +1063,7 @@ static ssize_t show_tabletVendorId(struct device *dev, struct device_attribute *
        if (aiptek == NULL)
                return 0;
 
-       return snprintf(buf, PAGE_SIZE, "0x%04x\n", aiptek->inputdev.id.vendor);
+       return snprintf(buf, PAGE_SIZE, "0x%04x\n", aiptek->inputdev->id.vendor);
 }
 
 static DEVICE_ATTR(vendor_id, S_IRUGO, show_tabletVendorId, NULL);
@@ -1977,7 +1977,6 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
        struct input_dev *inputdev;
        struct input_handle *inputhandle;
        struct list_head *node, *next;
-       char path[64 + 1];
        int i;
        int speeds[] = { 0,
                AIPTEK_PROGRAMMABLE_DELAY_50,
@@ -1996,24 +1995,26 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
         */
        speeds[0] = programmableDelay;
 
-       if ((aiptek = kmalloc(sizeof(struct aiptek), GFP_KERNEL)) == NULL)
-               return -ENOMEM;
-       memset(aiptek, 0, sizeof(struct aiptek));
+       aiptek = kzalloc(sizeof(struct aiptek), GFP_KERNEL);
+       inputdev = input_allocate_device();
+       if (!aiptek || !inputdev)
+               goto fail1;
 
        aiptek->data = usb_buffer_alloc(usbdev, AIPTEK_PACKET_LENGTH,
                                        SLAB_ATOMIC, &aiptek->data_dma);
-       if (aiptek->data == NULL) {
-               kfree(aiptek);
-               return -ENOMEM;
-       }
+       if (!aiptek->data)
+               goto fail1;
 
        aiptek->urb = usb_alloc_urb(0, GFP_KERNEL);
-       if (aiptek->urb == NULL) {
-               usb_buffer_free(usbdev, AIPTEK_PACKET_LENGTH, aiptek->data,
-                               aiptek->data_dma);
-               kfree(aiptek);
-               return -ENOMEM;
-       }
+       if (!aiptek->urb)
+               goto fail2;
+
+       aiptek->inputdev = inputdev;
+       aiptek->usbdev = usbdev;
+       aiptek->ifnum = intf->altsetting[0].desc.bInterfaceNumber;
+       aiptek->inDelay = 0;
+       aiptek->endDelay = 0;
+       aiptek->previousJitterable = 0;
 
        /* Set up the curSettings struct. Said struct contains the current
         * programmable parameters. The newSetting struct contains changes
@@ -2036,31 +2037,48 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
 
        /* Both structs should have equivalent settings
         */
-       memcpy(&aiptek->newSetting, &aiptek->curSetting,
-              sizeof(struct aiptek_settings));
+       aiptek->newSetting = aiptek->curSetting;
+
+       /* Determine the usb devices' physical path.
+        * Asketh not why we always pretend we're using "../input0",
+        * but I suspect this will have to be refactored one
+        * day if a single USB device can be a keyboard & a mouse
+        * & a tablet, and the inputX number actually will tell
+        * us something...
+        */
+       usb_make_path(usbdev, aiptek->features.usbPath,
+                       sizeof(aiptek->features.usbPath));
+       strlcat(aiptek->features.usbPath, "/input0",
+               sizeof(aiptek->features.usbPath));
+
+       /* Set up client data, pointers to open and close routines
+        * for the input device.
+        */
+       inputdev->name = "Aiptek";
+       inputdev->phys = aiptek->features.usbPath;
+       usb_to_input_id(usbdev, &inputdev->id);
+       inputdev->cdev.dev = &intf->dev;
+       inputdev->private = aiptek;
+       inputdev->open = aiptek_open;
+       inputdev->close = aiptek_close;
 
        /* Now program the capacities of the tablet, in terms of being
         * an input device.
         */
-       aiptek->inputdev.evbit[0] |= BIT(EV_KEY)
+       inputdev->evbit[0] |= BIT(EV_KEY)
            | BIT(EV_ABS)
            | BIT(EV_REL)
            | BIT(EV_MSC);
 
-       aiptek->inputdev.absbit[0] |=
-           (BIT(ABS_X) |
-            BIT(ABS_Y) |
-            BIT(ABS_PRESSURE) |
-            BIT(ABS_TILT_X) |
-            BIT(ABS_TILT_Y) | BIT(ABS_WHEEL) | BIT(ABS_MISC));
+       inputdev->absbit[0] |= BIT(ABS_MISC);
 
-       aiptek->inputdev.relbit[0] |=
+       inputdev->relbit[0] |=
            (BIT(REL_X) | BIT(REL_Y) | BIT(REL_WHEEL) | BIT(REL_MISC));
 
-       aiptek->inputdev.keybit[LONG(BTN_LEFT)] |=
+       inputdev->keybit[LONG(BTN_LEFT)] |=
            (BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE));
 
-       aiptek->inputdev.keybit[LONG(BTN_DIGI)] |=
+       inputdev->keybit[LONG(BTN_DIGI)] |=
            (BIT(BTN_TOOL_PEN) |
             BIT(BTN_TOOL_RUBBER) |
             BIT(BTN_TOOL_PENCIL) |
@@ -2070,70 +2088,26 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
             BIT(BTN_TOOL_LENS) |
             BIT(BTN_TOUCH) | BIT(BTN_STYLUS) | BIT(BTN_STYLUS2));
 
-       aiptek->inputdev.mscbit[0] = BIT(MSC_SERIAL);
+       inputdev->mscbit[0] = BIT(MSC_SERIAL);
 
        /* Programming the tablet macro keys needs to be done with a for loop
         * as the keycodes are discontiguous.
         */
        for (i = 0; i < sizeof(macroKeyEvents) / sizeof(macroKeyEvents[0]); ++i)
-               set_bit(macroKeyEvents[i], aiptek->inputdev.keybit);
-
-       /* Set up client data, pointers to open and close routines
-        * for the input device.
-        */
-       aiptek->inputdev.private = aiptek;
-       aiptek->inputdev.open = aiptek_open;
-       aiptek->inputdev.close = aiptek_close;
-
-       /* Determine the usb devices' physical path.
-        * Asketh not why we always pretend we're using "../input0",
-        * but I suspect this will have to be refactored one
-        * day if a single USB device can be a keyboard & a mouse
-        * & a tablet, and the inputX number actually will tell
-        * us something...
-        */
-       if (usb_make_path(usbdev, path, 64) > 0)
-               sprintf(aiptek->features.usbPath, "%s/input0", path);
+               set_bit(macroKeyEvents[i], inputdev->keybit);
 
-       /* Program the input device coordinate capacities. We do not yet
+       /*
+        * Program the input device coordinate capacities. We do not yet
         * know what maximum X, Y, and Z values are, so we're putting fake
         * values in. Later, we'll ask the tablet to put in the correct
         * values.
         */
-       aiptek->inputdev.absmin[ABS_X] = 0;
-       aiptek->inputdev.absmax[ABS_X] = 2999;
-       aiptek->inputdev.absmin[ABS_Y] = 0;
-       aiptek->inputdev.absmax[ABS_Y] = 2249;
-       aiptek->inputdev.absmin[ABS_PRESSURE] = 0;
-       aiptek->inputdev.absmax[ABS_PRESSURE] = 511;
-       aiptek->inputdev.absmin[ABS_TILT_X] = AIPTEK_TILT_MIN;
-       aiptek->inputdev.absmax[ABS_TILT_X] = AIPTEK_TILT_MAX;
-       aiptek->inputdev.absmin[ABS_TILT_Y] = AIPTEK_TILT_MIN;
-       aiptek->inputdev.absmax[ABS_TILT_Y] = AIPTEK_TILT_MAX;
-       aiptek->inputdev.absmin[ABS_WHEEL] = AIPTEK_WHEEL_MIN;
-       aiptek->inputdev.absmax[ABS_WHEEL] = AIPTEK_WHEEL_MAX - 1;
-       aiptek->inputdev.absfuzz[ABS_X] = 0;
-       aiptek->inputdev.absfuzz[ABS_Y] = 0;
-       aiptek->inputdev.absfuzz[ABS_PRESSURE] = 0;
-       aiptek->inputdev.absfuzz[ABS_TILT_X] = 0;
-       aiptek->inputdev.absfuzz[ABS_TILT_Y] = 0;
-       aiptek->inputdev.absfuzz[ABS_WHEEL] = 0;
-       aiptek->inputdev.absflat[ABS_X] = 0;
-       aiptek->inputdev.absflat[ABS_Y] = 0;
-       aiptek->inputdev.absflat[ABS_PRESSURE] = 0;
-       aiptek->inputdev.absflat[ABS_TILT_X] = 0;
-       aiptek->inputdev.absflat[ABS_TILT_Y] = 0;
-       aiptek->inputdev.absflat[ABS_WHEEL] = 0;
-       aiptek->inputdev.name = "Aiptek";
-       aiptek->inputdev.phys = aiptek->features.usbPath;
-       usb_to_input_id(usbdev, &aiptek->inputdev.id);
-       aiptek->inputdev.dev = &intf->dev;
-
-       aiptek->usbdev = usbdev;
-       aiptek->ifnum = intf->altsetting[0].desc.bInterfaceNumber;
-       aiptek->inDelay = 0;
-       aiptek->endDelay = 0;
-       aiptek->previousJitterable = 0;
+       input_set_abs_params(inputdev, ABS_X, 0, 2999, 0, 0);
+       input_set_abs_params(inputdev, ABS_X, 0, 2249, 0, 0);
+       input_set_abs_params(inputdev, ABS_PRESSURE, 0, 511, 0, 0);
+       input_set_abs_params(inputdev, ABS_TILT_X, AIPTEK_TILT_MIN, AIPTEK_TILT_MAX, 0, 0);
+       input_set_abs_params(inputdev, ABS_TILT_Y, AIPTEK_TILT_MIN, AIPTEK_TILT_MAX, 0, 0);
+       input_set_abs_params(inputdev, ABS_WHEEL, AIPTEK_WHEEL_MIN, AIPTEK_WHEEL_MAX - 1, 0, 0);
 
        endpoint = &intf->altsetting[0].endpoint[0].desc;
 
@@ -2150,28 +2124,6 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
        aiptek->urb->transfer_dma = aiptek->data_dma;
        aiptek->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 
-       /* Register the tablet as an Input Device
-        */
-       input_register_device(&aiptek->inputdev);
-
-       /* We now will look for the evdev device which is mapped to
-        * the tablet. The partial name is kept in the link list of
-        * input_handles associated with this input device.
-        * What identifies an evdev input_handler is that it begins
-        * with 'event', continues with a digit, and that in turn
-        * is mapped to /{devfs}/input/eventN.
-        */
-       inputdev = &aiptek->inputdev;
-       list_for_each_safe(node, next, &inputdev->h_list) {
-               inputhandle = to_handle(node);
-               if (strncmp(inputhandle->name, "event", 5) == 0) {
-                       strcpy(aiptek->features.inputPath, inputhandle->name);
-                       break;
-               }
-       }
-
-       info("input: Aiptek on %s (%s)\n", path, aiptek->features.inputPath);
-
        /* Program the tablet. This sets the tablet up in the mode
         * specified in newSetting, and also queries the tablet's
         * physical capacities.
@@ -2186,13 +2138,32 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
        for (i = 0; i < sizeof(speeds) / sizeof(speeds[0]); ++i) {
                aiptek->curSetting.programmableDelay = speeds[i];
                (void)aiptek_program_tablet(aiptek);
-               if (aiptek->inputdev.absmax[ABS_X] > 0) {
+               if (aiptek->inputdev->absmax[ABS_X] > 0) {
                        info("input: Aiptek using %d ms programming speed\n",
                             aiptek->curSetting.programmableDelay);
                        break;
                }
        }
 
+       /* Register the tablet as an Input Device
+        */
+       input_register_device(aiptek->inputdev);
+
+       /* We now will look for the evdev device which is mapped to
+        * the tablet. The partial name is kept in the link list of
+        * input_handles associated with this input device.
+        * What identifies an evdev input_handler is that it begins
+        * with 'event', continues with a digit, and that in turn
+        * is mapped to /{devfs}/input/eventN.
+        */
+       list_for_each_safe(node, next, &inputdev->h_list) {
+               inputhandle = to_handle(node);
+               if (strncmp(inputhandle->name, "event", 5) == 0) {
+                       strcpy(aiptek->features.inputPath, inputhandle->name);
+                       break;
+               }
+       }
+
        /* Associate this driver's struct with the usb interface.
         */
        usb_set_intfdata(intf, aiptek);
@@ -2207,6 +2178,12 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
                info("aiptek: error loading 'evdev' module");
 
        return 0;
+
+fail2: usb_buffer_free(usbdev, AIPTEK_PACKET_LENGTH, aiptek->data,
+                       aiptek->data_dma);
+fail1: input_free_device(inputdev);
+       kfree(aiptek);
+       return -ENOMEM;
 }
 
 /* Forward declaration */
@@ -2234,7 +2211,7 @@ static void aiptek_disconnect(struct usb_interface *intf)
                /* Free & unhook everything from the system.
                 */
                usb_kill_urb(aiptek->urb);
-               input_unregister_device(&aiptek->inputdev);
+               input_unregister_device(aiptek->inputdev);
                aiptek_delete_files(&intf->dev);
                usb_free_urb(aiptek->urb);
                usb_buffer_free(interface_to_usbdev(intf),
index e03c1c5..15840db 100644 (file)
@@ -39,7 +39,7 @@
 #define APPLE_VENDOR_ID                0x05AC
 
 #define ATP_DEVICE(prod)                                       \
-       .match_flags = USB_DEVICE_ID_MATCH_DEVICE |             \
+       .match_flags = USB_DEVICE_ID_MATCH_DEVICE |             \
                       USB_DEVICE_ID_MATCH_INT_CLASS |          \
                       USB_DEVICE_ID_MATCH_INT_PROTOCOL,        \
        .idVendor = APPLE_VENDOR_ID,                            \
@@ -78,9 +78,9 @@ MODULE_DEVICE_TABLE (usb, atp_table);
  * We try to keep the touchpad aspect ratio while still doing only simple
  * arithmetics.
  * The factors below give coordinates like:
- *     0 <= x <  960 on 12" and 15" Powerbooks
- *     0 <= x < 1600 on 17" Powerbooks
- *     0 <= y <  646
+ *     0 <= x <  960 on 12" and 15" Powerbooks
+ *     0 <= x < 1600 on 17" Powerbooks
+ *     0 <= y <  646
  */
 #define ATP_XFACT      64
 #define ATP_YFACT      43
@@ -93,11 +93,12 @@ MODULE_DEVICE_TABLE (usb, atp_table);
 
 /* Structure to hold all of our device specific stuff */
 struct atp {
+       char                    phys[64];
        struct usb_device *     udev;           /* usb device */
        struct urb *            urb;            /* usb request block */
        signed char *           data;           /* transferred data */
        int                     open;           /* non-zero if opened */
-       struct input_dev        input;          /* input dev */
+       struct input_dev        *input;         /* input dev */
        int                     valid;          /* are the sensors valid ? */
        int                     x_old;          /* last reported x/y, */
        int                     y_old;          /* used for smoothing */
@@ -114,11 +115,11 @@ struct atp {
                int i;                                                  \
                printk("appletouch: %s %lld", msg, (long long)jiffies); \
                for (i = 0; i < ATP_XSENSORS + ATP_YSENSORS; i++)       \
-                       printk(" %02x", tab[i]);                        \
-               printk("\n");                                           \
+                       printk(" %02x", tab[i]);                        \
+               printk("\n");                                           \
        }
 
-#define dprintk(format, a...)                                          \
+#define dprintk(format, a...)                                          \
        do {                                                            \
                if (debug) printk(format, ##a);                         \
        } while (0)
@@ -219,8 +220,8 @@ static void atp_complete(struct urb* urb, struct pt_regs* regs)
                for (i = 16; i < ATP_XSENSORS; i++)
                        if (dev->xy_cur[i]) {
                                printk("appletouch: 17\" model detected.\n");
-                               input_set_abs_params(&dev->input, ABS_X, 0,
-                                                    (ATP_XSENSORS - 1) *
+                               input_set_abs_params(dev->input, ABS_X, 0,
+                                                    (ATP_XSENSORS - 1) *
                                                     ATP_XFACT - 1,
                                                     ATP_FUZZ, 0);
                                break;
@@ -260,12 +261,12 @@ static void atp_complete(struct urb* urb, struct pt_regs* regs)
                                       "Xz: %3d Yz: %3d\n",
                                       x, y, x_z, y_z);
 
-                       input_report_key(&dev->input, BTN_TOUCH, 1);
-                       input_report_abs(&dev->input, ABS_X, x);
-                       input_report_abs(&dev->input, ABS_Y, y);
-                       input_report_abs(&dev->input, ABS_PRESSURE,
+                       input_report_key(dev->input, BTN_TOUCH, 1);
+                       input_report_abs(dev->input, ABS_X, x);
+                       input_report_abs(dev->input, ABS_Y, y);
+                       input_report_abs(dev->input, ABS_PRESSURE,
                                         min(ATP_PRESSURE, x_z + y_z));
-                       atp_report_fingers(&dev->input, max(x_f, y_f));
+                       atp_report_fingers(dev->input, max(x_f, y_f));
                }
                dev->x_old = x;
                dev->y_old = y;
@@ -273,17 +274,17 @@ static void atp_complete(struct urb* urb, struct pt_regs* regs)
        else if (!x && !y) {
 
                dev->x_old = dev->y_old = -1;
-               input_report_key(&dev->input, BTN_TOUCH, 0);
-               input_report_abs(&dev->input, ABS_PRESSURE, 0);
-               atp_report_fingers(&dev->input, 0);
+               input_report_key(dev->input, BTN_TOUCH, 0);
+               input_report_abs(dev->input, ABS_PRESSURE, 0);
+               atp_report_fingers(dev->input, 0);
 
                /* reset the accumulator on release */
                memset(dev->xy_acc, 0, sizeof(dev->xy_acc));
        }
 
-       input_report_key(&dev->input, BTN_LEFT, !!dev->data[80]);
+       input_report_key(dev->input, BTN_LEFT, !!dev->data[80]);
 
-       input_sync(&dev->input);
+       input_sync(dev->input);
 
 exit:
        retval = usb_submit_urb(dev->urb, GFP_ATOMIC);
@@ -314,21 +315,14 @@ static void atp_close(struct input_dev *input)
 
 static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id)
 {
-       struct atp *dev = NULL;
+       struct atp *dev;
+       struct input_dev *input_dev;
+       struct usb_device *udev = interface_to_usbdev(iface);
        struct usb_host_interface *iface_desc;
        struct usb_endpoint_descriptor *endpoint;
        int int_in_endpointAddr = 0;
        int i, retval = -ENOMEM;
 
-       /* allocate memory for our device state and initialize it */
-       dev = kmalloc(sizeof(struct atp), GFP_KERNEL);
-       if (dev == NULL) {
-               err("Out of memory");
-               goto err_kmalloc;
-       }
-       memset(dev, 0, sizeof(struct atp));
-
-       dev->udev = interface_to_usbdev(iface);
 
        /* set up the endpoint information */
        /* use only the first interrupt-in endpoint */
@@ -345,70 +339,82 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id
                }
        }
        if (!int_in_endpointAddr) {
-               retval = -EIO;
                err("Could not find int-in endpoint");
-               goto err_endpoint;
+               return -EIO;
        }
 
-       /* save our data pointer in this interface device */
-       usb_set_intfdata(iface, dev);
+       /* allocate memory for our device state and initialize it */
+       dev = kzalloc(sizeof(struct atp), GFP_KERNEL);
+       input_dev = input_allocate_device();
+       if (!dev || !input_dev) {
+               err("Out of memory");
+               goto err_free_devs;
+       }
+
+       dev->udev = udev;
+       dev->input = input_dev;
 
        dev->urb = usb_alloc_urb(0, GFP_KERNEL);
        if (!dev->urb) {
                retval = -ENOMEM;
-               goto err_usballoc;
+               goto err_free_devs;
        }
+
        dev->data = usb_buffer_alloc(dev->udev, ATP_DATASIZE, GFP_KERNEL,
                                     &dev->urb->transfer_dma);
        if (!dev->data) {
                retval = -ENOMEM;
-               goto err_usbbufalloc;
+               goto err_free_urb;
        }
-       usb_fill_int_urb(dev->urb, dev->udev,
-                        usb_rcvintpipe(dev->udev, int_in_endpointAddr),
+
+       usb_fill_int_urb(dev->urb, udev,
+                        usb_rcvintpipe(udev, int_in_endpointAddr),
                         dev->data, ATP_DATASIZE, atp_complete, dev, 1);
 
-       init_input_dev(&dev->input);
-       dev->input.name = "appletouch";
-       dev->input.dev = &iface->dev;
-       dev->input.private = dev;
-       dev->input.open = atp_open;
-       dev->input.close = atp_close;
+       usb_make_path(udev, dev->phys, sizeof(dev->phys));
+       strlcat(dev->phys, "/input0", sizeof(dev->phys));
+
+       input_dev->name = "appletouch";
+       input_dev->phys = dev->phys;
+       usb_to_input_id(dev->udev, &input_dev->id);
+       input_dev->cdev.dev = &iface->dev;
 
-       usb_to_input_id(dev->udev, &dev->input.id);
+       input_dev->private = dev;
+       input_dev->open = atp_open;
+       input_dev->close = atp_close;
 
-       set_bit(EV_ABS, dev->input.evbit);
+       set_bit(EV_ABS, input_dev->evbit);
 
        /*
         * 12" and 15" Powerbooks only have 16 x sensors,
         * 17" models are detected later.
         */
-       input_set_abs_params(&dev->input, ABS_X, 0,
+       input_set_abs_params(input_dev, ABS_X, 0,
                             (16 - 1) * ATP_XFACT - 1, ATP_FUZZ, 0);
-       input_set_abs_params(&dev->input, ABS_Y, 0,
+       input_set_abs_params(input_dev, ABS_Y, 0,
                             (ATP_YSENSORS - 1) * ATP_YFACT - 1, ATP_FUZZ, 0);
-       input_set_abs_params(&dev->input, ABS_PRESSURE, 0, ATP_PRESSURE, 0, 0);
+       input_set_abs_params(input_dev, ABS_PRESSURE, 0, ATP_PRESSURE, 0, 0);
 
-       set_bit(EV_KEY, dev->input.evbit);
-       set_bit(BTN_TOUCH, dev->input.keybit);
-       set_bit(BTN_TOOL_FINGER, dev->input.keybit);
-       set_bit(BTN_TOOL_DOUBLETAP, dev->input.keybit);
-       set_bit(BTN_TOOL_TRIPLETAP, dev->input.keybit);
-       set_bit(BTN_LEFT, dev->input.keybit);
+       set_bit(EV_KEY, input_dev->evbit);
+       set_bit(BTN_TOUCH, input_dev->keybit);
+       set_bit(BTN_TOOL_FINGER, input_dev->keybit);
+       set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
+       set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit);
+       set_bit(BTN_LEFT, input_dev->keybit);
 
-       input_register_device(&dev->input);
+       input_register_device(dev->input);
 
-       printk(KERN_INFO "input: appletouch connected\n");
+       /* save our data pointer in this interface device */
+       usb_set_intfdata(iface, dev);
 
        return 0;
 
-err_usbbufalloc:
+ err_free_urb:
        usb_free_urb(dev->urb);
-err_usballoc:
+ err_free_devs:
        usb_set_intfdata(iface, NULL);
-err_endpoint:
        kfree(dev);
-err_kmalloc:
+       input_free_device(input_dev);
        return retval;
 }
 
@@ -419,7 +425,7 @@ static void atp_disconnect(struct usb_interface *iface)
        usb_set_intfdata(iface, NULL);
        if (dev) {
                usb_kill_urb(dev->urb);
-               input_unregister_device(&dev->input);
+               input_unregister_device(dev->input);
                usb_free_urb(dev->urb);
                usb_buffer_free(dev->udev, ATP_DATASIZE,
                                dev->data, dev->urb->transfer_dma);
index fd99681..9a2a47d 100644 (file)
 
 #define NAME_BUFSIZE      80    /* size of product name, path buffers */
 #define DATA_BUFSIZE      63    /* size of URB data buffers */
-#define ATI_INPUTNUM      1     /* Which input device to register as */
 
 static unsigned long channel_mask;
 module_param(channel_mask, ulong, 0444);
@@ -162,7 +161,7 @@ static char accel[] = { 1, 2, 4, 6, 9, 13, 20 };
 static DECLARE_MUTEX(disconnect_sem);
 
 struct ati_remote {
-       struct input_dev idev;
+       struct input_dev *idev;
        struct usb_device *udev;
        struct usb_interface *interface;
 
@@ -198,15 +197,13 @@ struct ati_remote {
 #define KIND_ACCEL      7   /* Directional keypad - left, right, up, down.*/
 
 /* Translation table from hardware messages to input events. */
-static struct
-{
+static struct {
        short kind;
        unsigned char data1, data2;
        int type;
        unsigned int code;
        int value;
-}  ati_remote_tbl[] =
-{
+}  ati_remote_tbl[] = {
        /* Directional control pad axes */
        {KIND_ACCEL,   0x35, 0x70, EV_REL, REL_X, -1},   /* left */
        {KIND_ACCEL,   0x36, 0x71, EV_REL, REL_X, 1},    /* right */
@@ -286,7 +283,6 @@ static struct
 
 /* Local function prototypes */
 static void ati_remote_dump            (unsigned char *data, unsigned int actual_length);
-static void ati_remote_delete          (struct ati_remote *dev);
 static int ati_remote_open             (struct input_dev *inputdev);
 static void ati_remote_close           (struct input_dev *inputdev);
 static int ati_remote_sendpacket       (struct ati_remote *ati_remote, u16 cmd, unsigned char *data);
@@ -428,7 +424,7 @@ static void ati_remote_input_report(struct urb *urb, struct pt_regs *regs)
 {
        struct ati_remote *ati_remote = urb->context;
        unsigned char *data= ati_remote->inbuf;
-       struct input_dev *dev = &ati_remote->idev;
+       struct input_dev *dev = ati_remote->idev;
        int index, acc;
        int remote_num;
 
@@ -587,38 +583,55 @@ static void ati_remote_irq_in(struct urb *urb, struct pt_regs *regs)
 }
 
 /*
- *     ati_remote_delete
+ *     ati_remote_alloc_buffers
  */
-static void ati_remote_delete(struct ati_remote *ati_remote)
+static int ati_remote_alloc_buffers(struct usb_device *udev,
+                                   struct ati_remote *ati_remote)
 {
-       if (ati_remote->irq_urb)
-               usb_kill_urb(ati_remote->irq_urb);
+       ati_remote->inbuf = usb_buffer_alloc(udev, DATA_BUFSIZE, SLAB_ATOMIC,
+                                            &ati_remote->inbuf_dma);
+       if (!ati_remote->inbuf)
+               return -1;
 
-       if (ati_remote->out_urb)
-               usb_kill_urb(ati_remote->out_urb);
+       ati_remote->outbuf = usb_buffer_alloc(udev, DATA_BUFSIZE, SLAB_ATOMIC,
+                                             &ati_remote->outbuf_dma);
+       if (!ati_remote->outbuf)
+               return -1;
 
-       input_unregister_device(&ati_remote->idev);
+       ati_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
+       if (!ati_remote->irq_urb)
+               return -1;
 
-       if (ati_remote->inbuf)
-               usb_buffer_free(ati_remote->udev, DATA_BUFSIZE,
-                               ati_remote->inbuf, ati_remote->inbuf_dma);
+       ati_remote->out_urb = usb_alloc_urb(0, GFP_KERNEL);
+       if (!ati_remote->out_urb)
+               return -1;
 
-       if (ati_remote->outbuf)
-               usb_buffer_free(ati_remote->udev, DATA_BUFSIZE,
-                               ati_remote->outbuf, ati_remote->outbuf_dma);
+       return 0;
+}
 
+/*
+ *     ati_remote_free_buffers
+ */
+static void ati_remote_free_buffers(struct ati_remote *ati_remote)
+{
        if (ati_remote->irq_urb)
                usb_free_urb(ati_remote->irq_urb);
 
        if (ati_remote->out_urb)
                usb_free_urb(ati_remote->out_urb);
 
-       kfree(ati_remote);
+       if (ati_remote->inbuf)
+               usb_buffer_free(ati_remote->udev, DATA_BUFSIZE,
+                               ati_remote->inbuf, ati_remote->inbuf_dma);
+
+       if (ati_remote->outbuf)
+               usb_buffer_free(ati_remote->udev, DATA_BUFSIZE,
+                               ati_remote->inbuf, ati_remote->outbuf_dma);
 }
 
 static void ati_remote_input_init(struct ati_remote *ati_remote)
 {
-       struct input_dev *idev = &(ati_remote->idev);
+       struct input_dev *idev = ati_remote->idev;
        int i;
 
        idev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
@@ -637,7 +650,7 @@ static void ati_remote_input_init(struct ati_remote *ati_remote)
        idev->phys = ati_remote->phys;
 
        usb_to_input_id(ati_remote->udev, &idev->id);
-       idev->dev = &ati_remote->udev->dev;
+       idev->cdev.dev = &ati_remote->udev->dev;
 }
 
 static int ati_remote_initialize(struct ati_remote *ati_remote)
@@ -674,7 +687,7 @@ static int ati_remote_initialize(struct ati_remote *ati_remote)
            (ati_remote_sendpacket(ati_remote, 0x8007, init2))) {
                dev_err(&ati_remote->interface->dev,
                         "Initializing ati_remote hardware failed.\n");
-               return 1;
+               return -EIO;
        }
 
        return 0;
@@ -686,95 +699,83 @@ static int ati_remote_initialize(struct ati_remote *ati_remote)
 static int ati_remote_probe(struct usb_interface *interface, const struct usb_device_id *id)
 {
        struct usb_device *udev = interface_to_usbdev(interface);
-       struct ati_remote *ati_remote = NULL;
-       struct usb_host_interface *iface_host;
-       int retval = -ENOMEM;
-       char path[64];
-
-       /* Allocate and clear an ati_remote struct */
-       if (!(ati_remote = kmalloc(sizeof (struct ati_remote), GFP_KERNEL)))
-               return -ENOMEM;
-       memset(ati_remote, 0x00, sizeof (struct ati_remote));
+       struct usb_host_interface *iface_host = interface->cur_altsetting;
+       struct usb_endpoint_descriptor *endpoint_in, *endpoint_out;
+       struct ati_remote *ati_remote;
+       struct input_dev *input_dev;
+       int err = -ENOMEM;
 
-       iface_host = interface->cur_altsetting;
        if (iface_host->desc.bNumEndpoints != 2) {
                err("%s: Unexpected desc.bNumEndpoints\n", __FUNCTION__);
-               retval = -ENODEV;
-               goto error;
+               return -ENODEV;
        }
 
-       ati_remote->endpoint_in = &(iface_host->endpoint[0].desc);
-       ati_remote->endpoint_out = &(iface_host->endpoint[1].desc);
-       ati_remote->udev = udev;
-       ati_remote->interface = interface;
+       endpoint_in = &iface_host->endpoint[0].desc;
+       endpoint_out = &iface_host->endpoint[1].desc;
 
-       if (!(ati_remote->endpoint_in->bEndpointAddress & 0x80)) {
+       if (!(endpoint_in->bEndpointAddress & USB_DIR_IN)) {
                err("%s: Unexpected endpoint_in->bEndpointAddress\n", __FUNCTION__);
-               retval = -ENODEV;
-               goto error;
+               return -ENODEV;
        }
-       if ((ati_remote->endpoint_in->bmAttributes & 3) != 3) {
+       if ((endpoint_in->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT) {
                err("%s: Unexpected endpoint_in->bmAttributes\n", __FUNCTION__);
-               retval = -ENODEV;
-               goto error;
+               return -ENODEV;
        }
-       if (le16_to_cpu(ati_remote->endpoint_in->wMaxPacketSize) == 0) {
+       if (le16_to_cpu(endpoint_in->wMaxPacketSize) == 0) {
                err("%s: endpoint_in message size==0? \n", __FUNCTION__);
-               retval = -ENODEV;
-               goto error;
+               return -ENODEV;
        }
 
-       /* Allocate URB buffers, URBs */
-       ati_remote->inbuf = usb_buffer_alloc(udev, DATA_BUFSIZE, SLAB_ATOMIC,
-                                            &ati_remote->inbuf_dma);
-       if (!ati_remote->inbuf)
-               goto error;
+       ati_remote = kzalloc(sizeof (struct ati_remote), GFP_KERNEL);
+       input_dev = input_allocate_device();
+       if (!ati_remote || !input_dev)
+               goto fail1;
 
-       ati_remote->outbuf = usb_buffer_alloc(udev, DATA_BUFSIZE, SLAB_ATOMIC,
-                                             &ati_remote->outbuf_dma);
-       if (!ati_remote->outbuf)
-               goto error;
+       /* Allocate URB buffers, URBs */
+       if (ati_remote_alloc_buffers(udev, ati_remote))
+               goto fail2;
 
-       ati_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
-       if (!ati_remote->irq_urb)
-               goto error;
+       ati_remote->endpoint_in = endpoint_in;
+       ati_remote->endpoint_out = endpoint_out;
+       ati_remote->udev = udev;
+       ati_remote->idev = input_dev;
+       ati_remote->interface = interface;
 
-       ati_remote->out_urb = usb_alloc_urb(0, GFP_KERNEL);
-       if (!ati_remote->out_urb)
-               goto error;
+       usb_make_path(udev, ati_remote->phys, sizeof(ati_remote->phys));
+       strlcpy(ati_remote->phys, "/input0", sizeof(ati_remote->phys));
 
-       usb_make_path(udev, path, NAME_BUFSIZE);
-       sprintf(ati_remote->phys, "%s/input%d", path, ATI_INPUTNUM);
        if (udev->manufacturer)
-               strcat(ati_remote->name, udev->manufacturer);
+               strlcpy(ati_remote->name, udev->manufacturer, sizeof(ati_remote->name));
 
        if (udev->product)
-               sprintf(ati_remote->name, "%s %s", ati_remote->name, udev->product);
+               snprintf(ati_remote->name, sizeof(ati_remote->name),
+                        "%s %s", ati_remote->name, udev->product);
 
        if (!strlen(ati_remote->name))
-               sprintf(ati_remote->name, DRIVER_DESC "(%04x,%04x)",
+               snprintf(ati_remote->name, sizeof(ati_remote->name),
+                       DRIVER_DESC "(%04x,%04x)",
                        le16_to_cpu(ati_remote->udev->descriptor.idVendor),
                        le16_to_cpu(ati_remote->udev->descriptor.idProduct));
 
+       ati_remote_input_init(ati_remote);
+
        /* Device Hardware Initialization - fills in ati_remote->idev from udev. */
-       retval = ati_remote_initialize(ati_remote);
-       if (retval)
-               goto error;
+       err = ati_remote_initialize(ati_remote);
+       if (err)
+               goto fail3;
 
        /* Set up and register input device */
-       ati_remote_input_init(ati_remote);
-       input_register_device(&ati_remote->idev);
-
-       dev_info(&ati_remote->interface->dev, "Input registered: %s on %s\n",
-                ati_remote->name, path);
+       input_register_device(ati_remote->idev);
 
        usb_set_intfdata(interface, ati_remote);
+       return 0;
 
-error:
-       if (retval)
-               ati_remote_delete(ati_remote);
-
-       return retval;
+fail3: usb_kill_urb(ati_remote->irq_urb);
+       usb_kill_urb(ati_remote->out_urb);
+fail2: ati_remote_free_buffers(ati_remote);
+fail1: input_free_device(input_dev);
+       kfree(ati_remote);
+       return err;
 }
 
 /*
@@ -791,7 +792,11 @@ static void ati_remote_disconnect(struct usb_interface *interface)
                return;
        }
 
-       ati_remote_delete(ati_remote);
+       usb_kill_urb(ati_remote->irq_urb);
+       usb_kill_urb(ati_remote->out_urb);
+       input_unregister_device(ati_remote->idev);
+       ati_remote_free_buffers(ati_remote);
+       kfree(ati_remote);
 }
 
 /*
index 41f92b9..411a064 100644 (file)
@@ -1619,8 +1619,8 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
        struct hid_descriptor *hdesc;
        struct hid_device *hid;
        unsigned quirks = 0, rsize = 0;
-       char *buf, *rdesc;
-       int n, insize = 0;
+       char *rdesc;
+       int n, len, insize = 0;
 
        for (n = 0; hid_blacklist[n].idVendor; n++)
                if ((hid_blacklist[n].idVendor == le16_to_cpu(dev->descriptor.idVendor)) &&
@@ -1630,10 +1630,11 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
        if (quirks & HID_QUIRK_IGNORE)
                return NULL;
 
-       if (usb_get_extra_descriptor(interface, HID_DT_HID, &hdesc) && ((!interface->desc.bNumEndpoints) ||
-               usb_get_extra_descriptor(&interface->endpoint[0], HID_DT_HID, &hdesc))) {
-                       dbg("class descriptor not present\n");
-                       return NULL;
+       if (usb_get_extra_descriptor(interface, HID_DT_HID, &hdesc) &&
+           (!interface->desc.bNumEndpoints ||
+            usb_get_extra_descriptor(&interface->endpoint[0], HID_DT_HID, &hdesc))) {
+               dbg("class descriptor not present\n");
+               return NULL;
        }
 
        for (n = 0; n < hdesc->bNumDescriptors; n++)
@@ -1749,32 +1750,34 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
 
        hid->name[0] = 0;
 
-       if (!(buf = kmalloc(64, GFP_KERNEL)))
-               goto fail;
+       if (dev->manufacturer)
+               strlcpy(hid->name, dev->manufacturer, sizeof(hid->name));
+
+       if (dev->product) {
+               if (dev->manufacturer)
+                       strlcat(hid->name, " ", sizeof(hid->name));
+               strlcat(hid->name, dev->product, sizeof(hid->name));
+       }
+
+       if (!strlen(hid->name))
+               snprintf(hid->name, sizeof(hid->name), "HID %04x:%04x",
+                        le16_to_cpu(dev->descriptor.idVendor),
+                        le16_to_cpu(dev->descriptor.idProduct));
 
-       if (dev->manufacturer) {
-               strcat(hid->name, dev->manufacturer);
-               if (dev->product)
-                       snprintf(hid->name, 64, "%s %s", hid->name, dev->product);
-       } else if (dev->product) {
-                       snprintf(hid->name, 128, "%s", dev->product);
-       } else
-               snprintf(hid->name, 128, "%04x:%04x",
-                       le16_to_cpu(dev->descriptor.idVendor),
-                       le16_to_cpu(dev->descriptor.idProduct));
-
-       usb_make_path(dev, buf, 64);
-       snprintf(hid->phys, 64, "%s/input%d", buf,
-                       intf->altsetting[0].desc.bInterfaceNumber);
+       usb_make_path(dev, hid->phys, sizeof(hid->phys));
+       strlcat(hid->phys, "/input", sizeof(hid->phys));
+       len = strlen(hid->phys);
+       if (len < sizeof(hid->phys) - 1)
+               snprintf(hid->phys + len, sizeof(hid->phys) - len,
+                        "%d", intf->altsetting[0].desc.bInterfaceNumber);
 
        if (usb_string(dev, dev->descriptor.iSerialNumber, hid->uniq, 64) <= 0)
                hid->uniq[0] = 0;
 
-       kfree(buf);
-
        hid->urbctrl = usb_alloc_urb(0, GFP_KERNEL);
        if (!hid->urbctrl)
                goto fail;
+
        usb_fill_control_urb(hid->urbctrl, dev, 0, (void *) hid->cr,
                             hid->ctrlbuf, 1, hid_ctrl, hid);
        hid->urbctrl->setup_dma = hid->cr_dma;
index 0b64522..9ff25eb 100644 (file)
@@ -76,8 +76,8 @@ static struct {
 static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_field *field,
                                     struct hid_usage *usage)
 {
-       struct input_dev *input = &hidinput->input;
-       struct hid_device *device = hidinput->input.private;
+       struct input_dev *input = hidinput->input;
+       struct hid_device *device = input->private;
        int max = 0, code;
        unsigned long *bit = NULL;
 
@@ -461,7 +461,8 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct
 
        if (!field->hidinput)
                return;
-       input = &field->hidinput->input;
+
+       input = field->hidinput->input;
 
        input_regs(input, regs);
 
@@ -533,13 +534,10 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct
 
 void hidinput_report_event(struct hid_device *hid, struct hid_report *report)
 {
-       struct list_head *lh;
        struct hid_input *hidinput;
 
-       list_for_each (lh, &hid->inputs) {
-               hidinput = list_entry(lh, struct hid_input, list);
-               input_sync(&hidinput->input);
-       }
+       list_for_each_entry(hidinput, &hid->inputs, list)
+               input_sync(hidinput->input);
 }
 
 static int hidinput_find_field(struct hid_device *hid, unsigned int type, unsigned int code, struct hid_field **field)
@@ -604,6 +602,7 @@ int hidinput_connect(struct hid_device *hid)
        struct usb_device *dev = hid->dev;
        struct hid_report *report;
        struct hid_input *hidinput = NULL;
+       struct input_dev *input_dev;
        int i, j, k;
 
        INIT_LIST_HEAD(&hid->inputs);
@@ -624,25 +623,28 @@ int hidinput_connect(struct hid_device *hid)
                                continue;
 
                        if (!hidinput) {
-                               hidinput = kmalloc(sizeof(*hidinput), GFP_KERNEL);
-                               if (!hidinput) {
+                               hidinput = kzalloc(sizeof(*hidinput), GFP_KERNEL);
+                               input_dev = input_allocate_device();
+                               if (!hidinput || !input_dev) {
+                                       kfree(hidinput);
+                                       input_free_device(input_dev);
                                        err("Out of memory during hid input probe");
                                        return -1;
                                }
-                               memset(hidinput, 0, sizeof(*hidinput));
 
-                               list_add_tail(&hidinput->list, &hid->inputs);
+                               input_dev->private = hid;
+                               input_dev->event = hidinput_input_event;
+                               input_dev->open = hidinput_open;
+                               input_dev->close = hidinput_close;
 
-                               hidinput->input.private = hid;
-                               hidinput->input.event = hidinput_input_event;
-                               hidinput->input.open = hidinput_open;
-                               hidinput->input.close = hidinput_close;
+                               input_dev->name = hid->name;
+                               input_dev->phys = hid->phys;
+                               input_dev->uniq = hid->uniq;
+                               usb_to_input_id(dev, &input_dev->id);
+                               input_dev->cdev.dev = &hid->intf->dev;
 
-                               hidinput->input.name = hid->name;
-                               hidinput->input.phys = hid->phys;
-                               hidinput->input.uniq = hid->uniq;
-                               usb_to_input_id(dev, &hidinput->input.id);
-                               hidinput->input.dev = &hid->intf->dev;
+                               hidinput->input = input_dev;
+                               list_add_tail(&hidinput->list, &hid->inputs);
                        }
 
                        for (i = 0; i < report->maxfield; i++)
@@ -657,7 +659,7 @@ int hidinput_connect(struct hid_device *hid)
                                 * UGCI) cram a lot of unrelated inputs into the
                                 * same interface. */
                                hidinput->report = report;
-                               input_register_device(&hidinput->input);
+                               input_register_device(hidinput->input);
                                hidinput = NULL;
                        }
                }
@@ -667,7 +669,7 @@ int hidinput_connect(struct hid_device *hid)
         * only useful in this case, and not for multi-input quirks. */
        if (hidinput) {
                hid_ff_init(hid);
-               input_register_device(&hidinput->input);
+               input_register_device(hidinput->input);
        }
 
        return 0;
@@ -675,13 +677,11 @@ int hidinput_connect(struct hid_device *hid)
 
 void hidinput_disconnect(struct hid_device *hid)
 {
-       struct list_head *lh, *next;
-       struct hid_input *hidinput;
+       struct hid_input *hidinput, *next;
 
-       list_for_each_safe(lh, next, &hid->inputs) {
-               hidinput = list_entry(lh, struct hid_input, list);
-               input_unregister_device(&hidinput->input);
+       list_for_each_entry_safe(hidinput, next, &hid->inputs, list) {
                list_del(&hidinput->list);
+               input_unregister_device(hidinput->input);
                kfree(hidinput);
        }
 }
index 0c4c77a..f82c9c9 100644 (file)
@@ -255,22 +255,19 @@ static void hid_lgff_input_init(struct hid_device* hid)
        u16 idVendor = le16_to_cpu(hid->dev->descriptor.idVendor);
        u16 idProduct = le16_to_cpu(hid->dev->descriptor.idProduct);
        struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list);
+       struct input_dev *input_dev = hidinput->input;
 
        while (dev->idVendor && (idVendor != dev->idVendor || idProduct != dev->idProduct))
                dev++;
 
-       ff = dev->ff;
+       for (ff = dev->ff; *ff >= 0; ff++)
+               set_bit(*ff, input_dev->ffbit);
 
-       while (*ff >= 0) {
-               set_bit(*ff, hidinput->input.ffbit);
-               ++ff;
-       }
-
-       hidinput->input.upload_effect = hid_lgff_upload_effect;
-       hidinput->input.flush = hid_lgff_flush;
+       input_dev->upload_effect = hid_lgff_upload_effect;
+       input_dev->flush = hid_lgff_flush;
 
-       set_bit(EV_FF, hidinput->input.evbit);
-       hidinput->input.ff_effects_max = LGFF_EFFECTS;
+       set_bit(EV_FF, input_dev->evbit);
+       input_dev->ff_effects_max = LGFF_EFFECTS;
 }
 
 static void hid_lgff_exit(struct hid_device* hid)
index 8f6a0a6..023fd5a 100644 (file)
@@ -111,6 +111,7 @@ int hid_tmff_init(struct hid_device *hid)
        struct tmff_device *private;
        struct list_head *pos;
        struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list);
+       struct input_dev *input_dev = hidinput->input;
 
        private = kmalloc(sizeof(struct tmff_device), GFP_KERNEL);
        if (!private)
@@ -155,7 +156,7 @@ int hid_tmff_init(struct hid_device *hid)
                                        private->report = report;
                                        private->rumble = field;
 
-                                       set_bit(FF_RUMBLE, hidinput->input.ffbit);
+                                       set_bit(FF_RUMBLE, input_dev->ffbit);
                                        break;
 
                                default:
@@ -164,11 +165,11 @@ int hid_tmff_init(struct hid_device *hid)
                        }
 
                        /* Fallthrough to here only when a valid usage is found */
-                       hidinput->input.upload_effect = hid_tmff_upload_effect;
-                       hidinput->input.flush = hid_tmff_flush;
+                       input_dev->upload_effect = hid_tmff_upload_effect;
+                       input_dev->flush = hid_tmff_flush;
 
-                       set_bit(EV_FF, hidinput->input.evbit);
-                       hidinput->input.ff_effects_max = TMFF_EFFECTS;
+                       set_bit(EV_FF, input_dev->evbit);
+                       input_dev->ff_effects_max = TMFF_EFFECTS;
                }
        }
 
index ec2412c..ee48a22 100644 (file)
@@ -371,7 +371,7 @@ struct hid_control_fifo {
 struct hid_input {
        struct list_head list;
        struct hid_report *report;
-       struct input_dev input;
+       struct input_dev *input;
 };
 
 struct hid_device {                                                    /* device report descriptor */
index becb87e..3b58185 100644 (file)
@@ -73,7 +73,7 @@ MODULE_LICENSE( DRIVER_LICENSE );
 
 struct itmtouch_dev {
        struct usb_device       *usbdev; /* usb device */
-       struct input_dev        inputdev; /* input device */
+       struct input_dev        *inputdev; /* input device */
        struct urb              *readurb; /* urb */
        char                    rbuf[ITM_BUFSIZE]; /* data */
        int                     users;
@@ -88,9 +88,9 @@ static struct usb_device_id itmtouch_ids [] = {
 
 static void itmtouch_irq(struct urb *urb, struct pt_regs *regs)
 {
-       struct itmtouch_dev * itmtouch = urb->context;
+       struct itmtouch_dev *itmtouch = urb->context;
        unsigned char *data = urb->transfer_buffer;
-       struct input_dev *dev = &itmtouch->inputdev;
+       struct input_dev *dev = itmtouch->inputdev;
        int retval;
 
        switch (urb->status) {
@@ -156,49 +156,62 @@ static void itmtouch_close(struct input_dev *input)
 static int itmtouch_probe(struct usb_interface *intf, const struct usb_device_id *id)
 {
        struct itmtouch_dev *itmtouch;
+       struct input_dev *input_dev;
        struct usb_host_interface *interface;
        struct usb_endpoint_descriptor *endpoint;
        struct usb_device *udev = interface_to_usbdev(intf);
        unsigned int pipe;
        unsigned int maxp;
-       char path[PATH_SIZE];
 
        interface = intf->cur_altsetting;
        endpoint = &interface->endpoint[0].desc;
 
-       if (!(itmtouch = kzalloc(sizeof(struct itmtouch_dev), GFP_KERNEL))) {
+       itmtouch = kzalloc(sizeof(struct itmtouch_dev), GFP_KERNEL);
+       input_dev = input_allocate_device();
+       if (!itmtouch || !input_dev) {
                err("%s - Out of memory.", __FUNCTION__);
-               return -ENOMEM;
+               goto fail;
        }
 
        itmtouch->usbdev = udev;
+       itmtouch->inputdev = input_dev;
 
-       itmtouch->inputdev.private = itmtouch;
-       itmtouch->inputdev.open = itmtouch_open;
-       itmtouch->inputdev.close = itmtouch_close;
+       if (udev->manufacturer)
+               strlcpy(itmtouch->name, udev->manufacturer, sizeof(itmtouch->name));
 
-       usb_make_path(udev, path, PATH_SIZE);
-
-       itmtouch->inputdev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
-       itmtouch->inputdev.absbit[0] = BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE);
-       itmtouch->inputdev.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);
-
-       itmtouch->inputdev.name = itmtouch->name;
-       itmtouch->inputdev.phys = itmtouch->phys;
-       usb_to_input_id(udev, &itmtouch->inputdev.id);
-       itmtouch->inputdev.dev = &intf->dev;
+       if (udev->product) {
+               if (udev->manufacturer)
+                       strlcat(itmtouch->name, " ", sizeof(itmtouch->name));
+               strlcat(itmtouch->name, udev->product, sizeof(itmtouch->name));
+       }
 
        if (!strlen(itmtouch->name))
                sprintf(itmtouch->name, "USB ITM touchscreen");
 
+       usb_make_path(udev, itmtouch->phys, sizeof(itmtouch->phys));
+       strlcpy(itmtouch->phys, "/input0", sizeof(itmtouch->phys));
+
+       input_dev->name = itmtouch->name;
+       input_dev->phys = itmtouch->phys;
+       usb_to_input_id(udev, &input_dev->id);
+       input_dev->cdev.dev = &intf->dev;
+       input_dev->private = itmtouch;
+
+       input_dev->open = itmtouch_open;
+       input_dev->close = itmtouch_close;
+
+       input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
+       input_dev->absbit[0] = BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE);
+       input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);
+
        /* device limits */
        /* as specified by the ITM datasheet, X and Y are 12bit,
         * Z (pressure) is 8 bit. However, the fields are defined up
         * to 14 bits for future possible expansion.
         */
-       input_set_abs_params(&itmtouch->inputdev, ABS_X, 0, 0x0FFF, 2, 0);
-       input_set_abs_params(&itmtouch->inputdev, ABS_Y, 0, 0x0FFF, 2, 0);
-       input_set_abs_params(&itmtouch->inputdev, ABS_PRESSURE, 0, 0xFF, 2, 0);
+       input_set_abs_params(input_dev, ABS_X, 0, 0x0FFF, 2, 0);
+       input_set_abs_params(input_dev, ABS_Y, 0, 0x0FFF, 2, 0);
+       input_set_abs_params(input_dev, ABS_PRESSURE, 0, 0xFF, 2, 0);
 
        /* initialise the URB so we can read from the transport stream */
        pipe = usb_rcvintpipe(itmtouch->usbdev, endpoint->bEndpointAddress);
@@ -208,22 +221,23 @@ static int itmtouch_probe(struct usb_interface *intf, const struct usb_device_id
                maxp = ITM_BUFSIZE;
 
        itmtouch->readurb = usb_alloc_urb(0, GFP_KERNEL);
-
        if (!itmtouch->readurb) {
                dbg("%s - usb_alloc_urb failed: itmtouch->readurb", __FUNCTION__);
-               kfree(itmtouch);
-               return -ENOMEM;
+               goto fail;
        }
 
        usb_fill_int_urb(itmtouch->readurb, itmtouch->usbdev, pipe, itmtouch->rbuf,
                         maxp, itmtouch_irq, itmtouch, endpoint->bInterval);
 
-       input_register_device(&itmtouch->inputdev);
+       input_register_device(itmtouch->inputdev);
 
-       printk(KERN_INFO "itmtouch: %s registered on %s\n", itmtouch->name, path);
        usb_set_intfdata(intf, itmtouch);
 
        return 0;
+
+ fail: input_free_device(input_dev);
+       kfree(itmtouch);
+       return -ENOMEM;
 }
 
 static void itmtouch_disconnect(struct usb_interface *intf)
@@ -233,7 +247,7 @@ static void itmtouch_disconnect(struct usb_interface *intf)
        usb_set_intfdata(intf, NULL);
 
        if (itmtouch) {
-               input_unregister_device(&itmtouch->inputdev);
+               input_unregister_device(itmtouch->inputdev);
                usb_kill_urb(itmtouch->readurb);
                usb_free_urb(itmtouch->readurb);
                kfree(itmtouch);
index b6f6ac8..a248664 100644 (file)
@@ -34,7 +34,7 @@ MODULE_PARM_DESC(kb_pressure_click, "pressure threshold for clicks");
 struct kbtab {
        signed char *data;
        dma_addr_t data_dma;
-       struct input_dev dev;
+       struct input_dev *dev;
        struct usb_device *usbdev;
        struct urb *irq;
        int x, y;
@@ -48,7 +48,7 @@ static void kbtab_irq(struct urb *urb, struct pt_regs *regs)
 {
        struct kbtab *kbtab = urb->context;
        unsigned char *data = kbtab->data;
-       struct input_dev *dev = &kbtab->dev;
+       struct input_dev *dev = kbtab->dev;
        int retval;
 
        switch (urb->status) {
@@ -124,53 +124,43 @@ static int kbtab_probe(struct usb_interface *intf, const struct usb_device_id *i
        struct usb_device *dev = interface_to_usbdev(intf);
        struct usb_endpoint_descriptor *endpoint;
        struct kbtab *kbtab;
-       char path[64];
+       struct input_dev *input_dev;
 
-       if (!(kbtab = kmalloc(sizeof(struct kbtab), GFP_KERNEL)))
-               return -ENOMEM;
-       memset(kbtab, 0, sizeof(struct kbtab));
+       kbtab = kzalloc(sizeof(struct kbtab), GFP_KERNEL);
+       input_dev = input_allocate_device();
+       if (!kbtab || !input_dev)
+               goto fail1;
 
        kbtab->data = usb_buffer_alloc(dev, 8, GFP_KERNEL, &kbtab->data_dma);
-       if (!kbtab->data) {
-               kfree(kbtab);
-               return -ENOMEM;
-       }
+       if (!kbtab->data)
+               goto fail1;
 
        kbtab->irq = usb_alloc_urb(0, GFP_KERNEL);
-       if (!kbtab->irq) {
-               usb_buffer_free(dev, 10, kbtab->data, kbtab->data_dma);
-               kfree(kbtab);
-               return -ENOMEM;
-       }
-
-       kbtab->dev.evbit[0] |= BIT(EV_KEY) | BIT(EV_ABS) | BIT(EV_MSC);
-       kbtab->dev.absbit[0] |= BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE);
-
-       kbtab->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
-
-       kbtab->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_PEN) | BIT(BTN_TOUCH);
+       if (!kbtab->irq)
+               goto fail2;
 
-       kbtab->dev.mscbit[0] |= BIT(MSC_SERIAL);
-
-       kbtab->dev.absmax[ABS_X] = 0x2000;
-       kbtab->dev.absmax[ABS_Y] = 0x1750;
-       kbtab->dev.absmax[ABS_PRESSURE] = 0xff;
+       kbtab->usbdev = dev;
+       kbtab->dev = input_dev;
 
-       kbtab->dev.absfuzz[ABS_X] = 4;
-       kbtab->dev.absfuzz[ABS_Y] = 4;
+       usb_make_path(dev, kbtab->phys, sizeof(kbtab->phys));
+       strlcat(kbtab->phys, "/input0", sizeof(kbtab->phys));
 
-       kbtab->dev.private = kbtab;
-       kbtab->dev.open = kbtab_open;
-       kbtab->dev.close = kbtab_close;
+       input_dev->name = "KB Gear Tablet";
+       input_dev->phys = kbtab->phys;
+       usb_to_input_id(dev, &input_dev->id);
+       input_dev->cdev.dev = &intf->dev;
+       input_dev->private = kbtab;
 
-       usb_make_path(dev, path, 64);
-       sprintf(kbtab->phys, "%s/input0", path);
+       input_dev->open = kbtab_open;
+       input_dev->close = kbtab_close;
 
-       kbtab->dev.name = "KB Gear Tablet";
-       kbtab->dev.phys = kbtab->phys;
-       usb_to_input_id(dev, &kbtab->dev.id);
-       kbtab->dev.dev = &intf->dev;
-       kbtab->usbdev = dev;
+       input_dev->evbit[0] |= BIT(EV_KEY) | BIT(EV_ABS) | BIT(EV_MSC);
+       input_dev->keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
+       input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_PEN) | BIT(BTN_TOUCH);
+       input_dev->mscbit[0] |= BIT(MSC_SERIAL);
+       input_set_abs_params(input_dev, ABS_X, 0, 0x2000, 4, 0);
+       input_set_abs_params(input_dev, ABS_X, 0, 0x1750, 4, 0);
+       input_set_abs_params(input_dev, ABS_PRESSURE, 0, 0xff, 0, 0);
 
        endpoint = &intf->cur_altsetting->endpoint[0].desc;
 
@@ -181,23 +171,25 @@ static int kbtab_probe(struct usb_interface *intf, const struct usb_device_id *i
        kbtab->irq->transfer_dma = kbtab->data_dma;
        kbtab->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 
-       input_register_device(&kbtab->dev);
-
-       printk(KERN_INFO "input: KB Gear Tablet on %s\n",  path);
+       input_register_device(kbtab->dev);
 
        usb_set_intfdata(intf, kbtab);
-
        return 0;
+
+fail2: usb_buffer_free(dev, 10, kbtab->data, kbtab->data_dma);
+fail1: input_free_device(input_dev);
+       kfree(kbtab);
+       return -ENOMEM;
 }
 
 static void kbtab_disconnect(struct usb_interface *intf)
 {
-       struct kbtab *kbtab = usb_get_intfdata (intf);
+       struct kbtab *kbtab = usb_get_intfdata(intf);
 
        usb_set_intfdata(intf, NULL);
        if (kbtab) {
                usb_kill_urb(kbtab->irq);
-               input_unregister_device(&kbtab->dev);
+               input_unregister_device(kbtab->dev);
                usb_free_urb(kbtab->irq);
                usb_buffer_free(interface_to_usbdev(intf), 10, kbtab->data, kbtab->data_dma);
                kfree(kbtab);
index 99de1b3..5b8d65f 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/moduleparam.h>
 #include <linux/input.h>
 #include <linux/usb.h>
+#include <linux/usb_input.h>
 
 #define DRIVER_VERSION "v0.1"
 #define DRIVER_AUTHOR  "Michael Downey <downey@zymeta.com>"
@@ -75,7 +76,7 @@ struct usb_keyspan {
        char                            name[128];
        char                            phys[64];
        struct usb_device*              udev;
-       struct input_dev                input;
+       struct input_dev                *input;
        struct usb_interface*           interface;
        struct usb_endpoint_descriptor* in_endpoint;
        struct urb*                     irq_urb;
@@ -136,12 +137,11 @@ static struct usb_driver keyspan_driver;
  */
 static void keyspan_print(struct usb_keyspan* dev) /*unsigned char* data)*/
 {
-       char codes[4*RECV_SIZE];
+       char codes[4 * RECV_SIZE];
        int i;
 
-       for (i = 0; i < RECV_SIZE; i++) {
-               snprintf(codes+i*3, 4, "%02x ", dev->in_buffer[i]);
-       }
+       for (i = 0; i < RECV_SIZE; i++)
+               snprintf(codes + i * 3, 4, "%02x ", dev->in_buffer[i]);
 
        dev_info(&dev->udev->dev, "%s\n", codes);
 }
@@ -153,7 +153,7 @@ static void keyspan_print(struct usb_keyspan* dev) /*unsigned char* data)*/
 static int keyspan_load_tester(struct usb_keyspan* dev, int bits_needed)
 {
        if (dev->data.bits_left >= bits_needed)
-               return(0);
+               return 0;
 
        /*
         * Somehow we've missed the last message. The message will be repeated
@@ -162,7 +162,7 @@ static int keyspan_load_tester(struct usb_keyspan* dev, int bits_needed)
        if (dev->data.pos >= dev->data.len) {
                dev_dbg(&dev->udev, "%s - Error ran out of data. pos: %d, len: %d\n",
                        __FUNCTION__, dev->data.pos, dev->data.len);
-               return(-1);
+               return -1;
        }
 
        /* Load as much as we can into the tester. */
@@ -172,7 +172,7 @@ static int keyspan_load_tester(struct usb_keyspan* dev, int bits_needed)
                dev->data.bits_left += 8;
        }
 
-       return(0);
+       return 0;
 }
 
 /*
@@ -311,10 +311,10 @@ static void keyspan_check_data(struct usb_keyspan *remote, struct pt_regs *regs)
                        __FUNCTION__, message.system, message.button, message.toggle);
 
                if (message.toggle != remote->toggle) {
-                       input_regs(&remote->input, regs);
-                       input_report_key(&remote->input, keyspan_key_table[message.button], 1);
-                       input_report_key(&remote->input, keyspan_key_table[message.button], 0);
-                       input_sync(&remote->input);
+                       input_regs(remote->input, regs);
+                       input_report_key(remote->input, keyspan_key_table[message.button], 1);
+                       input_report_key(remote->input, keyspan_key_table[message.button], 0);
+                       input_sync(remote->input);
                        remote->toggle = message.toggle;
                }
 
@@ -397,14 +397,9 @@ static int keyspan_open(struct input_dev *dev)
 {
        struct usb_keyspan *remote = dev->private;
 
-       if (remote->open++)
-               return 0;
-
        remote->irq_urb->dev = remote->udev;
-       if (usb_submit_urb(remote->irq_urb, GFP_KERNEL)) {
-               remote->open--;
+       if (usb_submit_urb(remote->irq_urb, GFP_KERNEL))
                return -EIO;
-       }
 
        return 0;
 }
@@ -413,8 +408,26 @@ static void keyspan_close(struct input_dev *dev)
 {
        struct usb_keyspan *remote = dev->private;
 
-       if (!--remote->open)
-               usb_kill_urb(remote->irq_urb);
+       usb_kill_urb(remote->irq_urb);
+}
+
+static struct usb_endpoint_descriptor *keyspan_get_in_endpoint(struct usb_host_interface *iface)
+{
+
+       struct usb_endpoint_descriptor *endpoint;
+       int i;
+
+       for (i = 0; i < iface->desc.bNumEndpoints; ++i) {
+               endpoint = &iface->endpoint[i].desc;
+
+               if ((endpoint->bEndpointAddress & USB_DIR_IN) &&
+                   ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) {
+                       /* we found our interrupt in endpoint */
+                       return endpoint;
+               }
+       }
+
+       return NULL;
 }
 
 /*
@@ -422,110 +435,78 @@ static void keyspan_close(struct input_dev *dev)
  */
 static int keyspan_probe(struct usb_interface *interface, const struct usb_device_id *id)
 {
-       int i;
-       int retval = -ENOMEM;
-       char path[64];
-       char *buf;
-       struct usb_keyspan *remote = NULL;
-       struct usb_host_interface *iface_desc;
+       struct usb_device *udev = interface_to_usbdev(interface);
        struct usb_endpoint_descriptor *endpoint;
-       struct usb_device *udev = usb_get_dev(interface_to_usbdev(interface));
+       struct usb_keyspan *remote;
+       struct input_dev *input_dev;
+       int i, retval;
 
-       /* allocate memory for our device state and initialize it */
-       remote = kmalloc(sizeof(*remote), GFP_KERNEL);
-       if (remote == NULL) {
-               err("Out of memory\n");
-               goto error;
+       endpoint = keyspan_get_in_endpoint(interface->cur_altsetting);
+       if (!endpoint)
+               return -ENODEV;
+
+       remote = kzalloc(sizeof(*remote), GFP_KERNEL);
+       input_dev = input_allocate_device();
+       if (!remote || !input_dev) {
+               retval = -ENOMEM;
+               goto fail1;
        }
-       memset(remote, 0x00, sizeof(*remote));
 
        remote->udev = udev;
+       remote->input = input_dev;
        remote->interface = interface;
+       remote->in_endpoint = endpoint;
        remote->toggle = -1;    /* Set to -1 so we will always not match the toggle from the first remote message. */
 
-       /* set up the endpoint information */
-       /* use only the first in interrupt endpoint */
-       iface_desc = interface->cur_altsetting;
-       for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
-               endpoint = &iface_desc->endpoint[i].desc;
-
-               if (!remote->in_endpoint &&
-                   (endpoint->bEndpointAddress & USB_DIR_IN) &&
-                   ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) {
-                       /* we found our interrupt in endpoint */
-                       remote->in_endpoint = endpoint;
-
-                       remote->in_buffer = usb_buffer_alloc(remote->udev, RECV_SIZE, SLAB_ATOMIC, &remote->in_dma);
-                       if (!remote->in_buffer) {
-                               retval = -ENOMEM;
-                               goto error;
-                       }
-               }
-       }
-
-       if (!remote->in_endpoint) {
-               err("Could not find interrupt input endpoint.\n");
-               retval = -ENODEV;
-               goto error;
+       remote->in_buffer = usb_buffer_alloc(udev, RECV_SIZE, SLAB_ATOMIC, &remote->in_dma);
+       if (!remote->in_buffer) {
+               retval = -ENOMEM;
+               goto fail1;
        }
 
        remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
        if (!remote->irq_urb) {
-               err("Failed to allocate urb.\n");
                retval = -ENOMEM;
-               goto error;
+               goto fail2;
        }
 
-       retval = keyspan_setup(remote->udev);
+       retval = keyspan_setup(udev);
        if (retval) {
-               err("Failed to setup device.\n");
                retval = -ENODEV;
-               goto error;
-       }
-
-       /*
-        * Setup the input system with the bits we are going to be reporting
-        */
-       remote->input.evbit[0] = BIT(EV_KEY);           /* We will only report KEY events. */
-       for (i = 0; i < 32; ++i) {
-               if (keyspan_key_table[i] != KEY_RESERVED) {
-                       set_bit(keyspan_key_table[i], remote->input.keybit);
-               }
+               goto fail3;
        }
 
-       remote->input.private = remote;
-       remote->input.open = keyspan_open;
-       remote->input.close = keyspan_close;
-
-       usb_make_path(remote->udev, path, 64);
-       sprintf(remote->phys, "%s/input0", path);
+       if (udev->manufacturer)
+               strlcpy(remote->name, udev->manufacturer, sizeof(remote->name));
 
-       remote->input.name = remote->name;
-       remote->input.phys = remote->phys;
-       remote->input.id.bustype = BUS_USB;
-       remote->input.id.vendor = le16_to_cpu(remote->udev->descriptor.idVendor);
-       remote->input.id.product = le16_to_cpu(remote->udev->descriptor.idProduct);
-       remote->input.id.version = le16_to_cpu(remote->udev->descriptor.bcdDevice);
-
-       if (!(buf = kmalloc(63, GFP_KERNEL))) {
-               usb_buffer_free(remote->udev, RECV_SIZE, remote->in_buffer, remote->in_dma);
-               kfree(remote);
-               return -ENOMEM;
+       if (udev->product) {
+               if (udev->manufacturer)
+                       strlcat(remote->name, " ", sizeof(remote->name));
+               strlcat(remote->name, udev->product, sizeof(remote->name));
        }
 
-       if (remote->udev->descriptor.iManufacturer &&
-           usb_string(remote->udev, remote->udev->descriptor.iManufacturer, buf, 63) > 0)
-               strcat(remote->name, buf);
+       if (!strlen(remote->name))
+               snprintf(remote->name, sizeof(remote->name),
+                        "USB Keyspan Remote %04x:%04x",
+                        le16_to_cpu(udev->descriptor.idVendor),
+                        le16_to_cpu(udev->descriptor.idProduct));
 
-       if (remote->udev->descriptor.iProduct &&
-           usb_string(remote->udev, remote->udev->descriptor.iProduct, buf, 63) > 0)
-               sprintf(remote->name, "%s %s", remote->name, buf);
+       usb_make_path(udev, remote->phys, sizeof(remote->phys));
+       strlcat(remote->phys, "/input0", sizeof(remote->phys));
 
-       if (!strlen(remote->name))
-               sprintf(remote->name, "USB Keyspan Remote %04x:%04x",
-                       remote->input.id.vendor, remote->input.id.product);
+       input_dev->name = remote->name;
+       input_dev->phys = remote->phys;
+       usb_to_input_id(udev, &input_dev->id);
+       input_dev->cdev.dev = &interface->dev;
 
-       kfree(buf);
+       input_dev->evbit[0] = BIT(EV_KEY);              /* We will only report KEY events. */
+       for (i = 0; i < ARRAY_SIZE(keyspan_key_table); i++)
+               if (keyspan_key_table[i] != KEY_RESERVED)
+                       set_bit(keyspan_key_table[i], input_dev->keybit);
+
+       input_dev->private = remote;
+       input_dev->open = keyspan_open;
+       input_dev->close = keyspan_close;
 
        /*
         * Initialize the URB to access the device. The urb gets sent to the device in keyspan_open()
@@ -538,27 +519,17 @@ static int keyspan_probe(struct usb_interface *interface, const struct usb_devic
        remote->irq_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 
        /* we can register the device now, as it is ready */
-       input_register_device(&remote->input);
+       input_register_device(remote->input);
 
        /* save our data pointer in this interface device */
        usb_set_intfdata(interface, remote);
 
-       /* let the user know what node this device is now attached to */
-       info("connected: %s on %s", remote->name, path);
        return 0;
 
-error:
-       /*
-        * In case of error we need to clean up any allocated buffers
-        */
-       if (remote->irq_urb)
-               usb_free_urb(remote->irq_urb);
-
-       if (remote->in_buffer)
-               usb_buffer_free(remote->udev, RECV_SIZE, remote->in_buffer, remote->in_dma);
-
-       if (remote)
-               kfree(remote);
+ fail3:        usb_free_urb(remote->irq_urb);
+ fail2:        usb_buffer_free(udev, RECV_SIZE, remote->in_buffer, remote->in_dma);
+ fail1:        kfree(remote);
+       input_free_device(input_dev);
 
        return retval;
 }
@@ -570,23 +541,16 @@ static void keyspan_disconnect(struct usb_interface *interface)
 {
        struct usb_keyspan *remote;
 
-       /* prevent keyspan_open() from racing keyspan_disconnect() */
-       lock_kernel();
-
        remote = usb_get_intfdata(interface);
        usb_set_intfdata(interface, NULL);
 
        if (remote) {   /* We have a valid driver structure so clean up everything we allocated. */
-               input_unregister_device(&remote->input);
+               input_unregister_device(remote->input);
                usb_kill_urb(remote->irq_urb);
                usb_free_urb(remote->irq_urb);
-               usb_buffer_free(interface_to_usbdev(interface), RECV_SIZE, remote->in_buffer, remote->in_dma);
+               usb_buffer_free(remote->udev, RECV_SIZE, remote->in_buffer, remote->in_dma);
                kfree(remote);
        }
-
-       unlock_kernel();
-
-       info("USB Keyspan now disconnected");
 }
 
 /*
index ff92750..7fce526 100644 (file)
@@ -98,7 +98,7 @@ struct mtouch_usb {
        dma_addr_t data_dma;
        struct urb *irq;
        struct usb_device *udev;
-       struct input_dev input;
+       struct input_dev *input;
        char name[128];
        char phys[64];
 };
@@ -135,14 +135,14 @@ static void mtouchusb_irq(struct urb *urb, struct pt_regs *regs)
                goto exit;
        }
 
-       input_regs(&mtouch->input, regs);
-       input_report_key(&mtouch->input, BTN_TOUCH,
+       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,
+       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);
+       input_sync(mtouch->input);
 
 exit:
        retval = usb_submit_urb(urb, GFP_ATOMIC);
@@ -195,10 +195,10 @@ static void mtouchusb_free_buffers(struct usb_device *udev, struct mtouch_usb *m
 static int mtouchusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
 {
        struct mtouch_usb *mtouch;
+       struct input_dev *input_dev;
        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__);
@@ -209,57 +209,55 @@ static int mtouchusb_probe(struct usb_interface *intf, const struct usb_device_i
        dbg("%s - setting endpoint", __FUNCTION__);
        endpoint = &interface->endpoint[0].desc;
 
-       if (!(mtouch = kmalloc(sizeof(struct mtouch_usb), GFP_KERNEL))) {
+       mtouch = kzalloc(sizeof(struct mtouch_usb), GFP_KERNEL);
+       input_dev = input_allocate_device();
+       if (!mtouch || !input_dev) {
                err("%s - Out of memory.", __FUNCTION__);
-               return -ENOMEM;
+               goto fail1;
        }
 
-       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;
-       }
+       if (mtouchusb_alloc_buffers(udev, mtouch))
+               goto fail2;
 
-       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;
-       usb_to_input_id(udev, &mtouch->input.id);
-       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;
+       mtouch->udev = udev;
+       mtouch->input = input_dev;
 
        if (udev->manufacturer)
-               strcat(mtouch->name, udev->manufacturer);
-       if (udev->product)
-               sprintf(mtouch->name, "%s %s", mtouch->name, udev->product);
+               strlcpy(mtouch->name, udev->manufacturer, sizeof(mtouch->name));
+
+       if (udev->product) {
+               if (udev->manufacturer)
+                       strlcat(mtouch->name, " ", sizeof(mtouch->name));
+               strlcat(mtouch->name, udev->product, sizeof(mtouch->name));
+       }
 
        if (!strlen(mtouch->name))
-               sprintf(mtouch->name, "USB Touchscreen %04x:%04x",
-                       mtouch->input.id.vendor, mtouch->input.id.product);
+               snprintf(mtouch->name, sizeof(mtouch->name),
+                       "USB Touchscreen %04x:%04x",
+                       le16_to_cpu(udev->descriptor.idVendor),
+                       le16_to_cpu(udev->descriptor.idProduct));
+
+       usb_make_path(udev, mtouch->phys, sizeof(mtouch->phys));
+       strlcpy(mtouch->phys, "/input0", sizeof(mtouch->phys));
+
+       input_dev->name = mtouch->name;
+       input_dev->phys = mtouch->phys;
+       usb_to_input_id(udev, &input_dev->id);
+       input_dev->cdev.dev = &intf->dev;
+       input_dev->private = mtouch;
+
+       input_dev->open = mtouchusb_open;
+       input_dev->close = mtouchusb_close;
+
+       input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
+       input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);
+       input_set_abs_params(input_dev, ABS_X, MTOUCHUSB_MIN_XC,
+               raw_coordinates ? MTOUCHUSB_MAX_RAW_XC : MTOUCHUSB_MAX_CALIB_XC,
+                               MTOUCHUSB_XC_FUZZ, MTOUCHUSB_XC_FLAT);
+       input_set_abs_params(input_dev, ABS_Y, MTOUCHUSB_MIN_YC,
+               raw_coordinates ? MTOUCHUSB_MAX_RAW_YC : MTOUCHUSB_MAX_CALIB_YC,
+               MTOUCHUSB_YC_FUZZ, MTOUCHUSB_YC_FLAT);
 
        nRet = usb_control_msg(mtouch->udev, usb_rcvctrlpipe(udev, 0),
                               MTOUCHUSB_RESET,
@@ -272,9 +270,7 @@ static int mtouchusb_probe(struct usb_interface *intf, const struct usb_device_i
        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;
+               goto fail2;
        }
 
        dbg("%s - usb_fill_int_urb", __FUNCTION__);
@@ -284,7 +280,7 @@ static int mtouchusb_probe(struct usb_interface *intf, const struct usb_device_i
                         mtouchusb_irq, mtouch, endpoint->bInterval);
 
        dbg("%s - input_register_device", __FUNCTION__);
-       input_register_device(&mtouch->input);
+       input_register_device(mtouch->input);
 
        nRet = usb_control_msg(mtouch->udev, usb_rcvctrlpipe(udev, 0),
                               MTOUCHUSB_ASYNC_REPORT,
@@ -293,10 +289,13 @@ static int mtouchusb_probe(struct usb_interface *intf, const struct usb_device_i
        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;
+
+fail2: mtouchusb_free_buffers(udev, mtouch);
+fail1: input_free_device(input_dev);
+       kfree(mtouch);
+       return -ENOMEM;
 }
 
 static void mtouchusb_disconnect(struct usb_interface *intf)
@@ -308,7 +307,7 @@ static void mtouchusb_disconnect(struct usb_interface *intf)
        if (mtouch) {
                dbg("%s - mtouch is initialized, cleaning up", __FUNCTION__);
                usb_kill_urb(mtouch->irq);
-               input_unregister_device(&mtouch->input);
+               input_unregister_device(mtouch->input);
                usb_free_urb(mtouch->irq);
                mtouchusb_free_buffers(interface_to_usbdev(intf), mtouch);
                kfree(mtouch);
index acc71ec..a00672c 100644 (file)
@@ -262,6 +262,7 @@ int hid_pid_init(struct hid_device *hid)
 {
        struct hid_ff_pid *private;
        struct hid_input *hidinput = list_entry(&hid->inputs, struct hid_input, list);
+       struct input_dev *input_dev = hidinput->input;
 
        private = hid->ff_private = kzalloc(sizeof(struct hid_ff_pid), GFP_KERNEL);
        if (!private)
@@ -281,11 +282,12 @@ int hid_pid_init(struct hid_device *hid)
        usb_fill_control_urb(private->urbffout, hid->dev, 0,
                             (void *)&private->ffcr, private->ctrl_buffer, 8,
                             hid_pid_ctrl_out, hid);
-       hidinput->input.upload_effect = hid_pid_upload_effect;
-       hidinput->input.flush = hid_pid_flush;
-       hidinput->input.ff_effects_max = 8;     // A random default
-       set_bit(EV_FF, hidinput->input.evbit);
-       set_bit(EV_FF_STATUS, hidinput->input.evbit);
+
+       input_dev->upload_effect = hid_pid_upload_effect;
+       input_dev->flush = hid_pid_flush;
+       input_dev->ff_effects_max = 8;  // A random default
+       set_bit(EV_FF, input_dev->evbit);
+       set_bit(EV_FF_STATUS, input_dev->evbit);
 
        spin_lock_init(&private->lock);
 
index ad4afe7..b747623 100644 (file)
@@ -68,7 +68,7 @@ struct powermate_device {
        struct usb_ctrlrequest *configcr;
        dma_addr_t configcr_dma;
        struct usb_device *udev;
-       struct input_dev input;
+       struct input_dev *input;
        spinlock_t lock;
        int static_brightness;
        int pulse_speed;
@@ -106,10 +106,10 @@ static void powermate_irq(struct urb *urb, struct pt_regs *regs)
        }
 
        /* handle updates to device state */
-       input_regs(&pm->input, regs);
-       input_report_key(&pm->input, BTN_0, pm->data[0] & 0x01);
-       input_report_rel(&pm->input, REL_DIAL, pm->data[1]);
-       input_sync(&pm->input);
+       input_regs(pm->input, regs);
+       input_report_key(pm->input, BTN_0, pm->data[0] & 0x01);
+       input_report_rel(pm->input, REL_DIAL, pm->data[1]);
+       input_sync(pm->input);
 
 exit:
        retval = usb_submit_urb (urb, GFP_ATOMIC);
@@ -153,10 +153,10 @@ static void powermate_sync_state(struct powermate_device *pm)
 
                   Only values of 'arg' quite close to 255 are particularly useful/spectacular.
                */
-               if (pm->pulse_speed < 255){
+               if (pm->pulse_speed < 255) {
                        op = 0;                   // divide
                        arg = 255 - pm->pulse_speed;
-               } else if (pm->pulse_speed > 255){
+               } else if (pm->pulse_speed > 255) {
                        op = 2;                   // multiply
                        arg = pm->pulse_speed - 255;
                } else {
@@ -166,11 +166,11 @@ static void powermate_sync_state(struct powermate_device *pm)
                pm->configcr->wValue = cpu_to_le16( (pm->pulse_table << 8) | SET_PULSE_MODE );
                pm->configcr->wIndex = cpu_to_le16( (arg << 8) | op );
                pm->requires_update &= ~UPDATE_PULSE_MODE;
-       }else if (pm->requires_update & UPDATE_STATIC_BRIGHTNESS){
+       } else if (pm->requires_update & UPDATE_STATIC_BRIGHTNESS) {
                pm->configcr->wValue = cpu_to_le16( SET_STATIC_BRIGHTNESS );
                pm->configcr->wIndex = cpu_to_le16( pm->static_brightness );
                pm->requires_update &= ~UPDATE_STATIC_BRIGHTNESS;
-       }else{
+       } else {
                printk(KERN_ERR "powermate: unknown update required");
                pm->requires_update = 0; /* fudge the bug */
                return;
@@ -228,19 +228,19 @@ static void powermate_pulse_led(struct powermate_device *pm, int static_brightne
        spin_lock_irqsave(&pm->lock, flags);
 
        /* mark state updates which are required */
-       if (static_brightness != pm->static_brightness){
+       if (static_brightness != pm->static_brightness) {
                pm->static_brightness = static_brightness;
                pm->requires_update |= UPDATE_STATIC_BRIGHTNESS;
        }
-       if (pulse_asleep != pm->pulse_asleep){
+       if (pulse_asleep != pm->pulse_asleep) {
                pm->pulse_asleep = pulse_asleep;
                pm->requires_update |= (UPDATE_PULSE_ASLEEP | UPDATE_STATIC_BRIGHTNESS);
        }
-       if (pulse_awake != pm->pulse_awake){
+       if (pulse_awake != pm->pulse_awake) {
                pm->pulse_awake = pulse_awake;
                pm->requires_update |= (UPDATE_PULSE_AWAKE | UPDATE_STATIC_BRIGHTNESS);
        }
-       if (pulse_speed != pm->pulse_speed || pulse_table != pm->pulse_table){
+       if (pulse_speed != pm->pulse_speed || pulse_table != pm->pulse_table) {
                pm->pulse_speed = pulse_speed;
                pm->pulse_table = pulse_table;
                pm->requires_update |= UPDATE_PULSE_MODE;
@@ -283,6 +283,7 @@ static int powermate_alloc_buffers(struct usb_device *udev, struct powermate_dev
                                    SLAB_ATOMIC, &pm->data_dma);
        if (!pm->data)
                return -1;
+
        pm->configcr = usb_buffer_alloc(udev, sizeof(*(pm->configcr)),
                                        SLAB_ATOMIC, &pm->configcr_dma);
        if (!pm->configcr)
@@ -308,8 +309,9 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i
        struct usb_host_interface *interface;
        struct usb_endpoint_descriptor *endpoint;
        struct powermate_device *pm;
+       struct input_dev *input_dev;
        int pipe, maxp;
-       char path[64];
+       int err = -ENOMEM;
 
        interface = intf->cur_altsetting;
        endpoint = &interface->endpoint[0].desc;
@@ -323,42 +325,61 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i
                0, interface->desc.bInterfaceNumber, NULL, 0,
                USB_CTRL_SET_TIMEOUT);
 
-       if (!(pm = kmalloc(sizeof(struct powermate_device), GFP_KERNEL)))
-               return -ENOMEM;
-
-       memset(pm, 0, sizeof(struct powermate_device));
-       pm->udev = udev;
+       pm = kzalloc(sizeof(struct powermate_device), GFP_KERNEL);
+       input_dev = input_allocate_device();
+       if (!pm || !input_dev)
+               goto fail1;
 
-       if (powermate_alloc_buffers(udev, pm)) {
-               powermate_free_buffers(udev, pm);
-               kfree(pm);
-               return -ENOMEM;
-       }
+       if (powermate_alloc_buffers(udev, pm))
+               goto fail2;
 
        pm->irq = usb_alloc_urb(0, GFP_KERNEL);
-       if (!pm->irq) {
-               powermate_free_buffers(udev, pm);
-               kfree(pm);
-               return -ENOMEM;
-       }
+       if (!pm->irq)
+               goto fail2;
 
        pm->config = usb_alloc_urb(0, GFP_KERNEL);
-       if (!pm->config) {
-               usb_free_urb(pm->irq);
-               powermate_free_buffers(udev, pm);
-               kfree(pm);
-               return -ENOMEM;
-       }
+       if (!pm->config)
+               goto fail3;
+
+       pm->udev = udev;
+       pm->input = input_dev;
+
+       usb_make_path(udev, pm->phys, sizeof(pm->phys));
+       strlcpy(pm->phys, "/input0", sizeof(pm->phys));
 
        spin_lock_init(&pm->lock);
-       init_input_dev(&pm->input);
+
+       switch (le16_to_cpu(udev->descriptor.idProduct)) {
+       case POWERMATE_PRODUCT_NEW:
+               input_dev->name = pm_name_powermate;
+               break;
+       case POWERMATE_PRODUCT_OLD:
+               input_dev->name = pm_name_soundknob;
+               break;
+       default:
+               input_dev->name = pm_name_soundknob;
+               printk(KERN_WARNING "powermate: unknown product id %04x\n",
+                      le16_to_cpu(udev->descriptor.idProduct));
+       }
+
+       input_dev->phys = pm->phys;
+       usb_to_input_id(udev, &input_dev->id);
+       input_dev->cdev.dev = &intf->dev;
+       input_dev->private = pm;
+
+       input_dev->event = powermate_input_event;
+
+       input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL) | BIT(EV_MSC);
+       input_dev->keybit[LONG(BTN_0)] = BIT(BTN_0);
+       input_dev->relbit[LONG(REL_DIAL)] = BIT(REL_DIAL);
+       input_dev->mscbit[LONG(MSC_PULSELED)] = BIT(MSC_PULSELED);
 
        /* get a handle to the interrupt data pipe */
        pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress);
        maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe));
 
-       if(maxp < POWERMATE_PAYLOAD_SIZE_MIN || maxp > POWERMATE_PAYLOAD_SIZE_MAX){
-               printk("powermate: Expected payload of %d--%d bytes, found %d bytes!\n",
+       if (maxp < POWERMATE_PAYLOAD_SIZE_MIN || maxp > POWERMATE_PAYLOAD_SIZE_MAX) {
+               printk(KERN_WARNING "powermate: Expected payload of %d--%d bytes, found %d bytes!\n",
                        POWERMATE_PAYLOAD_SIZE_MIN, POWERMATE_PAYLOAD_SIZE_MAX, maxp);
                maxp = POWERMATE_PAYLOAD_SIZE_MAX;
        }
@@ -371,35 +392,11 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i
 
        /* register our interrupt URB with the USB system */
        if (usb_submit_urb(pm->irq, GFP_KERNEL)) {
-               powermate_free_buffers(udev, pm);
-               kfree(pm);
-               return -EIO; /* failure */
+               err = -EIO;
+               goto fail4;
        }
 
-       switch (le16_to_cpu(udev->descriptor.idProduct)) {
-       case POWERMATE_PRODUCT_NEW: pm->input.name = pm_name_powermate; break;
-       case POWERMATE_PRODUCT_OLD: pm->input.name = pm_name_soundknob; break;
-       default:
-               pm->input.name = pm_name_soundknob;
-               printk(KERN_WARNING "powermate: unknown product id %04x\n",
-                      le16_to_cpu(udev->descriptor.idProduct));
-       }
-
-       pm->input.private = pm;
-       pm->input.evbit[0] = BIT(EV_KEY) | BIT(EV_REL) | BIT(EV_MSC);
-       pm->input.keybit[LONG(BTN_0)] = BIT(BTN_0);
-       pm->input.relbit[LONG(REL_DIAL)] = BIT(REL_DIAL);
-       pm->input.mscbit[LONG(MSC_PULSELED)] = BIT(MSC_PULSELED);
-       usb_to_input_id(udev, &pm->input.id);
-       pm->input.event = powermate_input_event;
-       pm->input.dev = &intf->dev;
-       pm->input.phys = pm->phys;
-
-       input_register_device(&pm->input);
-
-       usb_make_path(udev, path, 64);
-       snprintf(pm->phys, 64, "%s/input0", path);
-       printk(KERN_INFO "input: %s on %s\n", pm->input.name, pm->input.phys);
+       input_register_device(pm->input);
 
        /* force an update of everything */
        pm->requires_update = UPDATE_PULSE_ASLEEP | UPDATE_PULSE_AWAKE | UPDATE_PULSE_MODE | UPDATE_STATIC_BRIGHTNESS;
@@ -407,6 +404,13 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i
 
        usb_set_intfdata(intf, pm);
        return 0;
+
+fail4: usb_free_urb(pm->config);
+fail3: usb_free_urb(pm->irq);
+fail2: powermate_free_buffers(udev, pm);
+fail1: input_free_device(input_dev);
+       kfree(pm);
+       return err;
 }
 
 /* Called when a USB device we've accepted ownership of is removed */
@@ -418,7 +422,7 @@ static void powermate_disconnect(struct usb_interface *intf)
        if (pm) {
                pm->requires_update = 0;
                usb_kill_urb(pm->irq);
-               input_unregister_device(&pm->input);
+               input_unregister_device(pm->input);
                usb_free_urb(pm->irq);
                usb_free_urb(pm->config);
                powermate_free_buffers(interface_to_usbdev(intf), pm);
index 4276c24..3766ccc 100644 (file)
@@ -68,7 +68,7 @@ struct touchkit_usb {
        dma_addr_t data_dma;
        struct urb *irq;
        struct usb_device *udev;
-       struct input_dev input;
+       struct input_dev *input;
        char name[128];
        char phys[64];
 };
@@ -115,12 +115,12 @@ static void touchkit_irq(struct urb *urb, struct pt_regs *regs)
                y = TOUCHKIT_GET_Y(touchkit->data);
        }
 
-       input_regs(&touchkit->input, regs);
-       input_report_key(&touchkit->input, BTN_TOUCH,
+       input_regs(touchkit->input, regs);
+       input_report_key(touchkit->input, BTN_TOUCH,
                         TOUCHKIT_GET_TOUCHED(touchkit->data));
-       input_report_abs(&touchkit->input, ABS_X, x);
-       input_report_abs(&touchkit->input, ABS_Y, y);
-       input_sync(&touchkit->input);
+       input_report_abs(touchkit->input, ABS_X, x);
+       input_report_abs(touchkit->input, ABS_Y, y);
+       input_sync(touchkit->input);
 
 exit:
        retval = usb_submit_urb(urb, GFP_ATOMIC);
@@ -171,87 +171,81 @@ static void touchkit_free_buffers(struct usb_device *udev,
 static int touchkit_probe(struct usb_interface *intf,
                          const struct usb_device_id *id)
 {
-       int ret;
        struct touchkit_usb *touchkit;
+       struct input_dev *input_dev;
        struct usb_host_interface *interface;
        struct usb_endpoint_descriptor *endpoint;
        struct usb_device *udev = interface_to_usbdev(intf);
-       char path[64];
 
        interface = intf->cur_altsetting;
        endpoint = &interface->endpoint[0].desc;
 
-       touchkit = kmalloc(sizeof(struct touchkit_usb), GFP_KERNEL);
-       if (!touchkit)
-               return -ENOMEM;
-
-       memset(touchkit, 0, sizeof(struct touchkit_usb));
-       touchkit->udev = udev;
-
-       if (touchkit_alloc_buffers(udev, touchkit)) {
-               ret = -ENOMEM;
+       touchkit = kzalloc(sizeof(struct touchkit_usb), GFP_KERNEL);
+       input_dev = input_allocate_device();
+       if (!touchkit || !input_dev)
                goto out_free;
-       }
-
-       touchkit->input.private = touchkit;
-       touchkit->input.open = touchkit_open;
-       touchkit->input.close = touchkit_close;
-
-       usb_make_path(udev, path, 64);
-       sprintf(touchkit->phys, "%s/input0", path);
-
-       touchkit->input.name = touchkit->name;
-       touchkit->input.phys = touchkit->phys;
-       usb_to_input_id(udev, &touchkit->input.id);
-       touchkit->input.dev = &intf->dev;
-
-       touchkit->input.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
-       touchkit->input.absbit[0] = BIT(ABS_X) | BIT(ABS_Y);
-       touchkit->input.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);
-
-       /* Used to Scale Compensated Data */
-       touchkit->input.absmin[ABS_X] = TOUCHKIT_MIN_XC;
-       touchkit->input.absmax[ABS_X] = TOUCHKIT_MAX_XC;
-       touchkit->input.absfuzz[ABS_X] = TOUCHKIT_XC_FUZZ;
-       touchkit->input.absflat[ABS_X] = TOUCHKIT_XC_FLAT;
-       touchkit->input.absmin[ABS_Y] = TOUCHKIT_MIN_YC;
-       touchkit->input.absmax[ABS_Y] = TOUCHKIT_MAX_YC;
-       touchkit->input.absfuzz[ABS_Y] = TOUCHKIT_YC_FUZZ;
-       touchkit->input.absflat[ABS_Y] = TOUCHKIT_YC_FLAT;
-
-       if (udev->manufacturer)
-               strcat(touchkit->name, udev->manufacturer);
-       if (udev->product)
-               sprintf(touchkit->name, "%s %s", touchkit->name, udev->product);
 
-       if (!strlen(touchkit->name))
-               sprintf(touchkit->name, "USB Touchscreen %04x:%04x",
-                       touchkit->input.id.vendor, touchkit->input.id.product);
+       if (touchkit_alloc_buffers(udev, touchkit))
+               goto out_free;
 
        touchkit->irq = usb_alloc_urb(0, GFP_KERNEL);
        if (!touchkit->irq) {
                dbg("%s - usb_alloc_urb failed: touchkit->irq", __FUNCTION__);
-               ret = -ENOMEM;
                goto out_free_buffers;
        }
 
+       touchkit->udev = udev;
+       touchkit->input = input_dev;
+
+       if (udev->manufacturer)
+               strlcpy(touchkit->name, udev->manufacturer, sizeof(touchkit->name));
+
+       if (udev->product) {
+               if (udev->manufacturer)
+                       strlcat(touchkit->name, " ", sizeof(touchkit->name));
+               strlcat(touchkit->name, udev->product, sizeof(touchkit->name));
+       }
+
+       if (!strlen(touchkit->name))
+               snprintf(touchkit->name, sizeof(touchkit->name),
+                       "USB Touchscreen %04x:%04x",
+                        le16_to_cpu(udev->descriptor.idVendor),
+                        le16_to_cpu(udev->descriptor.idProduct));
+
+       usb_make_path(udev, touchkit->phys, sizeof(touchkit->phys));
+       strlcpy(touchkit->phys, "/input0", sizeof(touchkit->phys));
+
+       input_dev->name = touchkit->name;
+       input_dev->phys = touchkit->phys;
+       usb_to_input_id(udev, &input_dev->id);
+       input_dev->cdev.dev = &intf->dev;
+       input_dev->private = touchkit;
+       input_dev->open = touchkit_open;
+       input_dev->close = touchkit_close;
+
+       input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
+       input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);
+       input_set_abs_params(input_dev, ABS_X, TOUCHKIT_MIN_XC, TOUCHKIT_MAX_XC,
+                               TOUCHKIT_XC_FUZZ, TOUCHKIT_XC_FLAT);
+       input_set_abs_params(input_dev, ABS_Y, TOUCHKIT_MIN_YC, TOUCHKIT_MAX_YC,
+                               TOUCHKIT_YC_FUZZ, TOUCHKIT_YC_FLAT);
+
        usb_fill_int_urb(touchkit->irq, touchkit->udev,
-                        usb_rcvintpipe(touchkit->udev, 0x81),
-                        touchkit->data, TOUCHKIT_REPORT_DATA_SIZE,
-                        touchkit_irq, touchkit, endpoint->bInterval);
+                        usb_rcvintpipe(touchkit->udev, 0x81),
+                        touchkit->data, TOUCHKIT_REPORT_DATA_SIZE,
+                        touchkit_irq, touchkit, endpoint->bInterval);
 
-       input_register_device(&touchkit->input);
+       input_register_device(touchkit->input);
 
-       printk(KERN_INFO "input: %s on %s\n", touchkit->name, path);
        usb_set_intfdata(intf, touchkit);
-
        return 0;
 
 out_free_buffers:
        touchkit_free_buffers(udev, touchkit);
 out_free:
+       input_free_device(input_dev);
        kfree(touchkit);
-       return ret;
+       return -ENOMEM;
 }
 
 static void touchkit_disconnect(struct usb_interface *intf)
@@ -265,8 +259,8 @@ static void touchkit_disconnect(struct usb_interface *intf)
 
        dbg("%s - touchkit is initialized, cleaning up", __FUNCTION__);
        usb_set_intfdata(intf, NULL);
-       input_unregister_device(&touchkit->input);
        usb_kill_urb(touchkit->irq);
+       input_unregister_device(touchkit->input);
        usb_free_urb(touchkit->irq);
        touchkit_free_buffers(interface_to_usbdev(intf), touchkit);
        kfree(touchkit);
index 28987f1..226b6f9 100644 (file)
@@ -66,7 +66,7 @@ static unsigned char usb_kbd_keycode[256] = {
 };
 
 struct usb_kbd {
-       struct input_dev dev;
+       struct input_dev *dev;
        struct usb_device *usbdev;
        unsigned char old[8];
        struct urb *irq, *led;
@@ -99,29 +99,29 @@ static void usb_kbd_irq(struct urb *urb, struct pt_regs *regs)
                goto resubmit;
        }
 
-       input_regs(&kbd->dev, regs);
+       input_regs(kbd->dev, regs);
 
        for (i = 0; i < 8; i++)
-               input_report_key(&kbd->dev, usb_kbd_keycode[i + 224], (kbd->new[0] >> i) & 1);
+               input_report_key(kbd->dev, usb_kbd_keycode[i + 224], (kbd->new[0] >> i) & 1);
 
        for (i = 2; i < 8; i++) {
 
                if (kbd->old[i] > 3 && memscan(kbd->new + 2, kbd->old[i], 6) == kbd->new + 8) {
                        if (usb_kbd_keycode[kbd->old[i]])
-                               input_report_key(&kbd->dev, usb_kbd_keycode[kbd->old[i]], 0);
+                               input_report_key(kbd->dev, usb_kbd_keycode[kbd->old[i]], 0);
                        else
                                info("Unknown key (scancode %#x) released.", kbd->old[i]);
                }
 
                if (kbd->new[i] > 3 && memscan(kbd->old + 2, kbd->new[i], 6) == kbd->old + 8) {
                        if (usb_kbd_keycode[kbd->new[i]])
-                               input_report_key(&kbd->dev, usb_kbd_keycode[kbd->new[i]], 1);
+                               input_report_key(kbd->dev, usb_kbd_keycode[kbd->new[i]], 1);
                        else
                                info("Unknown key (scancode %#x) pressed.", kbd->new[i]);
                }
        }
 
-       input_sync(&kbd->dev);
+       input_sync(kbd->dev);
 
        memcpy(kbd->old, kbd->new, 8);
 
@@ -227,12 +227,12 @@ static void usb_kbd_free_mem(struct usb_device *dev, struct usb_kbd *kbd)
 static int usb_kbd_probe(struct usb_interface *iface,
                         const struct usb_device_id *id)
 {
-       struct usb_device * dev = interface_to_usbdev(iface);
+       struct usb_device *dev = interface_to_usbdev(iface);
        struct usb_host_interface *interface;
        struct usb_endpoint_descriptor *endpoint;
        struct usb_kbd *kbd;
+       struct input_dev *input_dev;
        int i, pipe, maxp;
-       char path[64];
 
        interface = iface->cur_altsetting;
 
@@ -240,37 +240,59 @@ static int usb_kbd_probe(struct usb_interface *iface,
                return -ENODEV;
 
        endpoint = &interface->endpoint[0].desc;
-       if (!(endpoint->bEndpointAddress & 0x80))
+       if (!(endpoint->bEndpointAddress & USB_DIR_IN))
                return -ENODEV;
-       if ((endpoint->bmAttributes & 3) != 3)
+       if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT)
                return -ENODEV;
 
        pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
        maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
 
-       if (!(kbd = kmalloc(sizeof(struct usb_kbd), GFP_KERNEL)))
-               return -ENOMEM;
-       memset(kbd, 0, sizeof(struct usb_kbd));
+       kbd = kzalloc(sizeof(struct usb_kbd), GFP_KERNEL);
+       input_dev = input_allocate_device();
+       if (!kbd || !input_dev)
+               goto fail1;
 
-       if (usb_kbd_alloc_mem(dev, kbd)) {
-               usb_kbd_free_mem(dev, kbd);
-               kfree(kbd);
-               return -ENOMEM;
-       }
+       if (usb_kbd_alloc_mem(dev, kbd))
+               goto fail2;
 
        kbd->usbdev = dev;
+       kbd->dev = input_dev;
+
+       if (dev->manufacturer)
+               strlcpy(kbd->name, dev->manufacturer, sizeof(kbd->name));
+
+       if (dev->product) {
+               if (dev->manufacturer)
+                       strlcat(kbd->name, " ", sizeof(kbd->name));
+               strlcat(kbd->name, dev->product, sizeof(kbd->name));
+       }
+
+       if (!strlen(kbd->name))
+               snprintf(kbd->name, sizeof(kbd->name),
+                        "USB HIDBP Keyboard %04x:%04x",
+                        le16_to_cpu(dev->descriptor.idVendor),
+                        le16_to_cpu(dev->descriptor.idProduct));
+
+       usb_make_path(dev, kbd->phys, sizeof(kbd->phys));
+       strlcpy(kbd->phys, "/input0", sizeof(kbd->phys));
 
-       kbd->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP);
-       kbd->dev.ledbit[0] = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL) | BIT(LED_COMPOSE) | BIT(LED_KANA);
+       input_dev->name = kbd->name;
+       input_dev->phys = kbd->phys;
+       usb_to_input_id(dev, &input_dev->id);
+       input_dev->cdev.dev = &iface->dev;
+       input_dev->private = kbd;
+
+       input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP);
+       input_dev->ledbit[0] = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL) | BIT(LED_COMPOSE) | BIT(LED_KANA);
 
        for (i = 0; i < 255; i++)
-               set_bit(usb_kbd_keycode[i], kbd->dev.keybit);
-       clear_bit(0, kbd->dev.keybit);
+               set_bit(usb_kbd_keycode[i], input_dev->keybit);
+       clear_bit(0, input_dev->keybit);
 
-       kbd->dev.private = kbd;
-       kbd->dev.event = usb_kbd_event;
-       kbd->dev.open = usb_kbd_open;
-       kbd->dev.close = usb_kbd_close;
+       input_dev->event = usb_kbd_event;
+       input_dev->open = usb_kbd_open;
+       input_dev->close = usb_kbd_close;
 
        usb_fill_int_urb(kbd->irq, dev, pipe,
                         kbd->new, (maxp > 8 ? 8 : maxp),
@@ -284,37 +306,22 @@ static int usb_kbd_probe(struct usb_interface *iface,
        kbd->cr->wIndex = cpu_to_le16(interface->desc.bInterfaceNumber);
        kbd->cr->wLength = cpu_to_le16(1);
 
-       usb_make_path(dev, path, 64);
-       sprintf(kbd->phys, "%s/input0", path);
-
-       kbd->dev.name = kbd->name;
-       kbd->dev.phys = kbd->phys;
-       usb_to_input_id(dev, &kbd->dev.id);
-       kbd->dev.dev = &iface->dev;
-
-       if (dev->manufacturer)
-               strcat(kbd->name, dev->manufacturer);
-       if (dev->product)
-               sprintf(kbd->name, "%s %s", kbd->name, dev->product);
-
-       if (!strlen(kbd->name))
-               sprintf(kbd->name, "USB HIDBP Keyboard %04x:%04x",
-                       kbd->dev.id.vendor, kbd->dev.id.product);
-
        usb_fill_control_urb(kbd->led, dev, usb_sndctrlpipe(dev, 0),
                             (void *) kbd->cr, kbd->leds, 1,
                             usb_kbd_led, kbd);
        kbd->led->setup_dma = kbd->cr_dma;
        kbd->led->transfer_dma = kbd->leds_dma;
-       kbd->led->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP
-                               | URB_NO_SETUP_DMA_MAP);
+       kbd->led->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP);
 
-       input_register_device(&kbd->dev);
-
-       printk(KERN_INFO "input: %s on %s\n", kbd->name, path);
+       input_register_device(kbd->dev);
 
        usb_set_intfdata(iface, kbd);
        return 0;
+
+fail2: usb_kbd_free_mem(dev, kbd);
+fail1: input_free_device(input_dev);
+       kfree(kbd);
+       return -ENOMEM;
 }
 
 static void usb_kbd_disconnect(struct usb_interface *intf)
@@ -324,7 +331,7 @@ static void usb_kbd_disconnect(struct usb_interface *intf)
        usb_set_intfdata(intf, NULL);
        if (kbd) {
                usb_kill_urb(kbd->irq);
-               input_unregister_device(&kbd->dev);
+               input_unregister_device(kbd->dev);
                usb_kbd_free_mem(interface_to_usbdev(intf), kbd);
                kfree(kbd);
        }
index 4104dec..230f6b1 100644 (file)
@@ -50,7 +50,7 @@ struct usb_mouse {
        char name[128];
        char phys[64];
        struct usb_device *usbdev;
-       struct input_dev dev;
+       struct input_dev *dev;
        struct urb *irq;
 
        signed char *data;
@@ -61,7 +61,7 @@ static void usb_mouse_irq(struct urb *urb, struct pt_regs *regs)
 {
        struct usb_mouse *mouse = urb->context;
        signed char *data = mouse->data;
-       struct input_dev *dev = &mouse->dev;
+       struct input_dev *dev = mouse->dev;
        int status;
 
        switch (urb->status) {
@@ -115,14 +115,14 @@ static void usb_mouse_close(struct input_dev *dev)
        usb_kill_urb(mouse->irq);
 }
 
-static int usb_mouse_probe(struct usb_interface * intf, const struct usb_device_id * id)
+static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_id *id)
 {
-       struct usb_device * dev = interface_to_usbdev(intf);
+       struct usb_device *dev = interface_to_usbdev(intf);
        struct usb_host_interface *interface;
        struct usb_endpoint_descriptor *endpoint;
        struct usb_mouse *mouse;
+       struct input_dev *input_dev;
        int pipe, maxp;
-       char path[64];
 
        interface = intf->cur_altsetting;
 
@@ -130,59 +130,62 @@ static int usb_mouse_probe(struct usb_interface * intf, const struct usb_device_
                return -ENODEV;
 
        endpoint = &interface->endpoint[0].desc;
-       if (!(endpoint->bEndpointAddress & 0x80))
+       if (!(endpoint->bEndpointAddress & USB_DIR_IN))
                return -ENODEV;
-       if ((endpoint->bmAttributes & 3) != 3)
+       if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT)
                return -ENODEV;
 
        pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
        maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
 
-       if (!(mouse = kmalloc(sizeof(struct usb_mouse), GFP_KERNEL)))
-               return -ENOMEM;
-       memset(mouse, 0, sizeof(struct usb_mouse));
+       mouse = kzalloc(sizeof(struct usb_mouse), GFP_KERNEL);
+       input_dev = input_allocate_device();
+       if (!mouse || !input_dev)
+               goto fail1;
 
        mouse->data = usb_buffer_alloc(dev, 8, SLAB_ATOMIC, &mouse->data_dma);
-       if (!mouse->data) {
-               kfree(mouse);
-               return -ENOMEM;
-       }
+       if (!mouse->data)
+               goto fail1;
 
        mouse->irq = usb_alloc_urb(0, GFP_KERNEL);
-       if (!mouse->irq) {
-               usb_buffer_free(dev, 8, mouse->data, mouse->data_dma);
-               kfree(mouse);
-               return -ENODEV;
-       }
+       if (!mouse->irq)
+               goto fail2;
 
        mouse->usbdev = dev;
+       mouse->dev = input_dev;
+
+       if (dev->manufacturer)
+               strlcpy(mouse->name, dev->manufacturer, sizeof(mouse->name));
 
-       mouse->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
-       mouse->dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
-       mouse->dev.relbit[0] = BIT(REL_X) | BIT(REL_Y);
-       mouse->dev.keybit[LONG(BTN_MOUSE)] |= BIT(BTN_SIDE) | BIT(BTN_EXTRA);
-       mouse->dev.relbit[0] |= BIT(REL_WHEEL);
+       if (dev->product) {
+               if (dev->manufacturer)
+                       strlcat(mouse->name, " ", sizeof(mouse->name));
+               strlcat(mouse->name, dev->product, sizeof(mouse->name));
+       }
 
-       mouse->dev.private = mouse;
-       mouse->dev.open = usb_mouse_open;
-       mouse->dev.close = usb_mouse_close;
+       if (!strlen(mouse->name))
+               snprintf(mouse->name, sizeof(mouse->name),
+                        "USB HIDBP Mouse %04x:%04x",
+                        le16_to_cpu(dev->descriptor.idVendor),
+                        le16_to_cpu(dev->descriptor.idProduct));
 
-       usb_make_path(dev, path, 64);
-       sprintf(mouse->phys, "%s/input0", path);
+       usb_make_path(dev, mouse->phys, sizeof(mouse->phys));
+       strlcat(mouse->phys, "/input0", sizeof(mouse->phys));
 
-       mouse->dev.name = mouse->name;
-       mouse->dev.phys = mouse->phys;
-       usb_to_input_id(dev, &mouse->dev.id);
-       mouse->dev.dev = &intf->dev;
+       input_dev->name = mouse->name;
+       input_dev->phys = mouse->phys;
+       usb_to_input_id(dev, &input_dev->id);
+       input_dev->cdev.dev = &intf->dev;
 
-       if (dev->manufacturer)
-               strcat(mouse->name, dev->manufacturer);
-       if (dev->product)
-               sprintf(mouse->name, "%s %s", mouse->name, dev->product);
+       input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
+       input_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
+       input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y);
+       input_dev->keybit[LONG(BTN_MOUSE)] |= BIT(BTN_SIDE) | BIT(BTN_EXTRA);
+       input_dev->relbit[0] |= BIT(REL_WHEEL);
 
-       if (!strlen(mouse->name))
-               sprintf(mouse->name, "USB HIDBP Mouse %04x:%04x",
-                       mouse->dev.id.vendor, mouse->dev.id.product);
+       input_dev->private = mouse;
+       input_dev->open = usb_mouse_open;
+       input_dev->close = usb_mouse_close;
 
        usb_fill_int_urb(mouse->irq, dev, pipe, mouse->data,
                         (maxp > 8 ? 8 : maxp),
@@ -190,11 +193,15 @@ static int usb_mouse_probe(struct usb_interface * intf, const struct usb_device_
        mouse->irq->transfer_dma = mouse->data_dma;
        mouse->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 
-       input_register_device(&mouse->dev);
-       printk(KERN_INFO "input: %s on %s\n", mouse->name, path);
+       input_register_device(mouse->dev);
 
        usb_set_intfdata(intf, mouse);
        return 0;
+
+fail2: usb_buffer_free(dev, 8, mouse->data, mouse->data_dma);
+fail1: input_free_device(input_dev);
+       kfree(mouse);
+       return -ENOMEM;
 }
 
 static void usb_mouse_disconnect(struct usb_interface *intf)
@@ -204,7 +211,7 @@ static void usb_mouse_disconnect(struct usb_interface *intf)
        usb_set_intfdata(intf, NULL);
        if (mouse) {
                usb_kill_urb(mouse->irq);
-               input_unregister_device(&mouse->dev);
+               input_unregister_device(mouse->dev);
                usb_free_urb(mouse->irq);
                usb_buffer_free(interface_to_usbdev(intf), 8, mouse->data, mouse->data_dma);
                kfree(mouse);
index 3b266af..ea0f757 100644 (file)
@@ -111,7 +111,7 @@ struct wacom_features {
 struct wacom {
        signed char *data;
        dma_addr_t data_dma;
-       struct input_dev dev;
+       struct input_dev *dev;
        struct usb_device *usbdev;
        struct urb *irq;
        struct wacom_features *features;
@@ -135,7 +135,7 @@ static void wacom_pl_irq(struct urb *urb, struct pt_regs *regs)
 {
        struct wacom *wacom = urb->context;
        unsigned char *data = wacom->data;
-       struct input_dev *dev = &wacom->dev;
+       struct input_dev *dev = wacom->dev;
        int prox, pressure;
        int retval;
 
@@ -225,7 +225,7 @@ static void wacom_ptu_irq(struct urb *urb, struct pt_regs *regs)
 {
        struct wacom *wacom = urb->context;
        unsigned char *data = wacom->data;
-       struct input_dev *dev = &wacom->dev;
+       struct input_dev *dev = wacom->dev;
        int retval;
 
        switch (urb->status) {
@@ -275,7 +275,7 @@ static void wacom_penpartner_irq(struct urb *urb, struct pt_regs *regs)
 {
        struct wacom *wacom = urb->context;
        unsigned char *data = wacom->data;
-       struct input_dev *dev = &wacom->dev;
+       struct input_dev *dev = wacom->dev;
        int retval;
 
        switch (urb->status) {
@@ -318,7 +318,7 @@ static void wacom_graphire_irq(struct urb *urb, struct pt_regs *regs)
 {
        struct wacom *wacom = urb->context;
        unsigned char *data = wacom->data;
-       struct input_dev *dev = &wacom->dev;
+       struct input_dev *dev = wacom->dev;
        int x, y;
        int retval;
 
@@ -397,7 +397,7 @@ static int wacom_intuos_inout(struct urb *urb)
 {
        struct wacom *wacom = urb->context;
        unsigned char *data = wacom->data;
-       struct input_dev *dev = &wacom->dev;
+       struct input_dev *dev = wacom->dev;
        int idx;
 
        /* tool number */
@@ -479,7 +479,7 @@ static void wacom_intuos_general(struct urb *urb)
 {
        struct wacom *wacom = urb->context;
        unsigned char *data = wacom->data;
-       struct input_dev *dev = &wacom->dev;
+       struct input_dev *dev = wacom->dev;
        unsigned int t;
 
        /* general pen packet */
@@ -509,7 +509,7 @@ static void wacom_intuos_irq(struct urb *urb, struct pt_regs *regs)
 {
        struct wacom *wacom = urb->context;
        unsigned char *data = wacom->data;
-       struct input_dev *dev = &wacom->dev;
+       struct input_dev *dev = wacom->dev;
        unsigned int t;
        int idx;
        int retval;
@@ -738,95 +738,83 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
 {
        struct usb_device *dev = interface_to_usbdev(intf);
        struct usb_endpoint_descriptor *endpoint;
-       char rep_data[2] = {0x02, 0x02};
        struct wacom *wacom;
-       char path[64];
+       struct input_dev *input_dev;
+       char rep_data[2] = {0x02, 0x02};
 
-       if (!(wacom = kmalloc(sizeof(struct wacom), GFP_KERNEL)))
-               return -ENOMEM;
-       memset(wacom, 0, sizeof(struct wacom));
+       wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL);
+       input_dev = input_allocate_device();
+       if (!wacom || !input_dev)
+               goto fail1;
 
        wacom->data = usb_buffer_alloc(dev, 10, GFP_KERNEL, &wacom->data_dma);
-       if (!wacom->data) {
-               kfree(wacom);
-               return -ENOMEM;
-       }
+       if (!wacom->data)
+               goto fail1;
 
        wacom->irq = usb_alloc_urb(0, GFP_KERNEL);
-       if (!wacom->irq) {
-               usb_buffer_free(dev, 10, wacom->data, wacom->data_dma);
-               kfree(wacom);
-               return -ENOMEM;
-       }
+       if (!wacom->irq)
+               goto fail2;
+
+       wacom->usbdev = dev;
+       wacom->dev = input_dev;
+       usb_make_path(dev, wacom->phys, sizeof(wacom->phys));
+       strlcat(wacom->phys, "/input0", sizeof(wacom->phys));
 
        wacom->features = wacom_features + (id - wacom_ids);
+       if (wacom->features->pktlen > 10)
+               BUG();
+
+       input_dev->name = wacom->features->name;
+       usb_to_input_id(dev, &input_dev->id);
 
-       wacom->dev.evbit[0] |= BIT(EV_KEY) | BIT(EV_ABS);
-       wacom->dev.absbit[0] |= BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE);
-       wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_PEN) | BIT(BTN_TOUCH) | BIT(BTN_STYLUS);
+       input_dev->cdev.dev = &intf->dev;
+       input_dev->private = wacom;
+       input_dev->open = wacom_open;
+       input_dev->close = wacom_close;
+
+       input_dev->evbit[0] |= BIT(EV_KEY) | BIT(EV_ABS);
+       input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_PEN) | BIT(BTN_TOUCH) | BIT(BTN_STYLUS);
+       input_set_abs_params(input_dev, ABS_X, 0, wacom->features->y_max, 4, 0);
+       input_set_abs_params(input_dev, ABS_Y, 0, wacom->features->y_max, 4, 0);
+       input_set_abs_params(input_dev, ABS_PRESSURE, 0, wacom->features->pressure_max, 0, 0);
 
        switch (wacom->features->type) {
                case GRAPHIRE:
-                       wacom->dev.evbit[0] |= BIT(EV_REL);
-                       wacom->dev.relbit[0] |= BIT(REL_WHEEL);
-                       wacom->dev.absbit[0] |= BIT(ABS_DISTANCE);
-                       wacom->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
-                       wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_RUBBER) | BIT(BTN_TOOL_MOUSE) | BIT(BTN_STYLUS2);
+                       input_dev->evbit[0] |= BIT(EV_REL);
+                       input_dev->relbit[0] |= BIT(REL_WHEEL);
+                       input_dev->keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
+                       input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_RUBBER) | BIT(BTN_TOOL_MOUSE) | BIT(BTN_STYLUS2);
+                       input_set_abs_params(input_dev, ABS_DISTANCE, 0, wacom->features->distance_max, 0, 0);
                        break;
 
                case INTUOS3:
                case CINTIQ:
-                       wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_FINGER);
-                       wacom->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_0) | BIT(BTN_1) | BIT(BTN_2) | BIT(BTN_3) | BIT(BTN_4) | BIT(BTN_5) | BIT(BTN_6) | BIT(BTN_7);
-                       wacom->dev.absbit[0] |= BIT(ABS_RX) | BIT(ABS_RY);
+                       input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_FINGER);
+                       input_dev->keybit[LONG(BTN_LEFT)] |= BIT(BTN_0) | BIT(BTN_1) | BIT(BTN_2) | BIT(BTN_3) | BIT(BTN_4) | BIT(BTN_5) | BIT(BTN_6) | BIT(BTN_7);
+                       input_set_abs_params(input_dev, ABS_RX, 0, 4097, 0, 0);
+                       input_set_abs_params(input_dev, ABS_RY, 0, 4097, 0, 0);
                        /* fall through */
 
                case INTUOS:
-                       wacom->dev.evbit[0] |= BIT(EV_MSC) | BIT(EV_REL);
-                       wacom->dev.mscbit[0] |= BIT(MSC_SERIAL);
-                       wacom->dev.relbit[0] |= BIT(REL_WHEEL);
-                       wacom->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE) | BIT(BTN_SIDE) | BIT(BTN_EXTRA);
-                       wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_RUBBER) | BIT(BTN_TOOL_MOUSE) | BIT(BTN_TOOL_BRUSH)
+                       input_dev->evbit[0] |= BIT(EV_MSC) | BIT(EV_REL);
+                       input_dev->mscbit[0] |= BIT(MSC_SERIAL);
+                       input_dev->relbit[0] |= BIT(REL_WHEEL);
+                       input_dev->keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE) | BIT(BTN_SIDE) | BIT(BTN_EXTRA);
+                       input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_RUBBER) | BIT(BTN_TOOL_MOUSE) | BIT(BTN_TOOL_BRUSH)
                                                          | BIT(BTN_TOOL_PENCIL) | BIT(BTN_TOOL_AIRBRUSH) | BIT(BTN_TOOL_LENS) | BIT(BTN_STYLUS2);
-                       wacom->dev.absbit[0] |= BIT(ABS_DISTANCE) | BIT(ABS_WHEEL) | BIT(ABS_TILT_X) | BIT(ABS_TILT_Y) | BIT(ABS_RZ) | BIT(ABS_THROTTLE);
+                       input_set_abs_params(input_dev, ABS_DISTANCE, 0, wacom->features->distance_max, 0, 0);
+                       input_set_abs_params(input_dev, ABS_WHEEL, 0, 1023, 0, 0);
+                       input_set_abs_params(input_dev, ABS_TILT_X, 0, 127, 0, 0);
+                       input_set_abs_params(input_dev, ABS_TILT_Y, 0, 127, 0, 0);
+                       input_set_abs_params(input_dev, ABS_RZ, -900, 899, 0, 0);
+                       input_set_abs_params(input_dev, ABS_THROTTLE, -1023, 1023, 0, 0);
                        break;
 
                case PL:
-                       wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_STYLUS2) | BIT(BTN_TOOL_RUBBER);
+                       input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_STYLUS2) | BIT(BTN_TOOL_RUBBER);
                        break;
        }
 
-       wacom->dev.absmax[ABS_X] = wacom->features->x_max;
-       wacom->dev.absmax[ABS_Y] = wacom->features->y_max;
-       wacom->dev.absmax[ABS_PRESSURE] = wacom->features->pressure_max;
-       wacom->dev.absmax[ABS_DISTANCE] = wacom->features->distance_max;
-       wacom->dev.absmax[ABS_TILT_X] = 127;
-       wacom->dev.absmax[ABS_TILT_Y] = 127;
-       wacom->dev.absmax[ABS_WHEEL] = 1023;
-
-       wacom->dev.absmax[ABS_RX] = 4097;
-       wacom->dev.absmax[ABS_RY] = 4097;
-       wacom->dev.absmin[ABS_RZ] = -900;
-       wacom->dev.absmax[ABS_RZ] = 899;
-       wacom->dev.absmin[ABS_THROTTLE] = -1023;
-       wacom->dev.absmax[ABS_THROTTLE] = 1023;
-
-       wacom->dev.absfuzz[ABS_X] = 4;
-       wacom->dev.absfuzz[ABS_Y] = 4;
-
-       wacom->dev.private = wacom;
-       wacom->dev.open = wacom_open;
-       wacom->dev.close = wacom_close;
-
-       usb_make_path(dev, path, 64);
-       sprintf(wacom->phys, "%s/input0", path);
-
-       wacom->dev.name = wacom->features->name;
-       wacom->dev.phys = wacom->phys;
-       usb_to_input_id(dev, &wacom->dev.id);
-       wacom->dev.dev = &intf->dev;
-       wacom->usbdev = dev;
-
        endpoint = &intf->cur_altsetting->endpoint[0].desc;
 
        if (wacom->features->pktlen > 10)
@@ -839,18 +827,20 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
        wacom->irq->transfer_dma = wacom->data_dma;
        wacom->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 
-       input_register_device(&wacom->dev);
+       input_register_device(wacom->dev);
 
        /* ask the tablet to report tablet data */
        usb_set_report(intf, 3, 2, rep_data, 2);
        /* repeat once (not sure why the first call often fails) */
        usb_set_report(intf, 3, 2, rep_data, 2);
 
-       printk(KERN_INFO "input: %s on %s\n", wacom->features->name, path);
-
        usb_set_intfdata(intf, wacom);
-
        return 0;
+
+fail2: usb_buffer_free(dev, 10, wacom->data, wacom->data_dma);
+fail1: input_free_device(input_dev);
+       kfree(wacom);
+       return -ENOMEM;
 }
 
 static void wacom_disconnect(struct usb_interface *intf)
@@ -860,7 +850,7 @@ static void wacom_disconnect(struct usb_interface *intf)
        usb_set_intfdata(intf, NULL);
        if (wacom) {
                usb_kill_urb(wacom->irq);
-               input_unregister_device(&wacom->dev);
+               input_unregister_device(wacom->dev);
                usb_free_urb(wacom->irq);
                usb_buffer_free(interface_to_usbdev(intf), 10, wacom->data, wacom->data_dma);
                kfree(wacom);
index 18125e0..43112f0 100644 (file)
@@ -103,7 +103,7 @@ static struct usb_device_id xpad_table [] = {
 MODULE_DEVICE_TABLE (usb, xpad_table);
 
 struct usb_xpad {
-       struct input_dev dev;                   /* input device interface */
+       struct input_dev *dev;                  /* input device interface */
        struct usb_device *udev;                /* usb device */
 
        struct urb *irq_in;                     /* urb for interrupt in report */
@@ -125,7 +125,7 @@ struct usb_xpad {
 
 static void xpad_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data, struct pt_regs *regs)
 {
-       struct input_dev *dev = &xpad->dev;
+       struct input_dev *dev = xpad->dev;
 
        input_regs(dev, regs);
 
@@ -214,9 +214,9 @@ static void xpad_close (struct input_dev *dev)
 static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id)
 {
        struct usb_device *udev = interface_to_usbdev (intf);
-       struct usb_xpad *xpad = NULL;
+       struct usb_xpad *xpad;
+       struct input_dev *input_dev;
        struct usb_endpoint_descriptor *ep_irq_in;
-       char path[64];
        int i;
 
        for (i = 0; xpad_device[i].idVendor; i++) {
@@ -225,89 +225,80 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id
                        break;
        }
 
-       if ((xpad = kmalloc (sizeof(struct usb_xpad), GFP_KERNEL)) == NULL) {
-               err("cannot allocate memory for new pad");
-               return -ENOMEM;
-       }
-       memset(xpad, 0, sizeof(struct usb_xpad));
+       xpad = kzalloc(sizeof(struct usb_xpad), GFP_KERNEL);
+       input_dev = input_allocate_device();
+       if (!xpad || !input_dev)
+               goto fail1;
 
        xpad->idata = usb_buffer_alloc(udev, XPAD_PKT_LEN,
                                       SLAB_ATOMIC, &xpad->idata_dma);
-       if (!xpad->idata) {
-               kfree(xpad);
-               return -ENOMEM;
-       }
+       if (!xpad->idata)
+               goto fail1;
 
        xpad->irq_in = usb_alloc_urb(0, GFP_KERNEL);
-        if (!xpad->irq_in) {
-               err("cannot allocate memory for new pad irq urb");
-               usb_buffer_free(udev, XPAD_PKT_LEN, xpad->idata, xpad->idata_dma);
-                kfree(xpad);
-               return -ENOMEM;
-        }
-
-       ep_irq_in = &intf->cur_altsetting->endpoint[0].desc;
-
-       usb_fill_int_urb(xpad->irq_in, udev,
-                        usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress),
-                        xpad->idata, XPAD_PKT_LEN, xpad_irq_in,
-                        xpad, ep_irq_in->bInterval);
-       xpad->irq_in->transfer_dma = xpad->idata_dma;
-       xpad->irq_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
+       if (!xpad->irq_in)
+               goto fail2;
 
        xpad->udev = udev;
+       xpad->dev = input_dev;
+       usb_make_path(udev, xpad->phys, sizeof(xpad->phys));
+       strlcat(xpad->phys, "/input0", sizeof(xpad->phys));
 
-       usb_to_input_id(udev, &xpad->dev.id);
-       xpad->dev.dev = &intf->dev;
-       xpad->dev.private = xpad;
-       xpad->dev.name = xpad_device[i].name;
-       xpad->dev.phys = xpad->phys;
-       xpad->dev.open = xpad_open;
-       xpad->dev.close = xpad_close;
-
-       usb_make_path(udev, path, 64);
-       snprintf(xpad->phys, 64,  "%s/input0", path);
+       input_dev->name = xpad_device[i].name;
+       input_dev->phys = xpad->phys;
+       usb_to_input_id(udev, &input_dev->id);
+       input_dev->cdev.dev = &intf->dev;
+       input_dev->private = xpad;
+       input_dev->open = xpad_open;
+       input_dev->close = xpad_close;
 
-       xpad->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
+       input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
 
        for (i = 0; xpad_btn[i] >= 0; i++)
-               set_bit(xpad_btn[i], xpad->dev.keybit);
+               set_bit(xpad_btn[i], input_dev->keybit);
 
        for (i = 0; xpad_abs[i] >= 0; i++) {
 
                signed short t = xpad_abs[i];
 
-               set_bit(t, xpad->dev.absbit);
+               set_bit(t, input_dev->absbit);
 
                switch (t) {
                        case ABS_X:
                        case ABS_Y:
                        case ABS_RX:
                        case ABS_RY:    /* the two sticks */
-                               xpad->dev.absmax[t] =  32767;
-                               xpad->dev.absmin[t] = -32768;
-                               xpad->dev.absflat[t] = 128;
-                               xpad->dev.absfuzz[t] = 16;
+                               input_set_abs_params(input_dev, t, -32768, 32767, 16, 128);
                                break;
                        case ABS_Z:
                        case ABS_RZ:    /* the triggers */
-                               xpad->dev.absmax[t] = 255;
-                               xpad->dev.absmin[t] = 0;
+                               input_set_abs_params(input_dev, t, 0, 255, 0, 0);
                                break;
                        case ABS_HAT0X:
                        case ABS_HAT0Y: /* the d-pad */
-                               xpad->dev.absmax[t] =  1;
-                               xpad->dev.absmin[t] = -1;
+                               input_set_abs_params(input_dev, t, -1, 1, 0, 0);
                                break;
                }
        }
 
-       input_register_device(&xpad->dev);
+       ep_irq_in = &intf->cur_altsetting->endpoint[0].desc;
+       usb_fill_int_urb(xpad->irq_in, udev,
+                        usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress),
+                        xpad->idata, XPAD_PKT_LEN, xpad_irq_in,
+                        xpad, ep_irq_in->bInterval);
+       xpad->irq_in->transfer_dma = xpad->idata_dma;
+       xpad->irq_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 
-       printk(KERN_INFO "input: %s on %s", xpad->dev.name, path);
+       input_register_device(xpad->dev);
 
        usb_set_intfdata(intf, xpad);
        return 0;
+
+fail2: usb_buffer_free(udev, XPAD_PKT_LEN, xpad->idata, xpad->idata_dma);
+fail1: input_free_device(input_dev);
+       kfree(xpad);
+       return -ENOMEM;
+
 }
 
 static void xpad_disconnect(struct usb_interface *intf)
@@ -317,7 +308,7 @@ static void xpad_disconnect(struct usb_interface *intf)
        usb_set_intfdata(intf, NULL);
        if (xpad) {
                usb_kill_urb(xpad->irq_in);
-               input_unregister_device(&xpad->dev);
+               input_unregister_device(xpad->dev);
                usb_free_urb(xpad->irq_in);
                usb_buffer_free(interface_to_usbdev(intf), XPAD_PKT_LEN, xpad->idata, xpad->idata_dma);
                kfree(xpad);
index 58a176e..f526aeb 100644 (file)
@@ -54,6 +54,7 @@
 #include <linux/module.h>
 #include <linux/rwsem.h>
 #include <linux/usb.h>
+#include <linux/usb_input.h>
 
 #include "map_to_7segment.h"
 #include "yealink.h"
@@ -101,12 +102,12 @@ static const struct lcd_segment_map {
 };
 
 struct yealink_dev {
-       struct input_dev idev;          /* input device */
+       struct input_dev *idev;         /* input device */
        struct usb_device *udev;        /* usb device */
 
        /* irq input channel */
        struct yld_ctl_packet   *irq_data;
-       dma_addr_t              irq_dma;
+       dma_addr_t              irq_dma;
        struct urb              *urb_irq;
 
        /* control output channel */
@@ -237,7 +238,7 @@ static int map_p1k_to_key(int scancode)
  */
 static void report_key(struct yealink_dev *yld, int key, struct pt_regs *regs)
 {
-       struct input_dev *idev = &yld->idev;
+       struct input_dev *idev = yld->idev;
 
        input_regs(idev, regs);
        if (yld->key_code >= 0) {
@@ -809,8 +810,12 @@ static int usb_cleanup(struct yealink_dev *yld, int err)
        }
         if (yld->urb_ctl)
                usb_free_urb(yld->urb_ctl);
-        if (yld->idev.dev)
-               input_unregister_device(&yld->idev);
+        if (yld->idev) {
+               if (err)
+                       input_free_device(yld->idev);
+               else
+                       input_unregister_device(yld->idev);
+       }
        if (yld->ctl_req)
                usb_buffer_free(yld->udev, sizeof(*(yld->ctl_req)),
                                yld->ctl_req, yld->ctl_req_dma);
@@ -857,7 +862,7 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
        struct usb_host_interface *interface;
        struct usb_endpoint_descriptor *endpoint;
        struct yealink_dev *yld;
-       char path[64];
+       struct input_dev *input_dev;
        int ret, pipe, i;
 
        i = usb_match(udev);
@@ -866,17 +871,21 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
 
        interface = intf->cur_altsetting;
        endpoint = &interface->endpoint[0].desc;
-       if (!(endpoint->bEndpointAddress & 0x80))
+       if (!(endpoint->bEndpointAddress & USB_DIR_IN))
                return -EIO;
-       if ((endpoint->bmAttributes & 3) != 3)
+       if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT)
                return -EIO;
 
-       if ((yld = kmalloc(sizeof(struct yealink_dev), GFP_KERNEL)) == NULL)
+       yld = kzalloc(sizeof(struct yealink_dev), GFP_KERNEL);
+       if (!yld)
                return -ENOMEM;
 
-       memset(yld, 0, sizeof(*yld));
        yld->udev = udev;
 
+       yld->idev = input_dev = input_allocate_device();
+       if (!input_dev)
+               return usb_cleanup(yld, -ENOMEM);
+
        /* allocate usb buffers */
        yld->irq_data = usb_buffer_alloc(udev, USB_PKT_LEN,
                                        SLAB_ATOMIC, &yld->irq_dma);
@@ -935,42 +944,37 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
        yld->urb_ctl->dev = udev;
 
        /* find out the physical bus location */
-       if (usb_make_path(udev, path, sizeof(path)) > 0)
-               snprintf(yld->phys, sizeof(yld->phys)-1,  "%s/input0", path);
+       usb_make_path(udev, yld->phys, sizeof(yld->phys));
+       strlcat(yld->phys,  "/input0", sizeof(yld->phys));
 
        /* register settings for the input device */
-       init_input_dev(&yld->idev);
-       yld->idev.private       = yld;
-       yld->idev.id.bustype    = BUS_USB;
-       yld->idev.id.vendor     = le16_to_cpu(udev->descriptor.idVendor);
-       yld->idev.id.product    = le16_to_cpu(udev->descriptor.idProduct);
-       yld->idev.id.version    = le16_to_cpu(udev->descriptor.bcdDevice);
-       yld->idev.dev           = &intf->dev;
-       yld->idev.name          = yld_device[i].name;
-       yld->idev.phys          = yld->phys;
-       /* yld->idev.event              = input_ev;     TODO */
-       yld->idev.open          = input_open;
-       yld->idev.close         = input_close;
+       input_dev->name = yld_device[i].name;
+       input_dev->phys = yld->phys;
+       usb_to_input_id(udev, &input_dev->id);
+       input_dev->cdev.dev = &intf->dev;
+
+       input_dev->private = yld;
+       input_dev->open = input_open;
+       input_dev->close = input_close;
+       /* input_dev->event = input_ev; TODO */
 
        /* register available key events */
-       yld->idev.evbit[0] = BIT(EV_KEY);
+       input_dev->evbit[0] = BIT(EV_KEY);
        for (i = 0; i < 256; i++) {
                int k = map_p1k_to_key(i);
                if (k >= 0) {
-                       set_bit(k & 0xff, yld->idev.keybit);
+                       set_bit(k & 0xff, input_dev->keybit);
                        if (k >> 8)
-                               set_bit(k >> 8, yld->idev.keybit);
+                               set_bit(k >> 8, input_dev->keybit);
                }
        }
 
-       printk(KERN_INFO "input: %s on %s\n", yld->idev.name, path);
-
-       input_register_device(&yld->idev);
+       input_register_device(yld->idev);
 
        usb_set_intfdata(intf, yld);
 
        /* clear visible elements */
-       for (i=0; i<ARRAY_SIZE(lcdMap); i++)
+       for (i = 0; i < ARRAY_SIZE(lcdMap); i++)
                setChar(yld, i, ' ');
 
        /* display driver version on LCD line 3 */