diff options
Diffstat (limited to 'drivers/input/joystick/grip.c')
-rw-r--r-- | drivers/input/joystick/grip.c | 77 |
1 files changed, 43 insertions, 34 deletions
diff --git a/drivers/input/joystick/grip.c b/drivers/input/joystick/grip.c index 9d3f910dd568..e206bb56e53c 100644 --- a/drivers/input/joystick/grip.c +++ b/drivers/input/joystick/grip.c | |||
@@ -55,7 +55,7 @@ MODULE_LICENSE("GPL"); | |||
55 | 55 | ||
56 | struct grip { | 56 | struct grip { |
57 | struct gameport *gameport; | 57 | struct gameport *gameport; |
58 | struct input_dev dev[2]; | 58 | struct input_dev *dev[2]; |
59 | unsigned char mode[2]; | 59 | unsigned char mode[2]; |
60 | int reads; | 60 | int reads; |
61 | int bads; | 61 | int bads; |
@@ -190,7 +190,7 @@ static void grip_poll(struct gameport *gameport) | |||
190 | 190 | ||
191 | for (i = 0; i < 2; i++) { | 191 | for (i = 0; i < 2; i++) { |
192 | 192 | ||
193 | dev = grip->dev + i; | 193 | dev = grip->dev[i]; |
194 | grip->reads++; | 194 | grip->reads++; |
195 | 195 | ||
196 | switch (grip->mode[i]) { | 196 | switch (grip->mode[i]) { |
@@ -297,6 +297,7 @@ static void grip_close(struct input_dev *dev) | |||
297 | static int grip_connect(struct gameport *gameport, struct gameport_driver *drv) | 297 | static int grip_connect(struct gameport *gameport, struct gameport_driver *drv) |
298 | { | 298 | { |
299 | struct grip *grip; | 299 | struct grip *grip; |
300 | struct input_dev *input_dev; | ||
300 | unsigned int data[GRIP_LENGTH_XT]; | 301 | unsigned int data[GRIP_LENGTH_XT]; |
301 | int i, j, t; | 302 | int i, j, t; |
302 | int err; | 303 | int err; |
@@ -339,48 +340,56 @@ static int grip_connect(struct gameport *gameport, struct gameport_driver *drv) | |||
339 | gameport_set_poll_handler(gameport, grip_poll); | 340 | gameport_set_poll_handler(gameport, grip_poll); |
340 | gameport_set_poll_interval(gameport, 20); | 341 | gameport_set_poll_interval(gameport, 20); |
341 | 342 | ||
342 | for (i = 0; i < 2; i++) | 343 | for (i = 0; i < 2; i++) { |
343 | if (grip->mode[i]) { | 344 | if (!grip->mode[i]) |
345 | continue; | ||
344 | 346 | ||
345 | sprintf(grip->phys[i], "%s/input%d", gameport->phys, i); | 347 | grip->dev[i] = input_dev = input_allocate_device(); |
348 | if (!input_dev) { | ||
349 | err = -ENOMEM; | ||
350 | goto fail3; | ||
351 | } | ||
346 | 352 | ||
347 | grip->dev[i].private = grip; | 353 | sprintf(grip->phys[i], "%s/input%d", gameport->phys, i); |
348 | 354 | ||
349 | grip->dev[i].open = grip_open; | 355 | input_dev->name = grip_name[grip->mode[i]]; |
350 | grip->dev[i].close = grip_close; | 356 | input_dev->phys = grip->phys[i]; |
357 | input_dev->id.bustype = BUS_GAMEPORT; | ||
358 | input_dev->id.vendor = GAMEPORT_ID_VENDOR_GRAVIS; | ||
359 | input_dev->id.product = grip->mode[i]; | ||
360 | input_dev->id.version = 0x0100; | ||
361 | input_dev->cdev.dev = &gameport->dev; | ||
362 | input_dev->private = grip; | ||
351 | 363 | ||
352 | grip->dev[i].name = grip_name[grip->mode[i]]; | 364 | input_dev->open = grip_open; |
353 | grip->dev[i].phys = grip->phys[i]; | 365 | input_dev->close = grip_close; |
354 | grip->dev[i].id.bustype = BUS_GAMEPORT; | ||
355 | grip->dev[i].id.vendor = GAMEPORT_ID_VENDOR_GRAVIS; | ||
356 | grip->dev[i].id.product = grip->mode[i]; | ||
357 | grip->dev[i].id.version = 0x0100; | ||
358 | 366 | ||
359 | grip->dev[i].evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); | 367 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); |
360 | 368 | ||
361 | for (j = 0; (t = grip_abs[grip->mode[i]][j]) >= 0; j++) { | 369 | for (j = 0; (t = grip_abs[grip->mode[i]][j]) >= 0; j++) { |
362 | 370 | ||
363 | if (j < grip_cen[grip->mode[i]]) | 371 | if (j < grip_cen[grip->mode[i]]) |
364 | input_set_abs_params(&grip->dev[i], t, 14, 52, 1, 2); | 372 | input_set_abs_params(input_dev, t, 14, 52, 1, 2); |
365 | else if (j < grip_anx[grip->mode[i]]) | 373 | else if (j < grip_anx[grip->mode[i]]) |
366 | input_set_abs_params(&grip->dev[i], t, 3, 57, 1, 0); | 374 | input_set_abs_params(input_dev, t, 3, 57, 1, 0); |
367 | else | 375 | else |
368 | input_set_abs_params(&grip->dev[i], t, -1, 1, 0, 0); | 376 | input_set_abs_params(input_dev, t, -1, 1, 0, 0); |
369 | } | 377 | } |
370 | 378 | ||
371 | for (j = 0; (t = grip_btn[grip->mode[i]][j]) >= 0; j++) | 379 | for (j = 0; (t = grip_btn[grip->mode[i]][j]) >= 0; j++) |
372 | if (t > 0) | 380 | if (t > 0) |
373 | set_bit(t, grip->dev[i].keybit); | 381 | set_bit(t, input_dev->keybit); |
374 | 382 | ||
375 | printk(KERN_INFO "input: %s on %s\n", | 383 | input_register_device(grip->dev[i]); |
376 | grip_name[grip->mode[i]], gameport->phys); | 384 | } |
377 | input_register_device(grip->dev + i); | ||
378 | } | ||
379 | 385 | ||
380 | return 0; | 386 | return 0; |
381 | 387 | ||
382 | fail2: gameport_close(gameport); | 388 | fail3: for (i = 0; i < 2; i++) |
383 | fail1: gameport_set_drvdata(gameport, NULL); | 389 | if (grip->dev[i]) |
390 | input_unregister_device(grip->dev[i]); | ||
391 | fail2: gameport_close(gameport); | ||
392 | fail1: gameport_set_drvdata(gameport, NULL); | ||
384 | kfree(grip); | 393 | kfree(grip); |
385 | return err; | 394 | return err; |
386 | } | 395 | } |
@@ -391,8 +400,8 @@ static void grip_disconnect(struct gameport *gameport) | |||
391 | int i; | 400 | int i; |
392 | 401 | ||
393 | for (i = 0; i < 2; i++) | 402 | for (i = 0; i < 2; i++) |
394 | if (grip->mode[i]) | 403 | if (grip->dev[i]) |
395 | input_unregister_device(grip->dev + i); | 404 | input_unregister_device(grip->dev[i]); |
396 | gameport_close(gameport); | 405 | gameport_close(gameport); |
397 | gameport_set_drvdata(gameport, NULL); | 406 | gameport_set_drvdata(gameport, NULL); |
398 | kfree(grip); | 407 | kfree(grip); |