]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge branches 'ntrig', 'picolcd', 'prodikeys' and 'roccat-kone' into for-linus
authorJiri Kosina <jkosina@suse.cz>
Wed, 19 May 2010 12:27:08 +0000 (14:27 +0200)
committerJiri Kosina <jkosina@suse.cz>
Wed, 19 May 2010 12:27:08 +0000 (14:27 +0200)
Conflicts:
drivers/hid/Makefile

1  2  3  4  5 
drivers/hid/Kconfig
drivers/hid/Makefile
drivers/hid/hid-core.c
drivers/hid/hid-ids.h
drivers/hid/usbhid/hid-core.c

diff --combined drivers/hid/Kconfig
index 4ea926a21bc8c99f6dc4a23ae47017d47a0cc871,71d4c0703629a55331aed27e12aa17cd63ffa66c,0e8aa63e3f55993204bf3892012f3df157ea03e3,26c6f10afcb880e99a24342fd177ccd3cffb05ab,44b4691fd19647be77457a5bdf3060ff68c3e406..339c1eaa55ac1d8c888df41eebba94951ffe43e4
@@@@@@ -86,12 -86,6 -86,6 -86,6 -86,6 +86,12 @@@@@@ config HID_BELKI
        ---help---
        Support for Belkin Flip KVM and Wireless keyboard.
     
 ++++config HID_CANDO
 ++++   tristate "Cando dual touch panel"
 ++++   depends on USB_HID
 ++++   ---help---
 ++++   Support for Cando dual touch panel.
 ++++
     config HID_CHERRY
        tristate "Cherry" if EMBEDDED
        depends on USB_HID
@@@@@@ -106,6 -100,6 -100,6 -100,21 -100,6 +106,21 @@@@@@ config HID_CHICON
        ---help---
        Support for Chicony Tactical pad.
     
+++ +config HID_PRODIKEYS
+++ +   tristate "Prodikeys PC-MIDI Keyboard support"
+++ +   depends on USB_HID && SND
+++ +   select SND_RAWMIDI
+++ +   ---help---
+++ +   Support for Prodikeys PC-MIDI Keyboard device support.
+++ +   Say Y here to enable support for this device.
+++ +   - Prodikeys PC-MIDI keyboard.
+++ +     The Prodikeys PC-MIDI acts as a USB Audio device, with one MIDI
+++ +     input and one MIDI output. These MIDI jacks appear as
+++ +     a sound "card" in the ALSA sound system.
+++ +     Note: if you say N here, this device will still function as a basic
+++ +     multimedia keyboard, but will lack support for the musical keyboard
+++ +     and some additional multimedia keys.
+++ +
     config HID_CYPRESS
        tristate "Cypress" if EMBEDDED
        depends on USB_HID
@@@@@@ -128,12 -122,6 -122,6 -137,6 -122,6 +143,12 @@@@@@ config DRAGONRISE_F
        Say Y here if you want to enable force feedback support for DragonRise Inc.
        game controllers.
     
 ++++config HID_EGALAX
 ++++   tristate "eGalax multi-touch panel"
 ++++   depends on USB_HID
 ++++   ---help---
 ++++   Support for the eGalax dual-touch panel
 ++++
     config HID_EZKEY
        tristate "Ezkey" if EMBEDDED
        depends on USB_HID
@@@@@@ -274,18 -262,18 -262,76 -277,18 -262,24 +289,82 @@@@@@ config HID_PETALYN
        ---help---
        Support for Petalynx Maxter remote control.
     
