[PATCH] m68k: restore amikbd compatibility with 2.4
Dump the extra mapping in the amikbd interrupt handler, so old Amiga keymaps work again. Amigas need a special keymap anyway, standard keymaps are not usable and recreating all keymaps is simply not worth the trouble. Signed-off-by: Roman Zippel <zippel@linux-m68k.org> Cc: Dmitry Torokhov <dtor_core@ameritech.net> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
cb7d390df3
commit
5fa28ea42f
1 changed files with 21 additions and 11 deletions
|
@ -36,6 +36,7 @@
|
|||
#include <linux/input.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/keyboard.h>
|
||||
|
||||
#include <asm/amigaints.h>
|
||||
#include <asm/amigahw.h>
|
||||
|
@ -45,7 +46,7 @@ MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
|
|||
MODULE_DESCRIPTION("Amiga keyboard driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static unsigned char amikbd_keycode[0x78] = {
|
||||
static unsigned char amikbd_keycode[0x78] __initdata = {
|
||||
[0] = KEY_GRAVE,
|
||||
[1] = KEY_1,
|
||||
[2] = KEY_2,
|
||||
|
@ -170,12 +171,9 @@ static irqreturn_t amikbd_interrupt(int irq, void *dummy, struct pt_regs *fp)
|
|||
scancode >>= 1;
|
||||
|
||||
if (scancode < 0x78) { /* scancodes < 0x78 are keys */
|
||||
|
||||
scancode = amikbd_keycode[scancode];
|
||||
|
||||
input_regs(amikbd_dev, fp);
|
||||
|
||||
if (scancode == KEY_CAPSLOCK) { /* CapsLock is a toggle switch key on Amiga */
|
||||
if (scancode == 98) { /* CapsLock is a toggle switch key on Amiga */
|
||||
input_report_key(amikbd_dev, scancode, 1);
|
||||
input_report_key(amikbd_dev, scancode, 0);
|
||||
} else {
|
||||
|
@ -191,7 +189,7 @@ static irqreturn_t amikbd_interrupt(int irq, void *dummy, struct pt_regs *fp)
|
|||
|
||||
static int __init amikbd_init(void)
|
||||
{
|
||||
int i;
|
||||
int i, j;
|
||||
|
||||
if (!AMIGAHW_PRESENT(AMI_KEYBOARD))
|
||||
return -EIO;
|
||||
|
@ -214,14 +212,26 @@ static int __init amikbd_init(void)
|
|||
amikbd_dev->id.version = 0x0100;
|
||||
|
||||
amikbd_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
|
||||
amikbd_dev->keycode = amikbd_keycode;
|
||||
amikbd_dev->keycodesize = sizeof(unsigned char);
|
||||
amikbd_dev->keycodemax = ARRAY_SIZE(amikbd_keycode);
|
||||
|
||||
for (i = 0; i < 0x78; i++)
|
||||
if (amikbd_keycode[i])
|
||||
set_bit(amikbd_keycode[i], amikbd_dev->keybit);
|
||||
set_bit(i, amikbd_dev->keybit);
|
||||
|
||||
for (i = 0; i < MAX_NR_KEYMAPS; i++) {
|
||||
static u_short temp_map[NR_KEYS] __initdata;
|
||||
if (!key_maps[i])
|
||||
continue;
|
||||
memset(temp_map, 0, sizeof(temp_map));
|
||||
for (j = 0; j < 0x78; j++) {
|
||||
if (!amikbd_keycode[j])
|
||||
continue;
|
||||
temp_map[j] = key_maps[i][amikbd_keycode[j]];
|
||||
}
|
||||
for (j = 0; j < NR_KEYS; j++) {
|
||||
if (!temp_map[j])
|
||||
temp_map[j] = 0xf200;
|
||||
}
|
||||
memcpy(key_maps[i], temp_map, sizeof(temp_map));
|
||||
}
|
||||
ciaa.cra &= ~0x41; /* serial data in, turn off TA */
|
||||
request_irq(IRQ_AMIGA_CIAA_SP, amikbd_interrupt, 0, "amikbd", amikbd_interrupt);
|
||||
|
||||
|
|
Loading…
Reference in a new issue