input: i8042: Provide feature to disable keyboard before booting kernel

The BIOS leaves the keyboard enabled during boot time so that any
keystroke would interfere kernel driver initialization.

Add a way to disable the keyboard to make sure no scancode will be
generated during the boot time. Note that the keyboard will be
re-enabled again after the kernel driver is up.

This code can be called from the board functions.
Signed-off-by: Louis Yung-Chieh Lo <yjlou@chromium.org>

Signed-off-by: Louis Yung-Chieh Lo <yjlou@chromium.org>
Signed-off-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Tom Rini <trini@ti.com>
This commit is contained in:
Louis Yung-Chieh Lo 2012-10-11 15:15:51 +00:00 committed by Tom Rini
parent 48edb304d0
commit 45fe668f5f
2 changed files with 51 additions and 0 deletions

View File

@ -331,6 +331,44 @@ int __weak board_i8042_skip(void)
return 0;
}
void i8042_flush(void)
{
int timeout;
/*
* The delay is to give the keyboard controller some time to fill the
* next byte.
*/
while (1) {
timeout = 100; /* wait for no longer than 100us */
while (timeout > 0 && !(in8(I8042_STATUS_REG) & 0x01)) {
udelay(1);
timeout--;
}
/* Try to pull next byte if not timeout. */
if (in8(I8042_STATUS_REG) & 0x01)
in8(I8042_DATA_REG);
else
break;
}
}
int i8042_disable(void)
{
if (kbd_input_empty() == 0)
return -1;
/* Disable keyboard */
out8(I8042_COMMAND_REG, 0xad);
if (kbd_input_empty() == 0)
return -1;
return 0;
}
/*******************************************************************************
*
* i8042_kbd_init - reset keyboard and init state flags

View File

@ -75,6 +75,19 @@ enum {
/* exports */
/**
* Flush all buffer from keyboard controller to host.
*/
void i8042_flush(void);
/**
* Disables the keyboard so that key strokes no longer generate scancodes to
* the host.
*
* @return 0 if ok, -1 if keyboard input was found while disabling
*/
int i8042_disable(void);
int i8042_kbd_init(void);
int i8042_tstc(void);
int i8042_getc(void);