---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
---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
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
---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
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
---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
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
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
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
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/
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));
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));
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);
}
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);
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)
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))
/* 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) },
{ }
/* 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;
}
#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
return 0;
}
++ ++EXPORT_SYMBOL_GPL(usbhid_wait_io);
static int hid_set_idle(struct usb_device *dev, int ifnum, int report, int idle)
{
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;
}
}
}
- - 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:
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)
{
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);
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;
}
{
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 */