summaryrefslogtreecommitdiff
path: root/arch/sparc/cpu/leon3/serial.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sparc/cpu/leon3/serial.c')
-rw-r--r--arch/sparc/cpu/leon3/serial.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/arch/sparc/cpu/leon3/serial.c b/arch/sparc/cpu/leon3/serial.c
index 66b3773027..bc6e7a172e 100644
--- a/arch/sparc/cpu/leon3/serial.c
+++ b/arch/sparc/cpu/leon3/serial.c
@@ -17,8 +17,18 @@ DECLARE_GLOBAL_DATA_PTR;
/* Select which UART that will become u-boot console */
#ifndef CONFIG_SYS_GRLIB_APBUART_INDEX
+/* Try to use CONFIG_CONS_INDEX, if available, it is numbered from 1 */
+#ifdef CONFIG_CONS_INDEX
+#define CONFIG_SYS_GRLIB_APBUART_INDEX (CONFIG_CONS_INDEX - 1)
+#else
#define CONFIG_SYS_GRLIB_APBUART_INDEX 0
#endif
+#endif
+
+static unsigned apbuart_calc_scaler(unsigned apbuart_freq, unsigned baud)
+{
+ return (((apbuart_freq * 10) / (baud * 8)) - 5) / 10;
+}
static int leon3_serial_init(void)
{
@@ -29,6 +39,7 @@ static int leon3_serial_init(void)
/* find UART */
if (ambapp_apb_find(&ambapp_plb, VENDOR_GAISLER, GAISLER_APBUART,
CONFIG_SYS_GRLIB_APBUART_INDEX, &apbdev) != 1) {
+ gd->flags &= ~GD_FLG_SERIAL_READY;
panic("%s: apbuart not found!\n", __func__);
return -1; /* didn't find hardware */
}
@@ -36,8 +47,11 @@ static int leon3_serial_init(void)
/* found apbuart, let's init .. */
uart = (ambapp_dev_apbuart *) apbdev.address;
+ /* APBUART Frequency is equal to bus frequency */
+ gd->arch.uart_freq = ambapp_bus_freq(&ambapp_plb, apbdev.ahb_bus_index);
+
/* Set scaler / baud rate */
- tmp = (((CONFIG_SYS_CLK_FREQ*10) / (CONFIG_BAUDRATE*8)) - 5)/10;
+ tmp = apbuart_calc_scaler(gd->arch.uart_freq, CONFIG_BAUDRATE);
writel(tmp, &uart->scaler);
/* Let bit 11 be unchanged (debug bit for GRMON) */
@@ -122,7 +136,10 @@ static void leon3_serial_setbrg(void)
if (!gd->baudrate)
gd->baudrate = CONFIG_BAUDRATE;
- scaler = (((CONFIG_SYS_CLK_FREQ*10) / (gd->baudrate*8)) - 5)/10;
+ if (!gd->arch.uart_freq)
+ gd->arch.uart_freq = CONFIG_SYS_CLK_FREQ;
+
+ scaler = apbuart_calc_scaler(gd->arch.uart_freq, gd->baudrate);
writel(scaler, &uart->scaler);
}
@@ -155,7 +172,7 @@ __weak struct serial_device *default_serial_console(void)
static inline void _debug_uart_init(void)
{
ambapp_dev_apbuart *uart = (ambapp_dev_apbuart *)CONFIG_DEBUG_UART_BASE;
- uart->scaler = (((CONFIG_DEBUG_UART_CLOCK*10) / (CONFIG_BAUDRATE*8)) - 5)/10;
+ uart->scaler = apbuart_calc_scaler(CONFIG_DEBUG_UART_CLOCK, CONFIG_BAUDRATE);
uart->ctrl = APBUART_CTRL_RE | APBUART_CTRL_TE;
}