| From 60fe6d8f2058c122a37b053523a76fc791ea3cef Mon Sep 17 00:00:00 2001 |
| From: "Rafael J. Wysocki" <rjw@sisk.pl> |
| Date: Fri, 1 Jul 2011 22:13:37 +0200 |
| Subject: PM: Allow the clocks management code to be used during system |
| suspend |
| |
| The common clocks management code in drivers/base/power/clock_ops.c |
| is going to be used during system-wide power transitions as well as |
| for runtime PM, so it shouldn't depend on CONFIG_PM_RUNTIME. |
| However, the suspend/resume functions provided by it for |
| CONFIG_PM_RUNTIME unset, to be used during system-wide power |
| transitions, should not behave in the same way as their counterparts |
| defined for CONFIG_PM_RUNTIME set, because in that case the clocks |
| are managed differently at run time. |
| |
| The names of the functions still contain the word "runtime" after |
| this change, but that is going to be modified by a separate patch |
| later. |
| |
| Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> |
| Reviewed-by: Kevin Hilman <khilman@ti.com> |
| (cherry picked from commit b7b95920aa2e89e655afe9913ee0e55855ceda90) |
| |
| Signed-off-by: Simon Horman <horms@verge.net.au> |
| --- |
| drivers/base/power/clock_ops.c | 60 +++++++++++++++++++++++++++++++++++++++- |
| include/linux/pm_runtime.h | 2 +- |
| kernel/power/Kconfig | 4 +-- |
| 3 files changed, 62 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/base/power/clock_ops.c b/drivers/base/power/clock_ops.c |
| index c562481..2fb9c12 100644 |
| --- a/drivers/base/power/clock_ops.c |
| +++ b/drivers/base/power/clock_ops.c |
| @@ -15,7 +15,7 @@ |
| #include <linux/slab.h> |
| #include <linux/err.h> |
| |
| -#ifdef CONFIG_PM_RUNTIME |
| +#ifdef CONFIG_PM |
| |
| struct pm_runtime_clk_data { |
| struct list_head clock_list; |
| @@ -191,6 +191,10 @@ void pm_runtime_clk_destroy(struct device *dev) |
| kfree(prd); |
| } |
| |
| +#endif /* CONFIG_PM */ |
| + |
| +#ifdef CONFIG_PM_RUNTIME |
| + |
| /** |
| * pm_runtime_clk_acquire - Acquire a device clock. |
| * @dev: Device whose clock is to be acquired. |
| @@ -330,6 +334,60 @@ static int pm_runtime_clk_notify(struct notifier_block *nb, |
| |
| #else /* !CONFIG_PM_RUNTIME */ |
| |
| +#ifdef CONFIG_PM |
| + |
| +/** |
| + * pm_runtime_clk_suspend - Disable clocks in a device's PM clock list. |
| + * @dev: Device to disable the clocks for. |
| + */ |
| +int pm_runtime_clk_suspend(struct device *dev) |
| +{ |
| + struct pm_runtime_clk_data *prd = __to_prd(dev); |
| + struct pm_clock_entry *ce; |
| + |
| + dev_dbg(dev, "%s()\n", __func__); |
| + |
| + /* If there is no driver, the clocks are already disabled. */ |
| + if (!prd || !dev->driver) |
| + return 0; |
| + |
| + mutex_lock(&prd->lock); |
| + |
| + list_for_each_entry_reverse(ce, &prd->clock_list, node) |
| + clk_disable(ce->clk); |
| + |
| + mutex_unlock(&prd->lock); |
| + |
| + return 0; |
| +} |
| + |
| +/** |
| + * pm_runtime_clk_resume - Enable clocks in a device's PM clock list. |
| + * @dev: Device to enable the clocks for. |
| + */ |
| +int pm_runtime_clk_resume(struct device *dev) |
| +{ |
| + struct pm_runtime_clk_data *prd = __to_prd(dev); |
| + struct pm_clock_entry *ce; |
| + |
| + dev_dbg(dev, "%s()\n", __func__); |
| + |
| + /* If there is no driver, the clocks should remain disabled. */ |
| + if (!prd || !dev->driver) |
| + return 0; |
| + |
| + mutex_lock(&prd->lock); |
| + |
| + list_for_each_entry(ce, &prd->clock_list, node) |
| + clk_enable(ce->clk); |
| + |
| + mutex_unlock(&prd->lock); |
| + |
| + return 0; |
| +} |
| + |
| +#endif /* CONFIG_PM */ |
| + |
| /** |
| * enable_clock - Enable a device clock. |
| * @dev: Device whose clock is to be enabled. |
| diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h |
| index ef91904..1bd5063 100644 |
| --- a/include/linux/pm_runtime.h |
| +++ b/include/linux/pm_runtime.h |
| @@ -251,7 +251,7 @@ struct pm_clk_notifier_block { |
| char *con_ids[]; |
| }; |
| |
| -#ifdef CONFIG_PM_RUNTIME_CLK |
| +#ifdef CONFIG_PM_CLK |
| extern int pm_runtime_clk_init(struct device *dev); |
| extern void pm_runtime_clk_destroy(struct device *dev); |
| extern int pm_runtime_clk_add(struct device *dev, const char *con_id); |
| diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig |
| index e83ac25..7b856b3 100644 |
| --- a/kernel/power/Kconfig |
| +++ b/kernel/power/Kconfig |
| @@ -224,9 +224,9 @@ config PM_OPP |
| implementations a ready to use framework to manage OPPs. |
| For more information, read <file:Documentation/power/opp.txt> |
| |
| -config PM_RUNTIME_CLK |
| +config PM_CLK |
| def_bool y |
| - depends on PM_RUNTIME && HAVE_CLK |
| + depends on PM && HAVE_CLK |
| |
| config PM_GENERIC_DOMAINS |
| bool |
| -- |
| 1.7.10.1.362.g242cab3 |
| |