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 | |
| parent | fa3c791d85aa9a363dd72dd834b73b79252ef44e (diff) | |
| parent | 6dea93477c3377cf4199fd37cc3fb11071987ae4 (diff) | |
Merge master.kernel.org:/pub/scm/linux/kernel/git/dtor/input
| -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 | ||
