Thomas Richard <thomas.richard@xxxxxxxxxxx> writes: > If the console suspend is disabled, the genpd of the console shall not > be powered-off during suspend. > Set the flag GENPD_FLAG_ALWAYS_ON to the corresponding genpd during > suspend, and restore the original value during the resume. > > Signed-off-by: Thomas Richard <thomas.richard@xxxxxxxxxxx> > --- > drivers/tty/serial/8250/8250_omap.c | 33 ++++++++++++++++++++++++----- > 1 file changed, 28 insertions(+), 5 deletions(-) > > diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c > index ca972fd37725..91a483dc460c 100644 > --- a/drivers/tty/serial/8250/8250_omap.c > +++ b/drivers/tty/serial/8250/8250_omap.c > @@ -27,6 +27,7 @@ > #include <linux/pm_wakeirq.h> > #include <linux/dma-mapping.h> > #include <linux/sys_soc.h> > +#include <linux/pm_domain.h> > > #include "8250.h" > > @@ -114,6 +115,12 @@ > /* RX FIFO occupancy indicator */ > #define UART_OMAP_RX_LVL 0x19 > > +/* > + * Copy of the genpd flags for the console. > + * Only used if console suspend is disabled > + */ > +static unsigned int genpd_flags_console; > + > struct omap8250_priv { > void __iomem *membase; > int line; > @@ -1617,6 +1624,7 @@ static int omap8250_suspend(struct device *dev) > { > struct omap8250_priv *priv = dev_get_drvdata(dev); > struct uart_8250_port *up = serial8250_get_port(priv->line); > + struct generic_pm_domain *genpd = pd_to_genpd(dev->pm_domain); > int err = 0; > > serial8250_suspend_port(priv->line); > @@ -1627,8 +1635,19 @@ static int omap8250_suspend(struct device *dev) > if (!device_may_wakeup(dev)) > priv->wer = 0; > serial_out(up, UART_OMAP_WER, priv->wer); > - if (uart_console(&up->port) && console_suspend_enabled) > - err = pm_runtime_force_suspend(dev); > + if (uart_console(&up->port)) { > + if (console_suspend_enabled) > + err = pm_runtime_force_suspend(dev); > + else { > + /* > + * The pd shall not be powered-off (no console suspend). > + * Make copy of genpd flags before to set it always on. > + * The original value is restored during the resume. > + */ > + genpd_flags_console = genpd->flags; > + genpd->flags |= GENPD_FLAG_ALWAYS_ON; > + } > + } This is not the right approach IMO. Instead, what should be happening is that when `no_console_suspend` is set, there should be an extra pm_runtime_get() which increases the device usecount such that the device never runtime suspends, and thus the domain will not get powered off. Kevin