|
@@ -851,7 +851,7 @@ auart_console_write(struct console *co, const char *str, unsigned int count)
|
|
|
struct mxs_auart_port *s;
|
|
|
struct uart_port *port;
|
|
|
unsigned int old_ctrl0, old_ctrl2;
|
|
|
- unsigned int to = 1000;
|
|
|
+ unsigned int to = 20000;
|
|
|
|
|
|
if (co->index >= MXS_AUART_PORTS || co->index < 0)
|
|
|
return;
|
|
@@ -872,18 +872,23 @@ auart_console_write(struct console *co, const char *str, unsigned int count)
|
|
|
|
|
|
uart_console_write(port, str, count, mxs_auart_console_putchar);
|
|
|
|
|
|
- /*
|
|
|
- * Finally, wait for transmitter to become empty
|
|
|
- * and restore the TCR
|
|
|
- */
|
|
|
+ /* Finally, wait for transmitter to become empty ... */
|
|
|
while (readl(port->membase + AUART_STAT) & AUART_STAT_BUSY) {
|
|
|
+ udelay(1);
|
|
|
if (!to--)
|
|
|
break;
|
|
|
- udelay(1);
|
|
|
}
|
|
|
|
|
|
- writel(old_ctrl0, port->membase + AUART_CTRL0);
|
|
|
- writel(old_ctrl2, port->membase + AUART_CTRL2);
|
|
|
+ /*
|
|
|
+ * ... and restore the TCR if we waited long enough for the transmitter
|
|
|
+ * to be idle. This might keep the transmitter enabled although it is
|
|
|
+ * unused, but that is better than to disable it while it is still
|
|
|
+ * transmitting.
|
|
|
+ */
|
|
|
+ if (!(readl(port->membase + AUART_STAT) & AUART_STAT_BUSY)) {
|
|
|
+ writel(old_ctrl0, port->membase + AUART_CTRL0);
|
|
|
+ writel(old_ctrl2, port->membase + AUART_CTRL2);
|
|
|
+ }
|
|
|
|
|
|
clk_disable(s->clk);
|
|
|
}
|