]> err.no Git - linux-2.6/blobdiff - drivers/hid/usbhid/usbmouse.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland...
[linux-2.6] / drivers / hid / usbhid / usbmouse.c
index 692fd6087779a2a8b2c5a581122d860ee0a45595..df0d96d989de7b92300877269158f73fb40e5241 100644 (file)
@@ -96,7 +96,7 @@ resubmit:
 
 static int usb_mouse_open(struct input_dev *dev)
 {
-       struct usb_mouse *mouse = dev->private;
+       struct usb_mouse *mouse = input_get_drvdata(dev);
 
        mouse->irq->dev = mouse->usbdev;
        if (usb_submit_urb(mouse->irq, GFP_KERNEL))
@@ -107,7 +107,7 @@ static int usb_mouse_open(struct input_dev *dev)
 
 static void usb_mouse_close(struct input_dev *dev)
 {
-       struct usb_mouse *mouse = dev->private;
+       struct usb_mouse *mouse = input_get_drvdata(dev);
 
        usb_kill_urb(mouse->irq);
 }
@@ -120,6 +120,7 @@ static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_i
        struct usb_mouse *mouse;
        struct input_dev *input_dev;
        int pipe, maxp;
+       int error = -ENOMEM;
 
        interface = intf->cur_altsetting;
 
@@ -130,6 +131,14 @@ static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_i
        if (!usb_endpoint_is_int_in(endpoint))
                return -ENODEV;
 
+#ifdef CONFIG_USB_HID
+       if (usbhid_lookup_quirk(le16_to_cpu(dev->descriptor.idVendor),
+                               le16_to_cpu(dev->descriptor.idProduct))
+                       & (HID_QUIRK_IGNORE|HID_QUIRK_IGNORE_MOUSE)) {
+               return -ENODEV;
+       }
+#endif
+
        pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
        maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
 
@@ -170,15 +179,18 @@ static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_i
        input_dev->name = mouse->name;
        input_dev->phys = mouse->phys;
        usb_to_input_id(dev, &input_dev->id);
-       input_dev->cdev.dev = &intf->dev;
+       input_dev->dev.parent = &intf->dev;
+
+       input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL);
+       input_dev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) |
+               BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE);
+       input_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y);
+       input_dev->keybit[BIT_WORD(BTN_MOUSE)] |= BIT_MASK(BTN_SIDE) |
+               BIT_MASK(BTN_EXTRA);
+       input_dev->relbit[0] |= BIT_MASK(REL_WHEEL);
 
-       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);
+       input_set_drvdata(input_dev, mouse);
 
-       input_dev->private = mouse;
        input_dev->open = usb_mouse_open;
        input_dev->close = usb_mouse_close;
 
@@ -188,15 +200,21 @@ static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_i
        mouse->irq->transfer_dma = mouse->data_dma;
        mouse->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 
-       input_register_device(mouse->dev);
+       error = input_register_device(mouse->dev);
+       if (error)
+               goto fail3;
 
        usb_set_intfdata(intf, mouse);
        return 0;
 
-fail2: usb_buffer_free(dev, 8, mouse->data, mouse->data_dma);
-fail1: input_free_device(input_dev);
+fail3: 
+       usb_free_urb(mouse->irq);
+fail2: 
+       usb_buffer_free(dev, 8, mouse->data, mouse->data_dma);
+fail1: 
+       input_free_device(input_dev);
        kfree(mouse);
-       return -ENOMEM;
+       return error;
 }
 
 static void usb_mouse_disconnect(struct usb_interface *intf)