Re: [PATCH v2 3/4] clk: qcom: Add support for controlling Fabia PLL

From: Stephen Boyd
Date: Mon Mar 19 2018 - 19:34:02 EST


Quoting Amit Nischal (2018-03-07 23:18:14)
> Fabia PLL is a Digital Frequency Locked Loop (DFLL) clock
> generator which has a wide range of frequency output. It
> supports dynamic updating of the output frequency
> ("frequency slewing") without need to turn off the PLL
> before configuration. Add support for initial configuration
> and programming sequence to control fabia PLLs.
>
> Signed-off-by: Amit Nischal <anischal@xxxxxxxxxxxxxx>
> ---

Applied to clk-next with a little adjustment below:


diff --git a/drivers/clk/qcom/clk-alpha-pll.c b/drivers/clk/qcom/clk-alpha-pll.c
index e6b8d62e5175..9722b701fbdb 100644
--- a/drivers/clk/qcom/clk-alpha-pll.c
+++ b/drivers/clk/qcom/clk-alpha-pll.c
@@ -891,8 +891,9 @@ static int alpha_pll_fabia_enable(struct clk_hw *hw)
int ret;
struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
u32 val, opmode_val;
+ struct regmap *regmap = pll->clkr.regmap;

- ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
+ ret = regmap_read(regmap, PLL_MODE(pll), &val);
if (ret)
return ret;

@@ -904,8 +905,7 @@ static int alpha_pll_fabia_enable(struct clk_hw *hw)
return wait_for_pll_enable_active(pll);
}

- /* Read opmode value */
- ret = regmap_read(pll->clkr.regmap, PLL_OPMODE(pll), &opmode_val);
+ ret = regmap_read(regmap, PLL_OPMODE(pll), &opmode_val);
if (ret)
return ret;

@@ -913,30 +913,20 @@ static int alpha_pll_fabia_enable(struct clk_hw *hw)
if ((opmode_val & FABIA_OPMODE_RUN) && (val & PLL_OUTCTRL))
return 0;

- /* Disable PLL output */
- ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll),
- PLL_OUTCTRL, 0);
+ ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0);
if (ret)
return ret;

- /* Set Operation mode to STANBY */
- ret = regmap_write(pll->clkr.regmap, PLL_OPMODE(pll),
- FABIA_OPMODE_STANDBY);
+ ret = regmap_write(regmap, PLL_OPMODE(pll), FABIA_OPMODE_STANDBY);
if (ret)
return ret;

- /* PLL should be in STANDBY mode before continuing */
- mb();
-
- /* Bring PLL out of reset */
- ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll),
- PLL_RESET_N, PLL_RESET_N);
+ ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N,
+ PLL_RESET_N);
if (ret)
return ret;

- /* Set Operation mode to RUN */
- ret = regmap_write(pll->clkr.regmap, PLL_OPMODE(pll),
- FABIA_OPMODE_RUN);
+ ret = regmap_write(regmap, PLL_OPMODE(pll), FABIA_OPMODE_RUN);
if (ret)
return ret;

@@ -944,22 +934,13 @@ static int alpha_pll_fabia_enable(struct clk_hw *hw)
if (ret)
return ret;

- /* Enable the main PLL output */
- ret = regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
- FABIA_PLL_OUT_MASK, FABIA_PLL_OUT_MASK);
- if (ret)
- return ret;
-
- /* Enable PLL outputs */
- ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll),
- PLL_OUTCTRL, PLL_OUTCTRL);
+ ret = regmap_update_bits(regmap, PLL_USER_CTL(pll),
+ FABIA_PLL_OUT_MASK, FABIA_PLL_OUT_MASK);
if (ret)
return ret;

- /* Ensure that the write above goes through before returning. */
- mb();
-
- return ret;
+ return regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL,
+ PLL_OUTCTRL);
}

static void alpha_pll_fabia_disable(struct clk_hw *hw)
@@ -967,8 +948,9 @@ static void alpha_pll_fabia_disable(struct clk_hw *hw)
int ret;
struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
u32 val;
+ struct regmap *regmap = pll->clkr.regmap;

- ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
+ ret = regmap_read(regmap, PLL_MODE(pll), &val);
if (ret)
return;

@@ -978,23 +960,18 @@ static void alpha_pll_fabia_disable(struct clk_hw *hw)
return;
}

- /* Disable PLL outputs */
- ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll),
- PLL_OUTCTRL, 0);
+ ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0);
if (ret)
return;

/* Disable main outputs */
- ret = regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
- FABIA_PLL_OUT_MASK, 0);
+ ret = regmap_update_bits(regmap, PLL_USER_CTL(pll), FABIA_PLL_OUT_MASK,
+ 0);
if (ret)
return;

/* Place the PLL in STANDBY */
- ret = regmap_write(pll->clkr.regmap, PLL_OPMODE(pll),
- FABIA_OPMODE_STANDBY);
- if (ret)
- return;
+ regmap_write(regmap, PLL_OPMODE(pll), FABIA_OPMODE_STANDBY);
}

static unsigned long alpha_pll_fabia_recalc_rate(struct clk_hw *hw,