• L
    serial: 8250: 8250_omap: Avoid RS485 RTS glitch on ->set_termios() · 038ee49f
    Lukas Wunner 提交于
    RS485-enabled UART ports on TI Sitara SoCs with active-low polarity
    exhibit a Transmit Enable glitch on ->set_termios():
    
    omap8250_restore_regs(), which is called from omap_8250_set_termios(),
    sets the TCRTLR bit in the MCR register and clears all other bits,
    including RTS.  If RTS uses active-low polarity, it is now asserted
    for no reason.
    
    The TCRTLR bit is subsequently cleared by writing up->mcr to the MCR
    register.  That variable is always zero, so the RTS bit is still cleared
    (incorrectly so if RTS is active-high).
    
    (up->mcr is not, as one might think, a cache of the MCR register's
    current value.  Rather, it only caches a single bit of that register,
    the AFE bit.  And it only does so if the UART supports the AFE bit,
    which OMAP does not.  For details see serial8250_do_set_termios() and
    serial8250_do_set_mctrl().)
    
    Finally at the end of omap8250_restore_regs(), the MCR register is
    restored (and RTS deasserted) by a call to up->port.ops->set_mctrl()
    (which equals serial8250_set_mctrl()) and serial8250_em485_stop_tx().
    
    So there's an RTS glitch between setting TCRTLR and calling
    serial8250_em485_stop_tx().  Avoid by using a read-modify-write
    when setting TCRTLR.
    
    While at it, drop a redundant initialization of up->mcr.  As explained
    above, the variable isn't used by the driver and it is already
    initialized to zero because it is part of the static struct
    serial8250_ports[] declared in 8250_core.c.  (Static structs are
    initialized to zero per section 6.7.8 nr. 10 of the C99 standard.)
    
    Cc: Jan Kiszka <jan.kiszka@siemens.com>
    Cc: Su Bao Cheng <baocheng.su@siemens.com>
    Tested-by: NMatthias Schiffer <matthias.schiffer@ew.tq-group.com>
    Signed-off-by: NLukas Wunner <lukas@wunner.de>
    Link: https://lore.kernel.org/r/6554b0241a2c7fd50f32576fdbafed96709e11e8.1664278942.git.lukas@wunner.deSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    038ee49f
8250_omap.c 44.3 KB