cpufreq: interactive: take idle notifications only when active
[firefly-linux-kernel-4.4.55.git] / drivers / cpufreq / cpufreq_interactive.c
index a4ed750f9d27f77f66b3030d3cced8145282596b..20389918e66cacbf9f327803efd1f4e8977f7acf 100644 (file)
@@ -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);