diff options
author | Leonard Crestez <leonard.crestez@nxp.com> | 2019-04-30 11:06:11 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2019-05-13 04:51:31 -0400 |
commit | ed61e18a4b4e445ae8622a4faec6a259601cc4a5 (patch) | |
tree | 434beefd6fa9a4a2326a86affe4216fbddf4383d | |
parent | 8f5e823f9131a430b12f73e9436d7486e20c16f5 (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.c | 8 | ||||
-rw-r--r-- | include/linux/pm_domain.h | 4 |
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 | ||
134 | static inline bool irq_safe_dev_in_no_sleep_domain(struct device *dev, | 135 | static 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 | ||
63 | enum gpd_status { | 67 | enum gpd_status { |
64 | GPD_STATE_ACTIVE = 0, /* PM domain is active */ | 68 | GPD_STATE_ACTIVE = 0, /* PM domain is active */ |