Lines Matching refs:pll
61 static void print_pll(struct device *dev, struct smiapp_pll *pll) in print_pll() argument
63 dev_dbg(dev, "pre_pll_clk_div\t%u\n", pll->pre_pll_clk_div); in print_pll()
64 dev_dbg(dev, "pll_multiplier \t%u\n", pll->pll_multiplier); in print_pll()
65 if (!(pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS)) { in print_pll()
66 dev_dbg(dev, "op_sys_clk_div \t%u\n", pll->op.sys_clk_div); in print_pll()
67 dev_dbg(dev, "op_pix_clk_div \t%u\n", pll->op.pix_clk_div); in print_pll()
69 dev_dbg(dev, "vt_sys_clk_div \t%u\n", pll->vt.sys_clk_div); in print_pll()
70 dev_dbg(dev, "vt_pix_clk_div \t%u\n", pll->vt.pix_clk_div); in print_pll()
72 dev_dbg(dev, "ext_clk_freq_hz \t%u\n", pll->ext_clk_freq_hz); in print_pll()
73 dev_dbg(dev, "pll_ip_clk_freq_hz \t%u\n", pll->pll_ip_clk_freq_hz); in print_pll()
74 dev_dbg(dev, "pll_op_clk_freq_hz \t%u\n", pll->pll_op_clk_freq_hz); in print_pll()
75 if (!(pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS)) { in print_pll()
77 pll->op.sys_clk_freq_hz); in print_pll()
79 pll->op.pix_clk_freq_hz); in print_pll()
81 dev_dbg(dev, "vt_sys_clk_freq_hz \t%u\n", pll->vt.sys_clk_freq_hz); in print_pll()
82 dev_dbg(dev, "vt_pix_clk_freq_hz \t%u\n", pll->vt.pix_clk_freq_hz); in print_pll()
88 struct smiapp_pll *pll, in check_all_bounds() argument
93 rval = bounds_check(dev, pll->pll_ip_clk_freq_hz, in check_all_bounds()
99 dev, pll->pll_multiplier, in check_all_bounds()
104 dev, pll->pll_op_clk_freq_hz, in check_all_bounds()
129 if (pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS) in check_all_bounds()
134 dev, pll->vt.sys_clk_freq_hz, in check_all_bounds()
140 dev, pll->vt.pix_clk_freq_hz, in check_all_bounds()
162 struct smiapp_pll *pll, struct smiapp_pll_branch *op_pll, uint32_t mul, in __smiapp_pll_calculate() argument
184 dev_dbg(dev, "pre_pll_clk_div %u\n", pll->pre_pll_clk_div); in __smiapp_pll_calculate()
195 / (pll->ext_clk_freq_hz / pll->pre_pll_clk_div * mul)); in __smiapp_pll_calculate()
200 op_limits->max_sys_clk_div * pll->pre_pll_clk_div in __smiapp_pll_calculate()
212 pll->ext_clk_freq_hz / pll->pre_pll_clk_div in __smiapp_pll_calculate()
228 more_mul_factor = lcm(div, pll->pre_pll_clk_div) / div; in __smiapp_pll_calculate()
243 pll->pll_multiplier = mul * i; in __smiapp_pll_calculate()
244 op_pll->sys_clk_div = div * i / pll->pre_pll_clk_div; in __smiapp_pll_calculate()
247 pll->pll_ip_clk_freq_hz = pll->ext_clk_freq_hz in __smiapp_pll_calculate()
248 / pll->pre_pll_clk_div; in __smiapp_pll_calculate()
250 pll->pll_op_clk_freq_hz = pll->pll_ip_clk_freq_hz in __smiapp_pll_calculate()
251 * pll->pll_multiplier; in __smiapp_pll_calculate()
255 pll->pll_op_clk_freq_hz / op_pll->sys_clk_div; in __smiapp_pll_calculate()
257 op_pll->pix_clk_div = pll->bits_per_pixel; in __smiapp_pll_calculate()
263 if (pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS) { in __smiapp_pll_calculate()
276 / pll->binning_horizontal) in __smiapp_pll_calculate()
277 vt_op_binning_div = pll->binning_horizontal; in __smiapp_pll_calculate()
293 dev_dbg(dev, "scale_m: %u\n", pll->scale_m); in __smiapp_pll_calculate()
295 * pll->scale_n, in __smiapp_pll_calculate()
297 * pll->scale_m); in __smiapp_pll_calculate()
302 DIV_ROUND_UP(pll->pll_op_clk_freq_hz, in __smiapp_pll_calculate()
314 DIV_ROUND_UP(pll->pll_op_clk_freq_hz, in __smiapp_pll_calculate()
330 pll->pll_op_clk_freq_hz in __smiapp_pll_calculate()
343 DIV_ROUND_UP(pll->pll_op_clk_freq_hz, in __smiapp_pll_calculate()
378 pll->vt.sys_clk_div = DIV_ROUND_UP(min_vt_div, best_pix_div); in __smiapp_pll_calculate()
379 pll->vt.pix_clk_div = best_pix_div; in __smiapp_pll_calculate()
381 pll->vt.sys_clk_freq_hz = in __smiapp_pll_calculate()
382 pll->pll_op_clk_freq_hz / pll->vt.sys_clk_div; in __smiapp_pll_calculate()
383 pll->vt.pix_clk_freq_hz = in __smiapp_pll_calculate()
384 pll->vt.sys_clk_freq_hz / pll->vt.pix_clk_div; in __smiapp_pll_calculate()
387 pll->pixel_rate_csi = in __smiapp_pll_calculate()
389 pll->pixel_rate_pixel_array = pll->vt.pix_clk_freq_hz; in __smiapp_pll_calculate()
391 return check_all_bounds(dev, limits, op_limits, pll, op_pll); in __smiapp_pll_calculate()
396 struct smiapp_pll *pll) in smiapp_pll_calculate() argument
399 struct smiapp_pll_branch *op_pll = &pll->op; in smiapp_pll_calculate()
407 if (pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS) { in smiapp_pll_calculate()
414 op_pll = &pll->vt; in smiapp_pll_calculate()
417 if (pll->flags & SMIAPP_PLL_FLAG_OP_PIX_CLOCK_PER_LANE) in smiapp_pll_calculate()
418 lane_op_clock_ratio = pll->csi2.lanes; in smiapp_pll_calculate()
423 dev_dbg(dev, "binning: %ux%u\n", pll->binning_horizontal, in smiapp_pll_calculate()
424 pll->binning_vertical); in smiapp_pll_calculate()
426 switch (pll->bus_type) { in smiapp_pll_calculate()
429 pll->pll_op_clk_freq_hz = pll->link_freq * 2 in smiapp_pll_calculate()
430 * (pll->csi2.lanes / lane_op_clock_ratio); in smiapp_pll_calculate()
433 pll->pll_op_clk_freq_hz = pll->link_freq * pll->bits_per_pixel in smiapp_pll_calculate()
434 / DIV_ROUND_UP(pll->bits_per_pixel, in smiapp_pll_calculate()
435 pll->parallel.bus_width); in smiapp_pll_calculate()
446 clk_div_even(pll->ext_clk_freq_hz / in smiapp_pll_calculate()
451 DIV_ROUND_UP(pll->ext_clk_freq_hz, in smiapp_pll_calculate()
456 i = gcd(pll->pll_op_clk_freq_hz, pll->ext_clk_freq_hz); in smiapp_pll_calculate()
457 mul = div_u64(pll->pll_op_clk_freq_hz, i); in smiapp_pll_calculate()
458 div = pll->ext_clk_freq_hz / i; in smiapp_pll_calculate()
464 DIV_ROUND_UP(mul * pll->ext_clk_freq_hz, in smiapp_pll_calculate()
469 for (pll->pre_pll_clk_div = min_pre_pll_clk_div; in smiapp_pll_calculate()
470 pll->pre_pll_clk_div <= max_pre_pll_clk_div; in smiapp_pll_calculate()
471 pll->pre_pll_clk_div += 2 - (pll->pre_pll_clk_div & 1)) { in smiapp_pll_calculate()
472 rval = __smiapp_pll_calculate(dev, limits, op_limits, pll, in smiapp_pll_calculate()
478 print_pll(dev, pll); in smiapp_pll_calculate()