This is for power domains which can only be powered off for suspend but not as part of runtime PM.
Unified · Split
| @@ -130,6 +130,7 @@ static const struct genpd_lock_ops genpd_spin_ops = { · 129 unmodified lines | ||
| 130 | 130 | #define genpd_is_always_on(genpd) (genpd->flags & GENPD_FLAG_ALWAYS_ON) |
| 131 | 131 | #define genpd_is_active_wakeup(genpd) (genpd->flags & GENPD_FLAG_ACTIVE_WAKEUP) |
| 132 | 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 | 135 | static inline bool irq_safe_dev_in_no_sleep_domain(struct device *dev, |
| 135 | 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, · 381 unmodified lines | ||
| 517 | 518 | * (1) The domain is configured as always on. |
| 518 | 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 | 524 | return -EBUSY; |
| 522 | 525 | |
| 523 | 526 | list_for_each_entry(pdd, &genpd->dev_list, list_node) { |
| @@ -1814,7 +1817,8 @@ int pm_genpd_init(struct generic_pm_domain *genpd, · 1290 unmodified lines | ||
| 1814 | 1817 | } |
| 1815 | 1818 | |
| 1816 | 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 | 1822 | return -EINVAL; |
| 1819 | 1823 | |
| 1820 | 1824 | if (genpd_is_cpu_domain(genpd) && |
| @@ -53,12 +53,16 @@ · 52 unmodified lines | ||
| 53 | 53 | * driver must then comply with the so called, |
| 54 | 54 | * last-man-standing algorithm, for the CPUs in the |
| 55 | 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 | 60 | #define GENPD_FLAG_PM_CLK (1U << 0) |
| 58 | 61 | #define GENPD_FLAG_IRQ_SAFE (1U << 1) |
| 59 | 62 | #define GENPD_FLAG_ALWAYS_ON (1U << 2) |
| 60 | 63 | #define GENPD_FLAG_ACTIVE_WAKEUP (1U << 3) |
| 61 | 64 | #define GENPD_FLAG_CPU_DOMAIN (1U << 4) |
| 65 | +#define GENPD_FLAG_RPM_ALWAYS_ON (1U << 5) | |
| 62 | 66 | |
| 63 | 67 | enum gpd_status { |
| 64 | 68 | GPD_STATE_ACTIVE = 0, /* PM domain is active */ |