Skip to contentSkip to conversation

x86: i8042: Remove unused codes

PATCH New Bin Meng 3 participants 20 messages Aug 24, 2015 – Aug 26, 2015

Subsystems (3)
lore
Share & tools
lore

Bin Meng

author
#0 lore raw

PATCH v3 1/7 x86: i8042: Remove unused codes

Remove unused CONFIG_USE_CPCIDVI wrapped codes.

---

Changes in v3:
- Keep i8042_flush(), i8042_disable() and board_i8042_skip()

Changes in v2:
- Split the removing of unused codes into this patch

 drivers/input/i8042.c | 17 -----------------
 1 file changed, 17 deletions(-)
drivers/input/i8042.c +0 -17
index 1769c5e..87220ca 100644
@@ -10,16 +10,6 @@
 /* includes */
 
 #include <common.h>
-#include <linux/compiler.h>
-
-#ifdef CONFIG_USE_CPCIDVI
-extern u8 gt_cpcidvi_in8(u32 offset);
-extern void gt_cpcidvi_out8(u32 offset, u8 data);
-
-#define in8(a)	   gt_cpcidvi_in8(a)
-#define out8(a, b) gt_cpcidvi_out8(a, b)
-#endif
-
 #include <i8042.h>
 
 /* defines */
@@ -365,13 +355,6 @@ int i8042_kbd_init(void)
 	if (!kbd_controller_present() || board_i8042_skip())
 		return -1;
 
-#ifdef CONFIG_USE_CPCIDVI
-	penv = getenv("console");
-	if (penv != NULL) {
-		if (strncmp(penv, "serial", 7) == 0)
-			return -1;
-	}
-#endif
 	/* Init keyboard device (default US layout) */
 	keymap = KBD_US;
 	penv = getenv("keymap");
Signature · 1 line
1.8.2.1
author
#1 lore raw

PATCH v3 2/7 x86: i8042: Reorder static functions

Reorder those static function so that their declarations can be removed.

---

Changes in v3: None
Changes in v2:
- Split of reordering static functions into this patch

 drivers/input/i8042.c | 490 +++++++++++++++++++++++---------------------------
 1 file changed, 222 insertions(+), 268 deletions(-)
drivers/input/i8042.c +222 -268
index 87220ca..126b222 100644
@@ -27,18 +27,6 @@ static int  kbd_mapping	 = KBD_US;	/* default US keyboard */
 static int  kbd_flags	 = NORMAL;	/* after reset */
 static int  kbd_state;			/* unshift code */
 
