On 12-05-20, 15:53, Georgi Djakov wrote: > Currently when we check for the available resources, we assume that there > is only one interconnect path, but in fact it could be more than one. Do > some validation to determine the number of paths and verify if each one > of them is available. > > Signed-off-by: Georgi Djakov <georgi.djakov@xxxxxxxxxx> > --- > v8: > * New patch. Merged this with the 7th patch and applied this delta: diff --git a/drivers/cpufreq/cpufreq-dt.c b/drivers/cpufreq/cpufreq-dt.c index 15d70112454c..79742bbd221f 100644 --- a/drivers/cpufreq/cpufreq-dt.c +++ b/drivers/cpufreq/cpufreq-dt.c @@ -13,7 +13,6 @@ #include <linux/cpufreq.h> #include <linux/cpumask.h> #include <linux/err.h> -#include <linux/interconnect.h> #include <linux/module.h> #include <linux/of.h> #include <linux/pm_opp.h> @@ -91,49 +90,6 @@ static const char *find_supply_name(struct device *dev) return name; } -static int find_icc_paths(struct device *dev) -{ - struct device_node *np; - struct icc_path **paths; - int i, count, num_paths; - int ret = 0; - - np = of_node_get(dev->of_node); - if (!np) - return 0; - - count = of_count_phandle_with_args(np, "interconnects", - "#interconnect-cells"); - of_node_put(np); - if (count < 0) - return 0; - - /* two phandles when #interconnect-cells = <1> */ - if (count % 2) { - dev_err(dev, "%s: Invalid interconnects values\n", __func__); - return -EINVAL; - } - - num_paths = count / 2; - paths = kcalloc(num_paths, sizeof(*paths), GFP_KERNEL); - if (!paths) - return -ENOMEM; - - for (i = 0; i < num_paths; i++) { - paths[i] = of_icc_get_by_index(dev, i); - ret = PTR_ERR_OR_ZERO(paths[i]); - if (ret) - break; - } - - while (i--) - icc_put(paths[i]); - - kfree(paths); - - return ret; -} - static int resources_available(void) { struct device *cpu_dev; @@ -165,15 +121,9 @@ static int resources_available(void) clk_put(cpu_clk); - ret = find_icc_paths(cpu_dev); - if (ret) { - if (ret == -EPROBE_DEFER) - dev_dbg(cpu_dev, "defer icc path: %d\n", ret); - else - dev_err(cpu_dev, "failed to get icc path: %d\n", ret); - + ret = dev_pm_opp_of_find_icc_paths(cpu_dev, NULL); + if (ret) return ret; - } name = find_supply_name(cpu_dev); /* Platform doesn't require regulator */ -- viresh