summaryrefslogtreecommitdiffstats
path: root/drivers/input/i8042.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input/i8042.c')
-rw-r--r--drivers/input/i8042.c43
1 files changed, 21 insertions, 22 deletions
diff --git a/drivers/input/i8042.c b/drivers/input/i8042.c
index e8f59dfc7f..9b5fa32666 100644
--- a/drivers/input/i8042.c
+++ b/drivers/input/i8042.c
@@ -454,51 +454,50 @@ static void kbd_conv_char(unsigned char scan_code)
static int kbd_reset(void)
{
- /* KB Reset */
+ u8 config;
+
+ /* controller self test */
if (kbd_input_empty() == 0)
return -1;
+ 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_WR_CONFIG);
-
- if (kbd_input_empty() == 0)
+ out8(I8042_CMD_REG, CMD_RD_CONFIG);
+ if (kbd_output_full() == 0)
return -1;
-
- out8(I8042_DATA_REG,
- CONFIG_AT_TRANS | CONFIG_SET_BIST | CONFIG_KIRQ_EN);
-
+ config = in8(I8042_DATA_REG);
+ config |= CONFIG_AT_TRANS;
+ config &= ~(CONFIG_KIRQ_EN | CONFIG_MIRQ_EN);
if (kbd_input_empty() == 0)
return -1;
-
- /* Enable Keyboard */
- out8(I8042_CMD_REG, CMD_KBD_EN);
+ out8(I8042_CMD_REG, CMD_WR_CONFIG);
if (kbd_input_empty() == 0)
return -1;
+ out8(I8042_DATA_REG, config);
- out8(I8042_CMD_REG, CMD_WR_CONFIG);
+ /* enable keyboard */
if (kbd_input_empty() == 0)
return -1;
-
- out8(I8042_DATA_REG,
- CONFIG_AT_TRANS | CONFIG_MCLK_DIS |
- CONFIG_KCLK_DIS | CONFIG_SET_BIST);
+ out8(I8042_CMD_REG, CMD_KBD_EN);
if (kbd_input_empty() == 0)
return -1;
OpenPOWER on IntegriCloud