Lines Matching refs:pll
71 struct iproc_pll *pll; member
96 static int pll_get_rate_index(struct iproc_pll *pll, unsigned int target_rate) in pll_get_rate_index() argument
100 for (i = 0; i < pll->num_vco_entries; i++) in pll_get_rate_index()
101 if (target_rate == pll->vco_param[i].rate) in pll_get_rate_index()
104 if (i >= pll->num_vco_entries) in pll_get_rate_index()
125 static int pll_wait_for_lock(struct iproc_pll *pll) in pll_wait_for_lock() argument
128 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in pll_wait_for_lock()
131 u32 val = readl(pll->status_base + ctrl->status.offset); in pll_wait_for_lock()
141 static void iproc_pll_write(const struct iproc_pll *pll, void __iomem *base, in iproc_pll_write() argument
144 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in iproc_pll_write()
149 (base == pll->status_base || base == pll->control_base))) in iproc_pll_write()
153 static void __pll_disable(struct iproc_pll *pll) in __pll_disable() argument
155 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in __pll_disable()
159 val = readl(pll->asiu_base + ctrl->asiu.offset); in __pll_disable()
161 iproc_pll_write(pll, pll->asiu_base, ctrl->asiu.offset, val); in __pll_disable()
165 val = readl(pll->control_base + ctrl->aon.offset); in __pll_disable()
167 iproc_pll_write(pll, pll->control_base, ctrl->aon.offset, val); in __pll_disable()
170 if (pll->pwr_base) { in __pll_disable()
172 val = readl(pll->pwr_base + ctrl->aon.offset); in __pll_disable()
174 iproc_pll_write(pll, pll->pwr_base, ctrl->aon.offset, val); in __pll_disable()
178 iproc_pll_write(pll, pll->pwr_base, ctrl->aon.offset, val); in __pll_disable()
182 static int __pll_enable(struct iproc_pll *pll) in __pll_enable() argument
184 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in __pll_enable()
188 val = readl(pll->control_base + ctrl->aon.offset); in __pll_enable()
190 iproc_pll_write(pll, pll->control_base, ctrl->aon.offset, val); in __pll_enable()
193 if (pll->pwr_base) { in __pll_enable()
195 val = readl(pll->pwr_base + ctrl->aon.offset); in __pll_enable()
198 iproc_pll_write(pll, pll->pwr_base, ctrl->aon.offset, val); in __pll_enable()
203 val = readl(pll->asiu_base + ctrl->asiu.offset); in __pll_enable()
205 iproc_pll_write(pll, pll->asiu_base, ctrl->asiu.offset, val); in __pll_enable()
211 static void __pll_put_in_reset(struct iproc_pll *pll) in __pll_put_in_reset() argument
214 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in __pll_put_in_reset()
217 val = readl(pll->control_base + reset->offset); in __pll_put_in_reset()
219 iproc_pll_write(pll, pll->control_base, reset->offset, val); in __pll_put_in_reset()
222 static void __pll_bring_out_reset(struct iproc_pll *pll, unsigned int kp, in __pll_bring_out_reset() argument
226 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in __pll_bring_out_reset()
230 val = readl(pll->control_base + dig_filter->offset); in __pll_bring_out_reset()
236 iproc_pll_write(pll, pll->control_base, dig_filter->offset, val); in __pll_bring_out_reset()
238 val = readl(pll->control_base + reset->offset); in __pll_bring_out_reset()
240 iproc_pll_write(pll, pll->control_base, reset->offset, val); in __pll_bring_out_reset()
246 struct iproc_pll *pll = clk->pll; in pll_set_rate() local
247 const struct iproc_pll_vco_param *vco = &pll->vco_param[rate_index]; in pll_set_rate()
248 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in pll_set_rate()
286 ret = __pll_enable(pll); in pll_set_rate()
293 __pll_put_in_reset(pll); in pll_set_rate()
295 iproc_pll_write(pll, pll->control_base, ctrl->vco_ctrl.u_offset, 0); in pll_set_rate()
297 val = readl(pll->control_base + ctrl->vco_ctrl.l_offset); in pll_set_rate()
307 iproc_pll_write(pll, pll->control_base, ctrl->vco_ctrl.l_offset, val); in pll_set_rate()
310 val = readl(pll->control_base + ctrl->ndiv_int.offset); in pll_set_rate()
313 iproc_pll_write(pll, pll->control_base, ctrl->ndiv_int.offset, val); in pll_set_rate()
317 val = readl(pll->control_base + ctrl->ndiv_frac.offset); in pll_set_rate()
321 iproc_pll_write(pll, pll->control_base, ctrl->ndiv_frac.offset, in pll_set_rate()
326 val = readl(pll->control_base + ctrl->pdiv.offset); in pll_set_rate()
329 iproc_pll_write(pll, pll->control_base, ctrl->pdiv.offset, val); in pll_set_rate()
331 __pll_bring_out_reset(pll, kp, ka, ki); in pll_set_rate()
333 ret = pll_wait_for_lock(pll); in pll_set_rate()
345 struct iproc_pll *pll = clk->pll; in iproc_pll_enable() local
347 return __pll_enable(pll); in iproc_pll_enable()
353 struct iproc_pll *pll = clk->pll; in iproc_pll_disable() local
354 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in iproc_pll_disable()
359 __pll_disable(pll); in iproc_pll_disable()
366 struct iproc_pll *pll = clk->pll; in iproc_pll_recalc_rate() local
367 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in iproc_pll_recalc_rate()
376 val = readl(pll->status_base + ctrl->status.offset); in iproc_pll_recalc_rate()
387 val = readl(pll->control_base + ctrl->ndiv_int.offset); in iproc_pll_recalc_rate()
393 val = readl(pll->control_base + ctrl->ndiv_frac.offset); in iproc_pll_recalc_rate()
399 val = readl(pll->control_base + ctrl->pdiv.offset); in iproc_pll_recalc_rate()
417 struct iproc_pll *pll = clk->pll; in iproc_pll_round_rate() local
419 if (rate == 0 || *parent_rate == 0 || !pll->vco_param) in iproc_pll_round_rate()
422 for (i = 0; i < pll->num_vco_entries; i++) { in iproc_pll_round_rate()
423 if (rate <= pll->vco_param[i].rate) in iproc_pll_round_rate()
427 if (i == pll->num_vco_entries) in iproc_pll_round_rate()
430 return pll->vco_param[i].rate; in iproc_pll_round_rate()
437 struct iproc_pll *pll = clk->pll; in iproc_pll_set_rate() local
440 rate_index = pll_get_rate_index(pll, rate); in iproc_pll_set_rate()
460 struct iproc_pll *pll = clk->pll; in iproc_clk_enable() local
464 val = readl(pll->control_base + ctrl->enable.offset); in iproc_clk_enable()
466 iproc_pll_write(pll, pll->control_base, ctrl->enable.offset, val); in iproc_clk_enable()
469 val = readl(pll->control_base + ctrl->enable.offset); in iproc_clk_enable()
471 iproc_pll_write(pll, pll->control_base, ctrl->enable.offset, val); in iproc_clk_enable()
480 struct iproc_pll *pll = clk->pll; in iproc_clk_disable() local
486 val = readl(pll->control_base + ctrl->enable.offset); in iproc_clk_disable()
488 iproc_pll_write(pll, pll->control_base, ctrl->enable.offset, val); in iproc_clk_disable()
496 struct iproc_pll *pll = clk->pll; in iproc_clk_recalc_rate() local
503 val = readl(pll->control_base + ctrl->mdiv.offset); in iproc_clk_recalc_rate()
539 struct iproc_pll *pll = clk->pll; in iproc_clk_set_rate() local
550 val = readl(pll->control_base + ctrl->mdiv.offset); in iproc_clk_set_rate()
557 iproc_pll_write(pll, pll->control_base, ctrl->mdiv.offset, val); in iproc_clk_set_rate()
575 static void iproc_pll_sw_cfg(struct iproc_pll *pll) in iproc_pll_sw_cfg() argument
577 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in iproc_pll_sw_cfg()
582 val = readl(pll->control_base + ctrl->sw_ctrl.offset); in iproc_pll_sw_cfg()
584 iproc_pll_write(pll, pll->control_base, ctrl->sw_ctrl.offset, in iproc_pll_sw_cfg()
598 struct iproc_pll *pll; in iproc_pll_clk_setup() local
606 pll = kzalloc(sizeof(*pll), GFP_KERNEL); in iproc_pll_clk_setup()
607 if (WARN_ON(!pll)) in iproc_pll_clk_setup()
610 pll->clk_data.clk_num = num_clks; in iproc_pll_clk_setup()
611 pll->clk_data.clks = kcalloc(num_clks, sizeof(*pll->clk_data.clks), in iproc_pll_clk_setup()
613 if (WARN_ON(!pll->clk_data.clks)) in iproc_pll_clk_setup()
616 pll->clks = kcalloc(num_clks, sizeof(*pll->clks), GFP_KERNEL); in iproc_pll_clk_setup()
617 if (WARN_ON(!pll->clks)) in iproc_pll_clk_setup()
620 pll->control_base = of_iomap(node, 0); in iproc_pll_clk_setup()
621 if (WARN_ON(!pll->control_base)) in iproc_pll_clk_setup()
625 pll->pwr_base = of_iomap(node, 1); in iproc_pll_clk_setup()
629 pll->asiu_base = of_iomap(node, 2); in iproc_pll_clk_setup()
630 if (WARN_ON(!pll->asiu_base)) in iproc_pll_clk_setup()
638 pll->status_base = of_iomap(node, 2); in iproc_pll_clk_setup()
639 if (!pll->status_base) in iproc_pll_clk_setup()
642 pll->status_base = pll->control_base; in iproc_pll_clk_setup()
645 pll->ctrl = pll_ctrl; in iproc_pll_clk_setup()
647 iclk = &pll->clks[0]; in iproc_pll_clk_setup()
648 iclk->pll = pll; in iproc_pll_clk_setup()
660 pll->num_vco_entries = num_vco_entries; in iproc_pll_clk_setup()
661 pll->vco_param = vco; in iproc_pll_clk_setup()
664 iproc_pll_sw_cfg(pll); in iproc_pll_clk_setup()
670 pll->clk_data.clks[0] = clk; in iproc_pll_clk_setup()
684 iclk = &pll->clks[i]; in iproc_pll_clk_setup()
686 iclk->pll = pll; in iproc_pll_clk_setup()
700 pll->clk_data.clks[i] = clk; in iproc_pll_clk_setup()
703 ret = of_clk_add_provider(node, of_clk_src_onecell_get, &pll->clk_data); in iproc_pll_clk_setup()
711 clk_unregister(pll->clk_data.clks[i]); in iproc_pll_clk_setup()
714 if (pll->status_base != pll->control_base) in iproc_pll_clk_setup()
715 iounmap(pll->status_base); in iproc_pll_clk_setup()
718 if (pll->asiu_base) in iproc_pll_clk_setup()
719 iounmap(pll->asiu_base); in iproc_pll_clk_setup()
722 if (pll->pwr_base) in iproc_pll_clk_setup()
723 iounmap(pll->pwr_base); in iproc_pll_clk_setup()
725 iounmap(pll->control_base); in iproc_pll_clk_setup()
728 kfree(pll->clks); in iproc_pll_clk_setup()
731 kfree(pll->clk_data.clks); in iproc_pll_clk_setup()
734 kfree(pll); in iproc_pll_clk_setup()