1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright 2017-2018 NXP.
6 #include <linux/bitops.h>
7 #include <linux/clk-provider.h>
10 #include <linux/iopoll.h>
11 #include <linux/slab.h>
12 #include <linux/jiffies.h>
18 #define LOCK_STATUS BIT(31)
19 #define LOCK_SEL_MASK BIT(29)
20 #define CLKE_MASK BIT(11)
21 #define RST_MASK BIT(9)
22 #define BYPASS_MASK BIT(4)
24 #define MDIV_MASK GENMASK(21, 12)
26 #define PDIV_MASK GENMASK(9, 4)
28 #define SDIV_MASK GENMASK(2, 0)
30 #define KDIV_MASK GENMASK(15, 0)
32 #define LOCK_TIMEOUT_US 10000
37 enum imx_pll14xx_type type;
38 const struct imx_pll14xx_rate_table *rate_table;
42 #define to_clk_pll14xx(_hw) container_of(_hw, struct clk_pll14xx, hw)
44 static const struct imx_pll14xx_rate_table imx_pll1416x_tbl[] = {
45 PLL_1416X_RATE(1800000000U, 225, 3, 0),
46 PLL_1416X_RATE(1600000000U, 200, 3, 0),
47 PLL_1416X_RATE(1500000000U, 375, 3, 1),
48 PLL_1416X_RATE(1400000000U, 350, 3, 1),
49 PLL_1416X_RATE(1200000000U, 300, 3, 1),
50 PLL_1416X_RATE(1000000000U, 250, 3, 1),
51 PLL_1416X_RATE(800000000U, 200, 3, 1),
52 PLL_1416X_RATE(750000000U, 250, 2, 2),
53 PLL_1416X_RATE(700000000U, 350, 3, 2),
54 PLL_1416X_RATE(600000000U, 300, 3, 2),
57 static const struct imx_pll14xx_rate_table imx_pll1443x_tbl[] = {
58 PLL_1443X_RATE(650000000U, 325, 3, 2, 0),
59 PLL_1443X_RATE(594000000U, 198, 2, 2, 0),
60 PLL_1443X_RATE(393216000U, 262, 2, 3, 9437),
61 PLL_1443X_RATE(361267200U, 361, 3, 3, 17511),
64 struct imx_pll14xx_clk imx_1443x_pll = {
66 .rate_table = imx_pll1443x_tbl,
67 .rate_count = ARRAY_SIZE(imx_pll1443x_tbl),
70 struct imx_pll14xx_clk imx_1443x_dram_pll = {
72 .rate_table = imx_pll1443x_tbl,
73 .rate_count = ARRAY_SIZE(imx_pll1443x_tbl),
74 .flags = CLK_GET_RATE_NOCACHE,
77 struct imx_pll14xx_clk imx_1416x_pll = {
79 .rate_table = imx_pll1416x_tbl,
80 .rate_count = ARRAY_SIZE(imx_pll1416x_tbl),
83 static const struct imx_pll14xx_rate_table *imx_get_pll_settings(
84 struct clk_pll14xx *pll, unsigned long rate)
86 const struct imx_pll14xx_rate_table *rate_table = pll->rate_table;
89 for (i = 0; i < pll->rate_count; i++)
90 if (rate == rate_table[i].rate)
91 return &rate_table[i];
96 static long clk_pll14xx_round_rate(struct clk_hw *hw, unsigned long rate,
99 struct clk_pll14xx *pll = to_clk_pll14xx(hw);
100 const struct imx_pll14xx_rate_table *rate_table = pll->rate_table;
103 /* Assumming rate_table is in descending order */
104 for (i = 0; i < pll->rate_count; i++)
105 if (rate >= rate_table[i].rate)
106 return rate_table[i].rate;
108 /* return minimum supported value */
109 return rate_table[i - 1].rate;
112 static unsigned long clk_pll1416x_recalc_rate(struct clk_hw *hw,
113 unsigned long parent_rate)
115 struct clk_pll14xx *pll = to_clk_pll14xx(hw);
116 u32 mdiv, pdiv, sdiv, pll_div;
117 u64 fvco = parent_rate;
119 pll_div = readl_relaxed(pll->base + 4);
120 mdiv = (pll_div & MDIV_MASK) >> MDIV_SHIFT;
121 pdiv = (pll_div & PDIV_MASK) >> PDIV_SHIFT;
122 sdiv = (pll_div & SDIV_MASK) >> SDIV_SHIFT;
125 do_div(fvco, pdiv << sdiv);
130 static unsigned long clk_pll1443x_recalc_rate(struct clk_hw *hw,
131 unsigned long parent_rate)
133 struct clk_pll14xx *pll = to_clk_pll14xx(hw);
134 u32 mdiv, pdiv, sdiv, pll_div_ctl0, pll_div_ctl1;
136 u64 fvco = parent_rate;
138 pll_div_ctl0 = readl_relaxed(pll->base + 4);
139 pll_div_ctl1 = readl_relaxed(pll->base + 8);
140 mdiv = (pll_div_ctl0 & MDIV_MASK) >> MDIV_SHIFT;
141 pdiv = (pll_div_ctl0 & PDIV_MASK) >> PDIV_SHIFT;
142 sdiv = (pll_div_ctl0 & SDIV_MASK) >> SDIV_SHIFT;
143 kdiv = pll_div_ctl1 & KDIV_MASK;
145 /* fvco = (m * 65536 + k) * Fin / (p * 65536) */
146 fvco *= (mdiv * 65536 + kdiv);
149 do_div(fvco, pdiv << sdiv);
154 static inline bool clk_pll14xx_mp_change(const struct imx_pll14xx_rate_table *rate,
157 u32 old_mdiv, old_pdiv;
159 old_mdiv = (pll_div & MDIV_MASK) >> MDIV_SHIFT;
160 old_pdiv = (pll_div & PDIV_MASK) >> PDIV_SHIFT;
162 return rate->mdiv != old_mdiv || rate->pdiv != old_pdiv;
165 static int clk_pll14xx_wait_lock(struct clk_pll14xx *pll)
169 return readl_poll_timeout(pll->base, val, val & LOCK_TIMEOUT_US, 0,
173 static int clk_pll1416x_set_rate(struct clk_hw *hw, unsigned long drate,
176 struct clk_pll14xx *pll = to_clk_pll14xx(hw);
177 const struct imx_pll14xx_rate_table *rate;
181 rate = imx_get_pll_settings(pll, drate);
183 pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__,
184 drate, clk_hw_get_name(hw));
188 tmp = readl_relaxed(pll->base + 4);
190 if (!clk_pll14xx_mp_change(rate, tmp)) {
191 tmp &= ~(SDIV_MASK) << SDIV_SHIFT;
192 tmp |= rate->sdiv << SDIV_SHIFT;
193 writel_relaxed(tmp, pll->base + 4);
198 /* Bypass clock and set lock to pll output lock */
199 tmp = readl_relaxed(pll->base);
200 tmp |= LOCK_SEL_MASK;
201 writel_relaxed(tmp, pll->base);
205 writel_relaxed(tmp, pll->base);
209 writel(tmp, pll->base);
211 div_val = (rate->mdiv << MDIV_SHIFT) | (rate->pdiv << PDIV_SHIFT) |
212 (rate->sdiv << SDIV_SHIFT);
213 writel_relaxed(div_val, pll->base + 0x4);
216 * According to SPEC, t3 - t2 need to be greater than
217 * 1us and 1/FREF, respectively.
218 * FREF is FIN / Prediv, the prediv is [1, 63], so choose
225 writel_relaxed(tmp, pll->base);
228 ret = clk_pll14xx_wait_lock(pll);
234 writel_relaxed(tmp, pll->base);
239 static int clk_pll1443x_set_rate(struct clk_hw *hw, unsigned long drate,
242 struct clk_pll14xx *pll = to_clk_pll14xx(hw);
243 const struct imx_pll14xx_rate_table *rate;
247 rate = imx_get_pll_settings(pll, drate);
249 pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__,
250 drate, clk_hw_get_name(hw));
254 tmp = readl_relaxed(pll->base + 4);
256 if (!clk_pll14xx_mp_change(rate, tmp)) {
257 tmp &= ~(SDIV_MASK) << SDIV_SHIFT;
258 tmp |= rate->sdiv << SDIV_SHIFT;
259 writel_relaxed(tmp, pll->base + 4);
261 tmp = rate->kdiv << KDIV_SHIFT;
262 writel_relaxed(tmp, pll->base + 8);
268 tmp = readl_relaxed(pll->base);
270 writel_relaxed(tmp, pll->base);
274 writel_relaxed(tmp, pll->base);
276 div_val = (rate->mdiv << MDIV_SHIFT) | (rate->pdiv << PDIV_SHIFT) |
277 (rate->sdiv << SDIV_SHIFT);
278 writel_relaxed(div_val, pll->base + 0x4);
279 writel_relaxed(rate->kdiv << KDIV_SHIFT, pll->base + 0x8);
282 * According to SPEC, t3 - t2 need to be greater than
283 * 1us and 1/FREF, respectively.
284 * FREF is FIN / Prediv, the prediv is [1, 63], so choose
291 writel_relaxed(tmp, pll->base);
294 ret = clk_pll14xx_wait_lock(pll);
300 writel_relaxed(tmp, pll->base);
305 static int clk_pll14xx_prepare(struct clk_hw *hw)
307 struct clk_pll14xx *pll = to_clk_pll14xx(hw);
312 * RESETB = 1 from 0, PLL starts its normal
313 * operation after lock time
315 val = readl_relaxed(pll->base + GNRL_CTL);
319 writel_relaxed(val, pll->base + GNRL_CTL);
321 writel_relaxed(val, pll->base + GNRL_CTL);
323 ret = clk_pll14xx_wait_lock(pll);
328 writel_relaxed(val, pll->base + GNRL_CTL);
333 static int clk_pll14xx_is_prepared(struct clk_hw *hw)
335 struct clk_pll14xx *pll = to_clk_pll14xx(hw);
338 val = readl_relaxed(pll->base + GNRL_CTL);
340 return (val & RST_MASK) ? 1 : 0;
343 static void clk_pll14xx_unprepare(struct clk_hw *hw)
345 struct clk_pll14xx *pll = to_clk_pll14xx(hw);
349 * Set RST to 0, power down mode is enabled and
350 * every digital block is reset
352 val = readl_relaxed(pll->base + GNRL_CTL);
354 writel_relaxed(val, pll->base + GNRL_CTL);
357 static const struct clk_ops clk_pll1416x_ops = {
358 .prepare = clk_pll14xx_prepare,
359 .unprepare = clk_pll14xx_unprepare,
360 .is_prepared = clk_pll14xx_is_prepared,
361 .recalc_rate = clk_pll1416x_recalc_rate,
362 .round_rate = clk_pll14xx_round_rate,
363 .set_rate = clk_pll1416x_set_rate,
366 static const struct clk_ops clk_pll1416x_min_ops = {
367 .recalc_rate = clk_pll1416x_recalc_rate,
370 static const struct clk_ops clk_pll1443x_ops = {
371 .prepare = clk_pll14xx_prepare,
372 .unprepare = clk_pll14xx_unprepare,
373 .is_prepared = clk_pll14xx_is_prepared,
374 .recalc_rate = clk_pll1443x_recalc_rate,
375 .round_rate = clk_pll14xx_round_rate,
376 .set_rate = clk_pll1443x_set_rate,
379 struct clk_hw *imx_clk_hw_pll14xx(const char *name, const char *parent_name,
381 const struct imx_pll14xx_clk *pll_clk)
383 struct clk_pll14xx *pll;
385 struct clk_init_data init;
389 pll = kzalloc(sizeof(*pll), GFP_KERNEL);
391 return ERR_PTR(-ENOMEM);
394 init.flags = pll_clk->flags;
395 init.parent_names = &parent_name;
396 init.num_parents = 1;
398 switch (pll_clk->type) {
400 if (!pll_clk->rate_table)
401 init.ops = &clk_pll1416x_min_ops;
403 init.ops = &clk_pll1416x_ops;
406 init.ops = &clk_pll1443x_ops;
409 pr_err("%s: Unknown pll type for pll clk %s\n",
414 pll->hw.init = &init;
415 pll->type = pll_clk->type;
416 pll->rate_table = pll_clk->rate_table;
417 pll->rate_count = pll_clk->rate_count;
419 val = readl_relaxed(pll->base + GNRL_CTL);
421 writel_relaxed(val, pll->base + GNRL_CTL);
425 ret = clk_hw_register(NULL, hw);
427 pr_err("%s: failed to register pll %s %d\n",
428 __func__, name, ret);