diff options
Diffstat (limited to 'drivers/char/pc_keyb.c')
-rw-r--r-- | drivers/char/pc_keyb.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/drivers/char/pc_keyb.c b/drivers/char/pc_keyb.c index 2acab7d8f..1118cf950 100644 --- a/drivers/char/pc_keyb.c +++ b/drivers/char/pc_keyb.c @@ -37,6 +37,8 @@ #include <asm/irq.h> #include <asm/system.h> +#include <asm/io.h> + /* Some configuration switches are present in the include file... */ #include <linux/pc_keyb.h> @@ -100,7 +102,6 @@ static unsigned char mouse_reply_expected = 0; static void kb_wait(void) { unsigned long timeout = KBC_TIMEOUT; - unsigned char status; do { /* @@ -404,7 +405,7 @@ static inline void handle_mouse_event(unsigned char scancode) if (head != queue->tail) { queue->head = head; if (queue->fasync) - kill_fasync(queue->fasync, SIGIO); + kill_fasync(queue->fasync, SIGIO, POLL_IN); wake_up_interruptible(&queue->proc_list); } } @@ -421,32 +422,43 @@ static inline void handle_mouse_event(unsigned char scancode) static unsigned char handle_kbd_event(void) { unsigned char status = kbd_read_status(); + unsigned int work = 10000; while (status & KBD_STAT_OBF) { unsigned char scancode; scancode = kbd_read_input(); - if (status & KBD_STAT_MOUSE_OBF) { handle_mouse_event(scancode); } else { +#ifdef CONFIG_VT if (do_acknowledge(scancode)) handle_scancode(scancode, !(scancode & 0x80)); +#endif mark_bh(KEYBOARD_BH); } status = kbd_read_status(); + + if(!work--) + { + printk(KERN_ERR "pc_keyb: controller jammed (0x%02X).\n", + status); + break; + } } return status; } + static void keyboard_interrupt(int irq, void *dev_id, struct pt_regs *regs) { unsigned long flags; +#ifdef CONFIG_VT kbd_pt_regs = regs; - +#endif spin_lock_irqsave(&kbd_controller_lock, flags); handle_kbd_event(); spin_unlock_irqrestore(&kbd_controller_lock, flags); @@ -660,9 +672,9 @@ static char * __init initialize_kbd(void) kbd_write_command_w(KBD_CCMD_WRITE_MODE); kbd_write_output_w(KBD_MODE_KBD_INT - | KBD_MODE_SYS - | KBD_MODE_DISABLE_MOUSE - | KBD_MODE_KCC); + | KBD_MODE_SYS + | KBD_MODE_DISABLE_MOUSE + | KBD_MODE_KCC); /* ibm powerpc portables need this to use scan-code set 1 -- Cort */ kbd_write_command_w(KBD_CCMD_READ_MODE); @@ -697,6 +709,8 @@ static char * __init initialize_kbd(void) void __init pckbd_init_hw(void) { + kbd_request_region(); + /* Flush any pending input. */ kbd_clear_input(); @@ -832,7 +846,7 @@ static int release_aux(struct inode * inode, struct file * file) return 0; kbd_write_cmd(AUX_INTS_OFF); /* Disable controller ints */ kbd_write_command_w(KBD_CCMD_MOUSE_DISABLE); - aux_free_irq(inode); + aux_free_irq(AUX_DEV); return 0; } @@ -847,7 +861,7 @@ static int open_aux(struct inode * inode, struct file * file) return 0; } queue->head = queue->tail = 0; /* Flush input queue */ - if (aux_request_irq(keyboard_interrupt, inode)) { + if (aux_request_irq(keyboard_interrupt, AUX_DEV)) { aux_count--; return -EBUSY; } |