++ ++config HID_PICOLCD
++ ++   tristate "PicoLCD (graphic version)"
++ ++   depends on USB_HID
++ ++   ---help---
++ ++     This provides support for Minibox PicoLCD devices, currently
++ ++     only the graphical ones are supported.
++ ++
++ ++     This includes support for the following device features:
++ ++     - Keypad
++ ++     - Switching between Firmware and Flash mode
++ ++     - EEProm / Flash access     (via debugfs)
++ ++     Features selectively enabled:
++ ++     - Framebuffer for monochrome 256x64 display
++ ++     - Backlight control
++ ++     - Contrast control
++ ++     - General purpose outputs
++ ++     Features that are not (yet) supported:
++ ++     - IR
++ ++
++ ++config HID_PICOLCD_FB
++ ++   bool "Framebuffer support" if EMBEDDED
++ ++   default !EMBEDDED
++ ++   depends on HID_PICOLCD
++ ++   depends on HID_PICOLCD=FB || FB=y
++ ++   select FB_DEFERRED_IO
++ ++   select FB_SYS_FILLRECT
++ ++   select FB_SYS_COPYAREA
++ ++   select FB_SYS_IMAGEBLIT
++ ++   select FB_SYS_FOPS
++ ++   ---help---
++ ++     Provide access to PicoLCD's 256x64 monochrome display via a
++ ++     frambuffer device.
++ ++
++ ++config HID_PICOLCD_BACKLIGHT
++ ++   bool "Backlight control" if EMBEDDED
++ ++   default !EMBEDDED
++ ++   depends on HID_PICOLCD
++ ++   depends on HID_PICOLCD=BACKLIGHT_CLASS_DEVICE || BACKLIGHT_CLASS_DEVICE=y
++ ++   ---help---
++ ++     Provide access to PicoLCD's backlight control via backlight
++ ++     class.
++ ++
++ ++config HID_PICOLCD_LCD
++ ++   bool "Contrast control" if EMBEDDED
++ ++   default !EMBEDDED
++ ++   depends on HID_PICOLCD
++ ++   depends on HID_PICOLCD=LCD_CLASS_DEVICE || LCD_CLASS_DEVICE=y
++ ++   ---help---
++ ++     Provide access to PicoLCD's LCD contrast via lcd class.
++ ++
++ ++config HID_PICOLCD_LEDS
++ ++   bool "GPO via leds class" if EMBEDDED
++ ++   default !EMBEDDED
++ ++   depends on HID_PICOLCD
++ ++   depends on HID_PICOLCD=LEDS_CLASS || LEDS_CLASS=y
++ ++   ---help---
++ ++     Provide access to PicoLCD's GPO pins via leds class.
++ ++
     config HID_QUANTA
        tristate "Quanta Optical Touch"
        depends on USB_HID
        ---help---
        Support for Quanta Optical Touch dual-touch panels.
     
++++ config HID_ROCCAT_KONE
++++    tristate "Roccat Kone Mouse support"
++++    depends on USB_HID
++++    ---help---
++++    Support for Roccat Kone mouse.
++++ 
     config HID_SAMSUNG
        tristate "Samsung" if EMBEDDED
        depends on USB_HID
        default !EMBEDDED
        ---help---
 ----   Support for Samsung InfraRed remote control.
 ++++   Support for Samsung InfraRed remote control or keyboards.
     
     config HID_SONY
        tristate "Sony" if EMBEDDED
@@@@@@ -344,7 -332,7 -390,7 -347,7 -338,7 +423,7 @@@@@@ config HID_TOPSEE
        depends on USB_HID
        default !EMBEDDED
        ---help---
 ----   Say Y if you have a TopSeed Cyberlink remote control.
 ++++   Say Y if you have a TopSeed Cyberlink or BTC Emprex remote control.
     
     config HID_THRUSTMASTER
        tristate "ThrustMaster devices support" if EMBEDDED
@@@@@@ -369,14 -357,6 -415,6 -372,6 -363,6 +448,14 @@@@@@ config HID_WACO
        ---help---
        Support for Wacom Graphire Bluetooth tablet.
     
 ++++config HID_WACOM_POWER_SUPPLY
 ++++   bool "Wacom Bluetooth devices power supply status support"
 ++++   depends on HID_WACOM
 ++++   select POWER_SUPPLY
 ++++   ---help---
 ++++     Say Y here if you want to enable power supply status monitoring for
 ++++     Wacom Bluetooth devices.
 ++++
     config HID_ZEROPLUS
        tristate "Zeroplus based game controller support" if EMBEDDED
        depends on USB_HID
