diff mbox series

[v2,4/5] clk: rockchip: rk3588: Avoid re-setting the pll rate of dclk_vop's parent

Message ID 20231012101812.27142-1-zhangqing@rock-chips.com
State Accepted
Commit e4916e2c66801c2dad95dc553841f126ee2a81f9
Delegated to: Kever Yang
Headers show
Series clk : rockchip: update rk3568 and rk3588 clk driver | expand

Commit Message

zhangqing Oct. 12, 2023, 10:18 a.m. UTC
Optimize setting process.

Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
---
 drivers/clk/rockchip/clk_rk3588.c | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)

Comments

Kever Yang Oct. 13, 2023, 7:43 a.m. UTC | #1
On 2023/10/12 18:18, Elaine Zhang wrote:
> Optimize setting process.
>
> Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
Reviewed-by: Kever Yang <kever.yang@rock-chips.com>

Thanks,
- Kever
> ---
>   drivers/clk/rockchip/clk_rk3588.c | 24 +++++++++++++++++-------
>   1 file changed, 17 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/clk/rockchip/clk_rk3588.c b/drivers/clk/rockchip/clk_rk3588.c
> index 7ba037ad72ba..a995dd5591d3 100644
> --- a/drivers/clk/rockchip/clk_rk3588.c
> +++ b/drivers/clk/rockchip/clk_rk3588.c
> @@ -1130,13 +1130,23 @@ static ulong rk3588_dclk_vop_set_clk(struct rk3588_clk_priv *priv,
>   	}
>   
>   	if (sel == DCLK_VOP_SRC_SEL_V0PLL) {
> -		div = DIV_ROUND_UP(RK3588_VOP_PLL_LIMIT_FREQ, rate);
> -		rk_clrsetreg(&cru->clksel_con[conid],
> -			     mask,
> -			     DCLK_VOP_SRC_SEL_V0PLL << sel_shift |
> -			     ((div - 1) << div_shift));
> -		rockchip_pll_set_rate(&rk3588_pll_clks[V0PLL],
> -				      priv->cru, V0PLL, div * rate);
> +		pll_rate = rockchip_pll_get_rate(&rk3588_pll_clks[V0PLL],
> +						 priv->cru, V0PLL);
> +		if (pll_rate >= RK3588_VOP_PLL_LIMIT_FREQ && pll_rate % rate == 0) {
> +			div = DIV_ROUND_UP(pll_rate, rate);
> +			rk_clrsetreg(&cru->clksel_con[conid],
> +				     mask,
> +				     DCLK_VOP_SRC_SEL_V0PLL << sel_shift |
> +				     ((div - 1) << div_shift));
> +		} else {
> +			div = DIV_ROUND_UP(RK3588_VOP_PLL_LIMIT_FREQ, rate);
> +			rk_clrsetreg(&cru->clksel_con[conid],
> +				     mask,
> +				     DCLK_VOP_SRC_SEL_V0PLL << sel_shift |
> +				     ((div - 1) << div_shift));
> +			rockchip_pll_set_rate(&rk3588_pll_clks[V0PLL],
> +					      priv->cru, V0PLL, div * rate);
> +		}
>   	} else {
>   		for (i = 0; i <= DCLK_VOP_SRC_SEL_AUPLL; i++) {
>   			switch (i) {
diff mbox series

Patch

diff --git a/drivers/clk/rockchip/clk_rk3588.c b/drivers/clk/rockchip/clk_rk3588.c
index 7ba037ad72ba..a995dd5591d3 100644
--- a/drivers/clk/rockchip/clk_rk3588.c
+++ b/drivers/clk/rockchip/clk_rk3588.c
@@ -1130,13 +1130,23 @@  static ulong rk3588_dclk_vop_set_clk(struct rk3588_clk_priv *priv,
 	}
 
 	if (sel == DCLK_VOP_SRC_SEL_V0PLL) {
-		div = DIV_ROUND_UP(RK3588_VOP_PLL_LIMIT_FREQ, rate);
-		rk_clrsetreg(&cru->clksel_con[conid],
-			     mask,
-			     DCLK_VOP_SRC_SEL_V0PLL << sel_shift |
-			     ((div - 1) << div_shift));
-		rockchip_pll_set_rate(&rk3588_pll_clks[V0PLL],
-				      priv->cru, V0PLL, div * rate);
+		pll_rate = rockchip_pll_get_rate(&rk3588_pll_clks[V0PLL],
+						 priv->cru, V0PLL);
+		if (pll_rate >= RK3588_VOP_PLL_LIMIT_FREQ && pll_rate % rate == 0) {
+			div = DIV_ROUND_UP(pll_rate, rate);
+			rk_clrsetreg(&cru->clksel_con[conid],
+				     mask,
+				     DCLK_VOP_SRC_SEL_V0PLL << sel_shift |
+				     ((div - 1) << div_shift));
+		} else {
+			div = DIV_ROUND_UP(RK3588_VOP_PLL_LIMIT_FREQ, rate);
+			rk_clrsetreg(&cru->clksel_con[conid],
+				     mask,
+				     DCLK_VOP_SRC_SEL_V0PLL << sel_shift |
+				     ((div - 1) << div_shift));
+			rockchip_pll_set_rate(&rk3588_pll_clks[V0PLL],
+					      priv->cru, V0PLL, div * rate);
+		}
 	} else {
 		for (i = 0; i <= DCLK_VOP_SRC_SEL_AUPLL; i++) {
 			switch (i) {