lkml.org 
[lkml]   [2020]   [May]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v8 08/10] cpufreq: dt: Validate all interconnect paths
    Date
    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@linaro.org>
    ---
    v8:
    * New patch.

    drivers/cpufreq/cpufreq-dt.c | 49 ++++++++++++++++++++++++++++++++----
    1 file changed, 44 insertions(+), 5 deletions(-)

    diff --git a/drivers/cpufreq/cpufreq-dt.c b/drivers/cpufreq/cpufreq-dt.c
    index 4ecef3257532..3dd28c2c1633 100644
    --- a/drivers/cpufreq/cpufreq-dt.c
    +++ b/drivers/cpufreq/cpufreq-dt.c
    @@ -91,12 +91,54 @@ 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;
    struct regulator *cpu_reg;
    struct clk *cpu_clk;
    - struct icc_path *cpu_path;
    int ret = 0;
    const char *name;

    @@ -123,8 +165,7 @@ static int resources_available(void)

    clk_put(cpu_clk);

    - cpu_path = of_icc_get(cpu_dev, NULL);
    - ret = PTR_ERR_OR_ZERO(cpu_path);
    + ret = find_icc_paths(cpu_dev);
    if (ret) {
    if (ret == -EPROBE_DEFER)
    dev_dbg(cpu_dev, "defer icc path: %d\n", ret);
    @@ -134,8 +175,6 @@ static int resources_available(void)
    return ret;
    }

    - icc_put(cpu_path);
    -
    name = find_supply_name(cpu_dev);
    /* Platform doesn't require regulator */
    if (!name)
    \
     
     \ /
      Last update: 2020-05-12 14:54    [W:3.615 / U:0.628 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site