summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlf Hansson <ulf.hansson@linaro.org>2018-03-02 16:38:44 +0100
committerUlf Hansson <ulf.hansson@linaro.org>2018-03-14 15:57:34 +0100
commit2a58577023288876259322a1a2c250aa400cda1e (patch)
tree92e6fccf0a8c6e457d3c9d50f2a4245b2a74cf36
parent2da8ed1fc2c2737e3fa6f78d5b8f6a51fefe65ea (diff)
kernel/cpu_pm: Manage runtime PM in the idle path for CPUs
To allow CPUs being power managed by PM domains, let's deploy support for runtime PM for the CPU's corresponding struct device. More precisely, at the point when the CPU is about to enter an idle state, decrease the runtime PM usage count for its corresponding struct device, via calling pm_runtime_put_sync_suspend(). Then, at the point when the CPU resumes from idle, let's increase the runtime PM usage count, via calling pm_runtime_get_sync(). Cc: Lina Iyer <ilina@codeaurora.org> Co-developed-by: Lina Iyer <lina.iyer@linaro.org> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
-rw-r--r--kernel/cpu_pm.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/kernel/cpu_pm.c b/kernel/cpu_pm.c
index 67b02e138a47..71317ffebb38 100644
--- a/kernel/cpu_pm.c
+++ b/kernel/cpu_pm.c
@@ -16,9 +16,11 @@
*/
#include <linux/kernel.h>
+#include <linux/cpu.h>
#include <linux/cpu_pm.h>
#include <linux/module.h>
#include <linux/notifier.h>
+#include <linux/pm_runtime.h>
#include <linux/spinlock.h>
#include <linux/syscore_ops.h>
@@ -91,6 +93,7 @@ int cpu_pm_enter(void)
{
int nr_calls;
int ret = 0;
+ struct device *dev = get_cpu_device(smp_processor_id());
ret = cpu_pm_notify(CPU_PM_ENTER, -1, &nr_calls);
if (ret)
@@ -100,6 +103,9 @@ int cpu_pm_enter(void)
*/
cpu_pm_notify(CPU_PM_ENTER_FAILED, nr_calls - 1, NULL);
+ if (!ret && dev)
+ pm_runtime_put_sync_suspend(dev);
+
return ret;
}
EXPORT_SYMBOL_GPL(cpu_pm_enter);
@@ -118,6 +124,11 @@ EXPORT_SYMBOL_GPL(cpu_pm_enter);
*/
int cpu_pm_exit(void)
{
+ struct device *dev = get_cpu_device(smp_processor_id());
+
+ if (dev)
+ pm_runtime_get_sync(dev);
+
return cpu_pm_notify(CPU_PM_EXIT, -1, NULL);
}
EXPORT_SYMBOL_GPL(cpu_pm_exit);