Skip to content

Commit

Permalink
serial: imx: Also enable the aging timer in PIO mode
Browse files Browse the repository at this point in the history
This allows to increase the RX waterlevel which allows to delay the RRDY
irq. The desired effect is that less irqs are needed to handle
characters and so reduce irq count of the system.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Uwe Kleine-König authored and Greg Kroah-Hartman committed Mar 9, 2018
1 parent 76821e2 commit 81ca8e8
Showing 1 changed file with 12 additions and 3 deletions.
15 changes: 12 additions & 3 deletions drivers/tty/serial/imx.c
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,7 @@ static void imx_start_rx(struct uart_port *port)
ucr1 |= UCR1_RXDMAEN | UCR1_ATDMAEN;
} else {
ucr1 |= UCR1_RRDYEN;
ucr2 |= UCR2_ATEN;
}

/* Write UCR2 first as it includes RXEN */
Expand Down Expand Up @@ -472,6 +473,7 @@ static void imx_stop_rx(struct uart_port *port)
ucr1 &= ~(UCR1_RXDMAEN | UCR1_ATDMAEN);
} else {
ucr1 &= ~UCR1_RRDYEN;
ucr2 &= ~UCR2_ATEN;
}
imx_uart_writel(sport, ucr1, UCR1);

Expand Down Expand Up @@ -1393,6 +1395,10 @@ static int imx_startup(struct uart_port *port)
ucr1 = imx_uart_readl(sport, UCR1);
ucr1 |= UCR1_RRDYEN;
imx_uart_writel(sport, ucr1, UCR1);

ucr2 = imx_uart_readl(sport, UCR2);
ucr2 |= UCR2_ATEN;
imx_uart_writel(sport, ucr2, UCR2);
}

spin_unlock_irqrestore(&sport->port.lock, flags);
Expand Down Expand Up @@ -1424,7 +1430,7 @@ static void imx_shutdown(struct uart_port *port)

spin_lock_irqsave(&sport->port.lock, flags);
ucr2 = imx_uart_readl(sport, UCR2);
ucr2 &= ~UCR2_TXEN;
ucr2 &= ~(UCR2_TXEN | UCR2_ATEN);
imx_uart_writel(sport, ucr2, UCR2);
spin_unlock_irqrestore(&sport->port.lock, flags);

Expand Down Expand Up @@ -1613,13 +1619,14 @@ imx_set_termios(struct uart_port *port, struct ktermios *termios,
imx_uart_writel(sport,
old_ucr1 & ~(UCR1_TXMPTYEN | UCR1_RRDYEN | UCR1_RTSDEN),
UCR1);
old_ucr2 = imx_uart_readl(sport, UCR2);
imx_uart_writel(sport, old_ucr2 & ~UCR2_ATEN, UCR2);

while (!(imx_uart_readl(sport, USR2) & USR2_TXDC))
barrier();

/* then, disable everything */
old_ucr2 = imx_uart_readl(sport, UCR2);
imx_uart_writel(sport, old_ucr2 & ~(UCR2_TXEN | UCR2_RXEN), UCR2);
imx_uart_writel(sport, old_ucr2 & ~(UCR2_TXEN | UCR2_RXEN | UCR2_ATEN), UCR2);
old_ucr2 &= (UCR2_TXEN | UCR2_RXEN | UCR2_ATEN);

/* custom-baudrate handling */
Expand Down Expand Up @@ -1750,12 +1757,14 @@ static int imx_poll_init(struct uart_port *port)
ucr1 &= ~(UCR1_TXMPTYEN | UCR1_RTSDEN | UCR1_RRDYEN);

ucr2 |= UCR2_RXEN;
ucr2 &= ~UCR2_ATEN;

imx_uart_writel(sport, ucr1, UCR1);
imx_uart_writel(sport, ucr2, UCR2);

/* now enable irqs */
imx_uart_writel(sport, ucr1 | UCR1_RRDYEN, UCR1);
imx_uart_writel(sport, ucr2 | UCR2_ATEN, UCR2);

spin_unlock_irqrestore(&sport->port.lock, flags);

Expand Down

0 comments on commit 81ca8e8

Please sign in to comment.