diff options
author | Louis Yung-Chieh Lo <yjlou@chromium.org> | 2012-10-11 15:15:51 +0000 |
---|---|---|
committer | Tom Rini <trini@ti.com> | 2012-10-19 15:25:43 -0700 |
commit | 45fe668f5f6065f37836d5e941f36418fa3676cd (patch) | |
tree | 7a99c1a78b68eb0d8430f919d8c731afee8b008d | |
parent | 48edb304d05d5d8b410db74f6e497adcfb132430 (diff) | |
download | u-boot-imx-45fe668f5f6065f37836d5e941f36418fa3676cd.zip u-boot-imx-45fe668f5f6065f37836d5e941f36418fa3676cd.tar.gz u-boot-imx-45fe668f5f6065f37836d5e941f36418fa3676cd.tar.bz2 |
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>
-rw-r--r-- | drivers/input/i8042.c | 38 | ||||
-rw-r--r-- | include/i8042.h | 13 |
2 files changed, 51 insertions, 0 deletions
diff --git a/drivers/input/i8042.c b/drivers/input/i8042.c index 3a4c467..691aabf 100644 --- a/drivers/input/i8042.c +++ b/drivers/input/i8042.c @@ -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 diff --git a/include/i8042.h b/include/i8042.h index aeb3f09..c48c057 100644 --- a/include/i8042.h +++ b/include/i8042.h @@ -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); |