Commit 2361be23 authored by Viresh Kumar's avatar Viresh Kumar Committed by Rafael J. Wysocki

cpufreq: Don't create empty /sys/devices/system/cpu/cpufreq directory

When we don't have any file in cpu/cpufreq directory we shouldn't
create it. Specially with the introduction of per-policy governor
instance patchset, even governors are moved to
cpu/cpu*/cpufreq/governor-name directory and so this directory is
just not required.

Lets have it only when required.
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 72a4ce34
...@@ -947,7 +947,7 @@ static void __init acpi_cpufreq_boost_init(void) ...@@ -947,7 +947,7 @@ static void __init acpi_cpufreq_boost_init(void)
/* We create the boost file in any case, though for systems without /* We create the boost file in any case, though for systems without
* hardware support it will be read-only and hardwired to return 0. * hardware support it will be read-only and hardwired to return 0.
*/ */
if (sysfs_create_file(cpufreq_global_kobject, &(global_boost.attr))) if (cpufreq_sysfs_create_file(&(global_boost.attr)))
pr_warn(PFX "could not register global boost sysfs file\n"); pr_warn(PFX "could not register global boost sysfs file\n");
else else
pr_debug("registered global boost sysfs file\n"); pr_debug("registered global boost sysfs file\n");
...@@ -955,7 +955,7 @@ static void __init acpi_cpufreq_boost_init(void) ...@@ -955,7 +955,7 @@ static void __init acpi_cpufreq_boost_init(void)
static void __exit acpi_cpufreq_boost_exit(void) static void __exit acpi_cpufreq_boost_exit(void)
{ {
sysfs_remove_file(cpufreq_global_kobject, &(global_boost.attr)); cpufreq_sysfs_remove_file(&(global_boost.attr));
if (msrs) { if (msrs) {
unregister_cpu_notifier(&boost_nb); unregister_cpu_notifier(&boost_nb);
......
...@@ -678,9 +678,6 @@ static struct attribute *default_attrs[] = { ...@@ -678,9 +678,6 @@ static struct attribute *default_attrs[] = {
NULL NULL
}; };
struct kobject *cpufreq_global_kobject;
EXPORT_SYMBOL(cpufreq_global_kobject);
#define to_policy(k) container_of(k, struct cpufreq_policy, kobj) #define to_policy(k) container_of(k, struct cpufreq_policy, kobj)
#define to_attr(a) container_of(a, struct freq_attr, attr) #define to_attr(a) container_of(a, struct freq_attr, attr)
...@@ -751,6 +748,49 @@ static struct kobj_type ktype_cpufreq = { ...@@ -751,6 +748,49 @@ static struct kobj_type ktype_cpufreq = {
.release = cpufreq_sysfs_release, .release = cpufreq_sysfs_release,
}; };
struct kobject *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 ret = cpufreq_get_global_kobject();
if (!ret) {
ret = sysfs_create_file(cpufreq_global_kobject, attr);
if (ret)
cpufreq_put_global_kobject();
}
return ret;
}
EXPORT_SYMBOL(cpufreq_sysfs_create_file);
void cpufreq_sysfs_remove_file(const struct attribute *attr)
{
sysfs_remove_file(cpufreq_global_kobject, attr);
cpufreq_put_global_kobject();
}
EXPORT_SYMBOL(cpufreq_sysfs_remove_file);
/* symlink affected CPUs */ /* symlink affected CPUs */
static int cpufreq_add_dev_symlink(unsigned int cpu, static int cpufreq_add_dev_symlink(unsigned int cpu,
struct cpufreq_policy *policy) struct cpufreq_policy *policy)
...@@ -2020,7 +2060,7 @@ static int __init cpufreq_core_init(void) ...@@ -2020,7 +2060,7 @@ static int __init cpufreq_core_init(void)
init_rwsem(&per_cpu(cpu_policy_rwsem, cpu)); init_rwsem(&per_cpu(cpu_policy_rwsem, cpu));
} }
cpufreq_global_kobject = kobject_create_and_add("cpufreq", &cpu_subsys.dev_root->kobj); cpufreq_global_kobject = kobject_create();
BUG_ON(!cpufreq_global_kobject); BUG_ON(!cpufreq_global_kobject);
register_syscore_ops(&cpufreq_syscore_ops); register_syscore_ops(&cpufreq_syscore_ops);
......
...@@ -231,6 +231,9 @@ int cpufreq_governor_dbs(struct cpufreq_policy *policy, ...@@ -231,6 +231,9 @@ int cpufreq_governor_dbs(struct cpufreq_policy *policy,
return rc; return rc;
} }
if (!have_governor_per_policy())
WARN_ON(cpufreq_get_global_kobject());
rc = sysfs_create_group(get_governor_parent_kobj(policy), rc = sysfs_create_group(get_governor_parent_kobj(policy),
get_sysfs_attr(dbs_data)); get_sysfs_attr(dbs_data));
if (rc) { if (rc) {
...@@ -269,6 +272,9 @@ int cpufreq_governor_dbs(struct cpufreq_policy *policy, ...@@ -269,6 +272,9 @@ int cpufreq_governor_dbs(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())
cpufreq_put_global_kobject();
if ((dbs_data->cdata->governor == GOV_CONSERVATIVE) && if ((dbs_data->cdata->governor == GOV_CONSERVATIVE) &&
(policy->governor->initialized == 1)) { (policy->governor->initialized == 1)) {
struct cs_ops *cs_ops = dbs_data->cdata->gov_ops; struct cs_ops *cs_ops = dbs_data->cdata->gov_ops;
......
...@@ -71,6 +71,10 @@ struct cpufreq_governor; ...@@ -71,6 +71,10 @@ struct cpufreq_governor;
/* /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);
void cpufreq_sysfs_remove_file(const struct attribute *attr);
#define CPUFREQ_ETERNAL (-1) #define CPUFREQ_ETERNAL (-1)
struct cpufreq_cpuinfo { struct cpufreq_cpuinfo {
......
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