Commit aa46fe36 authored by Linus Torvalds's avatar Linus Torvalds

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
parents a211b1c0 f92ed0cd
...@@ -92,7 +92,7 @@ properties: ...@@ -92,7 +92,7 @@ properties:
- description: Error interrupt - description: Error interrupt
- description: Receive buffer full interrupt - description: Receive buffer full interrupt
- description: Transmit buffer empty interrupt - description: Transmit buffer empty interrupt
- description: Transmit End interrupt - description: Break interrupt
- items: - items:
- description: Error interrupt - description: Error interrupt
- description: Receive buffer full interrupt - description: Receive buffer full interrupt
...@@ -107,7 +107,7 @@ properties: ...@@ -107,7 +107,7 @@ properties:
- const: eri - const: eri
- const: rxi - const: rxi
- const: txi - const: txi
- const: tei - const: bri
- items: - items:
- const: eri - const: eri
- const: rxi - const: rxi
......
...@@ -1903,6 +1903,17 @@ EXPORT_SYMBOL_GPL(serial8250_modem_status); ...@@ -1903,6 +1903,17 @@ EXPORT_SYMBOL_GPL(serial8250_modem_status);
static bool handle_rx_dma(struct uart_8250_port *up, unsigned int iir) static bool handle_rx_dma(struct uart_8250_port *up, unsigned int iir)
{ {
switch (iir & 0x3f) { 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: case UART_IIR_RDI:
if (!up->dma->rx_running) if (!up->dma->rx_running)
break; break;
......
...@@ -858,11 +858,17 @@ static unsigned int lpuart32_tx_empty(struct uart_port *port) ...@@ -858,11 +858,17 @@ static unsigned int lpuart32_tx_empty(struct uart_port *port)
struct lpuart_port, port); struct lpuart_port, port);
unsigned long stat = lpuart32_read(port, UARTSTAT); unsigned long stat = lpuart32_read(port, UARTSTAT);
unsigned long sfifo = lpuart32_read(port, UARTFIFO); unsigned long sfifo = lpuart32_read(port, UARTFIFO);
unsigned long ctrl = lpuart32_read(port, UARTCTRL);
if (sport->dma_tx_in_progress) if (sport->dma_tx_in_progress)
return 0; 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 TIOCSER_TEMT;
return 0; return 0;
...@@ -2942,7 +2948,7 @@ static bool lpuart_uport_is_active(struct lpuart_port *sport) ...@@ -2942,7 +2948,7 @@ static bool lpuart_uport_is_active(struct lpuart_port *sport)
tty = tty_port_tty_get(port); tty = tty_port_tty_get(port);
if (tty) { if (tty) {
tty_dev = tty->dev; tty_dev = tty->dev;
may_wake = device_may_wakeup(tty_dev); may_wake = tty_dev && device_may_wakeup(tty_dev);
tty_kref_put(tty); tty_kref_put(tty);
} }
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/ktime.h> #include <linux/ktime.h>
#include <linux/major.h> #include <linux/major.h>
#include <linux/minmax.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/of.h> #include <linux/of.h>
...@@ -2864,6 +2865,13 @@ static int sci_init_single(struct platform_device *dev, ...@@ -2864,6 +2865,13 @@ static int sci_init_single(struct platform_device *dev,
sci_port->irqs[i] = platform_get_irq(dev, i); 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 /* The SCI generates several interrupts. They can be muxed together or
* connected to different interrupt lines. In the muxed case only one * connected to different interrupt lines. In the muxed case only one
* interrupt resource is specified as there is only one interrupt ID. * interrupt resource is specified as there is only one interrupt ID.
...@@ -2929,7 +2937,7 @@ static int sci_init_single(struct platform_device *dev, ...@@ -2929,7 +2937,7 @@ static int sci_init_single(struct platform_device *dev,
port->flags = UPF_FIXED_PORT | UPF_BOOT_AUTOCONF | p->flags; port->flags = UPF_FIXED_PORT | UPF_BOOT_AUTOCONF | p->flags;
port->fifosize = sci_port->params->fifosize; 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) if (sci_port->reg_size >= 0x20)
port->regshift = 2; port->regshift = 2;
else else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment