Skip to content

Commit

Permalink
Input: i8042 - introduce a tougher reset
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Arjan van de Ven authored and Dmitry Torokhov committed Apr 12, 2009
1 parent 59cc1dd commit 5ea2fc6
Showing 1 changed file with 29 additions and 8 deletions.
37 changes: 29 additions & 8 deletions drivers/input/serio/i8042.c
Original file line number Diff line number Diff line change
Expand Up @@ -712,22 +712,43 @@ static int i8042_controller_check(void)
static int i8042_controller_selftest(void)
{
unsigned char param;
int i = 0;

if (!i8042_reset)
return 0;

if (i8042_command(&param, I8042_CMD_CTL_TEST)) {
printk(KERN_ERR "i8042.c: i8042 controller self test timeout.\n");
return -ENODEV;
}
/*
* 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)) {
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",
param, I8042_RET_CTL_TEST);
return -EIO;
}
param, I8042_RET_CTL_TEST);
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;
#else
return -EIO;
#endif
}

/*
Expand Down

0 comments on commit 5ea2fc6

Please sign in to comment.