Commit 96bdda61 authored by Viresh Kumar's avatar Viresh Kumar Committed by Rafael J. Wysocki

cpufreq: create cpu/cpufreq/policyX directories

The cpufreq sysfs interface had been a bit inconsistent as one of the
CPUs for a policy had a real directory within its sysfs 'cpuX' directory
and all other CPUs had links to it. That also made the code a bit
complex as we need to take care of moving the sysfs directory if the CPU
containing the real directory is getting physically hot-unplugged.

Solve this by creating 'policyX' directories (per-policy) in
/sys/devices/system/cpu/cpufreq/ directory, where X is the CPU for which
the policy was first created.

This also removes the need of keeping kobj_cpu and we can remove it now.
Suggested-by: default avatarSaravana Kannan <skannan@codeaurora.org>
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Reviewed-by: default avatarSaravana Kannan <skannan@codeaurora.org>
Acked-by: is more of a general agreement from the person that he is
Reviewed-by: is a more strict tag and implies that the reviewer has
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent c82bd444
...@@ -910,9 +910,6 @@ static int cpufreq_add_dev_symlink(struct cpufreq_policy *policy) ...@@ -910,9 +910,6 @@ static int cpufreq_add_dev_symlink(struct cpufreq_policy *policy)
/* Some related CPUs might not be present (physically hotplugged) */ /* Some related CPUs might not be present (physically hotplugged) */
for_each_cpu(j, policy->real_cpus) { for_each_cpu(j, policy->real_cpus) {
if (j == policy->kobj_cpu)
continue;
ret = add_cpu_dev_symlink(policy, j); ret = add_cpu_dev_symlink(policy, j);
if (ret) if (ret)
break; break;
...@@ -926,12 +923,8 @@ static void cpufreq_remove_dev_symlink(struct cpufreq_policy *policy) ...@@ -926,12 +923,8 @@ static void cpufreq_remove_dev_symlink(struct cpufreq_policy *policy)
unsigned int j; unsigned int j;
/* Some related CPUs might not be present (physically hotplugged) */ /* Some related CPUs might not be present (physically hotplugged) */
for_each_cpu(j, policy->real_cpus) { for_each_cpu(j, policy->real_cpus)
if (j == policy->kobj_cpu)
continue;
remove_cpu_dev_symlink(policy, j); remove_cpu_dev_symlink(policy, j);
}
} }
static int cpufreq_add_dev_interface(struct cpufreq_policy *policy) static int cpufreq_add_dev_interface(struct cpufreq_policy *policy)
...@@ -1047,8 +1040,8 @@ static struct cpufreq_policy *cpufreq_policy_alloc(unsigned int cpu) ...@@ -1047,8 +1040,8 @@ static struct cpufreq_policy *cpufreq_policy_alloc(unsigned int cpu)
if (!zalloc_cpumask_var(&policy->real_cpus, GFP_KERNEL)) if (!zalloc_cpumask_var(&policy->real_cpus, GFP_KERNEL))
goto err_free_rcpumask; goto err_free_rcpumask;
ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq, &dev->kobj, ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq,
"cpufreq"); cpufreq_global_kobject, "policy%u", cpu);
if (ret) { if (ret) {
pr_err("%s: failed to init policy->kobj: %d\n", __func__, ret); pr_err("%s: failed to init policy->kobj: %d\n", __func__, ret);
goto err_free_real_cpus; goto err_free_real_cpus;
...@@ -1062,10 +1055,6 @@ static struct cpufreq_policy *cpufreq_policy_alloc(unsigned int cpu) ...@@ -1062,10 +1055,6 @@ static struct cpufreq_policy *cpufreq_policy_alloc(unsigned int cpu)
INIT_WORK(&policy->update, handle_update); INIT_WORK(&policy->update, handle_update);
policy->cpu = cpu; policy->cpu = cpu;
/* Set this once on allocation */
policy->kobj_cpu = cpu;
return policy; return policy;
err_free_real_cpus: err_free_real_cpus:
...@@ -1417,22 +1406,7 @@ static void cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif) ...@@ -1417,22 +1406,7 @@ static void cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)
return; return;
} }
if (cpu != policy->kobj_cpu) { remove_cpu_dev_symlink(policy, cpu);
remove_cpu_dev_symlink(policy, cpu);
} else {
/*
* The CPU owning the policy object is going away. Move it to
* another suitable CPU.
*/
unsigned int new_cpu = cpumask_first(policy->real_cpus);
struct device *new_dev = get_cpu_device(new_cpu);
dev_dbg(dev, "%s: Moving policy object to CPU%u\n", __func__, new_cpu);
sysfs_remove_link(&new_dev->kobj, "cpufreq");
policy->kobj_cpu = new_cpu;
WARN_ON(kobject_move(&policy->kobj, &new_dev->kobj));
}
} }
static void handle_update(struct work_struct *work) static void handle_update(struct work_struct *work)
......
...@@ -65,7 +65,6 @@ struct cpufreq_policy { ...@@ -65,7 +65,6 @@ struct cpufreq_policy {
unsigned int shared_type; /* ACPI: ANY or ALL affected CPUs unsigned int shared_type; /* ACPI: ANY or ALL affected CPUs
should set cpufreq */ should set cpufreq */
unsigned int cpu; /* cpu managing this policy, must be online */ unsigned int cpu; /* cpu managing this policy, must be online */
unsigned int kobj_cpu; /* cpu managing sysfs files, can be offline */
struct clk *clk; struct clk *clk;
struct cpufreq_cpuinfo cpuinfo;/* see above */ struct cpufreq_cpuinfo cpuinfo;/* see above */
......
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