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: Arjan van de Ven <arjan@linux.intel.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
This commit is contained in:
parent
59cc1dd97c
commit
5ea2fc6491
1 changed files with 29 additions and 8 deletions
|
@ -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;
|
||||||
|
|
||||||
if (i8042_command(¶m, I8042_CMD_CTL_TEST)) {
|
/*
|
||||||
printk(KERN_ERR "i8042.c: i8042 controller self test timeout.\n");
|
* We try this 5 times; on some really fragile systems this does not
|
||||||
return -ENODEV;
|
* take the first time...
|
||||||
}
|
*/
|
||||||
|
do {
|
||||||
|
|
||||||
|
if (i8042_command(¶m, I8042_CMD_CTL_TEST)) {
|
||||||
|
printk(KERN_ERR "i8042.c: i8042 controller self test timeout.\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (param == I8042_RET_CTL_TEST)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (param != I8042_RET_CTL_TEST) {
|
|
||||||
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
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue