public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] [x86] Fix some bugs in the i8402 driver when no controller is present
@ 2011-11-08  9:48 Gabe Black
  2011-11-12 10:26 ` Graeme Russ
  0 siblings, 1 reply; 7+ messages in thread
From: Gabe Black @ 2011-11-08  9:48 UTC (permalink / raw)
  To: u-boot

If no controller is present, the i8402 driver should return immediately and
not attempt to operate on the missing hardware.

In kbd_input_empty, the status register is checked every millisecond to see
whether the input buffer is empty, up to a timeout which is tracked by
decrimenting a counter each time the check is performed. The decrement is
performed with a postfix -- operator, and the value of the counter is
checked in place. That means that when the counter reaches zero and the
loop terminates, it will actually be decrimented one more time and become
-1. That value is returned as the return value of the function. That would
give the right answer if it wasn't for that extra decrement because a
timeout would indicate that the buffer never became empty.

This change fixes both of those bugs.

Signed-off-by: Gabe Black <gabeblack@chromium.org>
---
 drivers/input/i8042.c |   12 +++++++++++-
 1 files changed, 11 insertions(+), 1 deletions(-)

diff --git a/drivers/input/i8042.c b/drivers/input/i8042.c
index 58094c9..3bdfa7d 100644
--- a/drivers/input/i8042.c
+++ b/drivers/input/i8042.c
@@ -315,6 +315,13 @@ static unsigned char ext_key_map [] =
     0x00    /* map end */
     };
 
+/******************************************************************************/
+
+static int kbd_controller_present (void)
+{
+    return in8(I8042_STATUS_REG) != 0xff;
+}
+
 /*******************************************************************************
  *
  * i8042_kbd_init - reset keyboard and init state flags
@@ -324,6 +331,9 @@ int i8042_kbd_init (void)
     int keymap, try;
     char *penv;
 
+    if (!kbd_controller_present())
+        return -1;
+
 #ifdef CONFIG_USE_CPCIDVI
     if ((penv = getenv ("console")) != NULL) {
 	    if (strncmp (penv, "serial", 7) == 0) {
@@ -629,7 +639,7 @@ static int kbd_input_empty (void)
     while ((in8 (I8042_STATUS_REG) & 0x02) && kbdTimeout--)
 	udelay(1000);
 
-    return kbdTimeout;
+    return kbdTimeout != -1;
 }
 
 /******************************************************************************/
-- 
1.7.3.1

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2011-11-30 11:04 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-11-08  9:48 [U-Boot] [PATCH] [x86] Fix some bugs in the i8402 driver when no controller is present Gabe Black
2011-11-12 10:26 ` Graeme Russ
2011-11-13  2:52   ` Gabe Black
2011-11-13  9:17     ` Graeme Russ
2011-11-13  9:18       ` Graeme Russ
2011-11-15  6:18   ` [U-Boot] [PATCH v2] x86: " Gabe Black
2011-11-30 11:04     ` Graeme Russ

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox