diff options
Diffstat (limited to 'drivers/clk/samsung/clk-pll.c')
-rw-r--r-- | drivers/clk/samsung/clk-pll.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/drivers/clk/samsung/clk-pll.c b/drivers/clk/samsung/clk-pll.c index b07fad2a9167..9d70e5c03804 100644 --- a/drivers/clk/samsung/clk-pll.c +++ b/drivers/clk/samsung/clk-pll.c | |||
@@ -482,6 +482,8 @@ static const struct clk_ops samsung_pll45xx_clk_min_ops = { | |||
482 | 482 | ||
483 | #define PLL46XX_VSEL_MASK (1) | 483 | #define PLL46XX_VSEL_MASK (1) |
484 | #define PLL46XX_MDIV_MASK (0x1FF) | 484 | #define PLL46XX_MDIV_MASK (0x1FF) |
485 | #define PLL1460X_MDIV_MASK (0x3FF) | ||
486 | |||
485 | #define PLL46XX_PDIV_MASK (0x3F) | 487 | #define PLL46XX_PDIV_MASK (0x3F) |
486 | #define PLL46XX_SDIV_MASK (0x7) | 488 | #define PLL46XX_SDIV_MASK (0x7) |
487 | #define PLL46XX_VSEL_SHIFT (27) | 489 | #define PLL46XX_VSEL_SHIFT (27) |
@@ -511,13 +513,15 @@ static unsigned long samsung_pll46xx_recalc_rate(struct clk_hw *hw, | |||
511 | 513 | ||
512 | pll_con0 = __raw_readl(pll->con_reg); | 514 | pll_con0 = __raw_readl(pll->con_reg); |
513 | pll_con1 = __raw_readl(pll->con_reg + 4); | 515 | pll_con1 = __raw_readl(pll->con_reg + 4); |
514 | mdiv = (pll_con0 >> PLL46XX_MDIV_SHIFT) & PLL46XX_MDIV_MASK; | 516 | mdiv = (pll_con0 >> PLL46XX_MDIV_SHIFT) & ((pll->type == pll_1460x) ? |
517 | PLL1460X_MDIV_MASK : PLL46XX_MDIV_MASK); | ||
515 | pdiv = (pll_con0 >> PLL46XX_PDIV_SHIFT) & PLL46XX_PDIV_MASK; | 518 | pdiv = (pll_con0 >> PLL46XX_PDIV_SHIFT) & PLL46XX_PDIV_MASK; |
516 | sdiv = (pll_con0 >> PLL46XX_SDIV_SHIFT) & PLL46XX_SDIV_MASK; | 519 | sdiv = (pll_con0 >> PLL46XX_SDIV_SHIFT) & PLL46XX_SDIV_MASK; |
517 | kdiv = pll->type == pll_4650c ? pll_con1 & PLL4650C_KDIV_MASK : | 520 | kdiv = pll->type == pll_4650c ? pll_con1 & PLL4650C_KDIV_MASK : |
518 | pll_con1 & PLL46XX_KDIV_MASK; | 521 | pll_con1 & PLL46XX_KDIV_MASK; |
519 | 522 | ||
520 | shift = pll->type == pll_4600 ? 16 : 10; | 523 | shift = ((pll->type == pll_4600) || (pll->type == pll_1460x)) ? 16 : 10; |
524 | |||
521 | fvco *= (mdiv << shift) + kdiv; | 525 | fvco *= (mdiv << shift) + kdiv; |
522 | do_div(fvco, (pdiv << sdiv)); | 526 | do_div(fvco, (pdiv << sdiv)); |
523 | fvco >>= shift; | 527 | fvco >>= shift; |
@@ -573,14 +577,21 @@ static int samsung_pll46xx_set_rate(struct clk_hw *hw, unsigned long drate, | |||
573 | lock = 0xffff; | 577 | lock = 0xffff; |
574 | 578 | ||
575 | /* Set PLL PMS and VSEL values. */ | 579 | /* Set PLL PMS and VSEL values. */ |
576 | con0 &= ~((PLL46XX_MDIV_MASK << PLL46XX_MDIV_SHIFT) | | 580 | if (pll->type == pll_1460x) { |
581 | con0 &= ~((PLL1460X_MDIV_MASK << PLL46XX_MDIV_SHIFT) | | ||
582 | (PLL46XX_PDIV_MASK << PLL46XX_PDIV_SHIFT) | | ||
583 | (PLL46XX_SDIV_MASK << PLL46XX_SDIV_SHIFT)); | ||
584 | } else { | ||
585 | con0 &= ~((PLL46XX_MDIV_MASK << PLL46XX_MDIV_SHIFT) | | ||
577 | (PLL46XX_PDIV_MASK << PLL46XX_PDIV_SHIFT) | | 586 | (PLL46XX_PDIV_MASK << PLL46XX_PDIV_SHIFT) | |
578 | (PLL46XX_SDIV_MASK << PLL46XX_SDIV_SHIFT) | | 587 | (PLL46XX_SDIV_MASK << PLL46XX_SDIV_SHIFT) | |
579 | (PLL46XX_VSEL_MASK << PLL46XX_VSEL_SHIFT)); | 588 | (PLL46XX_VSEL_MASK << PLL46XX_VSEL_SHIFT)); |
589 | con0 |= rate->vsel << PLL46XX_VSEL_SHIFT; | ||
590 | } | ||
591 | |||
580 | con0 |= (rate->mdiv << PLL46XX_MDIV_SHIFT) | | 592 | con0 |= (rate->mdiv << PLL46XX_MDIV_SHIFT) | |
581 | (rate->pdiv << PLL46XX_PDIV_SHIFT) | | 593 | (rate->pdiv << PLL46XX_PDIV_SHIFT) | |
582 | (rate->sdiv << PLL46XX_SDIV_SHIFT) | | 594 | (rate->sdiv << PLL46XX_SDIV_SHIFT); |
583 | (rate->vsel << PLL46XX_VSEL_SHIFT); | ||
584 | 595 | ||
585 | /* Set PLL K, MFR and MRR values. */ | 596 | /* Set PLL K, MFR and MRR values. */ |
586 | con1 = __raw_readl(pll->con_reg + 0x4); | 597 | con1 = __raw_readl(pll->con_reg + 0x4); |
@@ -1190,6 +1201,9 @@ static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx, | |||
1190 | /* clk_ops for 35xx and 2550 are similar */ | 1201 | /* clk_ops for 35xx and 2550 are similar */ |
1191 | case pll_35xx: | 1202 | case pll_35xx: |
1192 | case pll_2550: | 1203 | case pll_2550: |
1204 | case pll_1450x: | ||
1205 | case pll_1451x: | ||
1206 | case pll_1452x: | ||
1193 | if (!pll->rate_table) | 1207 | if (!pll->rate_table) |
1194 | init.ops = &samsung_pll35xx_clk_min_ops; | 1208 | init.ops = &samsung_pll35xx_clk_min_ops; |
1195 | else | 1209 | else |
@@ -1223,6 +1237,7 @@ static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx, | |||
1223 | case pll_4600: | 1237 | case pll_4600: |
1224 | case pll_4650: | 1238 | case pll_4650: |
1225 | case pll_4650c: | 1239 | case pll_4650c: |
1240 | case pll_1460x: | ||
1226 | if (!pll->rate_table) | 1241 | if (!pll->rate_table) |
1227 | init.ops = &samsung_pll46xx_clk_min_ops; | 1242 | init.ops = &samsung_pll46xx_clk_min_ops; |
1228 | else | 1243 | else |