• Home
  • Raw
  • Download

Lines Matching refs:pll

85 	struct iproc_pll *pll;  member
128 static int pll_get_rate_index(struct iproc_pll *pll, unsigned int target_rate) in pll_get_rate_index() argument
132 for (i = 0; i < pll->num_vco_entries; i++) in pll_get_rate_index()
133 if (target_rate == pll->vco_param[i].rate) in pll_get_rate_index()
136 if (i >= pll->num_vco_entries) in pll_get_rate_index()
157 static int pll_wait_for_lock(struct iproc_pll *pll) in pll_wait_for_lock() argument
160 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in pll_wait_for_lock()
163 u32 val = readl(pll->status_base + ctrl->status.offset); in pll_wait_for_lock()
173 static void iproc_pll_write(const struct iproc_pll *pll, void __iomem *base, in iproc_pll_write() argument
176 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in iproc_pll_write()
181 (base == pll->status_base || base == pll->control_base))) in iproc_pll_write()
185 static void __pll_disable(struct iproc_pll *pll) in __pll_disable() argument
187 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in __pll_disable()
191 val = readl(pll->asiu_base + ctrl->asiu.offset); in __pll_disable()
193 iproc_pll_write(pll, pll->asiu_base, ctrl->asiu.offset, val); in __pll_disable()
197 val = readl(pll->control_base + ctrl->aon.offset); in __pll_disable()
199 iproc_pll_write(pll, pll->control_base, ctrl->aon.offset, val); in __pll_disable()
202 if (pll->pwr_base) { in __pll_disable()
204 val = readl(pll->pwr_base + ctrl->aon.offset); in __pll_disable()
206 iproc_pll_write(pll, pll->pwr_base, ctrl->aon.offset, val); in __pll_disable()
210 iproc_pll_write(pll, pll->pwr_base, ctrl->aon.offset, val); in __pll_disable()
214 static int __pll_enable(struct iproc_pll *pll) in __pll_enable() argument
216 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in __pll_enable()
220 val = readl(pll->control_base + ctrl->aon.offset); in __pll_enable()
222 iproc_pll_write(pll, pll->control_base, ctrl->aon.offset, val); in __pll_enable()
225 if (pll->pwr_base) { in __pll_enable()
227 val = readl(pll->pwr_base + ctrl->aon.offset); in __pll_enable()
230 iproc_pll_write(pll, pll->pwr_base, ctrl->aon.offset, val); in __pll_enable()
235 val = readl(pll->asiu_base + ctrl->asiu.offset); in __pll_enable()
237 iproc_pll_write(pll, pll->asiu_base, ctrl->asiu.offset, val); in __pll_enable()
243 static void __pll_put_in_reset(struct iproc_pll *pll) in __pll_put_in_reset() argument
246 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in __pll_put_in_reset()
249 val = readl(pll->control_base + reset->offset); in __pll_put_in_reset()
254 iproc_pll_write(pll, pll->control_base, reset->offset, val); in __pll_put_in_reset()
257 static void __pll_bring_out_reset(struct iproc_pll *pll, unsigned int kp, in __pll_bring_out_reset() argument
261 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in __pll_bring_out_reset()
265 val = readl(pll->control_base + dig_filter->offset); in __pll_bring_out_reset()
271 iproc_pll_write(pll, pll->control_base, dig_filter->offset, val); in __pll_bring_out_reset()
273 val = readl(pll->control_base + reset->offset); in __pll_bring_out_reset()
278 iproc_pll_write(pll, pll->control_base, reset->offset, val); in __pll_bring_out_reset()
286 static bool pll_fractional_change_only(struct iproc_pll *pll, in pll_fractional_change_only() argument
289 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in pll_fractional_change_only()
295 val = readl(pll->status_base + ctrl->status.offset); in pll_fractional_change_only()
299 val = readl(pll->control_base + ctrl->ndiv_int.offset); in pll_fractional_change_only()
306 val = readl(pll->control_base + ctrl->pdiv.offset); in pll_fractional_change_only()
318 struct iproc_pll *pll = clk->pll; in pll_set_rate() local
319 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in pll_set_rate()
358 ret = __pll_enable(pll); in pll_set_rate()
364 if (pll_fractional_change_only(clk->pll, vco)) { in pll_set_rate()
367 val = readl(pll->control_base + ctrl->ndiv_frac.offset); in pll_set_rate()
371 iproc_pll_write(pll, pll->control_base, in pll_set_rate()
378 __pll_put_in_reset(pll); in pll_set_rate()
382 val = readl(pll->control_base + ctrl->macro_mode.offset); in pll_set_rate()
386 iproc_pll_write(pll, pll->control_base, in pll_set_rate()
390 iproc_pll_write(pll, pll->control_base, ctrl->vco_ctrl.u_offset, 0); in pll_set_rate()
392 val = readl(pll->control_base + ctrl->vco_ctrl.l_offset); in pll_set_rate()
402 iproc_pll_write(pll, pll->control_base, ctrl->vco_ctrl.l_offset, val); in pll_set_rate()
405 val = readl(pll->control_base + ctrl->ndiv_int.offset); in pll_set_rate()
408 iproc_pll_write(pll, pll->control_base, ctrl->ndiv_int.offset, val); in pll_set_rate()
412 val = readl(pll->control_base + ctrl->ndiv_frac.offset); in pll_set_rate()
416 iproc_pll_write(pll, pll->control_base, ctrl->ndiv_frac.offset, in pll_set_rate()
421 val = readl(pll->control_base + ctrl->pdiv.offset); in pll_set_rate()
424 iproc_pll_write(pll, pll->control_base, ctrl->pdiv.offset, val); in pll_set_rate()
426 __pll_bring_out_reset(pll, kp, ka, ki); in pll_set_rate()
428 ret = pll_wait_for_lock(pll); in pll_set_rate()
440 struct iproc_pll *pll = clk->pll; in iproc_pll_enable() local
442 return __pll_enable(pll); in iproc_pll_enable()
448 struct iproc_pll *pll = clk->pll; in iproc_pll_disable() local
449 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in iproc_pll_disable()
454 __pll_disable(pll); in iproc_pll_disable()
461 struct iproc_pll *pll = clk->pll; in iproc_pll_recalc_rate() local
462 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in iproc_pll_recalc_rate()
472 val = readl(pll->status_base + ctrl->status.offset); in iproc_pll_recalc_rate()
481 val = readl(pll->control_base + ctrl->ndiv_int.offset); in iproc_pll_recalc_rate()
487 val = readl(pll->control_base + ctrl->ndiv_frac.offset); in iproc_pll_recalc_rate()
493 val = readl(pll->control_base + ctrl->pdiv.offset); in iproc_pll_recalc_rate()
511 struct iproc_pll *pll = clk->pll; in iproc_pll_determine_rate() local
512 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in iproc_pll_determine_rate()
532 if (!pll->vco_param) in iproc_pll_determine_rate()
536 for (i = 0; i < pll->num_vco_entries; i++) { in iproc_pll_determine_rate()
537 diff = abs(req->rate - pll->vco_param[i].rate); in iproc_pll_determine_rate()
547 req->rate = pll->vco_param[best_idx].rate; in iproc_pll_determine_rate()
556 struct iproc_pll *pll = clk->pll; in iproc_pll_set_rate() local
557 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in iproc_pll_set_rate()
566 rate_index = pll_get_rate_index(pll, rate); in iproc_pll_set_rate()
570 vco_param = pll->vco_param[rate_index]; in iproc_pll_set_rate()
589 struct iproc_pll *pll = clk->pll; in iproc_clk_enable() local
593 val = readl(pll->control_base + ctrl->enable.offset); in iproc_clk_enable()
595 iproc_pll_write(pll, pll->control_base, ctrl->enable.offset, val); in iproc_clk_enable()
598 val = readl(pll->control_base + ctrl->enable.offset); in iproc_clk_enable()
600 iproc_pll_write(pll, pll->control_base, ctrl->enable.offset, val); in iproc_clk_enable()
609 struct iproc_pll *pll = clk->pll; in iproc_clk_disable() local
615 val = readl(pll->control_base + ctrl->enable.offset); in iproc_clk_disable()
617 iproc_pll_write(pll, pll->control_base, ctrl->enable.offset, val); in iproc_clk_disable()
625 struct iproc_pll *pll = clk->pll; in iproc_clk_recalc_rate() local
633 val = readl(pll->control_base + ctrl->mdiv.offset); in iproc_clk_recalc_rate()
673 struct iproc_pll *pll = clk->pll; in iproc_clk_set_rate() local
687 val = readl(pll->control_base + ctrl->mdiv.offset); in iproc_clk_set_rate()
694 iproc_pll_write(pll, pll->control_base, ctrl->mdiv.offset, val); in iproc_clk_set_rate()
711 static void iproc_pll_sw_cfg(struct iproc_pll *pll) in iproc_pll_sw_cfg() argument
713 const struct iproc_pll_ctrl *ctrl = pll->ctrl; in iproc_pll_sw_cfg()
718 val = readl(pll->control_base + ctrl->sw_ctrl.offset); in iproc_pll_sw_cfg()
720 iproc_pll_write(pll, pll->control_base, ctrl->sw_ctrl.offset, in iproc_pll_sw_cfg()
733 struct iproc_pll *pll; in iproc_pll_clk_setup() local
744 pll = kzalloc(sizeof(*pll), GFP_KERNEL); in iproc_pll_clk_setup()
745 if (WARN_ON(!pll)) in iproc_pll_clk_setup()
757 pll->control_base = of_iomap(node, 0); in iproc_pll_clk_setup()
758 if (WARN_ON(!pll->control_base)) in iproc_pll_clk_setup()
762 pll->pwr_base = of_iomap(node, 1); in iproc_pll_clk_setup()
766 pll->asiu_base = of_iomap(node, 2); in iproc_pll_clk_setup()
767 if (WARN_ON(!pll->asiu_base)) in iproc_pll_clk_setup()
775 pll->status_base = of_iomap(node, 2); in iproc_pll_clk_setup()
776 if (!pll->status_base) in iproc_pll_clk_setup()
779 pll->status_base = pll->control_base; in iproc_pll_clk_setup()
782 pll->ctrl = pll_ctrl; in iproc_pll_clk_setup()
785 iclk->pll = pll; in iproc_pll_clk_setup()
801 pll->num_vco_entries = num_vco_entries; in iproc_pll_clk_setup()
802 pll->vco_param = vco; in iproc_pll_clk_setup()
805 iproc_pll_sw_cfg(pll); in iproc_pll_clk_setup()
824 iclk->pll = pll; in iproc_pll_clk_setup()
852 if (pll->status_base != pll->control_base) in iproc_pll_clk_setup()
853 iounmap(pll->status_base); in iproc_pll_clk_setup()
856 if (pll->asiu_base) in iproc_pll_clk_setup()
857 iounmap(pll->asiu_base); in iproc_pll_clk_setup()
860 if (pll->pwr_base) in iproc_pll_clk_setup()
861 iounmap(pll->pwr_base); in iproc_pll_clk_setup()
863 iounmap(pll->control_base); in iproc_pll_clk_setup()
872 kfree(pll); in iproc_pll_clk_setup()