diff mbox

[U-Boot,v1,05/21] sparc: Serial baud rate register support multiple buses with different frequency

Message ID 1448293142-9217-6-git-send-email-fgretief@spaceteq.co.za
State Accepted
Delegated to: Daniel Hellstrom
Headers show

Commit Message

Francois Retief Nov. 23, 2015, 3:38 p.m. UTC
From: Daniel Hellstrom <daniel@gaisler.com>

Signed-off-by: Daniel Hellstrom <daniel@gaisler.com>
Signed-off-by: Francois Retief <fgretief@spaceteq.co.za>
---

 arch/sparc/cpu/leon2/serial.c        |  2 +-
 arch/sparc/cpu/leon3/serial.c        | 17 ++++++++++++++---
 arch/sparc/include/asm/global_data.h |  1 +
 3 files changed, 16 insertions(+), 4 deletions(-)
diff mbox

Patch

diff --git a/arch/sparc/cpu/leon2/serial.c b/arch/sparc/cpu/leon2/serial.c
index 603364e..460abd1 100644
--- a/arch/sparc/cpu/leon2/serial.c
+++ b/arch/sparc/cpu/leon2/serial.c
@@ -120,7 +120,7 @@  static void leon2_serial_setbrg(void)
 	if (!gd->baudrate)
 		gd->baudrate = CONFIG_BAUDRATE;
 
-	scaler = leon2_serial_calc_scaler(CONFIG_SYS_CLK_FREQ, CONFIG_BAUDRATE);
+	scaler = leon2_serial_calc_scaler(CONFIG_SYS_CLK_FREQ, gd->baudrate);
 
 	writel(scaler, &uart->UART_Scaler);
 }
diff --git a/arch/sparc/cpu/leon3/serial.c b/arch/sparc/cpu/leon3/serial.c
index 15d0226..5348a78 100644
--- a/arch/sparc/cpu/leon3/serial.c
+++ b/arch/sparc/cpu/leon3/serial.c
@@ -20,6 +20,11 @@  DECLARE_GLOBAL_DATA_PTR;
 #define CONFIG_SYS_GRLIB_APBUART_INDEX 0
 #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)
 {
 	ambapp_dev_apbuart *uart;
@@ -37,8 +42,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) */
@@ -123,7 +131,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);
 }
@@ -156,7 +167,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;
 }
 
diff --git a/arch/sparc/include/asm/global_data.h b/arch/sparc/include/asm/global_data.h
index 0680a56..71820f0 100644
--- a/arch/sparc/include/asm/global_data.h
+++ b/arch/sparc/include/asm/global_data.h
@@ -16,6 +16,7 @@ 
 /* Architecture-specific global data */
 struct arch_global_data {
 	void *uart;
+	unsigned int uart_freq;
 };
 
 #include <asm-generic/global_data.h>