|
@@ -111,6 +111,15 @@ int serial_init (void)
|
|
|
unsigned int divider;
|
|
|
unsigned int remainder;
|
|
|
unsigned int fraction;
|
|
|
+ unsigned int lcr;
|
|
|
+
|
|
|
+#ifdef CONFIG_PL011_SERIAL_FLUSH_ON_INIT
|
|
|
+ /* Empty RX fifo if necessary */
|
|
|
+ if (readl(®s->pl011_cr) & UART_PL011_CR_UARTEN) {
|
|
|
+ while (!(readl(®s->fr) & UART_PL01x_FR_RXFE))
|
|
|
+ readl(®s->dr);
|
|
|
+ }
|
|
|
+#endif
|
|
|
|
|
|
/* First, disable everything */
|
|
|
writel(0, ®s->pl011_cr);
|
|
@@ -131,9 +140,24 @@ int serial_init (void)
|
|
|
writel(fraction, ®s->pl011_fbrd);
|
|
|
|
|
|
/* Set the UART to be 8 bits, 1 stop bit, no parity, fifo enabled */
|
|
|
- writel(UART_PL011_LCRH_WLEN_8 | UART_PL011_LCRH_FEN,
|
|
|
- ®s->pl011_lcrh);
|
|
|
-
|
|
|
+ lcr = UART_PL011_LCRH_WLEN_8 | UART_PL011_LCRH_FEN;
|
|
|
+ writel(lcr, ®s->pl011_lcrh);
|
|
|
+
|
|
|
+#ifdef CONFIG_PL011_SERIAL_RLCR
|
|
|
+ {
|
|
|
+ int i;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Program receive line control register after waiting
|
|
|
+ * 10 bus cycles. Delay be writing to readonly register
|
|
|
+ * 10 times
|
|
|
+ */
|
|
|
+ for (i = 0; i < 10; i++)
|
|
|
+ writel(lcr, ®s->fr);
|
|
|
+
|
|
|
+ writel(lcr, ®s->pl011_rlcr);
|
|
|
+ }
|
|
|
+#endif
|
|
|
/* Finally, enable the UART */
|
|
|
writel(UART_PL011_CR_UARTEN | UART_PL011_CR_TXE | UART_PL011_CR_RXE,
|
|
|
®s->pl011_cr);
|