* Patches by Anders Larsen, 17 Sep 2003:
  - fix spelling errors
  - set GD_FLG_DEVINIT flag only after device function pointers
    are valid
  - Allow CFG_ALT_MEMTEST on systems where address zero isn't
    writeable
  - enable 3.rd UART (ST-UART) on PXA(XScale) CPUs
  - trigger watchdog while waiting in serial driver
diff --git a/cpu/pxa/serial.c b/cpu/pxa/serial.c
index c9d5f70..cedebfe 100644
--- a/cpu/pxa/serial.c
+++ b/cpu/pxa/serial.c
@@ -29,6 +29,7 @@
  */
 
 #include <common.h>
+#include <watchdog.h>
 #include <asm/arch/pxa-regs.h>
 
 void serial_setbrg (void)
@@ -38,7 +39,7 @@
 	unsigned int quot = 0;
 
 	if (gd->baudrate == 1200)
-		quot = 192;
+		quot = 768;
 	else if (gd->baudrate == 9600)
 		quot = 96;
 	else if (gd->baudrate == 19200)
@@ -53,7 +54,6 @@
 		hang ();
 
 #ifdef CONFIG_FFUART
-
 	CKEN |= CKEN6_FFUART;
 
 	FFIER = 0;					/* Disable for now */
@@ -82,9 +82,21 @@
 	BTIER = IER_UUE;			/* Enable BFUART */
 
 #elif defined(CONFIG_STUART)
-#error "Bad: not implemented yet!"
+	CKEN |= CKEN5_STUART;
+
+	STIER = 0;
+	STFCR = 0;
+
+	/* set baud rate */
+	STLCR = LCR_DLAB;
+	STDLL = quot & 0xff;
+	STDLH = quot >> 8;
+	STLCR = LCR_WLS0 | LCR_WLS1;
+
+	STIER = IER_UUE;			/* Enable STUART */
+
 #else
-#error "Bad: you didn't configured serial ..."
+#error "Bad: you didn't configure serial ..."
 #endif
 }
 
@@ -109,13 +121,17 @@
 {
 #ifdef CONFIG_FFUART
 	/* wait for room in the tx FIFO on FFUART */
-	while ((FFLSR & LSR_TEMT) == 0);
-
+	while ((FFLSR & LSR_TEMT) == 0)
+		WATCHDOG_RESET ();	/* Reset HW Watchdog, if needed */
 	FFTHR = c;
 #elif defined(CONFIG_BTUART)
-	while ((BTLSR & LSR_TEMT ) == 0 );
+	while ((BTLSR & LSR_TEMT ) == 0 )
+		WATCHDOG_RESET ();	/* Reset HW Watchdog, if needed */
 	BTTHR = c;
 #elif defined(CONFIG_STUART)
+	while ((STLSR & LSR_TEMT ) == 0 )
+		WATCHDOG_RESET ();	/* Reset HW Watchdog, if needed */
+	STTHR = c;
 #endif
 
 	/* If \n, also do \r */
@@ -135,6 +151,7 @@
 #elif defined(CONFIG_BTUART)
 	return BTLSR & LSR_DR;
 #elif defined(CONFIG_STUART)
+	return STLSR & LSR_DR;
 #endif
 }
 
@@ -146,14 +163,17 @@
 int serial_getc (void)
 {
 #ifdef CONFIG_FFUART
-	while (!(FFLSR & LSR_DR));
-
+	while (!(FFLSR & LSR_DR))
+		WATCHDOG_RESET ();	/* Reset HW Watchdog, if needed */
 	return (char) FFRBR & 0xff;
 #elif defined(CONFIG_BTUART)
-	while (!(BTLSR & LSR_DR));
-
+	while (!(BTLSR & LSR_DR))
+		WATCHDOG_RESET ();	/* Reset HW Watchdog, if needed */
 	return (char) BTRBR & 0xff;
 #elif defined(CONFIG_STUART)
+	while (!(STLSR & LSR_DR))
+		WATCHDOG_RESET ();	/* Reset HW Watchdog, if needed */
+	return (char) STRBR & 0xff;
 #endif
 }