summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2018-09-18 09:44:43 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2018-09-18 09:44:42 -0700
commit3c361ea66fda4567268c438bdaad8c4361453fdd (patch)
tree2fc7527ae711c3edac3b7472e4781e789b1f6284 /drivers
parent2abeb0ae044fe74caeb79a37a7a75e0944f6753e (diff)
parenta00ce1c8cbd80275ff14d8616b3f94851056bb0e (diff)
Merge "clk: qcom: check for change in RCG configuration during set_rate"
Diffstat (limited to 'drivers')
-rw-r--r--drivers/clk/qcom/clk-rcg2.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/drivers/clk/qcom/clk-rcg2.c b/drivers/clk/qcom/clk-rcg2.c
index 3c3cf8e04eea..f22e07e87967 100644
--- a/drivers/clk/qcom/clk-rcg2.c
+++ b/drivers/clk/qcom/clk-rcg2.c
@@ -313,6 +313,39 @@ static int clk_rcg2_determine_rate(struct clk_hw *hw,
return _freq_tbl_determine_rate(hw, rcg->freq_tbl, req);
}
+static bool clk_rcg2_current_config(struct clk_rcg2 *rcg,
+ const struct freq_tbl *f)
+{
+ struct clk_hw *hw = &rcg->clkr.hw;
+ u32 cfg, mask, new_cfg;
+ int index;
+
+ if (rcg->mnd_width) {
+ mask = BIT(rcg->mnd_width) - 1;
+ regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + M_REG, &cfg);
+ if ((cfg & mask) != (f->m & mask))
+ return false;
+
+ regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + N_REG, &cfg);
+ if ((cfg & mask) != (~(f->n - f->m) & mask))
+ return false;
+ }
+
+ mask = (BIT(rcg->hid_width) - 1) | CFG_SRC_SEL_MASK;
+
+ index = qcom_find_src_index(hw, rcg->parent_map, f->src);
+
+ new_cfg = ((f->pre_div << CFG_SRC_DIV_SHIFT) |
+ (rcg->parent_map[index].cfg << CFG_SRC_SEL_SHIFT)) & mask;
+
+ regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG, &cfg);
+
+ if (new_cfg != (cfg & mask))
+ return false;
+
+ return true;
+}
+
static int clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f)
{
u32 cfg, mask, old_cfg;
@@ -984,6 +1017,8 @@ static int clk_byte2_set_rate(struct clk_hw *hw, unsigned long rate,
for (i = 0; i < num_parents; i++) {
if (cfg == rcg->parent_map[i].cfg) {
f.src = rcg->parent_map[i].src;
+ if (clk_rcg2_current_config(rcg, &f))
+ return 0;
return clk_rcg2_configure(rcg, &f);
}
}