diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-02-01 00:18:17 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-02-01 00:18:17 -0500 |
commit | d20e6336ea4250e51081e4b2924b9ef4dfa45909 (patch) | |
tree | 96c22694bec10912d40a3700a945157597dd901b /drivers | |
parent | fa3c791d85aa9a363dd72dd834b73b79252ef44e (diff) | |
parent | 6dea93477c3377cf4199fd37cc3fb11071987ae4 (diff) |
Merge master.kernel.org:/pub/scm/linux/kernel/git/dtor/input
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/input/joystick/a3d.c | 88 | ||||
-rw-r--r-- | drivers/input/joystick/db9.c | 85 | ||||
-rw-r--r-- | drivers/input/joystick/gamecon.c | 361 | ||||
-rw-r--r-- | drivers/input/joystick/grip.c | 11 | ||||
-rw-r--r-- | drivers/input/joystick/iforce/iforce-main.c | 2 | ||||
-rw-r--r-- | drivers/input/joystick/iforce/iforce-packets.c | 4 | ||||
-rw-r--r-- | drivers/input/joystick/iforce/iforce-usb.c | 1 | ||||
-rw-r--r-- | drivers/input/joystick/sidewinder.c | 10 | ||||
-rw-r--r-- | drivers/input/joystick/tmdc.c | 15 | ||||
-rw-r--r-- | drivers/input/joystick/turbografx.c | 20 | ||||
-rw-r--r-- | drivers/input/joystick/twidjoy.c | 4 | ||||
-rw-r--r-- | drivers/input/misc/Kconfig | 12 | ||||
-rw-r--r-- | drivers/input/misc/Makefile | 1 | ||||
-rw-r--r-- | drivers/input/misc/ixp4xx-beeper.c | 183 | ||||
-rw-r--r-- | drivers/input/mouse/psmouse-base.c | 1 | ||||
-rw-r--r-- | drivers/input/mousedev.c | 9 | ||||
-rw-r--r-- | drivers/input/touchscreen/mk712.c | 2 | ||||
-rw-r--r-- | drivers/usb/input/hiddev.c | 2 |
18 files changed, 545 insertions, 266 deletions
diff --git a/drivers/input/joystick/a3d.c b/drivers/input/joystick/a3d.c index 4571ea3a4b92..4612d13ea756 100644 --- a/drivers/input/joystick/a3d.c +++ b/drivers/input/joystick/a3d.c | |||
@@ -57,7 +57,7 @@ static char *a3d_names[] = { NULL, "FP-Gaming Assassin 3D", "MadCatz Panther", " | |||
57 | struct a3d { | 57 | struct a3d { |
58 | struct gameport *gameport; | 58 | struct gameport *gameport; |
59 | struct gameport *adc; | 59 | struct gameport *adc; |
60 | struct input_dev dev; | 60 | struct input_dev *dev; |
61 | int axes[4]; | 61 | int axes[4]; |
62 | int buttons; | 62 | int buttons; |
63 | int mode; | 63 | int mode; |
@@ -115,7 +115,7 @@ static int a3d_csum(char *data, int count) | |||
115 | 115 | ||
116 | static void a3d_read(struct a3d *a3d, unsigned char *data) | 116 | static void a3d_read(struct a3d *a3d, unsigned char *data) |
117 | { | 117 | { |
118 | struct input_dev *dev = &a3d->dev; | 118 | struct input_dev *dev = a3d->dev; |
119 | 119 | ||
120 | switch (a3d->mode) { | 120 | switch (a3d->mode) { |
121 | 121 | ||
@@ -265,14 +265,20 @@ static void a3d_close(struct input_dev *dev) | |||
265 | static int a3d_connect(struct gameport *gameport, struct gameport_driver *drv) | 265 | static int a3d_connect(struct gameport *gameport, struct gameport_driver *drv) |
266 | { | 266 | { |
267 | struct a3d *a3d; | 267 | struct a3d *a3d; |
268 | struct input_dev *input_dev; | ||
268 | struct gameport *adc; | 269 | struct gameport *adc; |
269 | unsigned char data[A3D_MAX_LENGTH]; | 270 | unsigned char data[A3D_MAX_LENGTH]; |
270 | int i; | 271 | int i; |
271 | int err; | 272 | int err; |
272 | 273 | ||
273 | if (!(a3d = kzalloc(sizeof(struct a3d), GFP_KERNEL))) | 274 | a3d = kzalloc(sizeof(struct a3d), GFP_KERNEL); |
274 | return -ENOMEM; | 275 | input_dev = input_allocate_device(); |
276 | if (!a3d || !input_dev) { | ||
277 | err = -ENOMEM; | ||
278 | goto fail1; | ||
279 | } | ||
275 | 280 | ||
281 | a3d->dev = input_dev; | ||
276 | a3d->gameport = gameport; | 282 | a3d->gameport = gameport; |
277 | 283 | ||
278 | gameport_set_drvdata(gameport, a3d); | 284 | gameport_set_drvdata(gameport, a3d); |
@@ -302,42 +308,48 @@ static int a3d_connect(struct gameport *gameport, struct gameport_driver *drv) | |||
302 | 308 | ||
303 | sprintf(a3d->phys, "%s/input0", gameport->phys); | 309 | sprintf(a3d->phys, "%s/input0", gameport->phys); |
304 | 310 | ||
311 | input_dev->name = a3d_names[a3d->mode]; | ||
312 | input_dev->phys = a3d->phys; | ||
313 | input_dev->id.bustype = BUS_GAMEPORT; | ||
314 | input_dev->id.vendor = GAMEPORT_ID_VENDOR_MADCATZ; | ||
315 | input_dev->id.product = a3d->mode; | ||
316 | input_dev->id.version = 0x0100; | ||
317 | input_dev->cdev.dev = &gameport->dev; | ||
318 | input_dev->private = a3d; | ||
319 | input_dev->open = a3d_open; | ||
320 | input_dev->close = a3d_close; | ||
321 | |||
305 | if (a3d->mode == A3D_MODE_PXL) { | 322 | if (a3d->mode == A3D_MODE_PXL) { |
306 | 323 | ||
307 | int axes[] = { ABS_X, ABS_Y, ABS_THROTTLE, ABS_RUDDER }; | 324 | int axes[] = { ABS_X, ABS_Y, ABS_THROTTLE, ABS_RUDDER }; |
308 | 325 | ||
309 | a3d->length = 33; | 326 | a3d->length = 33; |
310 | 327 | ||
311 | init_input_dev(&a3d->dev); | 328 | input_dev->evbit[0] |= BIT(EV_ABS) | BIT(EV_KEY) | BIT(EV_REL); |
312 | 329 | input_dev->relbit[0] |= BIT(REL_X) | BIT(REL_Y); | |
313 | a3d->dev.evbit[0] |= BIT(EV_ABS) | BIT(EV_KEY) | BIT(EV_REL); | 330 | input_dev->absbit[0] |= BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_THROTTLE) | BIT(ABS_RUDDER) |
314 | a3d->dev.relbit[0] |= BIT(REL_X) | BIT(REL_Y); | 331 | | BIT(ABS_HAT0X) | BIT(ABS_HAT0Y) | BIT(ABS_HAT1X) | BIT(ABS_HAT1Y); |
315 | a3d->dev.absbit[0] |= BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_THROTTLE) | BIT(ABS_RUDDER) | 332 | input_dev->keybit[LONG(BTN_MOUSE)] |= BIT(BTN_RIGHT) | BIT(BTN_LEFT) | BIT(BTN_MIDDLE) |
316 | | BIT(ABS_HAT0X) | BIT(ABS_HAT0Y) | BIT(ABS_HAT1X) | BIT(ABS_HAT1Y); | 333 | | BIT(BTN_SIDE) | BIT(BTN_EXTRA); |
317 | 334 | input_dev->keybit[LONG(BTN_JOYSTICK)] |= BIT(BTN_TRIGGER) | BIT(BTN_THUMB) | BIT(BTN_TOP) | |
318 | a3d->dev.keybit[LONG(BTN_MOUSE)] |= BIT(BTN_RIGHT) | BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | 335 | | BIT(BTN_PINKIE); |
319 | | BIT(BTN_SIDE) | BIT(BTN_EXTRA); | ||
320 | |||
321 | a3d->dev.keybit[LONG(BTN_JOYSTICK)] |= BIT(BTN_TRIGGER) | BIT(BTN_THUMB) | BIT(BTN_TOP) | BIT(BTN_PINKIE); | ||
322 | 336 | ||
323 | a3d_read(a3d, data); | 337 | a3d_read(a3d, data); |
324 | 338 | ||
325 | for (i = 0; i < 4; i++) { | 339 | for (i = 0; i < 4; i++) { |
326 | if (i < 2) | 340 | if (i < 2) |
327 | input_set_abs_params(&a3d->dev, axes[i], 48, a3d->dev.abs[axes[i]] * 2 - 48, 0, 8); | 341 | input_set_abs_params(input_dev, axes[i], 48, input_dev->abs[axes[i]] * 2 - 48, 0, 8); |
328 | else | 342 | else |
329 | input_set_abs_params(&a3d->dev, axes[i], 2, 253, 0, 0); | 343 | input_set_abs_params(input_dev, axes[i], 2, 253, 0, 0); |
330 | input_set_abs_params(&a3d->dev, ABS_HAT0X + i, -1, 1, 0, 0); | 344 | input_set_abs_params(input_dev, ABS_HAT0X + i, -1, 1, 0, 0); |
331 | } | 345 | } |
332 | 346 | ||
333 | } else { | 347 | } else { |
334 | a3d->length = 29; | 348 | a3d->length = 29; |
335 | 349 | ||
336 | init_input_dev(&a3d->dev); | 350 | input_dev->evbit[0] |= BIT(EV_KEY) | BIT(EV_REL); |
337 | 351 | input_dev->relbit[0] |= BIT(REL_X) | BIT(REL_Y); | |
338 | a3d->dev.evbit[0] |= BIT(EV_KEY) | BIT(EV_REL); | 352 | input_dev->keybit[LONG(BTN_MOUSE)] |= BIT(BTN_RIGHT) | BIT(BTN_LEFT) | BIT(BTN_MIDDLE); |
339 | a3d->dev.relbit[0] |= BIT(REL_X) | BIT(REL_Y); | ||
340 | a3d->dev.keybit[LONG(BTN_MOUSE)] |= BIT(BTN_RIGHT) | BIT(BTN_LEFT) | BIT(BTN_MIDDLE); | ||
341 | 353 | ||
342 | a3d_read(a3d, data); | 354 | a3d_read(a3d, data); |
343 | 355 | ||
@@ -358,24 +370,17 @@ static int a3d_connect(struct gameport *gameport, struct gameport_driver *drv) | |||
358 | } | 370 | } |
359 | } | 371 | } |
360 | 372 | ||
361 | a3d->dev.private = a3d; | 373 | err = input_register_device(a3d->dev); |
362 | a3d->dev.open = a3d_open; | 374 | if (err) |
363 | a3d->dev.close = a3d_close; | 375 | goto fail3; |
364 | |||
365 | a3d->dev.name = a3d_names[a3d->mode]; | ||
366 | a3d->dev.phys = a3d->phys; | ||
367 | a3d->dev.id.bustype = BUS_GAMEPORT; | ||
368 | a3d->dev.id.vendor = GAMEPORT_ID_VENDOR_MADCATZ; | ||
369 | a3d->dev.id.product = a3d->mode; | ||
370 | a3d->dev.id.version = 0x0100; | ||
371 | |||
372 | input_register_device(&a3d->dev); | ||
373 | printk(KERN_INFO "input: %s on %s\n", a3d_names[a3d->mode], a3d->phys); | ||
374 | 376 | ||
375 | return 0; | 377 | return 0; |
376 | 378 | ||
377 | fail2: gameport_close(gameport); | 379 | fail3: if (a3d->adc) |
378 | fail1: gameport_set_drvdata(gameport, NULL); | 380 | gameport_unregister_port(a3d->adc); |
381 | fail2: gameport_close(gameport); | ||
382 | fail1: gameport_set_drvdata(gameport, NULL); | ||
383 | input_free_device(input_dev); | ||
379 | kfree(a3d); | 384 | kfree(a3d); |
380 | return err; | 385 | return err; |
381 | } | 386 | } |
@@ -384,11 +389,9 @@ static void a3d_disconnect(struct gameport *gameport) | |||
384 | { | 389 | { |
385 | struct a3d *a3d = gameport_get_drvdata(gameport); | 390 | struct a3d *a3d = gameport_get_drvdata(gameport); |
386 | 391 | ||
387 | input_unregister_device(&a3d->dev); | 392 | input_unregister_device(a3d->dev); |
388 | if (a3d->adc) { | 393 | if (a3d->adc) |
389 | gameport_unregister_port(a3d->adc); | 394 | gameport_unregister_port(a3d->adc); |
390 | a3d->adc = NULL; | ||
391 | } | ||
392 | gameport_close(gameport); | 395 | gameport_close(gameport); |
393 | gameport_set_drvdata(gameport, NULL); | 396 | gameport_set_drvdata(gameport, NULL); |
394 | kfree(a3d); | 397 | kfree(a3d); |
@@ -397,6 +400,7 @@ static void a3d_disconnect(struct gameport *gameport) | |||
397 | static struct gameport_driver a3d_drv = { | 400 | static struct gameport_driver a3d_drv = { |
398 | .driver = { | 401 | .driver = { |
399 | .name = "adc", | 402 | .name = "adc", |
403 | .owner = THIS_MODULE, | ||
400 | }, | 404 | }, |
401 | .description = DRIVER_DESC, | 405 | .description = DRIVER_DESC, |
402 | .connect = a3d_connect, | 406 | .connect = a3d_connect, |
diff --git a/drivers/input/joystick/db9.c b/drivers/input/joystick/db9.c index 499344c72756..dcffc34f30c3 100644 --- a/drivers/input/joystick/db9.c +++ b/drivers/input/joystick/db9.c | |||
@@ -275,68 +275,70 @@ static unsigned char db9_saturn_read_packet(struct parport *port, unsigned char | |||
275 | /* | 275 | /* |
276 | * db9_saturn_report() analyzes packet and reports. | 276 | * db9_saturn_report() analyzes packet and reports. |
277 | */ | 277 | */ |
278 | static int db9_saturn_report(unsigned char id, unsigned char data[60], struct input_dev *dev, int n, int max_pads) | 278 | static int db9_saturn_report(unsigned char id, unsigned char data[60], struct input_dev *devs[], int n, int max_pads) |
279 | { | 279 | { |
280 | struct input_dev *dev; | ||
280 | int tmp, i, j; | 281 | int tmp, i, j; |
281 | 282 | ||
282 | tmp = (id == 0x41) ? 60 : 10; | 283 | tmp = (id == 0x41) ? 60 : 10; |
283 | for (j = 0; (j < tmp) && (n < max_pads); j += 10, n++) { | 284 | for (j = 0; j < tmp && n < max_pads; j += 10, n++) { |
285 | dev = devs[n]; | ||
284 | switch (data[j]) { | 286 | switch (data[j]) { |
285 | case 0x16: /* multi controller (analog 4 axis) */ | 287 | case 0x16: /* multi controller (analog 4 axis) */ |
286 | input_report_abs(dev + n, db9_abs[5], data[j + 6]); | 288 | input_report_abs(dev, db9_abs[5], data[j + 6]); |
287 | case 0x15: /* mission stick (analog 3 axis) */ | 289 | case 0x15: /* mission stick (analog 3 axis) */ |
288 | input_report_abs(dev + n, db9_abs[3], data[j + 4]); | 290 | input_report_abs(dev, db9_abs[3], data[j + 4]); |
289 | input_report_abs(dev + n, db9_abs[4], data[j + 5]); | 291 | input_report_abs(dev, db9_abs[4], data[j + 5]); |
290 | case 0x13: /* racing controller (analog 1 axis) */ | 292 | case 0x13: /* racing controller (analog 1 axis) */ |
291 | input_report_abs(dev + n, db9_abs[2], data[j + 3]); | 293 | input_report_abs(dev, db9_abs[2], data[j + 3]); |
292 | case 0x34: /* saturn keyboard (udlr ZXC ASD QE Esc) */ | 294 | case 0x34: /* saturn keyboard (udlr ZXC ASD QE Esc) */ |
293 | case 0x02: /* digital pad (digital 2 axis + buttons) */ | 295 | case 0x02: /* digital pad (digital 2 axis + buttons) */ |
294 | input_report_abs(dev + n, db9_abs[0], !(data[j + 1] & 128) - !(data[j + 1] & 64)); | 296 | input_report_abs(dev, db9_abs[0], !(data[j + 1] & 128) - !(data[j + 1] & 64)); |
295 | input_report_abs(dev + n, db9_abs[1], !(data[j + 1] & 32) - !(data[j + 1] & 16)); | 297 | input_report_abs(dev, db9_abs[1], !(data[j + 1] & 32) - !(data[j + 1] & 16)); |
296 | for (i = 0; i < 9; i++) | 298 | for (i = 0; i < 9; i++) |
297 | input_report_key(dev + n, db9_cd32_btn[i], ~data[j + db9_saturn_byte[i]] & db9_saturn_mask[i]); | 299 | input_report_key(dev, db9_cd32_btn[i], ~data[j + db9_saturn_byte[i]] & db9_saturn_mask[i]); |
298 | break; | 300 | break; |
299 | case 0x19: /* mission stick x2 (analog 6 axis + buttons) */ | 301 | case 0x19: /* mission stick x2 (analog 6 axis + buttons) */ |
300 | input_report_abs(dev + n, db9_abs[0], !(data[j + 1] & 128) - !(data[j + 1] & 64)); | 302 | input_report_abs(dev, db9_abs[0], !(data[j + 1] & 128) - !(data[j + 1] & 64)); |
301 | input_report_abs(dev + n, db9_abs[1], !(data[j + 1] & 32) - !(data[j + 1] & 16)); | 303 | input_report_abs(dev, db9_abs[1], !(data[j + 1] & 32) - !(data[j + 1] & 16)); |
302 | for (i = 0; i < 9; i++) | 304 | for (i = 0; i < 9; i++) |
303 | input_report_key(dev + n, db9_cd32_btn[i], ~data[j + db9_saturn_byte[i]] & db9_saturn_mask[i]); | 305 | input_report_key(dev, db9_cd32_btn[i], ~data[j + db9_saturn_byte[i]] & db9_saturn_mask[i]); |
304 | input_report_abs(dev + n, db9_abs[2], data[j + 3]); | 306 | input_report_abs(dev, db9_abs[2], data[j + 3]); |
305 | input_report_abs(dev + n, db9_abs[3], data[j + 4]); | 307 | input_report_abs(dev, db9_abs[3], data[j + 4]); |
306 | input_report_abs(dev + n, db9_abs[4], data[j + 5]); | 308 | input_report_abs(dev, db9_abs[4], data[j + 5]); |
307 | /* | 309 | /* |
308 | input_report_abs(dev + n, db9_abs[8], (data[j + 6] & 128 ? 0 : 1) - (data[j + 6] & 64 ? 0 : 1)); | 310 | input_report_abs(dev, db9_abs[8], (data[j + 6] & 128 ? 0 : 1) - (data[j + 6] & 64 ? 0 : 1)); |
309 | input_report_abs(dev + n, db9_abs[9], (data[j + 6] & 32 ? 0 : 1) - (data[j + 6] & 16 ? 0 : 1)); | 311 | input_report_abs(dev, db9_abs[9], (data[j + 6] & 32 ? 0 : 1) - (data[j + 6] & 16 ? 0 : 1)); |
310 | */ | 312 | */ |
311 | input_report_abs(dev + n, db9_abs[6], data[j + 7]); | 313 | input_report_abs(dev, db9_abs[6], data[j + 7]); |
312 | input_report_abs(dev + n, db9_abs[7], data[j + 8]); | 314 | input_report_abs(dev, db9_abs[7], data[j + 8]); |
313 | input_report_abs(dev + n, db9_abs[5], data[j + 9]); | 315 | input_report_abs(dev, db9_abs[5], data[j + 9]); |
314 | break; | 316 | break; |
315 | case 0xd3: /* sankyo ff (analog 1 axis + stop btn) */ | 317 | case 0xd3: /* sankyo ff (analog 1 axis + stop btn) */ |
316 | input_report_key(dev + n, BTN_A, data[j + 3] & 0x80); | 318 | input_report_key(dev, BTN_A, data[j + 3] & 0x80); |
317 | input_report_abs(dev + n, db9_abs[2], data[j + 3] & 0x7f); | 319 | input_report_abs(dev, db9_abs[2], data[j + 3] & 0x7f); |
318 | break; | 320 | break; |
319 | case 0xe3: /* shuttle mouse (analog 2 axis + buttons. signed value) */ | 321 | case 0xe3: /* shuttle mouse (analog 2 axis + buttons. signed value) */ |
320 | input_report_key(dev + n, BTN_START, data[j + 1] & 0x08); | 322 | input_report_key(dev, BTN_START, data[j + 1] & 0x08); |
321 | input_report_key(dev + n, BTN_A, data[j + 1] & 0x04); | 323 | input_report_key(dev, BTN_A, data[j + 1] & 0x04); |
322 | input_report_key(dev + n, BTN_C, data[j + 1] & 0x02); | 324 | input_report_key(dev, BTN_C, data[j + 1] & 0x02); |
323 | input_report_key(dev + n, BTN_B, data[j + 1] & 0x01); | 325 | input_report_key(dev, BTN_B, data[j + 1] & 0x01); |
324 | input_report_abs(dev + n, db9_abs[2], data[j + 2] ^ 0x80); | 326 | input_report_abs(dev, db9_abs[2], data[j + 2] ^ 0x80); |
325 | input_report_abs(dev + n, db9_abs[3], (0xff-(data[j + 3] ^ 0x80))+1); /* */ | 327 | input_report_abs(dev, db9_abs[3], (0xff-(data[j + 3] ^ 0x80))+1); /* */ |
326 | break; | 328 | break; |
327 | case 0xff: | 329 | case 0xff: |
328 | default: /* no pad */ | 330 | default: /* no pad */ |
329 | input_report_abs(dev + n, db9_abs[0], 0); | 331 | input_report_abs(dev, db9_abs[0], 0); |
330 | input_report_abs(dev + n, db9_abs[1], 0); | 332 | input_report_abs(dev, db9_abs[1], 0); |
331 | for (i = 0; i < 9; i++) | 333 | for (i = 0; i < 9; i++) |
332 | input_report_key(dev + n, db9_cd32_btn[i], 0); | 334 | input_report_key(dev, db9_cd32_btn[i], 0); |
333 | break; | 335 | break; |
334 | } | 336 | } |
335 | } | 337 | } |
336 | return n; | 338 | return n; |
337 | } | 339 | } |
338 | 340 | ||
339 | static int db9_saturn(int mode, struct parport *port, struct input_dev *dev) | 341 | static int db9_saturn(int mode, struct parport *port, struct input_dev *devs[]) |
340 | { | 342 | { |
341 | unsigned char id, data[60]; | 343 | unsigned char id, data[60]; |
342 | int type, n, max_pads; | 344 | int type, n, max_pads; |
@@ -361,7 +363,7 @@ static int db9_saturn(int mode, struct parport *port, struct input_dev *dev) | |||
361 | max_pads = min(db9_modes[mode].n_pads, DB9_MAX_DEVICES); | 363 | max_pads = min(db9_modes[mode].n_pads, DB9_MAX_DEVICES); |
362 | for (tmp = 0, i = 0; i < n; i++) { | 364 | for (tmp = 0, i = 0; i < n; i++) { |
363 | id = db9_saturn_read_packet(port, data, type + i, 1); | 365 | id = db9_saturn_read_packet(port, data, type + i, 1); |
364 | tmp = db9_saturn_report(id, data, dev, tmp, max_pads); | 366 | tmp = db9_saturn_report(id, data, devs, tmp, max_pads); |
365 | } | 367 | } |
366 | return 0; | 368 | return 0; |
367 | } | 369 | } |
@@ -489,7 +491,7 @@ static void db9_timer(unsigned long private) | |||
489 | case DB9_SATURN_DPP: | 491 | case DB9_SATURN_DPP: |
490 | case DB9_SATURN_DPP_2: | 492 | case DB9_SATURN_DPP_2: |
491 | 493 | ||
492 | db9_saturn(db9->mode, port, dev); | 494 | db9_saturn(db9->mode, port, db9->dev); |
493 | break; | 495 | break; |
494 | 496 | ||
495 | case DB9_CD32_PAD: | 497 | case DB9_CD32_PAD: |
@@ -614,7 +616,7 @@ static struct db9 __init *db9_probe(int parport, int mode) | |||
614 | if (!input_dev) { | 616 | if (!input_dev) { |
615 | printk(KERN_ERR "db9.c: Not enough memory for input device\n"); | 617 | printk(KERN_ERR "db9.c: Not enough memory for input device\n"); |
616 | err = -ENOMEM; | 618 | err = -ENOMEM; |
617 | goto err_free_devs; | 619 | goto err_unreg_devs; |
618 | } | 620 | } |
619 | 621 | ||
620 | sprintf(db9->phys[i], "%s/input%d", db9->pd->port->name, i); | 622 | sprintf(db9->phys[i], "%s/input%d", db9->pd->port->name, i); |
@@ -640,13 +642,17 @@ static struct db9 __init *db9_probe(int parport, int mode) | |||
640 | input_set_abs_params(input_dev, db9_abs[j], 1, 255, 0, 0); | 642 | input_set_abs_params(input_dev, db9_abs[j], 1, 255, 0, 0); |
641 | } | 643 | } |
642 | 644 | ||
643 | input_register_device(input_dev); | 645 | err = input_register_device(input_dev); |
646 | if (err) | ||
647 | goto err_free_dev; | ||
644 | } | 648 | } |
645 | 649 | ||
646 | parport_put_port(pp); | 650 | parport_put_port(pp); |
647 | return db9; | 651 | return db9; |
648 | 652 | ||
649 | err_free_devs: | 653 | err_free_dev: |
654 | input_free_device(db9->dev[i]); | ||
655 | err_unreg_devs: | ||
650 | while (--i >= 0) | 656 | while (--i >= 0) |
651 | input_unregister_device(db9->dev[i]); | 657 | input_unregister_device(db9->dev[i]); |
652 | kfree(db9); | 658 | kfree(db9); |
@@ -658,7 +664,7 @@ static struct db9 __init *db9_probe(int parport, int mode) | |||
658 | return ERR_PTR(err); | 664 | return ERR_PTR(err); |
659 | } | 665 | } |
660 | 666 | ||
661 | static void __exit db9_remove(struct db9 *db9) | 667 | static void db9_remove(struct db9 *db9) |
662 | { | 668 | { |
663 | int i; | 669 | int i; |
664 | 670 | ||
@@ -696,7 +702,8 @@ static int __init db9_init(void) | |||
696 | 702 | ||
697 | if (err) { | 703 | if (err) { |
698 | while (--i >= 0) | 704 | while (--i >= 0) |
699 | db9_remove(db9_base[i]); | 705 | if (db9_base[i]) |
706 | db9_remove(db9_base[i]); | ||
700 | return err; | 707 | return err; |
701 | } | 708 | } |
702 | 709 | ||
diff --git a/drivers/input/joystick/gamecon.c b/drivers/input/joystick/gamecon.c index 7df2d82f2c83..900587acdb47 100644 --- a/drivers/input/joystick/gamecon.c +++ b/drivers/input/joystick/gamecon.c | |||
@@ -159,6 +159,48 @@ static void gc_n64_read_packet(struct gc *gc, unsigned char *data) | |||
159 | 159 | ||
160 | } | 160 | } |
161 | 161 | ||
162 | static void gc_n64_process_packet(struct gc *gc) | ||
163 | { | ||
164 | unsigned char data[GC_N64_LENGTH]; | ||
165 | signed char axes[2]; | ||
166 | struct input_dev *dev; | ||
167 | int i, j, s; | ||
168 | |||
169 | gc_n64_read_packet(gc, data); | ||
170 | |||
171 | for (i = 0; i < GC_MAX_DEVICES; i++) { | ||
172 | |||
173 | dev = gc->dev[i]; | ||
174 | if (!dev) | ||
175 | continue; | ||
176 | |||
177 | s = gc_status_bit[i]; | ||
178 | |||
179 | if (s & gc->pads[GC_N64] & ~(data[8] | data[9])) { | ||
180 | |||
181 | axes[0] = axes[1] = 0; | ||
182 | |||
183 | for (j = 0; j < 8; j++) { | ||
184 | if (data[23 - j] & s) | ||
185 | axes[0] |= 1 << j; | ||
186 | if (data[31 - j] & s) | ||
187 | axes[1] |= 1 << j; | ||
188 | } | ||
189 | |||
190 | input_report_abs(dev, ABS_X, axes[0]); | ||
191 | input_report_abs(dev, ABS_Y, -axes[1]); | ||
192 | |||
193 | input_report_abs(dev, ABS_HAT0X, !(s & data[6]) - !(s & data[7])); | ||
194 | input_report_abs(dev, ABS_HAT0Y, !(s & data[4]) - !(s & data[5])); | ||
195 | |||
196 | for (j = 0; j < 10; j++) | ||
197 | input_report_key(dev, gc_n64_btn[j], s & data[gc_n64_bytes[j]]); | ||
198 | |||
199 | input_sync(dev); | ||
200 | } | ||
201 | } | ||
202 | } | ||
203 | |||
162 | /* | 204 | /* |
163 | * NES/SNES support. | 205 | * NES/SNES support. |
164 | */ | 206 | */ |
@@ -198,6 +240,39 @@ static void gc_nes_read_packet(struct gc *gc, int length, unsigned char *data) | |||
198 | } | 240 | } |
199 | } | 241 | } |
200 | 242 | ||
243 | static void gc_nes_process_packet(struct gc *gc) | ||
244 | { | ||
245 | unsigned char data[GC_SNES_LENGTH]; | ||
246 | struct input_dev *dev; | ||
247 | int i, j, s; | ||
248 | |||
249 | gc_nes_read_packet(gc, gc->pads[GC_SNES] ? GC_SNES_LENGTH : GC_NES_LENGTH, data); | ||
250 | |||
251 | for (i = 0; i < GC_MAX_DEVICES; i++) { | ||
252 | |||
253 | dev = gc->dev[i]; | ||
254 | if (!dev) | ||
255 | continue; | ||
256 | |||
257 | s = gc_status_bit[i]; | ||
258 | |||
259 | if (s & (gc->pads[GC_NES] | gc->pads[GC_SNES])) { | ||
260 | input_report_abs(dev, ABS_X, !(s & data[6]) - !(s & data[7])); | ||
261 | input_report_abs(dev, ABS_Y, !(s & data[4]) - !(s & data[5])); | ||
262 | } | ||
263 | |||
264 | if (s & gc->pads[GC_NES]) | ||
265 | for (j = 0; j < 4; j++) | ||
266 | input_report_key(dev, gc_snes_btn[j], s & data[gc_nes_bytes[j]]); | ||
267 | |||
268 | if (s & gc->pads[GC_SNES]) | ||
269 | for (j = 0; j < 8; j++) | ||
270 | input_report_key(dev, gc_snes_btn[j], s & data[gc_snes_bytes[j]]); | ||
271 | |||
272 | input_sync(dev); | ||
273 | } | ||
274 | } | ||
275 | |||
201 | /* | 276 | /* |
202 | * Multisystem joystick support | 277 | * Multisystem joystick support |
203 | */ | 278 | */ |
@@ -219,6 +294,35 @@ static void gc_multi_read_packet(struct gc *gc, int length, unsigned char *data) | |||
219 | } | 294 | } |
220 | } | 295 | } |
221 | 296 | ||
297 | static void gc_multi_process_packet(struct gc *gc) | ||
298 | { | ||
299 | unsigned char data[GC_MULTI2_LENGTH]; | ||
300 | struct input_dev *dev; | ||
301 | int i, s; | ||
302 | |||
303 | gc_multi_read_packet(gc, gc->pads[GC_MULTI2] ? GC_MULTI2_LENGTH : GC_MULTI_LENGTH, data); | ||
304 | |||
305 | for (i = 0; i < GC_MAX_DEVICES; i++) { | ||
306 | |||
307 | dev = gc->dev[i]; | ||
308 | if (!dev) | ||
309 | continue; | ||
310 | |||
311 | s = gc_status_bit[i]; | ||
312 | |||
313 | if (s & (gc->pads[GC_MULTI] | gc->pads[GC_MULTI2])) { | ||
314 | input_report_abs(dev, ABS_X, !(s & data[2]) - !(s & data[3])); | ||
315 | input_report_abs(dev, ABS_Y, !(s & data[0]) - !(s & data[1])); | ||
316 | input_report_key(dev, BTN_TRIGGER, s & data[4]); | ||
317 | } | ||
318 | |||
319 | if (s & gc->pads[GC_MULTI2]) | ||
320 | input_report_key(dev, BTN_THUMB, s & data[5]); | ||
321 | |||
322 | input_sync(dev); | ||
323 | } | ||
324 | } | ||
325 | |||
222 | /* | 326 | /* |
223 | * PSX support | 327 | * PSX support |
224 | * | 328 | * |
@@ -263,10 +367,11 @@ static short gc_psx_ddr_btn[] = { BTN_0, BTN_1, BTN_2, BTN_3 }; | |||
263 | * the psx pad. | 367 | * the psx pad. |
264 | */ | 368 | */ |
265 | 369 | ||
266 | static void gc_psx_command(struct gc *gc, int b, unsigned char data[5]) | 370 | static void gc_psx_command(struct gc *gc, int b, unsigned char data[GC_MAX_DEVICES]) |
267 | { | 371 | { |
268 | int i, j, cmd, read; | 372 | int i, j, cmd, read; |
269 | for (i = 0; i < 5; i++) | 373 | |
374 | for (i = 0; i < GC_MAX_DEVICES; i++) | ||
270 | data[i] = 0; | 375 | data[i] = 0; |
271 | 376 | ||
272 | for (i = 0; i < GC_PSX_LENGTH; i++, b >>= 1) { | 377 | for (i = 0; i < GC_PSX_LENGTH; i++, b >>= 1) { |
@@ -274,7 +379,7 @@ static void gc_psx_command(struct gc *gc, int b, unsigned char data[5]) | |||
274 | parport_write_data(gc->pd->port, cmd | GC_PSX_POWER); | 379 | parport_write_data(gc->pd->port, cmd | GC_PSX_POWER); |
275 | udelay(gc_psx_delay); | 380 | udelay(gc_psx_delay); |
276 | read = parport_read_status(gc->pd->port) ^ 0x80; | 381 | read = parport_read_status(gc->pd->port) ^ 0x80; |
277 | for (j = 0; j < 5; j++) | 382 | for (j = 0; j < GC_MAX_DEVICES; j++) |
278 | data[j] |= (read & gc_status_bit[j] & (gc->pads[GC_PSX] | gc->pads[GC_DDR])) ? (1 << i) : 0; | 383 | data[j] |= (read & gc_status_bit[j] & (gc->pads[GC_PSX] | gc->pads[GC_DDR])) ? (1 << i) : 0; |
279 | parport_write_data(gc->pd->port, cmd | GC_PSX_CLOCK | GC_PSX_POWER); | 384 | parport_write_data(gc->pd->port, cmd | GC_PSX_CLOCK | GC_PSX_POWER); |
280 | udelay(gc_psx_delay); | 385 | udelay(gc_psx_delay); |
@@ -286,11 +391,12 @@ static void gc_psx_command(struct gc *gc, int b, unsigned char data[5]) | |||
286 | * device identifier code. | 391 | * device identifier code. |
287 | */ | 392 | */ |
288 | 393 | ||
289 | static void gc_psx_read_packet(struct gc *gc, unsigned char data[5][GC_PSX_BYTES], unsigned char id[5]) | 394 | static void gc_psx_read_packet(struct gc *gc, unsigned char data[GC_MAX_DEVICES][GC_PSX_BYTES], |
395 | unsigned char id[GC_MAX_DEVICES]) | ||
290 | { | 396 | { |
291 | int i, j, max_len = 0; | 397 | int i, j, max_len = 0; |
292 | unsigned long flags; | 398 | unsigned long flags; |
293 | unsigned char data2[5]; | 399 | unsigned char data2[GC_MAX_DEVICES]; |
294 | 400 | ||
295 | parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_SELECT | GC_PSX_POWER); /* Select pad */ | 401 | parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_SELECT | GC_PSX_POWER); /* Select pad */ |
296 | udelay(gc_psx_delay); | 402 | udelay(gc_psx_delay); |
@@ -303,7 +409,7 @@ static void gc_psx_read_packet(struct gc *gc, unsigned char data[5][GC_PSX_BYTES | |||
303 | gc_psx_command(gc, 0x42, id); /* Get device ids */ | 409 | gc_psx_command(gc, 0x42, id); /* Get device ids */ |
304 | gc_psx_command(gc, 0, data2); /* Dump status */ | 410 | gc_psx_command(gc, 0, data2); /* Dump status */ |
305 | 411 | ||
306 | for (i =0; i < 5; i++) /* Find the longest pad */ | 412 | for (i =0; i < GC_MAX_DEVICES; i++) /* Find the longest pad */ |
307 | if((gc_status_bit[i] & (gc->pads[GC_PSX] | gc->pads[GC_DDR])) | 413 | if((gc_status_bit[i] & (gc->pads[GC_PSX] | gc->pads[GC_DDR])) |
308 | && (GC_PSX_LEN(id[i]) > max_len) | 414 | && (GC_PSX_LEN(id[i]) > max_len) |
309 | && (GC_PSX_LEN(id[i]) <= GC_PSX_BYTES)) | 415 | && (GC_PSX_LEN(id[i]) <= GC_PSX_BYTES)) |
@@ -311,7 +417,7 @@ static void gc_psx_read_packet(struct gc *gc, unsigned char data[5][GC_PSX_BYTES | |||
311 | 417 | ||
312 | for (i = 0; i < max_len; i++) { /* Read in all the data */ | 418 | for (i = 0; i < max_len; i++) { /* Read in all the data */ |
313 | gc_psx_command(gc, 0, data2); | 419 | gc_psx_command(gc, 0, data2); |
314 | for (j = 0; j < 5; j++) | 420 | for (j = 0; j < GC_MAX_DEVICES; j++) |
315 | data[j][i] = data2[j]; | 421 | data[j][i] = data2[j]; |
316 | } | 422 | } |
317 | 423 | ||
@@ -319,185 +425,124 @@ static void gc_psx_read_packet(struct gc *gc, unsigned char data[5][GC_PSX_BYTES | |||
319 | 425 | ||
320 | parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_SELECT | GC_PSX_POWER); | 426 | parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_SELECT | GC_PSX_POWER); |
321 | 427 | ||
322 | for(i = 0; i < 5; i++) /* Set id's to the real value */ | 428 | for(i = 0; i < GC_MAX_DEVICES; i++) /* Set id's to the real value */ |
323 | id[i] = GC_PSX_ID(id[i]); | 429 | id[i] = GC_PSX_ID(id[i]); |
324 | } | 430 | } |
325 | 431 | ||
326 | /* | 432 | static void gc_psx_process_packet(struct gc *gc) |
327 | * gc_timer() reads and analyzes console pads data. | 433 | { |
328 | */ | 434 | unsigned char data[GC_MAX_DEVICES][GC_PSX_BYTES]; |
435 | unsigned char id[GC_MAX_DEVICES]; | ||
436 | struct input_dev *dev; | ||
437 | int i, j; | ||
329 | 438 | ||
330 | #define GC_MAX_LENGTH GC_N64_LENGTH | 439 | gc_psx_read_packet(gc, data, id); |
331 | 440 | ||
332 | static void gc_timer(unsigned long private) | 441 | for (i = 0; i < GC_MAX_DEVICES; i++) { |
333 | { | ||
334 | struct gc *gc = (void *) private; | ||
335 | unsigned char data[GC_MAX_LENGTH]; | ||
336 | unsigned char data_psx[5][GC_PSX_BYTES]; | ||
337 | int i, j, s; | ||
338 | 442 | ||
339 | /* | 443 | dev = gc->dev[i]; |
340 | * N64 pads - must be read first, any read confuses them for 200 us | 444 | if (!dev) |
341 | */ | 445 | continue; |
342 | 446 | ||
343 | if (gc->pads[GC_N64]) { | 447 | switch (id[i]) { |
344 | 448 | ||
345 | gc_n64_read_packet(gc, data); | 449 | case GC_PSX_RUMBLE: |
346 | 450 | ||
347 | for (i = 0; i < 5; i++) { | 451 | input_report_key(dev, BTN_THUMBL, ~data[i][0] & 0x04); |
452 | input_report_key(dev, BTN_THUMBR, ~data[i][0] & 0x02); | ||
348 | 453 | ||
349 | s = gc_status_bit[i]; | 454 | case GC_PSX_NEGCON: |
455 | case GC_PSX_ANALOG: | ||
350 | 456 | ||
351 | if (s & gc->pads[GC_N64] & ~(data[8] | data[9])) { | 457 | if (gc->pads[GC_DDR] & gc_status_bit[i]) { |
458 | for(j = 0; j < 4; j++) | ||
459 | input_report_key(dev, gc_psx_ddr_btn[j], ~data[i][0] & (0x10 << j)); | ||
460 | } else { | ||
461 | for (j = 0; j < 4; j++) | ||
462 | input_report_abs(dev, gc_psx_abs[j + 2], data[i][j + 2]); | ||
352 | 463 | ||
353 | signed char axes[2]; | 464 | input_report_abs(dev, ABS_X, 128 + !(data[i][0] & 0x20) * 127 - !(data[i][0] & 0x80) * 128); |
354 | axes[0] = axes[1] = 0; | 465 | input_report_abs(dev, ABS_Y, 128 + !(data[i][0] & 0x40) * 127 - !(data[i][0] & 0x10) * 128); |
466 | } | ||
355 | 467 | ||
356 | for (j = 0; j < 8; j++) { | 468 | for (j = 0; j < 8; j++) |
357 | if (data[23 - j] & s) axes[0] |= 1 << j; | 469 | input_report_key(dev, gc_psx_btn[j], ~data[i][1] & (1 << j)); |
358 | if (data[31 - j] & s) axes[1] |= 1 << j; | 470 | |
471 | input_report_key(dev, BTN_START, ~data[i][0] & 0x08); | ||
472 | input_report_key(dev, BTN_SELECT, ~data[i][0] & 0x01); | ||
473 | |||
474 | input_sync(dev); | ||
475 | |||
476 | break; | ||
477 | |||
478 | case GC_PSX_NORMAL: | ||
479 | if (gc->pads[GC_DDR] & gc_status_bit[i]) { | ||
480 | for(j = 0; j < 4; j++) | ||
481 | input_report_key(dev, gc_psx_ddr_btn[j], ~data[i][0] & (0x10 << j)); | ||
482 | } else { | ||
483 | input_report_abs(dev, ABS_X, 128 + !(data[i][0] & 0x20) * 127 - !(data[i][0] & 0x80) * 128); | ||
484 | input_report_abs(dev, ABS_Y, 128 + !(data[i][0] & 0x40) * 127 - !(data[i][0] & 0x10) * 128); | ||
485 | |||
486 | /* for some reason if the extra axes are left unset they drift */ | ||
487 | /* for (j = 0; j < 4; j++) | ||
488 | input_report_abs(dev, gc_psx_abs[j + 2], 128); | ||
489 | * This needs to be debugged properly, | ||
490 | * maybe fuzz processing needs to be done in input_sync() | ||
491 | * --vojtech | ||
492 | */ | ||
359 | } | 493 | } |
360 | 494 | ||
361 | input_report_abs(gc->dev[i], ABS_X, axes[0]); | 495 | for (j = 0; j < 8; j++) |
362 | input_report_abs(gc->dev[i], ABS_Y, -axes[1]); | 496 | input_report_key(dev, gc_psx_btn[j], ~data[i][1] & (1 << j)); |
497 | |||
498 | input_report_key(dev, BTN_START, ~data[i][0] & 0x08); | ||
499 | input_report_key(dev, BTN_SELECT, ~data[i][0] & 0x01); | ||
363 | 500 | ||
364 | input_report_abs(gc->dev[i], ABS_HAT0X, !(s & data[6]) - !(s & data[7])); | 501 | input_sync(dev); |
365 | input_report_abs(gc->dev[i], ABS_HAT0Y, !(s & data[4]) - !(s & data[5])); | ||
366 | 502 | ||
367 | for (j = 0; j < 10; j++) | 503 | break; |
368 | input_report_key(gc->dev[i], gc_n64_btn[j], s & data[gc_n64_bytes[j]]); | ||
369 | 504 | ||
370 | input_sync(gc->dev[i]); | 505 | case 0: /* not a pad, ignore */ |
371 | } | 506 | break; |
372 | } | 507 | } |
373 | } | 508 | } |
509 | } | ||
374 | 510 | ||
375 | /* | 511 | /* |
376 | * NES and SNES pads | 512 | * gc_timer() initiates reads of console pads data. |
377 | */ | 513 | */ |
378 | 514 | ||
379 | if (gc->pads[GC_NES] || gc->pads[GC_SNES]) { | 515 | static void gc_timer(unsigned long private) |
380 | 516 | { | |
381 | gc_nes_read_packet(gc, gc->pads[GC_SNES] ? GC_SNES_LENGTH : GC_NES_LENGTH, data); | 517 | struct gc *gc = (void *) private; |
382 | |||
383 | for (i = 0; i < 5; i++) { | ||
384 | |||
385 | s = gc_status_bit[i]; | ||
386 | 518 | ||
387 | if (s & (gc->pads[GC_NES] | gc->pads[GC_SNES])) { | 519 | /* |
388 | input_report_abs(gc->dev[i], ABS_X, !(s & data[6]) - !(s & data[7])); | 520 | * N64 pads - must be read first, any read confuses them for 200 us |
389 | input_report_abs(gc->dev[i], ABS_Y, !(s & data[4]) - !(s & data[5])); | 521 | */ |
390 | } | ||
391 | 522 | ||
392 | if (s & gc->pads[GC_NES]) | 523 | if (gc->pads[GC_N64]) |
393 | for (j = 0; j < 4; j++) | 524 | gc_n64_process_packet(gc); |
394 | input_report_key(gc->dev[i], gc_snes_btn[j], s & data[gc_nes_bytes[j]]); | ||
395 | 525 | ||
396 | if (s & gc->pads[GC_SNES]) | 526 | /* |
397 | for (j = 0; j < 8; j++) | 527 | * NES and SNES pads |
398 | input_report_key(gc->dev[i], gc_snes_btn[j], s & data[gc_snes_bytes[j]]); | 528 | */ |
399 | 529 | ||
400 | input_sync(gc->dev[i]); | 530 | if (gc->pads[GC_NES] || gc->pads[GC_SNES]) |
401 | } | 531 | gc_nes_process_packet(gc); |
402 | } | ||
403 | 532 | ||
404 | /* | 533 | /* |
405 | * Multi and Multi2 joysticks | 534 | * Multi and Multi2 joysticks |
406 | */ | 535 | */ |
407 | 536 | ||
408 | if (gc->pads[GC_MULTI] || gc->pads[GC_MULTI2]) { | 537 | if (gc->pads[GC_MULTI] || gc->pads[GC_MULTI2]) |
409 | 538 | gc_multi_process_packet(gc); | |
410 | gc_multi_read_packet(gc, gc->pads[GC_MULTI2] ? GC_MULTI2_LENGTH : GC_MULTI_LENGTH, data); | ||
411 | |||
412 | for (i = 0; i < 5; i++) { | ||
413 | |||
414 | s = gc_status_bit[i]; | ||
415 | |||
416 | if (s & (gc->pads[GC_MULTI] | gc->pads[GC_MULTI2])) { | ||
417 | input_report_abs(gc->dev[i], ABS_X, !(s & data[2]) - !(s & data[3])); | ||
418 | input_report_abs(gc->dev[i], ABS_Y, !(s & data[0]) - !(s & data[1])); | ||
419 | input_report_key(gc->dev[i], BTN_TRIGGER, s & data[4]); | ||
420 | } | ||
421 | |||
422 | if (s & gc->pads[GC_MULTI2]) | ||
423 | input_report_key(gc->dev[i], BTN_THUMB, s & data[5]); | ||
424 | |||
425 | input_sync(gc->dev[i]); | ||
426 | } | ||
427 | } | ||
428 | 539 | ||
429 | /* | 540 | /* |
430 | * PSX controllers | 541 | * PSX controllers |
431 | */ | 542 | */ |
432 | 543 | ||
433 | if (gc->pads[GC_PSX] || gc->pads[GC_DDR]) { | 544 | if (gc->pads[GC_PSX] || gc->pads[GC_DDR]) |
434 | 545 | gc_psx_process_packet(gc); | |
435 | gc_psx_read_packet(gc, data_psx, data); | ||
436 | |||
437 | for (i = 0; i < 5; i++) { | ||
438 | switch (data[i]) { | ||
439 | |||
440 | case GC_PSX_RUMBLE: | ||
441 | |||
442 | input_report_key(gc->dev[i], BTN_THUMBL, ~data_psx[i][0] & 0x04); | ||
443 | input_report_key(gc->dev[i], BTN_THUMBR, ~data_psx[i][0] & 0x02); | ||
444 | |||
445 | case GC_PSX_NEGCON: | ||
446 | case GC_PSX_ANALOG: | ||
447 | |||
448 | if (gc->pads[GC_DDR] & gc_status_bit[i]) { | ||
449 | for(j = 0; j < 4; j++) | ||
450 | input_report_key(gc->dev[i], gc_psx_ddr_btn[j], ~data_psx[i][0] & (0x10 << j)); | ||
451 | } else { | ||
452 | for (j = 0; j < 4; j++) | ||
453 | input_report_abs(gc->dev[i], gc_psx_abs[j+2], data_psx[i][j + 2]); | ||
454 | |||
455 | input_report_abs(gc->dev[i], ABS_X, 128 + !(data_psx[i][0] & 0x20) * 127 - !(data_psx[i][0] & 0x80) * 128); | ||
456 | input_report_abs(gc->dev[i], ABS_Y, 128 + !(data_psx[i][0] & 0x40) * 127 - !(data_psx[i][0] & 0x10) * 128); | ||
457 | } | ||
458 | |||
459 | for (j = 0; j < 8; j++) | ||
460 | input_report_key(gc->dev[i], gc_psx_btn[j], ~data_psx[i][1] & (1 << j)); | ||
461 | |||
462 | input_report_key(gc->dev[i], BTN_START, ~data_psx[i][0] & 0x08); | ||
463 | input_report_key(gc->dev[i], BTN_SELECT, ~data_psx[i][0] & 0x01); | ||
464 | |||
465 | input_sync(gc->dev[i]); | ||
466 | |||
467 | break; | ||
468 | |||
469 | case GC_PSX_NORMAL: | ||
470 | if (gc->pads[GC_DDR] & gc_status_bit[i]) { | ||
471 | for(j = 0; j < 4; j++) | ||
472 | input_report_key(gc->dev[i], gc_psx_ddr_btn[j], ~data_psx[i][0] & (0x10 << j)); | ||
473 | } else { | ||
474 | input_report_abs(gc->dev[i], ABS_X, 128 + !(data_psx[i][0] & 0x20) * 127 - !(data_psx[i][0] & 0x80) * 128); | ||
475 | input_report_abs(gc->dev[i], ABS_Y, 128 + !(data_psx[i][0] & 0x40) * 127 - !(data_psx[i][0] & 0x10) * 128); | ||
476 | |||
477 | /* for some reason if the extra axes are left unset they drift */ | ||
478 | /* for (j = 0; j < 4; j++) | ||
479 | input_report_abs(gc->dev[i], gc_psx_abs[j+2], 128); | ||
480 | * This needs to be debugged properly, | ||
481 | * maybe fuzz processing needs to be done in input_sync() | ||
482 | * --vojtech | ||
483 | */ | ||
484 | } | ||
485 | |||
486 | for (j = 0; j < 8; j++) | ||
487 | input_report_key(gc->dev[i], gc_psx_btn[j], ~data_psx[i][1] & (1 << j)); | ||
488 | |||
489 | input_report_key(gc->dev[i], BTN_START, ~data_psx[i][0] & 0x08); | ||
490 | input_report_key(gc->dev[i], BTN_SELECT, ~data_psx[i][0] & 0x01); | ||
491 | |||
492 | input_sync(gc->dev[i]); | ||
493 | |||
494 | break; | ||
495 | |||
496 | case 0: /* not a pad, ignore */ | ||
497 | break; | ||
498 | } | ||
499 | } | ||
500 | } | ||
501 | 546 | ||
502 | mod_timer(&gc->timer, jiffies + GC_REFRESH_TIME); | 547 | mod_timer(&gc->timer, jiffies + GC_REFRESH_TIME); |
503 | } | 548 | } |
@@ -654,16 +699,18 @@ static struct gc __init *gc_probe(int parport, int *pads, int n_pads) | |||
654 | gc->timer.data = (long) gc; | 699 | gc->timer.data = (long) gc; |
655 | gc->timer.function = gc_timer; | 700 | gc->timer.function = gc_timer; |
656 | 701 | ||
657 | for (i = 0; i < n_pads; i++) { | 702 | for (i = 0; i < n_pads && i < GC_MAX_DEVICES; i++) { |
658 | if (!pads[i]) | 703 | if (!pads[i]) |
659 | continue; | 704 | continue; |
660 | 705 | ||
661 | sprintf(gc->phys[i], "%s/input%d", gc->pd->port->name, i); | 706 | sprintf(gc->phys[i], "%s/input%d", gc->pd->port->name, i); |
662 | err = gc_setup_pad(gc, i, pads[i]); | 707 | err = gc_setup_pad(gc, i, pads[i]); |
663 | if (err) | 708 | if (err) |
664 | goto err_free_devs; | 709 | goto err_unreg_devs; |
665 | 710 | ||
666 | input_register_device(gc->dev[i]); | 711 | err = input_register_device(gc->dev[i]); |
712 | if (err) | ||
713 | goto err_free_dev; | ||
667 | } | 714 | } |
668 | 715 | ||
669 | if (!gc->pads[0]) { | 716 | if (!gc->pads[0]) { |
@@ -675,9 +722,12 @@ static struct gc __init *gc_probe(int parport, int *pads, int n_pads) | |||
675 | parport_put_port(pp); | 722 | parport_put_port(pp); |
676 | return gc; | 723 | return gc; |
677 | 724 | ||
678 | err_free_devs: | 725 | err_free_dev: |
726 | input_free_device(gc->dev[i]); | ||
727 | err_unreg_devs: | ||
679 | while (--i >= 0) | 728 | while (--i >= 0) |
680 | input_unregister_device(gc->dev[i]); | 729 | if (gc->dev[i]) |
730 | input_unregister_device(gc->dev[i]); | ||
681 | err_free_gc: | 731 | err_free_gc: |
682 | kfree(gc); | 732 | kfree(gc); |
683 | err_unreg_pardev: | 733 | err_unreg_pardev: |
@@ -688,7 +738,7 @@ static struct gc __init *gc_probe(int parport, int *pads, int n_pads) | |||
688 | return ERR_PTR(err); | 738 | return ERR_PTR(err); |
689 | } | 739 | } |
690 | 740 | ||
691 | static void __exit gc_remove(struct gc *gc) | 741 | static void gc_remove(struct gc *gc) |
692 | { | 742 | { |
693 | int i; | 743 | int i; |
694 | 744 | ||
@@ -726,7 +776,8 @@ static int __init gc_init(void) | |||
726 | 776 | ||
727 | if (err) { | 777 | if (err) { |
728 | while (--i >= 0) | 778 | while (--i >= 0) |
729 | gc_remove(gc_base[i]); | 779 | if (gc_base[i]) |
780 | gc_remove(gc_base[i]); | ||
730 | return err; | 781 | return err; |
731 | } | 782 | } |
732 | 783 | ||
diff --git a/drivers/input/joystick/grip.c b/drivers/input/joystick/grip.c index a936e7aedb10..20cb98ac2d79 100644 --- a/drivers/input/joystick/grip.c +++ b/drivers/input/joystick/grip.c | |||
@@ -192,6 +192,9 @@ static void grip_poll(struct gameport *gameport) | |||
192 | for (i = 0; i < 2; i++) { | 192 | for (i = 0; i < 2; i++) { |
193 | 193 | ||
194 | dev = grip->dev[i]; | 194 | dev = grip->dev[i]; |
195 | if (!dev) | ||
196 | continue; | ||
197 | |||
195 | grip->reads++; | 198 | grip->reads++; |
196 | 199 | ||
197 | switch (grip->mode[i]) { | 200 | switch (grip->mode[i]) { |
@@ -381,12 +384,15 @@ static int grip_connect(struct gameport *gameport, struct gameport_driver *drv) | |||
381 | if (t > 0) | 384 | if (t > 0) |
382 | set_bit(t, input_dev->keybit); | 385 | set_bit(t, input_dev->keybit); |
383 | 386 | ||
384 | input_register_device(grip->dev[i]); | 387 | err = input_register_device(grip->dev[i]); |
388 | if (err) | ||
389 | goto fail4; | ||
385 | } | 390 | } |
386 | 391 | ||
387 | return 0; | 392 | return 0; |
388 | 393 | ||
389 | fail3: for (i = 0; i < 2; i++) | 394 | fail4: input_free_device(grip->dev[i]); |
395 | fail3: while (--i >= 0) | ||
390 | if (grip->dev[i]) | 396 | if (grip->dev[i]) |
391 | input_unregister_device(grip->dev[i]); | 397 | input_unregister_device(grip->dev[i]); |
392 | fail2: gameport_close(gameport); | 398 | fail2: gameport_close(gameport); |
@@ -411,6 +417,7 @@ static void grip_disconnect(struct gameport *gameport) | |||
411 | static struct gameport_driver grip_drv = { | 417 | static struct gameport_driver grip_drv = { |
412 | .driver = { | 418 | .driver = { |
413 | .name = "grip", | 419 | .name = "grip", |
420 | .owner = THIS_MODULE, | ||
414 | }, | 421 | }, |
415 | .description = DRIVER_DESC, | 422 | .description = DRIVER_DESC, |
416 | .connect = grip_connect, | 423 | .connect = grip_connect, |
diff --git a/drivers/input/joystick/iforce/iforce-main.c b/drivers/input/joystick/iforce/iforce-main.c index 64b9c31c47fc..b6bc04998047 100644 --- a/drivers/input/joystick/iforce/iforce-main.c +++ b/drivers/input/joystick/iforce/iforce-main.c | |||
@@ -345,7 +345,7 @@ int iforce_init_device(struct iforce *iforce) | |||
345 | int i; | 345 | int i; |
346 | 346 | ||
347 | input_dev = input_allocate_device(); | 347 | input_dev = input_allocate_device(); |
348 | if (input_dev) | 348 | if (!input_dev) |
349 | return -ENOMEM; | 349 | return -ENOMEM; |
350 | 350 | ||
351 | init_waitqueue_head(&iforce->wait); | 351 | init_waitqueue_head(&iforce->wait); |
diff --git a/drivers/input/joystick/iforce/iforce-packets.c b/drivers/input/joystick/iforce/iforce-packets.c index 4a2629243e19..76cb1f88f4e8 100644 --- a/drivers/input/joystick/iforce/iforce-packets.c +++ b/drivers/input/joystick/iforce/iforce-packets.c | |||
@@ -167,9 +167,9 @@ void iforce_process_packet(struct iforce *iforce, u16 cmd, unsigned char *data, | |||
167 | iforce->expect_packet = 0; | 167 | iforce->expect_packet = 0; |
168 | iforce->ecmd = cmd; | 168 | iforce->ecmd = cmd; |
169 | memcpy(iforce->edata, data, IFORCE_MAX_LENGTH); | 169 | memcpy(iforce->edata, data, IFORCE_MAX_LENGTH); |
170 | wake_up(&iforce->wait); | ||
171 | } | 170 | } |
172 | #endif | 171 | #endif |
172 | wake_up(&iforce->wait); | ||
173 | 173 | ||
174 | if (!iforce->type) { | 174 | if (!iforce->type) { |
175 | being_used--; | 175 | being_used--; |
@@ -264,7 +264,7 @@ int iforce_get_id_packet(struct iforce *iforce, char *packet) | |||
264 | wait_event_interruptible_timeout(iforce->wait, | 264 | wait_event_interruptible_timeout(iforce->wait, |
265 | iforce->ctrl->status != -EINPROGRESS, HZ); | 265 | iforce->ctrl->status != -EINPROGRESS, HZ); |
266 | 266 | ||
267 | if (iforce->ctrl->status != -EINPROGRESS) { | 267 | if (iforce->ctrl->status) { |
268 | usb_unlink_urb(iforce->ctrl); | 268 | usb_unlink_urb(iforce->ctrl); |
269 | return -1; | 269 | return -1; |
270 | } | 270 | } |
diff --git a/drivers/input/joystick/iforce/iforce-usb.c b/drivers/input/joystick/iforce/iforce-usb.c index bc2fce60f9f8..fe79d158456d 100644 --- a/drivers/input/joystick/iforce/iforce-usb.c +++ b/drivers/input/joystick/iforce/iforce-usb.c | |||
@@ -95,7 +95,6 @@ static void iforce_usb_irq(struct urb *urb, struct pt_regs *regs) | |||
95 | goto exit; | 95 | goto exit; |
96 | } | 96 | } |
97 | 97 | ||
98 | wake_up(&iforce->wait); | ||
99 | iforce_process_packet(iforce, | 98 | iforce_process_packet(iforce, |
100 | (iforce->data[0] << 8) | (urb->actual_length - 1), iforce->data + 1, regs); | 99 | (iforce->data[0] << 8) | (urb->actual_length - 1), iforce->data + 1, regs); |
101 | 100 | ||
diff --git a/drivers/input/joystick/sidewinder.c b/drivers/input/joystick/sidewinder.c index 78dd163cd702..2b2ec1057dee 100644 --- a/drivers/input/joystick/sidewinder.c +++ b/drivers/input/joystick/sidewinder.c | |||
@@ -736,7 +736,7 @@ static int sw_connect(struct gameport *gameport, struct gameport_driver *drv) | |||
736 | sprintf(sw->name, "Microsoft SideWinder %s", sw_name[sw->type]); | 736 | sprintf(sw->name, "Microsoft SideWinder %s", sw_name[sw->type]); |
737 | sprintf(sw->phys[i], "%s/input%d", gameport->phys, i); | 737 | sprintf(sw->phys[i], "%s/input%d", gameport->phys, i); |
738 | 738 | ||
739 | input_dev = input_allocate_device(); | 739 | sw->dev[i] = input_dev = input_allocate_device(); |
740 | if (!input_dev) { | 740 | if (!input_dev) { |
741 | err = -ENOMEM; | 741 | err = -ENOMEM; |
742 | goto fail3; | 742 | goto fail3; |
@@ -771,12 +771,15 @@ static int sw_connect(struct gameport *gameport, struct gameport_driver *drv) | |||
771 | 771 | ||
772 | dbg("%s%s [%d-bit id %d data %d]\n", sw->name, comment, m, l, k); | 772 | dbg("%s%s [%d-bit id %d data %d]\n", sw->name, comment, m, l, k); |
773 | 773 | ||
774 | input_register_device(sw->dev[i]); | 774 | err = input_register_device(sw->dev[i]); |
775 | if (err) | ||
776 | goto fail4; | ||
775 | } | 777 | } |
776 | 778 | ||
777 | return 0; | 779 | return 0; |
778 | 780 | ||
779 | fail3: while (--i >= 0) | 781 | fail4: input_free_device(sw->dev[i]); |
782 | fail3: while (--i >= 0) | ||
780 | input_unregister_device(sw->dev[i]); | 783 | input_unregister_device(sw->dev[i]); |
781 | fail2: gameport_close(gameport); | 784 | fail2: gameport_close(gameport); |
782 | fail1: gameport_set_drvdata(gameport, NULL); | 785 | fail1: gameport_set_drvdata(gameport, NULL); |
@@ -801,6 +804,7 @@ static void sw_disconnect(struct gameport *gameport) | |||
801 | static struct gameport_driver sw_drv = { | 804 | static struct gameport_driver sw_drv = { |
802 | .driver = { | 805 | .driver = { |
803 | .name = "sidewinder", | 806 | .name = "sidewinder", |
807 | .owner = THIS_MODULE, | ||
804 | }, | 808 | }, |
805 | .description = DRIVER_DESC, | 809 | .description = DRIVER_DESC, |
806 | .connect = sw_connect, | 810 | .connect = sw_connect, |
diff --git a/drivers/input/joystick/tmdc.c b/drivers/input/joystick/tmdc.c index 60e2aac7d06e..bb23ed2a04a6 100644 --- a/drivers/input/joystick/tmdc.c +++ b/drivers/input/joystick/tmdc.c | |||
@@ -284,13 +284,13 @@ static int tmdc_setup_port(struct tmdc *tmdc, int idx, unsigned char *data) | |||
284 | struct tmdc_port *port; | 284 | struct tmdc_port *port; |
285 | struct input_dev *input_dev; | 285 | struct input_dev *input_dev; |
286 | int i, j, b = 0; | 286 | int i, j, b = 0; |
287 | int err; | ||
287 | 288 | ||
288 | tmdc->port[idx] = port = kzalloc(sizeof (struct tmdc_port), GFP_KERNEL); | 289 | tmdc->port[idx] = port = kzalloc(sizeof (struct tmdc_port), GFP_KERNEL); |
289 | input_dev = input_allocate_device(); | 290 | input_dev = input_allocate_device(); |
290 | if (!port || !input_dev) { | 291 | if (!port || !input_dev) { |
291 | kfree(port); | 292 | err = -ENOMEM; |
292 | input_free_device(input_dev); | 293 | goto fail; |
293 | return -ENOMEM; | ||
294 | } | 294 | } |
295 | 295 | ||
296 | port->mode = data[TMDC_BYTE_ID]; | 296 | port->mode = data[TMDC_BYTE_ID]; |
@@ -347,9 +347,15 @@ static int tmdc_setup_port(struct tmdc *tmdc, int idx, unsigned char *data) | |||
347 | b += port->btnc[i]; | 347 | b += port->btnc[i]; |
348 | } | 348 | } |
349 | 349 | ||
350 | input_register_device(port->dev); | 350 | err = input_register_device(port->dev); |
351 | if (err) | ||
352 | goto fail; | ||
351 | 353 | ||
352 | return 0; | 354 | return 0; |
355 | |||
356 | fail: input_free_device(input_dev); | ||
357 | kfree(port); | ||
358 | return err; | ||
353 | } | 359 | } |
354 | 360 | ||
355 | /* | 361 | /* |
@@ -424,6 +430,7 @@ static void tmdc_disconnect(struct gameport *gameport) | |||
424 | static struct gameport_driver tmdc_drv = { | 430 | static struct gameport_driver tmdc_drv = { |
425 | .driver = { | 431 | .driver = { |
426 | .name = "tmdc", | 432 | .name = "tmdc", |
433 | .owner = THIS_MODULE, | ||
427 | }, | 434 | }, |
428 | .description = DRIVER_DESC, | 435 | .description = DRIVER_DESC, |
429 | .connect = tmdc_connect, | 436 | .connect = tmdc_connect, |
diff --git a/drivers/input/joystick/turbografx.c b/drivers/input/joystick/turbografx.c index 7e9764937d06..b154938e88a4 100644 --- a/drivers/input/joystick/turbografx.c +++ b/drivers/input/joystick/turbografx.c | |||
@@ -204,14 +204,14 @@ static struct tgfx __init *tgfx_probe(int parport, int *n_buttons, int n_devs) | |||
204 | if (n_buttons[i] > 6) { | 204 | if (n_buttons[i] > 6) { |
205 | printk(KERN_ERR "turbografx.c: Invalid number of buttons %d\n", n_buttons[i]); | 205 | printk(KERN_ERR "turbografx.c: Invalid number of buttons %d\n", n_buttons[i]); |
206 | err = -EINVAL; | 206 | err = -EINVAL; |
207 | goto err_free_devs; | 207 | goto err_unreg_devs; |
208 | } | 208 | } |
209 | 209 | ||
210 | tgfx->dev[i] = input_dev = input_allocate_device(); | 210 | tgfx->dev[i] = input_dev = input_allocate_device(); |
211 | if (!input_dev) { | 211 | if (!input_dev) { |
212 | printk(KERN_ERR "turbografx.c: Not enough memory for input device\n"); | 212 | printk(KERN_ERR "turbografx.c: Not enough memory for input device\n"); |
213 | err = -ENOMEM; | 213 | err = -ENOMEM; |
214 | goto err_free_devs; | 214 | goto err_unreg_devs; |
215 | } | 215 | } |
216 | 216 | ||
217 | tgfx->sticks |= (1 << i); | 217 | tgfx->sticks |= (1 << i); |
@@ -238,7 +238,9 @@ static struct tgfx __init *tgfx_probe(int parport, int *n_buttons, int n_devs) | |||
238 | for (j = 0; j < n_buttons[i]; j++) | 238 | for (j = 0; j < n_buttons[i]; j++) |
239 | set_bit(tgfx_buttons[j], input_dev->keybit); | 239 | set_bit(tgfx_buttons[j], input_dev->keybit); |
240 | 240 | ||
241 | input_register_device(tgfx->dev[i]); | 241 | err = input_register_device(tgfx->dev[i]); |
242 | if (err) | ||
243 | goto err_free_dev; | ||
242 | } | 244 | } |
243 | 245 | ||
244 | if (!tgfx->sticks) { | 246 | if (!tgfx->sticks) { |
@@ -249,9 +251,12 @@ static struct tgfx __init *tgfx_probe(int parport, int *n_buttons, int n_devs) | |||
249 | 251 | ||
250 | return tgfx; | 252 | return tgfx; |
251 | 253 | ||
252 | err_free_devs: | 254 | err_free_dev: |
255 | input_free_device(tgfx->dev[i]); | ||
256 | err_unreg_devs: | ||
253 | while (--i >= 0) | 257 | while (--i >= 0) |
254 | input_unregister_device(tgfx->dev[i]); | 258 | if (tgfx->dev[i]) |
259 | input_unregister_device(tgfx->dev[i]); | ||
255 | err_free_tgfx: | 260 | err_free_tgfx: |
256 | kfree(tgfx); | 261 | kfree(tgfx); |
257 | err_unreg_pardev: | 262 | err_unreg_pardev: |
@@ -262,7 +267,7 @@ static struct tgfx __init *tgfx_probe(int parport, int *n_buttons, int n_devs) | |||
262 | return ERR_PTR(err); | 267 | return ERR_PTR(err); |
263 | } | 268 | } |
264 | 269 | ||
265 | static void __exit tgfx_remove(struct tgfx *tgfx) | 270 | static void tgfx_remove(struct tgfx *tgfx) |
266 | { | 271 | { |
267 | int i; | 272 | int i; |
268 | 273 | ||
@@ -300,7 +305,8 @@ static int __init tgfx_init(void) | |||
300 | 305 | ||
301 | if (err) { | 306 | if (err) { |
302 | while (--i >= 0) | 307 | while (--i >= 0) |
303 | tgfx_remove(tgfx_base[i]); | 308 | if (tgfx_base[i]) |
309 | tgfx_remove(tgfx_base[i]); | ||
304 | return err; | 310 | return err; |
305 | } | 311 | } |
306 | 312 | ||
diff --git a/drivers/input/joystick/twidjoy.c b/drivers/input/joystick/twidjoy.c index cd3a1e742a30..7f8b0093c5bc 100644 --- a/drivers/input/joystick/twidjoy.c +++ b/drivers/input/joystick/twidjoy.c | |||
@@ -265,13 +265,13 @@ static struct serio_driver twidjoy_drv = { | |||
265 | * The functions for inserting/removing us as a module. | 265 | * The functions for inserting/removing us as a module. |
266 | */ | 266 | */ |
267 | 267 | ||
268 | int __init twidjoy_init(void) | 268 | static int __init twidjoy_init(void) |
269 | { | 269 | { |
270 | serio_register_driver(&twidjoy_drv); | 270 | serio_register_driver(&twidjoy_drv); |
271 | return 0; | 271 | return 0; |
272 | } | 272 | } |
273 | 273 | ||
274 | void __exit twidjoy_exit(void) | 274 | static void __exit twidjoy_exit(void) |
275 | { | 275 | { |
276 | serio_unregister_driver(&twidjoy_drv); | 276 | serio_unregister_driver(&twidjoy_drv); |
277 | } | 277 | } |
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig index e08dbe08f46d..4bad588d0e5d 100644 --- a/drivers/input/misc/Kconfig +++ b/drivers/input/misc/Kconfig | |||
@@ -50,6 +50,18 @@ config INPUT_WISTRON_BTNS | |||
50 | To compile this driver as a module, choose M here: the module will | 50 | To compile this driver as a module, choose M here: the module will |
51 | be called wistron_btns. | 51 | be called wistron_btns. |
52 | 52 | ||
53 | config INPUT_IXP4XX_BEEPER | ||
54 | tristate "IXP4XX Beeper support" | ||
55 | depends on ARCH_IXP4XX | ||
56 | help | ||
57 | If you say yes here, you can connect a beeper to the | ||
58 | ixp4xx gpio pins. This is used by the LinkSys NSLU2. | ||
59 | |||
60 | If unsure, say Y. | ||
61 | |||
62 | To compile this driver as a module, choose M here: the | ||
63 | module will be called ixp4xx-beeper. | ||
64 | |||
53 | config INPUT_UINPUT | 65 | config INPUT_UINPUT |
54 | tristate "User level driver support" | 66 | tristate "User level driver support" |
55 | help | 67 | help |
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile index ce44cce01285..184c4129470d 100644 --- a/drivers/input/misc/Makefile +++ b/drivers/input/misc/Makefile | |||
@@ -11,3 +11,4 @@ obj-$(CONFIG_INPUT_98SPKR) += 98spkr.o | |||
11 | obj-$(CONFIG_INPUT_UINPUT) += uinput.o | 11 | obj-$(CONFIG_INPUT_UINPUT) += uinput.o |
12 | obj-$(CONFIG_INPUT_WISTRON_BTNS) += wistron_btns.o | 12 | obj-$(CONFIG_INPUT_WISTRON_BTNS) += wistron_btns.o |
13 | obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o | 13 | obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o |
14 | obj-$(CONFIG_INPUT_IXP4XX_BEEPER) += ixp4xx-beeper.o | ||
diff --git a/drivers/input/misc/ixp4xx-beeper.c b/drivers/input/misc/ixp4xx-beeper.c new file mode 100644 index 000000000000..d448bb5e4869 --- /dev/null +++ b/drivers/input/misc/ixp4xx-beeper.c | |||
@@ -0,0 +1,183 @@ | |||
1 | /* | ||
2 | * Generic IXP4xx beeper driver | ||
3 | * | ||
4 | * Copyright (C) 2005 Tower Technologies | ||
5 | * | ||
6 | * based on nslu2-io.c | ||
7 | * Copyright (C) 2004 Karen Spearel | ||
8 | * | ||
9 | * Author: Alessandro Zummo <a.zummo@towertech.it> | ||
10 | * Maintainers: http://www.nslu2-linux.org/ | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or modify | ||
13 | * it under the terms of the GNU General Public License version 2 as | ||
14 | * published by the Free Software Foundation. | ||
15 | * | ||
16 | */ | ||
17 | |||
18 | #include <linux/module.h> | ||
19 | #include <linux/input.h> | ||
20 | #include <linux/delay.h> | ||
21 | #include <linux/platform_device.h> | ||
22 | #include <asm/hardware.h> | ||
23 | |||
24 | MODULE_AUTHOR("Alessandro Zummo <a.zummo@towertech.it>"); | ||
25 | MODULE_DESCRIPTION("ixp4xx beeper driver"); | ||
26 | MODULE_LICENSE("GPL"); | ||
27 | |||
28 | static DEFINE_SPINLOCK(beep_lock); | ||
29 | |||
30 | static void ixp4xx_spkr_control(unsigned int pin, unsigned int count) | ||
31 | { | ||
32 | unsigned long flags; | ||
33 | |||
34 | spin_lock_irqsave(&beep_lock, flags); | ||
35 | |||
36 | if (count) { | ||
37 | gpio_line_config(pin, IXP4XX_GPIO_OUT); | ||
38 | gpio_line_set(pin, IXP4XX_GPIO_LOW); | ||
39 | |||
40 | *IXP4XX_OSRT2 = (count & ~IXP4XX_OST_RELOAD_MASK) | IXP4XX_OST_ENABLE; | ||
41 | } else { | ||
42 | gpio_line_config(pin, IXP4XX_GPIO_IN); | ||
43 | gpio_line_set(pin, IXP4XX_GPIO_HIGH); | ||
44 | |||
45 | *IXP4XX_OSRT2 = 0; | ||
46 | } | ||
47 | |||
48 | spin_unlock_irqrestore(&beep_lock, flags); | ||
49 | } | ||
50 | |||
51 | static int ixp4xx_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) | ||
52 | { | ||
53 | unsigned int pin = (unsigned int) dev->private; | ||
54 | unsigned int count = 0; | ||
55 | |||
56 | if (type != EV_SND) | ||
57 | return -1; | ||
58 | |||
59 | switch (code) { | ||
60 | case SND_BELL: | ||
61 | if (value) | ||
62 | value = 1000; | ||
63 | case SND_TONE: | ||
64 | break; | ||
65 | default: | ||
66 | return -1; | ||
67 | } | ||
68 | |||
69 | if (value > 20 && value < 32767) | ||
70 | #ifndef FREQ | ||
71 | count = (ixp4xx_get_board_tick_rate() / (value * 4)) - 1; | ||
72 | #else | ||
73 | count = (FREQ / (value * 4)) - 1; | ||
74 | #endif | ||
75 | |||
76 | ixp4xx_spkr_control(pin, count); | ||
77 | |||
78 | return 0; | ||
79 | } | ||
80 | |||
81 | static irqreturn_t ixp4xx_spkr_interrupt(int irq, void *dev_id, struct pt_regs *regs) | ||
82 | { | ||
83 | /* clear interrupt */ | ||
84 | *IXP4XX_OSST = IXP4XX_OSST_TIMER_2_PEND; | ||
85 | |||
86 | /* flip the beeper output */ | ||
87 | *IXP4XX_GPIO_GPOUTR ^= (1 << (unsigned int) dev_id); | ||
88 | |||
89 | return IRQ_HANDLED; | ||
90 | } | ||
91 | |||
92 | static int __devinit ixp4xx_spkr_probe(struct platform_device *dev) | ||
93 | { | ||
94 | struct input_dev *input_dev; | ||
95 | int err; | ||
96 | |||
97 | input_dev = input_allocate_device(); | ||
98 | if (!input_dev) | ||
99 | return -ENOMEM; | ||
100 | |||
101 | input_dev->private = (void *) dev->id; | ||
102 | input_dev->name = "ixp4xx beeper", | ||
103 | input_dev->phys = "ixp4xx/gpio"; | ||
104 | input_dev->id.bustype = BUS_HOST; | ||
105 | input_dev->id.vendor = 0x001f; | ||
106 | input_dev->id.product = 0x0001; | ||
107 | input_dev->id.version = 0x0100; | ||
108 | input_dev->cdev.dev = &dev->dev; | ||
109 | |||
110 | input_dev->evbit[0] = BIT(EV_SND); | ||
111 | input_dev->sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE); | ||
112 | input_dev->event = ixp4xx_spkr_event; | ||
113 | |||
114 | err = request_irq(IRQ_IXP4XX_TIMER2, &ixp4xx_spkr_interrupt, | ||
115 | SA_INTERRUPT | SA_TIMER, "ixp4xx-beeper", (void *) dev->id); | ||
116 | if (err) | ||
117 | goto err_free_device; | ||
118 | |||
119 | err = input_register_device(input_dev); | ||
120 | if (err) | ||
121 | goto err_free_irq; | ||
122 | |||
123 | platform_set_drvdata(dev, input_dev); | ||
124 | |||
125 | return 0; | ||
126 | |||
127 | err_free_irq: | ||
128 | free_irq(IRQ_IXP4XX_TIMER2, dev); | ||
129 | err_free_device: | ||
130 | input_free_device(input_dev); | ||
131 | |||
132 | return err; | ||
133 | } | ||
134 | |||
135 | static int __devexit ixp4xx_spkr_remove(struct platform_device *dev) | ||
136 | { | ||
137 | struct input_dev *input_dev = platform_get_drvdata(dev); | ||
138 | unsigned int pin = (unsigned int) input_dev->private; | ||
139 | |||
140 | input_unregister_device(input_dev); | ||
141 | platform_set_drvdata(dev, NULL); | ||
142 | |||
143 | /* turn the speaker off */ | ||
144 | disable_irq(IRQ_IXP4XX_TIMER2); | ||
145 | ixp4xx_spkr_control(pin, 0); | ||
146 | |||
147 | free_irq(IRQ_IXP4XX_TIMER2, dev); | ||
148 | |||
149 | return 0; | ||
150 | } | ||
151 | |||
152 | static void ixp4xx_spkr_shutdown(struct platform_device *dev) | ||
153 | { | ||
154 | struct input_dev *input_dev = platform_get_drvdata(dev); | ||
155 | unsigned int pin = (unsigned int) input_dev->private; | ||
156 | |||
157 | /* turn off the speaker */ | ||
158 | disable_irq(IRQ_IXP4XX_TIMER2); | ||
159 | ixp4xx_spkr_control(pin, 0); | ||
160 | } | ||
161 | |||
162 | static struct platform_driver ixp4xx_spkr_platform_driver = { | ||
163 | .driver = { | ||
164 | .name = "ixp4xx-beeper", | ||
165 | .owner = THIS_MODULE, | ||
166 | }, | ||
167 | .probe = ixp4xx_spkr_probe, | ||
168 | .remove = __devexit_p(ixp4xx_spkr_remove), | ||
169 | .shutdown = ixp4xx_spkr_shutdown, | ||
170 | }; | ||
171 | |||
172 | static int __init ixp4xx_spkr_init(void) | ||
173 | { | ||
174 | return platform_driver_register(&ixp4xx_spkr_platform_driver); | ||
175 | } | ||
176 | |||
177 | static void __exit ixp4xx_spkr_exit(void) | ||
178 | { | ||
179 | platform_driver_unregister(&ixp4xx_spkr_platform_driver); | ||
180 | } | ||
181 | |||
182 | module_init(ixp4xx_spkr_init); | ||
183 | module_exit(ixp4xx_spkr_exit); | ||
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c index 7665fd9ce559..19b1b0121726 100644 --- a/drivers/input/mouse/psmouse-base.c +++ b/drivers/input/mouse/psmouse-base.c | |||
@@ -403,6 +403,7 @@ static int genius_detect(struct psmouse *psmouse, int set_properties) | |||
403 | set_bit(REL_WHEEL, psmouse->dev->relbit); | 403 | set_bit(REL_WHEEL, psmouse->dev->relbit); |
404 | 404 | ||
405 | psmouse->vendor = "Genius"; | 405 | psmouse->vendor = "Genius"; |
406 | psmouse->name = "Mouse"; | ||
406 | psmouse->pktsize = 4; | 407 | psmouse->pktsize = 4; |
407 | } | 408 | } |
408 | 409 | ||
diff --git a/drivers/input/mousedev.c b/drivers/input/mousedev.c index 81fd7a97a93d..9abed18d2ecf 100644 --- a/drivers/input/mousedev.c +++ b/drivers/input/mousedev.c | |||
@@ -356,7 +356,7 @@ static void mousedev_free(struct mousedev *mousedev) | |||
356 | kfree(mousedev); | 356 | kfree(mousedev); |
357 | } | 357 | } |
358 | 358 | ||
359 | static int mixdev_release(void) | 359 | static void mixdev_release(void) |
360 | { | 360 | { |
361 | struct input_handle *handle; | 361 | struct input_handle *handle; |
362 | 362 | ||
@@ -370,8 +370,6 @@ static int mixdev_release(void) | |||
370 | mousedev_free(mousedev); | 370 | mousedev_free(mousedev); |
371 | } | 371 | } |
372 | } | 372 | } |
373 | |||
374 | return 0; | ||
375 | } | 373 | } |
376 | 374 | ||
377 | static int mousedev_release(struct inode * inode, struct file * file) | 375 | static int mousedev_release(struct inode * inode, struct file * file) |
@@ -384,9 +382,8 @@ static int mousedev_release(struct inode * inode, struct file * file) | |||
384 | 382 | ||
385 | if (!--list->mousedev->open) { | 383 | if (!--list->mousedev->open) { |
386 | if (list->mousedev->minor == MOUSEDEV_MIX) | 384 | if (list->mousedev->minor == MOUSEDEV_MIX) |
387 | return mixdev_release(); | 385 | mixdev_release(); |
388 | 386 | else if (!mousedev_mix.open) { | |
389 | if (!mousedev_mix.open) { | ||
390 | if (list->mousedev->exist) | 387 | if (list->mousedev->exist) |
391 | input_close_device(&list->mousedev->handle); | 388 | input_close_device(&list->mousedev->handle); |
392 | else | 389 | else |
diff --git a/drivers/input/touchscreen/mk712.c b/drivers/input/touchscreen/mk712.c index 4844d250a5eb..3226830eea08 100644 --- a/drivers/input/touchscreen/mk712.c +++ b/drivers/input/touchscreen/mk712.c | |||
@@ -154,7 +154,7 @@ static void mk712_close(struct input_dev *dev) | |||
154 | spin_unlock_irqrestore(&mk712_lock, flags); | 154 | spin_unlock_irqrestore(&mk712_lock, flags); |
155 | } | 155 | } |
156 | 156 | ||
157 | int __init mk712_init(void) | 157 | static int __init mk712_init(void) |
158 | { | 158 | { |
159 | int err; | 159 | int err; |
160 | 160 | ||
diff --git a/drivers/usb/input/hiddev.c b/drivers/usb/input/hiddev.c index 77be6b9a820f..925f5aba06f5 100644 --- a/drivers/usb/input/hiddev.c +++ b/drivers/usb/input/hiddev.c | |||
@@ -631,7 +631,7 @@ static int hiddev_ioctl(struct inode *inode, struct file *file, unsigned int cmd | |||
631 | 631 | ||
632 | else if ((cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) && | 632 | else if ((cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) && |
633 | (uref_multi->num_values > HID_MAX_MULTI_USAGES || | 633 | (uref_multi->num_values > HID_MAX_MULTI_USAGES || |
634 | uref->usage_index + uref_multi->num_values >= field->report_count)) | 634 | uref->usage_index + uref_multi->num_values > field->report_count)) |
635 | goto inval; | 635 | goto inval; |
636 | } | 636 | } |
637 | 637 | ||