input: i8042: Provide feature to disable keyboard before booting kernel
authorLouis Yung-Chieh Lo <yjlou@chromium.org>
Thu, 11 Oct 2012 15:15:51 +0000 (15:15 +0000)
committerTom Rini <trini@ti.com>
Fri, 19 Oct 2012 22:25:43 +0000 (15:25 -0700)
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>
drivers/input/i8042.c
include/i8042.h

index 3a4c467c59c5f4645e1051f15a53d05bf5ee25d7..691aabf402b8e65d8d68748b3182d21956892d4e 100644 (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
index aeb3f090d03e3d2498220a12d2bfd1c0a68404bb..c48c0573749637830c2b601982df83b903c4423d 100644 (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);