diff options
Diffstat (limited to 'drivers/input/serio/i8042.c')
-rw-r--r-- | drivers/input/serio/i8042.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c index 1bb0c76a9259..7e3141f37e32 100644 --- a/drivers/input/serio/i8042.c +++ b/drivers/input/serio/i8042.c | |||
@@ -106,9 +106,10 @@ static unsigned char i8042_ctr; | |||
106 | static unsigned char i8042_mux_present; | 106 | static unsigned char i8042_mux_present; |
107 | static unsigned char i8042_kbd_irq_registered; | 107 | static unsigned char i8042_kbd_irq_registered; |
108 | static unsigned char i8042_aux_irq_registered; | 108 | static unsigned char i8042_aux_irq_registered; |
109 | static unsigned char i8042_suppress_kbd_ack; | ||
109 | static struct platform_device *i8042_platform_device; | 110 | static struct platform_device *i8042_platform_device; |
110 | 111 | ||
111 | static irqreturn_t i8042_interrupt(int irq, void *dev_id, struct pt_regs *regs); | 112 | static irqreturn_t i8042_interrupt(int irq, void *dev_id); |
112 | 113 | ||
113 | /* | 114 | /* |
114 | * The i8042_wait_read() and i8042_wait_write functions wait for the i8042 to | 115 | * The i8042_wait_read() and i8042_wait_write functions wait for the i8042 to |
@@ -271,7 +272,7 @@ static int i8042_aux_write(struct serio *serio, unsigned char c) | |||
271 | * characters later. | 272 | * characters later. |
272 | */ | 273 | */ |
273 | 274 | ||
274 | i8042_interrupt(0, NULL, NULL); | 275 | i8042_interrupt(0, NULL); |
275 | return retval; | 276 | return retval; |
276 | } | 277 | } |
277 | 278 | ||
@@ -309,14 +310,14 @@ static void i8042_stop(struct serio *serio) | |||
309 | * to the upper layers. | 310 | * to the upper layers. |
310 | */ | 311 | */ |
311 | 312 | ||
312 | static irqreturn_t i8042_interrupt(int irq, void *dev_id, struct pt_regs *regs) | 313 | static irqreturn_t i8042_interrupt(int irq, void *dev_id) |
313 | { | 314 | { |
314 | struct i8042_port *port; | 315 | struct i8042_port *port; |
315 | unsigned long flags; | 316 | unsigned long flags; |
316 | unsigned char str, data; | 317 | unsigned char str, data; |
317 | unsigned int dfl; | 318 | unsigned int dfl; |
318 | unsigned int port_no; | 319 | unsigned int port_no; |
319 | int ret; | 320 | int ret = 1; |
320 | 321 | ||
321 | spin_lock_irqsave(&i8042_lock, flags); | 322 | spin_lock_irqsave(&i8042_lock, flags); |
322 | str = i8042_read_status(); | 323 | str = i8042_read_status(); |
@@ -378,10 +379,16 @@ static irqreturn_t i8042_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
378 | dfl & SERIO_PARITY ? ", bad parity" : "", | 379 | dfl & SERIO_PARITY ? ", bad parity" : "", |
379 | dfl & SERIO_TIMEOUT ? ", timeout" : ""); | 380 | dfl & SERIO_TIMEOUT ? ", timeout" : ""); |
380 | 381 | ||
382 | if (unlikely(i8042_suppress_kbd_ack)) | ||
383 | if (port_no == I8042_KBD_PORT_NO && | ||
384 | (data == 0xfa || data == 0xfe)) { | ||
385 | i8042_suppress_kbd_ack = 0; | ||
386 | goto out; | ||
387 | } | ||
388 | |||
381 | if (likely(port->exists)) | 389 | if (likely(port->exists)) |
382 | serio_interrupt(port->serio, data, dfl, regs); | 390 | serio_interrupt(port->serio, data, dfl); |
383 | 391 | ||
384 | ret = 1; | ||
385 | out: | 392 | out: |
386 | return IRQ_RETVAL(ret); | 393 | return IRQ_RETVAL(ret); |
387 | } | 394 | } |
@@ -519,7 +526,7 @@ static int __devinit i8042_check_mux(void) | |||
519 | static struct completion i8042_aux_irq_delivered __devinitdata; | 526 | static struct completion i8042_aux_irq_delivered __devinitdata; |
520 | static int i8042_irq_being_tested __devinitdata; | 527 | static int i8042_irq_being_tested __devinitdata; |
521 | 528 | ||
522 | static irqreturn_t __devinit i8042_aux_test_irq(int irq, void *dev_id, struct pt_regs *regs) | 529 | static irqreturn_t __devinit i8042_aux_test_irq(int irq, void *dev_id) |
523 | { | 530 | { |
524 | unsigned long flags; | 531 | unsigned long flags; |
525 | unsigned char str, data; | 532 | unsigned char str, data; |
@@ -842,11 +849,13 @@ static long i8042_panic_blink(long count) | |||
842 | led ^= 0x01 | 0x04; | 849 | led ^= 0x01 | 0x04; |
843 | while (i8042_read_status() & I8042_STR_IBF) | 850 | while (i8042_read_status() & I8042_STR_IBF) |
844 | DELAY; | 851 | DELAY; |
852 | i8042_suppress_kbd_ack = 1; | ||
845 | i8042_write_data(0xed); /* set leds */ | 853 | i8042_write_data(0xed); /* set leds */ |
846 | DELAY; | 854 | DELAY; |
847 | while (i8042_read_status() & I8042_STR_IBF) | 855 | while (i8042_read_status() & I8042_STR_IBF) |
848 | DELAY; | 856 | DELAY; |
849 | DELAY; | 857 | DELAY; |
858 | i8042_suppress_kbd_ack = 1; | ||
850 | i8042_write_data(led); | 859 | i8042_write_data(led); |
851 | DELAY; | 860 | DELAY; |
852 | last_blink = count; | 861 | last_blink = count; |
@@ -905,7 +914,7 @@ static int i8042_resume(struct platform_device *dev) | |||
905 | if (i8042_ports[I8042_KBD_PORT_NO].serio) | 914 | if (i8042_ports[I8042_KBD_PORT_NO].serio) |
906 | i8042_enable_kbd_port(); | 915 | i8042_enable_kbd_port(); |
907 | 916 | ||
908 | i8042_interrupt(0, NULL, NULL); | 917 | i8042_interrupt(0, NULL); |
909 | 918 | ||
910 | return 0; | 919 | return 0; |
911 | } | 920 | } |