Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5fa28ea4 authored by Roman Zippel's avatar Roman Zippel Committed by Linus Torvalds
Browse files

[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: default avatarRoman Zippel <zippel@linux-m68k.org>
Cc: Dmitry Torokhov <dtor_core@ameritech.net>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent cb7d390d
Loading
Loading
Loading
Loading
+22 −12
Original line number Diff line number Diff line
@@ -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);