On Tue, 11 Aug 2020 at 21:03, Sibi Sankar <sibis@xxxxxxxxxxxxxx> wrote: > > 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. As Kevin also requested, please elaborate more on the use case. Why exactly must the PM domain stay powered on during system suspend? Is there a wakeup configured that needs to be managed - or is there a co-processor/FW behaviour that needs to be obeyed to? Kind regards Uffe > > Signed-off-by: Sibi Sankar <sibis@xxxxxxxxxxxxxx> > --- > 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 2cb5e04cf86cd..ba78ac4a450d4 100644 > --- a/drivers/base/power/domain.c > +++ b/drivers/base/power/domain.c > @@ -129,6 +129,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) > @@ -949,7 +950,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 ee11502a575b0..3002a2d68936a 100644 > --- a/include/linux/pm_domain.h > +++ b/include/linux/pm_domain.h > @@ -55,6 +55,10 @@ > * > * GENPD_FLAG_RPM_ALWAYS_ON: Instructs genpd to always keep the PM domain > * powered on except for system suspend. > + * > + * 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) > @@ -62,6 +66,7 @@ > #define GENPD_FLAG_ACTIVE_WAKEUP (1U << 3) > #define GENPD_FLAG_CPU_DOMAIN (1U << 4) > #define GENPD_FLAG_RPM_ALWAYS_ON (1U << 5) > +#define GENPD_FLAG_SUSPEND_ON (1U << 6) > > enum gpd_status { > GPD_STATE_ACTIVE = 0, /* PM domain is active */ > -- > The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, > a Linux Foundation Collaborative Project >