• Lukas Wunner's avatar
    serial: core: Initialize rs485 RTS polarity already on probe · 2dd8a74f
    Lukas Wunner authored
    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: default avatarLukas Wunner <lukas@wunner.de>
    Link: https://lore.kernel.org/r/2d2acaf3a69e89b7bf687c912022b11fd29dfa1e.1642909284.git.lukas@wunner.deSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    2dd8a74f
amba-pl011.c 73.7 KB