@@@@@@ -392,13 -372,6 -430,6 -387,6 -378,6 +471,13 @@@@@@ config ZEROPLUS_F
          Say Y here if you have a Zeroplus based game controller and want
          to have force feedback support for it.
     
 ++++config HID_ZYDACRON
 ++++   tristate "Zydacron remote control support" if EMBEDDED
 ++++   depends on USB_HID
 ++++   default !EMBEDDED
 ++++   ---help---
 ++++   Support for Zydacron remote control.
 ++++
     endmenu
     
     endif # HID_SUPPORT
diff --combined drivers/hid/Makefile
index 2e196c734d2ae1d93ded22cbe94f3f3753afc229,0b2618f092ca525b272bf10242ff4843b68cfce2,7fd1614e7e2c5c76bd7ae202b67cc29e5859fea6,f637b388030f41c0c940b68a35f1017c3cabf28a,08b83ccd9d1b505e39b884bfca83bfc3e4043d95..22e47eaeea322ffd4e64c329e0e7be6139e9321b
@@@@@@ -26,12 -26,10 -26,10 -26,10 -26,10 +26,12 @@@@@@ obj-$(CONFIG_HID_3M_PCT)        += hid-3m-pct.
     obj-$(CONFIG_HID_A4TECH)   += hid-a4tech.o
     obj-$(CONFIG_HID_APPLE)            += hid-apple.o
     obj-$(CONFIG_HID_BELKIN)   += hid-belkin.o
 ++++obj-$(CONFIG_HID_CANDO)            += hid-cando.o
     obj-$(CONFIG_HID_CHERRY)   += hid-cherry.o
     obj-$(CONFIG_HID_CHICONY)  += hid-chicony.o
     obj-$(CONFIG_HID_CYPRESS)  += hid-cypress.o
     obj-$(CONFIG_HID_DRAGONRISE)       += hid-drff.o
 ++++obj-$(CONFIG_HID_EGALAX)   += hid-egalax.o
     obj-$(CONFIG_HID_EZKEY)            += hid-ezkey.o
     obj-$(CONFIG_HID_GYRATION) += hid-gyration.o
     obj-$(CONFIG_HID_KENSINGTON)       += hid-kensington.o
@@@@@@ -43,9 -41,9 -41,10 -41,10 -41,10 +43,12 @@@@@@ obj-$(CONFIG_HID_MONTEREY)        += hid-monte
     obj-$(CONFIG_HID_MOSART)   += hid-mosart.o
     obj-$(CONFIG_HID_NTRIG)            += hid-ntrig.o
     obj-$(CONFIG_HID_ORTEK)            += hid-ortek.o
+++ +obj-$(CONFIG_HID_PRODIKEYS)        += hid-prodikeys.o
     obj-$(CONFIG_HID_QUANTA)   += hid-quanta.o
     obj-$(CONFIG_HID_PANTHERLORD)      += hid-pl.o
     obj-$(CONFIG_HID_PETALYNX) += hid-petalynx.o
++ ++obj-$(CONFIG_HID_PICOLCD)  += hid-picolcd.o
++++ obj-$(CONFIG_HID_ROCCAT_KONE)      += hid-roccat-kone.o
     obj-$(CONFIG_HID_SAMSUNG)  += hid-samsung.o
     obj-$(CONFIG_HID_SMARTJOYPLUS)     += hid-sjoy.o
     obj-$(CONFIG_HID_SONY)             += hid-sony.o
@@@@@@ -56,7 -54,6 -55,6 -55,6 -55,6 +59,7 @@@@@@ obj-$(CONFIG_HID_THRUSTMASTER)        += hid-t
     obj-$(CONFIG_HID_TOPSEED)  += hid-topseed.o
     obj-$(CONFIG_HID_TWINHAN)  += hid-twinhan.o
     obj-$(CONFIG_HID_ZEROPLUS) += hid-zpff.o
 ++++obj-$(CONFIG_HID_ZYDACRON) += hid-zydacron.o
     obj-$(CONFIG_HID_WACOM)            += hid-wacom.o
     
     obj-$(CONFIG_USB_HID)              += usbhid/
