summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Leffler <sleffler@chromium.org>2012-06-27 10:12:04 -0700
committerJohn Stultz <john.stultz@linaro.org>2012-10-11 14:40:19 -0400
commitca637854a8db8683b73c879b53a1dc7c304bf3ca (patch)
treec1c1e8c6ddf6f1d8bba06167a61459a796ea8b83
parent5251adaae48049d74ee235529635b1dc332e7727 (diff)
downloadlinux-topics-ca637854a8db8683b73c879b53a1dc7c304bf3ca.tar.gz
cpufreq: interactive: take idle notifications only when active
Register an idle notifier only when the governor is active. Also short-circuit work of idle end if the governor is not enabled. Signed-off-by: Sam Leffler <sleffler@chromium.org> Change-Id: I4cae36dd2e7389540d337d74745ffbaa0131870f
-rw-r--r--drivers/cpufreq/cpufreq_interactive.c46
1 files changed, 25 insertions, 21 deletions
diff --git a/drivers/cpufreq/cpufreq_interactive.c b/drivers/cpufreq/cpufreq_interactive.c
index 989bd00f346..86bff9f0d58 100644
--- a/drivers/cpufreq/cpufreq_interactive.c
+++ b/drivers/cpufreq/cpufreq_interactive.c
@@ -363,6 +363,9 @@ static void cpufreq_interactive_idle_end(void)
struct cpufreq_interactive_cpuinfo *pcpu =
&per_cpu(cpuinfo, smp_processor_id());
+ if (!pcpu->governor_enabled)
+ return;
+
pcpu->idling = 0;
smp_wmb();
@@ -815,6 +818,26 @@ static struct attribute_group interactive_attr_group = {
.name = "interactive",
};
+static int cpufreq_interactive_idle_notifier(struct notifier_block *nb,
+ unsigned long val,
+ void *data)
+{
+ switch (val) {
+ case IDLE_START:
+ cpufreq_interactive_idle_start();
+ break;
+ case IDLE_END:
+ cpufreq_interactive_idle_end();
+ break;
+ }
+
+ return 0;
+}
+
+static struct notifier_block cpufreq_interactive_idle_nb = {
+ .notifier_call = cpufreq_interactive_idle_notifier,
+};
+
static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
unsigned int event)
{
@@ -868,6 +891,7 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
pr_warn("%s: failed to register input handler\n",
__func__);
+ idle_notifier_register(&cpufreq_interactive_idle_nb);
break;
case CPUFREQ_GOV_STOP:
@@ -890,6 +914,7 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
if (atomic_dec_return(&active_count) > 0)
return 0;
+ idle_notifier_unregister(&cpufreq_interactive_idle_nb);
input_unregister_handler(&cpufreq_interactive_input_handler);
sysfs_remove_group(cpufreq_global_kobject,
&interactive_attr_group);
@@ -908,26 +933,6 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
return 0;
}
-static int cpufreq_interactive_idle_notifier(struct notifier_block *nb,
- unsigned long val,
- void *data)
-{
- switch (val) {
- case IDLE_START:
- cpufreq_interactive_idle_start();
- break;
- case IDLE_END:
- cpufreq_interactive_idle_end();
- break;
- }
-
- return 0;
-}
-
-static struct notifier_block cpufreq_interactive_idle_nb = {
- .notifier_call = cpufreq_interactive_idle_notifier,
-};
-
static int __init cpufreq_interactive_init(void)
{
unsigned int i;
@@ -969,7 +974,6 @@ static int __init cpufreq_interactive_init(void)
spin_lock_init(&down_cpumask_lock);
mutex_init(&set_speed_lock);
- idle_notifier_register(&cpufreq_interactive_idle_nb);
INIT_WORK(&inputopen.inputopen_work, cpufreq_interactive_input_open);
return cpufreq_register_governor(&cpufreq_gov_interactive);