Selecting the next integer multiplier m is coupled to setting a negative fractional coefficient k. The current code checks for negative k in two separate places, which is error-prone.
Let rockchip_rk3588_pll_k_get update m directly, to make it the single source of truth for the final value of the integer multiplier m, which also reduces the number of scattered conditional branches in the code. Signed-off-by: Alexey Charkov <[email protected]> --- drivers/clk/rockchip/clk_pll.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/drivers/clk/rockchip/clk_pll.c b/drivers/clk/rockchip/clk_pll.c index c6fbeb71c77a..6324c11091af 100644 --- a/drivers/clk/rockchip/clk_pll.c +++ b/drivers/clk/rockchip/clk_pll.c @@ -168,16 +168,21 @@ rockchip_pll_clk_set_by_auto(ulong fin_hz, } static s16 -rockchip_rk3588_pll_k_get(u32 m, u32 p, u32 s, u64 fin_hz, u64 fvco) +rockchip_rk3588_pll_k_get(u32 *m, u32 p, u32 s, u64 fin_hz, u64 fvco) { u64 fref, ffrac; int k; fref = fin_hz / p; - ffrac = fvco - (m * fref); + ffrac = fvco - (*m) * fref; k = ffrac * 65536 / fref; if (k > 32767) { - ffrac = ((m + 1) * fref) - fvco; + /* + * The requested rate is closer to the next integer multiplier + * m, so pick it and use a negative fractional coefficient k + */ + *m += 1; + ffrac = (*m) * fref - fvco; /* * Round up to avoid overshooting requested rate for negative k */ @@ -201,7 +206,10 @@ rockchip_rk3588_pll_frac_by_auto(unsigned long fin_hz, unsigned long fout_hz) for (m = 64; m <= 1023; m++) { if ((fvco >= m * fin_hz / p) && (fvco < (m + 1) * fin_hz / p)) { - k = rockchip_rk3588_pll_k_get(m, p, s, + u32 m_tmp = m; + + k = rockchip_rk3588_pll_k_get(&m_tmp, + p, s, fin_hz, fvco); if (!k) @@ -209,10 +217,7 @@ rockchip_rk3588_pll_frac_by_auto(unsigned long fin_hz, unsigned long fout_hz) rate_table->p = p; rate_table->s = s; rate_table->k = k; - if (k > 32767) - rate_table->m = m + 1; - else - rate_table->m = m; + rate_table->m = m_tmp; return rate_table; } } -- 2.53.0

