cpufreq: create cpu/cpufreq at boot time
Later patches will need to create policy specific directories in /sys/devices/system/cpu/cpufreq/ directory and so the cpufreq directory wouldn't be ever empty. And so no fun creating/destroying it on need basis anymore. Create it once on system boot. Reviewed-by: Saravana Kannan <skannan@codeaurora.org> Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
0998a03a3a
commit
8eec1020f0
@ -876,43 +876,15 @@ static struct kobj_type ktype_cpufreq = {
|
|||||||
struct kobject *cpufreq_global_kobject;
|
struct kobject *cpufreq_global_kobject;
|
||||||
EXPORT_SYMBOL(cpufreq_global_kobject);
|
EXPORT_SYMBOL(cpufreq_global_kobject);
|
||||||
|
|
||||||
static int cpufreq_global_kobject_usage;
|
|
||||||
|
|
||||||
int cpufreq_get_global_kobject(void)
|
|
||||||
{
|
|
||||||
if (!cpufreq_global_kobject_usage++)
|
|
||||||
return kobject_add(cpufreq_global_kobject,
|
|
||||||
&cpu_subsys.dev_root->kobj, "%s", "cpufreq");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(cpufreq_get_global_kobject);
|
|
||||||
|
|
||||||
void cpufreq_put_global_kobject(void)
|
|
||||||
{
|
|
||||||
if (!--cpufreq_global_kobject_usage)
|
|
||||||
kobject_del(cpufreq_global_kobject);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(cpufreq_put_global_kobject);
|
|
||||||
|
|
||||||
int cpufreq_sysfs_create_file(const struct attribute *attr)
|
int cpufreq_sysfs_create_file(const struct attribute *attr)
|
||||||
{
|
{
|
||||||
int ret = cpufreq_get_global_kobject();
|
return sysfs_create_file(cpufreq_global_kobject, attr);
|
||||||
|
|
||||||
if (!ret) {
|
|
||||||
ret = sysfs_create_file(cpufreq_global_kobject, attr);
|
|
||||||
if (ret)
|
|
||||||
cpufreq_put_global_kobject();
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(cpufreq_sysfs_create_file);
|
EXPORT_SYMBOL(cpufreq_sysfs_create_file);
|
||||||
|
|
||||||
void cpufreq_sysfs_remove_file(const struct attribute *attr)
|
void cpufreq_sysfs_remove_file(const struct attribute *attr)
|
||||||
{
|
{
|
||||||
sysfs_remove_file(cpufreq_global_kobject, attr);
|
sysfs_remove_file(cpufreq_global_kobject, attr);
|
||||||
cpufreq_put_global_kobject();
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(cpufreq_sysfs_remove_file);
|
EXPORT_SYMBOL(cpufreq_sysfs_remove_file);
|
||||||
|
|
||||||
@ -2582,7 +2554,7 @@ static int __init cpufreq_core_init(void)
|
|||||||
if (cpufreq_disabled())
|
if (cpufreq_disabled())
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
cpufreq_global_kobject = kobject_create();
|
cpufreq_global_kobject = kobject_create_and_add("cpufreq", &cpu_subsys.dev_root->kobj);
|
||||||
BUG_ON(!cpufreq_global_kobject);
|
BUG_ON(!cpufreq_global_kobject);
|
||||||
|
|
||||||
register_syscore_ops(&cpufreq_syscore_ops);
|
register_syscore_ops(&cpufreq_syscore_ops);
|
||||||
|
@ -348,29 +348,21 @@ static int cpufreq_governor_init(struct cpufreq_policy *policy,
|
|||||||
set_sampling_rate(dbs_data, max(dbs_data->min_sampling_rate,
|
set_sampling_rate(dbs_data, max(dbs_data->min_sampling_rate,
|
||||||
latency * LATENCY_MULTIPLIER));
|
latency * LATENCY_MULTIPLIER));
|
||||||
|
|
||||||
if (!have_governor_per_policy()) {
|
if (!have_governor_per_policy())
|
||||||
if (WARN_ON(cpufreq_get_global_kobject())) {
|
|
||||||
ret = -EINVAL;
|
|
||||||
goto cdata_exit;
|
|
||||||
}
|
|
||||||
cdata->gdbs_data = dbs_data;
|
cdata->gdbs_data = dbs_data;
|
||||||
}
|
|
||||||
|
|
||||||
ret = sysfs_create_group(get_governor_parent_kobj(policy),
|
ret = sysfs_create_group(get_governor_parent_kobj(policy),
|
||||||
get_sysfs_attr(dbs_data));
|
get_sysfs_attr(dbs_data));
|
||||||
if (ret)
|
if (ret)
|
||||||
goto put_kobj;
|
goto reset_gdbs_data;
|
||||||
|
|
||||||
policy->governor_data = dbs_data;
|
policy->governor_data = dbs_data;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
put_kobj:
|
reset_gdbs_data:
|
||||||
if (!have_governor_per_policy()) {
|
if (!have_governor_per_policy())
|
||||||
cdata->gdbs_data = NULL;
|
cdata->gdbs_data = NULL;
|
||||||
cpufreq_put_global_kobject();
|
|
||||||
}
|
|
||||||
cdata_exit:
|
|
||||||
cdata->exit(dbs_data, !policy->governor->initialized);
|
cdata->exit(dbs_data, !policy->governor->initialized);
|
||||||
free_common_dbs_info:
|
free_common_dbs_info:
|
||||||
free_common_dbs_info(policy, cdata);
|
free_common_dbs_info(policy, cdata);
|
||||||
@ -394,10 +386,8 @@ static int cpufreq_governor_exit(struct cpufreq_policy *policy,
|
|||||||
sysfs_remove_group(get_governor_parent_kobj(policy),
|
sysfs_remove_group(get_governor_parent_kobj(policy),
|
||||||
get_sysfs_attr(dbs_data));
|
get_sysfs_attr(dbs_data));
|
||||||
|
|
||||||
if (!have_governor_per_policy()) {
|
if (!have_governor_per_policy())
|
||||||
cdata->gdbs_data = NULL;
|
cdata->gdbs_data = NULL;
|
||||||
cpufreq_put_global_kobject();
|
|
||||||
}
|
|
||||||
|
|
||||||
cdata->exit(dbs_data, policy->governor->initialized == 1);
|
cdata->exit(dbs_data, policy->governor->initialized == 1);
|
||||||
kfree(dbs_data);
|
kfree(dbs_data);
|
||||||
|
@ -149,8 +149,6 @@ static inline bool policy_is_shared(struct cpufreq_policy *policy)
|
|||||||
|
|
||||||
/* /sys/devices/system/cpu/cpufreq: entry point for global variables */
|
/* /sys/devices/system/cpu/cpufreq: entry point for global variables */
|
||||||
extern struct kobject *cpufreq_global_kobject;
|
extern struct kobject *cpufreq_global_kobject;
|
||||||
int cpufreq_get_global_kobject(void);
|
|
||||||
void cpufreq_put_global_kobject(void);
|
|
||||||
int cpufreq_sysfs_create_file(const struct attribute *attr);
|
int cpufreq_sysfs_create_file(const struct attribute *attr);
|
||||||
void cpufreq_sysfs_remove_file(const struct attribute *attr);
|
void cpufreq_sysfs_remove_file(const struct attribute *attr);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user