mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-16 19:45:07 +00:00
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:
commit
82c87e7d40
15 changed files with 51 additions and 19 deletions
|
@ -26,6 +26,8 @@ Required properties:
|
||||||
- "renesas,hscif-r8a77470" for R8A77470 (RZ/G1C) HSCIF compatible UART.
|
- "renesas,hscif-r8a77470" for R8A77470 (RZ/G1C) HSCIF compatible UART.
|
||||||
- "renesas,scif-r8a774a1" for R8A774A1 (RZ/G2M) SCIF compatible UART.
|
- "renesas,scif-r8a774a1" for R8A774A1 (RZ/G2M) SCIF compatible UART.
|
||||||
- "renesas,hscif-r8a774a1" for R8A774A1 (RZ/G2M) HSCIF 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,scif-r8a774c0" for R8A774C0 (RZ/G2E) SCIF compatible UART.
|
||||||
- "renesas,hscif-r8a774c0" for R8A774C0 (RZ/G2E) HSCIF compatible UART.
|
- "renesas,hscif-r8a774c0" for R8A774C0 (RZ/G2E) HSCIF compatible UART.
|
||||||
- "renesas,scif-r8a7778" for R8A7778 (R-Car M1) SCIF 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() */
|
} /* end of init_module() */
|
||||||
|
|
||||||
|
#ifdef CONFIG_SPARC
|
||||||
|
#undef __exitdata
|
||||||
|
#define __exitdata
|
||||||
|
#endif
|
||||||
|
|
||||||
static const char hdlc_unregister_ok[] __exitdata =
|
static const char hdlc_unregister_ok[] __exitdata =
|
||||||
KERN_INFO "N_HDLC: line discipline unregistered\n";
|
KERN_INFO "N_HDLC: line discipline unregistered\n";
|
||||||
static const char hdlc_unregister_fail[] __exitdata =
|
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);
|
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
|
* Turn off autoRTS if RTS is lowered and restore autoRTS
|
||||||
* setting if RTS is raised
|
* 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);
|
up->port.status &= ~(UPSTAT_AUTOCTS | UPSTAT_AUTORTS | UPSTAT_AUTOXOFF);
|
||||||
|
|
||||||
if (termios->c_cflag & CRTSCTS && up->port.flags & UPF_HARD_FLOW &&
|
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) */
|
/* Enable AUTOCTS (autoRTS is enabled when RTS is raised) */
|
||||||
up->port.status |= UPSTAT_AUTOCTS | UPSTAT_AUTORTS;
|
up->port.status |= UPSTAT_AUTOCTS | UPSTAT_AUTORTS;
|
||||||
priv->efr |= UART_EFR_CTS;
|
priv->efr |= UART_EFR_CTS;
|
||||||
|
|
|
@ -1032,6 +1032,7 @@ config SERIAL_SIFIVE_CONSOLE
|
||||||
bool "Console on SiFive UART"
|
bool "Console on SiFive UART"
|
||||||
depends on SERIAL_SIFIVE=y
|
depends on SERIAL_SIFIVE=y
|
||||||
select SERIAL_CORE_CONSOLE
|
select SERIAL_CORE_CONSOLE
|
||||||
|
select SERIAL_EARLYCON
|
||||||
help
|
help
|
||||||
Select this option if you would like to use a SiFive UART as the
|
Select this option if you would like to use a SiFive UART as the
|
||||||
system console.
|
system console.
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
* Freescale linflexuart serial port driver
|
* Freescale linflexuart serial port driver
|
||||||
*
|
*
|
||||||
* Copyright 2012-2016 Freescale Semiconductor, Inc.
|
* Copyright 2012-2016 Freescale Semiconductor, Inc.
|
||||||
* Copyright 2017-2018 NXP
|
* Copyright 2017-2019 NXP
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(CONFIG_SERIAL_FSL_LINFLEXUART_CONSOLE) && \
|
#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;
|
struct tty_port *port = &sport->state->port;
|
||||||
unsigned long flags, status;
|
unsigned long flags, status;
|
||||||
unsigned char rx;
|
unsigned char rx;
|
||||||
|
bool brk;
|
||||||
|
|
||||||
spin_lock_irqsave(&sport->lock, flags);
|
spin_lock_irqsave(&sport->lock, flags);
|
||||||
|
|
||||||
status = readl(sport->membase + UARTSR);
|
status = readl(sport->membase + UARTSR);
|
||||||
while (status & LINFLEXD_UARTSR_RMB) {
|
while (status & LINFLEXD_UARTSR_RMB) {
|
||||||
rx = readb(sport->membase + BDRM);
|
rx = readb(sport->membase + BDRM);
|
||||||
|
brk = false;
|
||||||
flg = TTY_NORMAL;
|
flg = TTY_NORMAL;
|
||||||
sport->icount.rx++;
|
sport->icount.rx++;
|
||||||
|
|
||||||
|
@ -261,8 +263,11 @@ static irqreturn_t linflex_rxint(int irq, void *dev_id)
|
||||||
status |= LINFLEXD_UARTSR_SZF;
|
status |= LINFLEXD_UARTSR_SZF;
|
||||||
if (status & LINFLEXD_UARTSR_BOF)
|
if (status & LINFLEXD_UARTSR_BOF)
|
||||||
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;
|
status |= LINFLEXD_UARTSR_FEF;
|
||||||
|
}
|
||||||
if (status & LINFLEXD_UARTSR_PE)
|
if (status & LINFLEXD_UARTSR_PE)
|
||||||
status |= LINFLEXD_UARTSR_PE;
|
status |= LINFLEXD_UARTSR_PE;
|
||||||
}
|
}
|
||||||
|
@ -271,14 +276,16 @@ static irqreturn_t linflex_rxint(int irq, void *dev_id)
|
||||||
sport->membase + UARTSR);
|
sport->membase + UARTSR);
|
||||||
status = readl(sport->membase + UARTSR);
|
status = readl(sport->membase + UARTSR);
|
||||||
|
|
||||||
|
if (brk) {
|
||||||
|
uart_handle_break(sport);
|
||||||
|
} else {
|
||||||
|
#ifdef SUPPORT_SYSRQ
|
||||||
if (uart_handle_sysrq_char(sport, (unsigned char)rx))
|
if (uart_handle_sysrq_char(sport, (unsigned char)rx))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
#ifdef SUPPORT_SYSRQ
|
|
||||||
sport->sysrq = 0;
|
|
||||||
#endif
|
#endif
|
||||||
tty_insert_flip_char(port, rx, flg);
|
tty_insert_flip_char(port, rx, flg);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
spin_unlock_irqrestore(&sport->lock, flags);
|
spin_unlock_irqrestore(&sport->lock, flags);
|
||||||
|
|
||||||
|
|
|
@ -548,7 +548,7 @@ static void lpuart_flush_buffer(struct uart_port *port)
|
||||||
val |= UARTFIFO_TXFLUSH | UARTFIFO_RXFLUSH;
|
val |= UARTFIFO_TXFLUSH | UARTFIFO_RXFLUSH;
|
||||||
lpuart32_write(&sport->port, val, UARTFIFO);
|
lpuart32_write(&sport->port, val, UARTFIFO);
|
||||||
} else {
|
} else {
|
||||||
val = readb(sport->port.membase + UARTPFIFO);
|
val = readb(sport->port.membase + UARTCFIFO);
|
||||||
val |= UARTCFIFO_TXFLUSH | UARTCFIFO_RXFLUSH;
|
val |= UARTCFIFO_TXFLUSH | UARTCFIFO_RXFLUSH;
|
||||||
writeb(val, sport->port.membase + UARTCFIFO);
|
writeb(val, sport->port.membase + UARTCFIFO);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2222,8 +2222,8 @@ static int imx_uart_probe(struct platform_device *pdev)
|
||||||
return PTR_ERR(base);
|
return PTR_ERR(base);
|
||||||
|
|
||||||
rxirq = platform_get_irq(pdev, 0);
|
rxirq = platform_get_irq(pdev, 0);
|
||||||
txirq = platform_get_irq(pdev, 1);
|
txirq = platform_get_irq_optional(pdev, 1);
|
||||||
rtsirq = platform_get_irq(pdev, 2);
|
rtsirq = platform_get_irq_optional(pdev, 2);
|
||||||
|
|
||||||
sport->port.dev = &pdev->dev;
|
sport->port.dev = &pdev->dev;
|
||||||
sport->port.mapbase = res->start;
|
sport->port.mapbase = res->start;
|
||||||
|
|
|
@ -740,7 +740,7 @@ static int __init owl_uart_init(void)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init owl_uart_exit(void)
|
static void __exit owl_uart_exit(void)
|
||||||
{
|
{
|
||||||
platform_driver_unregister(&owl_uart_platform_driver);
|
platform_driver_unregister(&owl_uart_platform_driver);
|
||||||
uart_unregister_driver(&owl_uart_driver);
|
uart_unregister_driver(&owl_uart_driver);
|
||||||
|
|
|
@ -815,7 +815,7 @@ static int __init rda_uart_init(void)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init rda_uart_exit(void)
|
static void __exit rda_uart_exit(void)
|
||||||
{
|
{
|
||||||
platform_driver_unregister(&rda_uart_platform_driver);
|
platform_driver_unregister(&rda_uart_platform_driver);
|
||||||
uart_unregister_driver(&rda_uart_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>
|
* console=<name>,io|mmio|mmio16|mmio32|mmio32be|mmio32native,<addr>,<options>
|
||||||
*
|
*
|
||||||
* The optional form
|
* The optional form
|
||||||
|
*
|
||||||
* earlycon=<name>,0x<addr>,<options>
|
* earlycon=<name>,0x<addr>,<options>
|
||||||
* console=<name>,0x<addr>,<options>
|
* console=<name>,0x<addr>,<options>
|
||||||
|
*
|
||||||
* is also accepted; the returned @iotype will be UPIO_MEM.
|
* is also accepted; the returned @iotype will be UPIO_MEM.
|
||||||
*
|
*
|
||||||
* Returns 0 on success or -EINVAL on failure
|
* 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,
|
struct gpio_desc *mctrl_gpio_to_gpiod(struct mctrl_gpios *gpios,
|
||||||
enum mctrl_gpio_idx gidx)
|
enum mctrl_gpio_idx gidx)
|
||||||
{
|
{
|
||||||
|
if (gpios == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
return gpios->gpio[gidx];
|
return gpios->gpio[gidx];
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mctrl_gpio_to_gpiod);
|
EXPORT_SYMBOL_GPL(mctrl_gpio_to_gpiod);
|
||||||
|
|
|
@ -2894,8 +2894,12 @@ static int sci_init_single(struct platform_device *dev,
|
||||||
port->mapbase = res->start;
|
port->mapbase = res->start;
|
||||||
sci_port->reg_size = resource_size(res);
|
sci_port->reg_size = resource_size(res);
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(sci_port->irqs); ++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);
|
sci_port->irqs[i] = platform_get_irq(dev, i);
|
||||||
|
}
|
||||||
|
|
||||||
/* 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
|
||||||
|
|
|
@ -897,6 +897,7 @@ static int __init ulite_init(void)
|
||||||
static void __exit ulite_exit(void)
|
static void __exit ulite_exit(void)
|
||||||
{
|
{
|
||||||
platform_driver_unregister(&ulite_platform_driver);
|
platform_driver_unregister(&ulite_platform_driver);
|
||||||
|
if (ulite_uart_driver.state)
|
||||||
uart_unregister_driver(&ulite_uart_driver);
|
uart_unregister_driver(&ulite_uart_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1550,7 +1550,6 @@ static int cdns_uart_probe(struct platform_device *pdev)
|
||||||
goto err_out_id;
|
goto err_out_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
uartps_major = cdns_uart_uart_driver->tty_driver->major;
|
|
||||||
cdns_uart_data->cdns_uart_driver = cdns_uart_uart_driver;
|
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;
|
console_port = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
uartps_major = cdns_uart_uart_driver->tty_driver->major;
|
||||||
cdns_uart_data->cts_override = of_property_read_bool(pdev->dev.of_node,
|
cdns_uart_data->cts_override = of_property_read_bool(pdev->dev.of_node,
|
||||||
"cts-override");
|
"cts-override");
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1741,6 +1741,12 @@ static int cdns_uart_remove(struct platform_device *pdev)
|
||||||
console_port = NULL;
|
console_port = NULL;
|
||||||
#endif
|
#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);
|
uart_unregister_driver(cdns_uart_data->cdns_uart_driver);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -291,6 +291,6 @@
|
||||||
#define PORT_SUNIX 121
|
#define PORT_SUNIX 121
|
||||||
|
|
||||||
/* Freescale Linflex UART */
|
/* Freescale Linflex UART */
|
||||||
#define PORT_LINFLEXUART 121
|
#define PORT_LINFLEXUART 122
|
||||||
|
|
||||||
#endif /* _UAPILINUX_SERIAL_CORE_H */
|
#endif /* _UAPILINUX_SERIAL_CORE_H */
|
||||||
|
|
Loading…
Add table
Reference in a new issue