Skip to content
Snippets Groups Projects
Commit ef94f7fa authored by Gabe Black's avatar Gabe Black Committed by Tom Rini
Browse files

input: Use finer grain udelays while waitng for the i8042 keyboard buffer to empty


On x86, the i8042 keyboard controller driver frequently waits for the keyboard
input buffer to be empty to make sure the controller has had a chance to
process the data it was given. The way the delay loop was structured, if the
controller hadn't cleared the corresponding status bit immediately, it would
wait 1ms before checking again. If the keyboard responded quickly but not
instantly, the driver would still wait a full 1ms when perhaps 1us would have
been sufficient. Because udelay is a busy wait anyway, this change decreases
the delay between checks to 1us.

Also, this change gets rid of a hardcoded 250ms delay.

On Stumpy, this saves 100-150ms during boot.

Signed-off-by: default avatarGabe Black <gabeblack@chromium.org>
Signed-off-by: default avatarSimon Glass <sjg@chromium.org>
Signed-off-by: default avatarTom Rini <trini@ti.com>
parent ddd8418f
No related branches found
No related tags found
No related merge requests found
...@@ -607,11 +607,10 @@ static void kbd_led_set(void) ...@@ -607,11 +607,10 @@ static void kbd_led_set(void)
static int kbd_input_empty(void) static int kbd_input_empty(void)
{ {
int kbdTimeout = KBD_TIMEOUT; int kbdTimeout = KBD_TIMEOUT * 1000;
/* wait for input buf empty */ while ((in8(I8042_STATUS_REG) & I8042_STATUS_IN_DATA) && kbdTimeout--)
while ((in8(I8042_STATUS_REG) & 0x02) && kbdTimeout--) udelay(1);
udelay(1000);
return kbdTimeout != -1; return kbdTimeout != -1;
} }
...@@ -625,8 +624,6 @@ static int kbd_reset(void) ...@@ -625,8 +624,6 @@ static int kbd_reset(void)
out8(I8042_DATA_REG, 0xff); out8(I8042_DATA_REG, 0xff);
udelay(250000);
if (kbd_input_empty() == 0) if (kbd_input_empty() == 0)
return -1; return -1;
......
...@@ -39,6 +39,12 @@ ...@@ -39,6 +39,12 @@
#define I8042_STATUS_REG (CONFIG_SYS_ISA_IO + 0x0064) /* keyboard status read */ #define I8042_STATUS_REG (CONFIG_SYS_ISA_IO + 0x0064) /* keyboard status read */
#define I8042_COMMAND_REG (CONFIG_SYS_ISA_IO + 0x0064) /* keyboard ctrl write */ #define I8042_COMMAND_REG (CONFIG_SYS_ISA_IO + 0x0064) /* keyboard ctrl write */
enum {
/* Output register (I8042_DATA_REG) has data for system */
I8042_STATUS_OUT_DATA = 1 << 0,
I8042_STATUS_IN_DATA = 1 << 1,
};
#define KBD_US 0 /* default US layout */ #define KBD_US 0 /* default US layout */
#define KBD_GER 1 /* german layout */ #define KBD_GER 1 /* german layout */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment