diff options
| -rw-r--r-- | drivers/input/joystick/gamecon.c | 202 |
1 files changed, 123 insertions, 79 deletions
diff --git a/drivers/input/joystick/gamecon.c b/drivers/input/joystick/gamecon.c index d57edd4a5992..e9c6647e1f74 100644 --- a/drivers/input/joystick/gamecon.c +++ b/drivers/input/joystick/gamecon.c | |||
| @@ -61,28 +61,36 @@ MODULE_PARM_DESC(map3, "Describes third set of devices"); | |||
| 61 | 61 | ||
| 62 | /* see also gs_psx_delay parameter in PSX support section */ | 62 | /* see also gs_psx_delay parameter in PSX support section */ |
| 63 | 63 | ||
| 64 | #define GC_SNES 1 | 64 | enum gc_type { |
| 65 | #define GC_NES 2 | 65 | GC_NONE = 0, |
| 66 | #define GC_NES4 3 | 66 | GC_SNES, |
| 67 | #define GC_MULTI 4 | 67 | GC_NES, |
| 68 | #define GC_MULTI2 5 | 68 | GC_NES4, |
| 69 | #define GC_N64 6 | 69 | GC_MULTI, |
| 70 | #define GC_PSX 7 | 70 | GC_MULTI2, |
| 71 | #define GC_DDR 8 | 71 | GC_N64, |
| 72 | #define GC_SNESMOUSE 9 | 72 | GC_PSX, |
| 73 | 73 | GC_DDR, | |
| 74 | #define GC_MAX 9 | 74 | GC_SNESMOUSE, |
| 75 | GC_MAX | ||
| 76 | }; | ||
| 75 | 77 | ||
| 76 | #define GC_REFRESH_TIME HZ/100 | 78 | #define GC_REFRESH_TIME HZ/100 |
| 77 | 79 | ||
| 80 | struct gc_pad { | ||
| 81 | struct input_dev *dev; | ||
| 82 | enum gc_type type; | ||
| 83 | char phys[32]; | ||
| 84 | }; | ||
| 85 | |||
| 78 | struct gc { | 86 | struct gc { |
| 79 | struct pardevice *pd; | 87 | struct pardevice *pd; |
| 88 | struct gc_pad pads[GC_MAX_DEVICES]; | ||
| 80 | struct input_dev *dev[GC_MAX_DEVICES]; | 89 | struct input_dev *dev[GC_MAX_DEVICES]; |
| 81 | struct timer_list timer; | 90 | struct timer_list timer; |
| 82 | unsigned char pads[GC_MAX + 1]; | 91 | int pad_count[GC_MAX]; |
| 83 | int used; | 92 | int used; |
| 84 | struct mutex mutex; | 93 | struct mutex mutex; |
| 85 | char phys[GC_MAX_DEVICES][32]; | ||
| 86 | }; | 94 | }; |
| 87 | 95 | ||
| 88 | struct gc_subdev { | 96 | struct gc_subdev { |
| @@ -218,13 +226,13 @@ static void gc_n64_process_packet(struct gc *gc) | |||
| 218 | 226 | ||
| 219 | for (i = 0; i < GC_MAX_DEVICES; i++) { | 227 | for (i = 0; i < GC_MAX_DEVICES; i++) { |
| 220 | 228 | ||
| 221 | dev = gc->dev[i]; | 229 | if (gc->pads[i].type != GC_N64) |
| 222 | if (!dev) | ||
| 223 | continue; | 230 | continue; |
| 224 | 231 | ||
| 232 | dev = gc->pads[i].dev; | ||
| 225 | s = gc_status_bit[i]; | 233 | s = gc_status_bit[i]; |
| 226 | 234 | ||
| 227 | if (s & gc->pads[GC_N64] & ~(data[8] | data[9])) { | 235 | if (s & ~(data[8] | data[9])) { |
| 228 | 236 | ||
| 229 | x = y = 0; | 237 | x = y = 0; |
| 230 | 238 | ||
| @@ -363,39 +371,47 @@ static void gc_nes_read_packet(struct gc *gc, int length, unsigned char *data) | |||
| 363 | static void gc_nes_process_packet(struct gc *gc) | 371 | static void gc_nes_process_packet(struct gc *gc) |
| 364 | { | 372 | { |
| 365 | unsigned char data[GC_SNESMOUSE_LENGTH]; | 373 | unsigned char data[GC_SNESMOUSE_LENGTH]; |
| 374 | struct gc_pad *pad; | ||
| 366 | struct input_dev *dev; | 375 | struct input_dev *dev; |
| 367 | int i, j, s, len; | 376 | int i, j, s, len; |
| 368 | char x_rel, y_rel; | 377 | char x_rel, y_rel; |
| 369 | 378 | ||
| 370 | len = gc->pads[GC_SNESMOUSE] ? GC_SNESMOUSE_LENGTH : | 379 | len = gc->pad_count[GC_SNESMOUSE] ? GC_SNESMOUSE_LENGTH : |
| 371 | (gc->pads[GC_SNES] ? GC_SNES_LENGTH : GC_NES_LENGTH); | 380 | (gc->pad_count[GC_SNES] ? GC_SNES_LENGTH : GC_NES_LENGTH); |
| 372 | 381 | ||
| 373 | gc_nes_read_packet(gc, len, data); | 382 | gc_nes_read_packet(gc, len, data); |
| 374 | 383 | ||
| 375 | for (i = 0; i < GC_MAX_DEVICES; i++) { | 384 | for (i = 0; i < GC_MAX_DEVICES; i++) { |
| 376 | 385 | ||
| 386 | pad = &gc->pads[i]; | ||
| 377 | dev = gc->dev[i]; | 387 | dev = gc->dev[i]; |
| 378 | if (!dev) | ||
| 379 | continue; | ||
| 380 | |||
| 381 | s = gc_status_bit[i]; | 388 | s = gc_status_bit[i]; |
| 382 | 389 | ||
| 383 | if (s & (gc->pads[GC_NES] | gc->pads[GC_SNES])) { | 390 | switch (pad->type) { |
| 391 | |||
| 392 | case GC_NES: | ||
| 393 | |||
| 384 | input_report_abs(dev, ABS_X, !(s & data[6]) - !(s & data[7])); | 394 | input_report_abs(dev, ABS_X, !(s & data[6]) - !(s & data[7])); |
| 385 | input_report_abs(dev, ABS_Y, !(s & data[4]) - !(s & data[5])); | 395 | input_report_abs(dev, ABS_Y, !(s & data[4]) - !(s & data[5])); |
| 386 | } | ||
| 387 | 396 | ||
| 388 | if (s & gc->pads[GC_NES]) | ||
| 389 | for (j = 0; j < 4; j++) | 397 | for (j = 0; j < 4; j++) |
| 390 | input_report_key(dev, gc_snes_btn[j], | 398 | input_report_key(dev, gc_snes_btn[j], |
| 391 | s & data[gc_nes_bytes[j]]); | 399 | s & data[gc_nes_bytes[j]]); |
| 400 | input_sync(dev); | ||
| 401 | break; | ||
| 402 | |||
| 403 | case GC_SNES: | ||
| 404 | |||
| 405 | input_report_abs(dev, ABS_X, !(s & data[6]) - !(s & data[7])); | ||
| 406 | input_report_abs(dev, ABS_Y, !(s & data[4]) - !(s & data[5])); | ||
| 392 | 407 | ||
| 393 | if (s & gc->pads[GC_SNES]) | ||
| 394 | for (j = 0; j < 8; j++) | 408 | for (j = 0; j < 8; j++) |
| 395 | input_report_key(dev, gc_snes_btn[j], | 409 | input_report_key(dev, gc_snes_btn[j], |
| 396 | s & data[gc_snes_bytes[j]]); | 410 | s & data[gc_snes_bytes[j]]); |
| 411 | input_sync(dev); | ||
| 412 | break; | ||
| 397 | 413 | ||
| 398 | if (s & gc->pads[GC_SNESMOUSE]) { | 414 | case GC_SNESMOUSE: |
| 399 | /* | 415 | /* |
| 400 | * The 4 unused bits from SNES controllers appear | 416 | * The 4 unused bits from SNES controllers appear |
| 401 | * to be ID bits so use them to make sure we are | 417 | * to be ID bits so use them to make sure we are |
| @@ -432,9 +448,14 @@ static void gc_nes_process_packet(struct gc *gc) | |||
| 432 | y_rel = -y_rel; | 448 | y_rel = -y_rel; |
| 433 | input_report_rel(dev, REL_Y, y_rel); | 449 | input_report_rel(dev, REL_Y, y_rel); |
| 434 | } | 450 | } |
| 451 | |||
| 452 | input_sync(dev); | ||
| 435 | } | 453 | } |
| 454 | break; | ||
| 455 | |||
| 456 | default: | ||
| 457 | break; | ||
| 436 | } | 458 | } |
| 437 | input_sync(dev); | ||
| 438 | } | 459 | } |
| 439 | } | 460 | } |
| 440 | 461 | ||
| @@ -462,32 +483,35 @@ static void gc_multi_read_packet(struct gc *gc, int length, unsigned char *data) | |||
| 462 | static void gc_multi_process_packet(struct gc *gc) | 483 | static void gc_multi_process_packet(struct gc *gc) |
| 463 | { | 484 | { |
| 464 | unsigned char data[GC_MULTI2_LENGTH]; | 485 | unsigned char data[GC_MULTI2_LENGTH]; |
| 465 | int data_len = gc->pads[GC_MULTI2] ? GC_MULTI2_LENGTH : GC_MULTI_LENGTH; | 486 | int data_len = gc->pad_count[GC_MULTI2] ? GC_MULTI2_LENGTH : GC_MULTI_LENGTH; |
| 487 | struct gc_pad *pad; | ||
| 466 | struct input_dev *dev; | 488 | struct input_dev *dev; |
| 467 | int i, s; | 489 | int i, s; |
| 468 | 490 | ||
| 469 | gc_multi_read_packet(gc, data_len, data); | 491 | gc_multi_read_packet(gc, data_len, data); |
| 470 | 492 | ||
| 471 | for (i = 0; i < GC_MAX_DEVICES; i++) { | 493 | for (i = 0; i < GC_MAX_DEVICES; i++) { |
| 472 | 494 | pad = &gc->pads[i]; | |
| 473 | dev = gc->dev[i]; | 495 | dev = pad->dev; |
| 474 | if (!dev) | ||
| 475 | continue; | ||
| 476 | |||
| 477 | s = gc_status_bit[i]; | 496 | s = gc_status_bit[i]; |
| 478 | 497 | ||
| 479 | if (s & (gc->pads[GC_MULTI] | gc->pads[GC_MULTI2])) { | 498 | switch (pad->type) { |
| 499 | case GC_MULTI2: | ||
| 500 | input_report_key(dev, BTN_THUMB, s & data[5]); | ||
| 501 | /* fall through */ | ||
| 502 | |||
| 503 | case GC_MULTI: | ||
| 480 | input_report_abs(dev, ABS_X, | 504 | input_report_abs(dev, ABS_X, |
| 481 | !(s & data[2]) - !(s & data[3])); | 505 | !(s & data[2]) - !(s & data[3])); |
| 482 | input_report_abs(dev, ABS_Y, | 506 | input_report_abs(dev, ABS_Y, |
| 483 | !(s & data[0]) - !(s & data[1])); | 507 | !(s & data[0]) - !(s & data[1])); |
| 484 | input_report_key(dev, BTN_TRIGGER, s & data[4]); | 508 | input_report_key(dev, BTN_TRIGGER, s & data[4]); |
| 485 | } | 509 | input_sync(dev); |
| 486 | 510 | break; | |
| 487 | if (s & gc->pads[GC_MULTI2]) | ||
| 488 | input_report_key(dev, BTN_THUMB, s & data[5]); | ||
| 489 | 511 | ||
| 490 | input_sync(dev); | 512 | default: |
| 513 | break; | ||
| 514 | } | ||
| 491 | } | 515 | } |
| 492 | } | 516 | } |
| 493 | 517 | ||
| @@ -548,9 +572,16 @@ static void gc_psx_command(struct gc *gc, int b, unsigned char *data) | |||
| 548 | cmd = (b & 1) ? GC_PSX_COMMAND : 0; | 572 | cmd = (b & 1) ? GC_PSX_COMMAND : 0; |
| 549 | parport_write_data(port, cmd | GC_PSX_POWER); | 573 | parport_write_data(port, cmd | GC_PSX_POWER); |
| 550 | udelay(gc_psx_delay); | 574 | udelay(gc_psx_delay); |
| 575 | |||
| 551 | read = parport_read_status(port) ^ 0x80; | 576 | read = parport_read_status(port) ^ 0x80; |
| 552 | for (j = 0; j < GC_MAX_DEVICES; j++) | 577 | |
| 553 | data[j] |= (read & gc_status_bit[j] & (gc->pads[GC_PSX] | gc->pads[GC_DDR])) ? (1 << i) : 0; | 578 | for (j = 0; j < GC_MAX_DEVICES; j++) { |
| 579 | struct gc_pad *pad = &gc->pads[i]; | ||
| 580 | |||
| 581 | if (pad->type == GC_PSX || pad->type == GC_DDR) | ||
| 582 | data[j] |= (read & gc_status_bit[j]) ? (1 << i) : 0; | ||
| 583 | } | ||
| 584 | |||
| 554 | parport_write_data(gc->pd->port, cmd | GC_PSX_CLOCK | GC_PSX_POWER); | 585 | parport_write_data(gc->pd->port, cmd | GC_PSX_CLOCK | GC_PSX_POWER); |
| 555 | udelay(gc_psx_delay); | 586 | udelay(gc_psx_delay); |
| 556 | } | 587 | } |
| @@ -561,7 +592,8 @@ static void gc_psx_command(struct gc *gc, int b, unsigned char *data) | |||
| 561 | * device identifier code. | 592 | * device identifier code. |
| 562 | */ | 593 | */ |
| 563 | 594 | ||
| 564 | static void gc_psx_read_packet(struct gc *gc, unsigned char data[GC_MAX_DEVICES][GC_PSX_BYTES], | 595 | static void gc_psx_read_packet(struct gc *gc, |
| 596 | unsigned char data[GC_MAX_DEVICES][GC_PSX_BYTES], | ||
| 565 | unsigned char id[GC_MAX_DEVICES]) | 597 | unsigned char id[GC_MAX_DEVICES]) |
| 566 | { | 598 | { |
| 567 | int i, j, max_len = 0; | 599 | int i, j, max_len = 0; |
| @@ -582,12 +614,15 @@ static void gc_psx_read_packet(struct gc *gc, unsigned char data[GC_MAX_DEVICES] | |||
| 582 | gc_psx_command(gc, 0, data2); /* Dump status */ | 614 | gc_psx_command(gc, 0, data2); /* Dump status */ |
| 583 | 615 | ||
| 584 | /* Find the longest pad */ | 616 | /* Find the longest pad */ |
| 585 | for (i = 0; i < GC_MAX_DEVICES; i++) | 617 | for (i = 0; i < GC_MAX_DEVICES; i++) { |
| 586 | if ((gc_status_bit[i] & (gc->pads[GC_PSX] | gc->pads[GC_DDR])) && | 618 | struct gc_pad *pad = &gc->pads[i]; |
| 619 | |||
| 620 | if ((pad->type == GC_PSX || pad->type == GC_DDR) && | ||
| 587 | GC_PSX_LEN(id[i]) > max_len && | 621 | GC_PSX_LEN(id[i]) > max_len && |
| 588 | GC_PSX_LEN(id[i]) <= GC_PSX_BYTES) { | 622 | GC_PSX_LEN(id[i]) <= GC_PSX_BYTES) { |
| 589 | max_len = GC_PSX_LEN(id[i]); | 623 | max_len = GC_PSX_LEN(id[i]); |
| 590 | } | 624 | } |
| 625 | } | ||
| 591 | 626 | ||
| 592 | /* Read in all the data */ | 627 | /* Read in all the data */ |
| 593 | for (i = 0; i < max_len; i++) { | 628 | for (i = 0; i < max_len; i++) { |
| @@ -605,13 +640,13 @@ static void gc_psx_read_packet(struct gc *gc, unsigned char data[GC_MAX_DEVICES] | |||
| 605 | id[i] = GC_PSX_ID(id[i]); | 640 | id[i] = GC_PSX_ID(id[i]); |
| 606 | } | 641 | } |
| 607 | 642 | ||
| 608 | static void gc_psx_report_one(struct gc *gc, struct input_dev *dev, | 643 | static void gc_psx_report_one(struct gc_pad *pad, unsigned char psx_type, |
| 609 | unsigned char pad_type, unsigned char status_bit, | ||
| 610 | unsigned char *data) | 644 | unsigned char *data) |
| 611 | { | 645 | { |
| 646 | struct input_dev *dev = pad->dev; | ||
| 612 | int i; | 647 | int i; |
| 613 | 648 | ||
| 614 | switch (pad_type) { | 649 | switch (psx_type) { |
| 615 | 650 | ||
| 616 | case GC_PSX_RUMBLE: | 651 | case GC_PSX_RUMBLE: |
| 617 | 652 | ||
| @@ -621,7 +656,7 @@ static void gc_psx_report_one(struct gc *gc, struct input_dev *dev, | |||
| 621 | case GC_PSX_NEGCON: | 656 | case GC_PSX_NEGCON: |
| 622 | case GC_PSX_ANALOG: | 657 | case GC_PSX_ANALOG: |
| 623 | 658 | ||
| 624 | if (gc->pads[GC_DDR] & status_bit) { | 659 | if (pad->type == GC_DDR) { |
| 625 | for (i = 0; i < 4; i++) | 660 | for (i = 0; i < 4; i++) |
| 626 | input_report_key(dev, gc_psx_ddr_btn[i], | 661 | input_report_key(dev, gc_psx_ddr_btn[i], |
| 627 | ~data[0] & (0x10 << i)); | 662 | ~data[0] & (0x10 << i)); |
| @@ -647,7 +682,8 @@ static void gc_psx_report_one(struct gc *gc, struct input_dev *dev, | |||
| 647 | break; | 682 | break; |
| 648 | 683 | ||
| 649 | case GC_PSX_NORMAL: | 684 | case GC_PSX_NORMAL: |
| 650 | if (gc->pads[GC_DDR] & status_bit) { | 685 | |
| 686 | if (pad->type == GC_DDR) { | ||
| 651 | for (i = 0; i < 4; i++) | 687 | for (i = 0; i < 4; i++) |
| 652 | input_report_key(dev, gc_psx_ddr_btn[i], | 688 | input_report_key(dev, gc_psx_ddr_btn[i], |
| 653 | ~data[0] & (0x10 << i)); | 689 | ~data[0] & (0x10 << i)); |
| @@ -679,7 +715,7 @@ static void gc_psx_report_one(struct gc *gc, struct input_dev *dev, | |||
| 679 | 715 | ||
| 680 | break; | 716 | break; |
| 681 | 717 | ||
| 682 | case 0: /* not a pad, ignore */ | 718 | default: /* not a pad, ignore */ |
| 683 | break; | 719 | break; |
| 684 | } | 720 | } |
| 685 | } | 721 | } |
| @@ -688,15 +724,15 @@ static void gc_psx_process_packet(struct gc *gc) | |||
| 688 | { | 724 | { |
| 689 | unsigned char data[GC_MAX_DEVICES][GC_PSX_BYTES]; | 725 | unsigned char data[GC_MAX_DEVICES][GC_PSX_BYTES]; |
| 690 | unsigned char id[GC_MAX_DEVICES]; | 726 | unsigned char id[GC_MAX_DEVICES]; |
| 727 | struct gc_pad *pad; | ||
| 691 | int i; | 728 | int i; |
| 692 | 729 | ||
| 693 | gc_psx_read_packet(gc, data, id); | 730 | gc_psx_read_packet(gc, data, id); |
| 694 | 731 | ||
| 695 | for (i = 0; i < GC_MAX_DEVICES; i++) { | 732 | for (i = 0; i < GC_MAX_DEVICES; i++) { |
| 696 | 733 | pad = &gc->pads[i]; | |
| 697 | if (gc->dev[i]) | 734 | if (pad->type == GC_PSX || pad->type == GC_DDR) |
| 698 | gc_psx_report_one(gc, gc->dev[i], | 735 | gc_psx_report_one(pad, id[i], data[i]); |
| 699 | id[i], gc_status_bit[i], data[i]); | ||
| 700 | } | 736 | } |
| 701 | } | 737 | } |
| 702 | 738 | ||
| @@ -712,28 +748,31 @@ static void gc_timer(unsigned long private) | |||
| 712 | * N64 pads - must be read first, any read confuses them for 200 us | 748 | * N64 pads - must be read first, any read confuses them for 200 us |
| 713 | */ | 749 | */ |
| 714 | 750 | ||
| 715 | if (gc->pads[GC_N64]) | 751 | if (gc->pad_count[GC_N64]) |
| 716 | gc_n64_process_packet(gc); | 752 | gc_n64_process_packet(gc); |
| 717 | 753 | ||
| 718 | /* | 754 | /* |
| 719 | * NES and SNES pads or mouse | 755 | * NES and SNES pads or mouse |
| 720 | */ | 756 | */ |
| 721 | 757 | ||
| 722 | if (gc->pads[GC_NES] || gc->pads[GC_SNES] || gc->pads[GC_SNESMOUSE]) | 758 | if (gc->pad_count[GC_NES] || |
| 759 | gc->pad_count[GC_SNES] || | ||
| 760 | gc->pad_count[GC_SNESMOUSE]) { | ||
| 723 | gc_nes_process_packet(gc); | 761 | gc_nes_process_packet(gc); |
| 762 | } | ||
| 724 | 763 | ||
| 725 | /* | 764 | /* |
| 726 | * Multi and Multi2 joysticks | 765 | * Multi and Multi2 joysticks |
| 727 | */ | 766 | */ |
| 728 | 767 | ||
| 729 | if (gc->pads[GC_MULTI] || gc->pads[GC_MULTI2]) | 768 | if (gc->pad_count[GC_MULTI] || gc->pad_count[GC_MULTI2]) |
| 730 | gc_multi_process_packet(gc); | 769 | gc_multi_process_packet(gc); |
| 731 | 770 | ||
| 732 | /* | 771 | /* |
| 733 | * PSX controllers | 772 | * PSX controllers |
| 734 | */ | 773 | */ |
| 735 | 774 | ||
| 736 | if (gc->pads[GC_PSX] || gc->pads[GC_DDR]) | 775 | if (gc->pad_count[GC_PSX] || gc->pad_count[GC_DDR]) |
| 737 | gc_psx_process_packet(gc); | 776 | gc_psx_process_packet(gc); |
| 738 | 777 | ||
| 739 | mod_timer(&gc->timer, jiffies + GC_REFRESH_TIME); | 778 | mod_timer(&gc->timer, jiffies + GC_REFRESH_TIME); |
| @@ -773,26 +812,29 @@ static void gc_close(struct input_dev *dev) | |||
| 773 | 812 | ||
| 774 | static int __init gc_setup_pad(struct gc *gc, int idx, int pad_type) | 813 | static int __init gc_setup_pad(struct gc *gc, int idx, int pad_type) |
| 775 | { | 814 | { |
| 815 | struct gc_pad *pad = &gc->pads[idx]; | ||
| 776 | struct input_dev *input_dev; | 816 | struct input_dev *input_dev; |
| 777 | int i; | 817 | int i; |
| 778 | int err; | 818 | int err; |
| 779 | 819 | ||
| 780 | if (!pad_type) | ||
| 781 | return 0; | ||
| 782 | |||
| 783 | if (pad_type < 1 || pad_type > GC_MAX) { | 820 | if (pad_type < 1 || pad_type > GC_MAX) { |
| 784 | printk(KERN_WARNING "gamecon.c: Pad type %d unknown\n", pad_type); | 821 | printk(KERN_WARNING "gamecon.c: Pad type %d unknown\n", pad_type); |
| 785 | return -EINVAL; | 822 | return -EINVAL; |
| 786 | } | 823 | } |
| 787 | 824 | ||
| 788 | gc->dev[idx] = input_dev = input_allocate_device(); | 825 | pad->dev = input_dev = input_allocate_device(); |
| 789 | if (!input_dev) { | 826 | if (!input_dev) { |
| 790 | printk(KERN_ERR "gamecon.c: Not enough memory for input device\n"); | 827 | printk(KERN_ERR "gamecon.c: Not enough memory for input device\n"); |
| 791 | return -ENOMEM; | 828 | return -ENOMEM; |
| 792 | } | 829 | } |
| 793 | 830 | ||
| 831 | pad->type = pad_type; | ||
| 832 | |||
| 833 | snprintf(pad->phys, sizeof(pad->phys), | ||
| 834 | "%s/input%d", gc->pd->port->name, idx); | ||
| 835 | |||
| 794 | input_dev->name = gc_names[pad_type]; | 836 | input_dev->name = gc_names[pad_type]; |
| 795 | input_dev->phys = gc->phys[idx]; | 837 | input_dev->phys = pad->phys; |
| 796 | input_dev->id.bustype = BUS_PARPORT; | 838 | input_dev->id.bustype = BUS_PARPORT; |
| 797 | input_dev->id.vendor = 0x0001; | 839 | input_dev->id.vendor = 0x0001; |
| 798 | input_dev->id.product = pad_type; | 840 | input_dev->id.product = pad_type; |
| @@ -811,8 +853,7 @@ static int __init gc_setup_pad(struct gc *gc, int idx, int pad_type) | |||
| 811 | } else | 853 | } else |
| 812 | input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); | 854 | input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); |
| 813 | 855 | ||
| 814 | gc->pads[0] |= gc_status_bit[idx]; | 856 | gc->pad_count[pad_type]++; |
| 815 | gc->pads[pad_type] |= gc_status_bit[idx]; | ||
| 816 | 857 | ||
| 817 | switch (pad_type) { | 858 | switch (pad_type) { |
| 818 | 859 | ||
| @@ -828,8 +869,7 @@ static int __init gc_setup_pad(struct gc *gc, int idx, int pad_type) | |||
| 828 | err = gc_n64_init_ff(input_dev, idx); | 869 | err = gc_n64_init_ff(input_dev, idx); |
| 829 | if (err) { | 870 | if (err) { |
| 830 | printk(KERN_WARNING "gamecon.c: Failed to initiate rumble for N64 device %d\n", idx); | 871 | printk(KERN_WARNING "gamecon.c: Failed to initiate rumble for N64 device %d\n", idx); |
| 831 | input_free_device(input_dev); | 872 | goto err_free_dev; |
| 832 | return err; | ||
| 833 | } | 873 | } |
| 834 | 874 | ||
| 835 | break; | 875 | break; |
| @@ -873,7 +913,16 @@ static int __init gc_setup_pad(struct gc *gc, int idx, int pad_type) | |||
| 873 | break; | 913 | break; |
| 874 | } | 914 | } |
| 875 | 915 | ||
| 916 | err = input_register_device(pad->dev); | ||
| 917 | if (err) | ||
| 918 | goto err_free_dev; | ||
| 919 | |||
| 876 | return 0; | 920 | return 0; |
| 921 | |||
| 922 | err_free_dev: | ||
| 923 | input_free_device(pad->dev); | ||
| 924 | pad->dev = NULL; | ||
| 925 | return err; | ||
| 877 | } | 926 | } |
| 878 | 927 | ||
| 879 | static struct gc __init *gc_probe(int parport, int *pads, int n_pads) | 928 | static struct gc __init *gc_probe(int parport, int *pads, int n_pads) |
| @@ -882,6 +931,7 @@ static struct gc __init *gc_probe(int parport, int *pads, int n_pads) | |||
| 882 | struct parport *pp; | 931 | struct parport *pp; |
| 883 | struct pardevice *pd; | 932 | struct pardevice *pd; |
| 884 | int i; | 933 | int i; |
| 934 | int count = 0; | ||
| 885 | int err; | 935 | int err; |
| 886 | 936 | ||
| 887 | pp = parport_find_number(parport); | 937 | pp = parport_find_number(parport); |
| @@ -913,18 +963,14 @@ static struct gc __init *gc_probe(int parport, int *pads, int n_pads) | |||
| 913 | if (!pads[i]) | 963 | if (!pads[i]) |
| 914 | continue; | 964 | continue; |
| 915 | 965 | ||
| 916 | snprintf(gc->phys[i], sizeof(gc->phys[i]), | ||
| 917 | "%s/input%d", gc->pd->port->name, i); | ||
| 918 | err = gc_setup_pad(gc, i, pads[i]); | 966 | err = gc_setup_pad(gc, i, pads[i]); |
| 919 | if (err) | 967 | if (err) |
| 920 | goto err_unreg_devs; | 968 | goto err_unreg_devs; |
| 921 | 969 | ||
| 922 | err = input_register_device(gc->dev[i]); | 970 | count++; |
| 923 | if (err) | ||
| 924 | goto err_free_dev; | ||
| 925 | } | 971 | } |
| 926 | 972 | ||
| 927 | if (!gc->pads[0]) { | 973 | if (count == 0) { |
| 928 | printk(KERN_ERR "gamecon.c: No valid devices specified\n"); | 974 | printk(KERN_ERR "gamecon.c: No valid devices specified\n"); |
| 929 | err = -EINVAL; | 975 | err = -EINVAL; |
| 930 | goto err_free_gc; | 976 | goto err_free_gc; |
| @@ -933,12 +979,10 @@ static struct gc __init *gc_probe(int parport, int *pads, int n_pads) | |||
| 933 | parport_put_port(pp); | 979 | parport_put_port(pp); |
| 934 | return gc; | 980 | return gc; |
| 935 | 981 | ||
| 936 | err_free_dev: | ||
| 937 | input_free_device(gc->dev[i]); | ||
| 938 | err_unreg_devs: | 982 | err_unreg_devs: |
| 939 | while (--i >= 0) | 983 | while (--i >= 0) |
| 940 | if (gc->dev[i]) | 984 | if (gc->pads[i].dev) |
| 941 | input_unregister_device(gc->dev[i]); | 985 | input_unregister_device(gc->pads[i].dev); |
| 942 | err_free_gc: | 986 | err_free_gc: |
| 943 | kfree(gc); | 987 | kfree(gc); |
| 944 | err_unreg_pardev: | 988 | err_unreg_pardev: |
| @@ -954,8 +998,8 @@ static void gc_remove(struct gc *gc) | |||
| 954 | int i; | 998 | int i; |
| 955 | 999 | ||
| 956 | for (i = 0; i < GC_MAX_DEVICES; i++) | 1000 | for (i = 0; i < GC_MAX_DEVICES; i++) |
| 957 | if (gc->dev[i]) | 1001 | if (gc->pads[i].dev) |
| 958 | input_unregister_device(gc->dev[i]); | 1002 | input_unregister_device(gc->pads[i].dev); |
| 959 | parport_unregister_device(gc->pd); | 1003 | parport_unregister_device(gc->pd); |
| 960 | kfree(gc); | 1004 | kfree(gc); |
| 961 | } | 1005 | } |
