Ver Fonte

serial: imx: Also enable the aging timer in PIO mode

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>
Uwe Kleine-König há 7 anos atrás
pai
commit
81ca8e8286
1 ficheiros alterados com 12 adições e 3 exclusões
  1. 12 3
      drivers/tty/serial/imx.c

+ 12 - 3
drivers/tty/serial/imx.c

@@ -418,6 +418,7 @@ static void imx_start_rx(struct uart_port *port)
 		ucr1 |= UCR1_RXDMAEN | UCR1_ATDMAEN;
 		ucr1 |= UCR1_RXDMAEN | UCR1_ATDMAEN;
 	} else {
 	} else {
 		ucr1 |= UCR1_RRDYEN;
 		ucr1 |= UCR1_RRDYEN;
+		ucr2 |= UCR2_ATEN;
 	}
 	}
 
 
 	/* Write UCR2 first as it includes RXEN */
 	/* Write UCR2 first as it includes RXEN */
@@ -472,6 +473,7 @@ static void imx_stop_rx(struct uart_port *port)
 		ucr1 &= ~(UCR1_RXDMAEN | UCR1_ATDMAEN);
 		ucr1 &= ~(UCR1_RXDMAEN | UCR1_ATDMAEN);
 	} else {
 	} else {
 		ucr1 &= ~UCR1_RRDYEN;
 		ucr1 &= ~UCR1_RRDYEN;
+		ucr2 &= ~UCR2_ATEN;
 	}
 	}
 	imx_uart_writel(sport, ucr1, UCR1);
 	imx_uart_writel(sport, ucr1, UCR1);
 
 
@@ -1393,6 +1395,10 @@ static int imx_startup(struct uart_port *port)
 		ucr1 = imx_uart_readl(sport, UCR1);
 		ucr1 = imx_uart_readl(sport, UCR1);
 		ucr1 |= UCR1_RRDYEN;
 		ucr1 |= UCR1_RRDYEN;
 		imx_uart_writel(sport, ucr1, UCR1);
 		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);
 	spin_unlock_irqrestore(&sport->port.lock, flags);
@@ -1424,7 +1430,7 @@ static void imx_shutdown(struct uart_port *port)
 
 
 	spin_lock_irqsave(&sport->port.lock, flags);
 	spin_lock_irqsave(&sport->port.lock, flags);
 	ucr2 = imx_uart_readl(sport, UCR2);
 	ucr2 = imx_uart_readl(sport, UCR2);
-	ucr2 &= ~UCR2_TXEN;
+	ucr2 &= ~(UCR2_TXEN | UCR2_ATEN);
 	imx_uart_writel(sport, ucr2, UCR2);
 	imx_uart_writel(sport, ucr2, UCR2);
 	spin_unlock_irqrestore(&sport->port.lock, flags);
 	spin_unlock_irqrestore(&sport->port.lock, flags);
 
 
@@ -1613,13 +1619,14 @@ imx_set_termios(struct uart_port *port, struct ktermios *termios,
 	imx_uart_writel(sport,
 	imx_uart_writel(sport,
 			old_ucr1 & ~(UCR1_TXMPTYEN | UCR1_RRDYEN | UCR1_RTSDEN),
 			old_ucr1 & ~(UCR1_TXMPTYEN | UCR1_RRDYEN | UCR1_RTSDEN),
 			UCR1);
 			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))
 	while (!(imx_uart_readl(sport, USR2) & USR2_TXDC))
 		barrier();
 		barrier();
 
 
 	/* then, disable everything */
 	/* 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);
 	old_ucr2 &= (UCR2_TXEN | UCR2_RXEN | UCR2_ATEN);
 
 
 	/* custom-baudrate handling */
 	/* custom-baudrate handling */
@@ -1750,12 +1757,14 @@ static int imx_poll_init(struct uart_port *port)
 	ucr1 &= ~(UCR1_TXMPTYEN | UCR1_RTSDEN | UCR1_RRDYEN);
 	ucr1 &= ~(UCR1_TXMPTYEN | UCR1_RTSDEN | UCR1_RRDYEN);
 
 
 	ucr2 |= UCR2_RXEN;
 	ucr2 |= UCR2_RXEN;
+	ucr2 &= ~UCR2_ATEN;
 
 
 	imx_uart_writel(sport, ucr1, UCR1);
 	imx_uart_writel(sport, ucr1, UCR1);
 	imx_uart_writel(sport, ucr2, UCR2);
 	imx_uart_writel(sport, ucr2, UCR2);
 
 
 	/* now enable irqs */
 	/* now enable irqs */
 	imx_uart_writel(sport, ucr1 | UCR1_RRDYEN, UCR1);
 	imx_uart_writel(sport, ucr1 | UCR1_RRDYEN, UCR1);
+	imx_uart_writel(sport, ucr2 | UCR2_ATEN, UCR2);
 
 
 	spin_unlock_irqrestore(&sport->port.lock, flags);
 	spin_unlock_irqrestore(&sport->port.lock, flags);