ccs-pll.c (f25d3962ac8f23ab4871cef1d79e10a8c34f7908) | ccs-pll.c (594f1e93bb2c48bcc14a020448b46eed15be7ef7) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * drivers/media/i2c/ccs-pll.c 4 * 5 * Generic MIPI CCS/SMIA/SMIA++ PLL calculator 6 * 7 * Copyright (C) 2020 Intel Corporation 8 * Copyright (C) 2011--2012 Nokia Corporation --- 225 unchanged lines hidden (view full) --- 234 235static void 236ccs_pll_calculate_vt(struct device *dev, const struct ccs_pll_limits *lim, 237 const struct ccs_pll_branch_limits_bk *op_lim_bk, 238 struct ccs_pll *pll, struct ccs_pll_branch_fr *pll_fr, 239 struct ccs_pll_branch_bk *op_pll_bk, bool cphy, 240 uint32_t phy_const) 241{ | 1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * drivers/media/i2c/ccs-pll.c 4 * 5 * Generic MIPI CCS/SMIA/SMIA++ PLL calculator 6 * 7 * Copyright (C) 2020 Intel Corporation 8 * Copyright (C) 2011--2012 Nokia Corporation --- 225 unchanged lines hidden (view full) --- 234 235static void 236ccs_pll_calculate_vt(struct device *dev, const struct ccs_pll_limits *lim, 237 const struct ccs_pll_branch_limits_bk *op_lim_bk, 238 struct ccs_pll *pll, struct ccs_pll_branch_fr *pll_fr, 239 struct ccs_pll_branch_bk *op_pll_bk, bool cphy, 240 uint32_t phy_const) 241{ |
242 uint32_t sys_div; 243 uint32_t best_pix_div = INT_MAX >> 1; 244 uint32_t vt_op_binning_div; 245 uint32_t min_vt_div, max_vt_div, vt_div; 246 uint32_t min_sys_div, max_sys_div; | 242 uint16_t sys_div; 243 uint16_t best_pix_div = SHRT_MAX >> 1; 244 uint16_t vt_op_binning_div; 245 uint16_t min_vt_div, max_vt_div, vt_div; 246 uint16_t min_sys_div, max_sys_div; |
247 248 if (pll->flags & CCS_PLL_FLAG_NO_OP_CLOCKS) 249 goto out_calc_pixel_rate; 250 251 /* 252 * Find out whether a sensor supports derating. If it does not, VT and 253 * OP domains are required to run at the same pixel rate. 254 */ --- 37 unchanged lines hidden (view full) --- 292 CCS_PLL_FLAG_LANE_SPEED_MODEL ? 293 pll->csi2.lanes : 1) 294 * vt_op_binning_div * pll->scale_m 295 * PHY_CONST_DIV); 296 } 297 298 /* Find smallest and biggest allowed vt divisor. */ 299 dev_dbg(dev, "min_vt_div: %u\n", min_vt_div); | 247 248 if (pll->flags & CCS_PLL_FLAG_NO_OP_CLOCKS) 249 goto out_calc_pixel_rate; 250 251 /* 252 * Find out whether a sensor supports derating. If it does not, VT and 253 * OP domains are required to run at the same pixel rate. 254 */ --- 37 unchanged lines hidden (view full) --- 292 CCS_PLL_FLAG_LANE_SPEED_MODEL ? 293 pll->csi2.lanes : 1) 294 * vt_op_binning_div * pll->scale_m 295 * PHY_CONST_DIV); 296 } 297 298 /* Find smallest and biggest allowed vt divisor. */ 299 dev_dbg(dev, "min_vt_div: %u\n", min_vt_div); |
300 min_vt_div = max(min_vt_div, 301 DIV_ROUND_UP(pll_fr->pll_op_clk_freq_hz, 302 lim->vt_bk.max_pix_clk_freq_hz)); | 300 min_vt_div = max_t(uint16_t, min_vt_div, 301 DIV_ROUND_UP(pll_fr->pll_op_clk_freq_hz, 302 lim->vt_bk.max_pix_clk_freq_hz)); |
303 dev_dbg(dev, "min_vt_div: max_vt_pix_clk_freq_hz: %u\n", 304 min_vt_div); | 303 dev_dbg(dev, "min_vt_div: max_vt_pix_clk_freq_hz: %u\n", 304 min_vt_div); |
305 min_vt_div = max_t(uint32_t, min_vt_div, 306 lim->vt_bk.min_pix_clk_div 307 * lim->vt_bk.min_sys_clk_div); | 305 min_vt_div = max_t(uint16_t, min_vt_div, lim->vt_bk.min_pix_clk_div 306 * lim->vt_bk.min_sys_clk_div); |
308 dev_dbg(dev, "min_vt_div: min_vt_clk_div: %u\n", min_vt_div); 309 310 max_vt_div = lim->vt_bk.max_sys_clk_div * lim->vt_bk.max_pix_clk_div; 311 dev_dbg(dev, "max_vt_div: %u\n", max_vt_div); | 307 dev_dbg(dev, "min_vt_div: min_vt_clk_div: %u\n", min_vt_div); 308 309 max_vt_div = lim->vt_bk.max_sys_clk_div * lim->vt_bk.max_pix_clk_div; 310 dev_dbg(dev, "max_vt_div: %u\n", max_vt_div); |
312 max_vt_div = min(max_vt_div, 313 DIV_ROUND_UP(pll_fr->pll_op_clk_freq_hz, | 311 max_vt_div = min_t(uint16_t, max_vt_div, 312 DIV_ROUND_UP(pll_fr->pll_op_clk_freq_hz, |
314 lim->vt_bk.min_pix_clk_freq_hz)); 315 dev_dbg(dev, "max_vt_div: min_vt_pix_clk_freq_hz: %u\n", 316 max_vt_div); 317 318 /* 319 * Find limitsits for sys_clk_div. Not all values are possible 320 * with all values of pix_clk_div. 321 */ 322 min_sys_div = lim->vt_bk.min_sys_clk_div; 323 dev_dbg(dev, "min_sys_div: %u\n", min_sys_div); | 313 lim->vt_bk.min_pix_clk_freq_hz)); 314 dev_dbg(dev, "max_vt_div: min_vt_pix_clk_freq_hz: %u\n", 315 max_vt_div); 316 317 /* 318 * Find limitsits for sys_clk_div. Not all values are possible 319 * with all values of pix_clk_div. 320 */ 321 min_sys_div = lim->vt_bk.min_sys_clk_div; 322 dev_dbg(dev, "min_sys_div: %u\n", min_sys_div); |
324 min_sys_div = max(min_sys_div, 325 DIV_ROUND_UP(min_vt_div, 326 lim->vt_bk.max_pix_clk_div)); | 323 min_sys_div = max_t(uint16_t, min_sys_div, 324 DIV_ROUND_UP(min_vt_div, 325 lim->vt_bk.max_pix_clk_div)); |
327 dev_dbg(dev, "min_sys_div: max_vt_pix_clk_div: %u\n", min_sys_div); | 326 dev_dbg(dev, "min_sys_div: max_vt_pix_clk_div: %u\n", min_sys_div); |
328 min_sys_div = max(min_sys_div, 329 pll_fr->pll_op_clk_freq_hz 330 / lim->vt_bk.max_sys_clk_freq_hz); | 327 min_sys_div = max_t(uint16_t, min_sys_div, 328 pll_fr->pll_op_clk_freq_hz 329 / lim->vt_bk.max_sys_clk_freq_hz); |
331 dev_dbg(dev, "min_sys_div: max_pll_op_clk_freq_hz: %u\n", min_sys_div); 332 min_sys_div = clk_div_even_up(min_sys_div); 333 dev_dbg(dev, "min_sys_div: one or even: %u\n", min_sys_div); 334 335 max_sys_div = lim->vt_bk.max_sys_clk_div; 336 dev_dbg(dev, "max_sys_div: %u\n", max_sys_div); | 330 dev_dbg(dev, "min_sys_div: max_pll_op_clk_freq_hz: %u\n", min_sys_div); 331 min_sys_div = clk_div_even_up(min_sys_div); 332 dev_dbg(dev, "min_sys_div: one or even: %u\n", min_sys_div); 333 334 max_sys_div = lim->vt_bk.max_sys_clk_div; 335 dev_dbg(dev, "max_sys_div: %u\n", max_sys_div); |
337 max_sys_div = min(max_sys_div, 338 DIV_ROUND_UP(max_vt_div, 339 lim->vt_bk.min_pix_clk_div)); | 336 max_sys_div = min_t(uint16_t, max_sys_div, 337 DIV_ROUND_UP(max_vt_div, 338 lim->vt_bk.min_pix_clk_div)); |
340 dev_dbg(dev, "max_sys_div: min_vt_pix_clk_div: %u\n", max_sys_div); | 339 dev_dbg(dev, "max_sys_div: min_vt_pix_clk_div: %u\n", max_sys_div); |
341 max_sys_div = min(max_sys_div, 342 DIV_ROUND_UP(pll_fr->pll_op_clk_freq_hz, 343 lim->vt_bk.min_pix_clk_freq_hz)); | 340 max_sys_div = min_t(uint16_t, max_sys_div, 341 DIV_ROUND_UP(pll_fr->pll_op_clk_freq_hz, 342 lim->vt_bk.min_pix_clk_freq_hz)); |
344 dev_dbg(dev, "max_sys_div: min_vt_pix_clk_freq_hz: %u\n", max_sys_div); 345 346 /* 347 * Find pix_div such that a legal pix_div * sys_div results 348 * into a value which is not smaller than div, the desired 349 * divisor. 350 */ 351 for (vt_div = min_vt_div; vt_div <= max_vt_div; --- 19 unchanged lines hidden (view full) --- 371 /* Check if this one is better. */ 372 if (pix_div * sys_div <= rounded_div) 373 best_pix_div = pix_div; 374 375 /* Bail out if we've already found the best value. */ 376 if (vt_div == rounded_div) 377 break; 378 } | 343 dev_dbg(dev, "max_sys_div: min_vt_pix_clk_freq_hz: %u\n", max_sys_div); 344 345 /* 346 * Find pix_div such that a legal pix_div * sys_div results 347 * into a value which is not smaller than div, the desired 348 * divisor. 349 */ 350 for (vt_div = min_vt_div; vt_div <= max_vt_div; --- 19 unchanged lines hidden (view full) --- 370 /* Check if this one is better. */ 371 if (pix_div * sys_div <= rounded_div) 372 best_pix_div = pix_div; 373 374 /* Bail out if we've already found the best value. */ 375 if (vt_div == rounded_div) 376 break; 377 } |
379 if (best_pix_div < INT_MAX >> 1) | 378 if (best_pix_div < SHRT_MAX >> 1) |
380 break; 381 } 382 383 pll->vt_bk.sys_clk_div = DIV_ROUND_UP(vt_div, best_pix_div); 384 pll->vt_bk.pix_clk_div = best_pix_div; 385 386 pll->vt_bk.sys_clk_freq_hz = 387 pll_fr->pll_op_clk_freq_hz / pll->vt_bk.sys_clk_div; --- 281 unchanged lines hidden --- | 379 break; 380 } 381 382 pll->vt_bk.sys_clk_div = DIV_ROUND_UP(vt_div, best_pix_div); 383 pll->vt_bk.pix_clk_div = best_pix_div; 384 385 pll->vt_bk.sys_clk_freq_hz = 386 pll_fr->pll_op_clk_freq_hz / pll->vt_bk.sys_clk_div; --- 281 unchanged lines hidden --- |