linux-stable/drivers/tty
Lukas Wunner 7c622181fa serial: core: Initialize rs485 RTS polarity already on probe
commit 2dd8a74fdd upstream.

RTS polarity of rs485-enabled ports is currently initialized on uart
open via:

tty_port_open()
  tty_port_block_til_ready()
    tty_port_raise_dtr_rts()  # if (C_BAUD(tty))
      uart_dtr_rts()
        uart_port_dtr_rts()

There's at least three problems here:

First, if no baud rate is set, RTS polarity is not initialized.
That's the right thing to do for rs232, but not for rs485, which
requires that RTS is deasserted unconditionally.

Second, if the DeviceTree property "linux,rs485-enabled-at-boot-time" is
present, RTS should be deasserted as early as possible, i.e. on probe.
Otherwise it may remain asserted until first open.

Third, even though RTS is deasserted on open and close, it may
subsequently be asserted by uart_throttle(), uart_unthrottle() or
uart_set_termios() because those functions aren't rs485-aware.
(Only uart_tiocmset() is.)

To address these issues, move RTS initialization from uart_port_dtr_rts()
to uart_configure_port().  Prevent subsequent modification of RTS
polarity by moving the existing rs485 check from uart_tiocmget() to
uart_update_mctrl().

That way, RTS is initialized on probe and then remains unmodified unless
the uart transmits data.  If rs485 is enabled at runtime (instead of at
boot) through a TIOCSRS485 ioctl(), RTS is initialized by the uart
driver's ->rs485_config() callback and then likewise remains unmodified.

The PL011 driver initializes RTS on uart open and prevents subsequent
modification in its ->set_mctrl() callback.  That code is obsoleted by
the present commit, so drop it.

Cc: Jan Kiszka <jan.kiszka@siemens.com>
Cc: Su Bao Cheng <baocheng.su@siemens.com>
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Link: https://lore.kernel.org/r/2d2acaf3a69e89b7bf687c912022b11fd29dfa1e.1642909284.git.lukas@wunner.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2022-06-25 15:18:40 +02:00
..
hvc tty: hvc: fix return value of __setup handler 2022-04-08 14:23:50 +02:00
ipwireless
serdev TTY / Serial patches for 5.15-rc1 2021-09-01 09:51:16 -07:00
serial serial: core: Initialize rs485 RTS polarity already on probe 2022-06-25 15:18:40 +02:00
vt vt_ioctl: add array_index_nospec to VT_ACTIVATE 2022-02-16 12:56:33 +01:00
Kconfig
Makefile
amiserial.c
ehv_bytechan.c
goldfish.c tty: goldfish: Fix free_irq() on remove 2022-06-22 14:22:00 +02:00
mips_ejtag_fdc.c
moxa.c
moxa.h
mxser.c mxser: fix xmit_buf leak in activate when LSR == 0xff 2022-04-08 14:23:43 +02:00
n_gsm.c tty: n_gsm: Debug output allocation must use GFP_ATOMIC 2022-06-22 14:22:04 +02:00
n_hdlc.c tty: n_hdlc: make n_hdlc_tty_wakeup() asynchronous 2021-12-22 09:32:45 +01:00
n_null.c
n_tty.c tty: n_tty: Restore EOF push handling behavior 2022-06-14 18:36:03 +02:00
nozomi.c
pty.c
synclink_gt.c tty: synclink_gt: Fix null-pointer-dereference in slgt_clean() 2022-06-14 18:36:20 +02:00
sysrq.c sysrq: do not omit current cpu when showing backtrace of all active CPUs 2022-06-14 18:36:21 +02:00
tty.h
tty_audit.c
tty_baudrate.c
tty_buffer.c tty: fix deadlock caused by calling printk() under tty_port->lock 2022-06-09 10:23:11 +02:00
tty_io.c tty: Fix data race between tiocsti() and flush_to_ldisc() 2021-08-26 14:51:38 +02:00
tty_ioctl.c
tty_jobctrl.c
tty_ldisc.c tty: unexport tty_ldisc_release 2021-09-14 11:18:47 +02:00
tty_ldsem.c
tty_mutex.c
tty_port.c
ttynull.c
vcc.c