diff options
Diffstat (limited to 'drivers/char/keyboard.c')
-rw-r--r-- | drivers/char/keyboard.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/drivers/char/keyboard.c b/drivers/char/keyboard.c index edd996f6fb87..4bb3d2272604 100644 --- a/drivers/char/keyboard.c +++ b/drivers/char/keyboard.c | |||
@@ -151,6 +151,7 @@ unsigned char kbd_sysrq_xlate[KEY_MAX + 1] = | |||
151 | "230\177\000\000\213\214\000\000\000\000\000\000\000\000\000\000" /* 0x50 - 0x5f */ | 151 | "230\177\000\000\213\214\000\000\000\000\000\000\000\000\000\000" /* 0x50 - 0x5f */ |
152 | "\r\000/"; /* 0x60 - 0x6f */ | 152 | "\r\000/"; /* 0x60 - 0x6f */ |
153 | static int sysrq_down; | 153 | static int sysrq_down; |
154 | static int sysrq_alt_use; | ||
154 | #endif | 155 | #endif |
155 | static int sysrq_alt; | 156 | static int sysrq_alt; |
156 | 157 | ||
@@ -673,7 +674,7 @@ static void k_dead2(struct vc_data *vc, unsigned char value, char up_flag, struc | |||
673 | */ | 674 | */ |
674 | static void k_dead(struct vc_data *vc, unsigned char value, char up_flag, struct pt_regs *regs) | 675 | static void k_dead(struct vc_data *vc, unsigned char value, char up_flag, struct pt_regs *regs) |
675 | { | 676 | { |
676 | static unsigned char ret_diacr[NR_DEAD] = {'`', '\'', '^', '~', '"', ',' }; | 677 | static const unsigned char ret_diacr[NR_DEAD] = {'`', '\'', '^', '~', '"', ',' }; |
677 | value = ret_diacr[value]; | 678 | value = ret_diacr[value]; |
678 | k_deadunicode(vc, value, up_flag, regs); | 679 | k_deadunicode(vc, value, up_flag, regs); |
679 | } | 680 | } |
@@ -710,8 +711,8 @@ static void k_cur(struct vc_data *vc, unsigned char value, char up_flag, struct | |||
710 | 711 | ||
711 | static void k_pad(struct vc_data *vc, unsigned char value, char up_flag, struct pt_regs *regs) | 712 | static void k_pad(struct vc_data *vc, unsigned char value, char up_flag, struct pt_regs *regs) |
712 | { | 713 | { |
713 | static const char *pad_chars = "0123456789+-*/\015,.?()#"; | 714 | static const char pad_chars[] = "0123456789+-*/\015,.?()#"; |
714 | static const char *app_map = "pqrstuvwxylSRQMnnmPQS"; | 715 | static const char app_map[] = "pqrstuvwxylSRQMnnmPQS"; |
715 | 716 | ||
716 | if (up_flag) | 717 | if (up_flag) |
717 | return; /* no action, if this is a key release */ | 718 | return; /* no action, if this is a key release */ |
@@ -1036,7 +1037,7 @@ static void kbd_refresh_leds(struct input_handle *handle) | |||
1036 | #define HW_RAW(dev) (test_bit(EV_MSC, dev->evbit) && test_bit(MSC_RAW, dev->mscbit) &&\ | 1037 | #define HW_RAW(dev) (test_bit(EV_MSC, dev->evbit) && test_bit(MSC_RAW, dev->mscbit) &&\ |
1037 | ((dev)->id.bustype == BUS_I8042) && ((dev)->id.vendor == 0x0001) && ((dev)->id.product == 0x0001)) | 1038 | ((dev)->id.bustype == BUS_I8042) && ((dev)->id.vendor == 0x0001) && ((dev)->id.product == 0x0001)) |
1038 | 1039 | ||
1039 | static unsigned short x86_keycodes[256] = | 1040 | static const unsigned short x86_keycodes[256] = |
1040 | { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, | 1041 | { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, |
1041 | 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 1042 | 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, |
1042 | 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, | 1043 | 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, |
@@ -1074,11 +1075,13 @@ static int emulate_raw(struct vc_data *vc, unsigned int keycode, | |||
1074 | put_queue(vc, 0x1d | up_flag); | 1075 | put_queue(vc, 0x1d | up_flag); |
1075 | put_queue(vc, 0x45 | up_flag); | 1076 | put_queue(vc, 0x45 | up_flag); |
1076 | return 0; | 1077 | return 0; |
1077 | case KEY_HANGUEL: | 1078 | case KEY_HANGEUL: |
1078 | if (!up_flag) put_queue(vc, 0xf1); | 1079 | if (!up_flag) |
1080 | put_queue(vc, 0xf2); | ||
1079 | return 0; | 1081 | return 0; |
1080 | case KEY_HANJA: | 1082 | case KEY_HANJA: |
1081 | if (!up_flag) put_queue(vc, 0xf2); | 1083 | if (!up_flag) |
1084 | put_queue(vc, 0xf1); | ||
1082 | return 0; | 1085 | return 0; |
1083 | } | 1086 | } |
1084 | 1087 | ||
@@ -1143,7 +1146,7 @@ static void kbd_keycode(unsigned int keycode, int down, | |||
1143 | kbd = kbd_table + fg_console; | 1146 | kbd = kbd_table + fg_console; |
1144 | 1147 | ||
1145 | if (keycode == KEY_LEFTALT || keycode == KEY_RIGHTALT) | 1148 | if (keycode == KEY_LEFTALT || keycode == KEY_RIGHTALT) |
1146 | sysrq_alt = down; | 1149 | sysrq_alt = down ? keycode : 0; |
1147 | #ifdef CONFIG_SPARC | 1150 | #ifdef CONFIG_SPARC |
1148 | if (keycode == KEY_STOP) | 1151 | if (keycode == KEY_STOP) |
1149 | sparc_l1_a_state = down; | 1152 | sparc_l1_a_state = down; |
@@ -1163,9 +1166,14 @@ static void kbd_keycode(unsigned int keycode, int down, | |||
1163 | 1166 | ||
1164 | #ifdef CONFIG_MAGIC_SYSRQ /* Handle the SysRq Hack */ | 1167 | #ifdef CONFIG_MAGIC_SYSRQ /* Handle the SysRq Hack */ |
1165 | if (keycode == KEY_SYSRQ && (sysrq_down || (down == 1 && sysrq_alt))) { | 1168 | if (keycode == KEY_SYSRQ && (sysrq_down || (down == 1 && sysrq_alt))) { |
1166 | sysrq_down = down; | 1169 | if (!sysrq_down) { |
1170 | sysrq_down = down; | ||
1171 | sysrq_alt_use = sysrq_alt; | ||
1172 | } | ||
1167 | return; | 1173 | return; |
1168 | } | 1174 | } |
1175 | if (sysrq_down && !down && keycode == sysrq_alt_use) | ||
1176 | sysrq_down = 0; | ||
1169 | if (sysrq_down && down && !rep) { | 1177 | if (sysrq_down && down && !rep) { |
1170 | handle_sysrq(kbd_sysrq_xlate[keycode], regs, tty); | 1178 | handle_sysrq(kbd_sysrq_xlate[keycode], regs, tty); |
1171 | return; | 1179 | return; |