Lines Matching refs:pll
75 struct iproc_pll *pll;
118 static int pll_get_rate_index(struct iproc_pll *pll, unsigned int target_rate)
122 for (i = 0; i < pll->num_vco_entries; i++)
123 if (target_rate == pll->vco_param[i].rate)
126 if (i >= pll->num_vco_entries)
147 static int pll_wait_for_lock(struct iproc_pll *pll)
150 const struct iproc_pll_ctrl *ctrl = pll->ctrl;
153 u32 val = readl(pll->status_base + ctrl->status.offset);
163 static void iproc_pll_write(const struct iproc_pll *pll, void __iomem *base,
166 const struct iproc_pll_ctrl *ctrl = pll->ctrl;
171 (base == pll->status_base || base == pll->control_base)))
175 static void __pll_disable(struct iproc_pll *pll)
177 const struct iproc_pll_ctrl *ctrl = pll->ctrl;
181 val = readl(pll->asiu_base + ctrl->asiu.offset);
183 iproc_pll_write(pll, pll->asiu_base, ctrl->asiu.offset, val);
187 val = readl(pll->control_base + ctrl->aon.offset);
189 iproc_pll_write(pll, pll->control_base, ctrl->aon.offset, val);
192 if (pll->pwr_base) {
194 val = readl(pll->pwr_base + ctrl->aon.offset);
196 iproc_pll_write(pll, pll->pwr_base, ctrl->aon.offset, val);
200 iproc_pll_write(pll, pll->pwr_base, ctrl->aon.offset, val);
204 static int __pll_enable(struct iproc_pll *pll)
206 const struct iproc_pll_ctrl *ctrl = pll->ctrl;
210 val = readl(pll->control_base + ctrl->aon.offset);
212 iproc_pll_write(pll, pll->control_base, ctrl->aon.offset, val);
215 if (pll->pwr_base) {
217 val = readl(pll->pwr_base + ctrl->aon.offset);
220 iproc_pll_write(pll, pll->pwr_base, ctrl->aon.offset, val);
225 val = readl(pll->asiu_base + ctrl->asiu.offset);
227 iproc_pll_write(pll, pll->asiu_base, ctrl->asiu.offset, val);
233 static void __pll_put_in_reset(struct iproc_pll *pll)
236 const struct iproc_pll_ctrl *ctrl = pll->ctrl;
239 val = readl(pll->control_base + reset->offset);
244 iproc_pll_write(pll, pll->control_base, reset->offset, val);
247 static void __pll_bring_out_reset(struct iproc_pll *pll, unsigned int kp,
251 const struct iproc_pll_ctrl *ctrl = pll->ctrl;
255 val = readl(pll->control_base + dig_filter->offset);
261 iproc_pll_write(pll, pll->control_base, dig_filter->offset, val);
263 val = readl(pll->control_base + reset->offset);
268 iproc_pll_write(pll, pll->control_base, reset->offset, val);
276 static bool pll_fractional_change_only(struct iproc_pll *pll,
279 const struct iproc_pll_ctrl *ctrl = pll->ctrl;
285 val = readl(pll->status_base + ctrl->status.offset);
289 val = readl(pll->control_base + ctrl->ndiv_int.offset);
296 val = readl(pll->control_base + ctrl->pdiv.offset);
308 struct iproc_pll *pll = clk->pll;
309 const struct iproc_pll_ctrl *ctrl = pll->ctrl;
337 pr_err("%s: pll: %s has invalid rate: %lu\n", __func__,
344 pr_err("%s: pll: %s has invalid kp\n", __func__, clk_name);
348 ret = __pll_enable(pll);
350 pr_err("%s: pll: %s fails to enable\n", __func__, clk_name);
354 if (pll_fractional_change_only(clk->pll, vco)) {
357 val = readl(pll->control_base + ctrl->ndiv_frac.offset);
361 iproc_pll_write(pll, pll->control_base,
368 __pll_put_in_reset(pll);
372 val = readl(pll->control_base + ctrl->macro_mode.offset);
376 iproc_pll_write(pll, pll->control_base,
380 iproc_pll_write(pll, pll->control_base, ctrl->vco_ctrl.u_offset, 0);
382 val = readl(pll->control_base + ctrl->vco_ctrl.l_offset);
392 iproc_pll_write(pll, pll->control_base, ctrl->vco_ctrl.l_offset, val);
395 val = readl(pll->control_base + ctrl->ndiv_int.offset);
398 iproc_pll_write(pll, pll->control_base, ctrl->ndiv_int.offset, val);
402 val = readl(pll->control_base + ctrl->ndiv_frac.offset);
406 iproc_pll_write(pll, pll->control_base, ctrl->ndiv_frac.offset,
411 val = readl(pll->control_base + ctrl->pdiv.offset);
414 iproc_pll_write(pll, pll->control_base, ctrl->pdiv.offset, val);
416 __pll_bring_out_reset(pll, kp, ka, ki);
418 ret = pll_wait_for_lock(pll);
420 pr_err("%s: pll: %s failed to lock\n", __func__, clk_name);
430 struct iproc_pll *pll = clk->pll;
432 return __pll_enable(pll);
438 struct iproc_pll *pll = clk->pll;
439 const struct iproc_pll_ctrl *ctrl = pll->ctrl;
444 __pll_disable(pll);
451 struct iproc_pll *pll = clk->pll;
452 const struct iproc_pll_ctrl *ctrl = pll->ctrl;
462 val = readl(pll->status_base + ctrl->status.offset);
471 val = readl(pll->control_base + ctrl->ndiv_int.offset);
477 val = readl(pll->control_base + ctrl->ndiv_frac.offset);
483 val = readl(pll->control_base + ctrl->pdiv.offset);
501 struct iproc_pll *pll = clk->pll;
502 const struct iproc_pll_ctrl *ctrl = pll->ctrl;
522 if (!pll->vco_param)
526 for (i = 0; i < pll->num_vco_entries; i++) {
527 diff = abs(req->rate - pll->vco_param[i].rate);
537 req->rate = pll->vco_param[best_idx].rate;
546 struct iproc_pll *pll = clk->pll;
547 const struct iproc_pll_ctrl *ctrl = pll->ctrl;
556 rate_index = pll_get_rate_index(pll, rate);
560 vco_param = pll->vco_param[rate_index];
579 struct iproc_pll *pll = clk->pll;
583 val = readl(pll->control_base + ctrl->enable.offset);
585 iproc_pll_write(pll, pll->control_base, ctrl->enable.offset, val);
588 val = readl(pll->control_base + ctrl->enable.offset);
590 iproc_pll_write(pll, pll->control_base, ctrl->enable.offset, val);
599 struct iproc_pll *pll = clk->pll;
605 val = readl(pll->control_base + ctrl->enable.offset);
607 iproc_pll_write(pll, pll->control_base, ctrl->enable.offset, val);
615 struct iproc_pll *pll = clk->pll;
623 val = readl(pll->control_base + ctrl->mdiv.offset);
663 struct iproc_pll *pll = clk->pll;
677 val = readl(pll->control_base + ctrl->mdiv.offset);
684 iproc_pll_write(pll, pll->control_base, ctrl->mdiv.offset, val);
701 static void iproc_pll_sw_cfg(struct iproc_pll *pll)
703 const struct iproc_pll_ctrl *ctrl = pll->ctrl;
708 val = readl(pll->control_base + ctrl->sw_ctrl.offset);
710 iproc_pll_write(pll, pll->control_base, ctrl->sw_ctrl.offset,
723 struct iproc_pll *pll;
734 pll = kzalloc(sizeof(*pll), GFP_KERNEL);
735 if (WARN_ON(!pll))
747 pll->control_base = of_iomap(node, 0);
748 if (WARN_ON(!pll->control_base))
752 pll->pwr_base = of_iomap(node, 1);
756 pll->asiu_base = of_iomap(node, 2);
757 if (WARN_ON(!pll->asiu_base))
765 pll->status_base = of_iomap(node, 2);
766 if (!pll->status_base)
769 pll->status_base = pll->control_base;
772 pll->ctrl = pll_ctrl;
775 iclk->pll = pll;
791 pll->num_vco_entries = num_vco_entries;
792 pll->vco_param = vco;
795 iproc_pll_sw_cfg(pll);
814 iclk->pll = pll;
842 if (pll->status_base != pll->control_base)
843 iounmap(pll->status_base);
846 if (pll->asiu_base)
847 iounmap(pll->asiu_base);
850 if (pll->pwr_base)
851 iounmap(pll->pwr_base);
853 iounmap(pll->control_base);
862 kfree(pll);