|
@@ -319,7 +319,6 @@ out:
|
|
|
}
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
-EXPORT_SYMBOL_GPL(cpufreq_parse_governor);
|
|
|
|
|
|
|
|
|
/* drivers/base/cpu.c */
|
|
@@ -346,6 +345,8 @@ show_one(scaling_min_freq, min);
|
|
|
show_one(scaling_max_freq, max);
|
|
|
show_one(scaling_cur_freq, cur);
|
|
|
|
|
|
+static int __cpufreq_set_policy(struct cpufreq_policy *data, struct cpufreq_policy *policy);
|
|
|
+
|
|
|
/**
|
|
|
* cpufreq_per_cpu_attr_write() / store_##file_name() - sysfs write access
|
|
|
*/
|
|
@@ -364,7 +365,10 @@ static ssize_t store_##file_name \
|
|
|
if (ret != 1) \
|
|
|
return -EINVAL; \
|
|
|
\
|
|
|
- ret = cpufreq_set_policy(&new_policy); \
|
|
|
+ mutex_lock(&policy->lock); \
|
|
|
+ ret = __cpufreq_set_policy(policy, &new_policy); \
|
|
|
+ policy->user_policy.object = policy->object; \
|
|
|
+ mutex_unlock(&policy->lock); \
|
|
|
\
|
|
|
return ret ? ret : count; \
|
|
|
}
|
|
@@ -420,7 +424,15 @@ static ssize_t store_scaling_governor (struct cpufreq_policy * policy,
|
|
|
if (cpufreq_parse_governor(str_governor, &new_policy.policy, &new_policy.governor))
|
|
|
return -EINVAL;
|
|
|
|
|
|
- ret = cpufreq_set_policy(&new_policy);
|
|
|
+ /* Do not use cpufreq_set_policy here or the user_policy.max
|
|
|
+ will be wrongly overridden */
|
|
|
+ mutex_lock(&policy->lock);
|
|
|
+ ret = __cpufreq_set_policy(policy, &new_policy);
|
|
|
+
|
|
|
+ policy->user_policy.policy = policy->policy;
|
|
|
+ policy->user_policy.governor = policy->governor;
|
|
|
+ mutex_unlock(&policy->lock);
|
|
|
+
|
|
|
return ret ? ret : count;
|
|
|
}
|
|
|
|
|
@@ -685,7 +697,7 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
|
|
|
if (!cpu_online(j))
|
|
|
continue;
|
|
|
|
|
|
- dprintk("CPU already managed, adding link\n");
|
|
|
+ dprintk("CPU %u already managed, adding link\n", j);
|
|
|
cpufreq_cpu_get(cpu);
|
|
|
cpu_sys_dev = get_cpu_sysdev(j);
|
|
|
sysfs_create_link(&cpu_sys_dev->kobj, &policy->kobj,
|
|
@@ -695,9 +707,8 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
|
|
|
policy->governor = NULL; /* to assure that the starting sequence is
|
|
|
* run in cpufreq_set_policy */
|
|
|
mutex_unlock(&policy->lock);
|
|
|
-
|
|
|
+
|
|
|
/* set default policy */
|
|
|
-
|
|
|
ret = cpufreq_set_policy(&new_policy);
|
|
|
if (ret) {
|
|
|
dprintk("setting policy failed\n");
|
|
@@ -707,7 +718,7 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
|
|
|
module_put(cpufreq_driver->owner);
|
|
|
dprintk("initialization complete\n");
|
|
|
cpufreq_debug_enable_ratelimit();
|
|
|
-
|
|
|
+
|
|
|
return 0;
|
|
|
|
|
|
|