Lines Matching refs:pll
37 #include "clk-pll.h"
45 static int __pll_round_closest_mult(struct meson_clk_pll_data *pll)
47 if ((pll->flags & CLK_MESON_PLL_ROUND_CLOSEST) &&
48 !MESON_PARM_APPLICABLE(&pll->frac))
57 struct meson_clk_pll_data *pll)
61 if (frac && MESON_PARM_APPLICABLE(&pll->frac)) {
65 (1 << pll->frac.width));
75 struct meson_clk_pll_data *pll = meson_clk_pll_data(clk);
78 n = meson_parm_read(clk->map, &pll->n);
88 m = meson_parm_read(clk->map, &pll->m);
90 frac = MESON_PARM_APPLICABLE(&pll->frac) ?
91 meson_parm_read(clk->map, &pll->frac) :
94 return __pll_params_to_rate(parent_rate, m, n, frac, pll);
101 struct meson_clk_pll_data *pll)
103 unsigned int frac_max = (1 << pll->frac.width);
110 if (pll->flags & CLK_MESON_PLL_ROUND_CLOSEST)
123 struct meson_clk_pll_data *pll)
125 if (__pll_round_closest_mult(pll)) {
141 struct meson_clk_pll_data *pll)
143 if (!pll->table[index].n)
146 *m = pll->table[index].m;
147 *n = pll->table[index].n;
155 struct meson_clk_pll_data *pll)
159 if (__pll_round_closest_mult(pll))
170 struct meson_clk_pll_data *pll)
175 if (*n >= (1 << pll->n.width))
180 if (rate <= pll->range->min * parent_rate) {
181 *m = pll->range->min;
183 } else if (rate >= pll->range->max * parent_rate) {
184 *m = pll->range->max;
189 *m = meson_clk_get_pll_range_m(rate, parent_rate, *n, pll);
192 if (*m >= (1 << pll->m.width))
203 struct meson_clk_pll_data *pll)
205 if (pll->range)
207 index, m, n, pll);
208 else if (pll->table)
209 return meson_clk_get_pll_table_index(index, m, n, pll);
218 struct meson_clk_pll_data *pll)
226 i, &m, &n, pll);
230 now = __pll_params_to_rate(parent_rate, m, n, 0, pll);
231 if (meson_clk_pll_is_better(rate, best, now, pll)) {
248 struct meson_clk_pll_data *pll = meson_clk_pll_data(clk);
254 &m, &n, pll);
258 round = __pll_params_to_rate(req->best_parent_rate, m, n, 0, pll);
260 if (!MESON_PARM_APPLICABLE(&pll->frac) || req->rate == round) {
269 frac = __pll_params_with_frac(req->rate, req->best_parent_rate, m, n, pll);
270 req->rate = __pll_params_to_rate(req->best_parent_rate, m, n, frac, pll);
278 struct meson_clk_pll_data *pll = meson_clk_pll_data(clk);
283 if (meson_parm_read(clk->map, &pll->l))
295 struct meson_clk_pll_data *pll = meson_clk_pll_data(clk);
297 if (pll->init_count) {
298 if (MESON_PARM_APPLICABLE(&pll->rst))
299 meson_parm_write(clk->map, &pll->rst, 1);
301 regmap_multi_reg_write(clk->map, pll->init_regs,
302 pll->init_count);
304 if (MESON_PARM_APPLICABLE(&pll->rst))
305 meson_parm_write(clk->map, &pll->rst, 0);
314 struct meson_clk_pll_data *pll = meson_clk_pll_data(clk);
316 if (MESON_PARM_APPLICABLE(&pll->rst) &&
317 meson_parm_read(clk->map, &pll->rst))
320 if (!meson_parm_read(clk->map, &pll->en) ||
321 !meson_parm_read(clk->map, &pll->l))
344 struct meson_clk_pll_data *pll = meson_clk_pll_data(clk);
350 /* Make sure the pll is in reset */
351 if (MESON_PARM_APPLICABLE(&pll->rst))
352 meson_parm_write(clk->map, &pll->rst, 1);
354 /* Enable the pll */
355 meson_parm_write(clk->map, &pll->en, 1);
357 /* Take the pll out reset */
358 if (MESON_PARM_APPLICABLE(&pll->rst))
359 meson_parm_write(clk->map, &pll->rst, 0);
365 * 1. enable the pll, delay for 10us
366 * 2. enable the pll self-adaption current module, delay for 40us
369 if (MESON_PARM_APPLICABLE(&pll->current_en)) {
371 meson_parm_write(clk->map, &pll->current_en, 1);
375 if (MESON_PARM_APPLICABLE(&pll->l_detect)) {
376 meson_parm_write(clk->map, &pll->l_detect, 1);
377 meson_parm_write(clk->map, &pll->l_detect, 0);
389 struct meson_clk_pll_data *pll = meson_clk_pll_data(clk);
391 /* Put the pll is in reset */
392 if (MESON_PARM_APPLICABLE(&pll->rst))
393 meson_parm_write(clk->map, &pll->rst, 1);
395 /* Disable the pll */
396 meson_parm_write(clk->map, &pll->en, 0);
399 if (MESON_PARM_APPLICABLE(&pll->current_en))
400 meson_parm_write(clk->map, &pll->current_en, 0);
407 struct meson_clk_pll_data *pll = meson_clk_pll_data(clk);
417 ret = meson_clk_get_pll_settings(rate, parent_rate, &m, &n, pll);
421 enabled = meson_parm_read(clk->map, &pll->en);
425 meson_parm_write(clk->map, &pll->n, n);
426 meson_parm_write(clk->map, &pll->m, m);
428 if (MESON_PARM_APPLICABLE(&pll->frac)) {
429 frac = __pll_params_with_frac(rate, parent_rate, m, n, pll);
430 meson_parm_write(clk->map, &pll->frac, frac);
433 /* If the pll is stopped, bail out now */
439 pr_warn("%s: pll did not lock, trying to restore old rate %lu\n",