aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/serio/i8042.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input/serio/i8042.c')
-rw-r--r--drivers/input/serio/i8042.c25
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;
106static unsigned char i8042_mux_present; 106static unsigned char i8042_mux_present;
107static unsigned char i8042_kbd_irq_registered; 107static unsigned char i8042_kbd_irq_registered;
108static unsigned char i8042_aux_irq_registered; 108static unsigned char i8042_aux_irq_registered;
109static unsigned char i8042_suppress_kbd_ack;
109static struct platform_device *i8042_platform_device; 110static struct platform_device *i8042_platform_device;
110 111
111static irqreturn_t i8042_interrupt(int irq, void *dev_id, struct pt_regs *regs); 112static 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
312static irqreturn_t i8042_interrupt(int irq, void *dev_id, struct pt_regs *regs) 313static 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)
519static struct completion i8042_aux_irq_delivered __devinitdata; 526static struct completion i8042_aux_irq_delivered __devinitdata;
520static int i8042_irq_being_tested __devinitdata; 527static int i8042_irq_being_tested __devinitdata;
521 528
522static irqreturn_t __devinit i8042_aux_test_irq(int irq, void *dev_id, struct pt_regs *regs) 529static 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}