Skip to content

Commit 53990cf

Browse files
saschahauerabelvesa
authored andcommitted
clk: imx: pll14xx: consolidate rate calculation
The PLL driver has support for two different PLLs: The pll1416x and the pll1443x. The latter has support for an additional kdiv value. recalc_rate can be the same calculation when kdiv is assumed to be zero for the PLL which doesn't support that value. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> Reviewed-by: Abel Vesa <abel.vesa@nxp.com> Link: https://lore.kernel.org/r/20220304125256.2125023-5-s.hauer@pengutronix.de Signed-off-by: Abel Vesa <abel.vesa@nxp.com>
1 parent 58f4980 commit 53990cf

File tree

1 file changed

+26
-33
lines changed

1 file changed

+26
-33
lines changed

drivers/clk/imx/clk-pll14xx.c

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,20 @@ static const struct imx_pll14xx_rate_table *imx_get_pll_settings(
9797
return NULL;
9898
}
9999

100+
static long pll14xx_calc_rate(struct clk_pll14xx *pll, int mdiv, int pdiv,
101+
int sdiv, int kdiv, unsigned long prate)
102+
{
103+
u64 fvco = prate;
104+
105+
/* fvco = (m * 65536 + k) * Fin / (p * 65536) */
106+
fvco *= (mdiv * 65536 + kdiv);
107+
pdiv *= 65536;
108+
109+
do_div(fvco, pdiv << sdiv);
110+
111+
return fvco;
112+
}
113+
100114
static long clk_pll14xx_round_rate(struct clk_hw *hw, unsigned long rate,
101115
unsigned long *prate)
102116
{
@@ -113,46 +127,25 @@ static long clk_pll14xx_round_rate(struct clk_hw *hw, unsigned long rate,
113127
return rate_table[i - 1].rate;
114128
}
115129

116-
static unsigned long clk_pll1416x_recalc_rate(struct clk_hw *hw,
117-
unsigned long parent_rate)
118-
{
119-
struct clk_pll14xx *pll = to_clk_pll14xx(hw);
120-
u32 mdiv, pdiv, sdiv, pll_div;
121-
u64 fvco = parent_rate;
122-
123-
pll_div = readl_relaxed(pll->base + DIV_CTL0);
124-
mdiv = FIELD_GET(MDIV_MASK, pll_div);
125-
pdiv = FIELD_GET(PDIV_MASK, pll_div);
126-
sdiv = FIELD_GET(SDIV_MASK, pll_div);
127-
128-
fvco *= mdiv;
129-
do_div(fvco, pdiv << sdiv);
130-
131-
return fvco;
132-
}
133-
134-
static unsigned long clk_pll1443x_recalc_rate(struct clk_hw *hw,
130+
static unsigned long clk_pll14xx_recalc_rate(struct clk_hw *hw,
135131
unsigned long parent_rate)
136132
{
137133
struct clk_pll14xx *pll = to_clk_pll14xx(hw);
138-
u32 mdiv, pdiv, sdiv, pll_div_ctl0, pll_div_ctl1;
139-
short int kdiv;
140-
u64 fvco = parent_rate;
134+
u32 mdiv, pdiv, sdiv, kdiv, pll_div_ctl0, pll_div_ctl1;
141135

142136
pll_div_ctl0 = readl_relaxed(pll->base + DIV_CTL0);
143-
pll_div_ctl1 = readl_relaxed(pll->base + DIV_CTL1);
144137
mdiv = FIELD_GET(MDIV_MASK, pll_div_ctl0);
145138
pdiv = FIELD_GET(PDIV_MASK, pll_div_ctl0);
146139
sdiv = FIELD_GET(SDIV_MASK, pll_div_ctl0);
147-
kdiv = FIELD_GET(KDIV_MASK, pll_div_ctl1);
148140

149-
/* fvco = (m * 65536 + k) * Fin / (p * 65536) */
150-
fvco *= (mdiv * 65536 + kdiv);
151-
pdiv *= 65536;
152-
153-
do_div(fvco, pdiv << sdiv);
141+
if (pll->type == PLL_1443X) {
142+
pll_div_ctl1 = readl_relaxed(pll->base + DIV_CTL1);
143+
kdiv = FIELD_GET(KDIV_MASK, pll_div_ctl1);
144+
} else {
145+
kdiv = 0;
146+
}
154147

155-
return fvco;
148+
return pll14xx_calc_rate(pll, mdiv, pdiv, sdiv, kdiv, parent_rate);
156149
}
157150

158151
static inline bool clk_pll14xx_mp_change(const struct imx_pll14xx_rate_table *rate,
@@ -363,20 +356,20 @@ static const struct clk_ops clk_pll1416x_ops = {
363356
.prepare = clk_pll14xx_prepare,
364357
.unprepare = clk_pll14xx_unprepare,
365358
.is_prepared = clk_pll14xx_is_prepared,
366-
.recalc_rate = clk_pll1416x_recalc_rate,
359+
.recalc_rate = clk_pll14xx_recalc_rate,
367360
.round_rate = clk_pll14xx_round_rate,
368361
.set_rate = clk_pll1416x_set_rate,
369362
};
370363

371364
static const struct clk_ops clk_pll1416x_min_ops = {
372-
.recalc_rate = clk_pll1416x_recalc_rate,
365+
.recalc_rate = clk_pll14xx_recalc_rate,
373366
};
374367

375368
static const struct clk_ops clk_pll1443x_ops = {
376369
.prepare = clk_pll14xx_prepare,
377370
.unprepare = clk_pll14xx_unprepare,
378371
.is_prepared = clk_pll14xx_is_prepared,
379-
.recalc_rate = clk_pll1443x_recalc_rate,
372+
.recalc_rate = clk_pll14xx_recalc_rate,
380373
.round_rate = clk_pll14xx_round_rate,
381374
.set_rate = clk_pll1443x_set_rate,
382375
};

0 commit comments

Comments
 (0)