lkml.org 
[lkml]   [2023]   [Oct]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectRe: [PATCH] serial: core: Fix checks for tx runtime PM state
    From
    On 10/5/23 09:56, Tony Lindgren wrote:
    > 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>

    Thanks!

    Tested-by: Maximilian Luz <luzmaximilian@gmail.com>

    > ---
    > 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
    > --- a/drivers/tty/serial/serial_core.c
    > +++ b/drivers/tty/serial/serial_core.c
    > @@ -156,7 +156,7 @@ static void __uart_start(struct uart_state *state)
    > * 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);

    \
     
     \ /
      Last update: 2023-10-06 00:18    [W:7.539 / U:1.140 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site