aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@woody.linux-foundation.org>2007-04-30 11:58:21 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-04-30 11:58:21 -0400
commitd6454706c382ab74e2ecad7803c434cc6bd30343 (patch)
tree2a380b28eb948d114c491f0b6799c10406030849
parent152a6a9da1bd3ed5dcbbf6ff17c7ebde0eb9a754 (diff)
parent11941a321d49cd2cafc8e64f66cbfed60fc1c691 (diff)
Merge branch 'for-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jikos/hid
* 'for-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jikos/hid: (21 commits) USB HID: don't warn on idVendor == 0 USB HID: add 'quirks' module parameter USB HID: add support for dynamically-created quirks USB HID: clarify static quirk handling as squirks USB HID: encapsulate quirk handling into hid-quirks.c USB HID: EMS USBII device needs HID_QUIRK_MULTI_INPUT HID: update copyright and authorship macro HID: introduce proper zeroing of unused bits in output reports USB HID: add support for WiseGroup MP-8800 Quad Joypad USB HID: add FF support for Logitech Force 3D Pro Joystick USB HID: numlock quirk for dell W7658 keyboard USB HID: Logitech MX3000 keyboard needs report descriptor quirk USB HID: extend quirk for Logitech S510 keyboard USB HID: usbkbd/usbmouse - handle errors when registering devices USB HID: add QUIRK_HIDDEV for Belkin Flip KVM HID: enable dead keys on a belkin wireless keyboard USB HID: Thustmaster firestorm dual power v1 support USB HID: specify explicit size for hid_blacklist.quirks USB HID: fix retry & reset logic USB HID: consolidate vendor/product ids ...
-rw-r--r--drivers/hid/Kconfig2
-rw-r--r--drivers/hid/Makefile4
-rw-r--r--drivers/hid/hid-core.c9
-rw-r--r--drivers/hid/hid-input.c27
-rw-r--r--drivers/hid/usbhid/Kconfig149
-rw-r--r--drivers/hid/usbhid/Makefile35
-rw-r--r--drivers/hid/usbhid/hid-core.c (renamed from drivers/usb/input/hid-core.c)491
-rw-r--r--drivers/hid/usbhid/hid-ff.c (renamed from drivers/usb/input/hid-ff.c)2
-rw-r--r--drivers/hid/usbhid/hid-lgff.c (renamed from drivers/usb/input/hid-lgff.c)1
-rw-r--r--drivers/hid/usbhid/hid-pidff.c (renamed from drivers/usb/input/hid-pidff.c)0
-rw-r--r--drivers/hid/usbhid/hid-plff.c (renamed from drivers/usb/input/hid-plff.c)0
-rw-r--r--drivers/hid/usbhid/hid-quirks.c681
-rw-r--r--drivers/hid/usbhid/hid-tmff.c (renamed from drivers/usb/input/hid-tmff.c)0
-rw-r--r--drivers/hid/usbhid/hid-zpff.c (renamed from drivers/usb/input/hid-zpff.c)0
-rw-r--r--drivers/hid/usbhid/hiddev.c (renamed from drivers/usb/input/hiddev.c)0
-rw-r--r--drivers/hid/usbhid/usbhid.h (renamed from drivers/usb/input/usbhid.h)0
-rw-r--r--drivers/hid/usbhid/usbkbd.c (renamed from drivers/usb/input/usbkbd.c)13
-rw-r--r--drivers/hid/usbhid/usbmouse.c (renamed from drivers/usb/input/usbmouse.c)15
-rw-r--r--drivers/usb/Makefile3
-rw-r--r--drivers/usb/input/Kconfig145
-rw-r--r--drivers/usb/input/Makefile28
-rw-r--r--include/linux/hid.h14
22 files changed, 1004 insertions, 615 deletions
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
index 850788f4dd2e..8fbe9fdac128 100644
--- a/drivers/hid/Kconfig
+++ b/drivers/hid/Kconfig
@@ -36,5 +36,7 @@ config HID_DEBUG
36 36
37 If unsure, say N 37 If unsure, say N
38 38
39source "drivers/hid/usbhid/Kconfig"
40
39endmenu 41endmenu
40 42
diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
index 52e97d8f3c95..68d1376a53fb 100644
--- a/drivers/hid/Makefile
+++ b/drivers/hid/Makefile
@@ -6,3 +6,7 @@ hid-objs := hid-core.o hid-input.o
6obj-$(CONFIG_HID) += hid.o 6obj-$(CONFIG_HID) += hid.o
7hid-$(CONFIG_HID_DEBUG) += hid-debug.o 7hid-$(CONFIG_HID_DEBUG) += hid-debug.o
8 8
9obj-$(CONFIG_USB_HID) += usbhid/
10obj-$(CONFIG_USB_MOUSE) += usbhid/
11obj-$(CONFIG_USB_KBD) += usbhid/
12
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index 1cca32f46947..62e21cc73938 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -4,7 +4,7 @@
4 * Copyright (c) 1999 Andreas Gal 4 * Copyright (c) 1999 Andreas Gal
5 * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz> 5 * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
6 * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc 6 * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
7 * Copyright (c) 2006 Jiri Kosina 7 * Copyright (c) 2006-2007 Jiri Kosina
8 */ 8 */
9 9
10/* 10/*
@@ -37,7 +37,7 @@
37 */ 37 */
38 38
39#define DRIVER_VERSION "v2.6" 39#define DRIVER_VERSION "v2.6"
40#define DRIVER_AUTHOR "Andreas Gal, Vojtech Pavlik" 40#define DRIVER_AUTHOR "Andreas Gal, Vojtech Pavlik, Jiri Kosina"
41#define DRIVER_DESC "HID core driver" 41#define DRIVER_DESC "HID core driver"
42#define DRIVER_LICENSE "GPL" 42#define DRIVER_LICENSE "GPL"
43 43
@@ -872,8 +872,13 @@ static void hid_output_field(struct hid_field *field, __u8 *data)
872 unsigned count = field->report_count; 872 unsigned count = field->report_count;
873 unsigned offset = field->report_offset; 873 unsigned offset = field->report_offset;
874 unsigned size = field->report_size; 874 unsigned size = field->report_size;
875 unsigned bitsused = offset + count * size;
875 unsigned n; 876 unsigned n;
876 877
878 /* make sure the unused bits in the last byte are zeros */
879 if (count > 0 && size > 0 && (bitsused % 8) != 0)
880 data[(bitsused-1)/8] &= (1 << (bitsused % 8)) - 1;
881
877 for (n = 0; n < count; n++) { 882 for (n = 0; n < count; n++) {
878 if (field->logical_minimum < 0) /* signed values */ 883 if (field->logical_minimum < 0) /* signed values */
879 implement(data, offset + n * size, size, s32ton(field->value[n], size)); 884 implement(data, offset + n * size, size, s32ton(field->value[n], size));
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
index c8434023ba65..a19b65ed3119 100644
--- a/drivers/hid/hid-input.c
+++ b/drivers/hid/hid-input.c
@@ -431,6 +431,15 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
431 case 0x000: goto ignore; 431 case 0x000: goto ignore;
432 case 0x034: map_key_clear(KEY_SLEEP); break; 432 case 0x034: map_key_clear(KEY_SLEEP); break;
433 case 0x036: map_key_clear(BTN_MISC); break; 433 case 0x036: map_key_clear(BTN_MISC); break;
434 /*
435 * The next three are reported by Belkin wireless
436 * keyboard (1020:0006). These values are "reserved"
437 * in HUT 1.12.
438 */
439 case 0x03a: map_key_clear(KEY_SOUND); break;
440 case 0x03b: map_key_clear(KEY_CAMERA); break;
441 case 0x03c: map_key_clear(KEY_DOCUMENTS); break;
442
434 case 0x040: map_key_clear(KEY_MENU); break; 443 case 0x040: map_key_clear(KEY_MENU); break;
435 case 0x045: map_key_clear(KEY_RADIO); break; 444 case 0x045: map_key_clear(KEY_RADIO); break;
436 445
@@ -531,10 +540,26 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
531 case 0x302: map_key_clear(KEY_PROG2); break; 540 case 0x302: map_key_clear(KEY_PROG2); break;
532 case 0x303: map_key_clear(KEY_PROG3); break; 541 case 0x303: map_key_clear(KEY_PROG3); break;
533 542
534 /* Reported on Logitech S510 wireless keyboard */ 543 /* Reported on certain Logitech wireless keyboards */
544 case 0x1001: map_key_clear(KEY_MESSENGER); break;
545 case 0x1003: map_key_clear(KEY_SOUND); break;
546 case 0x1004: map_key_clear(KEY_VIDEO); break;
547 case 0x1005: map_key_clear(KEY_AUDIO); break;
548 case 0x100a: map_key_clear(KEY_DOCUMENTS); break;
549 case 0x1011: map_key_clear(KEY_PREVIOUSSONG); break;
550 case 0x1012: map_key_clear(KEY_NEXTSONG); break;
551 case 0x1013: map_key_clear(KEY_CAMERA); break;
552 case 0x1014: map_key_clear(KEY_MESSENGER); break;
553 case 0x1015: map_key_clear(KEY_RECORD); break;
554 case 0x1016: map_key_clear(KEY_PLAYER); break;
555 case 0x1017: map_key_clear(KEY_EJECTCD); break;
556 case 0x1019: map_key_clear(KEY_PROG1); break;
557 case 0x101a: map_key_clear(KEY_PROG2); break;
558 case 0x101b: map_key_clear(KEY_PROG3); break;
535 case 0x101f: map_key_clear(KEY_ZOOMIN); break; 559 case 0x101f: map_key_clear(KEY_ZOOMIN); break;
536 case 0x1020: map_key_clear(KEY_ZOOMOUT); break; 560 case 0x1020: map_key_clear(KEY_ZOOMOUT); break;
537 case 0x1021: map_key_clear(KEY_ZOOMRESET); break; 561 case 0x1021: map_key_clear(KEY_ZOOMRESET); break;
562 case 0x1023: map_key_clear(KEY_CLOSE); break;
538 /* this one is marked as 'Rotate' */ 563 /* this one is marked as 'Rotate' */
539 case 0x1028: map_key_clear(KEY_ANGLE); break; 564 case 0x1028: map_key_clear(KEY_ANGLE); break;
540 case 0x1029: map_key_clear(KEY_SHUFFLE); break; 565 case 0x1029: map_key_clear(KEY_SHUFFLE); break;
diff --git a/drivers/hid/usbhid/Kconfig b/drivers/hid/usbhid/Kconfig
new file mode 100644
index 000000000000..7c87bdc538bc
--- /dev/null
+++ b/drivers/hid/usbhid/Kconfig
@@ -0,0 +1,149 @@
1comment "USB Input Devices"
2 depends on USB
3
4config USB_HID
5 tristate "USB Human Interface Device (full HID) support"
6 default y
7 depends on USB && INPUT
8 select HID
9 ---help---
10 Say Y here if you want full HID support to connect USB keyboards,
11 mice, joysticks, graphic tablets, or any other HID based devices
12 to your computer via USB, as well as Uninterruptible Power Supply
13 (UPS) and monitor control devices.
14
15 You can't use this driver and the HIDBP (Boot Protocol) keyboard
16 and mouse drivers at the same time. More information is available:
17 <file:Documentation/input/input.txt>.
18
19 If unsure, say Y.
20
21 To compile this driver as a module, choose M here: the
22 module will be called usbhid.
23
24comment "Input core support is needed for USB HID input layer or HIDBP support"
25 depends on USB_HID && INPUT=n
26
27config USB_HIDINPUT_POWERBOOK
28 bool "Enable support for iBook/PowerBook special keys"
29 default n
30 depends on USB_HID
31 help
32 Say Y here if you want support for the special keys (Fn, Numlock) on
33 Apple iBooks and PowerBooks.
34
35 If unsure, say N.
36
37config HID_FF
38 bool "Force feedback support (EXPERIMENTAL)"
39 depends on USB_HID && EXPERIMENTAL
40 help
41 Say Y here is you want force feedback support for a few HID devices.
42 See below for a list of supported devices.
43
44 See <file:Documentation/input/ff.txt> for a description of the force
45 feedback API.
46
47 If unsure, say N.
48
49config HID_PID
50 bool "PID device support"
51 depends on HID_FF
52 help
53 Say Y here if you have a PID-compliant device and wish to enable force
54 feedback for it. Microsoft Sidewinder Force Feedback 2 is one of such
55 devices.
56
57config LOGITECH_FF
58 bool "Logitech devices support"
59 depends on HID_FF
60 select INPUT_FF_MEMLESS if USB_HID
61 help
62 Say Y here if you have one of these devices:
63 - Logitech WingMan Cordless RumblePad
64 - Logitech WingMan Cordless RumblePad 2
65 - Logitech WingMan Force 3D
66 - Logitech Formula Force EX
67 - Logitech MOMO Force wheel
68
69 and if you want to enable force feedback for them.
70 Note: if you say N here, this device will still be supported, but without
71 force feedback.
72
73config PANTHERLORD_FF
74 bool "PantherLord USB/PS2 2in1 Adapter support"
75 depends on HID_FF
76 select INPUT_FF_MEMLESS if USB_HID
77 help
78 Say Y here if you have a PantherLord USB/PS2 2in1 Adapter and want
79 to enable force feedback support for it.
80
81config THRUSTMASTER_FF
82 bool "ThrustMaster FireStorm Dual Power 2 support (EXPERIMENTAL)"
83 depends on HID_FF && EXPERIMENTAL
84 select INPUT_FF_MEMLESS if USB_HID
85 help
86 Say Y here if you have a THRUSTMASTER FireStore Dual Power 2,
87 and want to enable force feedback support for it.
88 Note: if you say N here, this device will still be supported, but without
89 force feedback.
90
91config ZEROPLUS_FF
92 bool "Zeroplus based game controller support"
93 depends on HID_FF
94 select INPUT_FF_MEMLESS if USB_HID
95 help
96 Say Y here if you have a Zeroplus based game controller and want to
97 enable force feedback for it.
98
99config USB_HIDDEV
100 bool "/dev/hiddev raw HID device support"
101 depends on USB_HID
102 help
103 Say Y here if you want to support HID devices (from the USB
104 specification standpoint) that aren't strictly user interface
105 devices, like monitor controls and Uninterruptable Power Supplies.
106
107 This module supports these devices separately using a separate
108 event interface on /dev/usb/hiddevX (char 180:96 to 180:111).
109
110 If unsure, say Y.
111
112menu "USB HID Boot Protocol drivers"
113 depends on USB!=n && USB_HID!=y
114
115config USB_KBD
116 tristate "USB HIDBP Keyboard (simple Boot) support"
117 depends on USB && INPUT
118 ---help---
119 Say Y here only if you are absolutely sure that you don't want
120 to use the generic HID driver for your USB keyboard and prefer
121 to use the keyboard in its limited Boot Protocol mode instead.
122
123 This is almost certainly not what you want. This is mostly
124 useful for embedded applications or simple keyboards.
125
126 To compile this driver as a module, choose M here: the
127 module will be called usbkbd.
128
129 If even remotely unsure, say N.
130
131config USB_MOUSE
132 tristate "USB HIDBP Mouse (simple Boot) support"
133 depends on USB && INPUT
134 ---help---
135 Say Y here only if you are absolutely sure that you don't want
136 to use the generic HID driver for your USB mouse and prefer
137 to use the mouse in its limited Boot Protocol mode instead.
138
139 This is almost certainly not what you want. This is mostly
140 useful for embedded applications or simple mice.
141
142 To compile this driver as a module, choose M here: the
143 module will be called usbmouse.
144
145 If even remotely unsure, say N.
146
147endmenu
148
149
diff --git a/drivers/hid/usbhid/Makefile b/drivers/hid/usbhid/Makefile
new file mode 100644
index 000000000000..8e6ab5b164a2
--- /dev/null
+++ b/drivers/hid/usbhid/Makefile
@@ -0,0 +1,35 @@
1#
2# Makefile for the USB input drivers
3#
4
5# Multipart objects.
6usbhid-objs := hid-core.o hid-quirks.o
7
8# Optional parts of multipart objects.
9
10ifeq ($(CONFIG_USB_HIDDEV),y)
11 usbhid-objs += hiddev.o
12endif
13ifeq ($(CONFIG_HID_PID),y)
14 usbhid-objs += hid-pidff.o
15endif
16ifeq ($(CONFIG_LOGITECH_FF),y)
17 usbhid-objs += hid-lgff.o
18endif
19ifeq ($(CONFIG_PANTHERLORD_FF),y)
20 usbhid-objs += hid-plff.o
21endif
22ifeq ($(CONFIG_THRUSTMASTER_FF),y)
23 usbhid-objs += hid-tmff.o
24endif
25ifeq ($(CONFIG_ZEROPLUS_FF),y)
26 usbhid-objs += hid-zpff.o
27endif
28ifeq ($(CONFIG_HID_FF),y)
29 usbhid-objs += hid-ff.o
30endif
31
32obj-$(CONFIG_USB_HID) += usbhid.o
33obj-$(CONFIG_USB_KBD) += usbkbd.o
34obj-$(CONFIG_USB_MOUSE) += usbmouse.o
35
diff --git a/drivers/usb/input/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 827a75a186ba..91d610358d57 100644
--- a/drivers/usb/input/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -39,7 +39,7 @@
39 */ 39 */
40 40
41#define DRIVER_VERSION "v2.6" 41#define DRIVER_VERSION "v2.6"
42#define DRIVER_AUTHOR "Andreas Gal, Vojtech Pavlik" 42#define DRIVER_AUTHOR "Andreas Gal, Vojtech Pavlik, Jiri Kosina"
43#define DRIVER_DESC "USB HID core driver" 43#define DRIVER_DESC "USB HID core driver"
44#define DRIVER_LICENSE "GPL" 44#define DRIVER_LICENSE "GPL"
45 45
@@ -53,6 +53,13 @@ static unsigned int hid_mousepoll_interval;
53module_param_named(mousepoll, hid_mousepoll_interval, uint, 0644); 53module_param_named(mousepoll, hid_mousepoll_interval, uint, 0644);
54MODULE_PARM_DESC(mousepoll, "Polling interval of mice"); 54MODULE_PARM_DESC(mousepoll, "Polling interval of mice");
55 55
56/* Quirks specified at module load time */
57static char *quirks_param[MAX_USBHID_BOOT_QUIRKS] = { [ 0 ... (MAX_USBHID_BOOT_QUIRKS - 1) ] = NULL };
58module_param_array_named(quirks, quirks_param, charp, NULL, 0444);
59MODULE_PARM_DESC(quirks, "Add/modify USB HID quirks by specifying "
60 " quirks=vendorID:productID:quirks"
61 " where vendorID, productID, and quirks are all in"
62 " 0x-prefixed hex");
56/* 63/*
57 * Input submission and I/O error handler. 64 * Input submission and I/O error handler.
58 */ 65 */
@@ -144,6 +151,11 @@ static void hid_io_error(struct hid_device *hid)
144 if (usb_get_intfdata(usbhid->intf) == NULL) 151 if (usb_get_intfdata(usbhid->intf) == NULL)
145 goto done; 152 goto done;
146 153
154 /* If it has been a while since the last error, we'll assume
155 * this a brand new error and reset the retry timeout. */
156 if (time_after(jiffies, usbhid->stop_retry + HZ/2))
157 usbhid->retry_delay = 0;
158
147 /* When an error occurs, retry at increasing intervals */ 159 /* When an error occurs, retry at increasing intervals */
148 if (usbhid->retry_delay == 0) { 160 if (usbhid->retry_delay == 0) {
149 usbhid->retry_delay = 13; /* Then 26, 52, 104, 104, ... */ 161 usbhid->retry_delay = 13; /* Then 26, 52, 104, 104, ... */
@@ -508,12 +520,6 @@ void usbhid_close(struct hid_device *hid)
508 usb_kill_urb(usbhid->urbin); 520 usb_kill_urb(usbhid->urbin);
509} 521}
510 522
511#define USB_VENDOR_ID_PANJIT 0x134c
512
513#define USB_VENDOR_ID_TURBOX 0x062a
514#define USB_DEVICE_ID_TURBOX_KEYBOARD 0x0201
515#define USB_VENDOR_ID_CIDC 0x1677
516
517/* 523/*
518 * Initialize all reports 524 * Initialize all reports
519 */ 525 */
@@ -545,410 +551,43 @@ void usbhid_init_reports(struct hid_device *hid)
545 warn("timeout initializing reports"); 551 warn("timeout initializing reports");
546} 552}
547 553
548#define USB_VENDOR_ID_GTCO 0x078c
549#define USB_DEVICE_ID_GTCO_90 0x0090
550#define USB_DEVICE_ID_GTCO_100 0x0100
551#define USB_DEVICE_ID_GTCO_101 0x0101
552#define USB_DEVICE_ID_GTCO_103 0x0103
553#define USB_DEVICE_ID_GTCO_104 0x0104
554#define USB_DEVICE_ID_GTCO_105 0x0105
555#define USB_DEVICE_ID_GTCO_106 0x0106
556#define USB_DEVICE_ID_GTCO_107 0x0107
557#define USB_DEVICE_ID_GTCO_108 0x0108
558#define USB_DEVICE_ID_GTCO_200 0x0200
559#define USB_DEVICE_ID_GTCO_201 0x0201
560#define USB_DEVICE_ID_GTCO_202 0x0202
561#define USB_DEVICE_ID_GTCO_203 0x0203
562#define USB_DEVICE_ID_GTCO_204 0x0204
563#define USB_DEVICE_ID_GTCO_205 0x0205
564#define USB_DEVICE_ID_GTCO_206 0x0206
565#define USB_DEVICE_ID_GTCO_207 0x0207
566#define USB_DEVICE_ID_GTCO_300 0x0300
567#define USB_DEVICE_ID_GTCO_301 0x0301
568#define USB_DEVICE_ID_GTCO_302 0x0302
569#define USB_DEVICE_ID_GTCO_303 0x0303
570#define USB_DEVICE_ID_GTCO_304 0x0304
571#define USB_DEVICE_ID_GTCO_305 0x0305
572#define USB_DEVICE_ID_GTCO_306 0x0306
573#define USB_DEVICE_ID_GTCO_307 0x0307
574#define USB_DEVICE_ID_GTCO_308 0x0308
575#define USB_DEVICE_ID_GTCO_309 0x0309
576#define USB_DEVICE_ID_GTCO_400 0x0400
577#define USB_DEVICE_ID_GTCO_401 0x0401
578#define USB_DEVICE_ID_GTCO_402 0x0402
579#define USB_DEVICE_ID_GTCO_403 0x0403
580#define USB_DEVICE_ID_GTCO_404 0x0404
581#define USB_DEVICE_ID_GTCO_405 0x0405
582#define USB_DEVICE_ID_GTCO_500 0x0500
583#define USB_DEVICE_ID_GTCO_501 0x0501
584#define USB_DEVICE_ID_GTCO_502 0x0502
585#define USB_DEVICE_ID_GTCO_503 0x0503
586#define USB_DEVICE_ID_GTCO_504 0x0504
587#define USB_DEVICE_ID_GTCO_1000 0x1000
588#define USB_DEVICE_ID_GTCO_1001 0x1001
589#define USB_DEVICE_ID_GTCO_1002 0x1002
590#define USB_DEVICE_ID_GTCO_1003 0x1003
591#define USB_DEVICE_ID_GTCO_1004 0x1004
592#define USB_DEVICE_ID_GTCO_1005 0x1005
593#define USB_DEVICE_ID_GTCO_1006 0x1006
594
595#define USB_VENDOR_ID_WACOM 0x056a
596
597#define USB_VENDOR_ID_ACECAD 0x0460
598#define USB_DEVICE_ID_ACECAD_FLAIR 0x0004
599#define USB_DEVICE_ID_ACECAD_302 0x0008
600
601#define USB_VENDOR_ID_KBGEAR 0x084e
602#define USB_DEVICE_ID_KBGEAR_JAMSTUDIO 0x1001
603
604#define USB_VENDOR_ID_AIPTEK 0x08ca
605#define USB_DEVICE_ID_AIPTEK_01 0x0001
606#define USB_DEVICE_ID_AIPTEK_10 0x0010
607#define USB_DEVICE_ID_AIPTEK_20 0x0020
608#define USB_DEVICE_ID_AIPTEK_21 0x0021
609#define USB_DEVICE_ID_AIPTEK_22 0x0022
610#define USB_DEVICE_ID_AIPTEK_23 0x0023
611#define USB_DEVICE_ID_AIPTEK_24 0x0024
612
613#define USB_VENDOR_ID_GRIFFIN 0x077d
614#define USB_DEVICE_ID_POWERMATE 0x0410
615#define USB_DEVICE_ID_SOUNDKNOB 0x04AA
616
617#define USB_VENDOR_ID_ATEN 0x0557
618#define USB_DEVICE_ID_ATEN_UC100KM 0x2004
619#define USB_DEVICE_ID_ATEN_CS124U 0x2202
620#define USB_DEVICE_ID_ATEN_2PORTKVM 0x2204
621#define USB_DEVICE_ID_ATEN_4PORTKVM 0x2205
622#define USB_DEVICE_ID_ATEN_4PORTKVMC 0x2208
623
624#define USB_VENDOR_ID_TOPMAX 0x0663
625#define USB_DEVICE_ID_TOPMAX_COBRAPAD 0x0103
626
627#define USB_VENDOR_ID_HAPP 0x078b
628#define USB_DEVICE_ID_UGCI_DRIVING 0x0010
629#define USB_DEVICE_ID_UGCI_FLYING 0x0020
630#define USB_DEVICE_ID_UGCI_FIGHTING 0x0030
631
632#define USB_VENDOR_ID_MGE 0x0463
633#define USB_DEVICE_ID_MGE_UPS 0xffff
634#define USB_DEVICE_ID_MGE_UPS1 0x0001
635
636#define USB_VENDOR_ID_ONTRAK 0x0a07
637#define USB_DEVICE_ID_ONTRAK_ADU100 0x0064
638
639#define USB_VENDOR_ID_ESSENTIAL_REALITY 0x0d7f
640#define USB_DEVICE_ID_ESSENTIAL_REALITY_P5 0x0100
641
642#define USB_VENDOR_ID_A4TECH 0x09da
643#define USB_DEVICE_ID_A4TECH_WCP32PU 0x0006
644
645#define USB_VENDOR_ID_AASHIMA 0x06d6
646#define USB_DEVICE_ID_AASHIMA_GAMEPAD 0x0025
647#define USB_DEVICE_ID_AASHIMA_PREDATOR 0x0026
648
649#define USB_VENDOR_ID_CYPRESS 0x04b4
650#define USB_DEVICE_ID_CYPRESS_MOUSE 0x0001
651#define USB_DEVICE_ID_CYPRESS_HIDCOM 0x5500
652#define USB_DEVICE_ID_CYPRESS_ULTRAMOUSE 0x7417
653
654#define USB_VENDOR_ID_BERKSHIRE 0x0c98
655#define USB_DEVICE_ID_BERKSHIRE_PCWD 0x1140
656
657#define USB_VENDOR_ID_ALPS 0x0433
658#define USB_DEVICE_ID_IBM_GAMEPAD 0x1101
659
660#define USB_VENDOR_ID_SAITEK 0x06a3
661#define USB_DEVICE_ID_SAITEK_RUMBLEPAD 0xff17
662
663#define USB_VENDOR_ID_NEC 0x073e
664#define USB_DEVICE_ID_NEC_USB_GAME_PAD 0x0301
665
666#define USB_VENDOR_ID_CHIC 0x05fe
667#define USB_DEVICE_ID_CHIC_GAMEPAD 0x0014
668
669#define USB_VENDOR_ID_GLAB 0x06c2
670#define USB_DEVICE_ID_4_PHIDGETSERVO_30 0x0038
671#define USB_DEVICE_ID_1_PHIDGETSERVO_30 0x0039
672#define USB_DEVICE_ID_0_0_4_IF_KIT 0x0040
673#define USB_DEVICE_ID_0_16_16_IF_KIT 0x0044
674#define USB_DEVICE_ID_8_8_8_IF_KIT 0x0045
675#define USB_DEVICE_ID_0_8_7_IF_KIT 0x0051
676#define USB_DEVICE_ID_0_8_8_IF_KIT 0x0053
677#define USB_DEVICE_ID_PHIDGET_MOTORCONTROL 0x0058
678
679#define USB_VENDOR_ID_WISEGROUP 0x0925
680#define USB_DEVICE_ID_1_PHIDGETSERVO_20 0x8101
681#define USB_DEVICE_ID_4_PHIDGETSERVO_20 0x8104
682#define USB_DEVICE_ID_8_8_4_IF_KIT 0x8201
683#define USB_DEVICE_ID_DUAL_USB_JOYPAD 0x8866
684
685#define USB_VENDOR_ID_WISEGROUP_LTD 0x6677
686#define USB_DEVICE_ID_SMARTJOY_DUAL_PLUS 0x8802
687
688#define USB_VENDOR_ID_CODEMERCS 0x07c0
689#define USB_DEVICE_ID_CODEMERCS_IOW_FIRST 0x1500
690#define USB_DEVICE_ID_CODEMERCS_IOW_LAST 0x15ff
691
692#define USB_VENDOR_ID_DELORME 0x1163
693#define USB_DEVICE_ID_DELORME_EARTHMATE 0x0100
694#define USB_DEVICE_ID_DELORME_EM_LT20 0x0200
695
696#define USB_VENDOR_ID_MCC 0x09db
697#define USB_DEVICE_ID_MCC_PMD1024LS 0x0076
698#define USB_DEVICE_ID_MCC_PMD1208LS 0x007a
699
700#define USB_VENDOR_ID_VERNIER 0x08f7
701#define USB_DEVICE_ID_VERNIER_LABPRO 0x0001
702#define USB_DEVICE_ID_VERNIER_GOTEMP 0x0002
703#define USB_DEVICE_ID_VERNIER_SKIP 0x0003
704#define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004
705
706#define USB_VENDOR_ID_LD 0x0f11
707#define USB_DEVICE_ID_LD_CASSY 0x1000
708#define USB_DEVICE_ID_LD_POCKETCASSY 0x1010
709#define USB_DEVICE_ID_LD_MOBILECASSY 0x1020
710#define USB_DEVICE_ID_LD_JWM 0x1080
711#define USB_DEVICE_ID_LD_DMMP 0x1081
712#define USB_DEVICE_ID_LD_UMIP 0x1090
713#define USB_DEVICE_ID_LD_XRAY1 0x1100
714#define USB_DEVICE_ID_LD_XRAY2 0x1101
715#define USB_DEVICE_ID_LD_VIDEOCOM 0x1200
716#define USB_DEVICE_ID_LD_COM3LAB 0x2000
717#define USB_DEVICE_ID_LD_TELEPORT 0x2010
718#define USB_DEVICE_ID_LD_NETWORKANALYSER 0x2020
719#define USB_DEVICE_ID_LD_POWERCONTROL 0x2030
720#define USB_DEVICE_ID_LD_MACHINETEST 0x2040
721
722#define USB_VENDOR_ID_APPLE 0x05ac
723#define USB_DEVICE_ID_APPLE_MIGHTYMOUSE 0x0304
724#define USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI 0x020e
725#define USB_DEVICE_ID_APPLE_FOUNTAIN_ISO 0x020f
726#define USB_DEVICE_ID_APPLE_GEYSER_ANSI 0x0214
727#define USB_DEVICE_ID_APPLE_GEYSER_ISO 0x0215
728#define USB_DEVICE_ID_APPLE_GEYSER_JIS 0x0216
729#define USB_DEVICE_ID_APPLE_GEYSER3_ANSI 0x0217
730#define USB_DEVICE_ID_APPLE_GEYSER3_ISO 0x0218
731#define USB_DEVICE_ID_APPLE_GEYSER3_JIS 0x0219
732#define USB_DEVICE_ID_APPLE_GEYSER4_ANSI 0x021a
733#define USB_DEVICE_ID_APPLE_GEYSER4_ISO 0x021b
734#define USB_DEVICE_ID_APPLE_GEYSER4_JIS 0x021c
735#define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a
736#define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b
737#define USB_DEVICE_ID_APPLE_IR 0x8240
738
739#define USB_VENDOR_ID_CHERRY 0x046a
740#define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023
741
742#define USB_VENDOR_ID_YEALINK 0x6993
743#define USB_DEVICE_ID_YEALINK_P1K_P4K_B2K 0xb001
744
745#define USB_VENDOR_ID_ALCOR 0x058f
746#define USB_DEVICE_ID_ALCOR_USBRS232 0x9720
747
748#define USB_VENDOR_ID_SUN 0x0430
749#define USB_DEVICE_ID_RARITAN_KVM_DONGLE 0xcdab
750
751#define USB_VENDOR_ID_AIRCABLE 0x16CA
752#define USB_DEVICE_ID_AIRCABLE1 0x1502
753
754#define USB_VENDOR_ID_LOGITECH 0x046d
755#define USB_DEVICE_ID_LOGITECH_USB_RECEIVER 0xc101
756#define USB_DEVICE_ID_LOGITECH_USB_RECEIVER_2 0xc517
757#define USB_DEVICE_ID_DINOVO_EDGE 0xc714
758
759#define USB_VENDOR_ID_IMATION 0x0718
760#define USB_DEVICE_ID_DISC_STAKKA 0xd000
761
762#define USB_VENDOR_ID_PANTHERLORD 0x0810
763#define USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK 0x0001
764
765#define USB_VENDOR_ID_SONY 0x054c
766#define USB_DEVICE_ID_SONY_PS3_CONTROLLER 0x0268
767
768/* 554/*
769 * Alphabetically sorted blacklist by quirk type. 555 * Reset LEDs which BIOS might have left on. For now, just NumLock (0x01).
770 */ 556 */
557static int hid_find_field_early(struct hid_device *hid, unsigned int page,
558 unsigned int hid_code, struct hid_field **pfield)
559{
560 struct hid_report *report;
561 struct hid_field *field;
562 struct hid_usage *usage;
563 int i, j;
564
565 list_for_each_entry(report, &hid->report_enum[HID_OUTPUT_REPORT].report_list, list) {
566 for (i = 0; i < report->maxfield; i++) {
567 field = report->field[i];
568 for (j = 0; j < field->maxusage; j++) {
569 usage = &field->usage[j];
570 if ((usage->hid & HID_USAGE_PAGE) == page &&
571 (usage->hid & 0xFFFF) == hid_code) {
572 *pfield = field;
573 return j;
574 }
575 }
576 }
577 }
578 return -1;
579}
771 580
772static const struct hid_blacklist { 581static void usbhid_set_leds(struct hid_device *hid)
773 __u16 idVendor; 582{
774 __u16 idProduct; 583 struct hid_field *field;
775 unsigned quirks; 584 int offset;
776} hid_blacklist[] = { 585
777 586 if ((offset = hid_find_field_early(hid, HID_UP_LED, 0x01, &field)) != -1) {
778 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_EDGE, HID_QUIRK_DUPLICATE_USAGES }, 587 hid_set_field(field, offset, 0);
779 588 usbhid_submit_report(hid, field->report, USB_DIR_OUT);
780 { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_01, HID_QUIRK_IGNORE }, 589 }
781 { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_10, HID_QUIRK_IGNORE }, 590}
782 { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_20, HID_QUIRK_IGNORE },
783 { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_21, HID_QUIRK_IGNORE },
784 { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_22, HID_QUIRK_IGNORE },
785 { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_23, HID_QUIRK_IGNORE },
786 { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_24, HID_QUIRK_IGNORE },
787 { USB_VENDOR_ID_AIRCABLE, USB_DEVICE_ID_AIRCABLE1, HID_QUIRK_IGNORE },
788 { USB_VENDOR_ID_ALCOR, USB_DEVICE_ID_ALCOR_USBRS232, HID_QUIRK_IGNORE },
789 { USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD, HID_QUIRK_IGNORE },
790 { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_HIDCOM, HID_QUIRK_IGNORE },
791 { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_ULTRAMOUSE, HID_QUIRK_IGNORE },
792 { USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EARTHMATE, HID_QUIRK_IGNORE },
793 { USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20, HID_QUIRK_IGNORE },
794 { USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5, HID_QUIRK_IGNORE },
795 { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_4_PHIDGETSERVO_30, HID_QUIRK_IGNORE },
796 { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_1_PHIDGETSERVO_30, HID_QUIRK_IGNORE },
797 { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_0_4_IF_KIT, HID_QUIRK_IGNORE },
798 { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_16_16_IF_KIT, HID_QUIRK_IGNORE },
799 { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_8_8_8_IF_KIT, HID_QUIRK_IGNORE },
800 { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_8_7_IF_KIT, HID_QUIRK_IGNORE },
801 { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_8_8_IF_KIT, HID_QUIRK_IGNORE },
802 { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_PHIDGET_MOTORCONTROL, HID_QUIRK_IGNORE },
803 { USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_POWERMATE, HID_QUIRK_IGNORE },
804 { USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_SOUNDKNOB, HID_QUIRK_IGNORE },
805 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_90, HID_QUIRK_IGNORE },
806 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_100, HID_QUIRK_IGNORE },
807 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_101, HID_QUIRK_IGNORE },
808 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_103, HID_QUIRK_IGNORE },
809 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_104, HID_QUIRK_IGNORE },
810 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_105, HID_QUIRK_IGNORE },
811 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_106, HID_QUIRK_IGNORE },
812 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_107, HID_QUIRK_IGNORE },
813 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_108, HID_QUIRK_IGNORE },
814 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_200, HID_QUIRK_IGNORE },
815 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_201, HID_QUIRK_IGNORE },
816 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_202, HID_QUIRK_IGNORE },
817 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_203, HID_QUIRK_IGNORE },
818 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_204, HID_QUIRK_IGNORE },
819 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_205, HID_QUIRK_IGNORE },
820 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_206, HID_QUIRK_IGNORE },
821 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_207, HID_QUIRK_IGNORE },
822 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_300, HID_QUIRK_IGNORE },
823 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_301, HID_QUIRK_IGNORE },
824 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_302, HID_QUIRK_IGNORE },
825 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_303, HID_QUIRK_IGNORE },
826 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_304, HID_QUIRK_IGNORE },
827 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_305, HID_QUIRK_IGNORE },
828 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_306, HID_QUIRK_IGNORE },
829 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_307, HID_QUIRK_IGNORE },
830 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_308, HID_QUIRK_IGNORE },
831 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_309, HID_QUIRK_IGNORE },
832 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_400, HID_QUIRK_IGNORE },
833 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_401, HID_QUIRK_IGNORE },
834 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_402, HID_QUIRK_IGNORE },
835 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_403, HID_QUIRK_IGNORE },
836 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_404, HID_QUIRK_IGNORE },
837 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_405, HID_QUIRK_IGNORE },
838 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_500, HID_QUIRK_IGNORE },
839 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_501, HID_QUIRK_IGNORE },
840 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_502, HID_QUIRK_IGNORE },
841 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_503, HID_QUIRK_IGNORE },
842 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_504, HID_QUIRK_IGNORE },
843 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1000, HID_QUIRK_IGNORE },
844 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1001, HID_QUIRK_IGNORE },
845 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1002, HID_QUIRK_IGNORE },
846 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1003, HID_QUIRK_IGNORE },
847 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1004, HID_QUIRK_IGNORE },
848 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1005, HID_QUIRK_IGNORE },
849 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1006, HID_QUIRK_IGNORE },
850 { USB_VENDOR_ID_IMATION, USB_DEVICE_ID_DISC_STAKKA, HID_QUIRK_IGNORE },
851 { USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO, HID_QUIRK_IGNORE },
852 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY, HID_QUIRK_IGNORE },
853 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY, HID_QUIRK_IGNORE },
854 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY, HID_QUIRK_IGNORE },
855 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM, HID_QUIRK_IGNORE },
856 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP, HID_QUIRK_IGNORE },
857 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP, HID_QUIRK_IGNORE },
858 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY1, HID_QUIRK_IGNORE },
859 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY2, HID_QUIRK_IGNORE },
860 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_VIDEOCOM, HID_QUIRK_IGNORE },
861 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_COM3LAB, HID_QUIRK_IGNORE },
862 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_TELEPORT, HID_QUIRK_IGNORE },
863 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_NETWORKANALYSER, HID_QUIRK_IGNORE },
864 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERCONTROL, HID_QUIRK_IGNORE },
865 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETEST, HID_QUIRK_IGNORE },
866 { USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1024LS, HID_QUIRK_IGNORE },
867 { USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1208LS, HID_QUIRK_IGNORE },
868 { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_IGNORE },
869 { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS1, HID_QUIRK_IGNORE },
870 { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100, HID_QUIRK_IGNORE },
871 { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 20, HID_QUIRK_IGNORE },
872 { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 30, HID_QUIRK_IGNORE },
873 { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 100, HID_QUIRK_IGNORE },
874 { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 108, HID_QUIRK_IGNORE },
875 { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 118, HID_QUIRK_IGNORE },
876 { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 200, HID_QUIRK_IGNORE },
877 { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 300, HID_QUIRK_IGNORE },
878 { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 400, HID_QUIRK_IGNORE },
879 { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 500, HID_QUIRK_IGNORE },
880 { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LABPRO, HID_QUIRK_IGNORE },
881 { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP, HID_QUIRK_IGNORE },
882 { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP, HID_QUIRK_IGNORE },
883 { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS, HID_QUIRK_IGNORE },
884 { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_4_PHIDGETSERVO_20, HID_QUIRK_IGNORE },
885 { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20, HID_QUIRK_IGNORE },
886 { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_8_8_4_IF_KIT, HID_QUIRK_IGNORE },
887 { USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K, HID_QUIRK_IGNORE },
888
889 { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_FLAIR, HID_QUIRK_IGNORE },
890 { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_302, HID_QUIRK_IGNORE },
891
892 { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_UC100KM, HID_QUIRK_NOGET },
893 { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS124U, HID_QUIRK_NOGET },
894 { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_2PORTKVM, HID_QUIRK_NOGET },
895 { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM, HID_QUIRK_NOGET },
896 { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC, HID_QUIRK_NOGET },
897 { USB_VENDOR_ID_SUN, USB_DEVICE_ID_RARITAN_KVM_DONGLE, HID_QUIRK_NOGET },
898 { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
899 { USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
900
901 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE, HID_QUIRK_MIGHTYMOUSE | HID_QUIRK_INVERT_HWHEEL },
902 { USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU, HID_QUIRK_2WHEEL_MOUSE_HACK_7 },
903 { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE, HID_QUIRK_2WHEEL_MOUSE_HACK_5 },
904
905 { USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_GAMEPAD, HID_QUIRK_BADPAD },
906 { USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_PREDATOR, HID_QUIRK_BADPAD },
907 { USB_VENDOR_ID_ALPS, USB_DEVICE_ID_IBM_GAMEPAD, HID_QUIRK_BADPAD },
908 { USB_VENDOR_ID_CHIC, USB_DEVICE_ID_CHIC_GAMEPAD, HID_QUIRK_BADPAD },
909 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_DRIVING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
910 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FLYING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
911 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FIGHTING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
912 { USB_VENDOR_ID_NEC, USB_DEVICE_ID_NEC_USB_GAME_PAD, HID_QUIRK_BADPAD },
913 { USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RUMBLEPAD, HID_QUIRK_BADPAD },
914 { USB_VENDOR_ID_TOPMAX, USB_DEVICE_ID_TOPMAX_COBRAPAD, HID_QUIRK_BADPAD },
915
916 { USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION, HID_QUIRK_CYMOTION },
917
918 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
919 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
920 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
921 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_POWERBOOK_ISO_KEYBOARD},
922 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
923 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
924 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_POWERBOOK_ISO_KEYBOARD},
925 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
926 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
927 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_POWERBOOK_ISO_KEYBOARD},
928 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
929 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
930 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
931
932 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IR, HID_QUIRK_IGNORE },
933
934 { USB_VENDOR_ID_PANJIT, 0x0001, HID_QUIRK_IGNORE },
935 { USB_VENDOR_ID_PANJIT, 0x0002, HID_QUIRK_IGNORE },
936 { USB_VENDOR_ID_PANJIT, 0x0003, HID_QUIRK_IGNORE },
937 { USB_VENDOR_ID_PANJIT, 0x0004, HID_QUIRK_IGNORE },
938
939 { USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD, HID_QUIRK_NOGET },
940
941 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_USB_RECEIVER, HID_QUIRK_BAD_RELATIVE_KEYS },
942 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_USB_RECEIVER_2, HID_QUIRK_LOGITECH_S510_DESCRIPTOR },
943
944 { USB_VENDOR_ID_PANTHERLORD, USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK, HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS },
945
946 { USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER, HID_QUIRK_SONY_PS3_CONTROLLER },
947
948 { USB_VENDOR_ID_CIDC, 0x0103, HID_QUIRK_IGNORE },
949
950 { 0, 0 }
951};
952 591
953/* 592/*
954 * Traverse the supplied list of reports and find the longest 593 * Traverse the supplied list of reports and find the longest
@@ -1038,16 +677,16 @@ static void hid_fixup_sony_ps3_controller(struct usb_device *dev, int ifnum)
1038} 677}
1039 678
1040/* 679/*
1041 * Logitech S510 keyboard sends in report #3 keys which are far 680 * Certain Logitech keyboards send in report #3 keys which are far
1042 * above the logical maximum described in descriptor. This extends 681 * above the logical maximum described in descriptor. This extends
1043 * the original value of 0x28c of logical maximum to 0x104d 682 * the original value of 0x28c of logical maximum to 0x104d
1044 */ 683 */
1045static void hid_fixup_s510_descriptor(unsigned char *rdesc, int rsize) 684static void hid_fixup_logitech_descriptor(unsigned char *rdesc, int rsize)
1046{ 685{
1047 if (rsize >= 90 && rdesc[83] == 0x26 686 if (rsize >= 90 && rdesc[83] == 0x26
1048 && rdesc[84] == 0x8c 687 && rdesc[84] == 0x8c
1049 && rdesc[85] == 0x02) { 688 && rdesc[85] == 0x02) {
1050 info("Fixing up Logitech S510 report descriptor"); 689 info("Fixing up Logitech keyboard report descriptor");
1051 rdesc[84] = rdesc[89] = 0x4d; 690 rdesc[84] = rdesc[89] = 0x4d;
1052 rdesc[85] = rdesc[90] = 0x10; 691 rdesc[85] = rdesc[90] = 0x10;
1053 } 692 }
@@ -1059,24 +698,14 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
1059 struct usb_device *dev = interface_to_usbdev (intf); 698 struct usb_device *dev = interface_to_usbdev (intf);
1060 struct hid_descriptor *hdesc; 699 struct hid_descriptor *hdesc;
1061 struct hid_device *hid; 700 struct hid_device *hid;
1062 unsigned quirks = 0, rsize = 0; 701 u32 quirks = 0;
702 unsigned rsize = 0;
1063 char *rdesc; 703 char *rdesc;
1064 int n, len, insize = 0; 704 int n, len, insize = 0;
1065 struct usbhid_device *usbhid; 705 struct usbhid_device *usbhid;
1066 706
1067 /* Ignore all Wacom devices */ 707 quirks = usbhid_lookup_quirk(le16_to_cpu(dev->descriptor.idVendor),
1068 if (le16_to_cpu(dev->descriptor.idVendor) == USB_VENDOR_ID_WACOM) 708 le16_to_cpu(dev->descriptor.idProduct));
1069 return NULL;
1070 /* ignore all Code Mercenaries IOWarrior devices */
1071 if (le16_to_cpu(dev->descriptor.idVendor) == USB_VENDOR_ID_CODEMERCS)
1072 if (le16_to_cpu(dev->descriptor.idProduct) >= USB_DEVICE_ID_CODEMERCS_IOW_FIRST &&
1073 le16_to_cpu(dev->descriptor.idProduct) <= USB_DEVICE_ID_CODEMERCS_IOW_LAST)
1074 return NULL;
1075
1076 for (n = 0; hid_blacklist[n].idVendor; n++)
1077 if ((hid_blacklist[n].idVendor == le16_to_cpu(dev->descriptor.idVendor)) &&
1078 (hid_blacklist[n].idProduct == le16_to_cpu(dev->descriptor.idProduct)))
1079 quirks = hid_blacklist[n].quirks;
1080 709
1081 /* Many keyboards and mice don't like to be polled for reports, 710 /* Many keyboards and mice don't like to be polled for reports,
1082 * so we will always set the HID_QUIRK_NOGET flag for them. */ 711 * so we will always set the HID_QUIRK_NOGET flag for them. */
@@ -1126,8 +755,8 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
1126 if ((quirks & HID_QUIRK_CYMOTION)) 755 if ((quirks & HID_QUIRK_CYMOTION))
1127 hid_fixup_cymotion_descriptor(rdesc, rsize); 756 hid_fixup_cymotion_descriptor(rdesc, rsize);
1128 757
1129 if (quirks & HID_QUIRK_LOGITECH_S510_DESCRIPTOR) 758 if (quirks & HID_QUIRK_LOGITECH_DESCRIPTOR)
1130 hid_fixup_s510_descriptor(rdesc, rsize); 759 hid_fixup_logitech_descriptor(rdesc, rsize);
1131 760
1132#ifdef CONFIG_HID_DEBUG 761#ifdef CONFIG_HID_DEBUG
1133 printk(KERN_DEBUG __FILE__ ": report descriptor (size %u, read %d) = ", rsize, n); 762 printk(KERN_DEBUG __FILE__ ": report descriptor (size %u, read %d) = ", rsize, n);
@@ -1334,6 +963,8 @@ static int hid_probe(struct usb_interface *intf, const struct usb_device_id *id)
1334 963
1335 usbhid_init_reports(hid); 964 usbhid_init_reports(hid);
1336 hid_dump_device(hid); 965 hid_dump_device(hid);
966 if (hid->quirks & HID_QUIRK_RESET_LEDS)
967 usbhid_set_leds(hid);
1337 968
1338 if (!hidinput_connect(hid)) 969 if (!hidinput_connect(hid))
1339 hid->claimed |= HID_CLAIMED_INPUT; 970 hid->claimed |= HID_CLAIMED_INPUT;
@@ -1448,6 +1079,9 @@ static struct usb_driver hid_driver = {
1448static int __init hid_init(void) 1079static int __init hid_init(void)
1449{ 1080{
1450 int retval; 1081 int retval;
1082 retval = usbhid_quirks_init(quirks_param);
1083 if (retval)
1084 goto usbhid_quirks_init_fail;
1451 retval = hiddev_init(); 1085 retval = hiddev_init();
1452 if (retval) 1086 if (retval)
1453 goto hiddev_init_fail; 1087 goto hiddev_init_fail;
@@ -1460,6 +1094,8 @@ static int __init hid_init(void)
1460usb_register_fail: 1094usb_register_fail:
1461 hiddev_exit(); 1095 hiddev_exit();
1462hiddev_init_fail: 1096hiddev_init_fail:
1097 usbhid_quirks_exit();
1098usbhid_quirks_init_fail:
1463 return retval; 1099 return retval;
1464} 1100}
1465 1101
@@ -1467,6 +1103,7 @@ static void __exit hid_exit(void)
1467{ 1103{
1468 usb_deregister(&hid_driver); 1104 usb_deregister(&hid_driver);
1469 hiddev_exit(); 1105 hiddev_exit();
1106 usbhid_quirks_exit();
1470} 1107}
1471 1108
1472module_init(hid_init); 1109module_init(hid_init);
diff --git a/drivers/usb/input/hid-ff.c b/drivers/hid/usbhid/hid-ff.c
index e431faaa6abc..23431fbbc3d7 100644
--- a/drivers/usb/input/hid-ff.c
+++ b/drivers/hid/usbhid/hid-ff.c
@@ -56,6 +56,7 @@ static struct hid_ff_initializer inits[] = {
56 { 0x46d, 0xc211, hid_lgff_init }, /* Logitech Cordless rumble pad */ 56 { 0x46d, 0xc211, hid_lgff_init }, /* Logitech Cordless rumble pad */
57 { 0x46d, 0xc219, hid_lgff_init }, /* Logitech Cordless rumble pad 2 */ 57 { 0x46d, 0xc219, hid_lgff_init }, /* Logitech Cordless rumble pad 2 */
58 { 0x46d, 0xc283, hid_lgff_init }, /* Logitech Wingman Force 3d */ 58 { 0x46d, 0xc283, hid_lgff_init }, /* Logitech Wingman Force 3d */
59 { 0x46d, 0xc286, hid_lgff_init }, /* Logitech Force 3D Pro Joystick */
59 { 0x46d, 0xc294, hid_lgff_init }, /* Logitech Formula Force EX */ 60 { 0x46d, 0xc294, hid_lgff_init }, /* Logitech Formula Force EX */
60 { 0x46d, 0xc295, hid_lgff_init }, /* Logitech MOMO force wheel */ 61 { 0x46d, 0xc295, hid_lgff_init }, /* Logitech MOMO force wheel */
61 { 0x46d, 0xca03, hid_lgff_init }, /* Logitech MOMO force wheel */ 62 { 0x46d, 0xca03, hid_lgff_init }, /* Logitech MOMO force wheel */
@@ -64,6 +65,7 @@ static struct hid_ff_initializer inits[] = {
64 { 0x810, 0x0001, hid_plff_init }, 65 { 0x810, 0x0001, hid_plff_init },
65#endif 66#endif
66#ifdef CONFIG_THRUSTMASTER_FF 67#ifdef CONFIG_THRUSTMASTER_FF
68 { 0x44f, 0xb300, hid_tmff_init },
67 { 0x44f, 0xb304, hid_tmff_init }, 69 { 0x44f, 0xb304, hid_tmff_init },
68#endif 70#endif
69#ifdef CONFIG_ZEROPLUS_FF 71#ifdef CONFIG_ZEROPLUS_FF
diff --git a/drivers/usb/input/hid-lgff.c b/drivers/hid/usbhid/hid-lgff.c
index e6f3af3e66d1..92d2553f17b6 100644
--- a/drivers/usb/input/hid-lgff.c
+++ b/drivers/hid/usbhid/hid-lgff.c
@@ -52,6 +52,7 @@ static const struct dev_type devices[] = {
52 { 0x046d, 0xc211, ff_rumble }, 52 { 0x046d, 0xc211, ff_rumble },
53 { 0x046d, 0xc219, ff_rumble }, 53 { 0x046d, 0xc219, ff_rumble },
54 { 0x046d, 0xc283, ff_joystick }, 54 { 0x046d, 0xc283, ff_joystick },
55 { 0x046d, 0xc286, ff_joystick },
55 { 0x046d, 0xc294, ff_joystick }, 56 { 0x046d, 0xc294, ff_joystick },
56 { 0x046d, 0xc295, ff_joystick }, 57 { 0x046d, 0xc295, ff_joystick },
57 { 0x046d, 0xca03, ff_joystick }, 58 { 0x046d, 0xca03, ff_joystick },
diff --git a/drivers/usb/input/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c
index f5a90e950e6b..f5a90e950e6b 100644
--- a/drivers/usb/input/hid-pidff.c
+++ b/drivers/hid/usbhid/hid-pidff.c
diff --git a/drivers/usb/input/hid-plff.c b/drivers/hid/usbhid/hid-plff.c
index 76d2e6e14db4..76d2e6e14db4 100644
--- a/drivers/usb/input/hid-plff.c
+++ b/drivers/hid/usbhid/hid-plff.c
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
new file mode 100644
index 000000000000..17a87555e32f
--- /dev/null
+++ b/drivers/hid/usbhid/hid-quirks.c
@@ -0,0 +1,681 @@
1/*
2 * USB HID quirks support for Linux
3 *
4 * Copyright (c) 1999 Andreas Gal
5 * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
6 * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
7 * Copyright (c) 2006-2007 Jiri Kosina
8 * Copyright (c) 2007 Paul Walmsley
9 */
10
11/*
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18#include <linux/hid.h>
19
20#define USB_VENDOR_ID_A4TECH 0x09da
21#define USB_DEVICE_ID_A4TECH_WCP32PU 0x0006
22
23#define USB_VENDOR_ID_AASHIMA 0x06d6
24#define USB_DEVICE_ID_AASHIMA_GAMEPAD 0x0025
25#define USB_DEVICE_ID_AASHIMA_PREDATOR 0x0026
26
27#define USB_VENDOR_ID_ACECAD 0x0460
28#define USB_DEVICE_ID_ACECAD_FLAIR 0x0004
29#define USB_DEVICE_ID_ACECAD_302 0x0008
30
31#define USB_VENDOR_ID_AIPTEK 0x08ca
32#define USB_DEVICE_ID_AIPTEK_01 0x0001
33#define USB_DEVICE_ID_AIPTEK_10 0x0010
34#define USB_DEVICE_ID_AIPTEK_20 0x0020
35#define USB_DEVICE_ID_AIPTEK_21 0x0021
36#define USB_DEVICE_ID_AIPTEK_22 0x0022
37#define USB_DEVICE_ID_AIPTEK_23 0x0023
38#define USB_DEVICE_ID_AIPTEK_24 0x0024
39
40#define USB_VENDOR_ID_AIRCABLE 0x16CA
41#define USB_DEVICE_ID_AIRCABLE1 0x1502
42
43#define USB_VENDOR_ID_ALCOR 0x058f
44#define USB_DEVICE_ID_ALCOR_USBRS232 0x9720
45
46#define USB_VENDOR_ID_ALPS 0x0433
47#define USB_DEVICE_ID_IBM_GAMEPAD 0x1101
48
49#define USB_VENDOR_ID_APPLE 0x05ac
50#define USB_DEVICE_ID_APPLE_MIGHTYMOUSE 0x0304
51#define USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI 0x020e
52#define USB_DEVICE_ID_APPLE_FOUNTAIN_ISO 0x020f
53#define USB_DEVICE_ID_APPLE_GEYSER_ANSI 0x0214
54#define USB_DEVICE_ID_APPLE_GEYSER_ISO 0x0215
55#define USB_DEVICE_ID_APPLE_GEYSER_JIS 0x0216
56#define USB_DEVICE_ID_APPLE_GEYSER3_ANSI 0x0217
57#define USB_DEVICE_ID_APPLE_GEYSER3_ISO 0x0218
58#define USB_DEVICE_ID_APPLE_GEYSER3_JIS 0x0219
59#define USB_DEVICE_ID_APPLE_GEYSER4_ANSI 0x021a
60#define USB_DEVICE_ID_APPLE_GEYSER4_ISO 0x021b
61#define USB_DEVICE_ID_APPLE_GEYSER4_JIS 0x021c
62#define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a
63#define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b
64#define USB_DEVICE_ID_APPLE_IR 0x8240
65
66#define USB_VENDOR_ID_ATEN 0x0557
67#define USB_DEVICE_ID_ATEN_UC100KM 0x2004
68#define USB_DEVICE_ID_ATEN_CS124U 0x2202
69#define USB_DEVICE_ID_ATEN_2PORTKVM 0x2204
70#define USB_DEVICE_ID_ATEN_4PORTKVM 0x2205
71#define USB_DEVICE_ID_ATEN_4PORTKVMC 0x2208
72
73#define USB_VENDOR_ID_BELKIN 0x050d
74#define USB_DEVICE_ID_FLIP_KVM 0x3201
75
76#define USB_VENDOR_ID_BERKSHIRE 0x0c98
77#define USB_DEVICE_ID_BERKSHIRE_PCWD 0x1140
78
79#define USB_VENDOR_ID_CHERRY 0x046a
80#define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023
81
82#define USB_VENDOR_ID_CHIC 0x05fe
83#define USB_DEVICE_ID_CHIC_GAMEPAD 0x0014
84
85#define USB_VENDOR_ID_CIDC 0x1677
86
87#define USB_VENDOR_ID_CODEMERCS 0x07c0
88#define USB_DEVICE_ID_CODEMERCS_IOW_FIRST 0x1500
89#define USB_DEVICE_ID_CODEMERCS_IOW_LAST 0x15ff
90
91#define USB_VENDOR_ID_CYPRESS 0x04b4
92#define USB_DEVICE_ID_CYPRESS_MOUSE 0x0001
93#define USB_DEVICE_ID_CYPRESS_HIDCOM 0x5500
94#define USB_DEVICE_ID_CYPRESS_ULTRAMOUSE 0x7417
95
96#define USB_VENDOR_ID_DELL 0x413c
97#define USB_DEVICE_ID_DELL_W7658 0x2005
98
99#define USB_VENDOR_ID_DELORME 0x1163
100#define USB_DEVICE_ID_DELORME_EARTHMATE 0x0100
101#define USB_DEVICE_ID_DELORME_EM_LT20 0x0200
102
103#define USB_VENDOR_ID_ESSENTIAL_REALITY 0x0d7f
104#define USB_DEVICE_ID_ESSENTIAL_REALITY_P5 0x0100
105
106#define USB_VENDOR_ID_GLAB 0x06c2
107#define USB_DEVICE_ID_4_PHIDGETSERVO_30 0x0038
108#define USB_DEVICE_ID_1_PHIDGETSERVO_30 0x0039
109#define USB_DEVICE_ID_0_0_4_IF_KIT 0x0040
110#define USB_DEVICE_ID_0_16_16_IF_KIT 0x0044
111#define USB_DEVICE_ID_8_8_8_IF_KIT 0x0045
112#define USB_DEVICE_ID_0_8_7_IF_KIT 0x0051
113#define USB_DEVICE_ID_0_8_8_IF_KIT 0x0053
114#define USB_DEVICE_ID_PHIDGET_MOTORCONTROL 0x0058
115
116#define USB_VENDOR_ID_GRIFFIN 0x077d
117#define USB_DEVICE_ID_POWERMATE 0x0410
118#define USB_DEVICE_ID_SOUNDKNOB 0x04AA
119
120#define USB_VENDOR_ID_GTCO 0x078c
121#define USB_DEVICE_ID_GTCO_90 0x0090
122#define USB_DEVICE_ID_GTCO_100 0x0100
123#define USB_DEVICE_ID_GTCO_101 0x0101
124#define USB_DEVICE_ID_GTCO_103 0x0103
125#define USB_DEVICE_ID_GTCO_104 0x0104
126#define USB_DEVICE_ID_GTCO_105 0x0105
127#define USB_DEVICE_ID_GTCO_106 0x0106
128#define USB_DEVICE_ID_GTCO_107 0x0107
129#define USB_DEVICE_ID_GTCO_108 0x0108
130#define USB_DEVICE_ID_GTCO_200 0x0200
131#define USB_DEVICE_ID_GTCO_201 0x0201
132#define USB_DEVICE_ID_GTCO_202 0x0202
133#define USB_DEVICE_ID_GTCO_203 0x0203
134#define USB_DEVICE_ID_GTCO_204 0x0204
135#define USB_DEVICE_ID_GTCO_205 0x0205
136#define USB_DEVICE_ID_GTCO_206 0x0206
137#define USB_DEVICE_ID_GTCO_207 0x0207
138#define USB_DEVICE_ID_GTCO_300 0x0300
139#define USB_DEVICE_ID_GTCO_301 0x0301
140#define USB_DEVICE_ID_GTCO_302 0x0302
141#define USB_DEVICE_ID_GTCO_303 0x0303
142#define USB_DEVICE_ID_GTCO_304 0x0304
143#define USB_DEVICE_ID_GTCO_305 0x0305
144#define USB_DEVICE_ID_GTCO_306 0x0306
145#define USB_DEVICE_ID_GTCO_307 0x0307
146#define USB_DEVICE_ID_GTCO_308 0x0308
147#define USB_DEVICE_ID_GTCO_309 0x0309
148#define USB_DEVICE_ID_GTCO_400 0x0400
149#define USB_DEVICE_ID_GTCO_401 0x0401
150#define USB_DEVICE_ID_GTCO_402 0x0402
151#define USB_DEVICE_ID_GTCO_403 0x0403
152#define USB_DEVICE_ID_GTCO_404 0x0404
153#define USB_DEVICE_ID_GTCO_405 0x0405
154#define USB_DEVICE_ID_GTCO_500 0x0500
155#define USB_DEVICE_ID_GTCO_501 0x0501
156#define USB_DEVICE_ID_GTCO_502 0x0502
157#define USB_DEVICE_ID_GTCO_503 0x0503
158#define USB_DEVICE_ID_GTCO_504 0x0504
159#define USB_DEVICE_ID_GTCO_1000 0x1000
160#define USB_DEVICE_ID_GTCO_1001 0x1001
161#define USB_DEVICE_ID_GTCO_1002 0x1002
162#define USB_DEVICE_ID_GTCO_1003 0x1003
163#define USB_DEVICE_ID_GTCO_1004 0x1004
164#define USB_DEVICE_ID_GTCO_1005 0x1005
165#define USB_DEVICE_ID_GTCO_1006 0x1006
166
167#define USB_VENDOR_ID_HAPP 0x078b
168#define USB_DEVICE_ID_UGCI_DRIVING 0x0010
169#define USB_DEVICE_ID_UGCI_FLYING 0x0020
170#define USB_DEVICE_ID_UGCI_FIGHTING 0x0030
171
172#define USB_VENDOR_ID_IMATION 0x0718
173#define USB_DEVICE_ID_DISC_STAKKA 0xd000
174
175#define USB_VENDOR_ID_KBGEAR 0x084e
176#define USB_DEVICE_ID_KBGEAR_JAMSTUDIO 0x1001
177
178#define USB_VENDOR_ID_LD 0x0f11
179#define USB_DEVICE_ID_LD_CASSY 0x1000
180#define USB_DEVICE_ID_LD_POCKETCASSY 0x1010
181#define USB_DEVICE_ID_LD_MOBILECASSY 0x1020
182#define USB_DEVICE_ID_LD_JWM 0x1080
183#define USB_DEVICE_ID_LD_DMMP 0x1081
184#define USB_DEVICE_ID_LD_UMIP 0x1090
185#define USB_DEVICE_ID_LD_XRAY1 0x1100
186#define USB_DEVICE_ID_LD_XRAY2 0x1101
187#define USB_DEVICE_ID_LD_VIDEOCOM 0x1200
188#define USB_DEVICE_ID_LD_COM3LAB 0x2000
189#define USB_DEVICE_ID_LD_TELEPORT 0x2010
190#define USB_DEVICE_ID_LD_NETWORKANALYSER 0x2020
191#define USB_DEVICE_ID_LD_POWERCONTROL 0x2030
192#define USB_DEVICE_ID_LD_MACHINETEST 0x2040
193
194#define USB_VENDOR_ID_LOGITECH 0x046d
195#define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101
196#define USB_DEVICE_ID_S510_RECEIVER 0xc50c
197#define USB_DEVICE_ID_S510_RECEIVER_2 0xc517
198#define USB_DEVICE_ID_MX3000_RECEIVER 0xc513
199#define USB_DEVICE_ID_DINOVO_EDGE 0xc714
200
201#define USB_VENDOR_ID_MCC 0x09db
202#define USB_DEVICE_ID_MCC_PMD1024LS 0x0076
203#define USB_DEVICE_ID_MCC_PMD1208LS 0x007a
204
205#define USB_VENDOR_ID_MGE 0x0463
206#define USB_DEVICE_ID_MGE_UPS 0xffff
207#define USB_DEVICE_ID_MGE_UPS1 0x0001
208
209#define USB_VENDOR_ID_NEC 0x073e
210#define USB_DEVICE_ID_NEC_USB_GAME_PAD 0x0301
211
212#define USB_VENDOR_ID_ONTRAK 0x0a07
213#define USB_DEVICE_ID_ONTRAK_ADU100 0x0064
214
215#define USB_VENDOR_ID_PANJIT 0x134c
216
217#define USB_VENDOR_ID_PANTHERLORD 0x0810
218#define USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK 0x0001
219
220#define USB_VENDOR_ID_PLAYDOTCOM 0x0b43
221#define USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII 0x0003
222
223#define USB_VENDOR_ID_SAITEK 0x06a3
224#define USB_DEVICE_ID_SAITEK_RUMBLEPAD 0xff17
225
226#define USB_VENDOR_ID_SONY 0x054c
227#define USB_DEVICE_ID_SONY_PS3_CONTROLLER 0x0268
228
229#define USB_VENDOR_ID_SUN 0x0430
230#define USB_DEVICE_ID_RARITAN_KVM_DONGLE 0xcdab
231
232#define USB_VENDOR_ID_TOPMAX 0x0663
233#define USB_DEVICE_ID_TOPMAX_COBRAPAD 0x0103
234
235#define USB_VENDOR_ID_TURBOX 0x062a
236#define USB_DEVICE_ID_TURBOX_KEYBOARD 0x0201
237
238#define USB_VENDOR_ID_VERNIER 0x08f7
239#define USB_DEVICE_ID_VERNIER_LABPRO 0x0001
240#define USB_DEVICE_ID_VERNIER_GOTEMP 0x0002
241#define USB_DEVICE_ID_VERNIER_SKIP 0x0003
242#define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004
243
244#define USB_VENDOR_ID_WACOM 0x056a
245
246#define USB_VENDOR_ID_WISEGROUP 0x0925
247#define USB_DEVICE_ID_1_PHIDGETSERVO_20 0x8101
248#define USB_DEVICE_ID_4_PHIDGETSERVO_20 0x8104
249#define USB_DEVICE_ID_8_8_4_IF_KIT 0x8201
250#define USB_DEVICE_ID_QUAD_USB_JOYPAD 0x8800
251#define USB_DEVICE_ID_DUAL_USB_JOYPAD 0x8866
252
253#define USB_VENDOR_ID_WISEGROUP_LTD 0x6677
254#define USB_DEVICE_ID_SMARTJOY_DUAL_PLUS 0x8802
255
256#define USB_VENDOR_ID_YEALINK 0x6993
257#define USB_DEVICE_ID_YEALINK_P1K_P4K_B2K 0xb001
258
259/*
260 * Alphabetically sorted blacklist by quirk type.
261 */
262
263static const struct hid_blacklist {
264 __u16 idVendor;
265 __u16 idProduct;
266 __u32 quirks;
267} hid_blacklist[] = {
268
269 { USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU, HID_QUIRK_2WHEEL_MOUSE_HACK_7 },
270 { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE, HID_QUIRK_2WHEEL_MOUSE_HACK_5 },
271
272 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RECEIVER, HID_QUIRK_BAD_RELATIVE_KEYS },
273
274 { USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_GAMEPAD, HID_QUIRK_BADPAD },
275 { USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_PREDATOR, HID_QUIRK_BADPAD },
276 { USB_VENDOR_ID_ALPS, USB_DEVICE_ID_IBM_GAMEPAD, HID_QUIRK_BADPAD },
277 { USB_VENDOR_ID_CHIC, USB_DEVICE_ID_CHIC_GAMEPAD, HID_QUIRK_BADPAD },
278 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_DRIVING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
279 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FLYING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
280 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FIGHTING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
281 { USB_VENDOR_ID_NEC, USB_DEVICE_ID_NEC_USB_GAME_PAD, HID_QUIRK_BADPAD },
282 { USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RUMBLEPAD, HID_QUIRK_BADPAD },
283 { USB_VENDOR_ID_TOPMAX, USB_DEVICE_ID_TOPMAX_COBRAPAD, HID_QUIRK_BADPAD },
284
285 { USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION, HID_QUIRK_CYMOTION },
286
287 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_EDGE, HID_QUIRK_DUPLICATE_USAGES },
288
289 { USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM, HID_QUIRK_HIDDEV },
290
291 { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_01, HID_QUIRK_IGNORE },
292 { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_10, HID_QUIRK_IGNORE },
293 { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_20, HID_QUIRK_IGNORE },
294 { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_21, HID_QUIRK_IGNORE },
295 { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_22, HID_QUIRK_IGNORE },
296 { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_23, HID_QUIRK_IGNORE },
297 { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_24, HID_QUIRK_IGNORE },
298 { USB_VENDOR_ID_AIRCABLE, USB_DEVICE_ID_AIRCABLE1, HID_QUIRK_IGNORE },
299 { USB_VENDOR_ID_ALCOR, USB_DEVICE_ID_ALCOR_USBRS232, HID_QUIRK_IGNORE },
300 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IR, HID_QUIRK_IGNORE },
301 { USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD, HID_QUIRK_IGNORE },
302 { USB_VENDOR_ID_CIDC, 0x0103, HID_QUIRK_IGNORE },
303 { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_HIDCOM, HID_QUIRK_IGNORE },
304 { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_ULTRAMOUSE, HID_QUIRK_IGNORE },
305 { USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EARTHMATE, HID_QUIRK_IGNORE },
306 { USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20, HID_QUIRK_IGNORE },
307 { USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5, HID_QUIRK_IGNORE },
308 { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_4_PHIDGETSERVO_30, HID_QUIRK_IGNORE },
309 { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_1_PHIDGETSERVO_30, HID_QUIRK_IGNORE },
310 { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_0_4_IF_KIT, HID_QUIRK_IGNORE },
311 { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_16_16_IF_KIT, HID_QUIRK_IGNORE },
312 { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_8_8_8_IF_KIT, HID_QUIRK_IGNORE },
313 { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_8_7_IF_KIT, HID_QUIRK_IGNORE },
314 { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_8_8_IF_KIT, HID_QUIRK_IGNORE },
315 { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_PHIDGET_MOTORCONTROL, HID_QUIRK_IGNORE },
316 { USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_POWERMATE, HID_QUIRK_IGNORE },
317 { USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_SOUNDKNOB, HID_QUIRK_IGNORE },
318 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_90, HID_QUIRK_IGNORE },
319 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_100, HID_QUIRK_IGNORE },
320 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_101, HID_QUIRK_IGNORE },
321 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_103, HID_QUIRK_IGNORE },
322 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_104, HID_QUIRK_IGNORE },
323 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_105, HID_QUIRK_IGNORE },
324 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_106, HID_QUIRK_IGNORE },
325 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_107, HID_QUIRK_IGNORE },
326 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_108, HID_QUIRK_IGNORE },
327 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_200, HID_QUIRK_IGNORE },
328 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_201, HID_QUIRK_IGNORE },
329 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_202, HID_QUIRK_IGNORE },
330 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_203, HID_QUIRK_IGNORE },
331 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_204, HID_QUIRK_IGNORE },
332 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_205, HID_QUIRK_IGNORE },
333 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_206, HID_QUIRK_IGNORE },
334 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_207, HID_QUIRK_IGNORE },
335 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_300, HID_QUIRK_IGNORE },
336 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_301, HID_QUIRK_IGNORE },
337 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_302, HID_QUIRK_IGNORE },
338 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_303, HID_QUIRK_IGNORE },
339 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_304, HID_QUIRK_IGNORE },
340 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_305, HID_QUIRK_IGNORE },
341 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_306, HID_QUIRK_IGNORE },
342 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_307, HID_QUIRK_IGNORE },
343 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_308, HID_QUIRK_IGNORE },
344 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_309, HID_QUIRK_IGNORE },
345 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_400, HID_QUIRK_IGNORE },
346 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_401, HID_QUIRK_IGNORE },
347 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_402, HID_QUIRK_IGNORE },
348 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_403, HID_QUIRK_IGNORE },
349 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_404, HID_QUIRK_IGNORE },
350 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_405, HID_QUIRK_IGNORE },
351 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_500, HID_QUIRK_IGNORE },
352 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_501, HID_QUIRK_IGNORE },
353 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_502, HID_QUIRK_IGNORE },
354 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_503, HID_QUIRK_IGNORE },
355 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_504, HID_QUIRK_IGNORE },
356 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1000, HID_QUIRK_IGNORE },
357 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1001, HID_QUIRK_IGNORE },
358 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1002, HID_QUIRK_IGNORE },
359 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1003, HID_QUIRK_IGNORE },
360 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1004, HID_QUIRK_IGNORE },
361 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1005, HID_QUIRK_IGNORE },
362 { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1006, HID_QUIRK_IGNORE },
363 { USB_VENDOR_ID_IMATION, USB_DEVICE_ID_DISC_STAKKA, HID_QUIRK_IGNORE },
364 { USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO, HID_QUIRK_IGNORE },
365 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY, HID_QUIRK_IGNORE },
366 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY, HID_QUIRK_IGNORE },
367 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY, HID_QUIRK_IGNORE },
368 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM, HID_QUIRK_IGNORE },
369 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP, HID_QUIRK_IGNORE },
370 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP, HID_QUIRK_IGNORE },
371 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY1, HID_QUIRK_IGNORE },
372 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY2, HID_QUIRK_IGNORE },
373 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_VIDEOCOM, HID_QUIRK_IGNORE },
374 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_COM3LAB, HID_QUIRK_IGNORE },
375 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_TELEPORT, HID_QUIRK_IGNORE },
376 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_NETWORKANALYSER, HID_QUIRK_IGNORE },
377 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERCONTROL, HID_QUIRK_IGNORE },
378 { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETEST, HID_QUIRK_IGNORE },
379 { USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1024LS, HID_QUIRK_IGNORE },
380 { USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1208LS, HID_QUIRK_IGNORE },
381 { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_IGNORE },
382 { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS1, HID_QUIRK_IGNORE },
383 { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100, HID_QUIRK_IGNORE },
384 { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 20, HID_QUIRK_IGNORE },
385 { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 30, HID_QUIRK_IGNORE },
386 { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 100, HID_QUIRK_IGNORE },
387 { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 108, HID_QUIRK_IGNORE },
388 { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 118, HID_QUIRK_IGNORE },
389 { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 200, HID_QUIRK_IGNORE },
390 { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 300, HID_QUIRK_IGNORE },
391 { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 400, HID_QUIRK_IGNORE },
392 { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 500, HID_QUIRK_IGNORE },
393 { USB_VENDOR_ID_PANJIT, 0x0001, HID_QUIRK_IGNORE },
394 { USB_VENDOR_ID_PANJIT, 0x0002, HID_QUIRK_IGNORE },
395 { USB_VENDOR_ID_PANJIT, 0x0003, HID_QUIRK_IGNORE },
396 { USB_VENDOR_ID_PANJIT, 0x0004, HID_QUIRK_IGNORE },
397 { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LABPRO, HID_QUIRK_IGNORE },
398 { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP, HID_QUIRK_IGNORE },
399 { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP, HID_QUIRK_IGNORE },
400 { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS, HID_QUIRK_IGNORE },
401 { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_4_PHIDGETSERVO_20, HID_QUIRK_IGNORE },
402 { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20, HID_QUIRK_IGNORE },
403 { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_8_8_4_IF_KIT, HID_QUIRK_IGNORE },
404 { USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K, HID_QUIRK_IGNORE },
405
406 { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_FLAIR, HID_QUIRK_IGNORE },
407 { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_302, HID_QUIRK_IGNORE },
408
409 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER, HID_QUIRK_LOGITECH_DESCRIPTOR },
410 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER, HID_QUIRK_LOGITECH_DESCRIPTOR },
411 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER_2, HID_QUIRK_LOGITECH_DESCRIPTOR },
412
413 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE, HID_QUIRK_MIGHTYMOUSE | HID_QUIRK_INVERT_HWHEEL },
414
415 { USB_VENDOR_ID_PANTHERLORD, USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK, HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS },
416 { USB_VENDOR_ID_PLAYDOTCOM, USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII, HID_QUIRK_MULTI_INPUT },
417
418 { USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER, HID_QUIRK_SONY_PS3_CONTROLLER },
419
420 { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_UC100KM, HID_QUIRK_NOGET },
421 { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS124U, HID_QUIRK_NOGET },
422 { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_2PORTKVM, HID_QUIRK_NOGET },
423 { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM, HID_QUIRK_NOGET },
424 { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC, HID_QUIRK_NOGET },
425 { USB_VENDOR_ID_SUN, USB_DEVICE_ID_RARITAN_KVM_DONGLE, HID_QUIRK_NOGET },
426 { USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD, HID_QUIRK_NOGET },
427 { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
428 { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_QUAD_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
429
430 { USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
431
432 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
433 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
434 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
435 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_POWERBOOK_ISO_KEYBOARD},
436 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
437 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
438 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_POWERBOOK_ISO_KEYBOARD},
439 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
440 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
441 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_POWERBOOK_ISO_KEYBOARD},
442 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
443 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
444 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
445
446 { USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_W7658, HID_QUIRK_RESET_LEDS },
447
448 { 0, 0 }
449};
450
451/* Dynamic HID quirks list - specified at runtime */
452struct quirks_list_struct {
453 struct hid_blacklist hid_bl_item;
454 struct list_head node;
455};
456
457static LIST_HEAD(dquirks_list);
458static DECLARE_RWSEM(dquirks_rwsem);
459
460/* Runtime ("dynamic") quirks manipulation functions */
461
462/**
463 * usbhid_exists_dquirk: find any dynamic quirks for a USB HID device
464 * @idVendor: the 16-bit USB vendor ID, in native byteorder
465 * @idProduct: the 16-bit USB product ID, in native byteorder
466 *
467 * Description:
468 * Scans dquirks_list for a matching dynamic quirk and returns
469 * the pointer to the relevant struct hid_blacklist if found.
470 * Must be called with a read lock held on dquirks_rwsem.
471 *
472 * Returns: NULL if no quirk found, struct hid_blacklist * if found.
473 */
474static struct hid_blacklist *usbhid_exists_dquirk(const u16 idVendor,
475 const u16 idProduct)
476{
477 struct quirks_list_struct *q;
478 struct hid_blacklist *bl_entry = NULL;
479
480 list_for_each_entry(q, &dquirks_list, node) {
481 if (q->hid_bl_item.idVendor == idVendor &&
482 q->hid_bl_item.idProduct == idProduct) {
483 bl_entry = &q->hid_bl_item;
484 break;
485 }
486 }
487
488 if (bl_entry != NULL)
489 dbg("Found dynamic quirk 0x%x for USB HID vendor 0x%hx prod 0x%hx\n",
490 bl_entry->quirks, bl_entry->idVendor,
491 bl_entry->idProduct);
492
493 return bl_entry;
494}
495
496
497/**
498 * usbhid_modify_dquirk: add/replace a HID quirk
499 * @idVendor: the 16-bit USB vendor ID, in native byteorder
500 * @idProduct: the 16-bit USB product ID, in native byteorder
501 * @quirks: the u32 quirks value to add/replace
502 *
503 * Description:
504 * If an dynamic quirk exists in memory for this (idVendor,
505 * idProduct) pair, replace its quirks value with what was
506 * provided. Otherwise, add the quirk to the dynamic quirks list.
507 *
508 * Returns: 0 OK, -error on failure.
509 */
510int usbhid_modify_dquirk(const u16 idVendor, const u16 idProduct,
511 const u32 quirks)
512{
513 struct quirks_list_struct *q_new, *q;
514 int list_edited = 0;
515
516 if (!idVendor) {
517 dbg("Cannot add a quirk with idVendor = 0");
518 return -EINVAL;
519 }
520
521 q_new = kmalloc(sizeof(struct quirks_list_struct), GFP_KERNEL);
522 if (!q_new) {
523 dbg("Could not allocate quirks_list_struct");
524 return -ENOMEM;
525 }
526
527 q_new->hid_bl_item.idVendor = idVendor;
528 q_new->hid_bl_item.idProduct = idProduct;
529 q_new->hid_bl_item.quirks = quirks;
530
531 down_write(&dquirks_rwsem);
532
533 list_for_each_entry(q, &dquirks_list, node) {
534
535 if (q->hid_bl_item.idVendor == idVendor &&
536 q->hid_bl_item.idProduct == idProduct) {
537
538 list_replace(&q->node, &q_new->node);
539 kfree(q);
540 list_edited = 1;
541 break;
542
543 }
544
545 }
546
547 if (!list_edited)
548 list_add_tail(&q_new->node, &dquirks_list);
549
550 up_write(&dquirks_rwsem);
551
552 return 0;
553}
554
555
556/**
557 * usbhid_remove_all_dquirks: remove all runtime HID quirks from memory
558 *
559 * Description:
560 * Free all memory associated with dynamic quirks - called before
561 * module unload.
562 *
563 */
564static void usbhid_remove_all_dquirks(void)
565{
566 struct quirks_list_struct *q, *temp;
567
568 down_write(&dquirks_rwsem);
569 list_for_each_entry_safe(q, temp, &dquirks_list, node) {
570 list_del(&q->node);
571 kfree(q);
572 }
573 up_write(&dquirks_rwsem);
574
575}
576
577/**
578 * usbhid_quirks_init: apply USB HID quirks specified at module load time
579 */
580int usbhid_quirks_init(char **quirks_param)
581{
582 u16 idVendor, idProduct;
583 u32 quirks;
584 int n = 0, m;
585
586 for (; quirks_param[n] && n < MAX_USBHID_BOOT_QUIRKS; n++) {
587
588 m = sscanf(quirks_param[n], "0x%hx:0x%hx:0x%x",
589 &idVendor, &idProduct, &quirks);
590
591 if (m != 3 ||
592 usbhid_modify_dquirk(idVendor, idProduct, quirks) != 0) {
593 printk(KERN_WARNING
594 "Could not parse HID quirk module param %s\n",
595 quirks_param[n]);
596 }
597 }
598
599 return 0;
600}
601
602/**
603 * usbhid_quirks_exit: release memory associated with dynamic_quirks
604 *
605 * Description:
606 * Release all memory associated with dynamic quirks. Called upon
607 * module unload.
608 *
609 * Returns: nothing
610 */
611void usbhid_quirks_exit(void)
612{
613 usbhid_remove_all_dquirks();
614}
615
616/**
617 * usbhid_exists_squirk: return any static quirks for a USB HID device
618 * @idVendor: the 16-bit USB vendor ID, in native byteorder
619 * @idProduct: the 16-bit USB product ID, in native byteorder
620 *
621 * Description:
622 * Given a USB vendor ID and product ID, return a pointer to
623 * the hid_blacklist entry associated with that device.
624 *
625 * Returns: pointer if quirk found, or NULL if no quirks found.
626 */
627static const struct hid_blacklist *usbhid_exists_squirk(const u16 idVendor,
628 const u16 idProduct)
629{
630 const struct hid_blacklist *bl_entry = NULL;
631 int n = 0;
632
633 for (; hid_blacklist[n].idVendor; n++)
634 if (hid_blacklist[n].idVendor == idVendor &&
635 hid_blacklist[n].idProduct == idProduct)
636 bl_entry = &hid_blacklist[n];
637
638 if (bl_entry != NULL)
639 dbg("Found squirk 0x%x for USB HID vendor 0x%hx prod 0x%hx\n",
640 bl_entry->quirks, bl_entry->idVendor,
641 bl_entry->idProduct);
642 return bl_entry;
643}
644
645/**
646 * usbhid_lookup_quirk: return any quirks associated with a USB HID device
647 * @idVendor: the 16-bit USB vendor ID, in native byteorder
648 * @idProduct: the 16-bit USB product ID, in native byteorder
649 *
650 * Description:
651 * Given a USB vendor ID and product ID, return any quirks associated
652 * with that device.
653 *
654 * Returns: a u32 quirks value.
655 */
656u32 usbhid_lookup_quirk(const u16 idVendor, const u16 idProduct)
657{
658 u32 quirks = 0;
659 const struct hid_blacklist *bl_entry = NULL;
660
661 /* Ignore all Wacom devices */
662 if (idVendor == USB_VENDOR_ID_WACOM)
663 return HID_QUIRK_IGNORE;
664
665 /* ignore all Code Mercenaries IOWarrior devices */
666 if (idVendor == USB_VENDOR_ID_CODEMERCS)
667 if (idProduct >= USB_DEVICE_ID_CODEMERCS_IOW_FIRST &&
668 idProduct <= USB_DEVICE_ID_CODEMERCS_IOW_LAST)
669 return HID_QUIRK_IGNORE;
670
671 down_read(&dquirks_rwsem);
672 bl_entry = usbhid_exists_dquirk(idVendor, idProduct);
673 if (!bl_entry)
674 bl_entry = usbhid_exists_squirk(idVendor, idProduct);
675 if (bl_entry)
676 quirks = bl_entry->quirks;
677 up_read(&dquirks_rwsem);
678
679 return quirks;
680}
681
diff --git a/drivers/usb/input/hid-tmff.c b/drivers/hid/usbhid/hid-tmff.c
index ab67331620d0..ab67331620d0 100644
--- a/drivers/usb/input/hid-tmff.c
+++ b/drivers/hid/usbhid/hid-tmff.c
diff --git a/drivers/usb/input/hid-zpff.c b/drivers/hid/usbhid/hid-zpff.c
index 7bd8238ca212..7bd8238ca212 100644
--- a/drivers/usb/input/hid-zpff.c
+++ b/drivers/hid/usbhid/hid-zpff.c
diff --git a/drivers/usb/input/hiddev.c b/drivers/hid/usbhid/hiddev.c
index a8b3d66cd498..a8b3d66cd498 100644
--- a/drivers/usb/input/hiddev.c
+++ b/drivers/hid/usbhid/hiddev.c
diff --git a/drivers/usb/input/usbhid.h b/drivers/hid/usbhid/usbhid.h
index 0023f96d4294..0023f96d4294 100644
--- a/drivers/usb/input/usbhid.h
+++ b/drivers/hid/usbhid/usbhid.h
diff --git a/drivers/usb/input/usbkbd.c b/drivers/hid/usbhid/usbkbd.c
index 3749f4a235f9..65aa12e8d7b3 100644
--- a/drivers/usb/input/usbkbd.c
+++ b/drivers/hid/usbhid/usbkbd.c
@@ -228,6 +228,7 @@ static int usb_kbd_probe(struct usb_interface *iface,
228 struct usb_kbd *kbd; 228 struct usb_kbd *kbd;
229 struct input_dev *input_dev; 229 struct input_dev *input_dev;
230 int i, pipe, maxp; 230 int i, pipe, maxp;
231 int error = -ENOMEM;
231 232
232 interface = iface->cur_altsetting; 233 interface = iface->cur_altsetting;
233 234
@@ -306,15 +307,19 @@ static int usb_kbd_probe(struct usb_interface *iface,
306 kbd->led->transfer_dma = kbd->leds_dma; 307 kbd->led->transfer_dma = kbd->leds_dma;
307 kbd->led->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP); 308 kbd->led->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP);
308 309
309 input_register_device(kbd->dev); 310 error = input_register_device(kbd->dev);
311 if (error)
312 goto fail2;
310 313
311 usb_set_intfdata(iface, kbd); 314 usb_set_intfdata(iface, kbd);
312 return 0; 315 return 0;
313 316
314fail2: usb_kbd_free_mem(dev, kbd); 317fail2:
315fail1: input_free_device(input_dev); 318 usb_kbd_free_mem(dev, kbd);
319fail1:
320 input_free_device(input_dev);
316 kfree(kbd); 321 kfree(kbd);
317 return -ENOMEM; 322 return error;
318} 323}
319 324
320static void usb_kbd_disconnect(struct usb_interface *intf) 325static void usb_kbd_disconnect(struct usb_interface *intf)
diff --git a/drivers/usb/input/usbmouse.c b/drivers/hid/usbhid/usbmouse.c
index 692fd6087779..573776d865e1 100644
--- a/drivers/usb/input/usbmouse.c
+++ b/drivers/hid/usbhid/usbmouse.c
@@ -120,6 +120,7 @@ static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_i
120 struct usb_mouse *mouse; 120 struct usb_mouse *mouse;
121 struct input_dev *input_dev; 121 struct input_dev *input_dev;
122 int pipe, maxp; 122 int pipe, maxp;
123 int error = -ENOMEM;
123 124
124 interface = intf->cur_altsetting; 125 interface = intf->cur_altsetting;
125 126
@@ -188,15 +189,21 @@ static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_i
188 mouse->irq->transfer_dma = mouse->data_dma; 189 mouse->irq->transfer_dma = mouse->data_dma;
189 mouse->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 190 mouse->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
190 191
191 input_register_device(mouse->dev); 192 error = input_register_device(mouse->dev);
193 if (error)
194 goto fail3;
192 195
193 usb_set_intfdata(intf, mouse); 196 usb_set_intfdata(intf, mouse);
194 return 0; 197 return 0;
195 198
196fail2: usb_buffer_free(dev, 8, mouse->data, mouse->data_dma); 199fail3:
197fail1: input_free_device(input_dev); 200 usb_free_urb(mouse->irq);
201fail2:
202 usb_buffer_free(dev, 8, mouse->data, mouse->data_dma);
203fail1:
204 input_free_device(input_dev);
198 kfree(mouse); 205 kfree(mouse);
199 return -ENOMEM; 206 return error;
200} 207}
201 208
202static void usb_mouse_disconnect(struct usb_interface *intf) 209static void usb_mouse_disconnect(struct usb_interface *intf)
diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile
index c1b0affae290..f5de58a63f2b 100644
--- a/drivers/usb/Makefile
+++ b/drivers/usb/Makefile
@@ -26,10 +26,7 @@ obj-$(CONFIG_USB) += storage/
26obj-$(CONFIG_USB_ACECAD) += input/ 26obj-$(CONFIG_USB_ACECAD) += input/
27obj-$(CONFIG_USB_AIPTEK) += input/ 27obj-$(CONFIG_USB_AIPTEK) += input/
28obj-$(CONFIG_USB_ATI_REMOTE) += input/ 28obj-$(CONFIG_USB_ATI_REMOTE) += input/
29obj-$(CONFIG_USB_HID) += input/
30obj-$(CONFIG_USB_KBD) += input/
31obj-$(CONFIG_USB_KBTAB) += input/ 29obj-$(CONFIG_USB_KBTAB) += input/
32obj-$(CONFIG_USB_MOUSE) += input/
33obj-$(CONFIG_USB_MTOUCH) += input/ 30obj-$(CONFIG_USB_MTOUCH) += input/
34obj-$(CONFIG_USB_POWERMATE) += input/ 31obj-$(CONFIG_USB_POWERMATE) += input/
35obj-$(CONFIG_USB_WACOM) += input/ 32obj-$(CONFIG_USB_WACOM) += input/
diff --git a/drivers/usb/input/Kconfig b/drivers/usb/input/Kconfig
index 69a9f3b6d0a9..a792e42f58af 100644
--- a/drivers/usb/input/Kconfig
+++ b/drivers/usb/input/Kconfig
@@ -4,151 +4,6 @@
4comment "USB Input Devices" 4comment "USB Input Devices"
5 depends on USB 5 depends on USB
6 6
7config USB_HID
8 tristate "USB Human Interface Device (full HID) support"
9 default y
10 depends on USB && INPUT
11 select HID
12 ---help---
13 Say Y here if you want full HID support to connect USB keyboards,
14 mice, joysticks, graphic tablets, or any other HID based devices
15 to your computer via USB, as well as Uninterruptible Power Supply
16 (UPS) and monitor control devices.
17
18 You can't use this driver and the HIDBP (Boot Protocol) keyboard
19 and mouse drivers at the same time. More information is available:
20 <file:Documentation/input/input.txt>.
21
22 If unsure, say Y.
23
24 To compile this driver as a module, choose M here: the
25 module will be called usbhid.
26
27comment "Input core support is needed for USB HID input layer or HIDBP support"
28 depends on USB_HID && INPUT=n
29
30config USB_HIDINPUT_POWERBOOK
31 bool "Enable support for iBook/PowerBook special keys"
32 default n
33 depends on USB_HID
34 help
35 Say Y here if you want support for the special keys (Fn, Numlock) on
36 Apple iBooks and PowerBooks.
37
38 If unsure, say N.
39
40config HID_FF
41 bool "Force feedback support (EXPERIMENTAL)"
42 depends on USB_HID && EXPERIMENTAL
43 help
44 Say Y here is you want force feedback support for a few HID devices.
45 See below for a list of supported devices.
46
47 See <file:Documentation/input/ff.txt> for a description of the force
48 feedback API.
49
50 If unsure, say N.
51
52config HID_PID
53 bool "PID device support"
54 depends on HID_FF
55 help
56 Say Y here if you have a PID-compliant device and wish to enable force
57 feedback for it. Microsoft Sidewinder Force Feedback 2 is one of such
58 devices.
59
60config LOGITECH_FF
61 bool "Logitech devices support"
62 depends on HID_FF
63 select INPUT_FF_MEMLESS if USB_HID
64 help
65 Say Y here if you have one of these devices:
66 - Logitech WingMan Cordless RumblePad
67 - Logitech WingMan Cordless RumblePad 2
68 - Logitech WingMan Force 3D
69 - Logitech Formula Force EX
70 - Logitech MOMO Force wheel
71
72 and if you want to enable force feedback for them.
73 Note: if you say N here, this device will still be supported, but without
74 force feedback.
75
76config PANTHERLORD_FF
77 bool "PantherLord USB/PS2 2in1 Adapter support"
78 depends on HID_FF
79 select INPUT_FF_MEMLESS if USB_HID
80 help
81 Say Y here if you have a PantherLord USB/PS2 2in1 Adapter and want
82 to enable force feedback support for it.
83
84config THRUSTMASTER_FF
85 bool "ThrustMaster FireStorm Dual Power 2 support (EXPERIMENTAL)"
86 depends on HID_FF && EXPERIMENTAL
87 select INPUT_FF_MEMLESS if USB_HID
88 help
89 Say Y here if you have a THRUSTMASTER FireStore Dual Power 2,
90 and want to enable force feedback support for it.
91 Note: if you say N here, this device will still be supported, but without
92 force feedback.
93
94config ZEROPLUS_FF
95 bool "Zeroplus based game controller support"
96 depends on HID_FF
97 select INPUT_FF_MEMLESS if USB_HID
98 help
99 Say Y here if you have a Zeroplus based game controller and want to
100 enable force feedback for it.
101
102config USB_HIDDEV
103 bool "/dev/hiddev raw HID device support"
104 depends on USB_HID
105 help
106 Say Y here if you want to support HID devices (from the USB
107 specification standpoint) that aren't strictly user interface
108 devices, like monitor controls and Uninterruptable Power Supplies.
109
110 This module supports these devices separately using a separate
111 event interface on /dev/usb/hiddevX (char 180:96 to 180:111).
112
113 If unsure, say Y.
114
115menu "USB HID Boot Protocol drivers"
116 depends on USB!=n && USB_HID!=y
117
118config USB_KBD
119 tristate "USB HIDBP Keyboard (simple Boot) support"
120 depends on USB && INPUT
121 ---help---
122 Say Y here only if you are absolutely sure that you don't want
123 to use the generic HID driver for your USB keyboard and prefer
124 to use the keyboard in its limited Boot Protocol mode instead.
125
126 This is almost certainly not what you want. This is mostly
127 useful for embedded applications or simple keyboards.
128
129 To compile this driver as a module, choose M here: the
130 module will be called usbkbd.
131
132 If even remotely unsure, say N.
133
134config USB_MOUSE
135 tristate "USB HIDBP Mouse (simple Boot) support"
136 depends on USB && INPUT
137 ---help---
138 Say Y here only if you are absolutely sure that you don't want
139 to use the generic HID driver for your USB mouse and prefer
140 to use the mouse in its limited Boot Protocol mode instead.
141
142 This is almost certainly not what you want. This is mostly
143 useful for embedded applications or simple mice.
144
145 To compile this driver as a module, choose M here: the
146 module will be called usbmouse.
147
148 If even remotely unsure, say N.
149
150endmenu
151
152config USB_AIPTEK 7config USB_AIPTEK
153 tristate "Aiptek 6000U/8000U tablet support" 8 tristate "Aiptek 6000U/8000U tablet support"
154 depends on USB && INPUT 9 depends on USB && INPUT
diff --git a/drivers/usb/input/Makefile b/drivers/usb/input/Makefile
index a9d206c945e9..9bf420eef77f 100644
--- a/drivers/usb/input/Makefile
+++ b/drivers/usb/input/Makefile
@@ -4,40 +4,12 @@
4 4
5# Multipart objects. 5# Multipart objects.
6wacom-objs := wacom_wac.o wacom_sys.o 6wacom-objs := wacom_wac.o wacom_sys.o
7usbhid-objs := hid-core.o
8
9# Optional parts of multipart objects.
10
11ifeq ($(CONFIG_USB_HIDDEV),y)
12 usbhid-objs += hiddev.o
13endif
14ifeq ($(CONFIG_HID_PID),y)
15 usbhid-objs += hid-pidff.o
16endif
17ifeq ($(CONFIG_LOGITECH_FF),y)
18 usbhid-objs += hid-lgff.o
19endif
20ifeq ($(CONFIG_PANTHERLORD_FF),y)
21 usbhid-objs += hid-plff.o
22endif
23ifeq ($(CONFIG_THRUSTMASTER_FF),y)
24 usbhid-objs += hid-tmff.o
25endif
26ifeq ($(CONFIG_ZEROPLUS_FF),y)
27 usbhid-objs += hid-zpff.o
28endif
29ifeq ($(CONFIG_HID_FF),y)
30 usbhid-objs += hid-ff.o
31endif
32 7
33obj-$(CONFIG_USB_AIPTEK) += aiptek.o 8obj-$(CONFIG_USB_AIPTEK) += aiptek.o
34obj-$(CONFIG_USB_ATI_REMOTE) += ati_remote.o 9obj-$(CONFIG_USB_ATI_REMOTE) += ati_remote.o
35obj-$(CONFIG_USB_ATI_REMOTE2) += ati_remote2.o 10obj-$(CONFIG_USB_ATI_REMOTE2) += ati_remote2.o
36obj-$(CONFIG_USB_HID) += usbhid.o
37obj-$(CONFIG_USB_KBD) += usbkbd.o
38obj-$(CONFIG_USB_KBTAB) += kbtab.o 11obj-$(CONFIG_USB_KBTAB) += kbtab.o
39obj-$(CONFIG_USB_KEYSPAN_REMOTE) += keyspan_remote.o 12obj-$(CONFIG_USB_KEYSPAN_REMOTE) += keyspan_remote.o
40obj-$(CONFIG_USB_MOUSE) += usbmouse.o
41obj-$(CONFIG_USB_MTOUCH) += mtouchusb.o 13obj-$(CONFIG_USB_MTOUCH) += mtouchusb.o
42obj-$(CONFIG_USB_ITMTOUCH) += itmtouch.o 14obj-$(CONFIG_USB_ITMTOUCH) += itmtouch.o
43obj-$(CONFIG_USB_EGALAX) += touchkitusb.o 15obj-$(CONFIG_USB_EGALAX) += touchkitusb.o
diff --git a/include/linux/hid.h b/include/linux/hid.h
index 8c97d4d3fdb0..37076b116ed0 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -247,6 +247,11 @@ struct hid_item {
247 * HID device quirks. 247 * HID device quirks.
248 */ 248 */
249 249
250/*
251 * Increase this if you need to configure more HID quirks at module load time
252 */
253#define MAX_USBHID_BOOT_QUIRKS 4
254
250#define HID_QUIRK_INVERT 0x00000001 255#define HID_QUIRK_INVERT 0x00000001
251#define HID_QUIRK_NOTOUCH 0x00000002 256#define HID_QUIRK_NOTOUCH 0x00000002
252#define HID_QUIRK_IGNORE 0x00000004 257#define HID_QUIRK_IGNORE 0x00000004
@@ -267,8 +272,9 @@ struct hid_item {
267#define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00020000 272#define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00020000
268#define HID_QUIRK_IGNORE_MOUSE 0x00040000 273#define HID_QUIRK_IGNORE_MOUSE 0x00040000
269#define HID_QUIRK_SONY_PS3_CONTROLLER 0x00080000 274#define HID_QUIRK_SONY_PS3_CONTROLLER 0x00080000
270#define HID_QUIRK_LOGITECH_S510_DESCRIPTOR 0x00100000 275#define HID_QUIRK_LOGITECH_DESCRIPTOR 0x00100000
271#define HID_QUIRK_DUPLICATE_USAGES 0x00200000 276#define HID_QUIRK_DUPLICATE_USAGES 0x00200000
277#define HID_QUIRK_RESET_LEDS 0x00400000
272 278
273/* 279/*
274 * This is the global environment of the parser. This information is 280 * This is the global environment of the parser. This information is
@@ -494,6 +500,12 @@ void hid_output_report(struct hid_report *report, __u8 *data);
494void hid_free_device(struct hid_device *device); 500void hid_free_device(struct hid_device *device);
495struct hid_device *hid_parse_report(__u8 *start, unsigned size); 501struct hid_device *hid_parse_report(__u8 *start, unsigned size);
496 502
503/* HID quirks API */
504u32 usbhid_lookup_quirk(const u16 idVendor, const u16 idProduct);
505int usbhid_modify_dquirk(const u16 idVendor, const u16 idProduct, const u32 quirks);
506int usbhid_quirks_init(char **quirks_param);
507void usbhid_quirks_exit(void);
508
497#ifdef CONFIG_HID_FF 509#ifdef CONFIG_HID_FF
498int hid_ff_init(struct hid_device *hid); 510int hid_ff_init(struct hid_device *hid);
499 511