serial: imx: use Tx ready rather than Tx empty irq
This should help to avoid unnecessary gaps in transmission while adding little overhead due to low default Tx threshold level (2 bytes). Signed-off-by: Sergey Organov <sorganov@gmail.com> Link: https://lore.kernel.org/r/1567017475-11919-6-git-send-email-sorganov@gmail.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
d47bcb4a6c
commit
c514a6f848
|
@ -439,7 +439,7 @@ static void imx_uart_stop_tx(struct uart_port *port)
|
|||
return;
|
||||
|
||||
ucr1 = imx_uart_readl(sport, UCR1);
|
||||
imx_uart_writel(sport, ucr1 & ~UCR1_TXMPTYEN, UCR1);
|
||||
imx_uart_writel(sport, ucr1 & ~UCR1_TRDYEN, UCR1);
|
||||
|
||||
/* in rs485 mode disable transmitter if shifter is empty */
|
||||
if (port->rs485.flags & SER_RS485_ENABLED &&
|
||||
|
@ -517,7 +517,7 @@ static inline void imx_uart_transmit_buffer(struct imx_port *sport)
|
|||
* and the TX IRQ is disabled.
|
||||
**/
|
||||
ucr1 = imx_uart_readl(sport, UCR1);
|
||||
ucr1 &= ~UCR1_TXMPTYEN;
|
||||
ucr1 &= ~UCR1_TRDYEN;
|
||||
if (sport->dma_is_txing) {
|
||||
ucr1 |= UCR1_TXDMAEN;
|
||||
imx_uart_writel(sport, ucr1, UCR1);
|
||||
|
@ -679,7 +679,7 @@ static void imx_uart_start_tx(struct uart_port *port)
|
|||
|
||||
if (!sport->dma_is_enabled) {
|
||||
ucr1 = imx_uart_readl(sport, UCR1);
|
||||
imx_uart_writel(sport, ucr1 | UCR1_TXMPTYEN, UCR1);
|
||||
imx_uart_writel(sport, ucr1 | UCR1_TRDYEN, UCR1);
|
||||
}
|
||||
|
||||
if (sport->dma_is_enabled) {
|
||||
|
@ -688,7 +688,7 @@ static void imx_uart_start_tx(struct uart_port *port)
|
|||
* disable TX DMA to let TX interrupt to send X-char */
|
||||
ucr1 = imx_uart_readl(sport, UCR1);
|
||||
ucr1 &= ~UCR1_TXDMAEN;
|
||||
ucr1 |= UCR1_TXMPTYEN;
|
||||
ucr1 |= UCR1_TRDYEN;
|
||||
imx_uart_writel(sport, ucr1, UCR1);
|
||||
return;
|
||||
}
|
||||
|
@ -874,7 +874,7 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id)
|
|||
usr1 &= ~USR1_RRDY;
|
||||
if ((ucr2 & UCR2_ATEN) == 0)
|
||||
usr1 &= ~USR1_AGTIM;
|
||||
if ((ucr1 & UCR1_TXMPTYEN) == 0)
|
||||
if ((ucr1 & UCR1_TRDYEN) == 0)
|
||||
usr1 &= ~USR1_TRDY;
|
||||
if ((ucr4 & UCR4_TCEN) == 0)
|
||||
usr2 &= ~USR2_TXDC;
|
||||
|
@ -1474,7 +1474,7 @@ static void imx_uart_shutdown(struct uart_port *port)
|
|||
|
||||
spin_lock_irqsave(&sport->port.lock, flags);
|
||||
ucr1 = imx_uart_readl(sport, UCR1);
|
||||
ucr1 &= ~(UCR1_TXMPTYEN | UCR1_RRDYEN | UCR1_RTSDEN | UCR1_UARTEN | UCR1_RXDMAEN | UCR1_ATDMAEN);
|
||||
ucr1 &= ~(UCR1_TRDYEN | UCR1_RRDYEN | UCR1_RTSDEN | UCR1_UARTEN | UCR1_RXDMAEN | UCR1_ATDMAEN);
|
||||
|
||||
imx_uart_writel(sport, ucr1, UCR1);
|
||||
spin_unlock_irqrestore(&sport->port.lock, flags);
|
||||
|
@ -1778,7 +1778,7 @@ static int imx_uart_poll_init(struct uart_port *port)
|
|||
ucr1 |= IMX1_UCR1_UARTCLKEN;
|
||||
|
||||
ucr1 |= UCR1_UARTEN;
|
||||
ucr1 &= ~(UCR1_TXMPTYEN | UCR1_RTSDEN | UCR1_RRDYEN);
|
||||
ucr1 &= ~(UCR1_TRDYEN | UCR1_RTSDEN | UCR1_RRDYEN);
|
||||
|
||||
ucr2 |= UCR2_RXEN;
|
||||
ucr2 &= ~UCR2_ATEN;
|
||||
|
@ -1938,7 +1938,7 @@ imx_uart_console_write(struct console *co, const char *s, unsigned int count)
|
|||
if (imx_uart_is_imx1(sport))
|
||||
ucr1 |= IMX1_UCR1_UARTCLKEN;
|
||||
ucr1 |= UCR1_UARTEN;
|
||||
ucr1 &= ~(UCR1_TXMPTYEN | UCR1_RRDYEN | UCR1_RTSDEN);
|
||||
ucr1 &= ~(UCR1_TRDYEN | UCR1_RRDYEN | UCR1_RTSDEN);
|
||||
|
||||
imx_uart_writel(sport, ucr1, UCR1);
|
||||
|
||||
|
@ -2294,7 +2294,7 @@ static int imx_uart_probe(struct platform_device *pdev)
|
|||
/* Disable interrupts before requesting them */
|
||||
ucr1 = imx_uart_readl(sport, UCR1);
|
||||
ucr1 &= ~(UCR1_ADEN | UCR1_TRDYEN | UCR1_IDEN | UCR1_RRDYEN |
|
||||
UCR1_TXMPTYEN | UCR1_RTSDEN);
|
||||
UCR1_TRDYEN | UCR1_RTSDEN);
|
||||
imx_uart_writel(sport, ucr1, UCR1);
|
||||
|
||||
if (!imx_uart_is_imx1(sport) && sport->dte_mode) {
|
||||
|
|
Loading…
Reference in New Issue