diff mbox series

serial: pl011: Drop redundant DTR/RTS preservation on close/open

Message ID e22089ab49e6e78822c50c8c4db46bf3ee885623.1641129328.git.lukas@wunner.de
State New
Headers show
Series serial: pl011: Drop redundant DTR/RTS preservation on close/open | expand

Commit Message

Lukas Wunner Jan. 2, 2022, 5:49 p.m. UTC
Commit d8d8ffa47783 ("amba-pl011: do not disable RTS during shutdown")
amended the PL011 serial driver to leave DTR/RTS polarity untouched on
tty close.  That change made sense.

But the commit also added code to save DTR/RTS state to an internal
variable on tty close and restore it on tty open.  That part of the
commit makes less sense:  The driver has no ->pm() callback, so the uart
remains powered after tty close and automatically preserves register
state, including DTR/RTS.

Saving and restoring registers isn't the job of the ->startup() and
->shutdown() callbacks anyway.  Rather, it should happen in ->pm().

Additionally, after pl011_startup() restores the state, the serial core
overrides it in uart_port_dtr_rts() if a baud rate has been set:

tty_port_open()
  uart_port_activate()
    uart_startup()
      uart_port_startup()
        pl011_startup()       # restores DTR/RTS from uap->old_cr
  tty_port_block_til_ready()
    tty_port_raise_dtr_rts    # if (C_BAUD(tty))
      uart_dtr_rts()
        uart_port_dtr_rts()   # raises DTR/RTS

The serial core also overrides DTR/RTS on tty close in uart_shutdown()
if C_HUPCL(tty) is set.  So a user-defined DTR/RTS polarity won't
survive a close/open cycle anyway, unless the user has set the baud rate
to zero and disabled hupcl on the tty.

Bottom line is, the code to save and restore DTR/RTS has no effect.
Remove it.

Signed-off-by: Lukas Wunner <lukas@wunner.de>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Russell King <rmk+kernel@armlinux.org.uk>
---
Not cc'ing Shreshtha Kumar Sahu <shreshthakumar.sahu@stericsson.com>
(author of commit d8d8ffa47783) because that e-mail address appears
to be unreachable (no MX records in the DNS, only A records,
and their IP addresses don't respond on port 25).

 drivers/tty/serial/amba-pl011.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)
diff mbox series

Patch

diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c
index 7ca4f0da8309..1f1df46242f9 100644
--- a/drivers/tty/serial/amba-pl011.c
+++ b/drivers/tty/serial/amba-pl011.c
@@ -230,7 +230,6 @@  struct uart_amba_port {
 	unsigned int		im;		/* interrupt mask */
 	unsigned int		old_status;
 	unsigned int		fifosize;	/* vendor-specific */
-	unsigned int		old_cr;		/* state during shutdown */
 	unsigned int		fixed_baud;	/* vendor-set fixed baud rate */
 	char			type[12];
 	bool			rs485_tx_started;
@@ -1805,8 +1804,8 @@  static int pl011_startup(struct uart_port *port)
 
 	spin_lock_irq(&uap->port.lock);
 
-	/* restore RTS and DTR */
-	cr = uap->old_cr & (UART011_CR_RTS | UART011_CR_DTR);
+	cr = pl011_read(uap, REG_CR);
+	cr &= UART011_CR_RTS | UART011_CR_DTR;
 	cr |= UART01x_CR_UARTEN | UART011_CR_RXE;
 
 	if (port->rs485.flags & SER_RS485_ENABLED) {
@@ -1883,7 +1882,6 @@  static void pl011_disable_uart(struct uart_amba_port *uap)
 	uap->port.status &= ~(UPSTAT_AUTOCTS | UPSTAT_AUTORTS);
 	spin_lock_irq(&uap->port.lock);
 	cr = pl011_read(uap, REG_CR);
-	uap->old_cr = cr;
 	cr &= UART011_CR_RTS | UART011_CR_DTR;
 	cr |= UART01x_CR_UARTEN | UART011_CR_TXE;
 	pl011_write(cr, uap, REG_CR);
@@ -2699,7 +2697,6 @@  static int pl011_setup_port(struct device *dev, struct uart_amba_port *uap,
 
 	index = pl011_probe_dt_alias(index, dev);
 
-	uap->old_cr = 0;
 	uap->port.dev = dev;
 	uap->port.mapbase = mmiobase->start;
 	uap->port.membase = base;