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