Merge branch 'for-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jikos/hid
authorLinus Torvalds <torvalds@woody.linux-foundation.org>
Wed, 7 Mar 2007 01:34:28 +0000 (17:34 -0800)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Wed, 7 Mar 2007 01:34:28 +0000 (17:34 -0800)
* 'for-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jikos/hid:
  HID blacklisting of all Code Mercenaries IOWarrior devices

1  2 
drivers/usb/input/hid-core.c

index 12ec8b432953ad235a40638c1cf83b4192f978fc,8e86c3c6dc044367f88eef49b4e73599f2f704d7..827a75a186ba6006f30819ca0d893fb0d076214a
@@@ -4,7 -4,7 +4,7 @@@
   *  Copyright (c) 1999 Andreas Gal
   *  Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
   *  Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
 - *  Copyright (c) 2006 Jiri Kosina
 + *  Copyright (c) 2006-2007 Jiri Kosina
   */
  
  /*
@@@ -27,6 -27,9 +27,6 @@@
  #include <linux/input.h>
  #include <linux/wait.h>
  
 -#undef DEBUG
 -#undef DEBUG_DATA
 -
  #include <linux/usb.h>
  
  #include <linux/hid.h>
@@@ -686,10 -689,8 +686,8 @@@ void usbhid_init_reports(struct hid_dev
  #define USB_DEVICE_ID_SMARTJOY_DUAL_PLUS 0x8802
  
  #define USB_VENDOR_ID_CODEMERCS               0x07c0
- #define USB_DEVICE_ID_CODEMERCS_IOW40 0x1500
- #define USB_DEVICE_ID_CODEMERCS_IOW24 0x1501
- #define USB_DEVICE_ID_CODEMERCS_IOW48 0x1502
- #define USB_DEVICE_ID_CODEMERCS_IOW28 0x1503
+ #define USB_DEVICE_ID_CODEMERCS_IOW_FIRST     0x1500
+ #define USB_DEVICE_ID_CODEMERCS_IOW_LAST      0x15ff
  
  #define USB_VENDOR_ID_DELORME         0x1163
  #define USB_DEVICE_ID_DELORME_EARTHMATE 0x0100
  
  #define USB_VENDOR_ID_LOGITECH                0x046d
  #define USB_DEVICE_ID_LOGITECH_USB_RECEIVER   0xc101
 +#define USB_DEVICE_ID_LOGITECH_USB_RECEIVER_2 0xc517
 +#define USB_DEVICE_ID_DINOVO_EDGE     0xc714
  
  #define USB_VENDOR_ID_IMATION         0x0718
  #define USB_DEVICE_ID_DISC_STAKKA     0xd000
@@@ -777,8 -776,6 +775,8 @@@ static const struct hid_blacklist 
        unsigned quirks;
  } hid_blacklist[] = {
  
 +      { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_EDGE, HID_QUIRK_DUPLICATE_USAGES },
 +
        { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_01, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_10, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_20, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_AIRCABLE, USB_DEVICE_ID_AIRCABLE1, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_ALCOR, USB_DEVICE_ID_ALCOR_USBRS232, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD, HID_QUIRK_IGNORE },
-       { USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW40, HID_QUIRK_IGNORE },
-       { USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW24, HID_QUIRK_IGNORE },
-       { USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW48, HID_QUIRK_IGNORE },
-       { USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW28, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_HIDCOM, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_ULTRAMOUSE, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EARTHMATE, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD, HID_QUIRK_NOGET },
  
        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_USB_RECEIVER, HID_QUIRK_BAD_RELATIVE_KEYS },
 +      { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_USB_RECEIVER_2, HID_QUIRK_LOGITECH_S510_DESCRIPTOR },
  
        { USB_VENDOR_ID_PANTHERLORD, USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK, HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS },
  
@@@ -1043,22 -1035,6 +1037,22 @@@ static void hid_fixup_sony_ps3_controll
        kfree(buf);
  }
  
 +/*
 + * Logitech S510 keyboard sends in report #3 keys which are far
 + * above the logical maximum described in descriptor. This extends
 + * the original value of 0x28c of logical maximum to 0x104d
 + */
 +static void hid_fixup_s510_descriptor(unsigned char *rdesc, int rsize)
 +{
 +      if (rsize >= 90 && rdesc[83] == 0x26
 +                      && rdesc[84] == 0x8c
 +                      && rdesc[85] == 0x02) {
 +              info("Fixing up Logitech S510 report descriptor");
 +              rdesc[84] = rdesc[89] = 0x4d;
 +              rdesc[85] = rdesc[90] = 0x10;
 +      }
 +}
 +
  static struct hid_device *usb_hid_configure(struct usb_interface *intf)
  {
        struct usb_host_interface *interface = intf->cur_altsetting;
        int n, len, insize = 0;
        struct usbhid_device *usbhid;
  
-         /* Ignore all Wacom devices */
-         if (le16_to_cpu(dev->descriptor.idVendor) == USB_VENDOR_ID_WACOM)
-                 return NULL;
+       /* Ignore all Wacom devices */
+       if (le16_to_cpu(dev->descriptor.idVendor) == USB_VENDOR_ID_WACOM)
+               return NULL;
+       /* ignore all Code Mercenaries IOWarrior devices */
+       if (le16_to_cpu(dev->descriptor.idVendor) == USB_VENDOR_ID_CODEMERCS)
+               if (le16_to_cpu(dev->descriptor.idProduct) >= USB_DEVICE_ID_CODEMERCS_IOW_FIRST &&
+                   le16_to_cpu(dev->descriptor.idProduct) <= USB_DEVICE_ID_CODEMERCS_IOW_LAST)
+                       return NULL;
  
        for (n = 0; hid_blacklist[n].idVendor; n++)
                if ((hid_blacklist[n].idVendor == le16_to_cpu(dev->descriptor.idVendor)) &&
        if ((quirks & HID_QUIRK_CYMOTION))
                hid_fixup_cymotion_descriptor(rdesc, rsize);
  
 -#ifdef DEBUG_DATA
 +      if (quirks & HID_QUIRK_LOGITECH_S510_DESCRIPTOR)
 +              hid_fixup_s510_descriptor(rdesc, rsize);
 +
 +#ifdef CONFIG_HID_DEBUG
        printk(KERN_DEBUG __FILE__ ": report descriptor (size %u, read %d) = ", rsize, n);
        for (n = 0; n < rsize; n++)
                printk(" %02x", (unsigned char) rdesc[n]);
                         le16_to_cpu(dev->descriptor.idProduct));
  
        hid->bus = BUS_USB;
 -      hid->vendor = dev->descriptor.idVendor;
 -      hid->product = dev->descriptor.idProduct;
 +      hid->vendor = le16_to_cpu(dev->descriptor.idVendor);
 +      hid->product = le16_to_cpu(dev->descriptor.idProduct);
  
        usb_make_path(dev, hid->phys, sizeof(hid->phys));
        strlcat(hid->phys, "/input", sizeof(hid->phys));