diff --combined drivers/hid/hid-core.c
index ef492d3d52ee3e9366f7c185dfed3b7a55bcddf4,143e788b729b1bdaadb4888e3568dac3a6714b0c,bb11fb460d552f10250216cd0db5541e213c051a,1c57a9391c8f2878b02b4117a7082dd6fc612841,5c5a821cd4cb3c0681e7f8e9a1d8a0767ffbe62b..e10e314d38cc8e620e2bc75ee3a3a3899d0e837b
@@@@@@ -653,9 -653,10 -653,10 -653,10 -653,10 +653,9 @@@@@@ int hid_parse_report(struct hid_device 
        if (device->driver->report_fixup)
                device->driver->report_fixup(device, start, size);
     
 ----   device->rdesc = kmalloc(size, GFP_KERNEL);
 ++++   device->rdesc = kmemdup(start, size, GFP_KERNEL);
        if (device->rdesc == NULL)
                return -ENOMEM;
 ----   memcpy(device->rdesc, start, size);
        device->rsize = size;
     
        parser = vmalloc(sizeof(struct hid_parser));
@@@@@@ -939,8 -940,13 -940,13 -940,13 -940,13 +939,8 @@@@@@ static void hid_output_field(struct hid
        unsigned count = field->report_count;
        unsigned offset = field->report_offset;
        unsigned size = field->report_size;
 ----   unsigned bitsused = offset + count * size;
        unsigned n;
     
 ----   /* make sure the unused bits in the last byte are zeros */
 ----   if (count > 0 && size > 0 && (bitsused % 8) != 0)
 ----           data[(bitsused-1)/8] &= (1 << (bitsused % 8)) - 1;
 ----
        for (n = 0; n < count; n++) {
                if (field->logical_minimum < 0) /* signed values */
                        implement(data, offset + n * size, size, s32ton(field->value[n], size));
@@@@@@ -960,7 -966,6 -966,6 -966,6 -966,6 +960,7 @@@@@@ void hid_output_report(struct hid_repor
        if (report->id > 0)
                *data++ = report->id;
     
 ++++   memset(data, 0, ((report->size - 1) >> 3) + 1);
        for (n = 0; n < report->maxfield; n++)
                hid_output_field(report->field[n], data);
     }
@@@@@@ -1038,8 -1043,8 -1043,13 -1043,8 -1043,13 +1038,8 @@@@@@ void hid_report_raw_event(struct hid_de
     
        if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event)
                hid->hiddev_report_event(hid, report);
  - -   if (hid->claimed & HID_CLAIMED_HIDRAW) {
  - -           /* numbered reports need to be passed with the report num */
  - -           if (report_enum->numbered)
  - -                   hidraw_report_event(hid, data - 1, size + 1);
  - -           else
  - -                   hidraw_report_event(hid, data, size);
  - -   }
  + +   if (hid->claimed & HID_CLAIMED_HIDRAW)
  + +           hidraw_report_event(hid, data, size);
     
        for (a = 0; a < report->maxfield; a++)
                hid_input_field(hid, report->field[a], cdata, interrupt);
@@@@@@ -1081,28 -1086,35 -1091,35 -1086,35 -1091,35 +1081,28 @@@@@@ int hid_input_report(struct hid_device 
     
        buf = kmalloc(sizeof(char) * HID_DEBUG_BUFSIZE, GFP_ATOMIC);
     
 ----   if (!buf) {
 ----           report = hid_get_report(report_enum, data);
 ++++   if (!buf)
                goto nomem;
 ----   }
 ----
 ----   snprintf(buf, HID_DEBUG_BUFSIZE - 1,
 ----                   "\nreport (size %u) (%snumbered)\n", size, report_enum->numbered ? "" : "un");
 ----   hid_debug_event(hid, buf);
 ----
 ----   report = hid_get_report(report_enum, data);
 ----   if (!report) {
 ----           kfree(buf);
 ----           return -1;
 ----   }
     
        /* dump the report */
        snprintf(buf, HID_DEBUG_BUFSIZE - 1,
 ----                   "report %d (size %u) = ", report->id, size);
 ++++                   "\nreport (size %u) (%snumbered) = ", size, report_enum->numbered ? "" : "un");
        hid_debug_event(hid, buf);
 ++++
        for (i = 0; i < size; i++) {
                snprintf(buf, HID_DEBUG_BUFSIZE - 1,
                                " %02x", data[i]);
                hid_debug_event(hid, buf);
        }
        hid_debug_event(hid, "\n");
 ----
        kfree(buf);
     
     nomem:
 ++++   report = hid_get_report(report_enum, data);
 ++++
 ++++   if (!report)
 ++++           return -1;
 ++++
        if (hdrv && hdrv->raw_event && hid_match_report(hid, report)) {
                ret = hdrv->raw_event(hid, report, data, size);
                if (ret != 0)
@@@@@@ -1155,8 -1167,6 -1172,6 -1167,6 -1172,6 +1155,8 @@@@@@ int hid_connect(struct hid_device *hdev
        unsigned int i;
        int len;
     
 ++++   if (hdev->quirks & HID_QUIRK_HIDDEV_FORCE)
 ++++           connect_mask |= (HID_CONNECT_HIDDEV_FORCE | HID_CONNECT_HIDDEV);
        if (hdev->bus != BUS_USB)
                connect_mask &= ~HID_CONNECT_HIDDEV;
        if (hid_hiddev(hdev))
@@@@@@ -1236,7 -1246,6 -1251,6 -1246,6 -1251,6 +1236,7 @@@@@@ EXPORT_SYMBOL_GPL(hid_disconnect)
     /* a list of devices for which there is a specialized driver on HID bus */
     static const struct hid_device_id hid_blacklist[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M1968) },
 ++++   { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M2256) },
        { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) },
        { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },
        { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) },
 ++++   { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE) },
 ++++   { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH) },
 ++++   { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) },
  + +   { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) },
