Fix serial console support for MCF5271.
authorMarian Balakowicz <m8@semihalf.com>
Tue, 9 May 2006 09:37:13 +0000 (11:37 +0200)
committerMarian Balakowicz <m8@semihalf.com>
Tue, 9 May 2006 09:37:13 +0000 (11:37 +0200)
CHANGELOG
cpu/mcf52x2/serial.c

index c637d010603566cc8e5489113ab9046652082606..d1a92b786800935ad403fd56e86dab3a9c920aa9 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,8 @@
 Changes since U-Boot 1.1.4:
 ======================================================================
 
+* Fix serial console support for MCF5271.
+
 * Fixes for gcc 3.4 based m68k toolchain,
   based on patch by Jate Sujjavanich.
 
index 8fbfad47bfbe67620871cf012b776d9bf9be8296..1cde1b6883de26eac60f26a28983ecc030b12c4b 100644 (file)
@@ -44,7 +44,7 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#ifdef CONFIG_M5249
+#if defined(CONFIG_M5249) || defined(CONFIG_M5271)
 #define DoubleClock(a) ((double)(CFG_CLK/2) / 32.0 / (double)(a))
 #else
 #define DoubleClock(a) ((double)(CFG_CLK) / 32.0 / (double)(a))
@@ -54,7 +54,10 @@ void rs_serial_setbaudrate(int port,int baudrate)
 {
 #if defined(CONFIG_M5272) || defined(CONFIG_M5249) || defined(CONFIG_M5271)
        volatile unsigned char  *uartp;
-       double clock, fraction;
+#ifndef CONFIG_M5271
+       double fraction;
+#endif
+       double clock;
 
        if (port == 0)
          uartp = (volatile unsigned char *) (CFG_MBAR + MCFUART_BASE1);
@@ -63,11 +66,11 @@ void rs_serial_setbaudrate(int port,int baudrate)
 
        clock = DoubleClock(baudrate);      /* Set baud above */
 
-       fraction = ((clock - (int)clock) * 16.0) + 0.5;
-
        uartp[MCFUART_UBG1] = (((int)clock >> 8) & 0xff);  /* set msb baud */
        uartp[MCFUART_UBG2] = ((int)clock & 0xff);  /* set lsb baud */
+
 #ifndef CONFIG_M5271
+       fraction = ((clock - (int)clock) * 16.0) + 0.5;
        uartp[MCFUART_UFPD] = ((int)fraction & 0xf);  /* set baud fraction adjust */
 #endif
 #endif
@@ -85,8 +88,9 @@ void rs_serial_init(int port,int baudrate)
        else
                uartp = (volatile unsigned char *) (CFG_MBAR + MCFUART_BASE2);
 
-       uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETRX;  /* reset RX */
        uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETTX;  /* reset TX */
+       uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETRX;  /* reset RX */
+
        uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETMRPTR;  /* reset MR pointer */
        uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETERR;  /* reset Error pointer */
 
@@ -96,9 +100,15 @@ void rs_serial_init(int port,int baudrate)
        uartp[MCFUART_UMR] = MCFUART_MR1_PARITYNONE | MCFUART_MR1_CS8;
        uartp[MCFUART_UMR] = MCFUART_MR2_STOP1;
 
-       rs_serial_setbaudrate(port,baudrate);
+       /* Mask UART interrupts */
+       uartp[MCFUART_UIMR] = 0;
 
+       /* Set clock Select Register: Tx/Rx clock is timer */
        uartp[MCFUART_UCSR] = MCFUART_UCSR_RXCLKTIMER | MCFUART_UCSR_TXCLKTIMER;
+       
+       rs_serial_setbaudrate(port,baudrate);
+
+       /* Enable Tx/Rx */
        uartp[MCFUART_UCR] = MCFUART_UCR_RXENABLE | MCFUART_UCR_TXENABLE;
 
        return;