TTY/Serial fixes for 5.5-rc3
Here are some small tty and serial driver fixes for 5.5-rc3. Only 4 small patches here: - atmel serial driver fix - msm_serial driver fix - sprd serial driver fix - tty core port fix The last tty core fix should resolve a long-standing bug with a race at port creation time that some people would see, and Sudip finally tracked down. All of these have been in linux-next with no reported issues. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCXfxw/Q8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ykUcwCeO0j3bK0Xb1THs6VWMa4DBwPam+YAoLu8UPtm 1CVI1fAplYV2SY1jxFoN =U5T7 -----END PGP SIGNATURE----- Merge tag 'tty-5.5-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty Pull tty/serial fixes from Greg KH: "Here are some small tty and serial driver fixes for 5.5-rc3. Only four small patches here: - atmel serial driver fix - msm_serial driver fix - sprd serial driver fix - tty core port fix The last tty core fix should resolve a long-standing bug with a race at port creation time that some people would see, and Sudip finally tracked down. All of these have been in linux-next with no reported issues" * tag 'tty-5.5-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: tty/serial: atmel: fix out of range clock divider handling tty: link tty and port before configuring it as console serial: sprd: Add clearing break interrupt operation tty: serial: msm_serial: Fix lockup for sysrq and oops
This commit is contained in:
commit
1a4ee8673a
|
@ -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;
|
||||
|
|
|
@ -1580,6 +1580,7 @@ static void __msm_console_write(struct uart_port *port, const char *s,
|
|||
int num_newlines = 0;
|
||||
bool replaced = false;
|
||||
void __iomem *tf;
|
||||
int locked = 1;
|
||||
|
||||
if (is_uartdm)
|
||||
tf = port->membase + UARTDM_TF;
|
||||
|
@ -1592,7 +1593,13 @@ static void __msm_console_write(struct uart_port *port, const char *s,
|
|||
num_newlines++;
|
||||
count += num_newlines;
|
||||
|
||||
spin_lock(&port->lock);
|
||||
if (port->sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
locked = spin_trylock(&port->lock);
|
||||
else
|
||||
spin_lock(&port->lock);
|
||||
|
||||
if (is_uartdm)
|
||||
msm_reset_dm_count(port, count);
|
||||
|
||||
|
@ -1628,7 +1635,9 @@ static void __msm_console_write(struct uart_port *port, const char *s,
|
|||
iowrite32_rep(tf, buf, 1);
|
||||
i += num_chars;
|
||||
}
|
||||
spin_unlock(&port->lock);
|
||||
|
||||
if (locked)
|
||||
spin_unlock(&port->lock);
|
||||
}
|
||||
|
||||
static void msm_console_write(struct console *co, const char *s,
|
||||
|
|
|
@ -2834,6 +2834,7 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
|
|||
if (uport->cons && uport->dev)
|
||||
of_console_check(uport->dev->of_node, uport->cons->name, uport->line);
|
||||
|
||||
tty_port_link_device(port, drv->tty_driver, uport->line);
|
||||
uart_configure_port(drv, state, uport);
|
||||
|
||||
port->console = uart_console(uport);
|
||||
|
|
|
@ -679,6 +679,9 @@ static irqreturn_t sprd_handle_irq(int irq, void *dev_id)
|
|||
if (ims & SPRD_IMSR_TIMEOUT)
|
||||
serial_out(port, SPRD_ICLR, SPRD_ICLR_TIMEOUT);
|
||||
|
||||
if (ims & SPRD_IMSR_BREAK_DETECT)
|
||||
serial_out(port, SPRD_ICLR, SPRD_IMSR_BREAK_DETECT);
|
||||
|
||||
if (ims & (SPRD_IMSR_RX_FIFO_FULL | SPRD_IMSR_BREAK_DETECT |
|
||||
SPRD_IMSR_TIMEOUT))
|
||||
sprd_rx(port);
|
||||
|
|
|
@ -89,7 +89,8 @@ void tty_port_link_device(struct tty_port *port,
|
|||
{
|
||||
if (WARN_ON(index >= driver->num))
|
||||
return;
|
||||
driver->ports[index] = port;
|
||||
if (!driver->ports[index])
|
||||
driver->ports[index] = port;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tty_port_link_device);
|
||||
|
||||
|
|
Loading…
Reference in New Issue