Commit 8eec1020 authored by Viresh Kumar's avatar Viresh Kumar Committed by Rafael J. Wysocki

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: default avatarSaravana Kannan <skannan@codeaurora.org>
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 0998a03a
...@@ -876,43 +876,15 @@ static struct kobj_type ktype_cpufreq = { ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment