|
@@ -255,6 +255,7 @@ int cpufreq_governor_dbs(struct cpufreq_policy *policy,
|
|
|
if (have_governor_per_policy()) {
|
|
|
WARN_ON(dbs_data);
|
|
|
} else if (dbs_data) {
|
|
|
+ dbs_data->usage_count++;
|
|
|
policy->governor_data = dbs_data;
|
|
|
return 0;
|
|
|
}
|
|
@@ -266,6 +267,7 @@ int cpufreq_governor_dbs(struct cpufreq_policy *policy,
|
|
|
}
|
|
|
|
|
|
dbs_data->cdata = cdata;
|
|
|
+ dbs_data->usage_count = 1;
|
|
|
rc = cdata->init(dbs_data);
|
|
|
if (rc) {
|
|
|
pr_err("%s: POLICY_INIT: init() failed\n", __func__);
|
|
@@ -294,7 +296,8 @@ int cpufreq_governor_dbs(struct cpufreq_policy *policy,
|
|
|
set_sampling_rate(dbs_data, max(dbs_data->min_sampling_rate,
|
|
|
latency * LATENCY_MULTIPLIER));
|
|
|
|
|
|
- if (dbs_data->cdata->governor == GOV_CONSERVATIVE) {
|
|
|
+ if ((cdata->governor == GOV_CONSERVATIVE) &&
|
|
|
+ (!policy->governor->initialized)) {
|
|
|
struct cs_ops *cs_ops = dbs_data->cdata->gov_ops;
|
|
|
|
|
|
cpufreq_register_notifier(cs_ops->notifier_block,
|
|
@@ -306,12 +309,12 @@ int cpufreq_governor_dbs(struct cpufreq_policy *policy,
|
|
|
|
|
|
return 0;
|
|
|
case CPUFREQ_GOV_POLICY_EXIT:
|
|
|
- if ((policy->governor->initialized == 1) ||
|
|
|
- have_governor_per_policy()) {
|
|
|
+ if (!--dbs_data->usage_count) {
|
|
|
sysfs_remove_group(get_governor_parent_kobj(policy),
|
|
|
get_sysfs_attr(dbs_data));
|
|
|
|
|
|
- if (dbs_data->cdata->governor == GOV_CONSERVATIVE) {
|
|
|
+ if ((dbs_data->cdata->governor == GOV_CONSERVATIVE) &&
|
|
|
+ (policy->governor->initialized == 1)) {
|
|
|
struct cs_ops *cs_ops = dbs_data->cdata->gov_ops;
|
|
|
|
|
|
cpufreq_unregister_notifier(cs_ops->notifier_block,
|