Commit d182dc6d authored by Hector Martin's avatar Hector Martin Committed by Viresh Kumar

cpufreq: Generalize of_perf_domain_get_sharing_cpumask phandle format

of_perf_domain_get_sharing_cpumask currently assumes a 1-argument
phandle format, and directly returns the argument. Generalize this to
return the full of_phandle_args, so it can be used by drivers which use
other phandle styles (e.g. separate nodes). This also requires changing
the CPU sharing match to compare the full args structure.

Also, make sure to of_node_put(args.np) (the original code was leaking a
reference).
Signed-off-by: default avatarHector Martin <marcan@marcan.st>
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
parent 30a0b95b
...@@ -160,6 +160,7 @@ static int mtk_cpu_resources_init(struct platform_device *pdev, ...@@ -160,6 +160,7 @@ static int mtk_cpu_resources_init(struct platform_device *pdev,
struct mtk_cpufreq_data *data; struct mtk_cpufreq_data *data;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct resource *res; struct resource *res;
struct of_phandle_args args;
void __iomem *base; void __iomem *base;
int ret, i; int ret, i;
int index; int index;
...@@ -168,11 +169,14 @@ static int mtk_cpu_resources_init(struct platform_device *pdev, ...@@ -168,11 +169,14 @@ static int mtk_cpu_resources_init(struct platform_device *pdev,
if (!data) if (!data)
return -ENOMEM; return -ENOMEM;
index = of_perf_domain_get_sharing_cpumask(policy->cpu, "performance-domains", ret = of_perf_domain_get_sharing_cpumask(policy->cpu, "performance-domains",
"#performance-domain-cells", "#performance-domain-cells",
policy->cpus); policy->cpus, &args);
if (index < 0) if (ret < 0)
return index; return ret;
index = args.args[0];
of_node_put(args.np);
res = platform_get_resource(pdev, IORESOURCE_MEM, index); res = platform_get_resource(pdev, IORESOURCE_MEM, index);
if (!res) { if (!res) {
......
...@@ -1110,10 +1110,10 @@ cpufreq_table_set_inefficient(struct cpufreq_policy *policy, ...@@ -1110,10 +1110,10 @@ cpufreq_table_set_inefficient(struct cpufreq_policy *policy,
} }
static inline int parse_perf_domain(int cpu, const char *list_name, static inline int parse_perf_domain(int cpu, const char *list_name,
const char *cell_name) const char *cell_name,
struct of_phandle_args *args)
{ {
struct device_node *cpu_np; struct device_node *cpu_np;
struct of_phandle_args args;
int ret; int ret;
cpu_np = of_cpu_device_node_get(cpu); cpu_np = of_cpu_device_node_get(cpu);
...@@ -1121,41 +1121,44 @@ static inline int parse_perf_domain(int cpu, const char *list_name, ...@@ -1121,41 +1121,44 @@ static inline int parse_perf_domain(int cpu, const char *list_name,
return -ENODEV; return -ENODEV;
ret = of_parse_phandle_with_args(cpu_np, list_name, cell_name, 0, ret = of_parse_phandle_with_args(cpu_np, list_name, cell_name, 0,
&args); args);
if (ret < 0) if (ret < 0)
return ret; return ret;
of_node_put(cpu_np); of_node_put(cpu_np);
return args.args[0]; return 0;
} }
static inline int of_perf_domain_get_sharing_cpumask(int pcpu, const char *list_name, static inline int of_perf_domain_get_sharing_cpumask(int pcpu, const char *list_name,
const char *cell_name, struct cpumask *cpumask) const char *cell_name, struct cpumask *cpumask,
struct of_phandle_args *pargs)
{ {
int target_idx;
int cpu, ret; int cpu, ret;
struct of_phandle_args args;
ret = parse_perf_domain(pcpu, list_name, cell_name); ret = parse_perf_domain(pcpu, list_name, cell_name, pargs);
if (ret < 0) if (ret < 0)
return ret; return ret;
target_idx = ret;
cpumask_set_cpu(pcpu, cpumask); cpumask_set_cpu(pcpu, cpumask);
for_each_possible_cpu(cpu) { for_each_possible_cpu(cpu) {
if (cpu == pcpu) if (cpu == pcpu)
continue; continue;
ret = parse_perf_domain(cpu, list_name, cell_name); ret = parse_perf_domain(cpu, list_name, cell_name, &args);
if (ret < 0) if (ret < 0)
continue; continue;
if (target_idx == ret) if (pargs->np == args.np && pargs->args_count == args.args_count &&
!memcmp(pargs->args, args.args, sizeof(args.args[0]) * args.args_count))
cpumask_set_cpu(cpu, cpumask); cpumask_set_cpu(cpu, cpumask);
of_node_put(args.np);
} }
return target_idx; return 0;
} }
#else #else
static inline int cpufreq_boost_trigger_state(int state) static inline int cpufreq_boost_trigger_state(int state)
...@@ -1185,7 +1188,8 @@ cpufreq_table_set_inefficient(struct cpufreq_policy *policy, ...@@ -1185,7 +1188,8 @@ cpufreq_table_set_inefficient(struct cpufreq_policy *policy,
} }
static inline int of_perf_domain_get_sharing_cpumask(int pcpu, const char *list_name, static inline int of_perf_domain_get_sharing_cpumask(int pcpu, const char *list_name,
const char *cell_name, struct cpumask *cpumask) const char *cell_name, struct cpumask *cpumask,
struct of_phandle_args *pargs)
{ {
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
......
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