summaryrefslogtreecommitdiff
path: root/arch/blackfin
diff options
context:
space:
mode:
authorSonic Zhang <sonic.zhang@analog.com>2013-03-13 19:06:16 +0800
committerSonic Zhang <sonic.zhang@analog.com>2013-05-13 16:26:27 +0800
commit50aadcc560560f7365bb6373d4db1375522c4fe3 (patch)
treeb0e04751dcaaeb59e03d00229a0cd7052a595e41 /arch/blackfin
parentd4d4f903773e0e5540baa00157585de25a542ba6 (diff)
downloadu-boot-imx-50aadcc560560f7365bb6373d4db1375522c4fe3.zip
u-boot-imx-50aadcc560560f7365bb6373d4db1375522c4fe3.tar.gz
u-boot-imx-50aadcc560560f7365bb6373d4db1375522c4fe3.tar.bz2
blackfin: Enable early print via the generic serial API.
Remove blackfin specific implementation of the generic serial API when early print macro is defined. In BFIN_BOOT_BYPASS mode, don't call generic serial_puts, because early print in bypass mode is running before code binary is relocated to the link address. Signed-off-by: Sonic Zhang <sonic.zhang@analog.com>
Diffstat (limited to 'arch/blackfin')
-rw-r--r--arch/blackfin/cpu/serial.c71
-rw-r--r--arch/blackfin/cpu/serial.h10
2 files changed, 29 insertions, 52 deletions
diff --git a/arch/blackfin/cpu/serial.c b/arch/blackfin/cpu/serial.c
index 36d2a5c..89290d6 100644
--- a/arch/blackfin/cpu/serial.c
+++ b/arch/blackfin/cpu/serial.c
@@ -197,13 +197,16 @@ static void uart_loop(uint32_t uart_base, int state)
static inline void __serial_set_baud(uint32_t uart_base, uint32_t baud)
{
+#ifdef CONFIG_DEBUG_EARLY_SERIAL
+ serial_early_set_baud(uart_base, baud);
+#else
uint16_t divisor = (get_uart_clk() + (baud * 8)) / (baud * 16)
- ANOMALY_05000230;
/* Program the divisor to get the baud rate we want */
serial_set_divisor(uart_base, divisor);
+#endif
}
-#ifdef CONFIG_SYS_BFIN_UART
static void uart_puts(uint32_t uart_base, const char *s)
{
@@ -313,65 +316,39 @@ void bfin_serial_initialize(void)
#endif
}
-#else
-
-/* Symbol for our assembly to call. */
-void serial_set_baud(uint32_t baud)
-{
- serial_early_set_baud(UART_BASE, baud);
-}
-
-/* Symbol for common u-boot code to call.
- * Setup the baudrate (brg: baudrate generator).
- */
-void serial_setbrg(void)
+#ifdef CONFIG_DEBUG_EARLY_SERIAL
+inline void uart_early_putc(uint32_t uart_base, const char c)
{
- serial_set_baud(gd->baudrate);
-}
-
-/* Symbol for our assembly to call. */
-void serial_initialize(void)
-{
- serial_early_init(UART_BASE);
-}
-
-/* Symbol for common u-boot code to call. */
-int serial_init(void)
-{
- serial_initialize();
- serial_setbrg();
- uart_lsr_clear(UART_BASE);
- return 0;
-}
+ /* send a \r for compatibility */
+ if (c == '\n')
+ uart_early_putc(uart_base, '\r');
-int serial_tstc(void)
-{
- return uart_tstc(UART_BASE);
-}
+ /* wait for the hardware fifo to clear up */
+ while (!(_lsr_read(pUART) & THRE))
+ continue;
-int serial_getc(void)
-{
- return uart_getc(UART_BASE);
+ /* queue the character for transmission */
+ bfin_write(&pUART->thr, c);
+ SSYNC();
}
-void serial_putc(const char c)
+void uart_early_puts(const char *s)
{
- uart_putc(UART_BASE, c);
+ while (*s)
+ uart_early_putc(UART_BASE, *s++);
}
-void serial_puts(const char *s)
+/* Symbol for our assembly to call. */
+void _serial_early_set_baud(uint32_t baud)
{
- while (*s)
- serial_putc(*s++);
+ serial_early_set_baud(UART_BASE, baud);
}
-LOOP(
-void serial_loop(int state)
+/* Symbol for our assembly to call. */
+void _serial_early_init(void)
{
- uart_loop(UART_BASE, state);
+ serial_early_init(UART_BASE);
}
-)
-
#endif
#endif
diff --git a/arch/blackfin/cpu/serial.h b/arch/blackfin/cpu/serial.h
index d67fd81..87a337d 100644
--- a/arch/blackfin/cpu/serial.h
+++ b/arch/blackfin/cpu/serial.h
@@ -78,16 +78,16 @@ static inline void serial_early_puts(const char *s)
#else
.macro serial_early_init
-#if defined(CONFIG_DEBUG_EARLY_SERIAL) && defined(BFIN_BOOT_BYPASS)
- call _serial_initialize;
+#if defined(CONFIG_DEBUG_EARLY_SERIAL) && !defined(CONFIG_UART_MEM)
+ call __serial_early_init;
#endif
.endm
.macro serial_early_set_baud
-#if defined(CONFIG_DEBUG_EARLY_SERIAL) && defined(BFIN_BOOT_BYPASS)
+#if defined(CONFIG_DEBUG_EARLY_SERIAL) && !defined(CONFIG_UART_MEM)
R0.L = LO(CONFIG_BAUDRATE);
R0.H = HI(CONFIG_BAUDRATE);
- call _serial_set_baud;
+ call __serial_early_set_baud;
#endif
.endm
@@ -121,7 +121,7 @@ static inline void serial_early_puts(const char *s)
R0.L = 7b; \
R0.H = 7b; \
update_serial_early_string_addr \
- call _serial_puts;
+ call _uart_early_puts;
#else
# define serial_early_puts(str)
#endif