Lines Matching +full:pll +full:-

1 // SPDX-License-Identifier: GPL-2.0
7 #include <linux/clk-provider.h>
89 imx_get_pll_settings(struct clk_fracn_gppll *pll, unsigned long rate) in imx_get_pll_settings() argument
91 const struct imx_fracn_gppll_rate_table *rate_table = pll->rate_table; in imx_get_pll_settings()
94 for (i = 0; i < pll->rate_count; i++) in imx_get_pll_settings()
104 struct clk_fracn_gppll *pll = to_clk_fracn_gppll(hw); in clk_fracn_gppll_round_rate() local
105 const struct imx_fracn_gppll_rate_table *rate_table = pll->rate_table; in clk_fracn_gppll_round_rate()
109 for (i = 0; i < pll->rate_count; i++) in clk_fracn_gppll_round_rate()
114 return rate_table[pll->rate_count - 1].rate; in clk_fracn_gppll_round_rate()
119 struct clk_fracn_gppll *pll = to_clk_fracn_gppll(hw); in clk_fracn_gppll_recalc_rate() local
120 const struct imx_fracn_gppll_rate_table *rate_table = pll->rate_table; in clk_fracn_gppll_recalc_rate()
127 pll_numerator = readl_relaxed(pll->base + PLL_NUMERATOR); in clk_fracn_gppll_recalc_rate()
130 pll_denominator = readl_relaxed(pll->base + PLL_DENOMINATOR); in clk_fracn_gppll_recalc_rate()
133 pll_div = readl_relaxed(pll->base + PLL_DIV); in clk_fracn_gppll_recalc_rate()
141 * the frac part. So find the accurate pll rate from the table in clk_fracn_gppll_recalc_rate()
145 for (i = 0; i < pll->rate_count; i++) { in clk_fracn_gppll_recalc_rate()
176 static int clk_fracn_gppll_wait_lock(struct clk_fracn_gppll *pll) in clk_fracn_gppll_wait_lock() argument
180 return readl_poll_timeout(pll->base + PLL_STATUS, val, in clk_fracn_gppll_wait_lock()
187 struct clk_fracn_gppll *pll = to_clk_fracn_gppll(hw); in clk_fracn_gppll_set_rate() local
192 rate = imx_get_pll_settings(pll, drate); in clk_fracn_gppll_set_rate()
195 tmp = readl_relaxed(pll->base + PLL_CTRL); in clk_fracn_gppll_set_rate()
197 writel_relaxed(tmp, pll->base + PLL_CTRL); in clk_fracn_gppll_set_rate()
201 writel_relaxed(tmp, pll->base + PLL_CTRL); in clk_fracn_gppll_set_rate()
205 writel_relaxed(tmp, pll->base + PLL_CTRL); in clk_fracn_gppll_set_rate()
207 pll_div = FIELD_PREP(PLL_RDIV_MASK, rate->rdiv) | rate->odiv | in clk_fracn_gppll_set_rate()
208 FIELD_PREP(PLL_MFI_MASK, rate->mfi); in clk_fracn_gppll_set_rate()
209 writel_relaxed(pll_div, pll->base + PLL_DIV); in clk_fracn_gppll_set_rate()
210 writel_relaxed(rate->mfd, pll->base + PLL_DENOMINATOR); in clk_fracn_gppll_set_rate()
211 writel_relaxed(FIELD_PREP(PLL_MFN_MASK, rate->mfn), pll->base + PLL_NUMERATOR); in clk_fracn_gppll_set_rate()
213 /* Wait for 5us according to fracn mode pll doc */ in clk_fracn_gppll_set_rate()
218 writel_relaxed(tmp, pll->base + PLL_CTRL); in clk_fracn_gppll_set_rate()
221 ret = clk_fracn_gppll_wait_lock(pll); in clk_fracn_gppll_set_rate()
227 writel_relaxed(tmp, pll->base + PLL_CTRL); in clk_fracn_gppll_set_rate()
229 ana_mfn = readl_relaxed(pll->base + PLL_STATUS); in clk_fracn_gppll_set_rate()
232 WARN(ana_mfn != rate->mfn, "ana_mfn != rate->mfn\n"); in clk_fracn_gppll_set_rate()
239 struct clk_fracn_gppll *pll = to_clk_fracn_gppll(hw); in clk_fracn_gppll_prepare() local
243 val = readl_relaxed(pll->base + PLL_CTRL); in clk_fracn_gppll_prepare()
248 writel_relaxed(val, pll->base + PLL_CTRL); in clk_fracn_gppll_prepare()
251 writel_relaxed(val, pll->base + PLL_CTRL); in clk_fracn_gppll_prepare()
254 writel_relaxed(val, pll->base + PLL_CTRL); in clk_fracn_gppll_prepare()
256 ret = clk_fracn_gppll_wait_lock(pll); in clk_fracn_gppll_prepare()
261 writel_relaxed(val, pll->base + PLL_CTRL); in clk_fracn_gppll_prepare()
268 struct clk_fracn_gppll *pll = to_clk_fracn_gppll(hw); in clk_fracn_gppll_is_prepared() local
271 val = readl_relaxed(pll->base + PLL_CTRL); in clk_fracn_gppll_is_prepared()
278 struct clk_fracn_gppll *pll = to_clk_fracn_gppll(hw); in clk_fracn_gppll_unprepare() local
281 val = readl_relaxed(pll->base + PLL_CTRL); in clk_fracn_gppll_unprepare()
283 writel_relaxed(val, pll->base + PLL_CTRL); in clk_fracn_gppll_unprepare()
298 struct clk_fracn_gppll *pll; in imx_clk_fracn_gppll() local
303 pll = kzalloc(sizeof(*pll), GFP_KERNEL); in imx_clk_fracn_gppll()
304 if (!pll) in imx_clk_fracn_gppll()
305 return ERR_PTR(-ENOMEM); in imx_clk_fracn_gppll()
308 init.flags = pll_clk->flags; in imx_clk_fracn_gppll()
313 pll->base = base; in imx_clk_fracn_gppll()
314 pll->hw.init = &init; in imx_clk_fracn_gppll()
315 pll->rate_table = pll_clk->rate_table; in imx_clk_fracn_gppll()
316 pll->rate_count = pll_clk->rate_count; in imx_clk_fracn_gppll()
318 hw = &pll->hw; in imx_clk_fracn_gppll()
322 pr_err("%s: failed to register pll %s %d\n", __func__, name, ret); in imx_clk_fracn_gppll()
323 kfree(pll); in imx_clk_fracn_gppll()