Commit 5cdfdd6d authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'tty-6.3-rc3' 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 6.3-rc3 to resolve
  some reported issues.

  They include:

   - 8250 driver Kconfig issue pointed out by you that showed up in -rc1

   - qcom-geni serial driver fixes

   - various 8250 driver fixes for reported problems

   - fsl_lpuart driver fixes

   - serdev fix for regression in -rc1

   - vt.c bugfix

  All have been in linux-next for over a week with no reported problems"

* tag 'tty-6.3-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty:
  tty: vt: protect KD_FONT_OP_GET_TALL from unbound access
  serial: qcom-geni: drop bogus uart_write_wakeup()
  serial: qcom-geni: fix mapping of empty DMA buffer
  serial: qcom-geni: fix DMA mapping leak on shutdown
  serial: qcom-geni: fix console shutdown hang
  serdev: Set fwnode for serdev devices
  tty: serial: fsl_lpuart: fix race on RX DMA shutdown
  serial: 8250_pci1xxxx: Disable SERIAL_8250_PCI1XXXX config by default
  serial: 8250_fsl: fix handle_irq locking
  serial: 8250_em: Fix UART port type
  serial: 8250: ASPEED_VUART: select REGMAP instead of depending on it
  tty: serial: fsl_lpuart: skip waiting for transmission complete when UARTCTRL_SBK is asserted
  Revert "tty: serial: fsl_lpuart: adjust SERIAL_FSL_LPUART_CONSOLE config dependency"
