| .. | .. |
|---|
| 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) { |
|---|