patch "tty/serial: atmel: fix out of range clock divider handling" added to tty-linus
Subsystems (4)
This is a note to let you know that I've just added the patch titled
tty/serial: atmel: fix out of range clock divider handling
to my tty git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty.git
in the tty-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From cb47b9f8630ae3fa3f5fbd0c7003faba7abdf711 Mon Sep 17 00:00:00 2001
From: David Engraf <[email protected]>
Date: Mon, 16 Dec 2019 09:54:03 +0100
Subject: 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.
--- drivers/tty/serial/atmel_serial.c | 43 ++++++++++++++++--------------- 1 file changed, 22 insertions(+), 21 deletions(-)
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;
Signature · 1 line
2.24.1