mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-13 14:24:11 +08:00
TTY/Serial driver fixes for 6.8-rc6
Here are 3 small serial/tty driver fixes for 6.8-rc6 that resolve the following reported errors: - riscv hvc console driver fix that was reported by many - amba-pl011 serial driver fix for RS485 mode - stm32 serial driver fix for RS485 mode All of these have been in linux-next all week with no reported problems. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCZdtGnA8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ymrqwCfSIsUj9GLazXJTTTgMz1I94HXLrQAnjq9QOtg EFt6xmUGcF4zFhnfSLal =/k5+ -----END PGP SIGNATURE----- Merge tag 'tty-6.8-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty Pull tty/serial driver fixes from Greg KH: "Here are three small serial/tty driver fixes for 6.8-rc6 that resolve the following reported errors: - riscv hvc console driver fix that was reported by many - amba-pl011 serial driver fix for RS485 mode - stm32 serial driver fix for RS485 mode All of these have been in linux-next all week with no reported problems" * tag 'tty-6.8-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: serial: amba-pl011: Fix DMA transmission in RS485 mode serial: stm32: do not always set SER_RS485_RX_DURING_TX if RS485 is enabled tty: hvc: Don't enable the RISC-V SBI console by default
This commit is contained in:
commit
1e592e9536
@ -108,13 +108,15 @@ config HVC_DCC_SERIALIZE_SMP
|
|||||||
|
|
||||||
config HVC_RISCV_SBI
|
config HVC_RISCV_SBI
|
||||||
bool "RISC-V SBI console support"
|
bool "RISC-V SBI console support"
|
||||||
depends on RISCV_SBI
|
depends on RISCV_SBI && NONPORTABLE
|
||||||
select HVC_DRIVER
|
select HVC_DRIVER
|
||||||
help
|
help
|
||||||
This enables support for console output via RISC-V SBI calls, which
|
This enables support for console output via RISC-V SBI calls, which
|
||||||
is normally used only during boot to output printk.
|
is normally used only during boot to output printk. This driver
|
||||||
|
conflicts with real console drivers and should not be enabled on
|
||||||
|
systems that directly access the console.
|
||||||
|
|
||||||
If you don't know what do to here, say Y.
|
If you don't know what do to here, say N.
|
||||||
|
|
||||||
config HVCS
|
config HVCS
|
||||||
tristate "IBM Hypervisor Virtual Console Server support"
|
tristate "IBM Hypervisor Virtual Console Server support"
|
||||||
|
@ -1339,11 +1339,41 @@ static void pl011_start_tx_pio(struct uart_amba_port *uap)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void pl011_rs485_tx_start(struct uart_amba_port *uap)
|
||||||
|
{
|
||||||
|
struct uart_port *port = &uap->port;
|
||||||
|
u32 cr;
|
||||||
|
|
||||||
|
/* Enable transmitter */
|
||||||
|
cr = pl011_read(uap, REG_CR);
|
||||||
|
cr |= UART011_CR_TXE;
|
||||||
|
|
||||||
|
/* Disable receiver if half-duplex */
|
||||||
|
if (!(port->rs485.flags & SER_RS485_RX_DURING_TX))
|
||||||
|
cr &= ~UART011_CR_RXE;
|
||||||
|
|
||||||
|
if (port->rs485.flags & SER_RS485_RTS_ON_SEND)
|
||||||
|
cr &= ~UART011_CR_RTS;
|
||||||
|
else
|
||||||
|
cr |= UART011_CR_RTS;
|
||||||
|
|
||||||
|
pl011_write(cr, uap, REG_CR);
|
||||||
|
|
||||||
|
if (port->rs485.delay_rts_before_send)
|
||||||
|
mdelay(port->rs485.delay_rts_before_send);
|
||||||
|
|
||||||
|
uap->rs485_tx_started = true;
|
||||||
|
}
|
||||||
|
|
||||||
static void pl011_start_tx(struct uart_port *port)
|
static void pl011_start_tx(struct uart_port *port)
|
||||||
{
|
{
|
||||||
struct uart_amba_port *uap =
|
struct uart_amba_port *uap =
|
||||||
container_of(port, struct uart_amba_port, port);
|
container_of(port, struct uart_amba_port, port);
|
||||||
|
|
||||||
|
if ((uap->port.rs485.flags & SER_RS485_ENABLED) &&
|
||||||
|
!uap->rs485_tx_started)
|
||||||
|
pl011_rs485_tx_start(uap);
|
||||||
|
|
||||||
if (!pl011_dma_tx_start(uap))
|
if (!pl011_dma_tx_start(uap))
|
||||||
pl011_start_tx_pio(uap);
|
pl011_start_tx_pio(uap);
|
||||||
}
|
}
|
||||||
@ -1424,42 +1454,12 @@ static bool pl011_tx_char(struct uart_amba_port *uap, unsigned char c,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pl011_rs485_tx_start(struct uart_amba_port *uap)
|
|
||||||
{
|
|
||||||
struct uart_port *port = &uap->port;
|
|
||||||
u32 cr;
|
|
||||||
|
|
||||||
/* Enable transmitter */
|
|
||||||
cr = pl011_read(uap, REG_CR);
|
|
||||||
cr |= UART011_CR_TXE;
|
|
||||||
|
|
||||||
/* Disable receiver if half-duplex */
|
|
||||||
if (!(port->rs485.flags & SER_RS485_RX_DURING_TX))
|
|
||||||
cr &= ~UART011_CR_RXE;
|
|
||||||
|
|
||||||
if (port->rs485.flags & SER_RS485_RTS_ON_SEND)
|
|
||||||
cr &= ~UART011_CR_RTS;
|
|
||||||
else
|
|
||||||
cr |= UART011_CR_RTS;
|
|
||||||
|
|
||||||
pl011_write(cr, uap, REG_CR);
|
|
||||||
|
|
||||||
if (port->rs485.delay_rts_before_send)
|
|
||||||
mdelay(port->rs485.delay_rts_before_send);
|
|
||||||
|
|
||||||
uap->rs485_tx_started = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Returns true if tx interrupts have to be (kept) enabled */
|
/* Returns true if tx interrupts have to be (kept) enabled */
|
||||||
static bool pl011_tx_chars(struct uart_amba_port *uap, bool from_irq)
|
static bool pl011_tx_chars(struct uart_amba_port *uap, bool from_irq)
|
||||||
{
|
{
|
||||||
struct circ_buf *xmit = &uap->port.state->xmit;
|
struct circ_buf *xmit = &uap->port.state->xmit;
|
||||||
int count = uap->fifosize >> 1;
|
int count = uap->fifosize >> 1;
|
||||||
|
|
||||||
if ((uap->port.rs485.flags & SER_RS485_ENABLED) &&
|
|
||||||
!uap->rs485_tx_started)
|
|
||||||
pl011_rs485_tx_start(uap);
|
|
||||||
|
|
||||||
if (uap->port.x_char) {
|
if (uap->port.x_char) {
|
||||||
if (!pl011_tx_char(uap, uap->port.x_char, from_irq))
|
if (!pl011_tx_char(uap, uap->port.x_char, from_irq))
|
||||||
return true;
|
return true;
|
||||||
|
@ -251,7 +251,9 @@ static int stm32_usart_config_rs485(struct uart_port *port, struct ktermios *ter
|
|||||||
writel_relaxed(cr3, port->membase + ofs->cr3);
|
writel_relaxed(cr3, port->membase + ofs->cr3);
|
||||||
writel_relaxed(cr1, port->membase + ofs->cr1);
|
writel_relaxed(cr1, port->membase + ofs->cr1);
|
||||||
|
|
||||||
rs485conf->flags |= SER_RS485_RX_DURING_TX;
|
if (!port->rs485_rx_during_tx_gpio)
|
||||||
|
rs485conf->flags |= SER_RS485_RX_DURING_TX;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
stm32_usart_clr_bits(port, ofs->cr3,
|
stm32_usart_clr_bits(port, ofs->cr3,
|
||||||
USART_CR3_DEM | USART_CR3_DEP);
|
USART_CR3_DEM | USART_CR3_DEP);
|
||||||
|
Loading…
Reference in New Issue
Block a user