Merge "clk: qcom: check for change in RCG configuration during set_rate"
This commit is contained in:
commit
3c361ea66f
1 changed files with 35 additions and 0 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue