FAILED: patch "[PATCH] tty/serial: atmel: fix out of range clock divider handling" failed to apply to 4.14-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 4.14-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From cb47b9f8630ae3fa3f5fbd0c7003faba7abdf711 Mon Sep 17 00:00:00 2001
From: David Engraf <[email protected]>
Date: Mon, 16 Dec 2019 09:54:03 +0100
Subject: [PATCH] tty/serial: atmel: fix out of range clock divider handling
Use MCK_DIV8 when the clock divider is > 65535. Unfortunately the mode register was already written thus the clock selection is ignored.
Fix by doing the baud rate calulation before setting the mode.
Fixes 5bf5635ac170 ("tty/serial: atmel: add fractional baud rate support")
Signed-off-by David Engraf <[email protected]>
Acked-by Richard Genoud <[email protected]>
Cc stable <[email protected]>
Signed-off-by Greg Kroah-Hartman <[email protected]>
drivers/tty/serial/atmel_serial.c +22 -21
@@ -2270,27 +2270,6 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios, mode |=ATMEL_US_USMODE_NORMAL ; } -/* set the mode, clock divisor, parity, stop bits and data size */ -atmel_uart_writel (port,ATMEL_US_MR , mode); - -/* -* when switching the mode, set the RTS line state according to the -* new mode, otherwise keep the former state -*/ -if ((old_mode &ATMEL_US_USMODE ) != (mode &ATMEL_US_USMODE )) { -unsigned int rts_state; - -if ((mode &ATMEL_US_USMODE ) ==ATMEL_US_USMODE_HWHS ) { -/* let the hardware control the RTS line */ - rts_state =ATMEL_US_RTSDIS ; - }else { -/* force RTS line to low level */ - rts_state =ATMEL_US_RTSEN ; - } - -atmel_uart_writel (port,ATMEL_US_CR , rts_state); - } -/* * Set the baud rate: * Fractional baudrate allows to setup output frequency more
@@ -2317,6 +2296,28 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios,if (!(port->iso7816.flags &SER_ISO7816_ENABLED ))atmel_uart_writel (port,ATMEL_US_BRGR , quot); + +/* set the mode, clock divisor, parity, stop bits and data size */ +atmel_uart_writel (port,ATMEL_US_MR , mode); + +/* +* when switching the mode, set the RTS line state according to the +* new mode, otherwise keep the former state +*/ +if ((old_mode &ATMEL_US_USMODE ) != (mode &ATMEL_US_USMODE )) { +unsigned int rts_state; + +if ((mode &ATMEL_US_USMODE ) ==ATMEL_US_USMODE_HWHS ) { +/* let the hardware control the RTS line */ + rts_state =ATMEL_US_RTSDIS ; + }else { +/* force RTS line to low level */ + rts_state =ATMEL_US_RTSEN ; + } + +atmel_uart_writel (port,ATMEL_US_CR , rts_state); + } +atmel_uart_writel (port,ATMEL_US_CR ,ATMEL_US_RSTSTA |ATMEL_US_RSTRX );atmel_uart_writel (port,ATMEL_US_CR ,ATMEL_US_TXEN |ATMEL_US_RXEN ); atmel_port->tx_stopped = false;