clk: samsung: clk-pll: Add support for pll_{0516,0517,518}
authorPeter Griffin <peter.griffin@linaro.org>
Mon, 11 Dec 2023 16:23:22 +0000 (16:23 +0000)
committerKrzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Tue, 12 Dec 2023 19:28:12 +0000 (20:28 +0100)
These plls are found in the Tensor gs101 SoC found in the Pixel 6.

pll0516x: Integer PLL with high frequency
pll0517x: Integer PLL with middle frequency
pll0518x: Integer PLL with low frequency

PLL0516x
FOUT = (MDIV * 2 * FIN)/PDIV * 2^SDIV)

PLL0517x and PLL0518x
FOUT = (MDIV * FIN)/PDIV*2^SDIV)

The PLLs are similar enough to pll_0822x that the same code can handle
both. The main difference is the change in the fout formula for the
high frequency 0516 pll.

Locktime for 516,517 & 518 is 150 the same as the pll_0822x lock factor.
MDIV, SDIV PDIV masks and bit shifts are also the same as 0822x.

When defining the PLL the "con" parameter should be set to CON3
register, like this

PLL(pll_0517x, CLK_FOUT_SHARED0_PLL, "fout_shared0_pll", "oscclk",
    PLL_LOCKTIME_PLL_SHARED0, PLL_CON3_PLL_SHARED0,
    NULL),

Acked-by: Chanwoo Choi <cw00.choi@samsung.com>
Tested-by: Will McVicker <willmcvicker@google.com>
Reviewed-by: Sam Protsenko <semen.protsenko@linaro.org>
Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
Link: https://lore.kernel.org/r/20231211162331.435900-8-peter.griffin@linaro.org
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
drivers/clk/samsung/clk-pll.c
drivers/clk/samsung/clk-pll.h

index 74934c6182cea93ac6d183554646295b82da7c52..4bbdf5e91650f37da84e38ce16388cf12e851ea5 100644 (file)
@@ -443,6 +443,9 @@ static unsigned long samsung_pll0822x_recalc_rate(struct clk_hw *hw,
        sdiv = (pll_con3 >> PLL0822X_SDIV_SHIFT) & PLL0822X_SDIV_MASK;
 
        fvco *= mdiv;
+       if (pll->type == pll_0516x)
+               fvco *= 2;
+
        do_div(fvco, (pdiv << sdiv));
 
        return (unsigned long)fvco;
@@ -1316,6 +1319,9 @@ static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx,
        case pll_1417x:
        case pll_0818x:
        case pll_0822x:
+       case pll_0516x:
+       case pll_0517x:
+       case pll_0518x:
                pll->enable_offs = PLL0822X_ENABLE_SHIFT;
                pll->lock_offs = PLL0822X_LOCK_STAT_SHIFT;
                if (!pll->rate_table)
index 0725d485c6eecd692bce2261600da035746098ab..ffd3d52c0dec2381718d8511b3c7bdeddb99d1e8 100644 (file)
@@ -38,6 +38,9 @@ enum samsung_pll_type {
        pll_0822x,
        pll_0831x,
        pll_142xx,
+       pll_0516x,
+       pll_0517x,
+       pll_0518x,
 };
 
 #define PLL_RATE(_fin, _m, _p, _s, _k, _ks) \