cpufreq: Extract non-interface related stuff from cpufreq_add_dev_interface
cpufreq_add_dev_interface() includes the work of exposing the interface to the device, as well as a lot of unrelated stuff. Move the latter to cpufreq_add_dev(), where it is more appropriate. Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com> Acked-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
e9698cc5d2
commit
e18f1682bc
1 changed files with 26 additions and 17 deletions
|
@ -835,11 +835,8 @@ static int cpufreq_add_dev_interface(unsigned int cpu,
|
|||
struct cpufreq_policy *policy,
|
||||
struct device *dev)
|
||||
{
|
||||
struct cpufreq_policy new_policy;
|
||||
struct freq_attr **drv_attr;
|
||||
unsigned long flags;
|
||||
int ret = 0;
|
||||
unsigned int j;
|
||||
|
||||
/* prepare interface data */
|
||||
ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq,
|
||||
|
@ -871,17 +868,23 @@ static int cpufreq_add_dev_interface(unsigned int cpu,
|
|||
goto err_out_kobj_put;
|
||||
}
|
||||
|
||||
write_lock_irqsave(&cpufreq_driver_lock, flags);
|
||||
for_each_cpu(j, policy->cpus) {
|
||||
per_cpu(cpufreq_cpu_data, j) = policy;
|
||||
per_cpu(cpufreq_policy_cpu, j) = policy->cpu;
|
||||
}
|
||||
write_unlock_irqrestore(&cpufreq_driver_lock, flags);
|
||||
|
||||
ret = cpufreq_add_dev_symlink(cpu, policy);
|
||||
if (ret)
|
||||
goto err_out_kobj_put;
|
||||
|
||||
return ret;
|
||||
|
||||
err_out_kobj_put:
|
||||
kobject_put(&policy->kobj);
|
||||
wait_for_completion(&policy->kobj_unregister);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void cpufreq_init_policy(struct cpufreq_policy *policy)
|
||||
{
|
||||
struct cpufreq_policy new_policy;
|
||||
int ret = 0;
|
||||
|
||||
memcpy(&new_policy, policy, sizeof(struct cpufreq_policy));
|
||||
/* assure that the starting sequence is run in __cpufreq_set_policy */
|
||||
policy->governor = NULL;
|
||||
|
@ -896,12 +899,6 @@ static int cpufreq_add_dev_interface(unsigned int cpu,
|
|||
if (cpufreq_driver->exit)
|
||||
cpufreq_driver->exit(policy);
|
||||
}
|
||||
return ret;
|
||||
|
||||
err_out_kobj_put:
|
||||
kobject_put(&policy->kobj);
|
||||
wait_for_completion(&policy->kobj_unregister);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
|
@ -1075,10 +1072,19 @@ static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif)
|
|||
}
|
||||
#endif
|
||||
|
||||
write_lock_irqsave(&cpufreq_driver_lock, flags);
|
||||
for_each_cpu(j, policy->cpus) {
|
||||
per_cpu(cpufreq_cpu_data, j) = policy;
|
||||
per_cpu(cpufreq_policy_cpu, j) = policy->cpu;
|
||||
}
|
||||
write_unlock_irqrestore(&cpufreq_driver_lock, flags);
|
||||
|
||||
ret = cpufreq_add_dev_interface(cpu, policy, dev);
|
||||
if (ret)
|
||||
goto err_out_unregister;
|
||||
|
||||
cpufreq_init_policy(policy);
|
||||
|
||||
kobject_uevent(&policy->kobj, KOBJ_ADD);
|
||||
module_put(cpufreq_driver->owner);
|
||||
pr_debug("initialization complete\n");
|
||||
|
@ -1087,8 +1093,11 @@ static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif)
|
|||
|
||||
err_out_unregister:
|
||||
write_lock_irqsave(&cpufreq_driver_lock, flags);
|
||||
for_each_cpu(j, policy->cpus)
|
||||
for_each_cpu(j, policy->cpus) {
|
||||
per_cpu(cpufreq_cpu_data, j) = NULL;
|
||||
if (j != cpu)
|
||||
per_cpu(cpufreq_policy_cpu, j) = -1;
|
||||
}
|
||||
write_unlock_irqrestore(&cpufreq_driver_lock, flags);
|
||||
|
||||
kobject_put(&policy->kobj);
|
||||
|
|
Loading…
Reference in a new issue