parents ce86beb4 18365ebf
...@@ -534,7 +534,7 @@ static int of_serdev_register_devices(struct serdev_controller *ctrl) ...@@ -534,7 +534,7 @@ static int of_serdev_register_devices(struct serdev_controller *ctrl)
if (!serdev) if (!serdev)
continue; continue;
serdev->dev.of_node = node; device_set_node(&serdev->dev, of_fwnode_handle(node));
err = serdev_device_add(serdev); err = serdev_device_add(serdev);
if (err) { if (err) {
......
...@@ -106,8 +106,8 @@ static int serial8250_em_probe(struct platform_device *pdev) ...@@ -106,8 +106,8 @@ static int serial8250_em_probe(struct platform_device *pdev)
memset(&up, 0, sizeof(up)); memset(&up, 0, sizeof(up));
up.port.mapbase = regs->start; up.port.mapbase = regs->start;
up.port.irq = irq; up.port.irq = irq;
up.port.type = PORT_UNKNOWN; up.port.type = PORT_16750;
up.port.flags = UPF_BOOT_AUTOCONF | UPF_FIXED_PORT | UPF_IOREMAP; up.port.flags = UPF_FIXED_PORT | UPF_IOREMAP | UPF_FIXED_TYPE;
up.port.dev = &pdev->dev; up.port.dev = &pdev->dev;
up.port.private_data = priv; up.port.private_data = priv;
......
...@@ -34,7 +34,7 @@ int fsl8250_handle_irq(struct uart_port *port) ...@@ -34,7 +34,7 @@ int fsl8250_handle_irq(struct uart_port *port)
iir = port->serial_in(port, UART_IIR); iir = port->serial_in(port, UART_IIR);
if (iir & UART_IIR_NO_INT) { if (iir & UART_IIR_NO_INT) {
spin_unlock(&up->port.lock); spin_unlock_irqrestore(&up->port.lock, flags);
return 0; return 0;
} }
...@@ -42,7 +42,7 @@ int fsl8250_handle_irq(struct uart_port *port) ...@@ -42,7 +42,7 @@ int fsl8250_handle_irq(struct uart_port *port)
if (unlikely(up->lsr_saved_flags & UART_LSR_BI)) { if (unlikely(up->lsr_saved_flags & UART_LSR_BI)) {
up->lsr_saved_flags &= ~UART_LSR_BI; up->lsr_saved_flags &= ~UART_LSR_BI;
port->serial_in(port, UART_RX); port->serial_in(port, UART_RX);
spin_unlock(&up->port.lock); spin_unlock_irqrestore(&up->port.lock, flags);
return 1; return 1;
} }
......
...@@ -257,8 +257,9 @@ config SERIAL_8250_ASPEED_VUART ...@@ -257,8 +257,9 @@ config SERIAL_8250_ASPEED_VUART
tristate "Aspeed Virtual UART" tristate "Aspeed Virtual UART"
depends on SERIAL_8250 depends on SERIAL_8250
depends on OF depends on OF
depends on REGMAP && MFD_SYSCON depends on MFD_SYSCON
depends on ARCH_ASPEED || COMPILE_TEST depends on ARCH_ASPEED || COMPILE_TEST
select REGMAP
help help
If you want to use the virtual UART (VUART) device on Aspeed If you want to use the virtual UART (VUART) device on Aspeed
BMC platforms, enable this option. This enables the 16550A- BMC platforms, enable this option. This enables the 16550A-
...@@ -299,7 +300,6 @@ config SERIAL_8250_PCI1XXXX ...@@ -299,7 +300,6 @@ config SERIAL_8250_PCI1XXXX
tristate "Microchip 8250 based serial port" tristate "Microchip 8250 based serial port"
depends on SERIAL_8250 && PCI depends on SERIAL_8250 && PCI
select SERIAL_8250_PCILIB select SERIAL_8250_PCILIB
default SERIAL_8250
help help
Select this option if you have a setup with Microchip PCIe Select this option if you have a setup with Microchip PCIe
Switch with serial port enabled and wish to enable 8250 Switch with serial port enabled and wish to enable 8250
......
...@@ -1313,7 +1313,7 @@ config SERIAL_FSL_LPUART ...@@ -1313,7 +1313,7 @@ config SERIAL_FSL_LPUART
config SERIAL_FSL_LPUART_CONSOLE config SERIAL_FSL_LPUART_CONSOLE
bool "Console on Freescale lpuart serial port" bool "Console on Freescale lpuart serial port"
depends on SERIAL_FSL_LPUART depends on SERIAL_FSL_LPUART=y
select SERIAL_CORE_CONSOLE select SERIAL_CORE_CONSOLE
select SERIAL_EARLYCON select SERIAL_EARLYCON
help help
......
...@@ -1354,6 +1354,7 @@ static void lpuart_dma_rx_free(struct uart_port *port) ...@@ -1354,6 +1354,7 @@ static void lpuart_dma_rx_free(struct uart_port *port)
struct dma_chan *chan = sport->dma_rx_chan; struct dma_chan *chan = sport->dma_rx_chan;
dmaengine_terminate_sync(chan); dmaengine_terminate_sync(chan);
del_timer_sync(&sport->lpuart_timer);
dma_unmap_sg(chan->device->dev, &sport->rx_sgl, 1, DMA_FROM_DEVICE); dma_unmap_sg(chan->device->dev, &sport->rx_sgl, 1, DMA_FROM_DEVICE);
kfree(sport->rx_ring.buf); kfree(sport->rx_ring.buf);
sport->rx_ring.tail = 0; sport->rx_ring.tail = 0;
...@@ -1813,7 +1814,6 @@ static int lpuart32_startup(struct uart_port *port) ...@@ -1813,7 +1814,6 @@ static int lpuart32_startup(struct uart_port *port)
static void lpuart_dma_shutdown(struct lpuart_port *sport) static void lpuart_dma_shutdown(struct lpuart_port *sport)
{ {
if (sport->lpuart_dma_rx_use) { if (sport->lpuart_dma_rx_use) {
del_timer_sync(&sport->lpuart_timer);
lpuart_dma_rx_free(&sport->port); lpuart_dma_rx_free(&sport->port);
sport->lpuart_dma_rx_use = false; sport->lpuart_dma_rx_use = false;
} }
...@@ -1973,10 +1973,8 @@ lpuart_set_termios(struct uart_port *port, struct ktermios *termios, ...@@ -1973,10 +1973,8 @@ lpuart_set_termios(struct uart_port *port, struct ktermios *termios,
* Since timer function acqures sport->port.lock, need to stop before * Since timer function acqures sport->port.lock, need to stop before
* acquring same lock because otherwise del_timer_sync() can deadlock. * acquring same lock because otherwise del_timer_sync() can deadlock.
*/ */
if (old && sport->lpuart_dma_rx_use) { if (old && sport->lpuart_dma_rx_use)
del_timer_sync(&sport->lpuart_timer);
lpuart_dma_rx_free(&sport->port); lpuart_dma_rx_free(&sport->port);
}
spin_lock_irqsave(&sport->port.lock, flags); spin_lock_irqsave(&sport->port.lock, flags);
...@@ -2210,10 +2208,8 @@ lpuart32_set_termios(struct uart_port *port, struct ktermios *termios, ...@@ -2210,10 +2208,8 @@ lpuart32_set_termios(struct uart_port *port, struct ktermios *termios,
* Since timer function acqures sport->port.lock, need to stop before * Since timer function acqures sport->port.lock, need to stop before
* acquring same lock because otherwise del_timer_sync() can deadlock. * acquring same lock because otherwise del_timer_sync() can deadlock.
*/ */
if (old && sport->lpuart_dma_rx_use) { if (old && sport->lpuart_dma_rx_use)
del_timer_sync(&sport->lpuart_timer);
lpuart_dma_rx_free(&sport->port); lpuart_dma_rx_free(&sport->port);
}
spin_lock_irqsave(&sport->port.lock, flags); spin_lock_irqsave(&sport->port.lock, flags);
...@@ -2240,9 +2236,15 @@ lpuart32_set_termios(struct uart_port *port, struct ktermios *termios, ...@@ -2240,9 +2236,15 @@ lpuart32_set_termios(struct uart_port *port, struct ktermios *termios,
/* update the per-port timeout */ /* update the per-port timeout */
uart_update_timeout(port, termios->c_cflag, baud); uart_update_timeout(port, termios->c_cflag, baud);
/* wait transmit engin complete */ /*
lpuart32_write(&sport->port, 0, UARTMODIR); * LPUART Transmission Complete Flag may never be set while queuing a break
lpuart32_wait_bit_set(&sport->port, UARTSTAT, UARTSTAT_TC); * character, so skip waiting for transmission complete when UARTCTRL_SBK is
* asserted.
*/
if (!(old_ctrl & UARTCTRL_SBK)) {
lpuart32_write(&sport->port, 0, UARTMODIR);
lpuart32_wait_bit_set(&sport->port, UARTSTAT, UARTSTAT_TC);
}
/* disable transmit and receive */ /* disable transmit and receive */
lpuart32_write(&sport->port, old_ctrl & ~(UARTCTRL_TE | UARTCTRL_RE), lpuart32_write(&sport->port, old_ctrl & ~(UARTCTRL_TE | UARTCTRL_RE),
...@@ -3014,7 +3016,6 @@ static int lpuart_suspend(struct device *dev) ...@@ -3014,7 +3016,6 @@ static int lpuart_suspend(struct device *dev)
* cannot resume as expected, hence gracefully release the * cannot resume as expected, hence gracefully release the
* Rx DMA path before suspend and start Rx DMA path on resume. * Rx DMA path before suspend and start Rx DMA path on resume.
*/ */
del_timer_sync(&sport->lpuart_timer);
lpuart_dma_rx_free(&sport->port); lpuart_dma_rx_free(&sport->port);
/* Disable Rx DMA to use UART port as wakeup source */ /* Disable Rx DMA to use UART port as wakeup source */
......
...@@ -596,7 +596,7 @@ static void qcom_geni_serial_stop_tx_dma(struct uart_port *uport) ...@@ -596,7 +596,7 @@ static void qcom_geni_serial_stop_tx_dma(struct uart_port *uport)
if (!qcom_geni_serial_main_active(uport)) if (!qcom_geni_serial_main_active(uport))
return; return;
if (port->rx_dma_addr) { if (port->tx_dma_addr) {
geni_se_tx_dma_unprep(&port->se, port->tx_dma_addr, geni_se_tx_dma_unprep(&port->se, port->tx_dma_addr,
port->tx_remaining); port->tx_remaining);
port->tx_dma_addr = 0; port->tx_dma_addr = 0;
...@@ -631,9 +631,8 @@ static void qcom_geni_serial_start_tx_dma(struct uart_port *uport) ...@@ -631,9 +631,8 @@ static void qcom_geni_serial_start_tx_dma(struct uart_port *uport)
if (port->tx_dma_addr) if (port->tx_dma_addr)
return; return;
xmit_size = uart_circ_chars_pending(xmit); if (uart_circ_empty(xmit))
if (xmit_size < WAKEUP_CHARS) return;
uart_write_wakeup(uport);
xmit_size = CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE); xmit_size = CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE);
...@@ -1070,6 +1069,10 @@ static int setup_fifos(struct qcom_geni_serial_port *port) ...@@ -1070,6 +1069,10 @@ static int setup_fifos(struct qcom_geni_serial_port *port)
static void qcom_geni_serial_shutdown(struct uart_port *uport) static void qcom_geni_serial_shutdown(struct uart_port *uport)
{ {
disable_irq(uport->irq); disable_irq(uport->irq);
if (uart_console(uport))
return;
qcom_geni_serial_stop_tx(uport); qcom_geni_serial_stop_tx(uport);
qcom_geni_serial_stop_rx(uport); qcom_geni_serial_stop_rx(uport);
} }
......
...@@ -4545,6 +4545,9 @@ static int con_font_get(struct vc_data *vc, struct console_font_op *op) ...@@ -4545,6 +4545,9 @@ static int con_font_get(struct vc_data *vc, struct console_font_op *op)
int c; int c;
unsigned int vpitch = op->op == KD_FONT_OP_GET_TALL ? op->height : 32; unsigned int vpitch = op->op == KD_FONT_OP_GET_TALL ? op->height : 32;
if (vpitch > max_font_height)
return -EINVAL;
if (op->data) { if (op->data) {
font.data = kvmalloc(max_font_size, GFP_KERNEL); font.data = kvmalloc(max_font_size, GFP_KERNEL);
if (!font.data) if (!font.data)
......
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