Loading drivers/cpufreq/cpufreq.c +44 −56 Original line number Diff line number Diff line Loading @@ -2017,22 +2017,21 @@ EXPORT_SYMBOL(cpufreq_get_policy); static int cpufreq_set_policy(struct cpufreq_policy *policy, struct cpufreq_policy *new_policy) { int ret = 0, failed = 1; struct cpufreq_governor *old_gov; int ret; pr_debug("setting new policy for CPU %u: %u - %u kHz\n", new_policy->cpu, new_policy->min, new_policy->max); memcpy(&new_policy->cpuinfo, &policy->cpuinfo, sizeof(policy->cpuinfo)); if (new_policy->min > policy->max || new_policy->max < policy->min) { ret = -EINVAL; goto error_out; } if (new_policy->min > policy->max || new_policy->max < policy->min) return -EINVAL; /* verify the cpu speed can be set within this limit */ ret = cpufreq_driver->verify(new_policy); if (ret) goto error_out; return ret; /* adjust if necessary - all reasons */ blocking_notifier_call_chain(&cpufreq_policy_notifier_list, Loading @@ -2048,7 +2047,7 @@ static int cpufreq_set_policy(struct cpufreq_policy *policy, */ ret = cpufreq_driver->verify(new_policy); if (ret) goto error_out; return ret; /* notification of the new policy */ blocking_notifier_call_chain(&cpufreq_policy_notifier_list, Loading @@ -2063,58 +2062,48 @@ static int cpufreq_set_policy(struct cpufreq_policy *policy, if (cpufreq_driver->setpolicy) { policy->policy = new_policy->policy; pr_debug("setting range\n"); ret = cpufreq_driver->setpolicy(new_policy); } else { if (new_policy->governor != policy->governor) { /* save old, working values */ struct cpufreq_governor *old_gov = policy->governor; return cpufreq_driver->setpolicy(new_policy); } if (new_policy->governor == policy->governor) goto out; pr_debug("governor switch\n"); /* save old, working values */ old_gov = policy->governor; /* end old governor */ if (policy->governor) { if (old_gov) { __cpufreq_governor(policy, CPUFREQ_GOV_STOP); up_write(&policy->rwsem); __cpufreq_governor(policy, CPUFREQ_GOV_POLICY_EXIT); __cpufreq_governor(policy,CPUFREQ_GOV_POLICY_EXIT); down_write(&policy->rwsem); } /* start new governor */ policy->governor = new_policy->governor; if (!__cpufreq_governor(policy, CPUFREQ_GOV_POLICY_INIT)) { if (!__cpufreq_governor(policy, CPUFREQ_GOV_START)) { failed = 0; } else { if (!__cpufreq_governor(policy, CPUFREQ_GOV_START)) goto out; up_write(&policy->rwsem); __cpufreq_governor(policy, CPUFREQ_GOV_POLICY_EXIT); __cpufreq_governor(policy, CPUFREQ_GOV_POLICY_EXIT); down_write(&policy->rwsem); } } if (failed) { /* new governor failed, so re-start old one */ pr_debug("starting governor %s failed\n", policy->governor->name); pr_debug("starting governor %s failed\n", policy->governor->name); if (old_gov) { policy->governor = old_gov; __cpufreq_governor(policy, CPUFREQ_GOV_POLICY_INIT); __cpufreq_governor(policy, CPUFREQ_GOV_START); } ret = -EINVAL; goto error_out; } /* might be a policy change, too, so fall through */ } pr_debug("governor: change or update limits\n"); ret = __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS); __cpufreq_governor(policy, CPUFREQ_GOV_POLICY_INIT); __cpufreq_governor(policy, CPUFREQ_GOV_START); } error_out: return ret; return -EINVAL; out: pr_debug("governor: change or update limits\n"); return __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS); } /** Loading Loading @@ -2186,7 +2175,6 @@ static int cpufreq_cpu_callback(struct notifier_block *nfb, switch (action & ~CPU_TASKS_FROZEN) { case CPU_ONLINE: __cpufreq_add_dev(dev, NULL, frozen); cpufreq_update_policy(cpu); break; case CPU_DOWN_PREPARE: Loading Loading
drivers/cpufreq/cpufreq.c +44 −56 Original line number Diff line number Diff line Loading @@ -2017,22 +2017,21 @@ EXPORT_SYMBOL(cpufreq_get_policy); static int cpufreq_set_policy(struct cpufreq_policy *policy, struct cpufreq_policy *new_policy) { int ret = 0, failed = 1; struct cpufreq_governor *old_gov; int ret; pr_debug("setting new policy for CPU %u: %u - %u kHz\n", new_policy->cpu, new_policy->min, new_policy->max); memcpy(&new_policy->cpuinfo, &policy->cpuinfo, sizeof(policy->cpuinfo)); if (new_policy->min > policy->max || new_policy->max < policy->min) { ret = -EINVAL; goto error_out; } if (new_policy->min > policy->max || new_policy->max < policy->min) return -EINVAL; /* verify the cpu speed can be set within this limit */ ret = cpufreq_driver->verify(new_policy); if (ret) goto error_out; return ret; /* adjust if necessary - all reasons */ blocking_notifier_call_chain(&cpufreq_policy_notifier_list, Loading @@ -2048,7 +2047,7 @@ static int cpufreq_set_policy(struct cpufreq_policy *policy, */ ret = cpufreq_driver->verify(new_policy); if (ret) goto error_out; return ret; /* notification of the new policy */ blocking_notifier_call_chain(&cpufreq_policy_notifier_list, Loading @@ -2063,58 +2062,48 @@ static int cpufreq_set_policy(struct cpufreq_policy *policy, if (cpufreq_driver->setpolicy) { policy->policy = new_policy->policy; pr_debug("setting range\n"); ret = cpufreq_driver->setpolicy(new_policy); } else { if (new_policy->governor != policy->governor) { /* save old, working values */ struct cpufreq_governor *old_gov = policy->governor; return cpufreq_driver->setpolicy(new_policy); } if (new_policy->governor == policy->governor) goto out; pr_debug("governor switch\n"); /* save old, working values */ old_gov = policy->governor; /* end old governor */ if (policy->governor) { if (old_gov) { __cpufreq_governor(policy, CPUFREQ_GOV_STOP); up_write(&policy->rwsem); __cpufreq_governor(policy, CPUFREQ_GOV_POLICY_EXIT); __cpufreq_governor(policy,CPUFREQ_GOV_POLICY_EXIT); down_write(&policy->rwsem); } /* start new governor */ policy->governor = new_policy->governor; if (!__cpufreq_governor(policy, CPUFREQ_GOV_POLICY_INIT)) { if (!__cpufreq_governor(policy, CPUFREQ_GOV_START)) { failed = 0; } else { if (!__cpufreq_governor(policy, CPUFREQ_GOV_START)) goto out; up_write(&policy->rwsem); __cpufreq_governor(policy, CPUFREQ_GOV_POLICY_EXIT); __cpufreq_governor(policy, CPUFREQ_GOV_POLICY_EXIT); down_write(&policy->rwsem); } } if (failed) { /* new governor failed, so re-start old one */ pr_debug("starting governor %s failed\n", policy->governor->name); pr_debug("starting governor %s failed\n", policy->governor->name); if (old_gov) { policy->governor = old_gov; __cpufreq_governor(policy, CPUFREQ_GOV_POLICY_INIT); __cpufreq_governor(policy, CPUFREQ_GOV_START); } ret = -EINVAL; goto error_out; } /* might be a policy change, too, so fall through */ } pr_debug("governor: change or update limits\n"); ret = __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS); __cpufreq_governor(policy, CPUFREQ_GOV_POLICY_INIT); __cpufreq_governor(policy, CPUFREQ_GOV_START); } error_out: return ret; return -EINVAL; out: pr_debug("governor: change or update limits\n"); return __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS); } /** Loading Loading @@ -2186,7 +2175,6 @@ static int cpufreq_cpu_callback(struct notifier_block *nfb, switch (action & ~CPU_TASKS_FROZEN) { case CPU_ONLINE: __cpufreq_add_dev(dev, NULL, frozen); cpufreq_update_policy(cpu); break; case CPU_DOWN_PREPARE: Loading