]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blame - drivers/usb/input/hid-input.c
Input: wacom - fix compile on PowerPC
[mirror_ubuntu-hirsute-kernel.git] / drivers / usb / input / hid-input.c
CommitLineData
1da177e4
LT
1/*
2 * $Id: hid-input.c,v 1.2 2002/04/23 00:59:25 rdamazio Exp $
3 *
4 * Copyright (c) 2000-2001 Vojtech Pavlik
5 *
6 * USB HID to Linux Input mapping
7 */
8
9/*
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 *
24 * Should you need to contact me, the author, you can do so either by
25 * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
26 * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
27 */
28
29#include <linux/module.h>
30#include <linux/slab.h>
31#include <linux/kernel.h>
32#include <linux/input.h>
33#include <linux/usb.h>
16a334c0 34#include <linux/usb_input.h>
1da177e4
LT
35
36#undef DEBUG
37
38#include "hid.h"
39
40#define unk KEY_UNKNOWN
41
4c4c9432 42static const unsigned char hid_keyboard[256] = {
1da177e4
LT
43 0, 0, 0, 0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38,
44 50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44, 2, 3,
45 4, 5, 6, 7, 8, 9, 10, 11, 28, 1, 14, 15, 57, 12, 13, 26,
46 27, 43, 43, 39, 40, 41, 51, 52, 53, 58, 59, 60, 61, 62, 63, 64,
47 65, 66, 67, 68, 87, 88, 99, 70,119,110,102,104,111,107,109,106,
48 105,108,103, 69, 98, 55, 74, 78, 96, 79, 80, 81, 75, 76, 77, 71,
49 72, 73, 82, 83, 86,127,116,117,183,184,185,186,187,188,189,190,
50 191,192,193,194,134,138,130,132,128,129,131,137,133,135,136,113,
51 115,114,unk,unk,unk,121,unk, 89, 93,124, 92, 94, 95,unk,unk,unk,
52 122,123, 90, 91, 85,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
53 unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
54 unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
55 unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
56 unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
57 29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113,
58 150,158,159,128,136,177,178,176,142,152,173,140,unk,unk,unk,unk
59};
60
4c4c9432 61static const struct {
1da177e4
LT
62 __s32 x;
63 __s32 y;
64} hid_hat_to_axis[] = {{ 0, 0}, { 0,-1}, { 1,-1}, { 1, 0}, { 1, 1}, { 0, 1}, {-1, 1}, {-1, 0}, {-1,-1}};
65
66#define map_abs(c) do { usage->code = c; usage->type = EV_ABS; bit = input->absbit; max = ABS_MAX; } while (0)
67#define map_rel(c) do { usage->code = c; usage->type = EV_REL; bit = input->relbit; max = REL_MAX; } while (0)
68#define map_key(c) do { usage->code = c; usage->type = EV_KEY; bit = input->keybit; max = KEY_MAX; } while (0)
69#define map_led(c) do { usage->code = c; usage->type = EV_LED; bit = input->ledbit; max = LED_MAX; } while (0)
70#define map_ff(c) do { usage->code = c; usage->type = EV_FF; bit = input->ffbit; max = FF_MAX; } while (0)
71
72#define map_abs_clear(c) do { map_abs(c); clear_bit(c, bit); } while (0)
73#define map_key_clear(c) do { map_key(c); clear_bit(c, bit); } while (0)
74#define map_ff_effect(c) do { set_bit(c, input->ffbit); } while (0)
75
76static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_field *field,
77 struct hid_usage *usage)
78{
c5b7c7c3
DT
79 struct input_dev *input = hidinput->input;
80 struct hid_device *device = input->private;
8a409b01
VP
81 int max = 0, code;
82 unsigned long *bit = NULL;
1da177e4
LT
83
84 field->hidinput = hidinput;
85
86#ifdef DEBUG
87 printk(KERN_DEBUG "Mapping: ");
88 resolv_usage(usage->hid);
89 printk(" ---> ");
90#endif
91
92 if (field->flags & HID_MAIN_ITEM_CONSTANT)
93 goto ignore;
94
95 switch (usage->hid & HID_USAGE_PAGE) {
96
97 case HID_UP_UNDEFINED:
98 goto ignore;
99
100 case HID_UP_KEYBOARD:
101
102 set_bit(EV_REP, input->evbit);
103
104 if ((usage->hid & HID_USAGE) < 256) {
105 if (!hid_keyboard[usage->hid & HID_USAGE]) goto ignore;
106 map_key_clear(hid_keyboard[usage->hid & HID_USAGE]);
107 } else
108 map_key(KEY_UNKNOWN);
109
110 break;
111
112 case HID_UP_BUTTON:
113
114 code = ((usage->hid - 1) & 0xf);
115
116 switch (field->application) {
117 case HID_GD_MOUSE:
118 case HID_GD_POINTER: code += 0x110; break;
119 case HID_GD_JOYSTICK: code += 0x120; break;
120 case HID_GD_GAMEPAD: code += 0x130; break;
121 default:
122 switch (field->physical) {
123 case HID_GD_MOUSE:
124 case HID_GD_POINTER: code += 0x110; break;
125 case HID_GD_JOYSTICK: code += 0x120; break;
126 case HID_GD_GAMEPAD: code += 0x130; break;
127 default: code += 0x100;
128 }
129 }
130
131 map_key(code);
132 break;
133
0aebfdac
VP
134
135 case HID_UP_SIMULATION:
136
137 switch (usage->hid & 0xffff) {
5fce9d7b 138 case 0xba: map_abs(ABS_RUDDER); break;
0aebfdac 139 case 0xbb: map_abs(ABS_THROTTLE); break;
5fce9d7b
DT
140 case 0xc4: map_abs(ABS_GAS); break;
141 case 0xc5: map_abs(ABS_BRAKE); break;
142 case 0xc8: map_abs(ABS_WHEEL); break;
ff60dde9 143 default: goto ignore;
0aebfdac
VP
144 }
145 break;
146
1da177e4
LT
147 case HID_UP_GENDESK:
148
149 if ((usage->hid & 0xf0) == 0x80) { /* SystemControl */
150 switch (usage->hid & 0xf) {
151 case 0x1: map_key_clear(KEY_POWER); break;
152 case 0x2: map_key_clear(KEY_SLEEP); break;
153 case 0x3: map_key_clear(KEY_WAKEUP); break;
154 default: goto unknown;
155 }
156 break;
157 }
158
159 if ((usage->hid & 0xf0) == 0x90) { /* D-pad */
160 switch (usage->hid) {
161 case HID_GD_UP: usage->hat_dir = 1; break;
162 case HID_GD_DOWN: usage->hat_dir = 5; break;
163 case HID_GD_RIGHT: usage->hat_dir = 3; break;
164 case HID_GD_LEFT: usage->hat_dir = 7; break;
165 default: goto unknown;
166 }
167 if (field->dpad) {
168 map_abs(field->dpad);
169 goto ignore;
170 }
171 map_abs(ABS_HAT0X);
172 break;
173 }
174
175 switch (usage->hid) {
176
177 /* These usage IDs map directly to the usage codes. */
178 case HID_GD_X: case HID_GD_Y: case HID_GD_Z:
179 case HID_GD_RX: case HID_GD_RY: case HID_GD_RZ:
180 case HID_GD_SLIDER: case HID_GD_DIAL: case HID_GD_WHEEL:
05f091ab 181 if (field->flags & HID_MAIN_ITEM_RELATIVE)
1da177e4
LT
182 map_rel(usage->hid & 0xf);
183 else
184 map_abs(usage->hid & 0xf);
185 break;
186
187 case HID_GD_HATSWITCH:
188 usage->hat_min = field->logical_minimum;
189 usage->hat_max = field->logical_maximum;
190 map_abs(ABS_HAT0X);
191 break;
192
193 case HID_GD_START: map_key_clear(BTN_START); break;
194 case HID_GD_SELECT: map_key_clear(BTN_SELECT); break;
195
196 default: goto unknown;
197 }
198
199 break;
200
201 case HID_UP_LED:
202 if (((usage->hid - 1) & 0xffff) >= LED_MAX)
203 goto ignore;
204 map_led((usage->hid - 1) & 0xffff);
205 break;
206
207 case HID_UP_DIGITIZER:
208
209 switch (usage->hid & 0xff) {
210
211 case 0x30: /* TipPressure */
212 if (!test_bit(BTN_TOUCH, input->keybit)) {
213 device->quirks |= HID_QUIRK_NOTOUCH;
214 set_bit(EV_KEY, input->evbit);
215 set_bit(BTN_TOUCH, input->keybit);
216 }
217
218 map_abs_clear(ABS_PRESSURE);
219 break;
220
221 case 0x32: /* InRange */
222 switch (field->physical & 0xff) {
223 case 0x21: map_key(BTN_TOOL_MOUSE); break;
224 case 0x22: map_key(BTN_TOOL_FINGER); break;
225 default: map_key(BTN_TOOL_PEN); break;
226 }
227 break;
228
229 case 0x3c: /* Invert */
230 map_key_clear(BTN_TOOL_RUBBER);
231 break;
232
233 case 0x33: /* Touch */
234 case 0x42: /* TipSwitch */
235 case 0x43: /* TipSwitch2 */
236 device->quirks &= ~HID_QUIRK_NOTOUCH;
237 map_key_clear(BTN_TOUCH);
238 break;
239
240 case 0x44: /* BarrelSwitch */
241 map_key_clear(BTN_STYLUS);
242 break;
243
244 default: goto unknown;
245 }
246 break;
247
248 case HID_UP_CONSUMER: /* USB HUT v1.1, pages 56-62 */
249
250 switch (usage->hid & HID_USAGE) {
251 case 0x000: goto ignore;
252 case 0x034: map_key_clear(KEY_SLEEP); break;
253 case 0x036: map_key_clear(BTN_MISC); break;
39fd748f 254 case 0x045: map_key_clear(KEY_RADIO); break;
1da177e4 255 case 0x08a: map_key_clear(KEY_WWW); break;
8a409b01 256 case 0x08d: map_key_clear(KEY_PROGRAM); break;
1da177e4 257 case 0x095: map_key_clear(KEY_HELP); break;
8a409b01
VP
258 case 0x09c: map_key_clear(KEY_CHANNELUP); break;
259 case 0x09d: map_key_clear(KEY_CHANNELDOWN); break;
1da177e4
LT
260 case 0x0b0: map_key_clear(KEY_PLAY); break;
261 case 0x0b1: map_key_clear(KEY_PAUSE); break;
262 case 0x0b2: map_key_clear(KEY_RECORD); break;
263 case 0x0b3: map_key_clear(KEY_FASTFORWARD); break;
264 case 0x0b4: map_key_clear(KEY_REWIND); break;
265 case 0x0b5: map_key_clear(KEY_NEXTSONG); break;
266 case 0x0b6: map_key_clear(KEY_PREVIOUSSONG); break;
267 case 0x0b7: map_key_clear(KEY_STOPCD); break;
268 case 0x0b8: map_key_clear(KEY_EJECTCD); break;
269 case 0x0cd: map_key_clear(KEY_PLAYPAUSE); break;
270 case 0x0e0: map_abs_clear(ABS_VOLUME); break;
271 case 0x0e2: map_key_clear(KEY_MUTE); break;
272 case 0x0e5: map_key_clear(KEY_BASSBOOST); break;
273 case 0x0e9: map_key_clear(KEY_VOLUMEUP); break;
274 case 0x0ea: map_key_clear(KEY_VOLUMEDOWN); break;
275 case 0x183: map_key_clear(KEY_CONFIG); break;
276 case 0x18a: map_key_clear(KEY_MAIL); break;
277 case 0x192: map_key_clear(KEY_CALC); break;
278 case 0x194: map_key_clear(KEY_FILE); break;
8a409b01
VP
279 case 0x1a7: map_key_clear(KEY_DOCUMENTS); break;
280 case 0x201: map_key_clear(KEY_NEW); break;
281 case 0x207: map_key_clear(KEY_SAVE); break;
282 case 0x208: map_key_clear(KEY_PRINT); break;
283 case 0x209: map_key_clear(KEY_PROPS); break;
1da177e4
LT
284 case 0x21a: map_key_clear(KEY_UNDO); break;
285 case 0x21b: map_key_clear(KEY_COPY); break;
286 case 0x21c: map_key_clear(KEY_CUT); break;
287 case 0x21d: map_key_clear(KEY_PASTE); break;
288 case 0x221: map_key_clear(KEY_FIND); break;
289 case 0x223: map_key_clear(KEY_HOMEPAGE); break;
290 case 0x224: map_key_clear(KEY_BACK); break;
291 case 0x225: map_key_clear(KEY_FORWARD); break;
292 case 0x226: map_key_clear(KEY_STOP); break;
293 case 0x227: map_key_clear(KEY_REFRESH); break;
294 case 0x22a: map_key_clear(KEY_BOOKMARKS); break;
940824b0
VP
295 case 0x233: map_key_clear(KEY_SCROLLUP); break;
296 case 0x234: map_key_clear(KEY_SCROLLDOWN); break;
1da177e4 297 case 0x238: map_rel(REL_HWHEEL); break;
8a409b01
VP
298 case 0x279: map_key_clear(KEY_REDO); break;
299 case 0x289: map_key_clear(KEY_REPLY); break;
300 case 0x28b: map_key_clear(KEY_FORWARDMAIL); break;
301 case 0x28c: map_key_clear(KEY_SEND); break;
940824b0
VP
302
303 /* Reported on a Cherry Cymotion keyboard */
304 case 0x301: map_key_clear(KEY_PROG1); break;
305 case 0x302: map_key_clear(KEY_PROG2); break;
306 case 0x303: map_key_clear(KEY_PROG3); break;
307
8a409b01 308 default: goto ignore;
1da177e4
LT
309 }
310 break;
311
312 case HID_UP_HPVENDOR: /* Reported on a Dutch layout HP5308 */
313
314 set_bit(EV_REP, input->evbit);
315 switch (usage->hid & HID_USAGE) {
316 case 0x021: map_key_clear(KEY_PRINT); break;
317 case 0x070: map_key_clear(KEY_HP); break;
318 case 0x071: map_key_clear(KEY_CAMERA); break;
319 case 0x072: map_key_clear(KEY_SOUND); break;
320 case 0x073: map_key_clear(KEY_QUESTION); break;
321 case 0x080: map_key_clear(KEY_EMAIL); break;
322 case 0x081: map_key_clear(KEY_CHAT); break;
323 case 0x082: map_key_clear(KEY_SEARCH); break;
324 case 0x083: map_key_clear(KEY_CONNECT); break;
325 case 0x084: map_key_clear(KEY_FINANCE); break;
326 case 0x085: map_key_clear(KEY_SPORT); break;
327 case 0x086: map_key_clear(KEY_SHOP); break;
328 default: goto ignore;
329 }
330 break;
331
332 case HID_UP_MSVENDOR:
1da177e4 333 goto ignore;
05f091ab 334
e875ce37
SP
335 case HID_UP_CUSTOM: /* Reported on Logitech and Powerbook USB keyboards */
336
337 set_bit(EV_REP, input->evbit);
338 switch(usage->hid & HID_USAGE) {
339 case 0x003: map_key_clear(KEY_FN); break;
340 default: goto ignore;
341 }
342 break;
343
344 case HID_UP_LOGIVENDOR: /* Reported on Logitech Ultra X Media Remote */
39fd748f
MG
345
346 set_bit(EV_REP, input->evbit);
347 switch(usage->hid & HID_USAGE) {
348 case 0x004: map_key_clear(KEY_AGAIN); break;
349 case 0x00d: map_key_clear(KEY_HOME); break;
350 case 0x024: map_key_clear(KEY_SHUFFLE); break;
351 case 0x025: map_key_clear(KEY_TV); break;
352 case 0x026: map_key_clear(KEY_MENU); break;
353 case 0x031: map_key_clear(KEY_AUDIO); break;
354 case 0x032: map_key_clear(KEY_SUBTITLE); break;
355 case 0x033: map_key_clear(KEY_LAST); break;
356 case 0x047: map_key_clear(KEY_MP3); break;
357 case 0x048: map_key_clear(KEY_DVD); break;
358 case 0x049: map_key_clear(KEY_MEDIA); break;
359 case 0x04a: map_key_clear(KEY_VIDEO); break;
360 case 0x04b: map_key_clear(KEY_ANGLE); break;
361 case 0x04c: map_key_clear(KEY_LANGUAGE); break;
362 case 0x04d: map_key_clear(KEY_SUBTITLE); break;
363 case 0x051: map_key_clear(KEY_RED); break;
364 case 0x052: map_key_clear(KEY_CLOSE); break;
365 default: goto ignore;
366 }
367 break;
368
1da177e4
LT
369 case HID_UP_PID:
370
371 set_bit(EV_FF, input->evbit);
372 switch(usage->hid & HID_USAGE) {
373 case 0x26: map_ff_effect(FF_CONSTANT); goto ignore;
374 case 0x27: map_ff_effect(FF_RAMP); goto ignore;
375 case 0x28: map_ff_effect(FF_CUSTOM); goto ignore;
376 case 0x30: map_ff_effect(FF_SQUARE); map_ff_effect(FF_PERIODIC); goto ignore;
377 case 0x31: map_ff_effect(FF_SINE); map_ff_effect(FF_PERIODIC); goto ignore;
378 case 0x32: map_ff_effect(FF_TRIANGLE); map_ff_effect(FF_PERIODIC); goto ignore;
379 case 0x33: map_ff_effect(FF_SAW_UP); map_ff_effect(FF_PERIODIC); goto ignore;
380 case 0x34: map_ff_effect(FF_SAW_DOWN); map_ff_effect(FF_PERIODIC); goto ignore;
381 case 0x40: map_ff_effect(FF_SPRING); goto ignore;
382 case 0x41: map_ff_effect(FF_DAMPER); goto ignore;
383 case 0x42: map_ff_effect(FF_INERTIA); goto ignore;
384 case 0x43: map_ff_effect(FF_FRICTION); goto ignore;
385 case 0x7e: map_ff(FF_GAIN); break;
386 case 0x83: input->ff_effects_max = field->value[0]; goto ignore;
387 case 0x98: map_ff(FF_AUTOCENTER); break;
388 case 0xa4: map_key_clear(BTN_DEAD); break;
389 default: goto ignore;
390 }
391 break;
392
393 default:
394 unknown:
395 if (field->report_size == 1) {
396 if (field->report->type == HID_OUTPUT_REPORT) {
397 map_led(LED_MISC);
398 break;
399 }
400 map_key(BTN_MISC);
401 break;
402 }
403 if (field->flags & HID_MAIN_ITEM_RELATIVE) {
404 map_rel(REL_MISC);
405 break;
406 }
407 map_abs(ABS_MISC);
408 break;
409 }
410
411 set_bit(usage->type, input->evbit);
412
413 while (usage->code <= max && test_and_set_bit(usage->code, bit))
414 usage->code = find_next_zero_bit(bit, max + 1, usage->code);
415
416 if (usage->code > max)
417 goto ignore;
418
c58de6d9
VP
419 if (((device->quirks & (HID_QUIRK_2WHEEL_POWERMOUSE)) && (usage->hid == 0x00010032)))
420 map_rel(REL_HWHEEL);
421
1da177e4 422 if ((device->quirks & (HID_QUIRK_2WHEEL_MOUSE_HACK_7 | HID_QUIRK_2WHEEL_MOUSE_HACK_5)) &&
05f091ab 423 (usage->type == EV_REL) && (usage->code == REL_WHEEL))
1da177e4
LT
424 set_bit(REL_HWHEEL, bit);
425
426 if (((device->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_5) && (usage->hid == 0x00090005))
427 || ((device->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_7) && (usage->hid == 0x00090007)))
428 goto ignore;
429
430 if (usage->type == EV_ABS) {
431
432 int a = field->logical_minimum;
433 int b = field->logical_maximum;
434
435 if ((device->quirks & HID_QUIRK_BADPAD) && (usage->code == ABS_X || usage->code == ABS_Y)) {
436 a = field->logical_minimum = 0;
437 b = field->logical_maximum = 255;
438 }
05f091ab 439
1da177e4
LT
440 if (field->application == HID_GD_GAMEPAD || field->application == HID_GD_JOYSTICK)
441 input_set_abs_params(input, usage->code, a, b, (b - a) >> 8, (b - a) >> 4);
442 else input_set_abs_params(input, usage->code, a, b, 0, 0);
05f091ab 443
1da177e4
LT
444 }
445
446 if (usage->hat_min < usage->hat_max || usage->hat_dir) {
447 int i;
448 for (i = usage->code; i < usage->code + 2 && i <= max; i++) {
449 input_set_abs_params(input, i, -1, 1, 0, 0);
450 set_bit(i, input->absbit);
451 }
452 if (usage->hat_dir && !field->dpad)
453 field->dpad = usage->code;
454 }
455
456#ifdef DEBUG
457 resolv_event(usage->type, usage->code);
458 printk("\n");
459#endif
460 return;
461
462ignore:
463#ifdef DEBUG
464 printk("IGNORED\n");
465#endif
466 return;
467}
468
469void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, __s32 value, struct pt_regs *regs)
470{
a9b2e917 471 struct input_dev *input;
1da177e4
LT
472 int *quirks = &hid->quirks;
473
a9b2e917 474 if (!field->hidinput)
1da177e4 475 return;
c5b7c7c3
DT
476
477 input = field->hidinput->input;
1da177e4
LT
478
479 input_regs(input, regs);
480
481 if (!usage->type)
482 return;
483
484 if (((hid->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_5) && (usage->hid == 0x00090005))
485 || ((hid->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_7) && (usage->hid == 0x00090007))) {
486 if (value) hid->quirks |= HID_QUIRK_2WHEEL_MOUSE_HACK_ON;
487 else hid->quirks &= ~HID_QUIRK_2WHEEL_MOUSE_HACK_ON;
488 return;
489 }
490
491 if ((hid->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_ON) && (usage->code == REL_WHEEL)) {
492 input_event(input, usage->type, REL_HWHEEL, value);
493 return;
494 }
495
05f091ab 496 if (usage->hat_min < usage->hat_max || usage->hat_dir) {
1da177e4
LT
497 int hat_dir = usage->hat_dir;
498 if (!hat_dir)
499 hat_dir = (value - usage->hat_min) * 8 / (usage->hat_max - usage->hat_min + 1) + 1;
500 if (hat_dir < 0 || hat_dir > 8) hat_dir = 0;
501 input_event(input, usage->type, usage->code , hid_hat_to_axis[hat_dir].x);
502 input_event(input, usage->type, usage->code + 1, hid_hat_to_axis[hat_dir].y);
503 return;
504 }
505
506 if (usage->hid == (HID_UP_DIGITIZER | 0x003c)) { /* Invert */
507 *quirks = value ? (*quirks | HID_QUIRK_INVERT) : (*quirks & ~HID_QUIRK_INVERT);
508 return;
509 }
510
511 if (usage->hid == (HID_UP_DIGITIZER | 0x0032)) { /* InRange */
512 if (value) {
513 input_event(input, usage->type, (*quirks & HID_QUIRK_INVERT) ? BTN_TOOL_RUBBER : usage->code, 1);
514 return;
515 }
516 input_event(input, usage->type, usage->code, 0);
517 input_event(input, usage->type, BTN_TOOL_RUBBER, 0);
518 return;
519 }
520
521 if (usage->hid == (HID_UP_DIGITIZER | 0x0030) && (*quirks & HID_QUIRK_NOTOUCH)) { /* Pressure */
522 int a = field->logical_minimum;
523 int b = field->logical_maximum;
524 input_event(input, EV_KEY, BTN_TOUCH, value > a + ((b - a) >> 3));
525 }
526
527 if (usage->hid == (HID_UP_PID | 0x83UL)) { /* Simultaneous Effects Max */
528 input->ff_effects_max = value;
529 dbg("Maximum Effects - %d",input->ff_effects_max);
530 return;
531 }
532
533 if (usage->hid == (HID_UP_PID | 0x7fUL)) {
534 dbg("PID Pool Report\n");
535 return;
536 }
537
538 if((usage->type == EV_KEY) && (usage->code == 0)) /* Key 0 is "unassigned", not KEY_UNKNOWN */
539 return;
540
541 input_event(input, usage->type, usage->code, value);
542
543 if ((field->flags & HID_MAIN_ITEM_RELATIVE) && (usage->type == EV_KEY))
544 input_event(input, usage->type, usage->code, 0);
545}
546
547void hidinput_report_event(struct hid_device *hid, struct hid_report *report)
548{
1da177e4
LT
549 struct hid_input *hidinput;
550
c5b7c7c3
DT
551 list_for_each_entry(hidinput, &hid->inputs, list)
552 input_sync(hidinput->input);
1da177e4
LT
553}
554
555static int hidinput_find_field(struct hid_device *hid, unsigned int type, unsigned int code, struct hid_field **field)
556{
557 struct hid_report *report;
558 int i, j;
559
560 list_for_each_entry(report, &hid->report_enum[HID_OUTPUT_REPORT].report_list, list) {
561 for (i = 0; i < report->maxfield; i++) {
562 *field = report->field[i];
563 for (j = 0; j < (*field)->maxusage; j++)
564 if ((*field)->usage[j].type == type && (*field)->usage[j].code == code)
565 return j;
566 }
567 }
568 return -1;
569}
570
571static int hidinput_input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
572{
573 struct hid_device *hid = dev->private;
574 struct hid_field *field;
575 int offset;
576
577 if (type == EV_FF)
578 return hid_ff_event(hid, dev, type, code, value);
579
580 if (type != EV_LED)
581 return -1;
582
583 if ((offset = hidinput_find_field(hid, type, code, &field)) == -1) {
584 warn("event field not found");
585 return -1;
586 }
587
588 hid_set_field(field, offset, value);
589 hid_submit_report(hid, field->report, USB_DIR_OUT);
590
591 return 0;
592}
593
594static int hidinput_open(struct input_dev *dev)
595{
596 struct hid_device *hid = dev->private;
597 return hid_open(hid);
598}
599
600static void hidinput_close(struct input_dev *dev)
601{
602 struct hid_device *hid = dev->private;
603 hid_close(hid);
604}
605
606/*
607 * Register the input device; print a message.
608 * Configure the input layer interface
609 * Read all reports and initialize the absolute field values.
610 */
611
612int hidinput_connect(struct hid_device *hid)
613{
614 struct usb_device *dev = hid->dev;
615 struct hid_report *report;
616 struct hid_input *hidinput = NULL;
c5b7c7c3 617 struct input_dev *input_dev;
1da177e4
LT
618 int i, j, k;
619
620 INIT_LIST_HEAD(&hid->inputs);
621
622 for (i = 0; i < hid->maxcollection; i++)
623 if (hid->collection[i].type == HID_COLLECTION_APPLICATION ||
624 hid->collection[i].type == HID_COLLECTION_PHYSICAL)
05f091ab 625 if (IS_INPUT_APPLICATION(hid->collection[i].usage))
1da177e4
LT
626 break;
627
628 if (i == hid->maxcollection)
629 return -1;
630
631 for (k = HID_INPUT_REPORT; k <= HID_OUTPUT_REPORT; k++)
632 list_for_each_entry(report, &hid->report_enum[k].report_list, list) {
633
634 if (!report->maxfield)
635 continue;
636
637 if (!hidinput) {
c5b7c7c3
DT
638 hidinput = kzalloc(sizeof(*hidinput), GFP_KERNEL);
639 input_dev = input_allocate_device();
640 if (!hidinput || !input_dev) {
641 kfree(hidinput);
642 input_free_device(input_dev);
1da177e4
LT
643 err("Out of memory during hid input probe");
644 return -1;
645 }
1da177e4 646
c5b7c7c3
DT
647 input_dev->private = hid;
648 input_dev->event = hidinput_input_event;
649 input_dev->open = hidinput_open;
650 input_dev->close = hidinput_close;
1da177e4 651
c5b7c7c3
DT
652 input_dev->name = hid->name;
653 input_dev->phys = hid->phys;
654 input_dev->uniq = hid->uniq;
655 usb_to_input_id(dev, &input_dev->id);
656 input_dev->cdev.dev = &hid->intf->dev;
1da177e4 657
c5b7c7c3
DT
658 hidinput->input = input_dev;
659 list_add_tail(&hidinput->list, &hid->inputs);
1da177e4
LT
660 }
661
662 for (i = 0; i < report->maxfield; i++)
663 for (j = 0; j < report->field[i]->maxusage; j++)
664 hidinput_configure_usage(hidinput, report->field[i],
665 report->field[i]->usage + j);
05f091ab 666
1da177e4
LT
667 if (hid->quirks & HID_QUIRK_MULTI_INPUT) {
668 /* This will leave hidinput NULL, so that it
669 * allocates another one if we have more inputs on
670 * the same interface. Some devices (e.g. Happ's
671 * UGCI) cram a lot of unrelated inputs into the
672 * same interface. */
673 hidinput->report = report;
c5b7c7c3 674 input_register_device(hidinput->input);
1da177e4
LT
675 hidinput = NULL;
676 }
677 }
678
679 /* This only gets called when we are a single-input (most of the
680 * time). IOW, not a HID_QUIRK_MULTI_INPUT. The hid_ff_init() is
681 * only useful in this case, and not for multi-input quirks. */
682 if (hidinput) {
683 hid_ff_init(hid);
c5b7c7c3 684 input_register_device(hidinput->input);
1da177e4
LT
685 }
686
687 return 0;
688}
689
690void hidinput_disconnect(struct hid_device *hid)
691{
c5b7c7c3 692 struct hid_input *hidinput, *next;
1da177e4 693
c5b7c7c3 694 list_for_each_entry_safe(hidinput, next, &hid->inputs, list) {
1da177e4 695 list_del(&hidinput->list);
c5b7c7c3 696 input_unregister_device(hidinput->input);
1da177e4
LT
697 kfree(hidinput);
698 }
699}