Lines Matching refs:pll
46 static int __pll_round_closest_mult(struct meson_clk_pll_data *pll) in __pll_round_closest_mult() argument
48 if ((pll->flags & CLK_MESON_PLL_ROUND_CLOSEST) && in __pll_round_closest_mult()
49 !MESON_PARM_APPLICABLE(&pll->frac)) in __pll_round_closest_mult()
58 struct meson_clk_pll_data *pll) in __pll_params_to_rate() argument
62 if (frac && MESON_PARM_APPLICABLE(&pll->frac)) { in __pll_params_to_rate()
66 (1 << pll->frac.width)); in __pll_params_to_rate()
76 struct meson_clk_pll_data *pll = meson_clk_pll_data(clk); in meson_clk_pll_recalc_rate() local
79 n = meson_parm_read(clk->map, &pll->n); in meson_clk_pll_recalc_rate()
89 m = meson_parm_read(clk->map, &pll->m); in meson_clk_pll_recalc_rate()
91 frac = MESON_PARM_APPLICABLE(&pll->frac) ? in meson_clk_pll_recalc_rate()
92 meson_parm_read(clk->map, &pll->frac) : in meson_clk_pll_recalc_rate()
95 return __pll_params_to_rate(parent_rate, m, n, frac, pll); in meson_clk_pll_recalc_rate()
102 struct meson_clk_pll_data *pll) in __pll_params_with_frac() argument
104 unsigned int frac_max = (1 << pll->frac.width); in __pll_params_with_frac()
111 if (pll->flags & CLK_MESON_PLL_ROUND_CLOSEST) in __pll_params_with_frac()
124 struct meson_clk_pll_data *pll) in meson_clk_pll_is_better() argument
126 if (__pll_round_closest_mult(pll)) { in meson_clk_pll_is_better()
142 struct meson_clk_pll_data *pll) in meson_clk_get_pll_table_index() argument
144 if (!pll->table[index].n) in meson_clk_get_pll_table_index()
147 *m = pll->table[index].m; in meson_clk_get_pll_table_index()
148 *n = pll->table[index].n; in meson_clk_get_pll_table_index()
156 struct meson_clk_pll_data *pll) in meson_clk_get_pll_range_m() argument
160 if (__pll_round_closest_mult(pll)) in meson_clk_get_pll_range_m()
171 struct meson_clk_pll_data *pll) in meson_clk_get_pll_range_index() argument
176 if (*n >= (1 << pll->n.width)) in meson_clk_get_pll_range_index()
181 if (rate <= pll->range->min * parent_rate) { in meson_clk_get_pll_range_index()
182 *m = pll->range->min; in meson_clk_get_pll_range_index()
184 } else if (rate >= pll->range->max * parent_rate) { in meson_clk_get_pll_range_index()
185 *m = pll->range->max; in meson_clk_get_pll_range_index()
190 *m = meson_clk_get_pll_range_m(rate, parent_rate, *n, pll); in meson_clk_get_pll_range_index()
193 if (*m >= (1 << pll->m.width)) in meson_clk_get_pll_range_index()
204 struct meson_clk_pll_data *pll) in meson_clk_get_pll_get_index() argument
206 if (pll->range) in meson_clk_get_pll_get_index()
208 index, m, n, pll); in meson_clk_get_pll_get_index()
209 else if (pll->table) in meson_clk_get_pll_get_index()
210 return meson_clk_get_pll_table_index(index, m, n, pll); in meson_clk_get_pll_get_index()
219 struct meson_clk_pll_data *pll) in meson_clk_get_pll_settings() argument
227 i, &m, &n, pll); in meson_clk_get_pll_settings()
231 now = __pll_params_to_rate(parent_rate, m, n, 0, pll); in meson_clk_get_pll_settings()
232 if (meson_clk_pll_is_better(rate, best, now, pll)) { in meson_clk_get_pll_settings()
249 struct meson_clk_pll_data *pll = meson_clk_pll_data(clk); in meson_clk_pll_round_rate() local
254 ret = meson_clk_get_pll_settings(rate, *parent_rate, &m, &n, pll); in meson_clk_pll_round_rate()
258 round = __pll_params_to_rate(*parent_rate, m, n, 0, pll); in meson_clk_pll_round_rate()
260 if (!MESON_PARM_APPLICABLE(&pll->frac) || rate == round) in meson_clk_pll_round_rate()
267 frac = __pll_params_with_frac(rate, *parent_rate, m, n, pll); in meson_clk_pll_round_rate()
269 return __pll_params_to_rate(*parent_rate, m, n, frac, pll); in meson_clk_pll_round_rate()
275 struct meson_clk_pll_data *pll = meson_clk_pll_data(clk); in meson_clk_pll_wait_lock() local
280 if (meson_parm_read(clk->map, &pll->l)) in meson_clk_pll_wait_lock()
292 struct meson_clk_pll_data *pll = meson_clk_pll_data(clk); in meson_clk_pll_init() local
294 if (pll->init_count) { in meson_clk_pll_init()
295 meson_parm_write(clk->map, &pll->rst, 1); in meson_clk_pll_init()
296 regmap_multi_reg_write(clk->map, pll->init_regs, in meson_clk_pll_init()
297 pll->init_count); in meson_clk_pll_init()
298 meson_parm_write(clk->map, &pll->rst, 0); in meson_clk_pll_init()
307 struct meson_clk_pll_data *pll = meson_clk_pll_data(clk); in meson_clk_pll_is_enabled() local
309 if (meson_parm_read(clk->map, &pll->rst) || in meson_clk_pll_is_enabled()
310 !meson_parm_read(clk->map, &pll->en) || in meson_clk_pll_is_enabled()
311 !meson_parm_read(clk->map, &pll->l)) in meson_clk_pll_is_enabled()
330 struct meson_clk_pll_data *pll = meson_clk_pll_data(clk); in meson_clk_pll_enable() local
337 meson_parm_write(clk->map, &pll->rst, 1); in meson_clk_pll_enable()
340 meson_parm_write(clk->map, &pll->en, 1); in meson_clk_pll_enable()
343 meson_parm_write(clk->map, &pll->rst, 0); in meson_clk_pll_enable()
354 struct meson_clk_pll_data *pll = meson_clk_pll_data(clk); in meson_clk_pll_disable() local
357 meson_parm_write(clk->map, &pll->rst, 1); in meson_clk_pll_disable()
360 meson_parm_write(clk->map, &pll->en, 0); in meson_clk_pll_disable()
367 struct meson_clk_pll_data *pll = meson_clk_pll_data(clk); in meson_clk_pll_set_rate() local
377 ret = meson_clk_get_pll_settings(rate, parent_rate, &m, &n, pll); in meson_clk_pll_set_rate()
381 enabled = meson_parm_read(clk->map, &pll->en); in meson_clk_pll_set_rate()
385 meson_parm_write(clk->map, &pll->n, n); in meson_clk_pll_set_rate()
386 meson_parm_write(clk->map, &pll->m, m); in meson_clk_pll_set_rate()
388 if (MESON_PARM_APPLICABLE(&pll->frac)) { in meson_clk_pll_set_rate()
389 frac = __pll_params_with_frac(rate, parent_rate, m, n, pll); in meson_clk_pll_set_rate()
390 meson_parm_write(clk->map, &pll->frac, frac); in meson_clk_pll_set_rate()