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 */ |
