[PATCH 12/30] clk: renesas: Deduplicate gen3_clk_get_rate64() PLL handling

Lad, Prabhakar prabhakar.csengg at gmail.com
Thu May 20 19:00:21 CEST 2021


Hi Marek,

Thank you for the patch.

On Wed, Apr 28, 2021 at 8:33 PM Marek Vasut <marek.vasut at gmail.com> wrote:
>
> Most of the PLLx, MAIN, FIXED clock handlers are calling very similar
> code, which determines parent rate and then applies multiplication and
> division. The only difference is whether multiplication is fixed factor
> or coming from CRx register. Deduplicate the code into a single function.
>
> Signed-off-by: Marek Vasut <marek.vasut+renesas at gmail.com>
> ---
>  drivers/clk/renesas/clk-rcar-gen3.c | 86 ++++++++++++++---------------
>  1 file changed, 43 insertions(+), 43 deletions(-)
>
Tested on RZ/G2{EHMN} boards

Tested-by: Lad Prabhakar <prabhakar.mahadev-lad.rj at bp.renesas.com>

Cheers,
Prabhakar

> diff --git a/drivers/clk/renesas/clk-rcar-gen3.c b/drivers/clk/renesas/clk-rcar-gen3.c
> index 49ab9134af..7b42e28e83 100644
> --- a/drivers/clk/renesas/clk-rcar-gen3.c
> +++ b/drivers/clk/renesas/clk-rcar-gen3.c
> @@ -153,6 +153,30 @@ static int gen3_clk_disable(struct clk *clk)
>         return renesas_clk_endisable(clk, priv->base, priv->info, false);
>  }
>
> +static u64 gen3_clk_get_rate64(struct clk *clk);
> +
> +static u64 gen3_clk_get_rate64_pll_mul_reg(struct gen3_clk_priv *priv,
> +                                          struct clk *parent,
> +                                          const struct cpg_core_clk *core,
> +                                          u32 mul_reg, u32 mult, u32 div,
> +                                          char *name)
> +{
> +       u32 value;
> +       u64 rate;
> +
> +       if (mul_reg) {
> +               value = readl(priv->base + mul_reg);
> +               mult = (((value >> 24) & 0x7f) + 1) * 2;
> +               div = 1;
> +       }
> +
> +       rate = (gen3_clk_get_rate64(parent) * mult) / div;
> +
> +       debug("%s[%i] %s clk: parent=%i mult=%u div=%u => rate=%llu\n",
> +             __func__, __LINE__, name, core->parent, mult, div, rate);
> +       return rate;
> +}
> +
>  static u64 gen3_clk_get_rate64(struct clk *clk)
>  {
>         struct gen3_clk_priv *priv = dev_get_priv(clk->dev);
> @@ -161,7 +185,7 @@ static u64 gen3_clk_get_rate64(struct clk *clk)
>         const struct cpg_core_clk *core;
>         const struct rcar_gen3_cpg_pll_config *pll_config =
>                                         priv->cpg_pll_config;
> -       u32 value, mult, div, prediv, postdiv;
> +       u32 value, div, prediv, postdiv;
>         u64 rate = 0;
>         int i, ret;
>
> @@ -203,60 +227,36 @@ static u64 gen3_clk_get_rate64(struct clk *clk)
>                 return -EINVAL;
>
>         case CLK_TYPE_GEN3_MAIN:
> -               rate = gen3_clk_get_rate64(&parent) / pll_config->extal_div;
> -               debug("%s[%i] MAIN clk: parent=%i extal_div=%i => rate=%llu\n",
> -                     __func__, __LINE__,
> -                     core->parent, pll_config->extal_div, rate);
> -               return rate;
> +               return gen3_clk_get_rate64_pll_mul_reg(priv, &parent, core,
> +                                               0, 1, pll_config->extal_div,
> +                                               "MAIN");
>
>         case CLK_TYPE_GEN3_PLL0:
> -               value = readl(priv->base + CPG_PLL0CR);
> -               mult = (((value >> 24) & 0x7f) + 1) * 2;
> -               rate = gen3_clk_get_rate64(&parent) * mult;
> -               debug("%s[%i] PLL0 clk: parent=%i mult=%u => rate=%llu\n",
> -                     __func__, __LINE__, core->parent, mult, rate);
> -               return rate;
> +               return gen3_clk_get_rate64_pll_mul_reg(priv, &parent, core,
> +                                               CPG_PLL0CR, 0, 0, "PLL0");
>
>         case CLK_TYPE_GEN3_PLL1:
> -               rate = gen3_clk_get_rate64(&parent) * pll_config->pll1_mult;
> -               rate /= pll_config->pll1_div;
> -               debug("%s[%i] PLL1 clk: parent=%i mul=%i div=%i => rate=%llu\n",
> -                     __func__, __LINE__,
> -                     core->parent, pll_config->pll1_mult,
> -                     pll_config->pll1_div, rate);
> -               return rate;
> +               return gen3_clk_get_rate64_pll_mul_reg(priv, &parent, core,
> +                                               0, pll_config->pll1_mult,
> +                                               pll_config->pll1_div, "PLL1");
>
>         case CLK_TYPE_GEN3_PLL2:
> -               value = readl(priv->base + CPG_PLL2CR);
> -               mult = (((value >> 24) & 0x7f) + 1) * 2;
> -               rate = gen3_clk_get_rate64(&parent) * mult;
> -               debug("%s[%i] PLL2 clk: parent=%i mult=%u => rate=%llu\n",
> -                     __func__, __LINE__, core->parent, mult, rate);
> -               return rate;
> +               return gen3_clk_get_rate64_pll_mul_reg(priv, &parent, core,
> +                                               CPG_PLL2CR, 0, 0, "PLL2");
>
>         case CLK_TYPE_GEN3_PLL3:
> -               rate = gen3_clk_get_rate64(&parent) * pll_config->pll3_mult;
> -               rate /= pll_config->pll3_div;
> -               debug("%s[%i] PLL3 clk: parent=%i mul=%i div=%i => rate=%llu\n",
> -                     __func__, __LINE__,
> -                     core->parent, pll_config->pll3_mult,
> -                     pll_config->pll3_div, rate);
> -               return rate;
> +               return gen3_clk_get_rate64_pll_mul_reg(priv, &parent, core,
> +                                               0, pll_config->pll3_mult,
> +                                               pll_config->pll3_div, "PLL3");
>
>         case CLK_TYPE_GEN3_PLL4:
> -               value = readl(priv->base + CPG_PLL4CR);
> -               mult = (((value >> 24) & 0x7f) + 1) * 2;
> -               rate = gen3_clk_get_rate64(&parent) * mult;
> -               debug("%s[%i] PLL4 clk: parent=%i mult=%u => rate=%llu\n",
> -                     __func__, __LINE__, core->parent, mult, rate);
> -               return rate;
> +               return gen3_clk_get_rate64_pll_mul_reg(priv, &parent, core,
> +                                               CPG_PLL4CR, 0, 0, "PLL4");
>
>         case CLK_TYPE_FF:
> -               rate = (gen3_clk_get_rate64(&parent) * core->mult) / core->div;
> -               debug("%s[%i] FIXED clk: parent=%i mul=%i div=%i => rate=%llu\n",
> -                     __func__, __LINE__,
> -                     core->parent, core->mult, core->div, rate);
> -               return rate;
> +               return gen3_clk_get_rate64_pll_mul_reg(priv, &parent, core,
> +                                               0, core->mult, core->div,
> +                                               "FIXED");
>
>         case CLK_TYPE_GEN3_MDSEL:
>                 div = (core->div >> (priv->sscg ? 16 : 0)) & 0xffff;
> --
> 2.30.2
>


More information about the U-Boot mailing list