The PPLL of RK3588 and RK3576 does not have a pll mode reg to switch
between slow, deep slow or normal mode.

Extend support for use of the PLL_FIXED_MODE flag to the rk3588_pll type
and update the PPLL to use this flag to signal that it does not need to
switch to slow mode before the rate is changed.

Signed-off-by: Jonas Karlman <[email protected]>
---
 drivers/clk/rockchip/clk_pll.c    | 21 +++++++++++++--------
 drivers/clk/rockchip/clk_rk3576.c |  3 ++-
 drivers/clk/rockchip/clk_rk3588.c |  3 ++-
 3 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/drivers/clk/rockchip/clk_pll.c b/drivers/clk/rockchip/clk_pll.c
index 7dbe77d74b8a..5f035eb98adc 100644
--- a/drivers/clk/rockchip/clk_pll.c
+++ b/drivers/clk/rockchip/clk_pll.c
@@ -456,9 +456,11 @@ static int rk3588_pll_set_rate(struct rockchip_pll_clock 
*pll,
        if (pll_id == 3)
                rk_clrsetreg(base + 0x84c, 0x1 << 1, 0x1 << 1);
 
-       rk_clrsetreg(base + pll->mode_offset,
-                    pll->mode_mask << pll->mode_shift,
-                    RKCLK_PLL_MODE_SLOW << pll->mode_shift);
+       if (!(pll->pll_flags & ROCKCHIP_PLL_FIXED_MODE)) {
+               rk_clrsetreg(base + pll->mode_offset,
+                            pll->mode_mask << pll->mode_shift,
+                            RKCLK_PLL_MODE_SLOW << pll->mode_shift);
+       }
        if (pll_id == 0)
                rk_clrsetreg(base + RK3588_B0PLL_CLKSEL_CON(0),
                             pll->mode_mask << 6,
@@ -498,8 +500,11 @@ static int rk3588_pll_set_rate(struct rockchip_pll_clock 
*pll,
                debug("%s: wait pll lock, pll_id=%ld\n", __func__, pll_id);
        }
 
-       rk_clrsetreg(base + pll->mode_offset, pll->mode_mask << pll->mode_shift,
-                    RKCLK_PLL_MODE_NORMAL << pll->mode_shift);
+       if (!(pll->pll_flags & ROCKCHIP_PLL_FIXED_MODE)) {
+               rk_clrsetreg(base + pll->mode_offset,
+                            pll->mode_mask << pll->mode_shift,
+                            RKCLK_PLL_MODE_NORMAL << pll->mode_shift);
+       }
        if (pll_id == 0) {
                rk_clrsetreg(base + RK3588_B0PLL_CLKSEL_CON(0),
                             pll->mode_mask << 6,
@@ -559,10 +564,10 @@ static ulong rk3588_pll_get_rate(struct 
rockchip_pll_clock *pll,
 
        con = readl(base + pll->mode_offset);
        shift = pll->mode_shift;
-       if (pll_id == 8)
-               mode = RKCLK_PLL_MODE_NORMAL;
-       else
+       if (!(pll->pll_flags & ROCKCHIP_PLL_FIXED_MODE))
                mode = (con & (pll->mode_mask << shift)) >> shift;
+       else
+               mode = RKCLK_PLL_MODE_NORMAL;
        switch (mode) {
        case RKCLK_PLL_MODE_SLOW:
                return OSC_HZ;
diff --git a/drivers/clk/rockchip/clk_rk3576.c 
b/drivers/clk/rockchip/clk_rk3576.c
index db8ce25852fd..92bde425b0ee 100644
--- a/drivers/clk/rockchip/clk_rk3576.c
+++ b/drivers/clk/rockchip/clk_rk3576.c
@@ -57,7 +57,8 @@ static struct rockchip_pll_clock rk3576_pll_clks[] = {
        [GPLL] = PLL(pll_rk3588, PLL_GPLL, RK3576_PLL_CON(112),
                     RK3576_MODE_CON0, 2, 15, 0, rk3576_24m_pll_rates),
        [PPLL] = PLL(pll_rk3588, PLL_PPLL, RK3576_PMU_PLL_CON(128),
-                    RK3576_MODE_CON0, 10, 15, 0, rk3576_24m_pll_rates),
+                    RK3576_MODE_CON0, 10, 15, ROCKCHIP_PLL_FIXED_MODE,
+                    rk3576_24m_pll_rates),
 };
 
 #ifdef CONFIG_SPL_BUILD
diff --git a/drivers/clk/rockchip/clk_rk3588.c 
b/drivers/clk/rockchip/clk_rk3588.c
index be401a9faeec..b9fd4bec311b 100644
--- a/drivers/clk/rockchip/clk_rk3588.c
+++ b/drivers/clk/rockchip/clk_rk3588.c
@@ -62,7 +62,8 @@ static struct rockchip_pll_clock rk3588_pll_clks[] = {
        [NPLL] = PLL(pll_rk3588, PLL_NPLL, RK3588_PLL_CON(120),
                     RK3588_MODE_CON0, 0, 15, 0, rk3588_pll_rates),
        [PPLL] = PLL(pll_rk3588, PLL_PPLL, RK3588_PMU_PLL_CON(128),
-                    RK3588_MODE_CON0, 10, 15, 0, rk3588_pll_rates),
+                    RK3588_MODE_CON0, 10, 15, ROCKCHIP_PLL_FIXED_MODE,
+                    rk3588_pll_rates),
 #ifdef CONFIG_XPL_BUILD
        /*
         * The SPLL is part of the SBUSCRU, not the main CRU and as
-- 
2.54.0

Reply via email to