Skip to content

Commit

Permalink
serial: 8250_omap: Set the console genpd always on if no console suspend
Browse files Browse the repository at this point in the history
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@bootlin.com>
Link: https://lore.kernel.org/r/20231017130540.1149721-1-thomas.richard@bootlin.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Thomas Richard authored and Greg Kroah-Hartman committed Oct 21, 2023
1 parent a30badf commit 68e6939
Showing 1 changed file with 28 additions and 5 deletions.
33 changes: 28 additions & 5 deletions drivers/tty/serial/8250/8250_omap.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <linux/pm_wakeirq.h>
#include <linux/dma-mapping.h>
#include <linux/sys_soc.h>
#include <linux/pm_domain.h>

#include "8250.h"

Expand Down Expand Up @@ -115,6 +116,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;
Expand Down Expand Up @@ -1623,6 +1630,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);
Expand All @@ -1633,8 +1641,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;
}
}
flush_work(&priv->qos_work);

return err;
Expand All @@ -1644,12 +1663,16 @@ static int omap8250_resume(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;

if (uart_console(&up->port) && console_suspend_enabled) {
err = pm_runtime_force_resume(dev);
if (err)
return err;
if (console_suspend_enabled) {
err = pm_runtime_force_resume(dev);
if (err)
return err;
} else
genpd->flags = genpd_flags_console;
}

serial8250_resume_port(priv->line);
Expand Down

0 comments on commit 68e6939

Please sign in to comment.