hc
2023-11-06 9df731a176aab8e03b984b681b1bea01ccff6644
u-boot/drivers/clk/rockchip/clk_rk3588.c
....@@ -332,12 +332,18 @@
332332
333333 switch (clk_id) {
334334 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
+ }
336342 assert(src_clk_div - 1 <= 31);
337343 rk_clrsetreg(&cru->clksel_con[8],
338344 ACLK_TOP_ROOT_DIV_MASK |
339345 ACLK_TOP_ROOT_SRC_SEL_MASK,
340
- (ACLK_TOP_ROOT_SRC_SEL_GPLL <<
346
+ (src_clk <<
341347 ACLK_TOP_ROOT_SRC_SEL_SHIFT) |
342348 (src_clk_div - 1) << ACLK_TOP_ROOT_DIV_SHIFT);
343349 break;
....@@ -1148,13 +1154,23 @@
11481154 }
11491155
11501156 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
+ }
11581174 } else {
11591175 for (i = 0; i <= DCLK_VOP_SRC_SEL_AUPLL; i++) {
11601176 switch (i) {