aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty/serial/mxs-auart.c
diff options
context:
space:
mode:
authorJanusz Uzycki <j.uzycki@elproma.com.pl>2014-11-18 18:37:13 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-11-25 17:06:39 -0800
commit2b310ec7934f69c6e9a49dd675f413e112b82e5c (patch)
tree1efcf338fabd759c6b5f5d52b3bcbbc62943de7f /drivers/tty/serial/mxs-auart.c
parentserial: mxs-auart: fix gpio change detection on interrupt (diff)
downloadlinux-dev-2b310ec7934f69c6e9a49dd675f413e112b82e5c.tar.xz
linux-dev-2b310ec7934f69c6e9a49dd675f413e112b82e5c.zip
serial: mxs-auart: fix tx_empty against shift register
tx_empty() should test whether both the transmitter fifo and shifter for the port is empty, ie. the whole last char was transmitted. The shift register is empty if AUART_STAT_BUSY is cleared. The patch fixes the function against the shift register. According to i.MX23 and i.MX28 Reference Manual: AUART_STAT_TXFE: TX FIFO or transmit holding register is empty. AUART_STAT_BUSY: AUART still transmits bits. The BUSY signal goes HIGH as soon as the data is written to the transmit FIFO (that is, the FIFO is non-empty) and remains asserted HIGH while data is being transmitted. BUSY is negated only when the transmit FIFO is empty, and the last character has been transmitted from the shift register, including the stop bits. Signed-off-by: Janusz Uzycki <j.uzycki@elproma.com.pl> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty/serial/mxs-auart.c')
-rw-r--r--drivers/tty/serial/mxs-auart.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c
index 21b3b3569461..b7a5aaa6271a 100644
--- a/drivers/tty/serial/mxs-auart.c
+++ b/drivers/tty/serial/mxs-auart.c
@@ -913,10 +913,11 @@ static void mxs_auart_shutdown(struct uart_port *u)
static unsigned int mxs_auart_tx_empty(struct uart_port *u)
{
- if (readl(u->membase + AUART_STAT) & AUART_STAT_TXFE)
+ if ((readl(u->membase + AUART_STAT) &
+ (AUART_STAT_TXFE | AUART_STAT_BUSY)) == AUART_STAT_TXFE)
return TIOCSER_TEMT;
- else
- return 0;
+
+ return 0;
}
static void mxs_auart_start_tx(struct uart_port *u)