| From 66bc21cc6151a59df5b3b60592f34750ab4322b0 Mon Sep 17 00:00:00 2001 |
| From: Geert Uytterhoeven <geert+renesas@glider.be> |
| Date: Tue, 7 Nov 2017 13:48:11 +0100 |
| Subject: [PATCH 0297/1795] PM / Domains: Allow genpd users to specify default |
| active wakeup behavior |
| |
| It is quite common for PM Domains to require slave devices to be kept |
| active during system suspend if they are to be used as wakeup sources. |
| To enable this, currently each PM Domain or driver has to provide its |
| own gpd_dev_ops.active_wakeup() callback. |
| |
| Introduce a new flag GENPD_FLAG_ACTIVE_WAKEUP to consolidate this. |
| If specified, all slave devices configured as wakeup sources will be |
| kept active during system suspend. |
| |
| PM Domains that need more fine-grained controls, based on the slave |
| device, can still provide their own callbacks, as before. |
| |
| Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> |
| Acked-by: Ulf Hansson <ulf.hansson@linaro.org> |
| Reviewed-by: Kevin Hilman <khilman@baylibre.com> |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| (cherry picked from commit 95a20ef6f7e54c6a982715a7d0da2fd81790db28) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> |
| --- |
| drivers/base/power/domain.c | 3 +++ |
| include/linux/pm_domain.h | 7 ++++--- |
| 2 files changed, 7 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c |
| index c276ba1c0a19..5d63c34e0420 100644 |
| --- a/drivers/base/power/domain.c |
| +++ b/drivers/base/power/domain.c |
| @@ -124,6 +124,7 @@ static const struct genpd_lock_ops genpd_spin_ops = { |
| #define genpd_status_on(genpd) (genpd->status == GPD_STATE_ACTIVE) |
| #define genpd_is_irq_safe(genpd) (genpd->flags & GENPD_FLAG_IRQ_SAFE) |
| #define genpd_is_always_on(genpd) (genpd->flags & GENPD_FLAG_ALWAYS_ON) |
| +#define genpd_is_active_wakeup(genpd) (genpd->flags & GENPD_FLAG_ACTIVE_WAKEUP) |
| |
| static inline bool irq_safe_dev_in_no_sleep_domain(struct device *dev, |
| const struct generic_pm_domain *genpd) |
| @@ -774,6 +775,8 @@ static bool pm_genpd_present(const struct generic_pm_domain *genpd) |
| static bool genpd_dev_active_wakeup(const struct generic_pm_domain *genpd, |
| struct device *dev) |
| { |
| + if (genpd_is_active_wakeup(genpd)) |
| + return true; |
| return GENPD_DEV_CALLBACK(genpd, bool, active_wakeup, dev); |
| } |
| |
| diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h |
| index 84f423d5633e..a6688efb29ee 100644 |
| --- a/include/linux/pm_domain.h |
| +++ b/include/linux/pm_domain.h |
| @@ -18,9 +18,10 @@ |
| #include <linux/spinlock.h> |
| |
| /* Defines used for the flags field in the struct generic_pm_domain */ |
| -#define GENPD_FLAG_PM_CLK (1U << 0) /* PM domain uses PM clk */ |
| -#define GENPD_FLAG_IRQ_SAFE (1U << 1) /* PM domain operates in atomic */ |
| -#define GENPD_FLAG_ALWAYS_ON (1U << 2) /* PM domain is always powered on */ |
| +#define GENPD_FLAG_PM_CLK (1U << 0) /* PM domain uses PM clk */ |
| +#define GENPD_FLAG_IRQ_SAFE (1U << 1) /* PM domain operates in atomic */ |
| +#define GENPD_FLAG_ALWAYS_ON (1U << 2) /* PM domain is always powered on */ |
| +#define GENPD_FLAG_ACTIVE_WAKEUP (1U << 3) /* Keep devices active if wakeup */ |
| |
| enum gpd_status { |
| GPD_STATE_ACTIVE = 0, /* PM domain is active */ |
| -- |
| 2.19.0 |
| |