From 85779a34a161c324cc8af995ada4393137275f20 Mon Sep 17 00:00:00 2001 From: Marcelo Povoa Date: Tue, 18 Feb 2014 14:17:38 -0800 Subject: [PATCH] libpayload: Add minimal support for PL011 UART This creates a new PL011 config variable which avoids the infinite busy wait on serial_putchar() because the register mapping is not compatible with current implementation. BUG=None BRANCH=none TEST=printf() works on the PL011 based ARMv8 foundation model Change-Id: I9feda35a50a3488fc504d1561444161e0889deda Signed-off-by: Marcelo Povoa Reviewed-on: https://chromium-review.googlesource.com/187020 Reviewed-by: David Hendricks --- payloads/libpayload/Config.in | 5 +++++ payloads/libpayload/drivers/serial.c | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/payloads/libpayload/Config.in b/payloads/libpayload/Config.in index 112f6a1eef..b6b4addea6 100644 --- a/payloads/libpayload/Config.in +++ b/payloads/libpayload/Config.in @@ -168,6 +168,11 @@ config 8250_SERIAL_CONSOLE default y if ARCH_X86 default n if !ARCH_X86 +config PL011_SERIAL_CONSOLE + bool "PL011 compatible serial port driver" + depends on 8250_SERIAL_CONSOLE + default n + config SERIAL_IOBASE ## This default is currently not used on non-x86 systems. hex "Default I/O base for the serial port (default 0x3f8)" diff --git a/payloads/libpayload/drivers/serial.c b/payloads/libpayload/drivers/serial.c index 3daf46082c..6ecc5d2100 100644 --- a/payloads/libpayload/drivers/serial.c +++ b/payloads/libpayload/drivers/serial.c @@ -63,6 +63,7 @@ static void serial_hardware_init(int speed, int word_bits, { unsigned char reg; +#ifndef PL011_SERIAL_CONSOLE /* Disable interrupts. */ serial_write_reg(0, 0x01); @@ -81,6 +82,7 @@ static void serial_hardware_init(int speed, int word_bits, /* Restore the previous value of the divisor. * And set 8 bits per character */ serial_write_reg((reg & ~0x80) | 3, 0x03); +#endif } #endif @@ -136,7 +138,9 @@ void serial_putchar(unsigned int c) { if (!serial_hardware_is_present) return; +#ifndef CONFIG_LP_PL011_SERIAL_CONSOLE while ((serial_read_reg(0x05) & 0x20) == 0) ; +#endif serial_write_reg(c, 0x00); }