blob: a1af15b70868dfee51ea3605e3965aa3d9bc6c9a [file] [log] [blame]
From 63e5b7bb4d322febc0c25d98690c0696496ce7c3 Mon Sep 17 00:00:00 2001
From: Sibi Sankar <sibis@codeaurora.org>
Date: Wed, 12 Aug 2020 00:32:51 +0530
Subject: [PATCH] FROMLIST: PM / Domains: Add GENPD_FLAG_SUSPEND_ON flag
This is for power domains which needs to stay powered on for suspend
but can be powered on/off as part of runtime PM. This flag is aimed at
power domains coupled to remote processors which enter suspend states
independent to that of the application processor. Such power domains
are turned off only on remote processor crash/shutdown.
Signed-off-by: Sibi Sankar <sibis@codeaurora.org>
(am from https://patchwork.kernel.org/patch/11709507/)
(also found at https://lore.kernel.org/r/20200811190252.10559-1-sibis@codeaurora.org)
BUG=b:162939598
TEST=suspend/resume is faster
Signed-off-by: Douglas Anderson <dianders@chromium.org>
Change-Id: Ic63337a0e97796d9c061981d66d9eb12f1271e20
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/2350386
Reviewed-by: Sean Paul <seanpaul@chromium.org>
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
Commit-Queue: Stephen Boyd <swboyd@chromium.org>
---
drivers/base/power/domain.c | 3 ++-
include/linux/pm_domain.h | 5 +++++
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
index 78c310d3179d..78dc6b8faf57 100644
--- a/drivers/base/power/domain.c
+++ b/drivers/base/power/domain.c
@@ -130,6 +130,7 @@ static const struct genpd_lock_ops genpd_spin_ops = {
#define genpd_is_active_wakeup(genpd) (genpd->flags & GENPD_FLAG_ACTIVE_WAKEUP)
#define genpd_is_cpu_domain(genpd) (genpd->flags & GENPD_FLAG_CPU_DOMAIN)
#define genpd_is_rpm_always_on(genpd) (genpd->flags & GENPD_FLAG_RPM_ALWAYS_ON)
+#define genpd_is_suspend_on(genpd) (genpd->flags & GENPD_FLAG_SUSPEND_ON)
static inline bool irq_safe_dev_in_no_sleep_domain(struct device *dev,
const struct generic_pm_domain *genpd)
@@ -1026,7 +1027,7 @@ static void genpd_sync_power_off(struct generic_pm_domain *genpd, bool use_lock,
{
struct gpd_link *link;
- if (!genpd_status_on(genpd) || genpd_is_always_on(genpd))
+ if (!genpd_status_on(genpd) || genpd_is_always_on(genpd) || genpd_is_suspend_on(genpd))
return;
if (genpd->suspended_count != genpd->device_count
diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h
index dfcfbcecc34b..59661c3dcb19 100644
--- a/include/linux/pm_domain.h
+++ b/include/linux/pm_domain.h
@@ -60,6 +60,10 @@
* GENPD_FLAG_MIN_RESIDENCY: Enable the genpd governor to consider its
* components' next wakeup when determining the
* optimal idle state.
+ *
+ * GENPD_FLAG_SUSPEND_ON: Instructs genpd to keep the PM domain powered
+ * on during suspend and runtime PM controlled
+ * otherwise.
*/
#define GENPD_FLAG_PM_CLK (1U << 0)
#define GENPD_FLAG_IRQ_SAFE (1U << 1)
@@ -68,6 +72,7 @@
#define GENPD_FLAG_CPU_DOMAIN (1U << 4)
#define GENPD_FLAG_RPM_ALWAYS_ON (1U << 5)
#define GENPD_FLAG_MIN_RESIDENCY (1U << 6)
+#define GENPD_FLAG_SUSPEND_ON (1U << 7)
enum gpd_status {
GENPD_STATE_ON = 0, /* PM domain is on */
--
2.17.1