Changes:
- Replace temporary serial-port suspend fix with proper one
- Rebase onto v6.5.6
Links:
- kernel: 52575b42ef
55 lines
2.4 KiB
Diff
55 lines
2.4 KiB
Diff
From 89b8b8c121fe201862929709d451fecb24947676 Mon Sep 17 00:00:00 2001
|
|
From: Tony Lindgren <tony@atomide.com>
|
|
Date: Thu, 5 Oct 2023 10:56:42 +0300
|
|
Subject: [PATCH] serial: core: Fix checks for tx runtime PM state
|
|
|
|
Maximilian reported that surface_serial_hub serdev tx does not work during
|
|
system suspend. During system suspend, runtime PM gets disabled in
|
|
__device_suspend_late(), and tx is unable to wake-up the serial core port
|
|
device that we use to check if tx is safe to start. Johan summarized the
|
|
regression noting that serdev tx no longer always works as earlier when the
|
|
serdev device is runtime PM active.
|
|
|
|
The serdev device and the serial core controller devices are siblings of
|
|
the serial port hardware device. The runtime PM usage count from serdev
|
|
device does not propagate to the serial core device siblings, it only
|
|
propagates to the parent.
|
|
|
|
In addition to the tx issue for suspend, testing for the serial core port
|
|
device can cause an unnecessary delay in enabling tx while waiting for the
|
|
serial core port device to wake-up. The serial core port device wake-up is
|
|
only needed to flush pending tx when the serial port hardware device was
|
|
in runtime PM suspended state.
|
|
|
|
To fix the regression, we need to check the runtime PM state of the parent
|
|
serial port hardware device for tx instead of the serial core port device.
|
|
|
|
As the serial port device drivers may or may not implement runtime PM, we
|
|
need to also add a check for pm_runtime_enabled().
|
|
|
|
Reported-by: Maximilian Luz <luzmaximilian@gmail.com>
|
|
Fixes: 84a9582fd203 ("serial: core: Start managing serial controllers to enable runtime PM")
|
|
Signed-off-by: Tony Lindgren <tony@atomide.com>
|
|
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
|
Patchset: surface-sam
|
|
---
|
|
drivers/tty/serial/serial_core.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
|
|
index 831d033611e6..e429ac42a12e 100644
|
|
--- a/drivers/tty/serial/serial_core.c
|
|
+++ b/drivers/tty/serial/serial_core.c
|
|
@@ -157,7 +157,7 @@ static void __uart_start(struct tty_struct *tty)
|
|
* enabled, serial_port_runtime_resume() calls start_tx() again
|
|
* after enabling the device.
|
|
*/
|
|
- if (pm_runtime_active(&port_dev->dev))
|
|
+ if (!pm_runtime_enabled(port->dev) || pm_runtime_active(port->dev))
|
|
port->ops->start_tx(port);
|
|
pm_runtime_mark_last_busy(&port_dev->dev);
|
|
pm_runtime_put_autosuspend(&port_dev->dev);
|
|
--
|
|
2.42.0
|
|
|