TTY/Serial driver fixes for 6.3-rc6
Here are some small tty and serial driver fixes for some reported problems: - fsl_uart driver bugfixes - sh-sci serial driver bugfixes - renesas serial driver DT binding bugfixes - 8250 DMA bugfix All of these have been in linux-next for a while with no reported problems. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iGwEABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCZDFTtg8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ynImACXZSsiSzuMqAoEisjLfcb7bPovvQCfd5FntU3K h6JE0Y44gi6WS9iWYHU= =jDa+ -----END PGP SIGNATURE----- Merge tag 'tty-6.3-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty Pull tty/serial driver fixes from Greg KH: "Here are some small tty and serial driver fixes for some reported problems: - fsl_uart driver bugfixes - sh-sci serial driver bugfixes - renesas serial driver DT binding bugfixes - 8250 DMA bugfix All of these have been in linux-next for a while with no reported problems" * tag 'tty-6.3-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: tty: serial: sh-sci: Fix Rx on RZ/G2L SCI tty: serial: fsl_lpuart: fix crash in lpuart_uport_is_active tty: serial: fsl_lpuart: avoid checking for transfer complete when UARTCTRL_SBK is asserted in lpuart32_tx_empty serial: 8250: Prevent starting up DMA Rx on THRI interrupt dt-bindings: serial: renesas,scif: Fix 4th IRQ for 4-IRQ SCIFs tty: serial: sh-sci: Fix transmit end interrupt handler
This commit is contained in:
commit
aa46fe36bb
|
@ -92,7 +92,7 @@ properties:
|
|||
- description: Error interrupt
|
||||
- description: Receive buffer full interrupt
|
||||
- description: Transmit buffer empty interrupt
|
||||
- description: Transmit End interrupt
|
||||
- description: Break interrupt
|
||||
- items:
|
||||
- description: Error interrupt
|
||||
- description: Receive buffer full interrupt
|
||||
|
@ -107,7 +107,7 @@ properties:
|
|||
- const: eri
|
||||
- const: rxi
|
||||
- const: txi
|
||||
- const: tei
|
||||
- const: bri
|
||||
- items:
|
||||
- const: eri
|
||||
- const: rxi
|
||||
|
|
|
@ -1903,6 +1903,17 @@ EXPORT_SYMBOL_GPL(serial8250_modem_status);
|
|||
static bool handle_rx_dma(struct uart_8250_port *up, unsigned int iir)
|
||||
{
|
||||
switch (iir & 0x3f) {
|
||||
case UART_IIR_THRI:
|
||||
/*
|
||||
* Postpone DMA or not decision to IIR_RDI or IIR_RX_TIMEOUT
|
||||
* because it's impossible to do an informed decision about
|
||||
* that with IIR_THRI.
|
||||
*
|
||||
* This also fixes one known DMA Rx corruption issue where
|
||||
* DR is asserted but DMA Rx only gets a corrupted zero byte
|
||||
* (too early DR?).
|
||||
*/
|
||||
return false;
|
||||
case UART_IIR_RDI:
|
||||
if (!up->dma->rx_running)
|
||||
break;
|
||||
|
|
|
@ -858,11 +858,17 @@ static unsigned int lpuart32_tx_empty(struct uart_port *port)
|
|||
struct lpuart_port, port);
|
||||
unsigned long stat = lpuart32_read(port, UARTSTAT);
|
||||
unsigned long sfifo = lpuart32_read(port, UARTFIFO);
|
||||
unsigned long ctrl = lpuart32_read(port, UARTCTRL);
|
||||
|
||||
if (sport->dma_tx_in_progress)
|
||||
return 0;
|
||||
|
||||
if (stat & UARTSTAT_TC && sfifo & UARTFIFO_TXEMPT)
|
||||
/*
|
||||
* LPUART Transmission Complete Flag may never be set while queuing a break
|
||||
* character, so avoid checking for transmission complete when UARTCTRL_SBK
|
||||
* is asserted.
|
||||
*/
|
||||
if ((stat & UARTSTAT_TC && sfifo & UARTFIFO_TXEMPT) || ctrl & UARTCTRL_SBK)
|
||||
return TIOCSER_TEMT;
|
||||
|
||||
return 0;
|
||||
|
@ -2942,7 +2948,7 @@ static bool lpuart_uport_is_active(struct lpuart_port *sport)
|
|||
tty = tty_port_tty_get(port);
|
||||
if (tty) {
|
||||
tty_dev = tty->dev;
|
||||
may_wake = device_may_wakeup(tty_dev);
|
||||
may_wake = tty_dev && device_may_wakeup(tty_dev);
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include <linux/ioport.h>
|
||||
#include <linux/ktime.h>
|
||||
#include <linux/major.h>
|
||||
#include <linux/minmax.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/of.h>
|
||||
|
@ -2864,6 +2865,13 @@ static int sci_init_single(struct platform_device *dev,
|
|||
sci_port->irqs[i] = platform_get_irq(dev, i);
|
||||
}
|
||||
|
||||
/*
|
||||
* The fourth interrupt on SCI port is transmit end interrupt, so
|
||||
* shuffle the interrupts.
|
||||
*/
|
||||
if (p->type == PORT_SCI)
|
||||
swap(sci_port->irqs[SCIx_BRI_IRQ], sci_port->irqs[SCIx_TEI_IRQ]);
|
||||
|
||||
/* The SCI generates several interrupts. They can be muxed together or
|
||||
* connected to different interrupt lines. In the muxed case only one
|
||||
* interrupt resource is specified as there is only one interrupt ID.
|
||||
|
@ -2929,7 +2937,7 @@ static int sci_init_single(struct platform_device *dev,
|
|||
port->flags = UPF_FIXED_PORT | UPF_BOOT_AUTOCONF | p->flags;
|
||||
port->fifosize = sci_port->params->fifosize;
|
||||
|
||||
if (port->type == PORT_SCI) {
|
||||
if (port->type == PORT_SCI && !dev->dev.of_node) {
|
||||
if (sci_port->reg_size >= 0x20)
|
||||
port->regshift = 2;
|
||||
else
|
||||
|
|
Loading…
Reference in New Issue