|
@@ -1709,8 +1709,9 @@ static int __cpufreq_governor(struct cpufreq_policy *policy,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (!try_module_get(policy->governor->owner))
|
|
|
- return -EINVAL;
|
|
|
+ if (event == CPUFREQ_GOV_POLICY_INIT)
|
|
|
+ if (!try_module_get(policy->governor->owner))
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
pr_debug("__cpufreq_governor for CPU %u, event %u\n",
|
|
|
policy->cpu, event);
|
|
@@ -1719,6 +1720,8 @@ static int __cpufreq_governor(struct cpufreq_policy *policy,
|
|
|
if ((!policy->governor_enabled && (event == CPUFREQ_GOV_STOP)) ||
|
|
|
(policy->governor_enabled && (event == CPUFREQ_GOV_START))) {
|
|
|
mutex_unlock(&cpufreq_governor_lock);
|
|
|
+ if (event == CPUFREQ_GOV_POLICY_INIT)
|
|
|
+ module_put(policy->governor->owner);
|
|
|
return -EBUSY;
|
|
|
}
|
|
|
|
|
@@ -1746,11 +1749,8 @@ static int __cpufreq_governor(struct cpufreq_policy *policy,
|
|
|
mutex_unlock(&cpufreq_governor_lock);
|
|
|
}
|
|
|
|
|
|
- /* we keep one module reference alive for
|
|
|
- each CPU governed by this CPU */
|
|
|
- if ((event != CPUFREQ_GOV_START) || ret)
|
|
|
- module_put(policy->governor->owner);
|
|
|
- if ((event == CPUFREQ_GOV_STOP) && !ret)
|
|
|
+ if (((event == CPUFREQ_GOV_POLICY_INIT) && ret) ||
|
|
|
+ ((event == CPUFREQ_GOV_POLICY_EXIT) && !ret))
|
|
|
module_put(policy->governor->owner);
|
|
|
|
|
|
return ret;
|