On Thu, 25 Apr 2024 at 09:09, Claudiu <claudiu.beznea@xxxxxxxxx> wrote: > > From: Claudiu Beznea <claudiu.beznea.uj@xxxxxxxxxxxxxx> > > In case the UART port is used as a console, no_console_suspend is > available in bootargs and UART port is part of a software-controlled power > domain we need to call device_set_awake_path(). This lets the power > domain core code know that this domain should not be powered off > during system suspend. Otherwise, the UART port power domain is turned off, > nothing is printed while suspending and the suspend/resume process is > blocked. This was detected on the Renesas RZ/G3S SoC while adding support > for power domains. > > Based on code investigation, this issue is present on other SoCs (e.g., > Renesas R-Mobile A1 [1], IMX8QXP [2]) and different SoCs have particular > implementation to handle it. Due to this the patch added the call of > device_set_awake_path() in uart_suspend_port() instead of having it in > the platform specific UART driver. > > [1] https://elixir.bootlin.com/linux/v6.9-rc5/source/drivers/pmdomain/renesas/rmobile-sysc.c#L116 > [2] https://elixir.bootlin.com/linux/v6.9-rc5/source/drivers/pmdomain/imx/scu-pd.c#L357 > > Suggested-by: Ulf Hansson <ulf.hansson@xxxxxxxxxx> > Suggested-by: Geert Uytterhoeven <geert@xxxxxxxxxxxxxx> > Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@xxxxxxxxxxxxxx> At least conceptually this makes perfect sense to me. If it's the correct place to put it, I trust others to know. Nevertheless, feel free to add: Reviewed-by: Ulf Hansson <ulf.hansson@xxxxxxxxxx> Kind regards Uffe > --- > > Changes in v2: > - used device_set_awake_path() instead of device_set_wakeup_path() > - moved the support in uart_suspend_port() to make it generic for > other drivers > - fixed typos in commit description > - updated the commit description to reflect the new changes and the fact > that support may be applied to other SoCs > - added Suggested-by tag; this was initially proposed by Ulf to move it > in the serial driver then Geert propose to have it more generic in > uart_suspend_port() > > > drivers/tty/serial/serial_core.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c > index d8d797a7a1e3..6270baab668c 100644 > --- a/drivers/tty/serial/serial_core.c > +++ b/drivers/tty/serial/serial_core.c > @@ -2409,6 +2409,7 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport) > uport->ops->stop_rx(uport); > uart_port_unlock_irq(uport); > } > + device_set_awake_path(uport->dev); > goto unlock; > } > > -- > 2.39.2 >