x86: i8042: Correctly initialize the controller

The existing i8042 keyboard controller driver has some issues.
First of all, it does not issue a self-test command (0xaa) to the
controller at the very beginning. Without this, the controller
does not respond to any command at all. Secondly, it initializes
the configuration byte register to turn on the keyboard's interrupt,
as U-Boot does not normally allow interrupts to be processed.
Finally, at the end of the initialization routine, it wrongly
sets the controller to disable all interfaces including both
keyboard and mouse.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Acked-by: Simon Glass <sjg@chromium.org>
diff --git a/drivers/input/i8042.c b/drivers/input/i8042.c
index e8f59df..9b5fa32 100644
--- a/drivers/input/i8042.c
+++ b/drivers/input/i8042.c
@@ -454,54 +454,53 @@
 
 static int kbd_reset(void)
 {
-	/* KB Reset */
+	u8 config;
+
+	/* controller self test */
 	if (kbd_input_empty() == 0)
 		return -1;
-
-	out8(I8042_DATA_REG, CMD_RESET_KBD);
-
+	out8(I8042_CMD_REG, CMD_SELF_TEST);
 	if (kbd_output_full() == 0)
 		return -1;
+	if (in8(I8042_DATA_REG) != KBC_TEST_OK)
+		return -1;
 
+	/* keyboard reset */
+	if (kbd_input_empty() == 0)
+		return -1;
+	out8(I8042_DATA_REG, CMD_RESET_KBD);
+	if (kbd_output_full() == 0)
+		return -1;
 	if (in8(I8042_DATA_REG) != KBD_ACK)
 		return -1;
-
 	if (kbd_output_full() == 0)
 		return -1;
-
 	if (in8(I8042_DATA_REG) != KBD_POR)
 		return -1;
 
+	/* set AT translation and disable irq */
 	if (kbd_input_empty() == 0)
 		return -1;
-
-	/* Set KBC mode */
+	out8(I8042_CMD_REG, CMD_RD_CONFIG);
+	if (kbd_output_full() == 0)
+		return -1;
+	config = in8(I8042_DATA_REG);
+	config |= CONFIG_AT_TRANS;
+	config &= ~(CONFIG_KIRQ_EN | CONFIG_MIRQ_EN);
+	if (kbd_input_empty() == 0)
+		return -1;
 	out8(I8042_CMD_REG, CMD_WR_CONFIG);
-
 	if (kbd_input_empty() == 0)
 		return -1;
+	out8(I8042_DATA_REG, config);
 
-	out8(I8042_DATA_REG,
-	     CONFIG_AT_TRANS | CONFIG_SET_BIST | CONFIG_KIRQ_EN);
-
+	/* enable keyboard */
 	if (kbd_input_empty() == 0)
 		return -1;
-
-	/* Enable Keyboard */
 	out8(I8042_CMD_REG, CMD_KBD_EN);
 	if (kbd_input_empty() == 0)
 		return -1;
 
-	out8(I8042_CMD_REG, CMD_WR_CONFIG);
-	if (kbd_input_empty() == 0)
-		return -1;
-
-	out8(I8042_DATA_REG,
-	     CONFIG_AT_TRANS | CONFIG_MCLK_DIS |
-	     CONFIG_KCLK_DIS | CONFIG_SET_BIST);
-	if (kbd_input_empty() == 0)
-		return -1;
-
 	return 0;
 }