summaryrefslogtreecommitdiff
path: root/drivers/clk/renesas
diff options
context:
space:
mode:
authorMarek Vasut <marek.vasut+renesas@gmail.com>2021-04-27 19:36:39 +0200
committerMarek Vasut <marek.vasut+renesas@gmail.com>2021-05-21 15:00:17 +0200
commite7690e61952b0058214fc36cad91d1c77a8c0239 (patch)
tree518a679d6fd290cf789b696b278efa593bcccd41 /drivers/clk/renesas
parentd413214fb74873721d92ffe27fa63158ee84e469 (diff)
downloadu-boot-e7690e61952b0058214fc36cad91d1c77a8c0239.tar.gz
u-boot-e7690e61952b0058214fc36cad91d1c77a8c0239.tar.bz2
u-boot-e7690e61952b0058214fc36cad91d1c77a8c0239.zip
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>
Diffstat (limited to 'drivers/clk/renesas')
-rw-r--r--drivers/clk/renesas/clk-rcar-gen3.c86
1 files changed, 43 insertions, 43 deletions
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;