Skip to content

Commit 9224e28

Browse files
sunyealkrzk
authored andcommitted
clk: samsung: clk-pll: Add support for pll_531x
pll531x PLL is used in Exynos Auto v920 SoC for shared pll. pll531x: Integer/fractional PLL with mid frequency FVCO (800 to 3120 MHz) PLL531x FOUT = (MDIV x FIN)/(PDIV x 2^SDIV) for integer PLL FOUT = (MDIV + F/2^32-F[31]) x FIN/(PDIV x 2^SDIV) for fractional PLL Signed-off-by: Sunyeal Hong <[email protected]> Reviewed-by: Alim Akhtar <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Krzysztof Kozlowski <[email protected]>
1 parent c0979bc commit 9224e28

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

drivers/clk/samsung/clk-pll.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1272,6 +1272,47 @@ static const struct clk_ops samsung_pll2650xx_clk_min_ops = {
12721272
.recalc_rate = samsung_pll2650xx_recalc_rate,
12731273
};
12741274

1275+
/*
1276+
* PLL531X Clock Type
1277+
*/
1278+
/* Maximum lock time can be 500 * PDIV cycles */
1279+
#define PLL531X_LOCK_FACTOR (500)
1280+
#define PLL531X_MDIV_MASK (0x3FF)
1281+
#define PLL531X_PDIV_MASK (0x3F)
1282+
#define PLL531X_SDIV_MASK (0x7)
1283+
#define PLL531X_FDIV_MASK (0xFFFFFFFF)
1284+
#define PLL531X_MDIV_SHIFT (16)
1285+
#define PLL531X_PDIV_SHIFT (8)
1286+
#define PLL531X_SDIV_SHIFT (0)
1287+
1288+
static unsigned long samsung_pll531x_recalc_rate(struct clk_hw *hw,
1289+
unsigned long parent_rate)
1290+
{
1291+
struct samsung_clk_pll *pll = to_clk_pll(hw);
1292+
u32 pdiv, sdiv, fdiv, pll_con0, pll_con8;
1293+
u64 mdiv, fout = parent_rate;
1294+
1295+
pll_con0 = readl_relaxed(pll->con_reg);
1296+
pll_con8 = readl_relaxed(pll->con_reg + 20);
1297+
mdiv = (pll_con0 >> PLL531X_MDIV_SHIFT) & PLL531X_MDIV_MASK;
1298+
pdiv = (pll_con0 >> PLL531X_PDIV_SHIFT) & PLL531X_PDIV_MASK;
1299+
sdiv = (pll_con0 >> PLL531X_SDIV_SHIFT) & PLL531X_SDIV_MASK;
1300+
fdiv = (pll_con8 & PLL531X_FDIV_MASK);
1301+
1302+
if (fdiv >> 31)
1303+
mdiv--;
1304+
1305+
fout *= (mdiv << 24) + (fdiv >> 8);
1306+
do_div(fout, (pdiv << sdiv));
1307+
fout >>= 24;
1308+
1309+
return (unsigned long)fout;
1310+
}
1311+
1312+
static const struct clk_ops samsung_pll531x_clk_ops = {
1313+
.recalc_rate = samsung_pll531x_recalc_rate,
1314+
};
1315+
12751316
static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx,
12761317
const struct samsung_pll_clock *pll_clk)
12771318
{
@@ -1406,6 +1447,9 @@ static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx,
14061447
else
14071448
init.ops = &samsung_pll2650xx_clk_ops;
14081449
break;
1450+
case pll_531x:
1451+
init.ops = &samsung_pll531x_clk_ops;
1452+
break;
14091453
default:
14101454
pr_warn("%s: Unknown pll type for pll clk %s\n",
14111455
__func__, pll_clk->name);

drivers/clk/samsung/clk-pll.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ enum samsung_pll_type {
4242
pll_0516x,
4343
pll_0517x,
4444
pll_0518x,
45+
pll_531x,
4546
};
4647

4748
#define PLL_RATE(_fin, _m, _p, _s, _k, _ks) \

0 commit comments

Comments
 (0)