Skip to content

Commit f05cdbe

Browse files
eichenbergergregkh
authored andcommitted
serial: imx: only set receiver level if it is zero
commit 9706fc8 upstream. With commit a81dbd0 ("serial: imx: set receiver level before starting uart") we set the receiver level to its default value. This caused a regression when using SDMA, where the receiver level is 9 instead of 8 (default). This change will first check if the receiver level is zero and only then set it to the default. This still avoids the interrupt storm when the receiver level is zero. Fixes: a81dbd0 ("serial: imx: set receiver level before starting uart") Cc: stable <[email protected]> Signed-off-by: Stefan Eichenberger <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 192d463 commit f05cdbe

File tree

1 file changed

+6
-2
lines changed

1 file changed

+6
-2
lines changed

drivers/tty/serial/imx.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@
119119
#define UCR4_OREN (1<<1) /* Receiver overrun interrupt enable */
120120
#define UCR4_DREN (1<<0) /* Recv data ready interrupt enable */
121121
#define UFCR_RXTL_SHF 0 /* Receiver trigger level shift */
122+
#define UFCR_RXTL_MASK 0x3F /* Receiver trigger 6 bits wide */
122123
#define UFCR_DCEDTE (1<<6) /* DCE/DTE mode select */
123124
#define UFCR_RFDIV (7<<7) /* Reference freq divider mask */
124125
#define UFCR_RFDIV_REG(x) (((x) < 7 ? 6 - (x) : 6) << 7)
@@ -1941,7 +1942,7 @@ static int imx_uart_rs485_config(struct uart_port *port, struct ktermios *termio
19411942
struct serial_rs485 *rs485conf)
19421943
{
19431944
struct imx_port *sport = (struct imx_port *)port;
1944-
u32 ucr2;
1945+
u32 ucr2, ufcr;
19451946

19461947
if (rs485conf->flags & SER_RS485_ENABLED) {
19471948
/* Enable receiver if low-active RTS signal is requested */
@@ -1961,7 +1962,10 @@ static int imx_uart_rs485_config(struct uart_port *port, struct ktermios *termio
19611962
/* Make sure Rx is enabled in case Tx is active with Rx disabled */
19621963
if (!(rs485conf->flags & SER_RS485_ENABLED) ||
19631964
rs485conf->flags & SER_RS485_RX_DURING_TX) {
1964-
imx_uart_setup_ufcr(sport, TXTL_DEFAULT, RXTL_DEFAULT);
1965+
/* If the receiver trigger is 0, set it to a default value */
1966+
ufcr = imx_uart_readl(sport, UFCR);
1967+
if ((ufcr & UFCR_RXTL_MASK) == 0)
1968+
imx_uart_setup_ufcr(sport, TXTL_DEFAULT, RXTL_DEFAULT);
19651969
imx_uart_start_rx(port);
19661970
}
19671971

0 commit comments

Comments
 (0)