.. | .. |
---|
332 | 332 | |
---|
333 | 333 | switch (clk_id) { |
---|
334 | 334 | case ACLK_TOP_ROOT: |
---|
335 | | - src_clk_div = DIV_ROUND_UP(priv->gpll_hz, rate); |
---|
| 335 | + if (!(priv->cpll_hz % rate)) { |
---|
| 336 | + src_clk = ACLK_TOP_ROOT_SRC_SEL_CPLL; |
---|
| 337 | + src_clk_div = DIV_ROUND_UP(priv->cpll_hz, rate); |
---|
| 338 | + } else { |
---|
| 339 | + src_clk = ACLK_TOP_ROOT_SRC_SEL_GPLL; |
---|
| 340 | + src_clk_div = DIV_ROUND_UP(priv->gpll_hz, rate); |
---|
| 341 | + } |
---|
336 | 342 | assert(src_clk_div - 1 <= 31); |
---|
337 | 343 | rk_clrsetreg(&cru->clksel_con[8], |
---|
338 | 344 | ACLK_TOP_ROOT_DIV_MASK | |
---|
339 | 345 | ACLK_TOP_ROOT_SRC_SEL_MASK, |
---|
340 | | - (ACLK_TOP_ROOT_SRC_SEL_GPLL << |
---|
| 346 | + (src_clk << |
---|
341 | 347 | ACLK_TOP_ROOT_SRC_SEL_SHIFT) | |
---|
342 | 348 | (src_clk_div - 1) << ACLK_TOP_ROOT_DIV_SHIFT); |
---|
343 | 349 | break; |
---|
.. | .. |
---|
1148 | 1154 | } |
---|
1149 | 1155 | |
---|
1150 | 1156 | if (sel == DCLK_VOP_SRC_SEL_V0PLL) { |
---|
1151 | | - div = DIV_ROUND_UP(RK3588_VOP_PLL_LIMIT_FREQ, rate); |
---|
1152 | | - rk_clrsetreg(&cru->clksel_con[conid], |
---|
1153 | | - mask, |
---|
1154 | | - DCLK_VOP_SRC_SEL_V0PLL << sel_shift | |
---|
1155 | | - ((div - 1) << div_shift)); |
---|
1156 | | - rockchip_pll_set_rate(&rk3588_pll_clks[V0PLL], |
---|
1157 | | - priv->cru, V0PLL, div * rate); |
---|
| 1157 | + pll_rate = rockchip_pll_get_rate(&rk3588_pll_clks[V0PLL], |
---|
| 1158 | + priv->cru, V0PLL); |
---|
| 1159 | + if (pll_rate >= RK3588_VOP_PLL_LIMIT_FREQ && pll_rate % rate == 0) { |
---|
| 1160 | + div = DIV_ROUND_UP(pll_rate, rate); |
---|
| 1161 | + rk_clrsetreg(&cru->clksel_con[conid], |
---|
| 1162 | + mask, |
---|
| 1163 | + DCLK_VOP_SRC_SEL_V0PLL << sel_shift | |
---|
| 1164 | + ((div - 1) << div_shift)); |
---|
| 1165 | + } else { |
---|
| 1166 | + div = DIV_ROUND_UP(RK3588_VOP_PLL_LIMIT_FREQ, rate); |
---|
| 1167 | + rk_clrsetreg(&cru->clksel_con[conid], |
---|
| 1168 | + mask, |
---|
| 1169 | + DCLK_VOP_SRC_SEL_V0PLL << sel_shift | |
---|
| 1170 | + ((div - 1) << div_shift)); |
---|
| 1171 | + rockchip_pll_set_rate(&rk3588_pll_clks[V0PLL], |
---|
| 1172 | + priv->cru, V0PLL, div * rate); |
---|
| 1173 | + } |
---|
1158 | 1174 | } else { |
---|
1159 | 1175 | for (i = 0; i <= DCLK_VOP_SRC_SEL_AUPLL; i++) { |
---|
1160 | 1176 | switch (i) { |
---|