summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVladimir Serbinenko <phcoder@gmail.com>2014-01-26 03:55:01 +0100
committerVladimir Serbinenko <phcoder@gmail.com>2014-01-26 17:39:42 +0100
commit63e35f207c1dd80d9293b42a761e548d282a5260 (patch)
tree2fe4a14eeb8db78bdb0326c674e59e224f3c0762 /src
parente0553b436bb63858556abc1e85d68f8aad059f44 (diff)
pc80/keyboard: Ignore interface test failure.
On Asus A8N-E this test fails but if failure is ignored keyboard works. Change-Id: Ifeeff2f41537b35bc90a679f956fea830b94292c Signed-off-by: Vladimir Serbinenko <phcoder@gmail.com> Reviewed-on: http://review.coreboot.org/4816 Tested-by: build bot (Jenkins) Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/drivers/pc80/keyboard.c27
-rw-r--r--src/include/types.h4
2 files changed, 22 insertions, 9 deletions
diff --git a/src/drivers/pc80/keyboard.c b/src/drivers/pc80/keyboard.c
index dd6321e139..5b686170c6 100644
--- a/src/drivers/pc80/keyboard.c
+++ b/src/drivers/pc80/keyboard.c
@@ -24,6 +24,7 @@
#include <device/device.h>
#include <arch/io.h>
#include <delay.h>
+#include <types.h>
#if CONFIG_HAVE_ACPI_RESUME
#include <arch/acpi.h>
#endif
@@ -111,7 +112,7 @@ static int kbc_cleanup_buffers(void)
return !!timeout;
}
-static int kbc_self_test(void)
+static enum cb_err kbc_self_test(void)
{
u8 self_test;
@@ -119,7 +120,7 @@ static int kbc_self_test(void)
* Both input and output buffers must be empty.
*/
if (!kbc_cleanup_buffers())
- return 0;
+ return CB_KBD_CONTROLLER_FAILURE;
/* reset/self test 8042 - send cmd 0xAA */
outb(KBC_CMD_SELF_TEST, KBD_COMMAND);
@@ -127,7 +128,7 @@ static int kbc_self_test(void)
if (!kbc_output_buffer_full()) {
/* There probably is no keyboard controller. */
printk(BIOS_ERR, "Could not reset keyboard controller.\n");
- return 0;
+ return CB_KBD_CONTROLLER_FAILURE;
}
/* read self-test result, 0x55 is returned in the output buffer */
@@ -136,7 +137,7 @@ static int kbc_self_test(void)
if (self_test != 0x55) {
printk(BIOS_ERR, "Keyboard Controller self-test failed: 0x%x\n",
self_test);
- return 0;
+ return CB_KBD_CONTROLLER_FAILURE;
}
/* ensure the buffers are empty */
@@ -147,7 +148,7 @@ static int kbc_self_test(void)
if (!kbc_output_buffer_full()) {
printk(BIOS_ERR, "Keyboard Interface test timed out.\n");
- return 0;
+ return CB_KBD_CONTROLLER_FAILURE;
}
/* read test result, 0x00 should be returned in case of no failures */
@@ -156,10 +157,10 @@ static int kbc_self_test(void)
if (self_test != 0x00) {
printk(BIOS_ERR, "Keyboard Interface test failed: 0x%x\n",
self_test);
- return 0;
+ return CB_KBD_INTERFACE_FAILURE;
}
- return 1;
+ return CB_SUCCESS;
}
static u8 send_keyboard(u8 command)
@@ -196,6 +197,8 @@ void pc_keyboard_init(struct pc_keyboard *keyboard)
{
u8 retries;
u8 regval;
+ enum cb_err err;
+
if (!CONFIG_DRIVERS_PS2_KEYBOARD)
return;
@@ -207,7 +210,9 @@ void pc_keyboard_init(struct pc_keyboard *keyboard)
printk(BIOS_DEBUG, "Keyboard init...\n");
/* Run a keyboard controller self-test */
- if (!kbc_self_test())
+ err = kbc_self_test();
+ /* Ignore iterface failure as it's non-fatal. */
+ if (err != CB_SUCCESS && err != CB_KBD_INTERFACE_FAILURE)
return;
/* Enable keyboard interface - No IRQ */
@@ -308,8 +313,12 @@ void pc_keyboard_init(struct pc_keyboard *keyboard)
*/
void set_kbc_ps2_mode(void)
{
+ enum cb_err err;
+
/* Run a keyboard controller self-test */
- if (!kbc_self_test())
+ err = kbc_self_test();
+ /* Ignore iterface failure as it's non-fatal. */
+ if (err != CB_SUCCESS && err != CB_KBD_INTERFACE_FAILURE)
return;
/* Support PS/2 mode */
diff --git a/src/include/types.h b/src/include/types.h
index d1f991eb5d..ef5edc1781 100644
--- a/src/include/types.h
+++ b/src/include/types.h
@@ -41,6 +41,10 @@ enum cb_err {
CB_CMOS_OPTION_NOT_FOUND = -102, /**< Option string not found */
CB_CMOS_ACCESS_ERROR = -103, /**< CMOS access error */
CB_CMOS_CHECKSUM_INVALID = -104, /**< CMOS checksum is invalid */
+
+ /* Keyboard test failures */
+ CB_KBD_CONTROLLER_FAILURE = -200,
+ CB_KBD_INTERFACE_FAILURE = -201
};
#endif /* __TYPES_H */