|
@@ -1070,6 +1070,8 @@ static int __cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif
|
|
|
|
|
|
/* If cpu is last user of policy, free policy */
|
|
|
if (cpus == 1) {
|
|
|
+ __cpufreq_governor(data, CPUFREQ_GOV_POLICY_EXIT);
|
|
|
+
|
|
|
lock_policy_rwsem_read(cpu);
|
|
|
kobj = &data->kobj;
|
|
|
cmp = &data->kobj_unregister;
|
|
@@ -1651,7 +1653,7 @@ EXPORT_SYMBOL(cpufreq_get_policy);
|
|
|
static int __cpufreq_set_policy(struct cpufreq_policy *data,
|
|
|
struct cpufreq_policy *policy)
|
|
|
{
|
|
|
- int ret = 0;
|
|
|
+ int ret = 0, failed = 1;
|
|
|
|
|
|
pr_debug("setting new policy for CPU %u: %u - %u kHz\n", policy->cpu,
|
|
|
policy->min, policy->max);
|
|
@@ -1705,17 +1707,30 @@ static int __cpufreq_set_policy(struct cpufreq_policy *data,
|
|
|
pr_debug("governor switch\n");
|
|
|
|
|
|
/* end old governor */
|
|
|
- if (data->governor)
|
|
|
+ if (data->governor) {
|
|
|
__cpufreq_governor(data, CPUFREQ_GOV_STOP);
|
|
|
+ __cpufreq_governor(data,
|
|
|
+ CPUFREQ_GOV_POLICY_EXIT);
|
|
|
+ }
|
|
|
|
|
|
/* start new governor */
|
|
|
data->governor = policy->governor;
|
|
|
- if (__cpufreq_governor(data, CPUFREQ_GOV_START)) {
|
|
|
+ if (!__cpufreq_governor(data, CPUFREQ_GOV_POLICY_INIT)) {
|
|
|
+ if (!__cpufreq_governor(data, CPUFREQ_GOV_START))
|
|
|
+ failed = 0;
|
|
|
+ else
|
|
|
+ __cpufreq_governor(data,
|
|
|
+ CPUFREQ_GOV_POLICY_EXIT);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (failed) {
|
|
|
/* new governor failed, so re-start old one */
|
|
|
pr_debug("starting governor %s failed\n",
|
|
|
data->governor->name);
|
|
|
if (old_gov) {
|
|
|
data->governor = old_gov;
|
|
|
+ __cpufreq_governor(data,
|
|
|
+ CPUFREQ_GOV_POLICY_INIT);
|
|
|
__cpufreq_governor(data,
|
|
|
CPUFREQ_GOV_START);
|
|
|
}
|