Skip to content

Commit 4e39e5b

Browse files
VDavid003krzk
authored andcommitted
clk: samsung: clk-pll: Add support for pll_1418x
pll1418x is used in Exynos7885 SoC for USB PHY clock. Operation-wise it is very similar to pll0822x, except that MDIV is only 9 bits wide instead of 10, and we use the CON1 register in the PLL macro's "con" parameter instead of CON3 like this: PLL(pll_1418x, CLK_FOUT_USB_PLL, "fout_usb_pll", "oscclk", PLL_LOCKTIME_PLL_USB, PLL_CON0_PLL_USB, pll_usb_rate_table), Technically the PLL should work fine with pll0822x code if the PLL tables are correct, but it's more "correct" to actually update the mask. Signed-off-by: David Virag <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Krzysztof Kozlowski <[email protected]>
1 parent ae07389 commit 4e39e5b

File tree

2 files changed

+16
-3
lines changed

2 files changed

+16
-3
lines changed

drivers/clk/samsung/clk-pll.c

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,9 @@ static const struct clk_ops samsung_pll36xx_clk_min_ops = {
430430
#define PLL0822X_LOCK_STAT_SHIFT (29)
431431
#define PLL0822X_ENABLE_SHIFT (31)
432432

433+
/* PLL1418x is similar to PLL0822x, except that MDIV is one bit smaller */
434+
#define PLL1418X_MDIV_MASK (0x1FF)
435+
433436
static unsigned long samsung_pll0822x_recalc_rate(struct clk_hw *hw,
434437
unsigned long parent_rate)
435438
{
@@ -438,7 +441,10 @@ static unsigned long samsung_pll0822x_recalc_rate(struct clk_hw *hw,
438441
u64 fvco = parent_rate;
439442

440443
pll_con3 = readl_relaxed(pll->con_reg);
441-
mdiv = (pll_con3 >> PLL0822X_MDIV_SHIFT) & PLL0822X_MDIV_MASK;
444+
if (pll->type != pll_1418x)
445+
mdiv = (pll_con3 >> PLL0822X_MDIV_SHIFT) & PLL0822X_MDIV_MASK;
446+
else
447+
mdiv = (pll_con3 >> PLL0822X_MDIV_SHIFT) & PLL1418X_MDIV_MASK;
442448
pdiv = (pll_con3 >> PLL0822X_PDIV_SHIFT) & PLL0822X_PDIV_MASK;
443449
sdiv = (pll_con3 >> PLL0822X_SDIV_SHIFT) & PLL0822X_SDIV_MASK;
444450

@@ -456,7 +462,12 @@ static int samsung_pll0822x_set_rate(struct clk_hw *hw, unsigned long drate,
456462
{
457463
const struct samsung_pll_rate_table *rate;
458464
struct samsung_clk_pll *pll = to_clk_pll(hw);
459-
u32 pll_con3;
465+
u32 mdiv_mask, pll_con3;
466+
467+
if (pll->type != pll_1418x)
468+
mdiv_mask = PLL0822X_MDIV_MASK;
469+
else
470+
mdiv_mask = PLL1418X_MDIV_MASK;
460471

461472
/* Get required rate settings from table */
462473
rate = samsung_get_pll_settings(pll, drate);
@@ -468,7 +479,7 @@ static int samsung_pll0822x_set_rate(struct clk_hw *hw, unsigned long drate,
468479

469480
/* Change PLL PMS values */
470481
pll_con3 = readl_relaxed(pll->con_reg);
471-
pll_con3 &= ~((PLL0822X_MDIV_MASK << PLL0822X_MDIV_SHIFT) |
482+
pll_con3 &= ~((mdiv_mask << PLL0822X_MDIV_SHIFT) |
472483
(PLL0822X_PDIV_MASK << PLL0822X_PDIV_SHIFT) |
473484
(PLL0822X_SDIV_MASK << PLL0822X_SDIV_SHIFT));
474485
pll_con3 |= (rate->mdiv << PLL0822X_MDIV_SHIFT) |
@@ -1317,6 +1328,7 @@ static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx,
13171328
init.ops = &samsung_pll35xx_clk_ops;
13181329
break;
13191330
case pll_1417x:
1331+
case pll_1418x:
13201332
case pll_0818x:
13211333
case pll_0822x:
13221334
case pll_0516x:

drivers/clk/samsung/clk-pll.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ enum samsung_pll_type {
3030
pll_2650x,
3131
pll_2650xx,
3232
pll_1417x,
33+
pll_1418x,
3334
pll_1450x,
3435
pll_1451x,
3536
pll_1452x,

0 commit comments

Comments
 (0)