Commit 5ea2fc64 authored by Arjan van de Ven's avatar Arjan van de Ven Committed by Dmitry Torokhov

Input: i8042 - introduce a tougher reset

Some touchpads don't reset right the first time (MSI Wind U-100 for
example).  This patch will retry the reset up to 5 times.

In addition, on x86, we don't fail entire i8042 initialization if
controller reset fails in hope that keyboard port will still be
functional and user will still get a working keyboard. This is
especially important on netbooks.
Signed-off-by: default avatarArjan van de Ven <arjan@linux.intel.com>
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 59cc1dd9
...@@ -712,22 +712,43 @@ static int i8042_controller_check(void) ...@@ -712,22 +712,43 @@ static int i8042_controller_check(void)
static int i8042_controller_selftest(void) static int i8042_controller_selftest(void)
{ {
unsigned char param; unsigned char param;
int i = 0;
if (!i8042_reset) if (!i8042_reset)
return 0; return 0;
/*
* We try this 5 times; on some really fragile systems this does not
* take the first time...
*/
do {
if (i8042_command(&param, I8042_CMD_CTL_TEST)) { if (i8042_command(&param, I8042_CMD_CTL_TEST)) {
printk(KERN_ERR "i8042.c: i8042 controller self test timeout.\n"); printk(KERN_ERR "i8042.c: i8042 controller self test timeout.\n");
return -ENODEV; return -ENODEV;
} }
if (param != I8042_RET_CTL_TEST) { if (param == I8042_RET_CTL_TEST)
return 0;
printk(KERN_ERR "i8042.c: i8042 controller selftest failed. (%#x != %#x)\n", printk(KERN_ERR "i8042.c: i8042 controller selftest failed. (%#x != %#x)\n",
param, I8042_RET_CTL_TEST); param, I8042_RET_CTL_TEST);
return -EIO; msleep(50);
} } while (i++ < 5);
#ifdef CONFIG_X86
/*
* On x86, we don't fail entire i8042 initialization if controller
* reset fails in hopes that keyboard port will still be functional
* and user will still get a working keyboard. This is especially
* important on netbooks. On other arches we trust hardware more.
*/
printk(KERN_INFO
"i8042: giving up on controller selftest, continuing anyway...\n");
return 0; return 0;
#else
return -EIO;
#endif
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment