HID: move ids into separate file
[pandora-kernel.git] / drivers / hid / usbhid / hid-quirks.c
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 #include "../hid-ids.h"
21
22 /*
23  * Alphabetically sorted blacklist by quirk type.
24  */
25
26 static const struct hid_blacklist {
27         __u16 idVendor;
28         __u16 idProduct;
29         __u32 quirks;
30 } hid_blacklist[] = {
31
32         { USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU, HID_QUIRK_2WHEEL_MOUSE_HACK_7 },
33         { USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D, HID_QUIRK_2WHEEL_MOUSE_HACK_B8 },
34         { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE, HID_QUIRK_2WHEEL_MOUSE_HACK_5 },
35
36         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RECEIVER, HID_QUIRK_BAD_RELATIVE_KEYS },
37
38         { USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_GAMEPAD, HID_QUIRK_BADPAD },
39         { USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_PREDATOR, HID_QUIRK_BADPAD },
40         { USB_VENDOR_ID_ALPS, USB_DEVICE_ID_IBM_GAMEPAD, HID_QUIRK_BADPAD },
41         { USB_VENDOR_ID_CHIC, USB_DEVICE_ID_CHIC_GAMEPAD, HID_QUIRK_BADPAD },
42         { USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR, HID_QUIRK_MULTI_INPUT },
43         { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_DRIVING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
44         { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FLYING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
45         { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FIGHTING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
46         { USB_VENDOR_ID_NATSU, USB_DEVICE_ID_NATSU_GAMEPAD, HID_QUIRK_BADPAD },
47         { USB_VENDOR_ID_NEC, USB_DEVICE_ID_NEC_USB_GAME_PAD, HID_QUIRK_BADPAD },
48         { USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RUMBLEPAD, HID_QUIRK_BADPAD },
49         { USB_VENDOR_ID_TOPMAX, USB_DEVICE_ID_TOPMAX_COBRAPAD, HID_QUIRK_BADPAD },
50
51         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_DESKTOP, HID_QUIRK_DUPLICATE_USAGES },
52         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_EDGE, HID_QUIRK_DUPLICATE_USAGES },
53         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_MINI, HID_QUIRK_DUPLICATE_USAGES },
54
55         { USB_VENDOR_ID_AFATECH, USB_DEVICE_ID_AFATECH_AF9016, HID_QUIRK_FULLSPEED_INTERVAL },
56
57         { USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM, HID_QUIRK_HIDDEV },
58         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4, HID_QUIRK_HIDDEV | HID_QUIRK_IGNORE_HIDINPUT },
59         { USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE, HID_QUIRK_HIDDEV | HID_QUIRK_IGNORE_HIDINPUT },
60         { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV, HID_QUIRK_HIDINPUT },
61
62         { USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193, HID_QUIRK_HWHEEL_WHEEL_INVERT },
63
64         { USB_VENDOR_ID_ADS_TECH, USB_DEVICE_ID_ADS_TECH_RADIO_SI470X, HID_QUIRK_IGNORE },
65         { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_01, HID_QUIRK_IGNORE },
66         { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_10, HID_QUIRK_IGNORE },
67         { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_20, HID_QUIRK_IGNORE },
68         { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_21, HID_QUIRK_IGNORE },
69         { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_22, HID_QUIRK_IGNORE },
70         { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_23, HID_QUIRK_IGNORE },
71         { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_24, HID_QUIRK_IGNORE },
72         { USB_VENDOR_ID_AIRCABLE, USB_DEVICE_ID_AIRCABLE1, HID_QUIRK_IGNORE },
73         { USB_VENDOR_ID_ALCOR, USB_DEVICE_ID_ALCOR_USBRS232, HID_QUIRK_IGNORE },
74         { USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_LCM, HID_QUIRK_IGNORE},
75         { USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD, HID_QUIRK_IGNORE },
76         { USB_VENDOR_ID_CIDC, 0x0103, HID_QUIRK_IGNORE },
77         { USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_RADIO_SI470X, HID_QUIRK_IGNORE },
78         { USB_VENDOR_ID_CMEDIA, USB_DEVICE_ID_CM109, HID_QUIRK_IGNORE },
79         { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_HIDCOM, HID_QUIRK_IGNORE },
80         { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_ULTRAMOUSE, HID_QUIRK_IGNORE },
81         { USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EARTHMATE, HID_QUIRK_IGNORE },
82         { USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20, HID_QUIRK_IGNORE },
83         { USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5, HID_QUIRK_IGNORE },
84         { USB_VENDOR_ID_GENERAL_TOUCH, 0x0001, HID_QUIRK_IGNORE },
85         { USB_VENDOR_ID_GENERAL_TOUCH, 0x0002, HID_QUIRK_IGNORE },
86         { USB_VENDOR_ID_GENERAL_TOUCH, 0x0003, HID_QUIRK_IGNORE },
87         { USB_VENDOR_ID_GENERAL_TOUCH, 0x0004, HID_QUIRK_IGNORE },
88         { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_4_PHIDGETSERVO_30, HID_QUIRK_IGNORE },
89         { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_1_PHIDGETSERVO_30, HID_QUIRK_IGNORE },
90         { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_0_4_IF_KIT, HID_QUIRK_IGNORE },
91         { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_16_16_IF_KIT, HID_QUIRK_IGNORE },
92         { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_8_8_8_IF_KIT, HID_QUIRK_IGNORE },
93         { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_8_7_IF_KIT, HID_QUIRK_IGNORE },
94         { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_8_8_IF_KIT, HID_QUIRK_IGNORE },
95         { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_PHIDGET_MOTORCONTROL, HID_QUIRK_IGNORE },
96         { USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_SUPER_Q2, HID_QUIRK_IGNORE },
97         { USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_GOGOPEN, HID_QUIRK_IGNORE },
98         { USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_PENPOWER, HID_QUIRK_IGNORE },
99         { USB_VENDOR_ID_GRETAGMACBETH, USB_DEVICE_ID_GRETAGMACBETH_HUEY, HID_QUIRK_IGNORE },
100         { USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_POWERMATE, HID_QUIRK_IGNORE },
101         { USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_SOUNDKNOB, HID_QUIRK_IGNORE },
102         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_90, HID_QUIRK_IGNORE },
103         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_100, HID_QUIRK_IGNORE },
104         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_101, HID_QUIRK_IGNORE },
105         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_103, HID_QUIRK_IGNORE },
106         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_104, HID_QUIRK_IGNORE },
107         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_105, HID_QUIRK_IGNORE },
108         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_106, HID_QUIRK_IGNORE },
109         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_107, HID_QUIRK_IGNORE },
110         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_108, HID_QUIRK_IGNORE },
111         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_200, HID_QUIRK_IGNORE },
112         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_201, HID_QUIRK_IGNORE },
113         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_202, HID_QUIRK_IGNORE },
114         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_203, HID_QUIRK_IGNORE },
115         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_204, HID_QUIRK_IGNORE },
116         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_205, HID_QUIRK_IGNORE },
117         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_206, HID_QUIRK_IGNORE },
118         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_207, HID_QUIRK_IGNORE },
119         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_300, HID_QUIRK_IGNORE },
120         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_301, HID_QUIRK_IGNORE },
121         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_302, HID_QUIRK_IGNORE },
122         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_303, HID_QUIRK_IGNORE },
123         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_304, HID_QUIRK_IGNORE },
124         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_305, HID_QUIRK_IGNORE },
125         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_306, HID_QUIRK_IGNORE },
126         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_307, HID_QUIRK_IGNORE },
127         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_308, HID_QUIRK_IGNORE },
128         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_309, HID_QUIRK_IGNORE },
129         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_400, HID_QUIRK_IGNORE },
130         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_401, HID_QUIRK_IGNORE },
131         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_402, HID_QUIRK_IGNORE },
132         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_403, HID_QUIRK_IGNORE },
133         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_404, HID_QUIRK_IGNORE },
134         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_405, HID_QUIRK_IGNORE },
135         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_500, HID_QUIRK_IGNORE },
136         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_501, HID_QUIRK_IGNORE },
137         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_502, HID_QUIRK_IGNORE },
138         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_503, HID_QUIRK_IGNORE },
139         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_504, HID_QUIRK_IGNORE },
140         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1000, HID_QUIRK_IGNORE },
141         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1001, HID_QUIRK_IGNORE },
142         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1002, HID_QUIRK_IGNORE },
143         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1003, HID_QUIRK_IGNORE },
144         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1004, HID_QUIRK_IGNORE },
145         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1005, HID_QUIRK_IGNORE },
146         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1006, HID_QUIRK_IGNORE },
147         { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1007, HID_QUIRK_IGNORE },
148         { USB_VENDOR_ID_IMATION, USB_DEVICE_ID_DISC_STAKKA, HID_QUIRK_IGNORE },
149         { USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO, HID_QUIRK_IGNORE },
150         { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY, HID_QUIRK_IGNORE },
151         { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY, HID_QUIRK_IGNORE },
152         { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY, HID_QUIRK_IGNORE },
153         { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM, HID_QUIRK_IGNORE },
154         { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP, HID_QUIRK_IGNORE },
155         { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP, HID_QUIRK_IGNORE },
156         { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY1, HID_QUIRK_IGNORE },
157         { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY2, HID_QUIRK_IGNORE },
158         { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_VIDEOCOM, HID_QUIRK_IGNORE },
159         { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_COM3LAB, HID_QUIRK_IGNORE },
160         { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_TELEPORT, HID_QUIRK_IGNORE },
161         { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_NETWORKANALYSER, HID_QUIRK_IGNORE },
162         { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERCONTROL, HID_QUIRK_IGNORE },
163         { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETEST, HID_QUIRK_IGNORE },
164         { USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1024LS, HID_QUIRK_IGNORE },
165         { USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1208LS, HID_QUIRK_IGNORE },
166         { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_IGNORE },
167         { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS1, HID_QUIRK_IGNORE },
168         { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100, HID_QUIRK_IGNORE },
169         { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 20, HID_QUIRK_IGNORE },
170         { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 30, HID_QUIRK_IGNORE },
171         { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 100, HID_QUIRK_IGNORE },
172         { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 108, HID_QUIRK_IGNORE },
173         { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 118, HID_QUIRK_IGNORE },
174         { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 200, HID_QUIRK_IGNORE },
175         { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 300, HID_QUIRK_IGNORE },
176         { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 400, HID_QUIRK_IGNORE },
177         { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 500, HID_QUIRK_IGNORE },
178         { USB_VENDOR_ID_PANJIT, 0x0001, HID_QUIRK_IGNORE },
179         { USB_VENDOR_ID_PANJIT, 0x0002, HID_QUIRK_IGNORE },
180         { USB_VENDOR_ID_PANJIT, 0x0003, HID_QUIRK_IGNORE },
181         { USB_VENDOR_ID_PANJIT, 0x0004, HID_QUIRK_IGNORE },
182         { USB_VENDOR_ID_SOUNDGRAPH, USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD, HID_QUIRK_IGNORE },
183         { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LABPRO, HID_QUIRK_IGNORE },
184         { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP, HID_QUIRK_IGNORE },
185         { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP, HID_QUIRK_IGNORE },
186         { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS, HID_QUIRK_IGNORE },
187         { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LCSPEC, HID_QUIRK_IGNORE },
188         { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_4_PHIDGETSERVO_20, HID_QUIRK_IGNORE },
189         { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20, HID_QUIRK_IGNORE },
190         { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_8_8_4_IF_KIT, HID_QUIRK_IGNORE },
191         { USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K, HID_QUIRK_IGNORE },
192
193         { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_FLAIR, HID_QUIRK_IGNORE },
194         { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_302, HID_QUIRK_IGNORE },
195
196         { USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT1, HID_QUIRK_IGNORE },
197         { USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT2, HID_QUIRK_IGNORE },
198
199         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_ELITE_KBD, HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL | HID_QUIRK_LOGITECH_EXPANDED_KEYMAP },
200         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500, HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL | HID_QUIRK_LOGITECH_EXPANDED_KEYMAP },
201         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_LX3, HID_QUIRK_INVERT_HWHEEL },
202         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_V150, HID_QUIRK_INVERT_HWHEEL },
203
204         { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE4K, HID_QUIRK_MICROSOFT_KEYS },
205         { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_LK6K, HID_QUIRK_MICROSOFT_KEYS },
206
207         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE, HID_QUIRK_MIGHTYMOUSE | HID_QUIRK_INVERT_HWHEEL },
208
209         { USB_VENDOR_ID_PANTHERLORD, USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK, HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS },
210         { USB_VENDOR_ID_PLAYDOTCOM, USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII, HID_QUIRK_MULTI_INPUT },
211
212         { USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER, HID_QUIRK_SONY_PS3_CONTROLLER | HID_QUIRK_HIDDEV },
213
214         { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_UC100KM, HID_QUIRK_NOGET },
215         { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS124U, HID_QUIRK_NOGET },
216         { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_2PORTKVM, HID_QUIRK_NOGET },
217         { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM, HID_QUIRK_NOGET },
218         { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC, HID_QUIRK_NOGET },
219         { USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET },
220         { USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET },
221         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_EXTREME_3D, HID_QUIRK_NOGET },
222         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WHEEL, HID_QUIRK_NOGET },
223         { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0, HID_QUIRK_NOGET },
224         { USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE, HID_QUIRK_NOGET },
225         { USB_VENDOR_ID_SUN, USB_DEVICE_ID_RARITAN_KVM_DONGLE, HID_QUIRK_NOGET },
226         { USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD, HID_QUIRK_NOGET },
227         { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS },
228         { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_QUAD_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
229
230         { USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
231
232         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
233         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
234         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
235         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD},
236         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
237         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
238         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD},
239         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
240         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
241         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD},
242         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
243         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ANSI, HID_QUIRK_APPLE_HAS_FN },
244         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD },
245         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_JIS, HID_QUIRK_APPLE_HAS_FN },
246         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
247         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
248         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
249         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN },
250         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD },
251         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN },
252         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
253         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD | HID_QUIRK_IGNORE_MOUSE},
254         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE},
255         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE},
256         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD | HID_QUIRK_IGNORE_MOUSE },
257         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS, HID_QUIRK_APPLE_HAS_FN  | HID_QUIRK_IGNORE_MOUSE },
258         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
259         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
260
261         { USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_W7658, HID_QUIRK_RESET_LEDS },
262         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_KBD, HID_QUIRK_RESET_LEDS },
263         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY, HID_QUIRK_IGNORE },
264         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_2, HID_QUIRK_IGNORE },
265         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_3, HID_QUIRK_IGNORE },
266         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_4, HID_QUIRK_IGNORE },
267         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_5, HID_QUIRK_IGNORE },
268         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_6, HID_QUIRK_IGNORE },
269         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_7, HID_QUIRK_IGNORE },
270         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_8, HID_QUIRK_IGNORE },
271         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_9, HID_QUIRK_IGNORE },
272         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_10, HID_QUIRK_IGNORE },
273         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_11, HID_QUIRK_IGNORE },
274         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_12, HID_QUIRK_IGNORE },
275         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_13, HID_QUIRK_IGNORE },
276         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_14, HID_QUIRK_IGNORE },
277         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_15, HID_QUIRK_IGNORE },
278         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_16, HID_QUIRK_IGNORE },
279         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_17, HID_QUIRK_IGNORE },
280         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_18, HID_QUIRK_IGNORE },
281         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_19, HID_QUIRK_IGNORE },
282         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_20, HID_QUIRK_IGNORE },
283         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_21, HID_QUIRK_IGNORE },
284         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_22, HID_QUIRK_IGNORE },
285         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_23, HID_QUIRK_IGNORE },
286         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_24, HID_QUIRK_IGNORE },
287         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_25, HID_QUIRK_IGNORE },
288         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_26, HID_QUIRK_IGNORE },
289         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_27, HID_QUIRK_IGNORE },
290         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_28, HID_QUIRK_IGNORE },
291         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_29, HID_QUIRK_IGNORE },
292         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_30, HID_QUIRK_IGNORE },
293         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_31, HID_QUIRK_IGNORE },
294         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_32, HID_QUIRK_IGNORE },
295         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_33, HID_QUIRK_IGNORE },
296         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_34, HID_QUIRK_IGNORE },
297         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_35, HID_QUIRK_IGNORE },
298         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_36, HID_QUIRK_IGNORE },
299         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_37, HID_QUIRK_IGNORE },
300         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_38, HID_QUIRK_IGNORE },
301         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_39, HID_QUIRK_IGNORE },
302         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_40, HID_QUIRK_IGNORE },
303         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_41, HID_QUIRK_IGNORE },
304         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_42, HID_QUIRK_IGNORE },
305         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_43, HID_QUIRK_IGNORE },
306         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_44, HID_QUIRK_IGNORE },
307         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_45, HID_QUIRK_IGNORE },
308         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_46, HID_QUIRK_IGNORE },
309         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_47, HID_QUIRK_IGNORE },
310         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_48, HID_QUIRK_IGNORE },
311         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_49, HID_QUIRK_IGNORE },
312         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_50, HID_QUIRK_IGNORE },
313         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_51, HID_QUIRK_IGNORE },
314         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_52, HID_QUIRK_IGNORE },
315         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_53, HID_QUIRK_IGNORE },
316         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_54, HID_QUIRK_IGNORE },
317         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_55, HID_QUIRK_IGNORE },
318         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_56, HID_QUIRK_IGNORE },
319         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_57, HID_QUIRK_IGNORE },
320         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_58, HID_QUIRK_IGNORE },
321         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_59, HID_QUIRK_IGNORE },
322         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_60, HID_QUIRK_IGNORE },
323         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_61, HID_QUIRK_IGNORE },
324         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_62, HID_QUIRK_IGNORE },
325         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_63, HID_QUIRK_IGNORE },
326         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_64, HID_QUIRK_IGNORE },
327         { USB_VENDOR_ID_NATIONAL_SEMICONDUCTOR, USB_DEVICE_ID_N_S_HARMONY, HID_QUIRK_IGNORE },
328         { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_GPEN_560, HID_QUIRK_IGNORE },
329
330         { 0, 0 }
331 };
332
333 /* Quirks for devices which require report descriptor fixup go here */
334 static const struct hid_rdesc_blacklist {
335         __u16 idVendor;
336         __u16 idProduct;
337         __u32 quirks;
338 } hid_rdesc_blacklist[] = {
339
340         { USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION, HID_QUIRK_RDESC_CYMOTION },
341
342         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER, HID_QUIRK_RDESC_LOGITECH },
343         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER, HID_QUIRK_RDESC_LOGITECH },
344         { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER_2, HID_QUIRK_RDESC_LOGITECH },
345         { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_DESKTOP_RECV_1028, HID_QUIRK_RDESC_MICROSOFT_RECV_1028 },
346
347         { USB_VENDOR_ID_MONTEREY, USB_DEVICE_ID_GENIUS_KB29E, HID_QUIRK_RDESC_BUTTON_CONSUMER },
348
349         { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_RDESC_MACBOOK_JIS },
350
351         { USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE, HID_QUIRK_RDESC_PETALYNX },
352
353         { USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE, HID_QUIRK_RDESC_SAMSUNG_REMOTE },
354
355         { USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP, HID_QUIRK_RDESC_SUNPLUS_WDESKTOP },
356
357         { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1, HID_QUIRK_RDESC_SWAPPED_MIN_MAX },
358         { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2, HID_QUIRK_RDESC_SWAPPED_MIN_MAX },
359
360         { 0, 0 }
361 };
362
363 /* Dynamic HID quirks list - specified at runtime */
364 struct quirks_list_struct {
365         struct hid_blacklist hid_bl_item;
366         struct list_head node;
367 };
368
369 static LIST_HEAD(dquirks_list);
370 static DECLARE_RWSEM(dquirks_rwsem);
371
372 /* Runtime ("dynamic") quirks manipulation functions */
373
374 /**
375  * usbhid_exists_dquirk: find any dynamic quirks for a USB HID device
376  * @idVendor: the 16-bit USB vendor ID, in native byteorder
377  * @idProduct: the 16-bit USB product ID, in native byteorder
378  *
379  * Description:
380  *         Scans dquirks_list for a matching dynamic quirk and returns
381  *         the pointer to the relevant struct hid_blacklist if found.
382  *         Must be called with a read lock held on dquirks_rwsem.
383  *
384  * Returns: NULL if no quirk found, struct hid_blacklist * if found.
385  */
386 static struct hid_blacklist *usbhid_exists_dquirk(const u16 idVendor,
387                 const u16 idProduct)
388 {
389         struct quirks_list_struct *q;
390         struct hid_blacklist *bl_entry = NULL;
391
392         list_for_each_entry(q, &dquirks_list, node) {
393                 if (q->hid_bl_item.idVendor == idVendor &&
394                                 q->hid_bl_item.idProduct == idProduct) {
395                         bl_entry = &q->hid_bl_item;
396                         break;
397                 }
398         }
399
400         if (bl_entry != NULL)
401                 dbg_hid("Found dynamic quirk 0x%x for USB HID vendor 0x%hx prod 0x%hx\n",
402                                 bl_entry->quirks, bl_entry->idVendor,
403                                 bl_entry->idProduct);
404
405         return bl_entry;
406 }
407
408
409 /**
410  * usbhid_modify_dquirk: add/replace a HID quirk
411  * @idVendor: the 16-bit USB vendor ID, in native byteorder
412  * @idProduct: the 16-bit USB product ID, in native byteorder
413  * @quirks: the u32 quirks value to add/replace
414  *
415  * Description:
416  *         If an dynamic quirk exists in memory for this (idVendor,
417  *         idProduct) pair, replace its quirks value with what was
418  *         provided.  Otherwise, add the quirk to the dynamic quirks list.
419  *
420  * Returns: 0 OK, -error on failure.
421  */
422 static int usbhid_modify_dquirk(const u16 idVendor, const u16 idProduct,
423                                 const u32 quirks)
424 {
425         struct quirks_list_struct *q_new, *q;
426         int list_edited = 0;
427
428         if (!idVendor) {
429                 dbg_hid("Cannot add a quirk with idVendor = 0\n");
430                 return -EINVAL;
431         }
432
433         q_new = kmalloc(sizeof(struct quirks_list_struct), GFP_KERNEL);
434         if (!q_new) {
435                 dbg_hid("Could not allocate quirks_list_struct\n");
436                 return -ENOMEM;
437         }
438
439         q_new->hid_bl_item.idVendor = idVendor;
440         q_new->hid_bl_item.idProduct = idProduct;
441         q_new->hid_bl_item.quirks = quirks;
442
443         down_write(&dquirks_rwsem);
444
445         list_for_each_entry(q, &dquirks_list, node) {
446
447                 if (q->hid_bl_item.idVendor == idVendor &&
448                                 q->hid_bl_item.idProduct == idProduct) {
449
450                         list_replace(&q->node, &q_new->node);
451                         kfree(q);
452                         list_edited = 1;
453                         break;
454
455                 }
456
457         }
458
459         if (!list_edited)
460                 list_add_tail(&q_new->node, &dquirks_list);
461
462         up_write(&dquirks_rwsem);
463
464         return 0;
465 }
466
467 /**
468  * usbhid_remove_all_dquirks: remove all runtime HID quirks from memory
469  *
470  * Description:
471  *         Free all memory associated with dynamic quirks - called before
472  *         module unload.
473  *
474  */
475 static void usbhid_remove_all_dquirks(void)
476 {
477         struct quirks_list_struct *q, *temp;
478
479         down_write(&dquirks_rwsem);
480         list_for_each_entry_safe(q, temp, &dquirks_list, node) {
481                 list_del(&q->node);
482                 kfree(q);
483         }
484         up_write(&dquirks_rwsem);
485
486 }
487
488 /** 
489  * usbhid_quirks_init: apply USB HID quirks specified at module load time
490  */
491 int usbhid_quirks_init(char **quirks_param)
492 {
493         u16 idVendor, idProduct;
494         u32 quirks;
495         int n = 0, m;
496
497         for (; quirks_param[n] && n < MAX_USBHID_BOOT_QUIRKS; n++) {
498
499                 m = sscanf(quirks_param[n], "0x%hx:0x%hx:0x%x",
500                                 &idVendor, &idProduct, &quirks);
501
502                 if (m != 3 ||
503                                 usbhid_modify_dquirk(idVendor, idProduct, quirks) != 0) {
504                         printk(KERN_WARNING
505                                         "Could not parse HID quirk module param %s\n",
506                                         quirks_param[n]);
507                 }
508         }
509
510         return 0;
511 }
512
513 /**
514  * usbhid_quirks_exit: release memory associated with dynamic_quirks
515  *
516  * Description:
517  *     Release all memory associated with dynamic quirks.  Called upon
518  *     module unload.
519  *
520  * Returns: nothing
521  */
522 void usbhid_quirks_exit(void)
523 {
524         usbhid_remove_all_dquirks();
525 }
526
527 /**
528  * usbhid_exists_squirk: return any static quirks for a USB HID device
529  * @idVendor: the 16-bit USB vendor ID, in native byteorder
530  * @idProduct: the 16-bit USB product ID, in native byteorder
531  *
532  * Description:
533  *     Given a USB vendor ID and product ID, return a pointer to
534  *     the hid_blacklist entry associated with that device.
535  *
536  * Returns: pointer if quirk found, or NULL if no quirks found.
537  */
538 static const struct hid_blacklist *usbhid_exists_squirk(const u16 idVendor,
539                 const u16 idProduct)
540 {
541         const struct hid_blacklist *bl_entry = NULL;
542         int n = 0;
543
544         for (; hid_blacklist[n].idVendor; n++)
545                 if (hid_blacklist[n].idVendor == idVendor &&
546                                 hid_blacklist[n].idProduct == idProduct)
547                         bl_entry = &hid_blacklist[n];
548
549         if (bl_entry != NULL)
550                 dbg_hid("Found squirk 0x%x for USB HID vendor 0x%hx prod 0x%hx\n",
551                                 bl_entry->quirks, bl_entry->idVendor, 
552                                 bl_entry->idProduct);
553         return bl_entry;
554 }
555
556 /**
557  * usbhid_lookup_quirk: return any quirks associated with a USB HID device
558  * @idVendor: the 16-bit USB vendor ID, in native byteorder
559  * @idProduct: the 16-bit USB product ID, in native byteorder
560  *
561  * Description:
562  *     Given a USB vendor ID and product ID, return any quirks associated
563  *     with that device.
564  *
565  * Returns: a u32 quirks value.
566  */
567 u32 usbhid_lookup_quirk(const u16 idVendor, const u16 idProduct)
568 {
569         u32 quirks = 0;
570         const struct hid_blacklist *bl_entry = NULL;
571
572         /* Ignore all Wacom devices */
573         if (idVendor == USB_VENDOR_ID_WACOM)
574                 return HID_QUIRK_IGNORE;
575
576         /* ignore all Code Mercenaries IOWarrior devices */
577         if (idVendor == USB_VENDOR_ID_CODEMERCS)
578                 if (idProduct >= USB_DEVICE_ID_CODEMERCS_IOW_FIRST &&
579                                 idProduct <= USB_DEVICE_ID_CODEMERCS_IOW_LAST)
580                         return HID_QUIRK_IGNORE;
581
582         /* NCR devices must not be queried for reports */
583         if (idVendor == USB_VENDOR_ID_NCR &&
584                         idProduct >= USB_DEVICE_ID_NCR_FIRST &&
585                         idProduct <= USB_DEVICE_ID_NCR_LAST)
586                         return HID_QUIRK_NOGET;
587
588         down_read(&dquirks_rwsem);
589         bl_entry = usbhid_exists_dquirk(idVendor, idProduct);
590         if (!bl_entry)
591                 bl_entry = usbhid_exists_squirk(idVendor, idProduct);
592         if (bl_entry)
593                 quirks = bl_entry->quirks;
594         up_read(&dquirks_rwsem);
595
596         return quirks;
597 }
598
599 EXPORT_SYMBOL_GPL(usbhid_lookup_quirk);
600
601 /*
602  * Cherry Cymotion keyboard have an invalid HID report descriptor,
603  * that needs fixing before we can parse it.
604  */
605 static void usbhid_fixup_cymotion_descriptor(char *rdesc, int rsize)
606 {
607         if (rsize >= 17 && rdesc[11] == 0x3c && rdesc[12] == 0x02) {
608                 printk(KERN_INFO "Fixing up Cherry Cymotion report descriptor\n");
609                 rdesc[11] = rdesc[16] = 0xff;
610                 rdesc[12] = rdesc[17] = 0x03;
611         }
612 }
613
614
615 /*
616  * Certain Logitech keyboards send in report #3 keys which are far
617  * above the logical maximum described in descriptor. This extends
618  * the original value of 0x28c of logical maximum to 0x104d
619  */
620 static void usbhid_fixup_logitech_descriptor(unsigned char *rdesc, int rsize)
621 {
622         if (rsize >= 90 && rdesc[83] == 0x26
623                         && rdesc[84] == 0x8c
624                         && rdesc[85] == 0x02) {
625                 printk(KERN_INFO "Fixing up Logitech keyboard report descriptor\n");
626                 rdesc[84] = rdesc[89] = 0x4d;
627                 rdesc[85] = rdesc[90] = 0x10;
628         }
629 }
630
631 static void usbhid_fixup_sunplus_wdesktop(unsigned char *rdesc, int rsize)
632 {
633         if (rsize >= 107 && rdesc[104] == 0x26
634                          && rdesc[105] == 0x80
635                          && rdesc[106] == 0x03) {
636                 printk(KERN_INFO "Fixing up Sunplus Wireless Desktop report descriptor\n");
637                 rdesc[105] = rdesc[110] = 0x03;
638                 rdesc[106] = rdesc[111] = 0x21;
639         }
640 }
641
642 /*
643  * Samsung IrDA remote controller (reports as Cypress USB Mouse).
644  *
645  * Vendor specific report #4 has a size of 48 bit,
646  * and therefore is not accepted when inspecting the descriptors.
647  * As a workaround we reinterpret the report as:
648  *   Variable type, count 6, size 8 bit, log. maximum 255
649  * The burden to reconstruct the data is moved into user space.
650  */
651 static void usbhid_fixup_samsung_irda_descriptor(unsigned char *rdesc,
652                                                   int rsize)
653 {
654         if (rsize >= 182 && rdesc[175] == 0x25
655                          && rdesc[176] == 0x40
656                          && rdesc[177] == 0x75
657                          && rdesc[178] == 0x30
658                          && rdesc[179] == 0x95
659                          && rdesc[180] == 0x01
660                          && rdesc[182] == 0x40) {
661                 printk(KERN_INFO "Fixing up Samsung IrDA report descriptor\n");
662                 rdesc[176] = 0xff;
663                 rdesc[178] = 0x08;
664                 rdesc[180] = 0x06;
665                 rdesc[182] = 0x42;
666         }
667 }
668
669 /* Petalynx Maxter Remote has maximum for consumer page set too low */
670 static void usbhid_fixup_petalynx_descriptor(unsigned char *rdesc, int rsize)
671 {
672         if (rsize >= 60 && rdesc[39] == 0x2a
673                         && rdesc[40] == 0xf5
674                         && rdesc[41] == 0x00
675                         && rdesc[59] == 0x26
676                         && rdesc[60] == 0xf9
677                         && rdesc[61] == 0x00) {
678                 printk(KERN_INFO "Fixing up Petalynx Maxter Remote report descriptor\n");
679                 rdesc[60] = 0xfa;
680                 rdesc[40] = 0xfa;
681         }
682 }
683
684 /*
685  * Some USB barcode readers from cypress have usage min and usage max in
686  * the wrong order
687  */
688 static void usbhid_fixup_cypress_descriptor(unsigned char *rdesc, int rsize)
689 {
690         short fixed = 0;
691         int i;
692
693         for (i = 0; i < rsize - 4; i++) {
694                 if (rdesc[i] == 0x29 && rdesc [i+2] == 0x19) {
695                         unsigned char tmp;
696
697                         rdesc[i] = 0x19; rdesc[i+2] = 0x29;
698                         tmp = rdesc[i+3];
699                         rdesc[i+3] = rdesc[i+1];
700                         rdesc[i+1] = tmp;
701                 }
702         }
703
704         if (fixed)
705                 printk(KERN_INFO "Fixing up Cypress report descriptor\n");
706 }
707
708 /*
709  * MacBook JIS keyboard has wrong logical maximum
710  */
711 static void usbhid_fixup_macbook_descriptor(unsigned char *rdesc, int rsize)
712 {
713         if (rsize >= 60 && rdesc[53] == 0x65
714                         && rdesc[59] == 0x65) {
715                 printk(KERN_INFO "Fixing up MacBook JIS keyboard report descriptor\n");
716                 rdesc[53] = rdesc[59] = 0xe7;
717         }
718 }
719
720 static void usbhid_fixup_button_consumer_descriptor(unsigned char *rdesc, int rsize)
721 {
722         if (rsize >= 30 && rdesc[29] == 0x05
723                         && rdesc[30] == 0x09) {
724                 printk(KERN_INFO "Fixing up button/consumer in HID report descriptor\n");
725                 rdesc[30] = 0x0c;
726         }
727 }
728
729 /*
730  * Microsoft Wireless Desktop Receiver (Model 1028) has several
731  * 'Usage Min/Max' where it ought to have 'Physical Min/Max'
732  */
733 static void usbhid_fixup_microsoft_descriptor(unsigned char *rdesc, int rsize)
734 {
735         if (rsize == 571 && rdesc[284] == 0x19
736                          && rdesc[286] == 0x2a
737                          && rdesc[304] == 0x19
738                          && rdesc[306] == 0x29
739                          && rdesc[352] == 0x1a
740                          && rdesc[355] == 0x2a
741                          && rdesc[557] == 0x19
742                          && rdesc[559] == 0x29) {
743                 printk(KERN_INFO "Fixing up Microsoft Wireless Receiver Model 1028 report descriptor\n");
744                 rdesc[284] = rdesc[304] = rdesc[557] = 0x35;
745                 rdesc[352] = 0x36;
746                 rdesc[286] = rdesc[355] = 0x46;
747                 rdesc[306] = rdesc[559] = 0x45;
748         }
749 }
750
751 static void __usbhid_fixup_report_descriptor(__u32 quirks, char *rdesc, unsigned rsize)
752 {
753         if ((quirks & HID_QUIRK_RDESC_CYMOTION))
754                 usbhid_fixup_cymotion_descriptor(rdesc, rsize);
755
756         if (quirks & HID_QUIRK_RDESC_LOGITECH)
757                 usbhid_fixup_logitech_descriptor(rdesc, rsize);
758
759         if (quirks & HID_QUIRK_RDESC_SWAPPED_MIN_MAX)
760                 usbhid_fixup_cypress_descriptor(rdesc, rsize);
761
762         if (quirks & HID_QUIRK_RDESC_PETALYNX)
763                 usbhid_fixup_petalynx_descriptor(rdesc, rsize);
764
765         if (quirks & HID_QUIRK_RDESC_MACBOOK_JIS)
766                 usbhid_fixup_macbook_descriptor(rdesc, rsize);
767
768         if (quirks & HID_QUIRK_RDESC_BUTTON_CONSUMER)
769                 usbhid_fixup_button_consumer_descriptor(rdesc, rsize);
770
771         if (quirks & HID_QUIRK_RDESC_SAMSUNG_REMOTE)
772                 usbhid_fixup_samsung_irda_descriptor(rdesc, rsize);
773
774         if (quirks & HID_QUIRK_RDESC_MICROSOFT_RECV_1028)
775                 usbhid_fixup_microsoft_descriptor(rdesc, rsize);
776
777         if (quirks & HID_QUIRK_RDESC_SUNPLUS_WDESKTOP)
778                 usbhid_fixup_sunplus_wdesktop(rdesc, rsize);
779 }
780
781 /**
782  * usbhid_fixup_report_descriptor: check if report descriptor needs fixup
783  *
784  * Description:
785  *      Walks the hid_rdesc_blacklist[] array and checks whether the device
786  *      is known to have broken report descriptor that needs to be fixed up
787  *      prior to entering the HID parser
788  *
789  * Returns: nothing
790  */
791 void usbhid_fixup_report_descriptor(const u16 idVendor, const u16 idProduct,
792                                     char *rdesc, unsigned rsize, char **quirks_param)
793 {
794         int n, m;
795         u16 paramVendor, paramProduct;
796         u32 quirks;
797
798         /* static rdesc quirk entries */
799         for (n = 0; hid_rdesc_blacklist[n].idVendor; n++)
800                 if (hid_rdesc_blacklist[n].idVendor == idVendor &&
801                                 hid_rdesc_blacklist[n].idProduct == idProduct)
802                         __usbhid_fixup_report_descriptor(hid_rdesc_blacklist[n].quirks,
803                                         rdesc, rsize);
804
805         /* runtime rdesc quirk entries handling */
806         for (n = 0; quirks_param[n] && n < MAX_USBHID_BOOT_QUIRKS; n++) {
807                 m = sscanf(quirks_param[n], "0x%hx:0x%hx:0x%x",
808                                 &paramVendor, &paramProduct, &quirks);
809
810                 if (m != 3)
811                         printk(KERN_WARNING
812                                 "Could not parse HID quirk module param %s\n",
813                                 quirks_param[n]);
814                 else if (paramVendor == idVendor && paramProduct == idProduct)
815                         __usbhid_fixup_report_descriptor(quirks, rdesc, rsize);
816         }
817 }