+++ +   { HID_USB_DEVICE(USB_VENDOR_ID_CREATIVELABS, USB_DEVICE_ID_PRODIKEYS_PCMIDI) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_3) },
        { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0006) },
 ++++   { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH) },
        { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) },
        { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) },
        { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACETRAVELLER) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACENAVIGATOR) },
++ ++   { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD) },
++ ++   { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD_BOOTLOADER) },
        { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV) },
        { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE4K) },
        { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_LK6K) },
        { HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH) },
        { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN) },
++++    { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) },
 ++++   { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
        { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SMARTJOY_PLUS) },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH) },
 ++++   { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) },
 ++++   { HID_USB_DEVICE(USB_VENDOR_ID_ZYDACRON, USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL) },
     
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) },
        { }
@@@@@@ -1755,7 -1757,7 -1763,7 -1758,7 -1762,7 +1759,7 @@@@@@ int hid_add_device(struct hid_device *h
     
        /* we need to kill them here, otherwise they will stay allocated to
         * wait for coming driver */
 ----   if (hid_ignore(hdev))
 ++++   if (!(hdev->quirks & HID_QUIRK_NO_IGNORE) && hid_ignore(hdev))
                return -ENODEV;
     
        /* XXX hack, any other cleaner solution after the driver core
        dev_set_name(&hdev->dev, "%04X:%04X:%04X.%04X", hdev->bus,
                     hdev->vendor, hdev->product, atomic_inc_return(&id));
     
 ++++   hid_debug_register(hdev, dev_name(&hdev->dev));
        ret = device_add(&hdev->dev);
        if (!ret)
                hdev->status |= HID_STAT_ADDED;
 ----
 ----   hid_debug_register(hdev, dev_name(&hdev->dev));
 ++++   else
 ++++           hid_debug_unregister(hdev);
     
        return ret;
     }
diff --combined drivers/hid/hid-ids.h
index 16c2f866821a34788b4d618ba35af939f376da19,09d27649a0f7212e7948b0a2c6afdcad199001a1,783b41d8592e12d5b4a4d74f1ce461fd86e8afbe,50134431aeeed291a65d0e261f912c3c387e598d,014acfcde56221c225ee3a71dd3006aa10ab97bc..9776896cc4fc2eab0f654ffaa7ec96593c89d8ea
     
     #define USB_VENDOR_ID_3M           0x0596
     #define USB_DEVICE_ID_3M1968               0x0500
 ++++#define USB_DEVICE_ID_3M2256               0x0502
     
     #define USB_VENDOR_ID_A4TECH               0x09da
     #define USB_DEVICE_ID_A4TECH_WCP32PU       0x0006
     #define USB_VENDOR_ID_BERKSHIRE            0x0c98
     #define USB_DEVICE_ID_BERKSHIRE_PCWD       0x1140
     
 ++++#define USB_VENDOR_ID_BTC          0x046e
 ++++#define USB_DEVICE_ID_BTC_EMPREX_REMOTE    0x5578
 ++++
 ++++#define USB_VENDOR_ID_CANDO                0x2087
 ++++#define USB_DEVICE_ID_CANDO_MULTI_TOUCH 0x0a01
 ++++#define USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6 0x0b03
 ++++
     #define USB_VENDOR_ID_CH           0x068e
     #define USB_DEVICE_ID_CH_PRO_PEDALS        0x00f2
     #define USB_DEVICE_ID_CH_COMBATSTICK       0x00f4
     
     #define USB_VENDOR_ID_CHERRY               0x046a
     #define USB_DEVICE_ID_CHERRY_CYMOTION      0x0023
  + +#define USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR        0x0027
     
     #define USB_VENDOR_ID_CHIC         0x05fe
     #define USB_DEVICE_ID_CHIC_GAMEPAD 0x0014
     #define USB_DEVICE_ID_CODEMERCS_IOW_FIRST  0x1500
     #define USB_DEVICE_ID_CODEMERCS_IOW_LAST   0x15ff
     
+++ +#define USB_VENDOR_ID_CREATIVELABS 0x041e
+++ +#define USB_DEVICE_ID_PRODIKEYS_PCMIDI     0x2801
+++ +
     #define USB_VENDOR_ID_CYGNAL               0x10c4
     #define USB_DEVICE_ID_CYGNAL_RADIO_SI470X  0x818a
     
     
     #define USB_VENDOR_ID_DRAGONRISE   0x0079
     
 ++++#define USB_VENDOR_ID_DWAV         0x0eef
 ++++#define USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER       0x0001
 ++++#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH       0x480d
 ++++
     #define USB_VENDOR_ID_ELO          0x04E7
     #define USB_DEVICE_ID_ELO_TS2700   0x0020
     
     #define USB_VENDOR_ID_MICROCHIP            0x04d8
     #define USB_DEVICE_ID_PICKIT1              0x0032
     #define USB_DEVICE_ID_PICKIT2              0x0033
++ ++#define USB_DEVICE_ID_PICOLCD              0xc002
++ ++#define USB_DEVICE_ID_PICOLCD_BOOTLOADER   0xf002
     
     #define USB_VENDOR_ID_MICROSOFT            0x045e
     #define USB_DEVICE_ID_SIDEWINDER_GV        0x003b
     #define USB_VENDOR_ID_PRODIGE              0x05af
     #define USB_DEVICE_ID_PRODIGE_CORDLESS     0x3062
     
++++ #define USB_VENDOR_ID_ROCCAT               0x1e7d
++++ #define USB_DEVICE_ID_ROCCAT_KONE  0x2ced
++++ 
     #define USB_VENDOR_ID_SAITEK               0x06a3
     #define USB_DEVICE_ID_SAITEK_RUMBLEPAD     0xff17
     
     
     #define USB_VENDOR_ID_SAMSUNG              0x0419
     #define USB_DEVICE_ID_SAMSUNG_IR_REMOTE    0x0001
 ++++#define USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE   0x0600
     
     #define USB_VENDOR_ID_SONY                 0x054c
     #define USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE  0x024b
     
     #define USB_VENDOR_ID_WACOM                0x056a
     #define USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH     0x81
 ++++#define USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH      0xbd
     
     #define USB_VENDOR_ID_WISEGROUP            0x0925
     #define USB_DEVICE_ID_SMARTJOY_PLUS        0x0005
     
     #define USB_VENDOR_ID_ZEROPLUS             0x0c12
     
 ++++#define USB_VENDOR_ID_ZYDACRON     0x13EC
 ++++#define USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL      0x0006
 ++++
     #define USB_VENDOR_ID_KYE          0x0458
     #define USB_DEVICE_ID_KYE_ERGO_525V        0x0087
     #define USB_DEVICE_ID_KYE_GPEN_560 0x5003
index ca3751fd44733ed1f6cc028d2b6db970b9fded13,7b85b696fdabc372295d49234a14245ca14ba41f,17eb3ec3fbb83cf45009d60dee4ea6037ae412b4,7b85b696fdabc372295d49234a14245ca14ba41f,56d06cd8075b32f9cc6faec1f1909925f3f79c43..a9364c36c42d28b3b868050a21db22ca4a552d03
@@@@@@ -623,6 -623,6 -623,7 -623,6 -623,6 +623,7 @@@@@@ int usbhid_wait_io(struct hid_device *h
     
        return 0;
     }
++ ++EXPORT_SYMBOL_GPL(usbhid_wait_io);
     
     static int hid_set_idle(struct usb_device *dev, int ifnum, int report, int idle)
     {
@@@@@@ -807,36 -807,16 -808,16 -807,16 -807,16 +808,36 @@@@@@ static int usbhid_output_raw_report(str
        struct usb_host_interface *interface = intf->cur_altsetting;
        int ret;
     
 ----   ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
 ----           HID_REQ_SET_REPORT,
 ----           USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
 ----           ((report_type + 1) << 8) | *buf,
 ----           interface->desc.bInterfaceNumber, buf + 1, count - 1,
 ----           USB_CTRL_SET_TIMEOUT);
 ----
 ----   /* count also the report id */
 ----   if (ret > 0)
 ----           ret++;
 ++++   if (usbhid->urbout) {
 ++++           int actual_length;
 ++++           int skipped_report_id = 0;
 ++++           if (buf[0] == 0x0) {
 ++++                   /* Don't send the Report ID */
 ++++                   buf++;
 ++++                   count--;
 ++++                   skipped_report_id = 1;
 ++++           }
 ++++           ret = usb_interrupt_msg(dev, usbhid->urbout->pipe,
 ++++                   buf, count, &actual_length,
 ++++                   USB_CTRL_SET_TIMEOUT);
 ++++           /* return the number of bytes transferred */
 ++++           if (ret == 0) {
 ++++                   ret = actual_length;
 ++++                   /* count also the report id */
 ++++                   if (skipped_report_id)
 ++++                           ret++;
 ++++           }
 ++++   } else {
 ++++           ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
 ++++                   HID_REQ_SET_REPORT,
 ++++                   USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
 ++++                   ((report_type + 1) << 8) | *buf,
 ++++                   interface->desc.bInterfaceNumber, buf + 1, count - 1,
 ++++                   USB_CTRL_SET_TIMEOUT);
 ++++           /* count also the report id */
 ++++           if (ret > 0)
 ++++                   ret++;
 ++++   }
     
        return ret;
     }
