summaryrefslogtreecommitdiffstats
path: root/arch/blackfin/cpu/serial.c
diff options
context:
space:
mode:
authorWolfgang Denk <wd@denx.de>2011-10-01 21:42:21 +0200
committerWolfgang Denk <wd@denx.de>2011-10-01 21:42:21 +0200
commit97d7ab8a8eb6dbf7c9e8096f31031dfed81db8f8 (patch)
treeee8afc46f2b1db1d875951f5641e4b917c85fe39 /arch/blackfin/cpu/serial.c
parentaf708cbaae3c7254a50aee333b860dffc78db45d (diff)
parent90a75b050b8a23a6e8f558cc9a76658d8443509d (diff)
downloadblackbird-obmc-uboot-97d7ab8a8eb6dbf7c9e8096f31031dfed81db8f8.tar.gz
blackbird-obmc-uboot-97d7ab8a8eb6dbf7c9e8096f31031dfed81db8f8.zip
Merge branch 'post' of git://git.denx.de/u-boot-blackfin
* 'post' of git://git.denx.de/u-boot-blackfin: Blackfin: uart: implement loop callback for post Blackfin: bf537-stamp/bf548-ezkit: update POST flash block range Blackfin: post: generalize led/button tests with GPIOs Blackfin: bf537-stamp: drop uart/flash post tests Blackfin: post: drop custom test list Blackfin: bf537-stamp: convert to gpio post hotkey
Diffstat (limited to 'arch/blackfin/cpu/serial.c')
-rw-r--r--arch/blackfin/cpu/serial.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/arch/blackfin/cpu/serial.c b/arch/blackfin/cpu/serial.c
index 030160f418..6603dc099a 100644
--- a/arch/blackfin/cpu/serial.c
+++ b/arch/blackfin/cpu/serial.c
@@ -38,6 +38,7 @@
*/
#include <common.h>
+#include <post.h>
#include <watchdog.h>
#include <serial.h>
#include <linux/compiler.h>
@@ -153,6 +154,30 @@ static int uart_getc(uint32_t uart_base)
return uart_rbr_val;
}
+#if CONFIG_POST & CONFIG_SYS_POST_UART
+# define LOOP(x) x
+#else
+# define LOOP(x)
+#endif
+
+LOOP(
+static void uart_loop(uint32_t uart_base, int state)
+{
+ u16 mcr;
+
+ /* Drain the TX fifo first so bytes don't come back */
+ while (!(uart_lsr_read(uart_base) & TEMT))
+ continue;
+
+ mcr = bfin_read(&pUART->mcr);
+ if (state)
+ mcr |= LOOP_ENA | MRTS;
+ else
+ mcr &= ~(LOOP_ENA | MRTS);
+ bfin_write(&pUART->mcr, mcr);
+}
+)
+
#ifdef CONFIG_SYS_BFIN_UART
static void uart_puts(uint32_t uart_base, const char *s)
@@ -202,6 +227,13 @@ static void uart##n##_puts(const char *s) \
uart_puts(MMR_UART(n), s); \
} \
\
+LOOP( \
+static void uart##n##_loop(int state) \
+{ \
+ uart_loop(MMR_UART(n), state); \
+} \
+) \
+\
struct serial_device bfin_serial##n##_device = { \
.name = "bfin_uart"#n, \
.init = uart##n##_init, \
@@ -211,6 +243,7 @@ struct serial_device bfin_serial##n##_device = { \
.tstc = uart##n##_tstc, \
.putc = uart##n##_putc, \
.puts = uart##n##_puts, \
+ LOOP(.loop = uart##n##_loop) \
};
#ifdef UART0_DLL
@@ -307,6 +340,13 @@ void serial_puts(const char *s)
serial_putc(*s++);
}
+LOOP(
+void serial_loop(int state)
+{
+ uart_loop(UART_DLL, state);
+}
+)
+
#endif
#endif
OpenPOWER on IntegriCloud