summaryrefslogtreecommitdiff
path: root/drivers/serial
diff options
context:
space:
mode:
authorJon Loeliger <jdl@freescale.com>2008-07-10 12:05:32 -0500
committerJon Loeliger <jdl@freescale.com>2008-07-10 12:05:32 -0500
commit859f24350e6e4313626f85161dd03f025a4dac59 (patch)
treea025f68619045556e662326c8e1cbc147f9b633e /drivers/serial
parent3473ab737282b08ad61841fcbb14c4d264a93a8e (diff)
parente0320b1ebec13755911a53b0af12cbf3e5e49a65 (diff)
downloadu-boot-imx-859f24350e6e4313626f85161dd03f025a4dac59.zip
u-boot-imx-859f24350e6e4313626f85161dd03f025a4dac59.tar.gz
u-boot-imx-859f24350e6e4313626f85161dd03f025a4dac59.tar.bz2
Merge commit 'wd/master'
Diffstat (limited to 'drivers/serial')
-rw-r--r--drivers/serial/serial.c7
-rw-r--r--drivers/serial/serial_pl010.c8
2 files changed, 12 insertions, 3 deletions
diff --git a/drivers/serial/serial.c b/drivers/serial/serial.c
index 76425d8..182ca2d 100644
--- a/drivers/serial/serial.c
+++ b/drivers/serial/serial.c
@@ -144,8 +144,13 @@ static int calc_divisor (NS16550_t port)
#else
#define MODE_X_DIV 16
#endif
- return (CFG_NS16550_CLK / MODE_X_DIV / gd->baudrate);
+ /* Compute divisor value. Normally, we should simply return:
+ * CFG_NS16550_CLK) / MODE_X_DIV / gd->baudrate
+ * but we need to round that value by adding 0.5 or 8/16.
+ * Rounding is especially important at high baud rates.
+ */
+ return (((16 * CFG_NS16550_CLK) / MODE_X_DIV / gd->baudrate) + 8) / 16;
}
#if !defined(CONFIG_SERIAL_MULTI)
diff --git a/drivers/serial/serial_pl010.c b/drivers/serial/serial_pl010.c
index 417b6ae..134ed09 100644
--- a/drivers/serial/serial_pl010.c
+++ b/drivers/serial/serial_pl010.c
@@ -29,6 +29,7 @@
/* Should be fairly simple to make it work with the PL010 as well */
#include <common.h>
+#include <watchdog.h>
#ifdef CFG_PL010_SERIAL
@@ -137,7 +138,8 @@ void serial_setbrg (void)
static void pl010_putc (int portnum, char c)
{
/* Wait until there is space in the FIFO */
- while (IO_READ (port[portnum] + UART_PL01x_FR) & UART_PL01x_FR_TXFF);
+ while (IO_READ (port[portnum] + UART_PL01x_FR) & UART_PL01x_FR_TXFF)
+ WATCHDOG_RESET();
/* Send the character */
IO_WRITE (port[portnum] + UART_PL01x_DR, c);
@@ -148,7 +150,8 @@ static int pl010_getc (int portnum)
unsigned int data;
/* Wait until there is data in the FIFO */
- while (IO_READ (port[portnum] + UART_PL01x_FR) & UART_PL01x_FR_RXFE);
+ while (IO_READ (port[portnum] + UART_PL01x_FR) & UART_PL01x_FR_RXFE)
+ WATCHDOG_RESET();
data = IO_READ (port[portnum] + UART_PL01x_DR);
@@ -164,6 +167,7 @@ static int pl010_getc (int portnum)
static int pl010_tstc (int portnum)
{
+ WATCHDOG_RESET();
return !(IO_READ (port[portnum] + UART_PL01x_FR) &
UART_PL01x_FR_RXFE);
}