linux/drivers/char/keyboard.c
<<
>>
Prefs
   1/*
   2 * linux/drivers/char/keyboard.c
   3 *
   4 * Written for linux by Johan Myreen as a translation from
   5 * the assembly version by Linus (with diacriticals added)
   6 *
   7 * Some additional features added by Christoph Niemann (ChN), March 1993
   8 *
   9 * Loadable keymaps by Risto Kankkunen, May 1993
  10 *
  11 * Diacriticals redone & other small changes, aeb@cwi.nl, June 1993
  12 * Added decr/incr_console, dynamic keymaps, Unicode support,
  13 * dynamic function/string keys, led setting,  Sept 1994
  14 * `Sticky' modifier keys, 951006.
  15 *
  16 * 11-11-96: SAK should now work in the raw mode (Martin Mares)
  17 *
  18 * Modified to provide 'generic' keyboard support by Hamish Macdonald
  19 * Merge with the m68k keyboard driver and split-off of the PC low-level
  20 * parts by Geert Uytterhoeven, May 1997
  21 *
  22 * 27-05-97: Added support for the Magic SysRq Key (Martin Mares)
  23 * 30-07-98: Dead keys redone, aeb@cwi.nl.
  24 * 21-08-02: Converted to input API, major cleanup. (Vojtech Pavlik)
  25 */
  26
  27#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  28
  29#include <linux/consolemap.h>
  30#include <linux/module.h>
  31#include <linux/sched.h>
  32#include <linux/tty.h>
  33#include <linux/tty_flip.h>
  34#include <linux/mm.h>
  35#include <linux/string.h>
  36#include <linux/init.h>
  37#include <linux/slab.h>
  38#include <linux/irq.h>
  39
  40#include <linux/kbd_kern.h>
  41#include <linux/kbd_diacr.h>
  42#include <linux/vt_kern.h>
  43#include <linux/input.h>
  44#include <linux/reboot.h>
  45#include <linux/notifier.h>
  46#include <linux/jiffies.h>
  47
  48extern void ctrl_alt_del(void);
  49
  50/*
  51 * Exported functions/variables
  52 */
  53
  54#define KBD_DEFMODE ((1 << VC_REPEAT) | (1 << VC_META))
  55
  56/*
  57 * Some laptops take the 789uiojklm,. keys as number pad when NumLock is on.
  58 * This seems a good reason to start with NumLock off. On HIL keyboards
  59 * of PARISC machines however there is no NumLock key and everyone expects the keypad
  60 * to be used for numbers.
  61 */
  62
  63#if defined(CONFIG_PARISC) && (defined(CONFIG_KEYBOARD_HIL) || defined(CONFIG_KEYBOARD_HIL_OLD))
  64#define KBD_DEFLEDS (1 << VC_NUMLOCK)
  65#else
  66#define KBD_DEFLEDS 0
  67#endif
  68
  69#define KBD_DEFLOCK 0
  70
  71void compute_shiftstate(void);
  72
  73/*
  74 * Handler Tables.
  75 */
  76
  77#define K_HANDLERS\
  78        k_self,         k_fn,           k_spec,         k_pad,\
  79        k_dead,         k_cons,         k_cur,          k_shift,\
  80        k_meta,         k_ascii,        k_lock,         k_lowercase,\
  81        k_slock,        k_dead2,        k_brl,          k_ignore
  82
  83typedef void (k_handler_fn)(struct vc_data *vc, unsigned char value,
  84                            char up_flag);
  85static k_handler_fn K_HANDLERS;
  86static k_handler_fn *k_handler[16] = { K_HANDLERS };
  87
  88#define FN_HANDLERS\
  89        fn_null,        fn_enter,       fn_show_ptregs, fn_show_mem,\
  90        fn_show_state,  fn_send_intr,   fn_lastcons,    fn_caps_toggle,\
  91        fn_num,         fn_hold,        fn_scroll_forw, fn_scroll_back,\
  92        fn_boot_it,     fn_caps_on,     fn_compose,     fn_SAK,\
  93        fn_dec_console, fn_inc_console, fn_spawn_con,   fn_bare_num
  94
  95typedef void (fn_handler_fn)(struct vc_data *vc);
  96static fn_handler_fn FN_HANDLERS;
  97static fn_handler_fn *fn_handler[] = { FN_HANDLERS };
  98
  99/*
 100 * Variables exported for vt_ioctl.c
 101 */
 102
 103/* maximum values each key_handler can handle */
 104const int max_vals[] = {
 105        255, ARRAY_SIZE(func_table) - 1, ARRAY_SIZE(fn_handler) - 1, NR_PAD - 1,
 106        NR_DEAD - 1, 255, 3, NR_SHIFT - 1, 255, NR_ASCII - 1, NR_LOCK - 1,
 107        255, NR_LOCK - 1, 255, NR_BRL - 1
 108};
 109
 110const int NR_TYPES = ARRAY_SIZE(max_vals);
 111
 112struct kbd_struct kbd_table[MAX_NR_CONSOLES];
 113EXPORT_SYMBOL_GPL(kbd_table);
 114static struct kbd_struct *kbd = kbd_table;
 115
 116struct vt_spawn_console vt_spawn_con = {
 117        .lock = __SPIN_LOCK_UNLOCKED(vt_spawn_con.lock),
 118        .pid  = NULL,
 119        .sig  = 0,
 120};
 121
 122/*
 123 * Variables exported for vt.c
 124 */
 125
 126int shift_state = 0;
 127
 128/*
 129 * Internal Data.
 130 */
 131
 132static struct input_handler kbd_handler;
 133static DEFINE_SPINLOCK(kbd_event_lock);
 134static unsigned long key_down[BITS_TO_LONGS(KEY_CNT)];  /* keyboard key bitmap */
 135static unsigned char shift_down[NR_SHIFT];              /* shift state counters.. */
 136static bool dead_key_next;
 137static int npadch = -1;                                 /* -1 or number assembled on pad */
 138static unsigned int diacr;
 139static char rep;                                        /* flag telling character repeat */
 140
 141static unsigned char ledstate = 0xff;                   /* undefined */
 142static unsigned char ledioctl;
 143
 144static struct ledptr {
 145        unsigned int *addr;
 146        unsigned int mask;
 147        unsigned char valid:1;
 148} ledptrs[3];
 149
 150/*
 151 * Notifier list for console keyboard events
 152 */
 153static ATOMIC_NOTIFIER_HEAD(keyboard_notifier_list);
 154
 155int register_keyboard_notifier(struct notifier_block *nb)
 156{
 157        return atomic_notifier_chain_register(&keyboard_notifier_list, nb);
 158}
 159EXPORT_SYMBOL_GPL(register_keyboard_notifier);
 160
 161int unregister_keyboard_notifier(struct notifier_block *nb)
 162{
 163        return atomic_notifier_chain_unregister(&keyboard_notifier_list, nb);
 164}
 165EXPORT_SYMBOL_GPL(unregister_keyboard_notifier);
 166
 167/*
 168 * Translation of scancodes to keycodes. We set them on only the first
 169 * keyboard in the list that accepts the scancode and keycode.
 170 * Explanation for not choosing the first attached keyboard anymore:
 171 *  USB keyboards for example have two event devices: one for all "normal"
 172 *  keys and one for extra function keys (like "volume up", "make coffee",
 173 *  etc.). So this means that scancodes for the extra function keys won't
 174 *  be valid for the first event device, but will be for the second.
 175 */
 176
 177struct getset_keycode_data {
 178        unsigned int scancode;
 179        unsigned int keycode;
 180        int error;
 181};
 182
 183static int getkeycode_helper(struct input_handle *handle, void *data)
 184{
 185        struct getset_keycode_data *d = data;
 186
 187        d->error = input_get_keycode(handle->dev, d->scancode, &d->keycode);
 188
 189        return d->error == 0; /* stop as soon as we successfully get one */
 190}
 191
 192int getkeycode(unsigned int scancode)
 193{
 194        struct getset_keycode_data d = { scancode, 0, -ENODEV };
 195
 196        input_handler_for_each_handle(&kbd_handler, &d, getkeycode_helper);
 197
 198        return d.error ?: d.keycode;
 199}
 200
 201static int setkeycode_helper(struct input_handle *handle, void *data)
 202{
 203        struct getset_keycode_data *d = data;
 204
 205        d->error = input_set_keycode(handle->dev, d->scancode, d->keycode);
 206
 207        return d->error == 0; /* stop as soon as we successfully set one */
 208}
 209
 210int setkeycode(unsigned int scancode, unsigned int keycode)
 211{
 212        struct getset_keycode_data d = { scancode, keycode, -ENODEV };
 213
 214        input_handler_for_each_handle(&kbd_handler, &d, setkeycode_helper);
 215
 216        return d.error;
 217}
 218
 219/*
 220 * Making beeps and bells. Note that we prefer beeps to bells, but when
 221 * shutting the sound off we do both.
 222 */
 223
 224static int kd_sound_helper(struct input_handle *handle, void *data)
 225{
 226        unsigned int *hz = data;
 227        struct input_dev *dev = handle->dev;
 228
 229        if (test_bit(EV_SND, dev->evbit)) {
 230                if (test_bit(SND_TONE, dev->sndbit)) {
 231                        input_inject_event(handle, EV_SND, SND_TONE, *hz);
 232                        if (*hz)
 233                                return 0;
 234                }
 235                if (test_bit(SND_BELL, dev->sndbit))
 236                        input_inject_event(handle, EV_SND, SND_BELL, *hz ? 1 : 0);
 237        }
 238
 239        return 0;
 240}
 241
 242static void kd_nosound(unsigned long ignored)
 243{
 244        static unsigned int zero;
 245
 246        input_handler_for_each_handle(&kbd_handler, &zero, kd_sound_helper);
 247}
 248
 249static DEFINE_TIMER(kd_mksound_timer, kd_nosound, 0, 0);
 250
 251void kd_mksound(unsigned int hz, unsigned int ticks)
 252{
 253        del_timer_sync(&kd_mksound_timer);
 254
 255        input_handler_for_each_handle(&kbd_handler, &hz, kd_sound_helper);
 256
 257        if (hz && ticks)
 258                mod_timer(&kd_mksound_timer, jiffies + ticks);
 259}
 260EXPORT_SYMBOL(kd_mksound);
 261
 262/*
 263 * Setting the keyboard rate.
 264 */
 265
 266static int kbd_rate_helper(struct input_handle *handle, void *data)
 267{
 268        struct input_dev *dev = handle->dev;
 269        struct kbd_repeat *rep = data;
 270
 271        if (test_bit(EV_REP, dev->evbit)) {
 272
 273                if (rep[0].delay > 0)
 274                        input_inject_event(handle,
 275                                           EV_REP, REP_DELAY, rep[0].delay);
 276                if (rep[0].period > 0)
 277                        input_inject_event(handle,
 278                                           EV_REP, REP_PERIOD, rep[0].period);
 279
 280                rep[1].delay = dev->rep[REP_DELAY];
 281                rep[1].period = dev->rep[REP_PERIOD];
 282        }
 283
 284        return 0;
 285}
 286
 287int kbd_rate(struct kbd_repeat *rep)
 288{
 289        struct kbd_repeat data[2] = { *rep };
 290
 291        input_handler_for_each_handle(&kbd_handler, data, kbd_rate_helper);
 292        *rep = data[1]; /* Copy currently used settings */
 293
 294        return 0;
 295}
 296
 297/*
 298 * Helper Functions.
 299 */
 300static void put_queue(struct vc_data *vc, int ch)
 301{
 302        struct tty_struct *tty = vc->vc_tty;
 303
 304        if (tty) {
 305                tty_insert_flip_char(tty, ch, 0);
 306                con_schedule_flip(tty);
 307        }
 308}
 309
 310static void puts_queue(struct vc_data *vc, char *cp)
 311{
 312        struct tty_struct *tty = vc->vc_tty;
 313
 314        if (!tty)
 315                return;
 316
 317        while (*cp) {
 318                tty_insert_flip_char(tty, *cp, 0);
 319                cp++;
 320        }
 321        con_schedule_flip(tty);
 322}
 323
 324static void applkey(struct vc_data *vc, int key, char mode)
 325{
 326        static char buf[] = { 0x1b, 'O', 0x00, 0x00 };
 327
 328        buf[1] = (mode ? 'O' : '[');
 329        buf[2] = key;
 330        puts_queue(vc, buf);
 331}
 332
 333/*
 334 * Many other routines do put_queue, but I think either
 335 * they produce ASCII, or they produce some user-assigned
 336 * string, and in both cases we might assume that it is
 337 * in utf-8 already.
 338 */
 339static void to_utf8(struct vc_data *vc, uint c)
 340{
 341        if (c < 0x80)
 342                /*  0******* */
 343                put_queue(vc, c);
 344        else if (c < 0x800) {
 345                /* 110***** 10****** */
 346                put_queue(vc, 0xc0 | (c >> 6));
 347                put_queue(vc, 0x80 | (c & 0x3f));
 348        } else if (c < 0x10000) {
 349                if (c >= 0xD800 && c < 0xE000)
 350                        return;
 351                if (c == 0xFFFF)
 352                        return;
 353                /* 1110**** 10****** 10****** */
 354                put_queue(vc, 0xe0 | (c >> 12));
 355                put_queue(vc, 0x80 | ((c >> 6) & 0x3f));
 356                put_queue(vc, 0x80 | (c & 0x3f));
 357        } else if (c < 0x110000) {
 358                /* 11110*** 10****** 10****** 10****** */
 359                put_queue(vc, 0xf0 | (c >> 18));
 360                put_queue(vc, 0x80 | ((c >> 12) & 0x3f));
 361                put_queue(vc, 0x80 | ((c >> 6) & 0x3f));
 362                put_queue(vc, 0x80 | (c & 0x3f));
 363        }
 364}
 365
 366/*
 367 * Called after returning from RAW mode or when changing consoles - recompute
 368 * shift_down[] and shift_state from key_down[] maybe called when keymap is
 369 * undefined, so that shiftkey release is seen
 370 */
 371void compute_shiftstate(void)
 372{
 373        unsigned int i, j, k, sym, val;
 374
 375        shift_state = 0;
 376        memset(shift_down, 0, sizeof(shift_down));
 377
 378        for (i = 0; i < ARRAY_SIZE(key_down); i++) {
 379
 380                if (!key_down[i])
 381                        continue;
 382
 383                k = i * BITS_PER_LONG;
 384
 385                for (j = 0; j < BITS_PER_LONG; j++, k++) {
 386
 387                        if (!test_bit(k, key_down))
 388                                continue;
 389
 390                        sym = U(key_maps[0][k]);
 391                        if (KTYP(sym) != KT_SHIFT && KTYP(sym) != KT_SLOCK)
 392                                continue;
 393
 394                        val = KVAL(sym);
 395                        if (val == KVAL(K_CAPSSHIFT))
 396                                val = KVAL(K_SHIFT);
 397
 398                        shift_down[val]++;
 399                        shift_state |= (1 << val);
 400                }
 401        }
 402}
 403
 404/*
 405 * We have a combining character DIACR here, followed by the character CH.
 406 * If the combination occurs in the table, return the corresponding value.
 407 * Otherwise, if CH is a space or equals DIACR, return DIACR.
 408 * Otherwise, conclude that DIACR was not combining after all,
 409 * queue it and return CH.
 410 */
 411static unsigned int handle_diacr(struct vc_data *vc, unsigned int ch)
 412{
 413        unsigned int d = diacr;
 414        unsigned int i;
 415
 416        diacr = 0;
 417
 418        if ((d & ~0xff) == BRL_UC_ROW) {
 419                if ((ch & ~0xff) == BRL_UC_ROW)
 420                        return d | ch;
 421        } else {
 422                for (i = 0; i < accent_table_size; i++)
 423                        if (accent_table[i].diacr == d && accent_table[i].base == ch)
 424                                return accent_table[i].result;
 425        }
 426
 427        if (ch == ' ' || ch == (BRL_UC_ROW|0) || ch == d)
 428                return d;
 429
 430        if (kbd->kbdmode == VC_UNICODE)
 431                to_utf8(vc, d);
 432        else {
 433                int c = conv_uni_to_8bit(d);
 434                if (c != -1)
 435                        put_queue(vc, c);
 436        }
 437
 438        return ch;
 439}
 440
 441/*
 442 * Special function handlers
 443 */
 444static void fn_enter(struct vc_data *vc)
 445{
 446        if (diacr) {
 447                if (kbd->kbdmode == VC_UNICODE)
 448                        to_utf8(vc, diacr);
 449                else {
 450                        int c = conv_uni_to_8bit(diacr);
 451                        if (c != -1)
 452                                put_queue(vc, c);
 453                }
 454                diacr = 0;
 455        }
 456
 457        put_queue(vc, 13);
 458        if (vc_kbd_mode(kbd, VC_CRLF))
 459                put_queue(vc, 10);
 460}
 461
 462static void fn_caps_toggle(struct vc_data *vc)
 463{
 464        if (rep)
 465                return;
 466
 467        chg_vc_kbd_led(kbd, VC_CAPSLOCK);
 468}
 469
 470static void fn_caps_on(struct vc_data *vc)
 471{
 472        if (rep)
 473                return;
 474
 475        set_vc_kbd_led(kbd, VC_CAPSLOCK);
 476}
 477
 478static void fn_show_ptregs(struct vc_data *vc)
 479{
 480        struct pt_regs *regs = get_irq_regs();
 481
 482        if (regs)
 483                show_regs(regs);
 484}
 485
 486static void fn_hold(struct vc_data *vc)
 487{
 488        struct tty_struct *tty = vc->vc_tty;
 489
 490        if (rep || !tty)
 491                return;
 492
 493        /*
 494         * Note: SCROLLOCK will be set (cleared) by stop_tty (start_tty);
 495         * these routines are also activated by ^S/^Q.
 496         * (And SCROLLOCK can also be set by the ioctl KDSKBLED.)
 497         */
 498        if (tty->stopped)
 499                start_tty(tty);
 500        else
 501                stop_tty(tty);
 502}
 503
 504static void fn_num(struct vc_data *vc)
 505{
 506        if (vc_kbd_mode(kbd, VC_APPLIC))
 507                applkey(vc, 'P', 1);
 508        else
 509                fn_bare_num(vc);
 510}
 511
 512/*
 513 * Bind this to Shift-NumLock if you work in application keypad mode
 514 * but want to be able to change the NumLock flag.
 515 * Bind this to NumLock if you prefer that the NumLock key always
 516 * changes the NumLock flag.
 517 */
 518static void fn_bare_num(struct vc_data *vc)
 519{
 520        if (!rep)
 521                chg_vc_kbd_led(kbd, VC_NUMLOCK);
 522}
 523
 524static void fn_lastcons(struct vc_data *vc)
 525{
 526        /* switch to the last used console, ChN */
 527        set_console(last_console);
 528}
 529
 530static void fn_dec_console(struct vc_data *vc)
 531{
 532        int i, cur = fg_console;
 533
 534        /* Currently switching?  Queue this next switch relative to that. */
 535        if (want_console != -1)
 536                cur = want_console;
 537
 538        for (i = cur - 1; i != cur; i--) {
 539                if (i == -1)
 540                        i = MAX_NR_CONSOLES - 1;
 541                if (vc_cons_allocated(i))
 542                        break;
 543        }
 544        set_console(i);
 545}
 546
 547static void fn_inc_console(struct vc_data *vc)
 548{
 549        int i, cur = fg_console;
 550
 551        /* Currently switching?  Queue this next switch relative to that. */
 552        if (want_console != -1)
 553                cur = want_console;
 554
 555        for (i = cur+1; i != cur; i++) {
 556                if (i == MAX_NR_CONSOLES)
 557                        i = 0;
 558                if (vc_cons_allocated(i))
 559                        break;
 560        }
 561        set_console(i);
 562}
 563
 564static void fn_send_intr(struct vc_data *vc)
 565{
 566        struct tty_struct *tty = vc->vc_tty;
 567
 568        if (!tty)
 569                return;
 570        tty_insert_flip_char(tty, 0, TTY_BREAK);
 571        con_schedule_flip(tty);
 572}
 573
 574static void fn_scroll_forw(struct vc_data *vc)
 575{
 576        scrollfront(vc, 0);
 577}
 578
 579static void fn_scroll_back(struct vc_data *vc)
 580{
 581        scrollback(vc, 0);
 582}
 583
 584static void fn_show_mem(struct vc_data *vc)
 585{
 586        show_mem();
 587}
 588
 589static void fn_show_state(struct vc_data *vc)
 590{
 591        show_state();
 592}
 593
 594static void fn_boot_it(struct vc_data *vc)
 595{
 596        ctrl_alt_del();
 597}
 598
 599static void fn_compose(struct vc_data *vc)
 600{
 601        dead_key_next = true;
 602}
 603
 604static void fn_spawn_con(struct vc_data *vc)
 605{
 606        spin_lock(&vt_spawn_con.lock);
 607        if (vt_spawn_con.pid)
 608                if (kill_pid(vt_spawn_con.pid, vt_spawn_con.sig, 1)) {
 609                        put_pid(vt_spawn_con.pid);
 610                        vt_spawn_con.pid = NULL;
 611                }
 612        spin_unlock(&vt_spawn_con.lock);
 613}
 614
 615static void fn_SAK(struct vc_data *vc)
 616{
 617        struct work_struct *SAK_work = &vc_cons[fg_console].SAK_work;
 618        schedule_work(SAK_work);
 619}
 620
 621static void fn_null(struct vc_data *vc)
 622{
 623        compute_shiftstate();
 624}
 625
 626/*
 627 * Special key handlers
 628 */
 629static void k_ignore(struct vc_data *vc, unsigned char value, char up_flag)
 630{
 631}
 632
 633static void k_spec(struct vc_data *vc, unsigned char value, char up_flag)
 634{
 635        if (up_flag)
 636                return;
 637        if (value >= ARRAY_SIZE(fn_handler))
 638                return;
 639        if ((kbd->kbdmode == VC_RAW ||
 640             kbd->kbdmode == VC_MEDIUMRAW) &&
 641             value != KVAL(K_SAK))
 642                return;         /* SAK is allowed even in raw mode */
 643        fn_handler[value](vc);
 644}
 645
 646static void k_lowercase(struct vc_data *vc, unsigned char value, char up_flag)
 647{
 648        pr_err("k_lowercase was called - impossible\n");
 649}
 650
 651static void k_unicode(struct vc_data *vc, unsigned int value, char up_flag)
 652{
 653        if (up_flag)
 654                return;         /* no action, if this is a key release */
 655
 656        if (diacr)
 657                value = handle_diacr(vc, value);
 658
 659        if (dead_key_next) {
 660                dead_key_next = false;
 661                diacr = value;
 662                return;
 663        }
 664        if (kbd->kbdmode == VC_UNICODE)
 665                to_utf8(vc, value);
 666        else {
 667                int c = conv_uni_to_8bit(value);
 668                if (c != -1)
 669                        put_queue(vc, c);
 670        }
 671}
 672
 673/*
 674 * Handle dead key. Note that we now may have several
 675 * dead keys modifying the same character. Very useful
 676 * for Vietnamese.
 677 */
 678static void k_deadunicode(struct vc_data *vc, unsigned int value, char up_flag)
 679{
 680        if (up_flag)
 681                return;
 682
 683        diacr = (diacr ? handle_diacr(vc, value) : value);
 684}
 685
 686static void k_self(struct vc_data *vc, unsigned char value, char up_flag)
 687{
 688        k_unicode(vc, conv_8bit_to_uni(value), up_flag);
 689}
 690
 691static void k_dead2(struct vc_data *vc, unsigned char value, char up_flag)
 692{
 693        k_deadunicode(vc, value, up_flag);
 694}
 695
 696/*
 697 * Obsolete - for backwards compatibility only
 698 */
 699static void k_dead(struct vc_data *vc, unsigned char value, char up_flag)
 700{
 701        static const unsigned char ret_diacr[NR_DEAD] = {'`', '\'', '^', '~', '"', ',' };
 702
 703        k_deadunicode(vc, ret_diacr[value], up_flag);
 704}
 705
 706static void k_cons(struct vc_data *vc, unsigned char value, char up_flag)
 707{
 708        if (up_flag)
 709                return;
 710
 711        set_console(value);
 712}
 713
 714static void k_fn(struct vc_data *vc, unsigned char value, char up_flag)
 715{
 716        if (up_flag)
 717                return;
 718
 719        if ((unsigned)value < ARRAY_SIZE(func_table)) {
 720                if (func_table[value])
 721                        puts_queue(vc, func_table[value]);
 722        } else
 723                pr_err("k_fn called with value=%d\n", value);
 724}
 725
 726static void k_cur(struct vc_data *vc, unsigned char value, char up_flag)
 727{
 728        static const char cur_chars[] = "BDCA";
 729
 730        if (up_flag)
 731                return;
 732
 733        applkey(vc, cur_chars[value], vc_kbd_mode(kbd, VC_CKMODE));
 734}
 735
 736static void k_pad(struct vc_data *vc, unsigned char value, char up_flag)
 737{
 738        static const char pad_chars[] = "0123456789+-*/\015,.?()#";
 739        static const char app_map[] = "pqrstuvwxylSRQMnnmPQS";
 740
 741        if (up_flag)
 742                return;         /* no action, if this is a key release */
 743
 744        /* kludge... shift forces cursor/number keys */
 745        if (vc_kbd_mode(kbd, VC_APPLIC) && !shift_down[KG_SHIFT]) {
 746                applkey(vc, app_map[value], 1);
 747                return;
 748        }
 749
 750        if (!vc_kbd_led(kbd, VC_NUMLOCK)) {
 751
 752                switch (value) {
 753                case KVAL(K_PCOMMA):
 754                case KVAL(K_PDOT):
 755                        k_fn(vc, KVAL(K_REMOVE), 0);
 756                        return;
 757                case KVAL(K_P0):
 758                        k_fn(vc, KVAL(K_INSERT), 0);
 759                        return;
 760                case KVAL(K_P1):
 761                        k_fn(vc, KVAL(K_SELECT), 0);
 762                        return;
 763                case KVAL(K_P2):
 764                        k_cur(vc, KVAL(K_DOWN), 0);
 765                        return;
 766                case KVAL(K_P3):
 767                        k_fn(vc, KVAL(K_PGDN), 0);
 768                        return;
 769                case KVAL(K_P4):
 770                        k_cur(vc, KVAL(K_LEFT), 0);
 771                        return;
 772                case KVAL(K_P6):
 773                        k_cur(vc, KVAL(K_RIGHT), 0);
 774                        return;
 775                case KVAL(K_P7):
 776                        k_fn(vc, KVAL(K_FIND), 0);
 777                        return;
 778                case KVAL(K_P8):
 779                        k_cur(vc, KVAL(K_UP), 0);
 780                        return;
 781                case KVAL(K_P9):
 782                        k_fn(vc, KVAL(K_PGUP), 0);
 783                        return;
 784                case KVAL(K_P5):
 785                        applkey(vc, 'G', vc_kbd_mode(kbd, VC_APPLIC));
 786                        return;
 787                }
 788        }
 789
 790        put_queue(vc, pad_chars[value]);
 791        if (value == KVAL(K_PENTER) && vc_kbd_mode(kbd, VC_CRLF))
 792                put_queue(vc, 10);
 793}
 794
 795static void k_shift(struct vc_data *vc, unsigned char value, char up_flag)
 796{
 797        int old_state = shift_state;
 798
 799        if (rep)
 800                return;
 801        /*
 802         * Mimic typewriter:
 803         * a CapsShift key acts like Shift but undoes CapsLock
 804         */
 805        if (value == KVAL(K_CAPSSHIFT)) {
 806                value = KVAL(K_SHIFT);
 807                if (!up_flag)
 808                        clr_vc_kbd_led(kbd, VC_CAPSLOCK);
 809        }
 810
 811        if (up_flag) {
 812                /*
 813                 * handle the case that two shift or control
 814                 * keys are depressed simultaneously
 815                 */
 816                if (shift_down[value])
 817                        shift_down[value]--;
 818        } else
 819                shift_down[value]++;
 820
 821        if (shift_down[value])
 822                shift_state |= (1 << value);
 823        else
 824                shift_state &= ~(1 << value);
 825
 826        /* kludge */
 827        if (up_flag && shift_state != old_state && npadch != -1) {
 828                if (kbd->kbdmode == VC_UNICODE)
 829                        to_utf8(vc, npadch);
 830                else
 831                        put_queue(vc, npadch & 0xff);
 832                npadch = -1;
 833        }
 834}
 835
 836static void k_meta(struct vc_data *vc, unsigned char value, char up_flag)
 837{
 838        if (up_flag)
 839                return;
 840
 841        if (vc_kbd_mode(kbd, VC_META)) {
 842                put_queue(vc, '\033');
 843                put_queue(vc, value);
 844        } else
 845                put_queue(vc, value | 0x80);
 846}
 847
 848static void k_ascii(struct vc_data *vc, unsigned char value, char up_flag)
 849{
 850        int base;
 851
 852        if (up_flag)
 853                return;
 854
 855        if (value < 10) {
 856                /* decimal input of code, while Alt depressed */
 857                base = 10;
 858        } else {
 859                /* hexadecimal input of code, while AltGr depressed */
 860                value -= 10;
 861                base = 16;
 862        }
 863
 864        if (npadch == -1)
 865                npadch = value;
 866        else
 867                npadch = npadch * base + value;
 868}
 869
 870static void k_lock(struct vc_data *vc, unsigned char value, char up_flag)
 871{
 872        if (up_flag || rep)
 873                return;
 874
 875        chg_vc_kbd_lock(kbd, value);
 876}
 877
 878static void k_slock(struct vc_data *vc, unsigned char value, char up_flag)
 879{
 880        k_shift(vc, value, up_flag);
 881        if (up_flag || rep)
 882                return;
 883
 884        chg_vc_kbd_slock(kbd, value);
 885        /* try to make Alt, oops, AltGr and such work */
 886        if (!key_maps[kbd->lockstate ^ kbd->slockstate]) {
 887                kbd->slockstate = 0;
 888                chg_vc_kbd_slock(kbd, value);
 889        }
 890}
 891
 892/* by default, 300ms interval for combination release */
 893static unsigned brl_timeout = 300;
 894MODULE_PARM_DESC(brl_timeout, "Braille keys release delay in ms (0 for commit on first key release)");
 895module_param(brl_timeout, uint, 0644);
 896
 897static unsigned brl_nbchords = 1;
 898MODULE_PARM_DESC(brl_nbchords, "Number of chords that produce a braille pattern (0 for dead chords)");
 899module_param(brl_nbchords, uint, 0644);
 900
 901static void k_brlcommit(struct vc_data *vc, unsigned int pattern, char up_flag)
 902{
 903        static unsigned long chords;
 904        static unsigned committed;
 905
 906        if (!brl_nbchords)
 907                k_deadunicode(vc, BRL_UC_ROW | pattern, up_flag);
 908        else {
 909                committed |= pattern;
 910                chords++;
 911                if (chords == brl_nbchords) {
 912                        k_unicode(vc, BRL_UC_ROW | committed, up_flag);
 913                        chords = 0;
 914                        committed = 0;
 915                }
 916        }
 917}
 918
 919static void k_brl(struct vc_data *vc, unsigned char value, char up_flag)
 920{
 921        static unsigned pressed, committing;
 922        static unsigned long releasestart;
 923
 924        if (kbd->kbdmode != VC_UNICODE) {
 925                if (!up_flag)
 926                        pr_warning("keyboard mode must be unicode for braille patterns\n");
 927                return;
 928        }
 929
 930        if (!value) {
 931                k_unicode(vc, BRL_UC_ROW, up_flag);
 932                return;
 933        }
 934
 935        if (value > 8)
 936                return;
 937
 938        if (!up_flag) {
 939                pressed |= 1 << (value - 1);
 940                if (!brl_timeout)
 941                        committing = pressed;
 942        } else if (brl_timeout) {
 943                if (!committing ||
 944                    time_after(jiffies,
 945                               releasestart + msecs_to_jiffies(brl_timeout))) {
 946                        committing = pressed;
 947                        releasestart = jiffies;
 948                }
 949                pressed &= ~(1 << (value - 1));
 950                if (!pressed && committing) {
 951                        k_brlcommit(vc, committing, 0);
 952                        committing = 0;
 953                }
 954        } else {
 955                if (committing) {
 956                        k_brlcommit(vc, committing, 0);
 957                        committing = 0;
 958                }
 959                pressed &= ~(1 << (value - 1));
 960        }
 961}
 962
 963/*
 964 * The leds display either (i) the status of NumLock, CapsLock, ScrollLock,
 965 * or (ii) whatever pattern of lights people want to show using KDSETLED,
 966 * or (iii) specified bits of specified words in kernel memory.
 967 */
 968unsigned char getledstate(void)
 969{
 970        return ledstate;
 971}
 972
 973void setledstate(struct kbd_struct *kbd, unsigned int led)
 974{
 975        if (!(led & ~7)) {
 976                ledioctl = led;
 977                kbd->ledmode = LED_SHOW_IOCTL;
 978        } else
 979                kbd->ledmode = LED_SHOW_FLAGS;
 980
 981        set_leds();
 982}
 983
 984static inline unsigned char getleds(void)
 985{
 986        struct kbd_struct *kbd = kbd_table + fg_console;
 987        unsigned char leds;
 988        int i;
 989
 990        if (kbd->ledmode == LED_SHOW_IOCTL)
 991                return ledioctl;
 992
 993        leds = kbd->ledflagstate;
 994
 995        if (kbd->ledmode == LED_SHOW_MEM) {
 996                for (i = 0; i < 3; i++)
 997                        if (ledptrs[i].valid) {
 998                                if (*ledptrs[i].addr & ledptrs[i].mask)
 999                                        leds |= (1 << i);
1000                                else
1001                                        leds &= ~(1 << i);
1002                        }
1003        }
1004        return leds;
1005}
1006
1007static int kbd_update_leds_helper(struct input_handle *handle, void *data)
1008{
1009        unsigned char leds = *(unsigned char *)data;
1010
1011        if (test_bit(EV_LED, handle->dev->evbit)) {
1012                input_inject_event(handle, EV_LED, LED_SCROLLL, !!(leds & 0x01));
1013                input_inject_event(handle, EV_LED, LED_NUML,    !!(leds & 0x02));
1014                input_inject_event(handle, EV_LED, LED_CAPSL,   !!(leds & 0x04));
1015                input_inject_event(handle, EV_SYN, SYN_REPORT, 0);
1016        }
1017
1018        return 0;
1019}
1020
1021/*
1022 * This is the tasklet that updates LED state on all keyboards
1023 * attached to the box. The reason we use tasklet is that we
1024 * need to handle the scenario when keyboard handler is not
1025 * registered yet but we already getting updates form VT to
1026 * update led state.
1027 */
1028static void kbd_bh(unsigned long dummy)
1029{
1030        unsigned char leds = getleds();
1031
1032        if (leds != ledstate) {
1033                input_handler_for_each_handle(&kbd_handler, &leds,
1034                                              kbd_update_leds_helper);
1035                ledstate = leds;
1036        }
1037}
1038
1039DECLARE_TASKLET_DISABLED(keyboard_tasklet, kbd_bh, 0);
1040
1041#if defined(CONFIG_X86) || defined(CONFIG_IA64) || defined(CONFIG_ALPHA) ||\
1042    defined(CONFIG_MIPS) || defined(CONFIG_PPC) || defined(CONFIG_SPARC) ||\
1043    defined(CONFIG_PARISC) || defined(CONFIG_SUPERH) ||\
1044    (defined(CONFIG_ARM) && defined(CONFIG_KEYBOARD_ATKBD) && !defined(CONFIG_ARCH_RPC)) ||\
1045    defined(CONFIG_AVR32)
1046
1047#define HW_RAW(dev) (test_bit(EV_MSC, dev->evbit) && test_bit(MSC_RAW, dev->mscbit) &&\
1048                        ((dev)->id.bustype == BUS_I8042) && ((dev)->id.vendor == 0x0001) && ((dev)->id.product == 0x0001))
1049
1050static const unsigned short x86_keycodes[256] =
1051        { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
1052         16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
1053         32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
1054         48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
1055         64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
1056         80, 81, 82, 83, 84,118, 86, 87, 88,115,120,119,121,112,123, 92,
1057        284,285,309,  0,312, 91,327,328,329,331,333,335,336,337,338,339,
1058        367,288,302,304,350, 89,334,326,267,126,268,269,125,347,348,349,
1059        360,261,262,263,268,376,100,101,321,316,373,286,289,102,351,355,
1060        103,104,105,275,287,279,258,106,274,107,294,364,358,363,362,361,
1061        291,108,381,281,290,272,292,305,280, 99,112,257,306,359,113,114,
1062        264,117,271,374,379,265,266, 93, 94, 95, 85,259,375,260, 90,116,
1063        377,109,111,277,278,282,283,295,296,297,299,300,301,293,303,307,
1064        308,310,313,314,315,317,318,319,320,357,322,323,324,325,276,330,
1065        332,340,365,342,343,344,345,346,356,270,341,368,369,370,371,372 };
1066
1067#ifdef CONFIG_SPARC
1068static int sparc_l1_a_state;
1069extern void sun_do_break(void);
1070#endif
1071
1072static int emulate_raw(struct vc_data *vc, unsigned int keycode,
1073                       unsigned char up_flag)
1074{
1075        int code;
1076
1077        switch (keycode) {
1078
1079        case KEY_PAUSE:
1080                put_queue(vc, 0xe1);
1081                put_queue(vc, 0x1d | up_flag);
1082                put_queue(vc, 0x45 | up_flag);
1083                break;
1084
1085        case KEY_HANGEUL:
1086                if (!up_flag)
1087                        put_queue(vc, 0xf2);
1088                break;
1089
1090        case KEY_HANJA:
1091                if (!up_flag)
1092                        put_queue(vc, 0xf1);
1093                break;
1094
1095        case KEY_SYSRQ:
1096                /*
1097                 * Real AT keyboards (that's what we're trying
1098                 * to emulate here emit 0xe0 0x2a 0xe0 0x37 when
1099                 * pressing PrtSc/SysRq alone, but simply 0x54
1100                 * when pressing Alt+PrtSc/SysRq.
1101                 */
1102                if (test_bit(KEY_LEFTALT, key_down) ||
1103                    test_bit(KEY_RIGHTALT, key_down)) {
1104                        put_queue(vc, 0x54 | up_flag);
1105                } else {
1106                        put_queue(vc, 0xe0);
1107                        put_queue(vc, 0x2a | up_flag);
1108                        put_queue(vc, 0xe0);
1109                        put_queue(vc, 0x37 | up_flag);
1110                }
1111                break;
1112
1113        default:
1114                if (keycode > 255)
1115                        return -1;
1116
1117                code = x86_keycodes[keycode];
1118                if (!code)
1119                        return -1;
1120
1121                if (code & 0x100)
1122                        put_queue(vc, 0xe0);
1123                put_queue(vc, (code & 0x7f) | up_flag);
1124
1125                break;
1126        }
1127
1128        return 0;
1129}
1130
1131#else
1132
1133#define HW_RAW(dev)     0
1134
1135static int emulate_raw(struct vc_data *vc, unsigned int keycode, unsigned char up_flag)
1136{
1137        if (keycode > 127)
1138                return -1;
1139
1140        put_queue(vc, keycode | up_flag);
1141        return 0;
1142}
1143#endif
1144
1145static void kbd_rawcode(unsigned char data)
1146{
1147        struct vc_data *vc = vc_cons[fg_console].d;
1148
1149        kbd = kbd_table + vc->vc_num;
1150        if (kbd->kbdmode == VC_RAW)
1151                put_queue(vc, data);
1152}
1153
1154static void kbd_keycode(unsigned int keycode, int down, int hw_raw)
1155{
1156        struct vc_data *vc = vc_cons[fg_console].d;
1157        unsigned short keysym, *key_map;
1158        unsigned char type;
1159        bool raw_mode;
1160        struct tty_struct *tty;
1161        int shift_final;
1162        struct keyboard_notifier_param param = { .vc = vc, .value = keycode, .down = down };
1163        int rc;
1164
1165        tty = vc->vc_tty;
1166
1167        if (tty && (!tty->driver_data)) {
1168                /* No driver data? Strange. Okay we fix it then. */
1169                tty->driver_data = vc;
1170        }
1171
1172        kbd = kbd_table + vc->vc_num;
1173
1174#ifdef CONFIG_SPARC
1175        if (keycode == KEY_STOP)
1176                sparc_l1_a_state = down;
1177#endif
1178
1179        rep = (down == 2);
1180
1181        raw_mode = (kbd->kbdmode == VC_RAW);
1182        if (raw_mode && !hw_raw)
1183                if (emulate_raw(vc, keycode, !down << 7))
1184                        if (keycode < BTN_MISC && printk_ratelimit())
1185                                pr_warning("can't emulate rawmode for keycode %d\n",
1186                                           keycode);
1187
1188#ifdef CONFIG_SPARC
1189        if (keycode == KEY_A && sparc_l1_a_state) {
1190                sparc_l1_a_state = false;
1191                sun_do_break();
1192        }
1193#endif
1194
1195        if (kbd->kbdmode == VC_MEDIUMRAW) {
1196                /*
1197                 * This is extended medium raw mode, with keys above 127
1198                 * encoded as 0, high 7 bits, low 7 bits, with the 0 bearing
1199                 * the 'up' flag if needed. 0 is reserved, so this shouldn't
1200                 * interfere with anything else. The two bytes after 0 will
1201                 * always have the up flag set not to interfere with older
1202                 * applications. This allows for 16384 different keycodes,
1203                 * which should be enough.
1204                 */
1205                if (keycode < 128) {
1206                        put_queue(vc, keycode | (!down << 7));
1207                } else {
1208                        put_queue(vc, !down << 7);
1209                        put_queue(vc, (keycode >> 7) | 0x80);
1210                        put_queue(vc, keycode | 0x80);
1211                }
1212                raw_mode = true;
1213        }
1214
1215        if (down)
1216                set_bit(keycode, key_down);
1217        else
1218                clear_bit(keycode, key_down);
1219
1220        if (rep &&
1221            (!vc_kbd_mode(kbd, VC_REPEAT) ||
1222             (tty && !L_ECHO(tty) && tty_chars_in_buffer(tty)))) {
1223                /*
1224                 * Don't repeat a key if the input buffers are not empty and the
1225                 * characters get aren't echoed locally. This makes key repeat
1226                 * usable with slow applications and under heavy loads.
1227                 */
1228                return;
1229        }
1230
1231        param.shift = shift_final = (shift_state | kbd->slockstate) ^ kbd->lockstate;
1232        param.ledstate = kbd->ledflagstate;
1233        key_map = key_maps[shift_final];
1234
1235        rc = atomic_notifier_call_chain(&keyboard_notifier_list,
1236                                        KBD_KEYCODE, &param);
1237        if (rc == NOTIFY_STOP || !key_map) {
1238                atomic_notifier_call_chain(&keyboard_notifier_list,
1239                                           KBD_UNBOUND_KEYCODE, &param);
1240                compute_shiftstate();
1241                kbd->slockstate = 0;
1242                return;
1243        }
1244
1245        if (keycode < NR_KEYS)
1246                keysym = key_map[keycode];
1247        else if (keycode >= KEY_BRL_DOT1 && keycode <= KEY_BRL_DOT8)
1248                keysym = U(K(KT_BRL, keycode - KEY_BRL_DOT1 + 1));
1249        else
1250                return;
1251
1252        type = KTYP(keysym);
1253
1254        if (type < 0xf0) {
1255                param.value = keysym;
1256                rc = atomic_notifier_call_chain(&keyboard_notifier_list,
1257                                                KBD_UNICODE, &param);
1258                if (rc != NOTIFY_STOP)
1259                        if (down && !raw_mode)
1260                                to_utf8(vc, keysym);
1261                return;
1262        }
1263
1264        type -= 0xf0;
1265
1266        if (type == KT_LETTER) {
1267                type = KT_LATIN;
1268                if (vc_kbd_led(kbd, VC_CAPSLOCK)) {
1269                        key_map = key_maps[shift_final ^ (1 << KG_SHIFT)];
1270                        if (key_map)
1271                                keysym = key_map[keycode];
1272                }
1273        }
1274
1275        param.value = keysym;
1276        rc = atomic_notifier_call_chain(&keyboard_notifier_list,
1277                                        KBD_KEYSYM, &param);
1278        if (rc == NOTIFY_STOP)
1279                return;
1280
1281        if (raw_mode && type != KT_SPEC && type != KT_SHIFT)
1282                return;
1283
1284        (*k_handler[type])(vc, keysym & 0xff, !down);
1285
1286        param.ledstate = kbd->ledflagstate;
1287        atomic_notifier_call_chain(&keyboard_notifier_list, KBD_POST_KEYSYM, &param);
1288
1289        if (type != KT_SLOCK)
1290                kbd->slockstate = 0;
1291}
1292
1293static void kbd_event(struct input_handle *handle, unsigned int event_type,
1294                      unsigned int event_code, int value)
1295{
1296        /* We are called with interrupts disabled, just take the lock */
1297        spin_lock(&kbd_event_lock);
1298
1299        if (event_type == EV_MSC && event_code == MSC_RAW && HW_RAW(handle->dev))
1300                kbd_rawcode(value);
1301        if (event_type == EV_KEY)
1302                kbd_keycode(event_code, value, HW_RAW(handle->dev));
1303
1304        spin_unlock(&kbd_event_lock);
1305
1306        tasklet_schedule(&keyboard_tasklet);
1307        do_poke_blanked_console = 1;
1308        schedule_console_callback();
1309}
1310
1311static bool kbd_match(struct input_handler *handler, struct input_dev *dev)
1312{
1313        int i;
1314
1315        if (test_bit(EV_SND, dev->evbit))
1316                return true;
1317
1318        if (test_bit(EV_KEY, dev->evbit))
1319                for (i = KEY_RESERVED; i < BTN_MISC; i++)
1320                        if (test_bit(i, dev->keybit))
1321                                return true;
1322
1323        return false;
1324}
1325
1326/*
1327 * When a keyboard (or other input device) is found, the kbd_connect
1328 * function is called. The function then looks at the device, and if it
1329 * likes it, it can open it and get events from it. In this (kbd_connect)
1330 * function, we should decide which VT to bind that keyboard to initially.
1331 */
1332static int kbd_connect(struct input_handler *handler, struct input_dev *dev,
1333                        const struct input_device_id *id)
1334{
1335        struct input_handle *handle;
1336        int error;
1337
1338        handle = kzalloc(sizeof(struct input_handle), GFP_KERNEL);
1339        if (!handle)
1340                return -ENOMEM;
1341
1342        handle->dev = dev;
1343        handle->handler = handler;
1344        handle->name = "kbd";
1345
1346        error = input_register_handle(handle);
1347        if (error)
1348                goto err_free_handle;
1349
1350        error = input_open_device(handle);
1351        if (error)
1352                goto err_unregister_handle;
1353
1354        return 0;
1355
1356 err_unregister_handle:
1357        input_unregister_handle(handle);
1358 err_free_handle:
1359        kfree(handle);
1360        return error;
1361}
1362
1363static void kbd_disconnect(struct input_handle *handle)
1364{
1365        input_close_device(handle);
1366        input_unregister_handle(handle);
1367        kfree(handle);
1368}
1369
1370/*
1371 * Start keyboard handler on the new keyboard by refreshing LED state to
1372 * match the rest of the system.
1373 */
1374static void kbd_start(struct input_handle *handle)
1375{
1376        tasklet_disable(&keyboard_tasklet);
1377
1378        if (ledstate != 0xff)
1379                kbd_update_leds_helper(handle, &ledstate);
1380
1381        tasklet_enable(&keyboard_tasklet);
1382}
1383
1384static const struct input_device_id kbd_ids[] = {
1385        {
1386                .flags = INPUT_DEVICE_ID_MATCH_EVBIT,
1387                .evbit = { BIT_MASK(EV_KEY) },
1388        },
1389
1390        {
1391                .flags = INPUT_DEVICE_ID_MATCH_EVBIT,
1392                .evbit = { BIT_MASK(EV_SND) },
1393        },
1394
1395        { },    /* Terminating entry */
1396};
1397
1398MODULE_DEVICE_TABLE(input, kbd_ids);
1399
1400static struct input_handler kbd_handler = {
1401        .event          = kbd_event,
1402        .match          = kbd_match,
1403        .connect        = kbd_connect,
1404        .disconnect     = kbd_disconnect,
1405        .start          = kbd_start,
1406        .name           = "kbd",
1407        .id_table       = kbd_ids,
1408};
1409
1410int __init kbd_init(void)
1411{
1412        int i;
1413        int error;
1414
1415        for (i = 0; i < MAX_NR_CONSOLES; i++) {
1416                kbd_table[i].ledflagstate = KBD_DEFLEDS;
1417                kbd_table[i].default_ledflagstate = KBD_DEFLEDS;
1418                kbd_table[i].ledmode = LED_SHOW_FLAGS;
1419                kbd_table[i].lockstate = KBD_DEFLOCK;
1420                kbd_table[i].slockstate = 0;
1421                kbd_table[i].modeflags = KBD_DEFMODE;
1422                kbd_table[i].kbdmode = default_utf8 ? VC_UNICODE : VC_XLATE;
1423        }
1424
1425        error = input_register_handler(&kbd_handler);
1426        if (error)
1427                return error;
1428
1429        tasklet_enable(&keyboard_tasklet);
1430        tasklet_schedule(&keyboard_tasklet);
1431
1432        return 0;
1433}
1434
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.