[U-Boot] [PATCH 07/17] LEON3: serial baud rate register support multiple buses with different frequency.

Daniel Hellstrom daniel at gaisler.com
Thu Jan 28 13:16:26 CET 2010


Signed-off-by: Daniel Hellstrom <daniel at gaisler.com>
---
 cpu/leon3/serial.c |   17 ++++++++++++++---
 1 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/cpu/leon3/serial.c b/cpu/leon3/serial.c
index 8964310..1f17ede 100644
--- a/cpu/leon3/serial.c
+++ b/cpu/leon3/serial.c
@@ -47,11 +47,18 @@ DECLARE_GLOBAL_DATA_PTR;
 #endif
 
 ambapp_dev_apbuart *leon3_apbuart = NULL;
+unsigned int apbuart_freq = CONFIG_SYS_CLK_FREQ;
+
+unsigned int apbuart_calc_scaler(unsigned int apbuart_freq, unsigned int baud)
+{
+	return ((((apbuart_freq*10)/(baud*8))-5)/10);
+}
 
 int serial_init(void)
 {
 	ambapp_apbdev apbdev;
 	unsigned int tmp;
+	unsigned int freq;
 
 	/* find UART */
 	if (ambapp_apb_find(&ambapp_plb, VENDOR_GAISLER, GAISLER_APBUART,
@@ -65,7 +72,13 @@ int serial_init(void)
 		 *
 		 * Receiver & transmitter enable
 		 */
+#ifdef CONFIG_SYS_GRLIB_APBUART_SCALER
 		leon3_apbuart->scaler = CONFIG_SYS_GRLIB_APBUART_SCALER;
+#else
+		/* APBUART Frequency is equal to bus frequency */
+		freq = ambapp_bus_freq(&ambapp_plb, apbdev.ahb_bus_index);
+		leon3_apbuart->scaler = apbuart_calc_scaler(freq, CONFIG_BAUDRATE);
+#endif
 
 		/* Let bit 11 be unchanged (debug bit for GRMON) */
 		tmp = READ_WORD(leon3_apbuart->ctrl);
@@ -136,9 +149,7 @@ void serial_setbrg(void)
 	/* update baud rate settings, read it from gd->baudrate */
 	unsigned int scaler;
 	if (leon3_apbuart && (gd->baudrate > 0)) {
-		scaler =
-		    (((CONFIG_SYS_CLK_FREQ * 10) / (gd->baudrate * 8)) -
-		     5) / 10;
+		scaler = apbuart_calc_scaler(apbuart_freq, gd->baudrate);
 		leon3_apbuart->scaler = scaler;
 	}
 	return;
-- 
1.5.4



More information about the U-Boot mailing list