-static void kbd_conv_char(unsigned char scan_code);
-static void kbd_led_set(void);
-static void kbd_normal(unsigned char scan_code);
-static void kbd_shift(unsigned char scan_code);
-static void kbd_ctrl(unsigned char scan_code);
-static void kbd_num(unsigned char scan_code);
-static void kbd_caps(unsigned char scan_code);
-static void kbd_scroll(unsigned char scan_code);
-static void kbd_alt(unsigned char scan_code);
-static int  kbd_input_empty(void);
-static int  kbd_reset(void);
-
 static unsigned char kbd_fct_map[144] = {
 	/* kbd_fct_map table for scan code */
 	 0,  AS,  AS,  AS,  AS,  AS,  AS,  AS, /* scan  0- 7 */
@@ -288,8 +276,230 @@ static unsigned char ext_key_map[] = {
 	0x00  /* map end */
 	};
 
+static int kbd_input_empty(void)
+{
+	int kbdTimeout = KBD_TIMEOUT * 1000;
+
+	while ((in8(I8042_STATUS_REG) & I8042_STATUS_IN_DATA) && kbdTimeout--)
+		udelay(1);
+
+	return kbdTimeout != -1;
+}
+
+static int wait_until_kbd_output_full(void)
+{
+	int kbdTimeout = KBD_TIMEOUT * 1000;
+
+	while (((in8(I8042_STATUS_REG) & 0x01) == 0) && kbdTimeout--)
+		udelay(1);
+
+	return kbdTimeout != -1;
+}
+
+static void kbd_led_set(void)
+{
+	kbd_input_empty();
+	out8(I8042_DATA_REG, 0xed);    /* SET LED command */
+	kbd_input_empty();
+	out8(I8042_DATA_REG, (kbd_flags & 0x7));    /* LED bits only */
+}
+
+static void kbd_normal(unsigned char scan_code)
+{
+	unsigned char chr;
+
+	if ((kbd_flags & BRK) == NORMAL) {
+		chr = kbd_key_map[kbd_mapping][kbd_state][scan_code];
+		if ((chr == 0xff) || (chr == 0x00))
+			return;
+
+		/* if caps lock convert upper to lower */
+		if (((kbd_flags & CAPS) == CAPS) &&
+				(chr >= 'a' && chr <= 'z')) {
+			chr -= 'a' - 'A';
+		}
+		kbd_input = chr;
+	}
+}
+
+static void kbd_shift(unsigned char scan_code)
+{
+	if ((kbd_flags & BRK) == BRK) {
+		kbd_state = AS;
+		kbd_flags &= (~SHIFT);
+	} else {
+		kbd_state = SH;
+		kbd_flags |= SHIFT;
+	}
+}
+
+static void kbd_ctrl(unsigned char scan_code)
+{
+	if ((kbd_flags & BRK) == BRK) {
+		kbd_state = AS;
+		kbd_flags &= (~CTRL);
+	} else {
+		kbd_state = CN;
+		kbd_flags |= CTRL;
+	}
+}
+
+static void kbd_num(unsigned char scan_code)
+{
+	if ((kbd_flags & BRK) == NORMAL) {
+		kbd_flags ^= NUM;
+		kbd_state = (kbd_flags & NUM) ? AS : NM;
+		kbd_led_set();    /* update keyboard LED */
+	}
+}
+
+static void kbd_alt(unsigned char scan_code)
+{
+	if ((kbd_flags & BRK) == BRK) {
+		kbd_state = AS;
+		kbd_flags &= (~ALT);
+	} else {
+		kbd_state = AK;
+		kbd_flags &= ALT;
+	}
+}
+
+static void kbd_caps(unsigned char scan_code)
+{
+	if ((kbd_flags & BRK) == NORMAL) {
+		kbd_flags ^= CAPS;
+		kbd_led_set();    /* update keyboard LED */
+	}
+}
+
+static void kbd_scroll(unsigned char scan_code)
+{
+	if ((kbd_flags & BRK) == NORMAL) {
+		kbd_flags ^= STP;
+		kbd_led_set();    /* update keyboard LED */
+		if (kbd_flags & STP)
+			kbd_input = 0x13;
+		else
+			kbd_input = 0x11;
+	}
+}
+
+static void kbd_conv_char(unsigned char scan_code)
+{
+	if (scan_code == 0xe0) {
+		kbd_flags |= EXT;
+		return;
+	}
+
+	/* if high bit of scan_code, set break flag */
+	if (scan_code & 0x80)
+		kbd_flags |=  BRK;
+	else
+		kbd_flags &= ~BRK;
+
+	if ((scan_code == 0xe1) || (kbd_flags & E1)) {
+		if (scan_code == 0xe1) {
+			kbd_flags ^= BRK;    /* reset the break flag */
+			kbd_flags ^= E1;     /* bitwise EXOR with E1 flag */
+		}
+		return;
+	}
+
+	scan_code &= 0x7f;
+
+	if (kbd_flags & EXT) {
+		int i;
+
+		kbd_flags ^= EXT;
+		for (i = 0; ext_key_map[i]; i++) {
+			if (ext_key_map[i] == scan_code) {
+				scan_code = 0x80 + i;
+				break;
+			}
+		}
+		/* not found ? */
+		if (!ext_key_map[i])
+			return;
+	}
+
+	switch (kbd_fct_map[scan_code]) {
+	case AS:
+		kbd_normal(scan_code);
+		break;
+	case SH:
+		kbd_shift(scan_code);
+		break;
+	case CN:
+		kbd_ctrl(scan_code);
+		break;
+	case NM:
+		kbd_num(scan_code);
+		break;
+	case AK:
+		kbd_alt(scan_code);
+		break;
+	case CP:
+		kbd_caps(scan_code);
+		break;
+	case ST:
+		kbd_scroll(scan_code);
+		break;
+	}
+	return;
+}
+
 /******************************************************************************/
 
+static int kbd_reset(void)
+{
+	/* KB Reset */
+	if (kbd_input_empty() == 0)
+		return -1;
+
+	out8(I8042_DATA_REG, 0xff);
+
+	if (wait_until_kbd_output_full() == 0)
+		return -1;
+
+	if (in8(I8042_DATA_REG) != 0xfa) /* ACK */
+		return -1;
+
+	if (wait_until_kbd_output_full() == 0)
+		return -1;
+
+	if (in8(I8042_DATA_REG) != 0xaa) /* Test Pass*/
+		return -1;
+
+	if (kbd_input_empty() == 0)
+		return -1;
+
+	/* Set KBC mode */
+	out8(I8042_COMMAND_REG, 0x60);
+
+	if (kbd_input_empty() == 0)
+		return -1;
+
+	out8(I8042_DATA_REG, 0x45);
+
+	if (kbd_input_empty() == 0)
+		return -1;
+
+	/* Enable Keyboard */
+	out8(I8042_COMMAND_REG, 0xae);
+	if (kbd_input_empty() == 0)
+		return -1;
+
+	out8(I8042_COMMAND_REG, 0x60);
+	if (kbd_input_empty() == 0)
+		return -1;
+
+	out8(I8042_DATA_REG, 0xf4);
+	if (kbd_input_empty() == 0)
+		return -1;
+
+	return 0;
+}
+
 static int kbd_controller_present(void)
 {
 	return in8(I8042_STATUS_REG) != 0xff;
@@ -342,7 +552,6 @@ int i8042_disable(void)
 	return 0;
 }
 
-
 /*******************************************************************************
  *
  * i8042_kbd_init - reset keyboard and init state flags
@@ -439,258 +648,3 @@ int i8042_getc(struct stdio_dev *dev)
 	kbd_input = -1;
 	return ret_chr;
 }
-
-
-/******************************************************************************/
-
-static void kbd_conv_char(unsigned char scan_code)
-{
-	if (scan_code == 0xe0) {
-		kbd_flags |= EXT;
-		return;
-	}
-
-	/* if high bit of scan_code, set break flag */
-	if (scan_code & 0x80)
-		kbd_flags |=  BRK;
-	else
-		kbd_flags &= ~BRK;
-
-	if ((scan_code == 0xe1) || (kbd_flags & E1)) {
-		if (scan_code == 0xe1) {
-			kbd_flags ^= BRK;    /* reset the break flag */
-			kbd_flags ^= E1;     /* bitwise EXOR with E1 flag */
-		}
-		return;
-	}
-
-	scan_code &= 0x7f;
-
-	if (kbd_flags & EXT) {
-		int i;
-
-		kbd_flags ^= EXT;
-		for (i = 0; ext_key_map[i]; i++) {
-			if (ext_key_map[i] == scan_code) {
-				scan_code = 0x80 + i;
-				break;
-			}
-		}
-		/* not found ? */
-		if (!ext_key_map[i])
-			return;
-	}
-
-	switch (kbd_fct_map[scan_code]) {
-	case AS:
-		kbd_normal(scan_code);
-		break;
-	case SH:
-		kbd_shift(scan_code);
-		break;
-	case CN:
-		kbd_ctrl(scan_code);
-		break;
-	case NM:
-		kbd_num(scan_code);
-		break;
-	case CP:
-		kbd_caps(scan_code);
-		break;
-	case ST:
-		kbd_scroll(scan_code);
-		break;
-	case AK:
-		kbd_alt(scan_code);
-		break;
-	}
-	return;
-}
-
-
-/******************************************************************************/
-
-static void kbd_normal(unsigned char scan_code)
-{
-	unsigned char chr;
-
-	if ((kbd_flags & BRK) == NORMAL) {
-		chr = kbd_key_map[kbd_mapping][kbd_state][scan_code];
-		if ((chr == 0xff) || (chr == 0x00))
-			return;
-
-		/* if caps lock convert upper to lower */
-		if (((kbd_flags & CAPS) == CAPS) &&
-				(chr >= 'a' && chr <= 'z')) {
-			chr -= 'a' - 'A';
-		}
-		kbd_input = chr;
-	}
-}
-
-
-/******************************************************************************/
-
-static void kbd_shift(unsigned char scan_code)
-{
-	if ((kbd_flags & BRK) == BRK) {
-		kbd_state = AS;
-		kbd_flags &= (~SHIFT);
-	} else {
-		kbd_state = SH;
-		kbd_flags |= SHIFT;
-	}
-}
-
-
-/******************************************************************************/
-
-static void kbd_ctrl(unsigned char scan_code)
-{
-	if ((kbd_flags & BRK) == BRK) {
-		kbd_state = AS;
-		kbd_flags &= (~CTRL);
-	} else {
-		kbd_state = CN;
-		kbd_flags |= CTRL;
-	}
-}
-
-
-/******************************************************************************/
-
-static void kbd_caps(unsigned char scan_code)
-{
-	if ((kbd_flags & BRK) == NORMAL) {
-		kbd_flags ^= CAPS;
-		kbd_led_set();    /* update keyboard LED */
-	}
-}
-
-
-/******************************************************************************/
-
-static void kbd_num(unsigned char scan_code)
-{
-	if ((kbd_flags & BRK) == NORMAL) {
-		kbd_flags ^= NUM;
-		kbd_state = (kbd_flags & NUM) ? AS : NM;
-		kbd_led_set();    /* update keyboard LED */
-	}
-}
-
-
-/******************************************************************************/
-
-static void kbd_scroll(unsigned char scan_code)
-{
-	if ((kbd_flags & BRK) == NORMAL) {
-		kbd_flags ^= STP;
-		kbd_led_set();    /* update keyboard LED */
-		if (kbd_flags & STP)
-			kbd_input = 0x13;
-		else
-			kbd_input = 0x11;
-	}
-}
-
-/******************************************************************************/
-
-static void kbd_alt(unsigned char scan_code)
-{
-	if ((kbd_flags & BRK) == BRK) {
-		kbd_state = AS;
-		kbd_flags &= (~ALT);
-	} else {
-		kbd_state = AK;
-		kbd_flags &= ALT;
-	}
-}
-
-
-/******************************************************************************/
-
-static void kbd_led_set(void)
-{
-	kbd_input_empty();
-	out8(I8042_DATA_REG, 0xed);    /* SET LED command */
-	kbd_input_empty();
-	out8(I8042_DATA_REG, (kbd_flags & 0x7));    /* LED bits only */
-}
-
-
-/******************************************************************************/
-
-static int kbd_input_empty(void)
-{
-	int kbdTimeout = KBD_TIMEOUT * 1000;
-
-	while ((in8(I8042_STATUS_REG) & I8042_STATUS_IN_DATA) && kbdTimeout--)
-		udelay(1);
-
-	return kbdTimeout != -1;
-}
-
-/******************************************************************************/
-
-static int wait_until_kbd_output_full(void)
-{
-	int kbdTimeout = KBD_TIMEOUT * 1000;
-
-	while (((in8(I8042_STATUS_REG) & 0x01) == 0) && kbdTimeout--)
-		udelay(1);
-
-	return kbdTimeout != -1;
-}
-
-/******************************************************************************/
-
-static int kbd_reset(void)
-{
-	/* KB Reset */
-	if (kbd_input_empty() == 0)
-		return -1;
-
-	out8(I8042_DATA_REG, 0xff);
-
-	if (wait_until_kbd_output_full() == 0)
-		return -1;
-
-	if (in8(I8042_DATA_REG) != 0xfa) /* ACK */
-		return -1;
-
-	if (wait_until_kbd_output_full() == 0)
-		return -1;
-
-	if (in8(I8042_DATA_REG) != 0xaa) /* Test Pass*/
-		return -1;
-
-	if (kbd_input_empty() == 0)
-		return -1;
-
-	/* Set KBC mode */
-	out8(I8042_COMMAND_REG, 0x60);
-
-	if (kbd_input_empty() == 0)
-		return -1;
-
-	out8(I8042_DATA_REG, 0x45);
-
-	if (kbd_input_empty() == 0)
-		return -1;
-
-	/* Enable Keyboard */
-	out8(I8042_COMMAND_REG, 0xae);
-	if (kbd_input_empty() == 0)
-		return -1;
-
-	out8(I8042_COMMAND_REG, 0x60);
-	if (kbd_input_empty() == 0)
-		return -1;
-
-	out8(I8042_DATA_REG, 0xf4);
-	if (kbd_input_empty() == 0)
-		return -1;
-
-	return 0;
-}
Signature · 1 line
1.8.2.1
#2 lore raw

PATCH v3 2/7 x86: i8042: Reorder static functions

Quoted 6 lines · Bin Meng

Reorder those static function so that their declarations can be removed.

Quoted 8 lines

---

Changes in v3: None
Changes in v2:
- Split of reordering static functions into this patch

 drivers/input/i8042.c | 490 +++++++++++++++++++++++---------------------------
 1 file changed, 222 insertions(+), 268 deletions(-)

Applied to u-boot-x86, thanks!

author
#3 lore raw

PATCH v3 3/7 x86: i8042: Clean up the driver per coding convention

In reply to Bin Meng

- Rename CamelCase variables to conform U-Boot coding convention
- Rename wait_until_kbd_output_full() to kbd_output_full()
- Change to use macros for i8042 command and control register bits

---

Changes in v3: None
Changes in v2:
- Split the original single patch into 3 patches

 drivers/input/i8042.c | 230 ++++++++++++++++++++++++++------------------------
 include/i8042.h       | 103 ++++++++++++----------
 2 files changed, 177 insertions(+), 156 deletions(-)
drivers/input/i8042.c +118 -112
index 126b222..e8f59df 100644
@@ -10,27 +10,30 @@
 /* includes */
 
 #include <common.h>
+#include <asm/io.h>
 #include <i8042.h>
 
 /* defines */
+#define in8(p)		inb(p)
+#define out8(p, v)	outb(v, p)
 
 #ifdef CONFIG_CONSOLE_CURSOR
 extern void console_cursor(int state);
-static int blinkCount = CONFIG_SYS_CONSOLE_BLINK_COUNT;
+static int blink_count = CONFIG_SYS_CONSOLE_BLINK_COUNT;
 static int cursor_state;
 #endif
 
 /* locals */
 
-static int  kbd_input	 = -1;		/* no input yet */
-static int  kbd_mapping	 = KBD_US;	/* default US keyboard */
-static int  kbd_flags	 = NORMAL;	/* after reset */
-static int  kbd_state;			/* unshift code */
+static int kbd_input = -1;		/* no input yet */
+static int kbd_mapping = KBD_US;	/* default US keyboard */
+static int kbd_flags = NORMAL;		/* after reset */
+static int kbd_state;			/* unshift code */
 
 static unsigned char kbd_fct_map[144] = {
 	/* kbd_fct_map table for scan code */
-	 0,  AS,  AS,  AS,  AS,  AS,  AS,  AS, /* scan  0- 7 */
-	AS,  AS,  AS,  AS,  AS,  AS,  AS,  AS, /* scan  8- F */
+	 0,  AS,  AS,  AS,  AS,  AS,  AS,  AS, /* scan 00-07 */
+	AS,  AS,  AS,  AS,  AS,  AS,  AS,  AS, /* scan 08-0F */
 	AS,  AS,  AS,  AS,  AS,  AS,  AS,  AS, /* scan 10-17 */
 	AS,  AS,  AS,  AS,  AS,  CN,  AS,  AS, /* scan 18-1F */
 	AS,  AS,  AS,  AS,  AS,  AS,  AS,  AS, /* scan 20-27 */
@@ -52,8 +55,8 @@ static unsigned char kbd_fct_map[144] = {
 static unsigned char kbd_key_map[2][5][144] = {
 	{ /* US keyboard */
 	{ /* unshift code */
-	   0, 0x1b,  '1',  '2',  '3',  '4',  '5',  '6', /* scan  0- 7 */
-	 '7',  '8',  '9',  '0',  '-',  '=', 0x08, '\t', /* scan  8- F */
+	   0, 0x1b,  '1',  '2',  '3',  '4',  '5',  '6', /* scan 00-07 */
+	 '7',  '8',  '9',  '0',  '-',  '=', 0x08, '\t', /* scan 08-0F */
 	 'q',  'w',  'e',  'r',  't',  'y',  'u',  'i', /* scan 10-17 */
 	 'o',  'p',  '[',  ']', '\r',   CN,  'a',  's', /* scan 18-1F */
 	 'd',  'f',  'g',  'h',  'j',  'k',  'l',  ';', /* scan 20-27 */
@@ -72,8 +75,8 @@ static unsigned char kbd_key_map[2][5][144] = {
 	   0,  'D',  'C',    0,  'B',    0,  '@',  'P'  /* extended */
 	},
 	{ /* shift code */
-	   0, 0x1b,  '!',  '@',  '#',  '$',  '%',  '^', /* scan  0- 7 */
-	 '&',  '*',  '(',  ')',  '_',  '+', 0x08, '\t', /* scan  8- F */
+	   0, 0x1b,  '!',  '@',  '#',  '$',  '%',  '^', /* scan 00-07 */
+	 '&',  '*',  '(',  ')',  '_',  '+', 0x08, '\t', /* scan 08-0F */
 	 'Q',  'W',  'E',  'R',  'T',  'Y',  'U',  'I', /* scan 10-17 */
 	 'O',  'P',  '{',  '}', '\r',   CN,  'A',  'S', /* scan 18-1F */
 	 'D',  'F',  'G',  'H',  'J',  'K',  'L',  ':', /* scan 20-27 */
@@ -92,8 +95,8 @@ static unsigned char kbd_key_map[2][5][144] = {
 	   0,  'D',  'C',    0,  'B',    0,  '@',  'P'  /* extended */
 	},
 	{ /* control code */
-	0xff, 0x1b, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, /* scan  0- 7 */
-	0x1e, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, '\t', /* scan  8- F */
+	0xff, 0x1b, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, /* scan 00-07 */
+	0x1e, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, '\t', /* scan 08-0F */
 	0x11, 0x17, 0x05, 0x12, 0x14, 0x19, 0x15, 0x09, /* scan 10-17 */
 	0x0f, 0x10, 0x1b, 0x1d, '\r',   CN, 0x01, 0x13, /* scan 18-1F */
 	0x04, 0x06, 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0xff, /* scan 20-27 */
@@ -112,8 +115,8 @@ static unsigned char kbd_key_map[2][5][144] = {
 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff  /* extended */
 	},
 	{ /* non numeric code */
-	   0, 0x1b,  '1',  '2',  '3',  '4',  '5',  '6', /* scan  0- 7 */
-	 '7',  '8',  '9',  '0',  '-',  '=', 0x08, '\t', /* scan  8- F */
+	   0, 0x1b,  '1',  '2',  '3',  '4',  '5',  '6', /* scan 00-07 */
+	 '7',  '8',  '9',  '0',  '-',  '=', 0x08, '\t', /* scan 08-0F */
 	 'q',  'w',  'e',  'r',  't',  'y',  'u',  'i', /* scan 10-17 */
 	 'o',  'p',  '[',  ']', '\r',   CN,  'a',  's', /* scan 18-1F */
 	 'd',  'f',  'g',  'h',  'j',  'k',  'l',  ';', /* scan 20-27 */
@@ -132,30 +135,30 @@ static unsigned char kbd_key_map[2][5][144] = {
 	   0,  'D',  'C',    0,  'B',    0,  '@',  'P'  /* extended */
 	},
 	{ /* right alt mode - not used in US keyboard */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan  0 - 7 */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 8 - F */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 10 -17 */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 18 -1F */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 20 -27 */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 28 -2F */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 30 -37 */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 38 -3F */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 40 -47 */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 48 -4F */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 50 -57 */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 58 -5F */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 60 -67 */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 68 -6F */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 70 -77 */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 78 -7F */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 00-07 */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 08-0F */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 10-17 */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 18-1F */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 20-27 */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 28-2F */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 30-37 */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 38-3F */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 40-47 */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 48-4F */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 50-57 */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 58-5F */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 60-67 */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 68-6F */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 70-77 */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 78-7F */
 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* extended */
 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff  /* extended */
 	}
 	},
-	{ /* german keyboard */
+	{ /* German keyboard */
 	{ /* unshift code */
-	   0, 0x1b,  '1',  '2',  '3',  '4',  '5',  '6', /* scan  0- 7 */
-	 '7',  '8',  '9',  '0', 0xe1, '\'', 0x08, '\t', /* scan  8- F */
+	   0, 0x1b,  '1',  '2',  '3',  '4',  '5',  '6', /* scan 00-07 */
+	 '7',  '8',  '9',  '0', 0xe1, '\'', 0x08, '\t', /* scan 08-0F */
 	 'q',  'w',  'e',  'r',  't',  'z',  'u',  'i', /* scan 10-17 */
 	 'o',  'p', 0x81,  '+', '\r',   CN,  'a',  's', /* scan 18-1F */
 	 'd',  'f',  'g',  'h',  'j',  'k',  'l', 0x94, /* scan 20-27 */
@@ -174,8 +177,8 @@ static unsigned char kbd_key_map[2][5][144] = {
 	   0,  'D',  'C',    0,  'B',    0,  '@',  'P'  /* extended */
 	},
 	{ /* shift code */
-	   0, 0x1b,  '!',  '"', 0x15,  '$',  '%',  '&', /* scan  0- 7 */
-	 '/',  '(',  ')',  '=',  '?',  '`', 0x08, '\t', /* scan  8- F */
+	   0, 0x1b,  '!',  '"', 0x15,  '$',  '%',  '&', /* scan 00-07 */
+	 '/',  '(',  ')',  '=',  '?',  '`', 0x08, '\t', /* scan 08-0F */
 	 'Q',  'W',  'E',  'R',  'T',  'Z',  'U',  'I', /* scan 10-17 */
 	 'O',  'P', 0x9a,  '*', '\r',   CN,  'A',  'S', /* scan 18-1F */
 	 'D',  'F',  'G',  'H',  'J',  'K',  'L', 0x99, /* scan 20-27 */
@@ -194,8 +197,8 @@ static unsigned char kbd_key_map[2][5][144] = {
 	   0,  'D',  'C',    0,  'B',    0,  '@',  'P'  /* extended */
 	},
 	{ /* control code */
-	0xff, 0x1b, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, /* scan  0- 7 */
-	0x1e, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, '\t', /* scan  8- F */
+	0xff, 0x1b, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, /* scan 00-07 */
+	0x1e, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, '\t', /* scan 08-0F */
 	0x11, 0x17, 0x05, 0x12, 0x14, 0x19, 0x15, 0x09, /* scan 10-17 */
 	0x0f, 0x10, 0x1b, 0x1d, '\r',   CN, 0x01, 0x13, /* scan 18-1F */
 	0x04, 0x06, 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0xff, /* scan 20-27 */
@@ -214,8 +217,8 @@ static unsigned char kbd_key_map[2][5][144] = {
 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff  /* extended */
 	},
 	{ /* non numeric code */
-	   0, 0x1b,  '1',  '2',  '3',  '4',  '5',  '6', /* scan  0- 7 */
-	 '7',  '8',  '9',  '0', 0xe1, '\'', 0x08, '\t', /* scan  8- F */
+	   0, 0x1b,  '1',  '2',  '3',  '4',  '5',  '6', /* scan 00-07 */
+	 '7',  '8',  '9',  '0', 0xe1, '\'', 0x08, '\t', /* scan 08-0F */
 	 'q',  'w',  'e',  'r',  't',  'z',  'u',  'i', /* scan 10-17 */
 	 'o',  'p', 0x81,  '+', '\r',   CN,  'a',  's', /* scan 18-1F */
 	 'd',  'f',  'g',  'h',  'j',  'k',  'l', 0x94, /* scan 20-27 */
@@ -233,23 +236,23 @@ static unsigned char kbd_key_map[2][5][144] = {
 	'\r',   CN,  '/',  '*',  ' ',   ST,  'F',  'A', /* extended */
 	   0,  'D',  'C',    0,  'B',    0,  '@',  'P'  /* extended */
 	},
-	{ /* Right alt mode - is used in German keyboard */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan  0 - 7 */
-	 '{',  '[',  ']',  '}', '\\', 0xff, 0xff, 0xff, /* scan  8 - F */
-	 '@', 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 10 -17 */
-	0xff, 0xff, 0xff,  '~', 0xff, 0xff, 0xff, 0xff, /* scan 18 -1F */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 20 -27 */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 28 -2F */
-	0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 30 -37 */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 38 -3F */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 40 -47 */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 48 -4F */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff,  '|', 0xff, /* scan 50 -57 */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 58 -5F */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 60 -67 */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 68 -6F */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 70 -77 */
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 78 -7F */
+	{ /* right alt mode - is used in German keyboard */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 00-07 */
+	 '{',  '[',  ']',  '}', '\\', 0xff, 0xff, 0xff, /* scan 08-0F */
+	 '@', 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 10-17 */
+	0xff, 0xff, 0xff,  '~', 0xff, 0xff, 0xff, 0xff, /* scan 18-1F */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 20-27 */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 28-2F */
+	0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 30-37 */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 38-3F */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 40-47 */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 48-4F */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff,  '|', 0xff, /* scan 50-57 */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 58-5F */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 60-67 */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 68-6F */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 70-77 */
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 78-7F */
 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* extended */
 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff  /* extended */
 	}
@@ -278,30 +281,30 @@ static unsigned char ext_key_map[] = {
 
 static int kbd_input_empty(void)
 {
-	int kbdTimeout = KBD_TIMEOUT * 1000;
+	int kbd_timeout = KBD_TIMEOUT * 1000;
 
-	while ((in8(I8042_STATUS_REG) & I8042_STATUS_IN_DATA) && kbdTimeout--)
+	while ((in8(I8042_STS_REG) & STATUS_IBF) && kbd_timeout--)
 		udelay(1);
 
-	return kbdTimeout != -1;
+	return kbd_timeout != -1;
 }
 
-static int wait_until_kbd_output_full(void)
+static int kbd_output_full(void)
 {
-	int kbdTimeout = KBD_TIMEOUT * 1000;
+	int kbd_timeout = KBD_TIMEOUT * 1000;
 
-	while (((in8(I8042_STATUS_REG) & 0x01) == 0) && kbdTimeout--)
+	while (((in8(I8042_STS_REG) & STATUS_OBF) == 0) && kbd_timeout--)
 		udelay(1);
 
-	return kbdTimeout != -1;
+	return kbd_timeout != -1;
 }
 
 static void kbd_led_set(void)
 {
 	kbd_input_empty();
-	out8(I8042_DATA_REG, 0xed);    /* SET LED command */
+	out8(I8042_DATA_REG, CMD_SET_KBD_LED);
 	kbd_input_empty();
-	out8(I8042_DATA_REG, (kbd_flags & 0x7));    /* LED bits only */
+	out8(I8042_DATA_REG, (kbd_flags & 0x7));
 }
 
 static void kbd_normal(unsigned char scan_code)
@@ -315,7 +318,7 @@ static void kbd_normal(unsigned char scan_code)
 
 		/* if caps lock convert upper to lower */
 		if (((kbd_flags & CAPS) == CAPS) &&
-				(chr >= 'a' && chr <= 'z')) {
+		    (chr >= 'a' && chr <= 'z')) {
 			chr -= 'a' - 'A';
 		}
 		kbd_input = chr;
@@ -349,7 +352,7 @@ static void kbd_num(unsigned char scan_code)
 	if ((kbd_flags & BRK) == NORMAL) {
 		kbd_flags ^= NUM;
 		kbd_state = (kbd_flags & NUM) ? AS : NM;
-		kbd_led_set();    /* update keyboard LED */
+		kbd_led_set();
 	}
 }
 
@@ -368,7 +371,7 @@ static void kbd_caps(unsigned char scan_code)
 {
 	if ((kbd_flags & BRK) == NORMAL) {
 		kbd_flags ^= CAPS;
-		kbd_led_set();    /* update keyboard LED */
+		kbd_led_set();
 	}
 }
 
@@ -376,7 +379,7 @@ static void kbd_scroll(unsigned char scan_code)
 {
 	if ((kbd_flags & BRK) == NORMAL) {
 		kbd_flags ^= STP;
-		kbd_led_set();    /* update keyboard LED */
+		kbd_led_set();
 		if (kbd_flags & STP)
 			kbd_input = 0x13;
 		else
@@ -399,8 +402,8 @@ static void kbd_conv_char(unsigned char scan_code)
 
 	if ((scan_code == 0xe1) || (kbd_flags & E1)) {
 		if (scan_code == 0xe1) {
-			kbd_flags ^= BRK;    /* reset the break flag */
-			kbd_flags ^= E1;     /* bitwise EXOR with E1 flag */
+			kbd_flags ^= BRK;	/* reset the break flag */
+			kbd_flags ^= E1;	/* bitwise EXOR with E1 flag */
 		}
 		return;
 	}
@@ -445,55 +448,57 @@ static void kbd_conv_char(unsigned char scan_code)
 		kbd_scroll(scan_code);
 		break;
 	}
+
 	return;
 }
 
-/******************************************************************************/
-
 static int kbd_reset(void)
 {
 	/* KB Reset */
 	if (kbd_input_empty() == 0)
 		return -1;
 
-	out8(I8042_DATA_REG, 0xff);
+	out8(I8042_DATA_REG, CMD_RESET_KBD);
 
-	if (wait_until_kbd_output_full() == 0)
+	if (kbd_output_full() == 0)
 		return -1;
 
-	if (in8(I8042_DATA_REG) != 0xfa) /* ACK */
+	if (in8(I8042_DATA_REG) != KBD_ACK)
 		return -1;
 
-	if (wait_until_kbd_output_full() == 0)
+	if (kbd_output_full() == 0)
 		return -1;
 
-	if (in8(I8042_DATA_REG) != 0xaa) /* Test Pass*/
+	if (in8(I8042_DATA_REG) != KBD_POR)
 		return -1;
 
 	if (kbd_input_empty() == 0)
 		return -1;
 
 	/* Set KBC mode */
-	out8(I8042_COMMAND_REG, 0x60);
+	out8(I8042_CMD_REG, CMD_WR_CONFIG);
 
 	if (kbd_input_empty() == 0)
 		return -1;
 
-	out8(I8042_DATA_REG, 0x45);
+	out8(I8042_DATA_REG,
+	     CONFIG_AT_TRANS | CONFIG_SET_BIST | CONFIG_KIRQ_EN);
 
 	if (kbd_input_empty() == 0)
 		return -1;
 
 	/* Enable Keyboard */
-	out8(I8042_COMMAND_REG, 0xae);
+	out8(I8042_CMD_REG, CMD_KBD_EN);
 	if (kbd_input_empty() == 0)
 		return -1;
 
-	out8(I8042_COMMAND_REG, 0x60);
+	out8(I8042_CMD_REG, CMD_WR_CONFIG);
 	if (kbd_input_empty() == 0)
 		return -1;
 
-	out8(I8042_DATA_REG, 0xf4);
+	out8(I8042_DATA_REG,
+	     CONFIG_AT_TRANS | CONFIG_MCLK_DIS |
+	     CONFIG_KCLK_DIS | CONFIG_SET_BIST);
 	if (kbd_input_empty() == 0)
 		return -1;
 
@@ -502,7 +507,7 @@ static int kbd_reset(void)
 
 static int kbd_controller_present(void)
 {
-	return in8(I8042_STATUS_REG) != 0xff;
+	return in8(I8042_STS_REG) != 0xff;
 }
 
 /*
@@ -520,18 +525,18 @@ void i8042_flush(void)
 	int timeout;
 
 	/*
-	 * The delay is to give the keyboard controller some time to fill the
-	 * next byte.
+	 * 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)) {
+		timeout = 100;	/* wait for no longer than 100us */
+		while (timeout > 0 && !(in8(I8042_STS_REG) & STATUS_OBF)) {
 			udelay(1);
 			timeout--;
 		}
 
-		/* Try to pull next byte if not timeout. */
-		if (in8(I8042_STATUS_REG) & 0x01)
+		/* Try to pull next byte if not timeout */
+		if (in8(I8042_STS_REG) & STATUS_OBF)
 			in8(I8042_DATA_REG);
 		else
 			break;
@@ -544,7 +549,7 @@ int i8042_disable(void)
 		return -1;
 
 	/* Disable keyboard */
-	out8(I8042_COMMAND_REG, 0xad);
+	out8(I8042_CMD_REG, CMD_KBD_DIS);
 
 	if (kbd_input_empty() == 0)
 		return -1;
@@ -552,17 +557,16 @@ int i8042_disable(void)
 	return 0;
 }
 
-/*******************************************************************************
- *
- * i8042_kbd_init - reset keyboard and init state flags
- */
+/* i8042_kbd_init - reset keyboard and init state flags */
 int i8042_kbd_init(void)
 {
 	int keymap, try;
 	char *penv;
 
-	if (!kbd_controller_present() || board_i8042_skip())
+	if (!kbd_controller_present() || board_i8042_skip()) {
+		debug("i8042 keyboard controller is not present\n");
 		return -1;
+	}
 
 	/* Init keyboard device (default US layout) */
 	keymap = KBD_US;
@@ -578,32 +582,33 @@ int i8042_kbd_init(void)
 			kbd_flags   = NORMAL;
 			kbd_state   = 0;
 			kbd_led_set();
+
 			return 0;
 		}
 	}
+
 	return -1;
 }
 
-
-/*******************************************************************************
- *
+/*
  * i8042_tstc - test if keyboard input is available
- *		option: cursor blinking if called in a loop
+ *
+ * option: cursor blinking if called in a loop
  */
 int i8042_tstc(struct stdio_dev *dev)
 {
 	unsigned char scan_code = 0;
 
 #ifdef CONFIG_CONSOLE_CURSOR
-	if (--blinkCount == 0) {
+	if (--blink_count == 0) {
 		cursor_state ^= 1;
 		console_cursor(cursor_state);
-		blinkCount = CONFIG_SYS_CONSOLE_BLINK_COUNT;
+		blink_count = CONFIG_SYS_CONSOLE_BLINK_COUNT;
 		udelay(10);
 	}
 #endif
 
-	if ((in8(I8042_STATUS_REG) & 0x01) == 0) {
+	if ((in8(I8042_STS_REG) & STATUS_OBF) == 0) {
 		return 0;
 	} else {
 		scan_code = in8(I8042_DATA_REG);
@@ -615,14 +620,14 @@ int i8042_tstc(struct stdio_dev *dev)
 		if (kbd_input != -1)
 			return 1;
 	}
+
 	return 0;
 }
 
-
-/*******************************************************************************
- *
+/*
  * i8042_getc - wait till keyboard input is available
- *		option: turn on/off cursor while waiting
+ *
+ * option: turn on/off cursor while waiting
  */
 int i8042_getc(struct stdio_dev *dev)
 {
@@ -630,21 +635,22 @@ int i8042_getc(struct stdio_dev *dev)
 	unsigned char scan_code;
 
 	while (kbd_input == -1) {
-		while ((in8(I8042_STATUS_REG) & 0x01) == 0) {
+		while ((in8(I8042_STS_REG) & STATUS_OBF) == 0) {
 #ifdef CONFIG_CONSOLE_CURSOR
-			if (--blinkCount == 0) {
+			if (--blink_count == 0) {
 				cursor_state ^= 1;
 				console_cursor(cursor_state);
-				blinkCount = CONFIG_SYS_CONSOLE_BLINK_COUNT;
+				blink_count = CONFIG_SYS_CONSOLE_BLINK_COUNT;
 			}
 			udelay(10);
 #endif
 		}
 		scan_code = in8(I8042_DATA_REG);
 		if (scan_code != 0xfa)
-			kbd_conv_char (scan_code);
+			kbd_conv_char(scan_code);
 	}
 	ret_chr = kbd_input;
 	kbd_input = -1;
+
 	return ret_chr;
 }
include/i8042.h +59 -44

111 lines not on this page · raw message

Signature · 1 line
1.8.2.1
#4 lore raw

PATCH v3 3/7 x86: i8042: Clean up the driver per coding convention

Quoted 9 lines · Bin Meng

- Rename CamelCase variables to conform U-Boot coding convention
- Rename wait_until_kbd_output_full() to kbd_output_full()
- Change to use macros for i8042 command and control register bits

---

Quoted 7 lines

Changes in v3: None
Changes in v2:
- Split the original single patch into 3 patches

 drivers/input/i8042.c | 230 ++++++++++++++++++++++++++------------------------
 include/i8042.h       | 103 ++++++++++++----------
 2 files changed, 177 insertions(+), 156 deletions(-)

Applied to u-boot-x86, thanks!

author
#5 lore raw

PATCH v3 4/7 x86: i8042: Correctly initialize the controller

In reply to Bin Meng

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.

---

Changes in v3:
- Fix commit message per Simon's comments

Changes in v2:
- Reorder this patch to follow the i8042 driver clean up patches

 drivers/input/i8042.c | 43 +++++++++++++++++++++----------------------
 1 file changed, 21 insertions(+), 22 deletions(-)
drivers/input/i8042.c +21 -22
index e8f59df..9b5fa32 100644
@@ -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;
 
Signature · 1 line
1.8.2.1
#6 lore raw

PATCH v3 4/7 x86: i8042: Correctly initialize the controller

Quoted 15 lines · Bin Meng

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.

---

Quoted 8 lines

Changes in v3:
- Fix commit message per Simon's comments

Changes in v2:
- Reorder this patch to follow the i8042 driver clean up patches

 drivers/input/i8042.c | 43 +++++++++++++++++++++----------------------
 1 file changed, 21 insertions(+), 22 deletions(-)

Applied to u-boot-x86, thanks!

author
#7 lore raw

PATCH v3 5/7 video: cfb_console: Allow VGA device to work without i8042 keyboard

In reply to Bin Meng

So far if CONFIG_VGA_AS_SINGLE_DEVICE is not defined, the VGA device will try to initialize a keyboard device (for x86, it is i8042). But if i8042 controller initialization fails (eg: there is no keyboard connected to the PS/2 port), drv_video_init() just simply returns. This kills the opportunity of using a usb keyboard later with the vga console, as the vga initialization part is actually ok, only keyboard part fails. Change the code logic to allow this.

---
In the long term, we should remove CONFIG_VGA_AS_SINGLE_DEVICE and treat the cfb_concole an output device only. The keyboard part should be moved out of cfb_console driver and be as a input device driver separately.

Changes in v3: None
Changes in v2: None

 drivers/video/cfb_console.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)
drivers/video/cfb_console.c +5 -6
index 30e0317..aa7ca86 100644
@@ -2247,16 +2247,17 @@ __weak int board_video_skip(void)
 
 int drv_video_init(void)
 {
-	int skip_dev_init;
 	struct stdio_dev console_dev;
 	bool have_keyboard;
+	bool __maybe_unused keyboard_ok = false;
 
 	/* Check if video initialization should be skipped */
 	if (board_video_skip())
 		return 0;
 
 	/* Init video chip - returns with framebuffer cleared */
-	skip_dev_init = (video_init() == -1);
+	if (video_init() == -1)
+		return 0;
 
 	if (board_cfb_skip())
 		return 0;
@@ -2272,11 +2273,9 @@ int drv_video_init(void)
 	if (have_keyboard) {
 		debug("KBD: Keyboard init ...\n");
 #if !defined(CONFIG_VGA_AS_SINGLE_DEVICE)
-		skip_dev_init |= (VIDEO_KBD_INIT_FCT == -1);
+		keyboard_ok = !(VIDEO_KBD_INIT_FCT == -1);
 #endif
 	}
-	if (skip_dev_init)
-		return 0;
 
 	/* Init vga device */
 	memset(&console_dev, 0, sizeof(console_dev));
@@ -2287,7 +2286,7 @@ int drv_video_init(void)
 	console_dev.puts = video_puts;	/* 'puts' function */
 
 #if !defined(CONFIG_VGA_AS_SINGLE_DEVICE)
-	if (have_keyboard) {
+	if (have_keyboard && keyboard_ok) {
 		/* Also init console device */
 		console_dev.flags |= DEV_FLAGS_INPUT;
 		console_dev.tstc = VIDEO_TSTC_FCT;	/* 'tstc' function */
Signature · 1 line
1.8.2.1
#8 lore raw

PATCH v3 5/7 video: cfb_console: Allow VGA device to work without i8042 keyboard

Hi Anatolkij,

Quoted 10 lines · Bin Meng

So far if CONFIG_VGA_AS_SINGLE_DEVICE is not defined, the VGA device will try to initialize a keyboard device (for x86, it is i8042). But if i8042 controller initialization fails (eg: there is no keyboard connected to the PS/2 port), drv_video_init() just simply returns. This kills the opportunity of using a usb keyboard later with the vga console, as the vga initialization part is actually ok, only keyboard part fails. Change the code logic to allow this.

What are your thoughts on this patch, please?

Quoted 60 lines

---
In the long term, we should remove CONFIG_VGA_AS_SINGLE_DEVICE and treat the cfb_concole an output device only. The keyboard part should be moved out of cfb_console driver and be as a input device driver separately.

Changes in v3: None
Changes in v2: None

 drivers/video/cfb_console.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)
drivers/video/cfb_console.c +5 -7
index 30e0317..aa7ca86 100644
@@ -2247,16 +2247,17 @@ __weak int board_video_skip(void)
 
 int drv_video_init(void)
 {
-       int skip_dev_init;
        struct stdio_dev console_dev;
        bool have_keyboard;
+       bool __maybe_unused keyboard_ok = false;
 
        /* Check if video initialization should be skipped */
        if (board_video_skip())
                return 0;
 
        /* Init video chip - returns with framebuffer cleared */
-       skip_dev_init = (video_init() == -1);
+       if (video_init() == -1)
+               return 0;
 
        if (board_cfb_skip())
                return 0;
@@ -2272,11 +2273,9 @@ int drv_video_init(void)
        if (have_keyboard) {
                debug("KBD: Keyboard init ...\n");
 #if !defined(CONFIG_VGA_AS_SINGLE_DEVICE)
-               skip_dev_init |= (VIDEO_KBD_INIT_FCT == -1);
+               keyboard_ok = !(VIDEO_KBD_INIT_FCT == -1);
 #endif
        }
-       if (skip_dev_init)
-               return 0;
 
        /* Init vga device */
        memset(&console_dev, 0, sizeof(console_dev));
@@ -2287,7 +2286,7 @@ int drv_video_init(void)
        console_dev.puts = video_puts;  /* 'puts' function */
 
 #if !defined(CONFIG_VGA_AS_SINGLE_DEVICE)
-       if (have_keyboard) {
+       if (have_keyboard && keyboard_ok) {
                /* Also init console device */
                console_dev.flags |= DEV_FLAGS_INPUT;
                console_dev.tstc = VIDEO_TSTC_FCT;      /* 'tstc' function */
--
Quoted 2 lines

1.8.2.1

Regards,
Simon

#9 lore raw

PATCH v3 5/7 video: cfb_console: Allow VGA device to work without i8042 keyboard

Hi Simon,

Quoted 9 lines · On Mon, 24 Aug 2015 22:13:41 -0600 Simon Glass <[email protected]> wrote:
Quoted 8 lines · Bin Meng

So far if CONFIG_VGA_AS_SINGLE_DEVICE is not defined, the VGA device will try to initialize a keyboard device (for x86, it is i8042). But if i8042 controller initialization fails (eg: there is no keyboard connected to the PS/2 port), drv_video_init() just simply returns. This kills the opportunity of using a usb keyboard later with the vga console, as the vga initialization part is actually ok, only keyboard part fails. Change the code logic to allow this.

Quoted 4 lines
Quoted 2 lines

What are your thoughts on this patch, please?

it is okay for me, please merge it with other patches in this series.

Thanks,

Anatolij

#10 lore raw

PATCH v3 5/7 video: cfb_console: Allow VGA device to work without i8042 keyboard

Quoted 17 lines · Anatolij Gustschin

Hi Simon,

Quoted 12 lines · On Mon, 24 Aug 2015 22:13:41 -0600 Simon Glass <[email protected]> wrote:
Quoted 10 lines · Bin Meng

So far if CONFIG_VGA_AS_SINGLE_DEVICE is not defined, the VGA device will try to initialize a keyboard device (for x86, it is i8042). But if i8042 controller initialization fails (eg: there is no keyboard connected to the PS/2 port), drv_video_init() just simply returns. This kills the opportunity of using a usb keyboard later with the vga console, as the vga initialization part is actually ok, only keyboard part fails. Change the code logic to allow this.

Quoted 7 lines
Quoted 1 line

What are your thoughts on this patch, please?

it is okay for me, please merge it with other patches in this series.

Thanks,

Anatolij

Applied to u-boot-x86, thanks!

#11 lore raw

PATCH v3 5/7 video: cfb_console: Allow VGA device to work without i8042 keyboard

In reply to Bin Meng

Hi Bin,

Quoted 10 lines · On Mon, 24 Aug 2015 01:00:07 -0700 Bin Meng <[email protected]> wrote:

So far if CONFIG_VGA_AS_SINGLE_DEVICE is not defined, the VGA device will try to initialize a keyboard device (for x86, it is i8042). But if i8042 controller initialization fails (eg: there is no keyboard connected to the PS/2 port), drv_video_init() just simply returns. This kills the opportunity of using a usb keyboard later with the vga console, as the vga initialization part is actually ok, only keyboard part fails. Change the code logic to allow this.

author
#12 lore raw

PATCH v3 6/7 x86: crownbay: Enable on-board SMSC superio keyboard controller

In reply to Bin Meng

So far we only enabled one legacy serial port on the SMSC LPC47m superio chipset on Intel Crown Bay board. As the board also has dual PS/2 ports routed out, enable the keyboard controller which is i8042 compatible so that we can use PS/2 keyboard and mouse.

In order to make PS/2 keyboard work with the VGA console, remove CONFIG_VGA_AS_SINGLE_DEVICE. To boot Linux kernel with PIC mode using PIRQ routing table, adjust the mask in the device tree to reserve irq12 which is used by PS/2 mouse.

---

Changes in v3: None
Changes in v2: None

 arch/x86/dts/crownbay.dts       | 2 +-
 board/intel/crownbay/crownbay.c | 7 ++++---
 include/configs/crownbay.h      | 3 ---
 3 files changed, 5 insertions(+), 7 deletions(-)
arch/x86/dts/crownbay.dts +1 -1
index 3af9cc3..800901c 100644
@@ -168,7 +168,7 @@
 			compatible = "intel,irq-router";
 			intel,pirq-config = "pci";
 			intel,pirq-link = <0x60 8>;
-			intel,pirq-mask = <0xdee0>;
+			intel,pirq-mask = <0xcee0>;
 			intel,pirq-routing = <
 				/* TunnelCreek PCI devices */
 				PCI_BDF(0, 2, 0) INTA PIRQE
board/intel/crownbay/crownbay.c +4 -3
index ad2d5b6..d6de9fa 100644
@@ -10,11 +10,12 @@
 #include <netdev.h>
 #include <smsc_lpc47m.h>
 
-#define SERIAL_DEV PNP_DEV(0x2e, 4)
-
 int board_early_init_f(void)
 {
-	lpc47m_enable_serial(SERIAL_DEV, UART0_BASE, UART0_IRQ);
+	lpc47m_enable_serial(PNP_DEV(LPC47M_IO_PORT, LPC47M_SP1),
+			     UART0_BASE, UART0_IRQ);
+	lpc47m_enable_kbc(PNP_DEV(LPC47M_IO_PORT, LPC47M_KBC),
+			  KBD_IRQ, MSE_IRQ);
 
 	return 0;
 }
include/configs/crownbay.h +0 -3
index e87bd54..32b6006 100644
@@ -54,9 +54,6 @@
 #define CONFIG_PCH_GBE
 #define CONFIG_PHYLIB
 
-/* TunnelCreek IGD support */
-#define CONFIG_VGA_AS_SINGLE_DEVICE
-
 /* Environment configuration */
 #define CONFIG_ENV_SECT_SIZE		0x1000
 #define CONFIG_ENV_OFFSET		0
Signature · 1 line
1.8.2.1
#13 lore raw

PATCH v3 6/7 x86: crownbay: Enable on-board SMSC superio keyboard controller

Quoted 15 lines · Bin Meng

So far we only enabled one legacy serial port on the SMSC LPC47m superio chipset on Intel Crown Bay board. As the board also has dual PS/2 ports routed out, enable the keyboard controller which is i8042 compatible so that we can use PS/2 keyboard and mouse.

In order to make PS/2 keyboard work with the VGA console, remove CONFIG_VGA_AS_SINGLE_DEVICE. To boot Linux kernel with PIC mode using PIRQ routing table, adjust the mask in the device tree to reserve irq12 which is used by PS/2 mouse.

---

Quoted 7 lines

Changes in v3: None
Changes in v2: None

 arch/x86/dts/crownbay.dts       | 2 +-
 board/intel/crownbay/crownbay.c | 7 ++++---
 include/configs/crownbay.h      | 3 ---
 3 files changed, 5 insertions(+), 7 deletions(-)

Applied to u-boot-x86, thanks!

author
#14 lore raw

PATCH v3 7/7 video: ct69000: Remove unused codes

In reply to Bin Meng

Remove unused CONFIG_USE_CPCIDVI wrapped codes.

---

Changes in v3:
- New patch to remove unused codes in ct69000 driver

Changes in v2: None

 drivers/video/ct69000.c | 21 ---------------------
 1 file changed, 21 deletions(-)
drivers/video/ct69000.c +0 -21
index 168b9ba..22b3441 100644
@@ -256,9 +256,6 @@ struct ctfb_chips_properties {
 
 static const struct ctfb_chips_properties chips[] = {
 	{PCI_DEVICE_ID_CT_69000, 0x200000, 1, 4, -2, 3, 257, 100, 220},
-#ifdef CONFIG_USE_CPCIDVI
-	{PCI_DEVICE_ID_CT_69030, 0x400000, 1, 4, -2, 3, 257, 100, 220},
-#endif
 	{PCI_DEVICE_ID_CT_65555, 0x100000, 16, 4, 0, 1, 255, 48, 220},	/* NOT TESTED */
 	{0, 0, 0, 0, 0, 0, 0, 0, 0}	/* Terminator */
 };
@@ -944,9 +941,6 @@ SetDrawingEngine (int bits_per_pixel)
 */
 static struct pci_device_id supported[] = {
 	{PCI_VENDOR_ID_CT, PCI_DEVICE_ID_CT_69000},
-#ifdef CONFIG_USE_CPCIDVI
-	{PCI_VENDOR_ID_CT, PCI_DEVICE_ID_CT_69030},
-#endif
 	{}
 };
 
@@ -1111,22 +1105,7 @@ video_hw_init (void)
 	pGD->cprBase = pci_mem_base;	/* Dummy */
 	/* set up Hardware */
 
-#ifdef CONFIG_USE_CPCIDVI
-	if (device_id == PCI_DEVICE_ID_CT_69030) {
-		ctWrite (CT_MSR_W_O, 0x0b);
-		ctWrite (0x3cd, 0x13);
-		ctWrite_i (CT_FP_O, 0x02, 0x00);
-		ctWrite_i (CT_FP_O, 0x05, 0x00);
-		ctWrite_i (CT_FP_O, 0x06, 0x00);
-		ctWrite (0x3c2, 0x0b);
-		ctWrite_i (CT_FP_O, 0x02, 0x10);
-		ctWrite_i (CT_FP_O, 0x01, 0x09);
-	} else {
-		ctWrite (CT_MSR_W_O, 0x01);
-	}
-#else
 	ctWrite (CT_MSR_W_O, 0x01);
-#endif
 
 	/* set the extended Registers */
 	ctLoadRegs (CT_XR_O, xreg);
Signature · 1 line
1.8.2.1
#15 lore raw

PATCH v3 7/7 video: ct69000: Remove unused codes

Quoted 6 lines · Bin Meng

Remove unused CONFIG_USE_CPCIDVI wrapped codes.

---

Quoted 7 lines

Changes in v3:
- New patch to remove unused codes in ct69000 driver

Changes in v2: None

 drivers/video/ct69000.c | 21 ---------------------
 1 file changed, 21 deletions(-)
#18 lore raw

PATCH v3 1/7 x86: i8042: Remove unused codes

In reply to Bin Meng
Quoted 6 lines · Bin Meng

Remove unused CONFIG_USE_CPCIDVI wrapped codes.

---

Quoted 8 lines

Changes in v3:
- Keep i8042_flush(), i8042_disable() and board_i8042_skip()

Changes in v2:
- Split the removing of unused codes into this patch

 drivers/input/i8042.c | 17 -----------------
 1 file changed, 17 deletions(-)
#19 lore raw

PATCH v3 1/7 x86: i8042: Remove unused codes

Quoted 10 lines · Simon Glass
Quoted 9 lines · Bin Meng

Remove unused CONFIG_USE_CPCIDVI wrapped codes.

---

Changes in v3:
- Keep i8042_flush(), i8042_disable() and board_i8042_skip()

Quoted 7 lines
Quoted 5 lines

Changes in v2:
- Split the removing of unused codes into this patch

 drivers/input/i8042.c | 17 -----------------
 1 file changed, 17 deletions(-)

I'm also going to apply this series as a bug-fix since it corrects the i8042 controller init, etc.

Applied to u-boot-x86, thanks!