aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/input/hid-input.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/input/hid-input.c')
-rw-r--r--drivers/usb/input/hid-input.c66
1 files changed, 62 insertions, 4 deletions
diff --git a/drivers/usb/input/hid-input.c b/drivers/usb/input/hid-input.c
index 63a4db721f7e..0b6452248a39 100644
--- a/drivers/usb/input/hid-input.c
+++ b/drivers/usb/input/hid-input.c
@@ -78,8 +78,8 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
78{ 78{
79 struct input_dev *input = &hidinput->input; 79 struct input_dev *input = &hidinput->input;
80 struct hid_device *device = hidinput->input.private; 80 struct hid_device *device = hidinput->input.private;
81 int max, code; 81 int max = 0, code;
82 unsigned long *bit; 82 unsigned long *bit = NULL;
83 83
84 field->hidinput = hidinput; 84 field->hidinput = hidinput;
85 85
@@ -131,6 +131,15 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
131 map_key(code); 131 map_key(code);
132 break; 132 break;
133 133
134
135 case HID_UP_SIMULATION:
136
137 switch (usage->hid & 0xffff) {
138 case 0xba: map_abs(ABS_RUDDER); break;
139 case 0xbb: map_abs(ABS_THROTTLE); break;
140 }
141 break;
142
134 case HID_UP_GENDESK: 143 case HID_UP_GENDESK:
135 144
136 if ((usage->hid & 0xf0) == 0x80) { /* SystemControl */ 145 if ((usage->hid & 0xf0) == 0x80) { /* SystemControl */
@@ -238,8 +247,12 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
238 case 0x000: goto ignore; 247 case 0x000: goto ignore;
239 case 0x034: map_key_clear(KEY_SLEEP); break; 248 case 0x034: map_key_clear(KEY_SLEEP); break;
240 case 0x036: map_key_clear(BTN_MISC); break; 249 case 0x036: map_key_clear(BTN_MISC); break;
250 case 0x045: map_key_clear(KEY_RADIO); break;
241 case 0x08a: map_key_clear(KEY_WWW); break; 251 case 0x08a: map_key_clear(KEY_WWW); break;
252 case 0x08d: map_key_clear(KEY_PROGRAM); break;
242 case 0x095: map_key_clear(KEY_HELP); break; 253 case 0x095: map_key_clear(KEY_HELP); break;
254 case 0x09c: map_key_clear(KEY_CHANNELUP); break;
255 case 0x09d: map_key_clear(KEY_CHANNELDOWN); break;
243 case 0x0b0: map_key_clear(KEY_PLAY); break; 256 case 0x0b0: map_key_clear(KEY_PLAY); break;
244 case 0x0b1: map_key_clear(KEY_PAUSE); break; 257 case 0x0b1: map_key_clear(KEY_PAUSE); break;
245 case 0x0b2: map_key_clear(KEY_RECORD); break; 258 case 0x0b2: map_key_clear(KEY_RECORD); break;
@@ -259,6 +272,11 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
259 case 0x18a: map_key_clear(KEY_MAIL); break; 272 case 0x18a: map_key_clear(KEY_MAIL); break;
260 case 0x192: map_key_clear(KEY_CALC); break; 273 case 0x192: map_key_clear(KEY_CALC); break;
261 case 0x194: map_key_clear(KEY_FILE); break; 274 case 0x194: map_key_clear(KEY_FILE); break;
275 case 0x1a7: map_key_clear(KEY_DOCUMENTS); break;
276 case 0x201: map_key_clear(KEY_NEW); break;
277 case 0x207: map_key_clear(KEY_SAVE); break;
278 case 0x208: map_key_clear(KEY_PRINT); break;
279 case 0x209: map_key_clear(KEY_PROPS); break;
262 case 0x21a: map_key_clear(KEY_UNDO); break; 280 case 0x21a: map_key_clear(KEY_UNDO); break;
263 case 0x21b: map_key_clear(KEY_COPY); break; 281 case 0x21b: map_key_clear(KEY_COPY); break;
264 case 0x21c: map_key_clear(KEY_CUT); break; 282 case 0x21c: map_key_clear(KEY_CUT); break;
@@ -271,7 +289,11 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
271 case 0x227: map_key_clear(KEY_REFRESH); break; 289 case 0x227: map_key_clear(KEY_REFRESH); break;
272 case 0x22a: map_key_clear(KEY_BOOKMARKS); break; 290 case 0x22a: map_key_clear(KEY_BOOKMARKS); break;
273 case 0x238: map_rel(REL_HWHEEL); break; 291 case 0x238: map_rel(REL_HWHEEL); break;
274 default: goto unknown; 292 case 0x279: map_key_clear(KEY_REDO); break;
293 case 0x289: map_key_clear(KEY_REPLY); break;
294 case 0x28b: map_key_clear(KEY_FORWARDMAIL); break;
295 case 0x28c: map_key_clear(KEY_SEND); break;
296 default: goto ignore;
275 } 297 }
276 break; 298 break;
277 299
@@ -296,9 +318,42 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
296 break; 318 break;
297 319
298 case HID_UP_MSVENDOR: 320 case HID_UP_MSVENDOR:
299
300 goto ignore; 321 goto ignore;
301 322
323 case HID_UP_CUSTOM: /* Reported on Logitech and Powerbook USB keyboards */
324
325 set_bit(EV_REP, input->evbit);
326 switch(usage->hid & HID_USAGE) {
327 case 0x003: map_key_clear(KEY_FN); break;
328 default: goto ignore;
329 }
330 break;
331
332 case HID_UP_LOGIVENDOR: /* Reported on Logitech Ultra X Media Remote */
333
334 set_bit(EV_REP, input->evbit);
335 switch(usage->hid & HID_USAGE) {
336 case 0x004: map_key_clear(KEY_AGAIN); break;
337 case 0x00d: map_key_clear(KEY_HOME); break;
338 case 0x024: map_key_clear(KEY_SHUFFLE); break;
339 case 0x025: map_key_clear(KEY_TV); break;
340 case 0x026: map_key_clear(KEY_MENU); break;
341 case 0x031: map_key_clear(KEY_AUDIO); break;
342 case 0x032: map_key_clear(KEY_SUBTITLE); break;
343 case 0x033: map_key_clear(KEY_LAST); break;
344 case 0x047: map_key_clear(KEY_MP3); break;
345 case 0x048: map_key_clear(KEY_DVD); break;
346 case 0x049: map_key_clear(KEY_MEDIA); break;
347 case 0x04a: map_key_clear(KEY_VIDEO); break;
348 case 0x04b: map_key_clear(KEY_ANGLE); break;
349 case 0x04c: map_key_clear(KEY_LANGUAGE); break;
350 case 0x04d: map_key_clear(KEY_SUBTITLE); break;
351 case 0x051: map_key_clear(KEY_RED); break;
352 case 0x052: map_key_clear(KEY_CLOSE); break;
353 default: goto ignore;
354 }
355 break;
356
302 case HID_UP_PID: 357 case HID_UP_PID:
303 358
304 set_bit(EV_FF, input->evbit); 359 set_bit(EV_FF, input->evbit);
@@ -349,6 +404,9 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
349 if (usage->code > max) 404 if (usage->code > max)
350 goto ignore; 405 goto ignore;
351 406
407 if (((device->quirks & (HID_QUIRK_2WHEEL_POWERMOUSE)) && (usage->hid == 0x00010032)))
408 map_rel(REL_HWHEEL);
409
352 if ((device->quirks & (HID_QUIRK_2WHEEL_MOUSE_HACK_7 | HID_QUIRK_2WHEEL_MOUSE_HACK_5)) && 410 if ((device->quirks & (HID_QUIRK_2WHEEL_MOUSE_HACK_7 | HID_QUIRK_2WHEEL_MOUSE_HACK_5)) &&
353 (usage->type == EV_REL) && (usage->code == REL_WHEEL)) 411 (usage->type == EV_REL) && (usage->code == REL_WHEEL))
354 set_bit(REL_HWHEEL, bit); 412 set_bit(REL_HWHEEL, bit);