input: Fix i8042 keyboard reset
The i8042 keyboard reset was not checking the results of the output buffer after the reset command. This can jam up some KBC/keyboards. Also, remove a write to the wrong register and the CONFIG setting around the incorrect write. Signed-off-by: Marc Jones <marc.jones@chromium.org> Signed-off-by: Simon Glass <sjg@chromium.org> Signed-off-by: Tom Rini <trini@ti.com>
This commit is contained in:
parent
45fe668f5f
commit
59a1b72ced
|
@ -666,31 +666,53 @@ static int kbd_input_empty(void)
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
|
static int wait_until_kbd_output_full(void)
|
||||||
|
{
|
||||||
|
int kbdTimeout = KBD_TIMEOUT * 1000;
|
||||||
|
|
||||||
|
while (((in8(I8042_STATUS_REG) & 0x01) == 0) && kbdTimeout--)
|
||||||
|
udelay(1);
|
||||||
|
|
||||||
|
return kbdTimeout != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
static int kbd_reset(void)
|
static int kbd_reset(void)
|
||||||
{
|
{
|
||||||
|
/* KB Reset */
|
||||||
if (kbd_input_empty() == 0)
|
if (kbd_input_empty() == 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
out8(I8042_DATA_REG, 0xff);
|
out8(I8042_DATA_REG, 0xff);
|
||||||
|
|
||||||
|
if (wait_until_kbd_output_full() == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (in8(I8042_DATA_REG) != 0xfa) /* ACK */
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (wait_until_kbd_output_full() == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (in8(I8042_DATA_REG) != 0xaa) /* Test Pass*/
|
||||||
|
return -1;
|
||||||
|
|
||||||
if (kbd_input_empty() == 0)
|
if (kbd_input_empty() == 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
#ifdef CONFIG_USE_CPCIDVI
|
/* Set KBC mode */
|
||||||
out8(I8042_COMMAND_REG, 0x60);
|
out8(I8042_COMMAND_REG, 0x60);
|
||||||
#else
|
|
||||||
out8(I8042_DATA_REG, 0x60);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (kbd_input_empty() == 0)
|
if (kbd_input_empty() == 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
out8(I8042_DATA_REG, 0x45);
|
out8(I8042_DATA_REG, 0x45);
|
||||||
|
|
||||||
|
|
||||||
if (kbd_input_empty() == 0)
|
if (kbd_input_empty() == 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
/* Enable Keyboard */
|
||||||
out8(I8042_COMMAND_REG, 0xae);
|
out8(I8042_COMMAND_REG, 0xae);
|
||||||
|
|
||||||
if (kbd_input_empty() == 0)
|
if (kbd_input_empty() == 0)
|
||||||
|
|
Loading…
Reference in New Issue