Skip to content

Commit aa46fe3

Browse files
committed
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
2 parents a211b1c + f92ed0c commit aa46fe3

File tree

4 files changed

+30
-5
lines changed

4 files changed

+30
-5
lines changed

Documentation/devicetree/bindings/serial/renesas,scif.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ properties:
9292
- description: Error interrupt
9393
- description: Receive buffer full interrupt
9494
- description: Transmit buffer empty interrupt
95-
- description: Transmit End interrupt
95+
- description: Break interrupt
9696
- items:
9797
- description: Error interrupt
9898
- description: Receive buffer full interrupt
@@ -107,7 +107,7 @@ properties:
107107
- const: eri
108108
- const: rxi
109109
- const: txi
110-
- const: tei
110+
- const: bri
111111
- items:
112112
- const: eri
113113
- const: rxi

drivers/tty/serial/8250/8250_port.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1903,6 +1903,17 @@ EXPORT_SYMBOL_GPL(serial8250_modem_status);
19031903
static bool handle_rx_dma(struct uart_8250_port *up, unsigned int iir)
19041904
{
19051905
switch (iir & 0x3f) {
1906+
case UART_IIR_THRI:
1907+
/*
1908+
* Postpone DMA or not decision to IIR_RDI or IIR_RX_TIMEOUT
1909+
* because it's impossible to do an informed decision about
1910+
* that with IIR_THRI.
1911+
*
1912+
* This also fixes one known DMA Rx corruption issue where
1913+
* DR is asserted but DMA Rx only gets a corrupted zero byte
1914+
* (too early DR?).
1915+
*/
1916+
return false;
19061917
case UART_IIR_RDI:
19071918
if (!up->dma->rx_running)
19081919
break;

drivers/tty/serial/fsl_lpuart.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -858,11 +858,17 @@ static unsigned int lpuart32_tx_empty(struct uart_port *port)
858858
struct lpuart_port, port);
859859
unsigned long stat = lpuart32_read(port, UARTSTAT);
860860
unsigned long sfifo = lpuart32_read(port, UARTFIFO);
861+
unsigned long ctrl = lpuart32_read(port, UARTCTRL);
861862

862863
if (sport->dma_tx_in_progress)
863864
return 0;
864865

865-
if (stat & UARTSTAT_TC && sfifo & UARTFIFO_TXEMPT)
866+
/*
867+
* LPUART Transmission Complete Flag may never be set while queuing a break
868+
* character, so avoid checking for transmission complete when UARTCTRL_SBK
869+
* is asserted.
870+
*/
871+
if ((stat & UARTSTAT_TC && sfifo & UARTFIFO_TXEMPT) || ctrl & UARTCTRL_SBK)
866872
return TIOCSER_TEMT;
867873

868874
return 0;
@@ -2942,7 +2948,7 @@ static bool lpuart_uport_is_active(struct lpuart_port *sport)
29422948
tty = tty_port_tty_get(port);
29432949
if (tty) {
29442950
tty_dev = tty->dev;
2945-
may_wake = device_may_wakeup(tty_dev);
2951+
may_wake = tty_dev && device_may_wakeup(tty_dev);
29462952
tty_kref_put(tty);
29472953
}
29482954

drivers/tty/serial/sh-sci.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include <linux/ioport.h>
3232
#include <linux/ktime.h>
3333
#include <linux/major.h>
34+
#include <linux/minmax.h>
3435
#include <linux/module.h>
3536
#include <linux/mm.h>
3637
#include <linux/of.h>
@@ -2864,6 +2865,13 @@ static int sci_init_single(struct platform_device *dev,
28642865
sci_port->irqs[i] = platform_get_irq(dev, i);
28652866
}
28662867

2868+
/*
2869+
* The fourth interrupt on SCI port is transmit end interrupt, so
2870+
* shuffle the interrupts.
2871+
*/
2872+
if (p->type == PORT_SCI)
2873+
swap(sci_port->irqs[SCIx_BRI_IRQ], sci_port->irqs[SCIx_TEI_IRQ]);
2874+
28672875
/* The SCI generates several interrupts. They can be muxed together or
28682876
* connected to different interrupt lines. In the muxed case only one
28692877
* interrupt resource is specified as there is only one interrupt ID.
@@ -2929,7 +2937,7 @@ static int sci_init_single(struct platform_device *dev,
29292937
port->flags = UPF_FIXED_PORT | UPF_BOOT_AUTOCONF | p->flags;
29302938
port->fifosize = sci_port->params->fifosize;
29312939

2932-
if (port->type == PORT_SCI) {
2940+
if (port->type == PORT_SCI && !dev->dev.of_node) {
29332941
if (sci_port->reg_size >= 0x20)
29342942
port->regshift = 2;
29352943
else

0 commit comments

Comments
 (0)