diff options
Diffstat (limited to 'drivers/input/keyboard/lkkbd.c')
-rw-r--r-- | drivers/input/keyboard/lkkbd.c | 128 |
1 files changed, 64 insertions, 64 deletions
diff --git a/drivers/input/keyboard/lkkbd.c b/drivers/input/keyboard/lkkbd.c index 098963c7cdd6..7f06780a437f 100644 --- a/drivers/input/keyboard/lkkbd.c +++ b/drivers/input/keyboard/lkkbd.c | |||
@@ -102,7 +102,7 @@ static int ctrlclick_volume = 100; /* % */ | |||
102 | module_param (ctrlclick_volume, int, 0); | 102 | module_param (ctrlclick_volume, int, 0); |
103 | MODULE_PARM_DESC (ctrlclick_volume, "Ctrlclick volume (in %), default is 100%"); | 103 | MODULE_PARM_DESC (ctrlclick_volume, "Ctrlclick volume (in %), default is 100%"); |
104 | 104 | ||
105 | static int lk201_compose_is_alt = 0; | 105 | static int lk201_compose_is_alt; |
106 | module_param (lk201_compose_is_alt, int, 0); | 106 | module_param (lk201_compose_is_alt, int, 0); |
107 | MODULE_PARM_DESC (lk201_compose_is_alt, "If set non-zero, LK201' Compose key " | 107 | MODULE_PARM_DESC (lk201_compose_is_alt, "If set non-zero, LK201' Compose key " |
108 | "will act as an Alt key"); | 108 | "will act as an Alt key"); |
@@ -274,7 +274,7 @@ static lk_keycode_t lkkbd_keycode[LK_NUM_KEYCODES] = { | |||
274 | }; | 274 | }; |
275 | 275 | ||
276 | #define CHECK_LED(LED, BITS) do { \ | 276 | #define CHECK_LED(LED, BITS) do { \ |
277 | if (test_bit (LED, lk->dev.led)) \ | 277 | if (test_bit (LED, lk->dev->led)) \ |
278 | leds_on |= BITS; \ | 278 | leds_on |= BITS; \ |
279 | else \ | 279 | else \ |
280 | leds_off |= BITS; \ | 280 | leds_off |= BITS; \ |
@@ -287,7 +287,7 @@ struct lkkbd { | |||
287 | lk_keycode_t keycode[LK_NUM_KEYCODES]; | 287 | lk_keycode_t keycode[LK_NUM_KEYCODES]; |
288 | int ignore_bytes; | 288 | int ignore_bytes; |
289 | unsigned char id[LK_NUM_IGNORE_BYTES]; | 289 | unsigned char id[LK_NUM_IGNORE_BYTES]; |
290 | struct input_dev dev; | 290 | struct input_dev *dev; |
291 | struct serio *serio; | 291 | struct serio *serio; |
292 | struct work_struct tq; | 292 | struct work_struct tq; |
293 | char name[64]; | 293 | char name[64]; |
@@ -423,8 +423,7 @@ lkkbd_interrupt (struct serio *serio, unsigned char data, unsigned int flags, | |||
423 | DBG (KERN_INFO "Got byte 0x%02x\n", data); | 423 | DBG (KERN_INFO "Got byte 0x%02x\n", data); |
424 | 424 | ||
425 | if (lk->ignore_bytes > 0) { | 425 | if (lk->ignore_bytes > 0) { |
426 | DBG (KERN_INFO "Ignoring a byte on %s\n", | 426 | DBG (KERN_INFO "Ignoring a byte on %s\n", lk->name); |
427 | lk->name); | ||
428 | lk->id[LK_NUM_IGNORE_BYTES - lk->ignore_bytes--] = data; | 427 | lk->id[LK_NUM_IGNORE_BYTES - lk->ignore_bytes--] = data; |
429 | 428 | ||
430 | if (lk->ignore_bytes == 0) | 429 | if (lk->ignore_bytes == 0) |
@@ -435,14 +434,14 @@ lkkbd_interrupt (struct serio *serio, unsigned char data, unsigned int flags, | |||
435 | 434 | ||
436 | switch (data) { | 435 | switch (data) { |
437 | case LK_ALL_KEYS_UP: | 436 | case LK_ALL_KEYS_UP: |
438 | input_regs (&lk->dev, regs); | 437 | input_regs (lk->dev, regs); |
439 | for (i = 0; i < ARRAY_SIZE (lkkbd_keycode); i++) | 438 | for (i = 0; i < ARRAY_SIZE (lkkbd_keycode); i++) |
440 | if (lk->keycode[i] != KEY_RESERVED) | 439 | if (lk->keycode[i] != KEY_RESERVED) |
441 | input_report_key (&lk->dev, lk->keycode[i], 0); | 440 | input_report_key (lk->dev, lk->keycode[i], 0); |
442 | input_sync (&lk->dev); | 441 | input_sync (lk->dev); |
443 | break; | 442 | break; |
444 | case LK_METRONOME: | 443 | case LK_METRONOME: |
445 | DBG (KERN_INFO "Got LK_METRONOME and don't " | 444 | DBG (KERN_INFO "Got %#d and don't " |
446 | "know how to handle...\n"); | 445 | "know how to handle...\n"); |
447 | break; | 446 | break; |
448 | case LK_OUTPUT_ERROR: | 447 | case LK_OUTPUT_ERROR: |
@@ -482,12 +481,12 @@ lkkbd_interrupt (struct serio *serio, unsigned char data, unsigned int flags, | |||
482 | 481 | ||
483 | default: | 482 | default: |
484 | if (lk->keycode[data] != KEY_RESERVED) { | 483 | if (lk->keycode[data] != KEY_RESERVED) { |
485 | input_regs (&lk->dev, regs); | 484 | input_regs (lk->dev, regs); |
486 | if (!test_bit (lk->keycode[data], lk->dev.key)) | 485 | if (!test_bit (lk->keycode[data], lk->dev->key)) |
487 | input_report_key (&lk->dev, lk->keycode[data], 1); | 486 | input_report_key (lk->dev, lk->keycode[data], 1); |
488 | else | 487 | else |
489 | input_report_key (&lk->dev, lk->keycode[data], 0); | 488 | input_report_key (lk->dev, lk->keycode[data], 0); |
490 | input_sync (&lk->dev); | 489 | input_sync (lk->dev); |
491 | } else | 490 | } else |
492 | printk (KERN_WARNING "%s: Unknown key with " | 491 | printk (KERN_WARNING "%s: Unknown key with " |
493 | "scancode 0x%02x on %s.\n", | 492 | "scancode 0x%02x on %s.\n", |
@@ -605,7 +604,7 @@ lkkbd_reinit (void *data) | |||
605 | lk->serio->write (lk->serio, volume_to_hw (lk->bell_volume)); | 604 | lk->serio->write (lk->serio, volume_to_hw (lk->bell_volume)); |
606 | 605 | ||
607 | /* Enable/disable keyclick (and possibly set volume) */ | 606 | /* Enable/disable keyclick (and possibly set volume) */ |
608 | if (test_bit (SND_CLICK, lk->dev.snd)) { | 607 | if (test_bit (SND_CLICK, lk->dev->snd)) { |
609 | lk->serio->write (lk->serio, LK_CMD_ENABLE_KEYCLICK); | 608 | lk->serio->write (lk->serio, LK_CMD_ENABLE_KEYCLICK); |
610 | lk->serio->write (lk->serio, volume_to_hw (lk->keyclick_volume)); | 609 | lk->serio->write (lk->serio, volume_to_hw (lk->keyclick_volume)); |
611 | lk->serio->write (lk->serio, LK_CMD_ENABLE_CTRCLICK); | 610 | lk->serio->write (lk->serio, LK_CMD_ENABLE_CTRCLICK); |
@@ -616,7 +615,7 @@ lkkbd_reinit (void *data) | |||
616 | } | 615 | } |
617 | 616 | ||
618 | /* Sound the bell if needed */ | 617 | /* Sound the bell if needed */ |
619 | if (test_bit (SND_BELL, lk->dev.snd)) | 618 | if (test_bit (SND_BELL, lk->dev->snd)) |
620 | lk->serio->write (lk->serio, LK_CMD_SOUND_BELL); | 619 | lk->serio->write (lk->serio, LK_CMD_SOUND_BELL); |
621 | } | 620 | } |
622 | 621 | ||
@@ -627,71 +626,70 @@ static int | |||
627 | lkkbd_connect (struct serio *serio, struct serio_driver *drv) | 626 | lkkbd_connect (struct serio *serio, struct serio_driver *drv) |
628 | { | 627 | { |
629 | struct lkkbd *lk; | 628 | struct lkkbd *lk; |
629 | struct input_dev *input_dev; | ||
630 | int i; | 630 | int i; |
631 | int err; | 631 | int err; |
632 | 632 | ||
633 | if (!(lk = kmalloc (sizeof (struct lkkbd), GFP_KERNEL))) | 633 | lk = kzalloc (sizeof (struct lkkbd), GFP_KERNEL); |
634 | return -ENOMEM; | 634 | input_dev = input_allocate_device (); |
635 | 635 | if (!lk || !input_dev) { | |
636 | memset (lk, 0, sizeof (struct lkkbd)); | 636 | err = -ENOMEM; |
637 | 637 | goto fail; | |
638 | init_input_dev (&lk->dev); | 638 | } |
639 | set_bit (EV_KEY, lk->dev.evbit); | ||
640 | set_bit (EV_LED, lk->dev.evbit); | ||
641 | set_bit (EV_SND, lk->dev.evbit); | ||
642 | set_bit (EV_REP, lk->dev.evbit); | ||
643 | set_bit (LED_CAPSL, lk->dev.ledbit); | ||
644 | set_bit (LED_SLEEP, lk->dev.ledbit); | ||
645 | set_bit (LED_COMPOSE, lk->dev.ledbit); | ||
646 | set_bit (LED_SCROLLL, lk->dev.ledbit); | ||
647 | set_bit (SND_BELL, lk->dev.sndbit); | ||
648 | set_bit (SND_CLICK, lk->dev.sndbit); | ||
649 | 639 | ||
650 | lk->serio = serio; | 640 | lk->serio = serio; |
651 | 641 | lk->dev = input_dev; | |
652 | INIT_WORK (&lk->tq, lkkbd_reinit, lk); | 642 | INIT_WORK (&lk->tq, lkkbd_reinit, lk); |
653 | |||
654 | lk->bell_volume = bell_volume; | 643 | lk->bell_volume = bell_volume; |
655 | lk->keyclick_volume = keyclick_volume; | 644 | lk->keyclick_volume = keyclick_volume; |
656 | lk->ctrlclick_volume = ctrlclick_volume; | 645 | lk->ctrlclick_volume = ctrlclick_volume; |
646 | memcpy (lk->keycode, lkkbd_keycode, sizeof (lk_keycode_t) * LK_NUM_KEYCODES); | ||
657 | 647 | ||
658 | lk->dev.keycode = lk->keycode; | 648 | strlcpy (lk->name, "DEC LK keyboard", sizeof(lk->name)); |
659 | lk->dev.keycodesize = sizeof (lk_keycode_t); | 649 | snprintf (lk->phys, sizeof(lk->phys), "%s/input0", serio->phys); |
660 | lk->dev.keycodemax = LK_NUM_KEYCODES; | 650 | |
661 | 651 | input_dev->name = lk->name; | |
662 | lk->dev.event = lkkbd_event; | 652 | input_dev->phys = lk->phys; |
663 | lk->dev.private = lk; | 653 | input_dev->id.bustype = BUS_RS232; |
654 | input_dev->id.vendor = SERIO_LKKBD; | ||
655 | input_dev->id.product = 0; | ||
656 | input_dev->id.version = 0x0100; | ||
657 | input_dev->cdev.dev = &serio->dev; | ||
658 | input_dev->event = lkkbd_event; | ||
659 | input_dev->private = lk; | ||
660 | |||
661 | set_bit (EV_KEY, input_dev->evbit); | ||
662 | set_bit (EV_LED, input_dev->evbit); | ||
663 | set_bit (EV_SND, input_dev->evbit); | ||
664 | set_bit (EV_REP, input_dev->evbit); | ||
665 | set_bit (LED_CAPSL, input_dev->ledbit); | ||
666 | set_bit (LED_SLEEP, input_dev->ledbit); | ||
667 | set_bit (LED_COMPOSE, input_dev->ledbit); | ||
668 | set_bit (LED_SCROLLL, input_dev->ledbit); | ||
669 | set_bit (SND_BELL, input_dev->sndbit); | ||
670 | set_bit (SND_CLICK, input_dev->sndbit); | ||
671 | |||
672 | input_dev->keycode = lk->keycode; | ||
673 | input_dev->keycodesize = sizeof (lk_keycode_t); | ||
674 | input_dev->keycodemax = LK_NUM_KEYCODES; | ||
675 | for (i = 0; i < LK_NUM_KEYCODES; i++) | ||
676 | set_bit (lk->keycode[i], input_dev->keybit); | ||
664 | 677 | ||
665 | serio_set_drvdata (serio, lk); | 678 | serio_set_drvdata (serio, lk); |
666 | 679 | ||
667 | err = serio_open (serio, drv); | 680 | err = serio_open (serio, drv); |
668 | if (err) { | 681 | if (err) |
669 | serio_set_drvdata (serio, NULL); | 682 | goto fail; |
670 | kfree (lk); | ||
671 | return err; | ||
672 | } | ||
673 | 683 | ||
674 | sprintf (lk->name, "DEC LK keyboard"); | 684 | input_register_device (lk->dev); |
675 | sprintf (lk->phys, "%s/input0", serio->phys); | ||
676 | |||
677 | memcpy (lk->keycode, lkkbd_keycode, sizeof (lk_keycode_t) * LK_NUM_KEYCODES); | ||
678 | for (i = 0; i < LK_NUM_KEYCODES; i++) | ||
679 | set_bit (lk->keycode[i], lk->dev.keybit); | ||
680 | |||
681 | lk->dev.name = lk->name; | ||
682 | lk->dev.phys = lk->phys; | ||
683 | lk->dev.id.bustype = BUS_RS232; | ||
684 | lk->dev.id.vendor = SERIO_LKKBD; | ||
685 | lk->dev.id.product = 0; | ||
686 | lk->dev.id.version = 0x0100; | ||
687 | lk->dev.dev = &serio->dev; | ||
688 | |||
689 | input_register_device (&lk->dev); | ||
690 | |||
691 | printk (KERN_INFO "input: %s on %s, initiating reset\n", lk->name, serio->phys); | ||
692 | lk->serio->write (lk->serio, LK_CMD_POWERCYCLE_RESET); | 685 | lk->serio->write (lk->serio, LK_CMD_POWERCYCLE_RESET); |
693 | 686 | ||
694 | return 0; | 687 | return 0; |
688 | |||
689 | fail: serio_set_drvdata (serio, NULL); | ||
690 | input_free_device (input_dev); | ||
691 | kfree (lk); | ||
692 | return err; | ||
695 | } | 693 | } |
696 | 694 | ||
697 | /* | 695 | /* |
@@ -702,9 +700,11 @@ lkkbd_disconnect (struct serio *serio) | |||
702 | { | 700 | { |
703 | struct lkkbd *lk = serio_get_drvdata (serio); | 701 | struct lkkbd *lk = serio_get_drvdata (serio); |
704 | 702 | ||
705 | input_unregister_device (&lk->dev); | 703 | input_get_device (lk->dev); |
704 | input_unregister_device (lk->dev); | ||
706 | serio_close (serio); | 705 | serio_close (serio); |
707 | serio_set_drvdata (serio, NULL); | 706 | serio_set_drvdata (serio, NULL); |
707 | input_put_device (lk->dev); | ||
708 | kfree (lk); | 708 | kfree (lk); |
709 | } | 709 | } |
710 | 710 | ||