aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLeonard Crestez <leonard.crestez@nxp.com>2019-04-30 11:06:11 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2019-05-13 04:51:31 -0400
commited61e18a4b4e445ae8622a4faec6a259601cc4a5 (patch)
tree434beefd6fa9a4a2326a86affe4216fbddf4383d
parent8f5e823f9131a430b12f73e9436d7486e20c16f5 (diff)
PM / Domains: Add GENPD_FLAG_RPM_ALWAYS_ON flag
This is for power domains which can only be powered off for suspend but not as part of runtime PM. Suggested-by: Ulf Hansson <ulf.hansson@linaro.org> Signed-off-by: Leonard Crestez <leonard.crestez@nxp.com> Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r--drivers/base/power/domain.c8
-rw-r--r--include/linux/pm_domain.h4
2 files changed, 10 insertions, 2 deletions
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
index 3d899e8abd58..a887575fafa9 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 = {
130#define genpd_is_always_on(genpd) (genpd->flags & GENPD_FLAG_ALWAYS_ON) 130#define genpd_is_always_on(genpd) (genpd->flags & GENPD_FLAG_ALWAYS_ON)
131#define genpd_is_active_wakeup(genpd) (genpd->flags & GENPD_FLAG_ACTIVE_WAKEUP) 131#define genpd_is_active_wakeup(genpd) (genpd->flags & GENPD_FLAG_ACTIVE_WAKEUP)
132#define genpd_is_cpu_domain(genpd) (genpd->flags & GENPD_FLAG_CPU_DOMAIN) 132#define genpd_is_cpu_domain(genpd) (genpd->flags & GENPD_FLAG_CPU_DOMAIN)
133#define genpd_is_rpm_always_on(genpd) (genpd->flags & GENPD_FLAG_RPM_ALWAYS_ON)
133 134
134static inline bool irq_safe_dev_in_no_sleep_domain(struct device *dev, 135static inline bool irq_safe_dev_in_no_sleep_domain(struct device *dev,
135 const struct generic_pm_domain *genpd) 136 const struct generic_pm_domain *genpd)
@@ -517,7 +518,9 @@ static int genpd_power_off(struct generic_pm_domain *genpd, bool one_dev_on,
517 * (1) The domain is configured as always on. 518 * (1) The domain is configured as always on.
518 * (2) When the domain has a subdomain being powered on. 519 * (2) When the domain has a subdomain being powered on.
519 */ 520 */
520 if (genpd_is_always_on(genpd) || atomic_read(&genpd->sd_count) > 0) 521 if (genpd_is_always_on(genpd) ||
522 genpd_is_rpm_always_on(genpd) ||
523 atomic_read(&genpd->sd_count) > 0)
521 return -EBUSY; 524 return -EBUSY;
522 525
523 list_for_each_entry(pdd, &genpd->dev_list, list_node) { 526 list_for_each_entry(pdd, &genpd->dev_list, list_node) {
@@ -1814,7 +1817,8 @@ int pm_genpd_init(struct generic_pm_domain *genpd,
1814 } 1817 }
1815 1818
1816 /* Always-on domains must be powered on at initialization. */ 1819 /* Always-on domains must be powered on at initialization. */
1817 if (genpd_is_always_on(genpd) && !genpd_status_on(genpd)) 1820 if ((genpd_is_always_on(genpd) || genpd_is_rpm_always_on(genpd)) &&
1821 !genpd_status_on(genpd))
1818 return -EINVAL; 1822 return -EINVAL;
1819 1823
1820 if (genpd_is_cpu_domain(genpd) && 1824 if (genpd_is_cpu_domain(genpd) &&
diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h
index 0e8e356bed6a..b21f35f0ee2e 100644
--- a/include/linux/pm_domain.h
+++ b/include/linux/pm_domain.h
@@ -53,12 +53,16 @@
53 * driver must then comply with the so called, 53 * driver must then comply with the so called,
54 * last-man-standing algorithm, for the CPUs in the 54 * last-man-standing algorithm, for the CPUs in the
55 * PM domain. 55 * PM domain.
56 *
57 * GENPD_FLAG_RPM_ALWAYS_ON: Instructs genpd to always keep the PM domain
58 * powered on except for system suspend.
56 */ 59 */
57#define GENPD_FLAG_PM_CLK (1U << 0) 60#define GENPD_FLAG_PM_CLK (1U << 0)
58#define GENPD_FLAG_IRQ_SAFE (1U << 1) 61#define GENPD_FLAG_IRQ_SAFE (1U << 1)
59#define GENPD_FLAG_ALWAYS_ON (1U << 2) 62#define GENPD_FLAG_ALWAYS_ON (1U << 2)
60#define GENPD_FLAG_ACTIVE_WAKEUP (1U << 3) 63#define GENPD_FLAG_ACTIVE_WAKEUP (1U << 3)
61#define GENPD_FLAG_CPU_DOMAIN (1U << 4) 64#define GENPD_FLAG_CPU_DOMAIN (1U << 4)
65#define GENPD_FLAG_RPM_ALWAYS_ON (1U << 5)
62 66
63enum gpd_status { 67enum gpd_status {
64 GPD_STATE_ACTIVE = 0, /* PM domain is active */ 68 GPD_STATE_ACTIVE = 0, /* PM domain is active */