Patch "serial: 8250: omap: Fix missing PM runtime calls for omap8250_set_mctrl()" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    serial: 8250: omap: Fix missing PM runtime calls for omap8250_set_mctrl()

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     serial-8250-omap-fix-missing-pm-runtime-calls-for-om.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 7ff6de531ccfbdb7f9db7996195230009d3e0cb6
Author: Tony Lindgren <tony@xxxxxxxxxxx>
Date:   Mon Oct 24 09:36:13 2022 +0300

    serial: 8250: omap: Fix missing PM runtime calls for omap8250_set_mctrl()
    
    [ Upstream commit 93810191f5d23652c0b8a1a9b3a4a89d6fd5063e ]
    
    There are cases where omap8250_set_mctrl() may get called after the
    UART has already autoidled causing an asynchronous external abort.
    
    This can happen on ttyport_open():
    
    mem_serial_in from omap8250_set_mctrl+0x38/0xa0
    omap8250_set_mctrl from uart_update_mctrl+0x4c/0x58
    uart_update_mctrl from uart_dtr_rts+0x60/0xa8
    uart_dtr_rts from tty_port_block_til_ready+0xd0/0x2a8
    tty_port_block_til_ready from uart_open+0x14/0x1c
    uart_open from ttyport_open+0x64/0x148
    
    And on ttyport_close():
    
    omap8250_set_mctrl from uart_update_mctrl+0x3c/0x48
    uart_update_mctrl from uart_dtr_rts+0x54/0x9c
    uart_dtr_rts from tty_port_shutdown+0x78/0x9c
    tty_port_shutdown from tty_port_close+0x3c/0x74
    tty_port_close from ttyport_close+0x40/0x58
    
    It can also happen on disassociate_ctty() calling uart_shutdown()
    that ends up calling omap8250_set_mctrl().
    
    Let's fix the issue by adding missing PM runtime calls to
    omap8250_set_mctrl(). To do this, we need to add __omap8250_set_mctrl()
    that can be called from both omap8250_set_mctrl(), and from runtime PM
    resume path when restoring the registers.
    
    Fixes: 61929cf0169d ("tty: serial: Add 8250-core based omap driver")
    Reported-by: Merlijn Wajer <merlijn@xxxxxxxxxx>
    Reported-by: Romain Naour <romain.naour@xxxxxxxx>
    Reported-by: Ivaylo Dimitrov <ivo.g.dimitrov.75@xxxxxxxxx>
    Tested-by: Ivaylo Dimitrov <ivo.g.dimitrov.75@xxxxxxxxx>
    Signed-off-by: Tony Lindgren <tony@xxxxxxxxxxx>
    Depends-on: dd8088d5a896 ("PM: runtime: Add pm_runtime_resume_and_get to deal with usage counter")
    Link: https://lore.kernel.org/r/20221024063613.25943-1-tony@xxxxxxxxxxx
    Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c
index 806f7806d3ca..e5d71c99c4e7 100644
--- a/drivers/tty/serial/8250/8250_omap.c
+++ b/drivers/tty/serial/8250/8250_omap.c
@@ -157,7 +157,11 @@ static u32 uart_read(struct uart_8250_port *up, u32 reg)
 	return readl(up->port.membase + (reg << up->port.regshift));
 }
 
-static void omap8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
+/*
+ * Called on runtime PM resume path from omap8250_restore_regs(), and
+ * omap8250_set_mctrl().
+ */
+static void __omap8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
 {
 	struct uart_8250_port *up = up_to_u8250p(port);
 	struct omap8250_priv *priv = up->port.private_data;
@@ -181,6 +185,20 @@ static void omap8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
 	}
 }
 
+static void omap8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
+{
+	int err;
+
+	err = pm_runtime_resume_and_get(port->dev);
+	if (err)
+		return;
+
+	__omap8250_set_mctrl(port, mctrl);
+
+	pm_runtime_mark_last_busy(port->dev);
+	pm_runtime_put_autosuspend(port->dev);
+}
+
 /*
  * Work Around for Errata i202 (2430, 3430, 3630, 4430 and 4460)
  * The access to uart register after MDR1 Access
@@ -341,7 +359,7 @@ static void omap8250_restore_regs(struct uart_8250_port *up)
 
 	omap8250_update_mdr1(up, priv);
 
-	up->port.ops->set_mctrl(&up->port, up->port.mctrl);
+	__omap8250_set_mctrl(&up->port, up->port.mctrl);
 
 	if (up->port.rs485.flags & SER_RS485_ENABLED)
 		serial8250_em485_stop_tx(up);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux