TTY/Serial driver fixes for 5.4-rc3
Here are some small tty and serial driver fixes for 5.4-rc3 that resolve a number of reported issues and regressions. None of these are huge, full details are in the shortlog. THere's also a MAINTAINERS update that I think you might have already taken in your tree already, but git should handle that merge easily. All have been in linux-next with no reported issues. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCXaH51A8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ykeBQCeMWoqZHpHTXiadziVgtHrjnj5lL8An2Y+3/Wh ZbNxvHnUK/VUJQJ2Szsm =e84r -----END PGP SIGNATURE----- Merge tag 'tty-5.4-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 5.4-rc3 that resolve a number of reported issues and regressions. None of these are huge, full details are in the shortlog. There's also a MAINTAINERS update that I think you might have already taken in your tree already, but git should handle that merge easily. All have been in linux-next with no reported issues" * tag 'tty-5.4-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: MAINTAINERS: kgdb: Add myself as a reviewer for kgdb/kdb tty: serial: imx: Use platform_get_irq_optional() for optional IRQs serial: fix kernel-doc warning in comments serial: 8250_omap: Fix gpio check for auto RTS/CTS serial: mctrl_gpio: Check for NULL pointer tty: serial: fsl_lpuart: Fix lpuart_flush_buffer() tty: serial: Fix PORT_LINFLEXUART definition tty: n_hdlc: fix build on SPARC serial: uartps: Fix uartps_major handling serial: uartlite: fix exit path null pointer tty: serial: linflexuart: Fix magic SysRq handling serial: sh-sci: Use platform_get_irq_optional() for optional interrupts dt-bindings: serial: sh-sci: Document r8a774b1 bindings serial/sifive: select SERIAL_EARLYCON tty: serial: rda: Fix the link time qualifier of 'rda_uart_exit()' tty: serial: owl: Fix the link time qualifier of 'owl_uart_exit()'
This commit is contained in:
Коммит
82c87e7d40
|
@ -26,6 +26,8 @@ Required properties:
|
|||
- "renesas,hscif-r8a77470" for R8A77470 (RZ/G1C) HSCIF compatible UART.
|
||||
- "renesas,scif-r8a774a1" for R8A774A1 (RZ/G2M) SCIF compatible UART.
|
||||
- "renesas,hscif-r8a774a1" for R8A774A1 (RZ/G2M) HSCIF compatible UART.
|
||||
- "renesas,scif-r8a774b1" for R8A774B1 (RZ/G2N) SCIF compatible UART.
|
||||
- "renesas,hscif-r8a774b1" for R8A774B1 (RZ/G2N) HSCIF compatible UART.
|
||||
- "renesas,scif-r8a774c0" for R8A774C0 (RZ/G2E) SCIF compatible UART.
|
||||
- "renesas,hscif-r8a774c0" for R8A774C0 (RZ/G2E) HSCIF compatible UART.
|
||||
- "renesas,scif-r8a7778" for R8A7778 (R-Car M1) SCIF compatible UART.
|
||||
|
|
|
@ -968,6 +968,11 @@ static int __init n_hdlc_init(void)
|
|||
|
||||
} /* end of init_module() */
|
||||
|
||||
#ifdef CONFIG_SPARC
|
||||
#undef __exitdata
|
||||
#define __exitdata
|
||||
#endif
|
||||
|
||||
static const char hdlc_unregister_ok[] __exitdata =
|
||||
KERN_INFO "N_HDLC: line discipline unregistered\n";
|
||||
static const char hdlc_unregister_fail[] __exitdata =
|
||||
|
|
|
@ -141,7 +141,7 @@ static void omap8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
|
|||
|
||||
serial8250_do_set_mctrl(port, mctrl);
|
||||
|
||||
if (!up->gpios) {
|
||||
if (!mctrl_gpio_to_gpiod(up->gpios, UART_GPIO_RTS)) {
|
||||
/*
|
||||
* Turn off autoRTS if RTS is lowered and restore autoRTS
|
||||
* setting if RTS is raised
|
||||
|
@ -456,7 +456,8 @@ static void omap_8250_set_termios(struct uart_port *port,
|
|||
up->port.status &= ~(UPSTAT_AUTOCTS | UPSTAT_AUTORTS | UPSTAT_AUTOXOFF);
|
||||
|
||||
if (termios->c_cflag & CRTSCTS && up->port.flags & UPF_HARD_FLOW &&
|
||||
!up->gpios) {
|
||||
!mctrl_gpio_to_gpiod(up->gpios, UART_GPIO_RTS) &&
|
||||
!mctrl_gpio_to_gpiod(up->gpios, UART_GPIO_CTS)) {
|
||||
/* Enable AUTOCTS (autoRTS is enabled when RTS is raised) */
|
||||
up->port.status |= UPSTAT_AUTOCTS | UPSTAT_AUTORTS;
|
||||
priv->efr |= UART_EFR_CTS;
|
||||
|
|
|
@ -1032,6 +1032,7 @@ config SERIAL_SIFIVE_CONSOLE
|
|||
bool "Console on SiFive UART"
|
||||
depends on SERIAL_SIFIVE=y
|
||||
select SERIAL_CORE_CONSOLE
|
||||
select SERIAL_EARLYCON
|
||||
help
|
||||
Select this option if you would like to use a SiFive UART as the
|
||||
system console.
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* Freescale linflexuart serial port driver
|
||||
*
|
||||
* Copyright 2012-2016 Freescale Semiconductor, Inc.
|
||||
* Copyright 2017-2018 NXP
|
||||
* Copyright 2017-2019 NXP
|
||||
*/
|
||||
|
||||
#if defined(CONFIG_SERIAL_FSL_LINFLEXUART_CONSOLE) && \
|
||||
|
@ -246,12 +246,14 @@ static irqreturn_t linflex_rxint(int irq, void *dev_id)
|
|||
struct tty_port *port = &sport->state->port;
|
||||
unsigned long flags, status;
|
||||
unsigned char rx;
|
||||
bool brk;
|
||||
|
||||
spin_lock_irqsave(&sport->lock, flags);
|
||||
|
||||
status = readl(sport->membase + UARTSR);
|
||||
while (status & LINFLEXD_UARTSR_RMB) {
|
||||
rx = readb(sport->membase + BDRM);
|
||||
brk = false;
|
||||
flg = TTY_NORMAL;
|
||||
sport->icount.rx++;
|
||||
|
||||
|
@ -261,8 +263,11 @@ static irqreturn_t linflex_rxint(int irq, void *dev_id)
|
|||
status |= LINFLEXD_UARTSR_SZF;
|
||||
if (status & LINFLEXD_UARTSR_BOF)
|
||||
status |= LINFLEXD_UARTSR_BOF;
|
||||
if (status & LINFLEXD_UARTSR_FEF)
|
||||
if (status & LINFLEXD_UARTSR_FEF) {
|
||||
if (!rx)
|
||||
brk = true;
|
||||
status |= LINFLEXD_UARTSR_FEF;
|
||||
}
|
||||
if (status & LINFLEXD_UARTSR_PE)
|
||||
status |= LINFLEXD_UARTSR_PE;
|
||||
}
|
||||
|
@ -271,13 +276,15 @@ static irqreturn_t linflex_rxint(int irq, void *dev_id)
|
|||
sport->membase + UARTSR);
|
||||
status = readl(sport->membase + UARTSR);
|
||||
|
||||
if (uart_handle_sysrq_char(sport, (unsigned char)rx))
|
||||
continue;
|
||||
|
||||
if (brk) {
|
||||
uart_handle_break(sport);
|
||||
} else {
|
||||
#ifdef SUPPORT_SYSRQ
|
||||
sport->sysrq = 0;
|
||||
if (uart_handle_sysrq_char(sport, (unsigned char)rx))
|
||||
continue;
|
||||
#endif
|
||||
tty_insert_flip_char(port, rx, flg);
|
||||
tty_insert_flip_char(port, rx, flg);
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&sport->lock, flags);
|
||||
|
|
|
@ -548,7 +548,7 @@ static void lpuart_flush_buffer(struct uart_port *port)
|
|||
val |= UARTFIFO_TXFLUSH | UARTFIFO_RXFLUSH;
|
||||
lpuart32_write(&sport->port, val, UARTFIFO);
|
||||
} else {
|
||||
val = readb(sport->port.membase + UARTPFIFO);
|
||||
val = readb(sport->port.membase + UARTCFIFO);
|
||||
val |= UARTCFIFO_TXFLUSH | UARTCFIFO_RXFLUSH;
|
||||
writeb(val, sport->port.membase + UARTCFIFO);
|
||||
}
|
||||
|
|
|
@ -2222,8 +2222,8 @@ static int imx_uart_probe(struct platform_device *pdev)
|
|||
return PTR_ERR(base);
|
||||
|
||||
rxirq = platform_get_irq(pdev, 0);
|
||||
txirq = platform_get_irq(pdev, 1);
|
||||
rtsirq = platform_get_irq(pdev, 2);
|
||||
txirq = platform_get_irq_optional(pdev, 1);
|
||||
rtsirq = platform_get_irq_optional(pdev, 2);
|
||||
|
||||
sport->port.dev = &pdev->dev;
|
||||
sport->port.mapbase = res->start;
|
||||
|
|
|
@ -740,7 +740,7 @@ static int __init owl_uart_init(void)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void __init owl_uart_exit(void)
|
||||
static void __exit owl_uart_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&owl_uart_platform_driver);
|
||||
uart_unregister_driver(&owl_uart_driver);
|
||||
|
|
|
@ -815,7 +815,7 @@ static int __init rda_uart_init(void)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void __init rda_uart_exit(void)
|
||||
static void __exit rda_uart_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&rda_uart_platform_driver);
|
||||
uart_unregister_driver(&rda_uart_driver);
|
||||
|
|
|
@ -1964,8 +1964,10 @@ uart_get_console(struct uart_port *ports, int nr, struct console *co)
|
|||
* console=<name>,io|mmio|mmio16|mmio32|mmio32be|mmio32native,<addr>,<options>
|
||||
*
|
||||
* The optional form
|
||||
*
|
||||
* earlycon=<name>,0x<addr>,<options>
|
||||
* console=<name>,0x<addr>,<options>
|
||||
*
|
||||
* is also accepted; the returned @iotype will be UPIO_MEM.
|
||||
*
|
||||
* Returns 0 on success or -EINVAL on failure
|
||||
|
|
|
@ -66,6 +66,9 @@ EXPORT_SYMBOL_GPL(mctrl_gpio_set);
|
|||
struct gpio_desc *mctrl_gpio_to_gpiod(struct mctrl_gpios *gpios,
|
||||
enum mctrl_gpio_idx gidx)
|
||||
{
|
||||
if (gpios == NULL)
|
||||
return NULL;
|
||||
|
||||
return gpios->gpio[gidx];
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mctrl_gpio_to_gpiod);
|
||||
|
|
|
@ -2894,8 +2894,12 @@ static int sci_init_single(struct platform_device *dev,
|
|||
port->mapbase = res->start;
|
||||
sci_port->reg_size = resource_size(res);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(sci_port->irqs); ++i)
|
||||
sci_port->irqs[i] = platform_get_irq(dev, i);
|
||||
for (i = 0; i < ARRAY_SIZE(sci_port->irqs); ++i) {
|
||||
if (i)
|
||||
sci_port->irqs[i] = platform_get_irq_optional(dev, i);
|
||||
else
|
||||
sci_port->irqs[i] = platform_get_irq(dev, i);
|
||||
}
|
||||
|
||||
/* The SCI generates several interrupts. They can be muxed together or
|
||||
* connected to different interrupt lines. In the muxed case only one
|
||||
|
|
|
@ -897,7 +897,8 @@ static int __init ulite_init(void)
|
|||
static void __exit ulite_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&ulite_platform_driver);
|
||||
uart_unregister_driver(&ulite_uart_driver);
|
||||
if (ulite_uart_driver.state)
|
||||
uart_unregister_driver(&ulite_uart_driver);
|
||||
}
|
||||
|
||||
module_init(ulite_init);
|
||||
|
|
|
@ -1550,7 +1550,6 @@ static int cdns_uart_probe(struct platform_device *pdev)
|
|||
goto err_out_id;
|
||||
}
|
||||
|
||||
uartps_major = cdns_uart_uart_driver->tty_driver->major;
|
||||
cdns_uart_data->cdns_uart_driver = cdns_uart_uart_driver;
|
||||
|
||||
/*
|
||||
|
@ -1680,6 +1679,7 @@ static int cdns_uart_probe(struct platform_device *pdev)
|
|||
console_port = NULL;
|
||||
#endif
|
||||
|
||||
uartps_major = cdns_uart_uart_driver->tty_driver->major;
|
||||
cdns_uart_data->cts_override = of_property_read_bool(pdev->dev.of_node,
|
||||
"cts-override");
|
||||
return 0;
|
||||
|
@ -1741,6 +1741,12 @@ static int cdns_uart_remove(struct platform_device *pdev)
|
|||
console_port = NULL;
|
||||
#endif
|
||||
|
||||
/* If this is last instance major number should be initialized */
|
||||
mutex_lock(&bitmap_lock);
|
||||
if (bitmap_empty(bitmap, MAX_UART_INSTANCES))
|
||||
uartps_major = 0;
|
||||
mutex_unlock(&bitmap_lock);
|
||||
|
||||
uart_unregister_driver(cdns_uart_data->cdns_uart_driver);
|
||||
return rc;
|
||||
}
|
||||
|
|
|
@ -291,6 +291,6 @@
|
|||
#define PORT_SUNIX 121
|
||||
|
||||
/* Freescale Linflex UART */
|
||||
#define PORT_LINFLEXUART 121
|
||||
#define PORT_LINFLEXUART 122
|
||||
|
||||
#endif /* _UAPILINUX_SERIAL_CORE_H */
|
||||
|
|
Загрузка…
Ссылка в новой задаче