@@@@@@ -1019,6 -999,6 -1000,13 -999,6 -999,13 +1020,6 @@@@@@ static int usbhid_start(struct hid_devi
                }
        }
     
  - -   init_waitqueue_head(&usbhid->wait);
  - -   INIT_WORK(&usbhid->reset_work, hid_reset);
  - -   INIT_WORK(&usbhid->restart_work, __usbhid_restart_queues);
  - -   setup_timer(&usbhid->io_retry, hid_retry_timeout, (unsigned long) hid);
  - -
  - -   spin_lock_init(&usbhid->lock);
  - -
        usbhid->urbctrl = usb_alloc_urb(0, GFP_KERNEL);
        if (!usbhid->urbctrl) {
                ret = -ENOMEM;
        /* Some keyboards don't work until their LEDs have been set.
         * Since BIOSes do set the LEDs, it must be safe for any device
         * that supports the keyboard boot protocol.
 ++++    * In addition, enable remote wakeup by default for all keyboard
 ++++    * devices supporting the boot protocol.
         */
        if (interface->desc.bInterfaceSubClass == USB_INTERFACE_SUBCLASS_BOOT &&
                        interface->desc.bInterfaceProtocol ==
 ----                           USB_INTERFACE_PROTOCOL_KEYBOARD)
 ++++                           USB_INTERFACE_PROTOCOL_KEYBOARD) {
                usbhid_set_leds(hid);
 ----
 ++++           device_set_wakeup_enable(&dev->dev, 1);
 ++++   }
        return 0;
     
     fail:
