clk: renesas: Deduplicate gen3_clk_get_rate64() PLL handling

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@gmail.com>
This commit is contained in:
Marek Vasut 2021-04-27 19:36:39 +02:00
parent d413214fb7
commit e7690e6195

View File

@ -153,6 +153,30 @@ static int gen3_clk_disable(struct clk *clk)
return renesas_clk_endisable(clk, priv->base, priv->info, false); 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) static u64 gen3_clk_get_rate64(struct clk *clk)
{ {
struct gen3_clk_priv *priv = dev_get_priv(clk->dev); 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 cpg_core_clk *core;
const struct rcar_gen3_cpg_pll_config *pll_config = const struct rcar_gen3_cpg_pll_config *pll_config =
priv->cpg_pll_config; priv->cpg_pll_config;
u32 value, mult, div, prediv, postdiv; u32 value, div, prediv, postdiv;
u64 rate = 0; u64 rate = 0;
int i, ret; int i, ret;
@ -203,60 +227,36 @@ static u64 gen3_clk_get_rate64(struct clk *clk)
return -EINVAL; return -EINVAL;
case CLK_TYPE_GEN3_MAIN: case CLK_TYPE_GEN3_MAIN:
rate = gen3_clk_get_rate64(&parent) / pll_config->extal_div; return gen3_clk_get_rate64_pll_mul_reg(priv, &parent, core,
debug("%s[%i] MAIN clk: parent=%i extal_div=%i => rate=%llu\n", 0, 1, pll_config->extal_div,
__func__, __LINE__, "MAIN");
core->parent, pll_config->extal_div, rate);
return rate;
case CLK_TYPE_GEN3_PLL0: case CLK_TYPE_GEN3_PLL0:
value = readl(priv->base + CPG_PLL0CR); return gen3_clk_get_rate64_pll_mul_reg(priv, &parent, core,
mult = (((value >> 24) & 0x7f) + 1) * 2; CPG_PLL0CR, 0, 0, "PLL0");
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;
case CLK_TYPE_GEN3_PLL1: case CLK_TYPE_GEN3_PLL1:
rate = gen3_clk_get_rate64(&parent) * pll_config->pll1_mult; return gen3_clk_get_rate64_pll_mul_reg(priv, &parent, core,
rate /= pll_config->pll1_div; 0, pll_config->pll1_mult,
debug("%s[%i] PLL1 clk: parent=%i mul=%i div=%i => rate=%llu\n", pll_config->pll1_div, "PLL1");
__func__, __LINE__,
core->parent, pll_config->pll1_mult,
pll_config->pll1_div, rate);
return rate;
case CLK_TYPE_GEN3_PLL2: case CLK_TYPE_GEN3_PLL2:
value = readl(priv->base + CPG_PLL2CR); return gen3_clk_get_rate64_pll_mul_reg(priv, &parent, core,
mult = (((value >> 24) & 0x7f) + 1) * 2; CPG_PLL2CR, 0, 0, "PLL2");
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;
case CLK_TYPE_GEN3_PLL3: case CLK_TYPE_GEN3_PLL3:
rate = gen3_clk_get_rate64(&parent) * pll_config->pll3_mult; return gen3_clk_get_rate64_pll_mul_reg(priv, &parent, core,
rate /= pll_config->pll3_div; 0, pll_config->pll3_mult,
debug("%s[%i] PLL3 clk: parent=%i mul=%i div=%i => rate=%llu\n", pll_config->pll3_div, "PLL3");
__func__, __LINE__,
core->parent, pll_config->pll3_mult,
pll_config->pll3_div, rate);
return rate;
case CLK_TYPE_GEN3_PLL4: case CLK_TYPE_GEN3_PLL4:
value = readl(priv->base + CPG_PLL4CR); return gen3_clk_get_rate64_pll_mul_reg(priv, &parent, core,
mult = (((value >> 24) & 0x7f) + 1) * 2; CPG_PLL4CR, 0, 0, "PLL4");
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;
case CLK_TYPE_FF: case CLK_TYPE_FF:
rate = (gen3_clk_get_rate64(&parent) * core->mult) / core->div; return gen3_clk_get_rate64_pll_mul_reg(priv, &parent, core,
debug("%s[%i] FIXED clk: parent=%i mul=%i div=%i => rate=%llu\n", 0, core->mult, core->div,
__func__, __LINE__, "FIXED");
core->parent, core->mult, core->div, rate);
return rate;
case CLK_TYPE_GEN3_MDSEL: case CLK_TYPE_GEN3_MDSEL:
div = (core->div >> (priv->sscg ? 16 : 0)) & 0xffff; div = (core->div >> (priv->sscg ? 16 : 0)) & 0xffff;