diff options
Diffstat (limited to 'drivers/input/keyboard/amikbd.c')
-rw-r--r-- | drivers/input/keyboard/amikbd.c | 59 |
1 files changed, 29 insertions, 30 deletions
diff --git a/drivers/input/keyboard/amikbd.c b/drivers/input/keyboard/amikbd.c index 4e8e8ea214ab..3d63bc1ad322 100644 --- a/drivers/input/keyboard/amikbd.c +++ b/drivers/input/keyboard/amikbd.c | |||
@@ -155,10 +155,7 @@ static const char *amikbd_messages[8] = { | |||
155 | [7] = KERN_WARNING "amikbd: keyboard interrupt\n" | 155 | [7] = KERN_WARNING "amikbd: keyboard interrupt\n" |
156 | }; | 156 | }; |
157 | 157 | ||
158 | static struct input_dev amikbd_dev; | 158 | static struct input_dev *amikbd_dev; |
159 | |||
160 | static char *amikbd_name = "Amiga keyboard"; | ||
161 | static char *amikbd_phys = "amikbd/input0"; | ||
162 | 159 | ||
163 | static irqreturn_t amikbd_interrupt(int irq, void *dummy, struct pt_regs *fp) | 160 | static irqreturn_t amikbd_interrupt(int irq, void *dummy, struct pt_regs *fp) |
164 | { | 161 | { |
@@ -176,16 +173,16 @@ static irqreturn_t amikbd_interrupt(int irq, void *dummy, struct pt_regs *fp) | |||
176 | 173 | ||
177 | scancode = amikbd_keycode[scancode]; | 174 | scancode = amikbd_keycode[scancode]; |
178 | 175 | ||
179 | input_regs(&amikbd_dev, fp); | 176 | input_regs(amikbd_dev, fp); |
180 | 177 | ||
181 | if (scancode == KEY_CAPSLOCK) { /* CapsLock is a toggle switch key on Amiga */ | 178 | if (scancode == KEY_CAPSLOCK) { /* CapsLock is a toggle switch key on Amiga */ |
182 | input_report_key(&amikbd_dev, scancode, 1); | 179 | input_report_key(amikbd_dev, scancode, 1); |
183 | input_report_key(&amikbd_dev, scancode, 0); | 180 | input_report_key(amikbd_dev, scancode, 0); |
184 | input_sync(&amikbd_dev); | ||
185 | } else { | 181 | } else { |
186 | input_report_key(&amikbd_dev, scancode, down); | 182 | input_report_key(amikbd_dev, scancode, down); |
187 | input_sync(&amikbd_dev); | ||
188 | } | 183 | } |
184 | |||
185 | input_sync(amikbd_dev); | ||
189 | } else /* scancodes >= 0x78 are error codes */ | 186 | } else /* scancodes >= 0x78 are error codes */ |
190 | printk(amikbd_messages[scancode - 0x78]); | 187 | printk(amikbd_messages[scancode - 0x78]); |
191 | 188 | ||
@@ -202,39 +199,41 @@ static int __init amikbd_init(void) | |||
202 | if (!request_mem_region(CIAA_PHYSADDR-1+0xb00, 0x100, "amikeyb")) | 199 | if (!request_mem_region(CIAA_PHYSADDR-1+0xb00, 0x100, "amikeyb")) |
203 | return -EBUSY; | 200 | return -EBUSY; |
204 | 201 | ||
205 | init_input_dev(&amikbd_dev); | 202 | amikbd_dev = input_dev_allocate(); |
206 | 203 | if (!amikbd_dev) { | |
207 | amikbd_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REP); | 204 | printk(KERN_ERR "amikbd: not enough memory for input device\n"); |
208 | amikbd_dev.keycode = amikbd_keycode; | 205 | release_mem_region(CIAA_PHYSADDR - 1 + 0xb00, 0x100); |
209 | amikbd_dev.keycodesize = sizeof(unsigned char); | 206 | return -ENOMEM; |
210 | amikbd_dev.keycodemax = ARRAY_SIZE(amikbd_keycode); | 207 | } |
208 | |||
209 | amikbd_dev->name = "Amiga Keyboard"; | ||
210 | amikbd_dev->phys = "amikbd/input0"; | ||
211 | amikbd_dev->id.bustype = BUS_AMIGA; | ||
212 | amikbd_dev->id.vendor = 0x0001; | ||
213 | amikbd_dev->id.product = 0x0001; | ||
214 | amikbd_dev->id.version = 0x0100; | ||
215 | |||
216 | amikbd_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); | ||
217 | amikbd_dev->keycode = amikbd_keycode; | ||
218 | amikbd_dev->keycodesize = sizeof(unsigned char); | ||
219 | amikbd_dev->keycodemax = ARRAY_SIZE(amikbd_keycode); | ||
211 | 220 | ||
212 | for (i = 0; i < 0x78; i++) | 221 | for (i = 0; i < 0x78; i++) |
213 | if (amikbd_keycode[i]) | 222 | if (amikbd_keycode[i]) |
214 | set_bit(amikbd_keycode[i], amikbd_dev.keybit); | 223 | set_bit(amikbd_keycode[i], amikbd_dev->keybit); |
215 | 224 | ||
216 | ciaa.cra &= ~0x41; /* serial data in, turn off TA */ | 225 | ciaa.cra &= ~0x41; /* serial data in, turn off TA */ |
217 | request_irq(IRQ_AMIGA_CIAA_SP, amikbd_interrupt, 0, "amikbd", amikbd_interrupt); | 226 | request_irq(IRQ_AMIGA_CIAA_SP, amikbd_interrupt, 0, "amikbd", amikbd_interrupt); |
218 | 227 | ||
219 | amikbd_dev.name = amikbd_name; | 228 | input_register_device(amikbd_dev); |
220 | amikbd_dev.phys = amikbd_phys; | ||
221 | amikbd_dev.id.bustype = BUS_AMIGA; | ||
222 | amikbd_dev.id.vendor = 0x0001; | ||
223 | amikbd_dev.id.product = 0x0001; | ||
224 | amikbd_dev.id.version = 0x0100; | ||
225 | |||
226 | input_register_device(&amikbd_dev); | ||
227 | |||
228 | printk(KERN_INFO "input: %s\n", amikbd_name); | ||
229 | |||
230 | return 0; | 229 | return 0; |
231 | } | 230 | } |
232 | 231 | ||
233 | static void __exit amikbd_exit(void) | 232 | static void __exit amikbd_exit(void) |
234 | { | 233 | { |
235 | input_unregister_device(&amikbd_dev); | ||
236 | free_irq(IRQ_AMIGA_CIAA_SP, amikbd_interrupt); | 234 | free_irq(IRQ_AMIGA_CIAA_SP, amikbd_interrupt); |
237 | release_mem_region(CIAA_PHYSADDR-1+0xb00, 0x100); | 235 | input_unregister_device(amikbd_dev); |
236 | release_mem_region(CIAA_PHYSADDR - 1 + 0xb00, 0x100); | ||
238 | } | 237 | } |
239 | 238 | ||
240 | module_init(amikbd_init); | 239 | module_init(amikbd_init); |