@@@@@@ -1156,7 -1133,6 -1141,6 -1133,6 -1140,6 +1157,7 @@@@@@ static int usbhid_probe(struct usb_inte
        hid->vendor = le16_to_cpu(dev->descriptor.idVendor);
        hid->product = le16_to_cpu(dev->descriptor.idProduct);
        hid->name[0] = 0;
 ++++   hid->quirks = usbhid_lookup_quirk(hid->vendor, hid->product);
        if (intf->cur_altsetting->desc.bInterfaceProtocol ==
                        USB_INTERFACE_PROTOCOL_MOUSE)
                hid->type = HID_TYPE_USBMOUSE;
        usbhid->intf = intf;
        usbhid->ifnum = interface->desc.bInterfaceNumber;
     
  + +   init_waitqueue_head(&usbhid->wait);
  + +   INIT_WORK(&usbhid->reset_work, hid_reset);
  + +   INIT_WORK(&usbhid->restart_work, __usbhid_restart_queues);
  + +   setup_timer(&usbhid->io_retry, hid_retry_timeout, (unsigned long) hid);
  + +   spin_lock_init(&usbhid->lock);
  + +
        ret = hid_add_device(hid);
        if (ret) {
                if (ret != -ENODEV)
@@@@@@ -1313,11 -1289,6 -1291,11 -1289,6 -1290,6 +1314,11 @@@@@@ static int hid_suspend(struct usb_inter
                {
                        set_bit(HID_REPORTED_IDLE, &usbhid->iofl);
                        spin_unlock_irq(&usbhid->lock);
 + ++                   if (hid->driver && hid->driver->suspend) {
 + ++                           status = hid->driver->suspend(hid, message);
 + ++                           if (status < 0)
 + ++                                   return status;
 + ++                   }
                } else {
                        usbhid_mark_busy(usbhid);
                        spin_unlock_irq(&usbhid->lock);
                }
     
        } else {
 + ++           if (hid->driver && hid->driver->suspend) {
 + ++                   status = hid->driver->suspend(hid, message);
 + ++                   if (status < 0)
 + ++                           return status;
 + ++           }
                spin_lock_irq(&usbhid->lock);
                set_bit(HID_REPORTED_IDLE, &usbhid->iofl);
                spin_unlock_irq(&usbhid->lock);
@@@@@@ -1384,11 -1350,6 -1362,11 -1350,6 -1351,6 +1385,11 @@@@@@ static int hid_resume(struct usb_interf
                hid_io_error(hid);
        usbhid_restart_queues(usbhid);
     
 + ++   if (status >= 0 && hid->driver && hid->driver->resume) {
 + ++           int ret = hid->driver->resume(hid);
 + ++           if (ret < 0)
 + ++                   status = ret;
 + ++   }
        dev_dbg(&intf->dev, "resume status %d\n", status);
        return 0;
     }
@@@@@@ -1397,16 -1358,9 -1375,16 -1358,9 -1359,9 +1398,16 @@@@@@ static int hid_reset_resume(struct usb_
     {
        struct hid_device *hid = usb_get_intfdata(intf);
        struct usbhid_device *usbhid = hid->driver_data;
 + ++   int status;
     
        clear_bit(HID_REPORTED_IDLE, &usbhid->iofl);
 - --   return hid_post_reset(intf);
 + ++   status = hid_post_reset(intf);
 + ++   if (status >= 0 && hid->driver && hid->driver->reset_resume) {
 + ++           int ret = hid->driver->reset_resume(hid);
 + ++           if (ret < 0)
 + ++                   status = ret;
 + ++   }
 + ++   return status;
     }
     
     #endif /* CONFIG_PM */