aboutsummaryrefslogtreecommitdiff
path: root/drivers/cpufreq/cpufreq_interactive.c
diff options
context:
space:
mode:
authorSam Leffler <sleffler@chromium.org>2012-06-27 10:12:04 -0700
committerArve Hjønnevåg <arve@android.com>2013-04-29 14:42:58 -0700
commitca44a81b6c7a2a0b6785f1f351f2e9cad048e311 (patch)
tree047bf620ec6ddefc319fb68f76279225f530c832 /drivers/cpufreq/cpufreq_interactive.c
parent1f89e99cce0f2f4fb0e88eefb873a28fbd747f75 (diff)
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
Diffstat (limited to 'drivers/cpufreq/cpufreq_interactive.c')
-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 a4ed750f9d2..20389918e66 100644
--- a/drivers/cpufreq/cpufreq_interactive.c
+++ b/drivers/cpufreq/cpufreq_interactive.c
@@ -364,6 +364,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();
@@ -816,6 +819,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)
{
@@ -869,6 +892,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:
@@ -891,6 +915,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);
@@ -909,26 +934,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;
@@ -970,7 +975,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);