diff options
Diffstat (limited to 'drivers/macintosh/adbhid.c')
-rw-r--r-- | drivers/macintosh/adbhid.c | 222 |
1 files changed, 116 insertions, 106 deletions
diff --git a/drivers/macintosh/adbhid.c b/drivers/macintosh/adbhid.c index db654e8bd67e..cdb6d0283195 100644 --- a/drivers/macintosh/adbhid.c +++ b/drivers/macintosh/adbhid.c | |||
@@ -206,7 +206,7 @@ u8 adb_to_linux_keycodes[128] = { | |||
206 | }; | 206 | }; |
207 | 207 | ||
208 | struct adbhid { | 208 | struct adbhid { |
209 | struct input_dev input; | 209 | struct input_dev *input; |
210 | int id; | 210 | int id; |
211 | int default_id; | 211 | int default_id; |
212 | int original_handler_id; | 212 | int original_handler_id; |
@@ -291,10 +291,10 @@ adbhid_input_keycode(int id, int keycode, int repeat, struct pt_regs *regs) | |||
291 | 291 | ||
292 | switch (keycode) { | 292 | switch (keycode) { |
293 | case ADB_KEY_CAPSLOCK: /* Generate down/up events for CapsLock everytime. */ | 293 | case ADB_KEY_CAPSLOCK: /* Generate down/up events for CapsLock everytime. */ |
294 | input_regs(&ahid->input, regs); | 294 | input_regs(ahid->input, regs); |
295 | input_report_key(&ahid->input, KEY_CAPSLOCK, 1); | 295 | input_report_key(ahid->input, KEY_CAPSLOCK, 1); |
296 | input_report_key(&ahid->input, KEY_CAPSLOCK, 0); | 296 | input_report_key(ahid->input, KEY_CAPSLOCK, 0); |
297 | input_sync(&ahid->input); | 297 | input_sync(ahid->input); |
298 | return; | 298 | return; |
299 | #ifdef CONFIG_PPC_PMAC | 299 | #ifdef CONFIG_PPC_PMAC |
300 | case ADB_KEY_POWER_OLD: /* Power key on PBook 3400 needs remapping */ | 300 | case ADB_KEY_POWER_OLD: /* Power key on PBook 3400 needs remapping */ |
@@ -347,10 +347,10 @@ adbhid_input_keycode(int id, int keycode, int repeat, struct pt_regs *regs) | |||
347 | } | 347 | } |
348 | 348 | ||
349 | if (adbhid[id]->keycode[keycode]) { | 349 | if (adbhid[id]->keycode[keycode]) { |
350 | input_regs(&adbhid[id]->input, regs); | 350 | input_regs(adbhid[id]->input, regs); |
351 | input_report_key(&adbhid[id]->input, | 351 | input_report_key(adbhid[id]->input, |
352 | adbhid[id]->keycode[keycode], !up_flag); | 352 | adbhid[id]->keycode[keycode], !up_flag); |
353 | input_sync(&adbhid[id]->input); | 353 | input_sync(adbhid[id]->input); |
354 | } else | 354 | } else |
355 | printk(KERN_INFO "Unhandled ADB key (scancode %#02x) %s.\n", keycode, | 355 | printk(KERN_INFO "Unhandled ADB key (scancode %#02x) %s.\n", keycode, |
356 | up_flag ? "released" : "pressed"); | 356 | up_flag ? "released" : "pressed"); |
@@ -441,20 +441,20 @@ adbhid_mouse_input(unsigned char *data, int nb, struct pt_regs *regs, int autopo | |||
441 | break; | 441 | break; |
442 | } | 442 | } |
443 | 443 | ||
444 | input_regs(&adbhid[id]->input, regs); | 444 | input_regs(adbhid[id]->input, regs); |
445 | 445 | ||
446 | input_report_key(&adbhid[id]->input, BTN_LEFT, !((data[1] >> 7) & 1)); | 446 | input_report_key(adbhid[id]->input, BTN_LEFT, !((data[1] >> 7) & 1)); |
447 | input_report_key(&adbhid[id]->input, BTN_MIDDLE, !((data[2] >> 7) & 1)); | 447 | input_report_key(adbhid[id]->input, BTN_MIDDLE, !((data[2] >> 7) & 1)); |
448 | 448 | ||
449 | if (nb >= 4 && adbhid[id]->mouse_kind != ADBMOUSE_TRACKPAD) | 449 | if (nb >= 4 && adbhid[id]->mouse_kind != ADBMOUSE_TRACKPAD) |
450 | input_report_key(&adbhid[id]->input, BTN_RIGHT, !((data[3] >> 7) & 1)); | 450 | input_report_key(adbhid[id]->input, BTN_RIGHT, !((data[3] >> 7) & 1)); |
451 | 451 | ||
452 | input_report_rel(&adbhid[id]->input, REL_X, | 452 | input_report_rel(adbhid[id]->input, REL_X, |
453 | ((data[2]&0x7f) < 64 ? (data[2]&0x7f) : (data[2]&0x7f)-128 )); | 453 | ((data[2]&0x7f) < 64 ? (data[2]&0x7f) : (data[2]&0x7f)-128 )); |
454 | input_report_rel(&adbhid[id]->input, REL_Y, | 454 | input_report_rel(adbhid[id]->input, REL_Y, |
455 | ((data[1]&0x7f) < 64 ? (data[1]&0x7f) : (data[1]&0x7f)-128 )); | 455 | ((data[1]&0x7f) < 64 ? (data[1]&0x7f) : (data[1]&0x7f)-128 )); |
456 | 456 | ||
457 | input_sync(&adbhid[id]->input); | 457 | input_sync(adbhid[id]->input); |
458 | } | 458 | } |
459 | 459 | ||
460 | static void | 460 | static void |
@@ -467,7 +467,7 @@ adbhid_buttons_input(unsigned char *data, int nb, struct pt_regs *regs, int auto | |||
467 | return; | 467 | return; |
468 | } | 468 | } |
469 | 469 | ||
470 | input_regs(&adbhid[id]->input, regs); | 470 | input_regs(adbhid[id]->input, regs); |
471 | 471 | ||
472 | switch (adbhid[id]->original_handler_id) { | 472 | switch (adbhid[id]->original_handler_id) { |
473 | default: | 473 | default: |
@@ -477,19 +477,19 @@ adbhid_buttons_input(unsigned char *data, int nb, struct pt_regs *regs, int auto | |||
477 | 477 | ||
478 | switch (data[1] & 0x0f) { | 478 | switch (data[1] & 0x0f) { |
479 | case 0x0: /* microphone */ | 479 | case 0x0: /* microphone */ |
480 | input_report_key(&adbhid[id]->input, KEY_SOUND, down); | 480 | input_report_key(adbhid[id]->input, KEY_SOUND, down); |
481 | break; | 481 | break; |
482 | 482 | ||
483 | case 0x1: /* mute */ | 483 | case 0x1: /* mute */ |
484 | input_report_key(&adbhid[id]->input, KEY_MUTE, down); | 484 | input_report_key(adbhid[id]->input, KEY_MUTE, down); |
485 | break; | 485 | break; |
486 | 486 | ||
487 | case 0x2: /* volume decrease */ | 487 | case 0x2: /* volume decrease */ |
488 | input_report_key(&adbhid[id]->input, KEY_VOLUMEDOWN, down); | 488 | input_report_key(adbhid[id]->input, KEY_VOLUMEDOWN, down); |
489 | break; | 489 | break; |
490 | 490 | ||
491 | case 0x3: /* volume increase */ | 491 | case 0x3: /* volume increase */ |
492 | input_report_key(&adbhid[id]->input, KEY_VOLUMEUP, down); | 492 | input_report_key(adbhid[id]->input, KEY_VOLUMEUP, down); |
493 | break; | 493 | break; |
494 | 494 | ||
495 | default: | 495 | default: |
@@ -513,19 +513,19 @@ adbhid_buttons_input(unsigned char *data, int nb, struct pt_regs *regs, int auto | |||
513 | 513 | ||
514 | switch (data[1] & 0x0f) { | 514 | switch (data[1] & 0x0f) { |
515 | case 0x8: /* mute */ | 515 | case 0x8: /* mute */ |
516 | input_report_key(&adbhid[id]->input, KEY_MUTE, down); | 516 | input_report_key(adbhid[id]->input, KEY_MUTE, down); |
517 | break; | 517 | break; |
518 | 518 | ||
519 | case 0x7: /* volume decrease */ | 519 | case 0x7: /* volume decrease */ |
520 | input_report_key(&adbhid[id]->input, KEY_VOLUMEDOWN, down); | 520 | input_report_key(adbhid[id]->input, KEY_VOLUMEDOWN, down); |
521 | break; | 521 | break; |
522 | 522 | ||
523 | case 0x6: /* volume increase */ | 523 | case 0x6: /* volume increase */ |
524 | input_report_key(&adbhid[id]->input, KEY_VOLUMEUP, down); | 524 | input_report_key(adbhid[id]->input, KEY_VOLUMEUP, down); |
525 | break; | 525 | break; |
526 | 526 | ||
527 | case 0xb: /* eject */ | 527 | case 0xb: /* eject */ |
528 | input_report_key(&adbhid[id]->input, KEY_EJECTCD, down); | 528 | input_report_key(adbhid[id]->input, KEY_EJECTCD, down); |
529 | break; | 529 | break; |
530 | 530 | ||
531 | case 0xa: /* brightness decrease */ | 531 | case 0xa: /* brightness decrease */ |
@@ -539,7 +539,7 @@ adbhid_buttons_input(unsigned char *data, int nb, struct pt_regs *regs, int auto | |||
539 | } | 539 | } |
540 | } | 540 | } |
541 | #endif /* CONFIG_PMAC_BACKLIGHT */ | 541 | #endif /* CONFIG_PMAC_BACKLIGHT */ |
542 | input_report_key(&adbhid[id]->input, KEY_BRIGHTNESSDOWN, down); | 542 | input_report_key(adbhid[id]->input, KEY_BRIGHTNESSDOWN, down); |
543 | break; | 543 | break; |
544 | 544 | ||
545 | case 0x9: /* brightness increase */ | 545 | case 0x9: /* brightness increase */ |
@@ -553,19 +553,19 @@ adbhid_buttons_input(unsigned char *data, int nb, struct pt_regs *regs, int auto | |||
553 | } | 553 | } |
554 | } | 554 | } |
555 | #endif /* CONFIG_PMAC_BACKLIGHT */ | 555 | #endif /* CONFIG_PMAC_BACKLIGHT */ |
556 | input_report_key(&adbhid[id]->input, KEY_BRIGHTNESSUP, down); | 556 | input_report_key(adbhid[id]->input, KEY_BRIGHTNESSUP, down); |
557 | break; | 557 | break; |
558 | 558 | ||
559 | case 0xc: /* videomode switch */ | 559 | case 0xc: /* videomode switch */ |
560 | input_report_key(&adbhid[id]->input, KEY_SWITCHVIDEOMODE, down); | 560 | input_report_key(adbhid[id]->input, KEY_SWITCHVIDEOMODE, down); |
561 | break; | 561 | break; |
562 | 562 | ||
563 | case 0xd: /* keyboard illumination toggle */ | 563 | case 0xd: /* keyboard illumination toggle */ |
564 | input_report_key(&adbhid[id]->input, KEY_KBDILLUMTOGGLE, down); | 564 | input_report_key(adbhid[id]->input, KEY_KBDILLUMTOGGLE, down); |
565 | break; | 565 | break; |
566 | 566 | ||
567 | case 0xe: /* keyboard illumination decrease */ | 567 | case 0xe: /* keyboard illumination decrease */ |
568 | input_report_key(&adbhid[id]->input, KEY_KBDILLUMDOWN, down); | 568 | input_report_key(adbhid[id]->input, KEY_KBDILLUMDOWN, down); |
569 | break; | 569 | break; |
570 | 570 | ||
571 | case 0xf: | 571 | case 0xf: |
@@ -573,7 +573,7 @@ adbhid_buttons_input(unsigned char *data, int nb, struct pt_regs *regs, int auto | |||
573 | case 0x8f: | 573 | case 0x8f: |
574 | case 0x0f: | 574 | case 0x0f: |
575 | /* keyboard illumination increase */ | 575 | /* keyboard illumination increase */ |
576 | input_report_key(&adbhid[id]->input, KEY_KBDILLUMUP, down); | 576 | input_report_key(adbhid[id]->input, KEY_KBDILLUMUP, down); |
577 | break; | 577 | break; |
578 | 578 | ||
579 | case 0x7f: | 579 | case 0x7f: |
@@ -596,7 +596,7 @@ adbhid_buttons_input(unsigned char *data, int nb, struct pt_regs *regs, int auto | |||
596 | break; | 596 | break; |
597 | } | 597 | } |
598 | 598 | ||
599 | input_sync(&adbhid[id]->input); | 599 | input_sync(adbhid[id]->input); |
600 | } | 600 | } |
601 | 601 | ||
602 | static struct adb_request led_request; | 602 | static struct adb_request led_request; |
@@ -683,7 +683,7 @@ adb_message_handler(struct notifier_block *this, unsigned long code, void *x) | |||
683 | int i; | 683 | int i; |
684 | for (i = 1; i < 16; i++) { | 684 | for (i = 1; i < 16; i++) { |
685 | if (adbhid[i]) | 685 | if (adbhid[i]) |
686 | del_timer_sync(&adbhid[i]->input.timer); | 686 | del_timer_sync(&adbhid[i]->input->timer); |
687 | } | 687 | } |
688 | } | 688 | } |
689 | 689 | ||
@@ -699,153 +699,163 @@ adb_message_handler(struct notifier_block *this, unsigned long code, void *x) | |||
699 | return NOTIFY_DONE; | 699 | return NOTIFY_DONE; |
700 | } | 700 | } |
701 | 701 | ||
702 | static void | 702 | static int |
703 | adbhid_input_register(int id, int default_id, int original_handler_id, | 703 | adbhid_input_register(int id, int default_id, int original_handler_id, |
704 | int current_handler_id, int mouse_kind) | 704 | int current_handler_id, int mouse_kind) |
705 | { | 705 | { |
706 | struct adbhid *hid; | ||
707 | struct input_dev *input_dev; | ||
708 | int err; | ||
706 | int i; | 709 | int i; |
707 | 710 | ||
708 | if (adbhid[id]) { | 711 | if (adbhid[id]) { |
709 | printk(KERN_ERR "Trying to reregister ADB HID on ID %d\n", id); | 712 | printk(KERN_ERR "Trying to reregister ADB HID on ID %d\n", id); |
710 | return; | 713 | return -EEXIST; |
711 | } | 714 | } |
712 | 715 | ||
713 | if (!(adbhid[id] = kmalloc(sizeof(struct adbhid), GFP_KERNEL))) | 716 | adbhid[id] = hid = kzalloc(sizeof(struct adbhid), GFP_KERNEL); |
714 | return; | 717 | input_dev = input_allocate_device(); |
715 | 718 | if (!hid || !input_dev) { | |
716 | memset(adbhid[id], 0, sizeof(struct adbhid)); | 719 | err = -ENOMEM; |
717 | sprintf(adbhid[id]->phys, "adb%d:%d.%02x/input", id, default_id, original_handler_id); | 720 | goto fail; |
718 | 721 | ||
719 | init_input_dev(&adbhid[id]->input); | 722 | } |
720 | 723 | ||
721 | adbhid[id]->id = default_id; | 724 | sprintf(hid->phys, "adb%d:%d.%02x/input", id, default_id, original_handler_id); |
722 | adbhid[id]->original_handler_id = original_handler_id; | 725 | |
723 | adbhid[id]->current_handler_id = current_handler_id; | 726 | hid->id = default_id; |
724 | adbhid[id]->mouse_kind = mouse_kind; | 727 | hid->original_handler_id = original_handler_id; |
725 | adbhid[id]->flags = 0; | 728 | hid->current_handler_id = current_handler_id; |
726 | adbhid[id]->input.private = adbhid[id]; | 729 | hid->mouse_kind = mouse_kind; |
727 | adbhid[id]->input.name = adbhid[id]->name; | 730 | hid->flags = 0; |
728 | adbhid[id]->input.phys = adbhid[id]->phys; | 731 | input_dev->private = hid; |
729 | adbhid[id]->input.id.bustype = BUS_ADB; | 732 | input_dev->name = hid->name; |
730 | adbhid[id]->input.id.vendor = 0x0001; | 733 | input_dev->phys = hid->phys; |
731 | adbhid[id]->input.id.product = (id << 12) | (default_id << 8) | original_handler_id; | 734 | input_dev->id.bustype = BUS_ADB; |
732 | adbhid[id]->input.id.version = 0x0100; | 735 | input_dev->id.vendor = 0x0001; |
736 | input_dev->id.product = (id << 12) | (default_id << 8) | original_handler_id; | ||
737 | input_dev->id.version = 0x0100; | ||
733 | 738 | ||
734 | switch (default_id) { | 739 | switch (default_id) { |
735 | case ADB_KEYBOARD: | 740 | case ADB_KEYBOARD: |
736 | if (!(adbhid[id]->keycode = kmalloc(sizeof(adb_to_linux_keycodes), GFP_KERNEL))) { | 741 | hid->keycode = kmalloc(sizeof(adb_to_linux_keycodes), GFP_KERNEL); |
737 | kfree(adbhid[id]); | 742 | if (!hid->keycode) { |
738 | return; | 743 | err = -ENOMEM; |
744 | goto fail; | ||
739 | } | 745 | } |
740 | 746 | ||
741 | sprintf(adbhid[id]->name, "ADB keyboard"); | 747 | sprintf(hid->name, "ADB keyboard"); |
742 | 748 | ||
743 | memcpy(adbhid[id]->keycode, adb_to_linux_keycodes, sizeof(adb_to_linux_keycodes)); | 749 | memcpy(hid->keycode, adb_to_linux_keycodes, sizeof(adb_to_linux_keycodes)); |
744 | 750 | ||
745 | printk(KERN_INFO "Detected ADB keyboard, type "); | 751 | printk(KERN_INFO "Detected ADB keyboard, type "); |
746 | switch (original_handler_id) { | 752 | switch (original_handler_id) { |
747 | default: | 753 | default: |
748 | printk("<unknown>.\n"); | 754 | printk("<unknown>.\n"); |
749 | adbhid[id]->input.id.version = ADB_KEYBOARD_UNKNOWN; | 755 | input_dev->id.version = ADB_KEYBOARD_UNKNOWN; |
750 | break; | 756 | break; |
751 | 757 | ||
752 | case 0x01: case 0x02: case 0x03: case 0x06: case 0x08: | 758 | case 0x01: case 0x02: case 0x03: case 0x06: case 0x08: |
753 | case 0x0C: case 0x10: case 0x18: case 0x1B: case 0x1C: | 759 | case 0x0C: case 0x10: case 0x18: case 0x1B: case 0x1C: |
754 | case 0xC0: case 0xC3: case 0xC6: | 760 | case 0xC0: case 0xC3: case 0xC6: |
755 | printk("ANSI.\n"); | 761 | printk("ANSI.\n"); |
756 | adbhid[id]->input.id.version = ADB_KEYBOARD_ANSI; | 762 | input_dev->id.version = ADB_KEYBOARD_ANSI; |
757 | break; | 763 | break; |
758 | 764 | ||
759 | case 0x04: case 0x05: case 0x07: case 0x09: case 0x0D: | 765 | case 0x04: case 0x05: case 0x07: case 0x09: case 0x0D: |
760 | case 0x11: case 0x14: case 0x19: case 0x1D: case 0xC1: | 766 | case 0x11: case 0x14: case 0x19: case 0x1D: case 0xC1: |
761 | case 0xC4: case 0xC7: | 767 | case 0xC4: case 0xC7: |
762 | printk("ISO, swapping keys.\n"); | 768 | printk("ISO, swapping keys.\n"); |
763 | adbhid[id]->input.id.version = ADB_KEYBOARD_ISO; | 769 | input_dev->id.version = ADB_KEYBOARD_ISO; |
764 | i = adbhid[id]->keycode[10]; | 770 | i = hid->keycode[10]; |
765 | adbhid[id]->keycode[10] = adbhid[id]->keycode[50]; | 771 | hid->keycode[10] = hid->keycode[50]; |
766 | adbhid[id]->keycode[50] = i; | 772 | hid->keycode[50] = i; |
767 | break; | 773 | break; |
768 | 774 | ||
769 | case 0x12: case 0x15: case 0x16: case 0x17: case 0x1A: | 775 | case 0x12: case 0x15: case 0x16: case 0x17: case 0x1A: |
770 | case 0x1E: case 0xC2: case 0xC5: case 0xC8: case 0xC9: | 776 | case 0x1E: case 0xC2: case 0xC5: case 0xC8: case 0xC9: |
771 | printk("JIS.\n"); | 777 | printk("JIS.\n"); |
772 | adbhid[id]->input.id.version = ADB_KEYBOARD_JIS; | 778 | input_dev->id.version = ADB_KEYBOARD_JIS; |
773 | break; | 779 | break; |
774 | } | 780 | } |
775 | 781 | ||
776 | for (i = 0; i < 128; i++) | 782 | for (i = 0; i < 128; i++) |
777 | if (adbhid[id]->keycode[i]) | 783 | if (hid->keycode[i]) |
778 | set_bit(adbhid[id]->keycode[i], adbhid[id]->input.keybit); | 784 | set_bit(hid->keycode[i], input_dev->keybit); |
779 | 785 | ||
780 | adbhid[id]->input.evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP); | 786 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP); |
781 | adbhid[id]->input.ledbit[0] = BIT(LED_SCROLLL) | BIT(LED_CAPSL) | BIT(LED_NUML); | 787 | input_dev->ledbit[0] = BIT(LED_SCROLLL) | BIT(LED_CAPSL) | BIT(LED_NUML); |
782 | adbhid[id]->input.event = adbhid_kbd_event; | 788 | input_dev->event = adbhid_kbd_event; |
783 | adbhid[id]->input.keycodemax = 127; | 789 | input_dev->keycodemax = 127; |
784 | adbhid[id]->input.keycodesize = 1; | 790 | input_dev->keycodesize = 1; |
785 | break; | 791 | break; |
786 | 792 | ||
787 | case ADB_MOUSE: | 793 | case ADB_MOUSE: |
788 | sprintf(adbhid[id]->name, "ADB mouse"); | 794 | sprintf(hid->name, "ADB mouse"); |
789 | 795 | ||
790 | adbhid[id]->input.evbit[0] = BIT(EV_KEY) | BIT(EV_REL); | 796 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL); |
791 | adbhid[id]->input.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); | 797 | input_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); |
792 | adbhid[id]->input.relbit[0] = BIT(REL_X) | BIT(REL_Y); | 798 | input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y); |
793 | break; | 799 | break; |
794 | 800 | ||
795 | case ADB_MISC: | 801 | case ADB_MISC: |
796 | switch (original_handler_id) { | 802 | switch (original_handler_id) { |
797 | case 0x02: /* Adjustable keyboard button device */ | 803 | case 0x02: /* Adjustable keyboard button device */ |
798 | sprintf(adbhid[id]->name, "ADB adjustable keyboard buttons"); | 804 | sprintf(hid->name, "ADB adjustable keyboard buttons"); |
799 | adbhid[id]->input.evbit[0] = BIT(EV_KEY) | BIT(EV_REP); | 805 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); |
800 | set_bit(KEY_SOUND, adbhid[id]->input.keybit); | 806 | set_bit(KEY_SOUND, input_dev->keybit); |
801 | set_bit(KEY_MUTE, adbhid[id]->input.keybit); | 807 | set_bit(KEY_MUTE, input_dev->keybit); |
802 | set_bit(KEY_VOLUMEUP, adbhid[id]->input.keybit); | 808 | set_bit(KEY_VOLUMEUP, input_dev->keybit); |
803 | set_bit(KEY_VOLUMEDOWN, adbhid[id]->input.keybit); | 809 | set_bit(KEY_VOLUMEDOWN, input_dev->keybit); |
804 | break; | 810 | break; |
805 | case 0x1f: /* Powerbook button device */ | 811 | case 0x1f: /* Powerbook button device */ |
806 | sprintf(adbhid[id]->name, "ADB Powerbook buttons"); | 812 | sprintf(hid->name, "ADB Powerbook buttons"); |
807 | adbhid[id]->input.evbit[0] = BIT(EV_KEY) | BIT(EV_REP); | 813 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); |
808 | set_bit(KEY_MUTE, adbhid[id]->input.keybit); | 814 | set_bit(KEY_MUTE, input_dev->keybit); |
809 | set_bit(KEY_VOLUMEUP, adbhid[id]->input.keybit); | 815 | set_bit(KEY_VOLUMEUP, input_dev->keybit); |
810 | set_bit(KEY_VOLUMEDOWN, adbhid[id]->input.keybit); | 816 | set_bit(KEY_VOLUMEDOWN, input_dev->keybit); |
811 | set_bit(KEY_BRIGHTNESSUP, adbhid[id]->input.keybit); | 817 | set_bit(KEY_BRIGHTNESSUP, input_dev->keybit); |
812 | set_bit(KEY_BRIGHTNESSDOWN, adbhid[id]->input.keybit); | 818 | set_bit(KEY_BRIGHTNESSDOWN, input_dev->keybit); |
813 | set_bit(KEY_EJECTCD, adbhid[id]->input.keybit); | 819 | set_bit(KEY_EJECTCD, input_dev->keybit); |
814 | set_bit(KEY_SWITCHVIDEOMODE, adbhid[id]->input.keybit); | 820 | set_bit(KEY_SWITCHVIDEOMODE, input_dev->keybit); |
815 | set_bit(KEY_KBDILLUMTOGGLE, adbhid[id]->input.keybit); | 821 | set_bit(KEY_KBDILLUMTOGGLE, input_dev->keybit); |
816 | set_bit(KEY_KBDILLUMDOWN, adbhid[id]->input.keybit); | 822 | set_bit(KEY_KBDILLUMDOWN, input_dev->keybit); |
817 | set_bit(KEY_KBDILLUMUP, adbhid[id]->input.keybit); | 823 | set_bit(KEY_KBDILLUMUP, input_dev->keybit); |
818 | break; | 824 | break; |
819 | } | 825 | } |
820 | if (adbhid[id]->name[0]) | 826 | if (hid->name[0]) |
821 | break; | 827 | break; |
822 | /* else fall through */ | 828 | /* else fall through */ |
823 | 829 | ||
824 | default: | 830 | default: |
825 | printk(KERN_INFO "Trying to register unknown ADB device to input layer.\n"); | 831 | printk(KERN_INFO "Trying to register unknown ADB device to input layer.\n"); |
826 | kfree(adbhid[id]); | 832 | err = -ENODEV; |
827 | return; | 833 | goto fail; |
828 | } | 834 | } |
829 | 835 | ||
830 | adbhid[id]->input.keycode = adbhid[id]->keycode; | 836 | input_dev->keycode = hid->keycode; |
831 | |||
832 | input_register_device(&adbhid[id]->input); | ||
833 | 837 | ||
834 | printk(KERN_INFO "input: %s on %s\n", | 838 | input_register_device(input_dev); |
835 | adbhid[id]->name, adbhid[id]->phys); | ||
836 | 839 | ||
837 | if (default_id == ADB_KEYBOARD) { | 840 | if (default_id == ADB_KEYBOARD) { |
838 | /* HACK WARNING!! This should go away as soon there is an utility | 841 | /* HACK WARNING!! This should go away as soon there is an utility |
839 | * to control that for event devices. | 842 | * to control that for event devices. |
840 | */ | 843 | */ |
841 | adbhid[id]->input.rep[REP_DELAY] = 500; /* input layer default: 250 */ | 844 | input_dev->rep[REP_DELAY] = 500; /* input layer default: 250 */ |
842 | adbhid[id]->input.rep[REP_PERIOD] = 66; /* input layer default: 33 */ | 845 | input_dev->rep[REP_PERIOD] = 66; /* input layer default: 33 */ |
843 | } | 846 | } |
847 | |||
848 | return 0; | ||
849 | |||
850 | fail: input_free_device(input_dev); | ||
851 | kfree(hid); | ||
852 | adbhid[id] = NULL; | ||
853 | return err; | ||
844 | } | 854 | } |
845 | 855 | ||
846 | static void adbhid_input_unregister(int id) | 856 | static void adbhid_input_unregister(int id) |
847 | { | 857 | { |
848 | input_unregister_device(&adbhid[id]->input); | 858 | input_unregister_device(adbhid[id]->input); |
849 | if (adbhid[id]->keycode) | 859 | if (adbhid[id]->keycode) |
850 | kfree(adbhid[id]->keycode); | 860 | kfree(adbhid[id]->keycode); |
851 | kfree(adbhid[id]); | 861 | kfree(adbhid[id]); |
@@ -858,7 +868,7 @@ adbhid_input_reregister(int id, int default_id, int org_handler_id, | |||
858 | int cur_handler_id, int mk) | 868 | int cur_handler_id, int mk) |
859 | { | 869 | { |
860 | if (adbhid[id]) { | 870 | if (adbhid[id]) { |
861 | if (adbhid[id]->input.id.product != | 871 | if (adbhid[id]->input->id.product != |
862 | ((id << 12)|(default_id << 8)|org_handler_id)) { | 872 | ((id << 12)|(default_id << 8)|org_handler_id)) { |
863 | adbhid_input_unregister(id); | 873 | adbhid_input_unregister(id); |
864 | adbhid_input_register(id, default_id, org_handler_id, | 874 | adbhid_input_register(id, default_id, org_handler_id, |