lkml.org 
[lkml]   [2020]   [Feb]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.4 111/459] clk: qcom: Don't overwrite 'cfg' in clk_rcg2_dfs_populate_freq()
    Date
    From: Stephen Boyd <sboyd@kernel.org>

    [ Upstream commit 21e157c62eeded8b1558a991b4820b761d48a730 ]

    The DFS frequency table logic overwrites 'cfg' while detecting the
    parent clk and then later on in clk_rcg2_dfs_populate_freq() we use that
    same variable to figure out the mode of the clk, either MND or not. Add
    a new variable to hold the parent clk bit so that 'cfg' is left
    untouched for use later.

    This fixes problems in detecting the supported frequencies for any clks
    in DFS mode.

    Fixes: cc4f6944d0e3 ("clk: qcom: Add support for RCG to register for DFS")
    Reported-by: Rajendra Nayak <rnayak@codeaurora.org>
    Signed-off-by: Stephen Boyd <sboyd@kernel.org>
    Link: https://lkml.kernel.org/r/20200128193329.45635-1-sboyd@kernel.org
    Tested-by: Rajendra Nayak <rnayak@codeaurora.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/clk/qcom/clk-rcg2.c | 8 ++++----
    1 file changed, 4 insertions(+), 4 deletions(-)

    diff --git a/drivers/clk/qcom/clk-rcg2.c b/drivers/clk/qcom/clk-rcg2.c
    index 5a89ed88cc27a..5174222cbfab2 100644
    --- a/drivers/clk/qcom/clk-rcg2.c
    +++ b/drivers/clk/qcom/clk-rcg2.c
    @@ -952,7 +952,7 @@ static void clk_rcg2_dfs_populate_freq(struct clk_hw *hw, unsigned int l,
    struct clk_rcg2 *rcg = to_clk_rcg2(hw);
    struct clk_hw *p;
    unsigned long prate = 0;
    - u32 val, mask, cfg, mode;
    + u32 val, mask, cfg, mode, src;
    int i, num_parents;

    regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + SE_PERF_DFSR(l), &cfg);
    @@ -962,12 +962,12 @@ static void clk_rcg2_dfs_populate_freq(struct clk_hw *hw, unsigned int l,
    if (cfg & mask)
    f->pre_div = cfg & mask;

    - cfg &= CFG_SRC_SEL_MASK;
    - cfg >>= CFG_SRC_SEL_SHIFT;
    + src = cfg & CFG_SRC_SEL_MASK;
    + src >>= CFG_SRC_SEL_SHIFT;

    num_parents = clk_hw_get_num_parents(hw);
    for (i = 0; i < num_parents; i++) {
    - if (cfg == rcg->parent_map[i].cfg) {
    + 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);
    prate = clk_hw_get_rate(p);
    --
    2.20.1
    \
     
     \ /
      Last update: 2020-02-14 18:39    [W:4.052 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site