From 2c30b06474b0bc5ebb9cbec208c252b4147dc940 Mon Sep 17 00:00:00 2001 From: Vivek Aknurwar Date: Fri, 29 May 2020 18:10:11 -0700 Subject: [PATCH 1/3] clk: qcom: gdsc-regulator: Fix using uninitialized variable Fix printing stale regval value in case of votable gdsc and if driver observes error is gdsc polling. Change-Id: I20c6e28fa8ed9ca5eea9f2a4c57b22c424ee262a Signed-off-by: Vivek Aknurwar --- drivers/clk/qcom/gdsc-regulator.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/clk/qcom/gdsc-regulator.c b/drivers/clk/qcom/gdsc-regulator.c index acef2c2bf04f..332a964ceb7e 100644 --- a/drivers/clk/qcom/gdsc-regulator.c +++ b/drivers/clk/qcom/gdsc-regulator.c @@ -374,9 +374,11 @@ static int gdsc_disable(struct regulator_dev *rdev) udelay(TIMEOUT_US); } else { ret = poll_gdsc_status(sc, DISABLED); - if (ret) + if (ret) { + regmap_read(sc->regmap, REG_OFFSET, ®val); dev_err(&rdev->dev, "%s disable timed out: 0x%x\n", sc->rdesc.name, regval); + } } if (sc->domain_addr) { From bc4779617830ed8a4d0eba9e5db6173c5db974c7 Mon Sep 17 00:00:00 2001 From: Vivek Aknurwar Date: Fri, 29 May 2020 18:14:38 -0700 Subject: [PATCH 2/3] clk: qcom: clk-debug: Fix possible NULL dereference in _mux_get_parent Fix possible NULL dereference in retrieving clk parent name. Change-Id: Ic4dbc6632f00365ea127042c0f3bd9b66a243ec6 Signed-off-by: Vivek Aknurwar --- drivers/clk/qcom/clk-debug.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/clk/qcom/clk-debug.c b/drivers/clk/qcom/clk-debug.c index 70afd99ed217..b27fe0b488e1 100644 --- a/drivers/clk/qcom/clk-debug.c +++ b/drivers/clk/qcom/clk-debug.c @@ -146,13 +146,17 @@ static u8 clk_debug_mux_get_parent(struct clk_hw *hw) { int i, num_parents = clk_hw_get_num_parents(hw); struct clk_hw *hw_clk = clk_hw_get_parent(hw); + struct clk_hw *clk_parent; const char *parent; if (!hw_clk) return 0; for (i = 0; i < num_parents; i++) { - parent = clk_hw_get_name(clk_hw_get_parent_by_index(hw, i)); + clk_parent = clk_hw_get_parent_by_index(hw, i); + if (!clk_parent) + return 0; + parent = clk_hw_get_name(clk_parent); if (!strcmp(parent, clk_hw_get_name(hw_clk))) { pr_debug("%s: clock parent - %s, index %d\n", __func__, parent, i); From fb03af1d58596940655b6fe2798d037861930ee4 Mon Sep 17 00:00:00 2001 From: Vivek Aknurwar Date: Sat, 30 May 2020 00:03:23 -0700 Subject: [PATCH 3/3] clk: qcom: clk-rcg2: Fix possible dereference of clk parent for dfs clocks Fix possible dereference of clk parent while populating dfs clocks. Change-Id: I797c499fe3ab57effb16c65f89365da9e5279995 Signed-off-by: Vivek Aknurwar --- drivers/clk/qcom/clk-rcg2.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/drivers/clk/qcom/clk-rcg2.c b/drivers/clk/qcom/clk-rcg2.c index bf2679374416..a427c7e90fc8 100644 --- a/drivers/clk/qcom/clk-rcg2.c +++ b/drivers/clk/qcom/clk-rcg2.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2013, 2016-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2013, 2016-2020, The Linux Foundation. All rights reserved. */ #include @@ -1435,7 +1435,7 @@ const struct clk_ops clk_rcg2_shared_ops = { EXPORT_SYMBOL_GPL(clk_rcg2_shared_ops); /* Common APIs to be used for DFS based RCGR */ -static void clk_rcg2_dfs_populate_freq(struct clk_hw *hw, unsigned int l, +static int clk_rcg2_dfs_populate_freq(struct clk_hw *hw, unsigned int l, struct freq_tbl *f) { struct clk_rcg2 *rcg = to_clk_rcg2(hw); @@ -1462,6 +1462,8 @@ static void clk_rcg2_dfs_populate_freq(struct clk_hw *hw, unsigned int l, if (src == rcg->parent_map[i].cfg) { f->src = rcg->parent_map[i].src; p = clk_hw_get_parent_by_index(&rcg->clkr.hw, i); + if (!p) + return -EINVAL; prate = clk_hw_get_rate(p); } } @@ -1482,12 +1484,13 @@ static void clk_rcg2_dfs_populate_freq(struct clk_hw *hw, unsigned int l, } f->freq = calc_rate(prate, f->m, f->n, mode, f->pre_div); + return 0; } static int clk_rcg2_dfs_populate_freq_table(struct clk_rcg2 *rcg) { struct freq_tbl *freq_tbl; - int i; + int i, ret; /* Allocate space for 1 extra since table is NULL terminated */ freq_tbl = kcalloc(MAX_PERF_LEVEL + 1, sizeof(*freq_tbl), GFP_KERNEL); @@ -1495,10 +1498,13 @@ static int clk_rcg2_dfs_populate_freq_table(struct clk_rcg2 *rcg) return -ENOMEM; rcg->freq_tbl = freq_tbl; - for (i = 0; i < MAX_PERF_LEVEL; i++) + for (i = 0; i < MAX_PERF_LEVEL; i++) { + ret = clk_rcg2_dfs_populate_freq(&rcg->clkr.hw, i, freq_tbl + i); - - return 0; + if (ret) + return ret; + } + return ret; } static int clk_rcg2_dfs_determine_rate(struct clk_hw *hw,