/* internal prototypes */
 static int cpufreq_governor(struct cpufreq_policy *policy, unsigned int event);
 static unsigned int __cpufreq_get(struct cpufreq_policy *policy);
+static int cpufreq_start_governor(struct cpufreq_policy *policy);
 
 /**
  * Two notifier lists: the "policy" list is involved in the
        cpumask_set_cpu(cpu, policy->cpus);
 
        if (has_target()) {
-               ret = cpufreq_governor(policy, CPUFREQ_GOV_START);
-               if (!ret)
-                       ret = cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
-
+               ret = cpufreq_start_governor(policy);
                if (ret)
                        pr_err("%s: Failed to start governor\n", __func__);
        }
        /* Start governor again for active policy */
        if (!policy_is_inactive(policy)) {
                if (has_target()) {
-                       ret = cpufreq_governor(policy, CPUFREQ_GOV_START);
-                       if (!ret)
-                               ret = cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
-
+                       ret = cpufreq_start_governor(policy);
                        if (ret)
                                pr_err("%s: Failed to start governor\n", __func__);
                }
                                policy);
                } else {
                        down_write(&policy->rwsem);
-                       ret = cpufreq_governor(policy, CPUFREQ_GOV_START);
-                       if (!ret)
-                               cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
+                       ret = cpufreq_start_governor(policy);
                        up_write(&policy->rwsem);
 
                        if (ret)
        return ret;
 }
 
+static int cpufreq_start_governor(struct cpufreq_policy *policy)
+{
+       int ret;
+
+       ret = cpufreq_governor(policy, CPUFREQ_GOV_START);
+       return ret ? ret : cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
+}
+
 int cpufreq_register_governor(struct cpufreq_governor *governor)
 {
        int err;
                return cpufreq_driver->setpolicy(new_policy);
        }
 
-       if (new_policy->governor == policy->governor)
-               goto out;
+       if (new_policy->governor == policy->governor) {
+               pr_debug("cpufreq: governor limits update\n");
+               return cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
+       }
 
        pr_debug("governor switch\n");
 
        policy->governor = new_policy->governor;
        ret = cpufreq_governor(policy, CPUFREQ_GOV_POLICY_INIT);
        if (!ret) {
-               ret = cpufreq_governor(policy, CPUFREQ_GOV_START);
-               if (!ret)
-                       goto out;
-
+               ret = cpufreq_start_governor(policy);
+               if (!ret) {
+                       pr_debug("cpufreq: governor change\n");
+                       return 0;
+               }
                cpufreq_governor(policy, CPUFREQ_GOV_POLICY_EXIT);
        }
 
                if (cpufreq_governor(policy, CPUFREQ_GOV_POLICY_INIT))
                        policy->governor = NULL;
                else
-                       cpufreq_governor(policy, CPUFREQ_GOV_START);
+                       cpufreq_start_governor(policy);
        }
 
        return ret;
-
- out:
-       pr_debug("governor: change or update limits\n");
-       return cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
 }
 
 /**