aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHeiko Stuebner <heiko@sntech.de>2014-02-18 19:25:36 -0500
committerKukjin Kim <kgene.kim@samsung.com>2014-04-14 13:11:07 -0400
commit06654acb6698a92bb7e6deb6897006ed501cdc47 (patch)
tree471baccb7b5b70c66ac466b4e26ad8adb39c5ec7
parentc9eaa447e77efe77b7fa4c953bd62de8297fd6c5 (diff)
clk: samsung: add pll_6552 variant for s3c2416
According to the manual s3c2416 and s3c2450 use a pll 6552 and 6553 and while the pll_6553 matches exactly the one already implemented the pll_6552 differs to the one from the s3c64xx series. The change is solely in the bit locations of the mdiv and pdiv values. All calculations are the same for both implementatons and even the proposed divider-values for specific frequencies in the manuals are the same. Therefore implement a variant that simply uses the changed bit locations if necessary. Signed-off-by: Heiko Stuebner <heiko@sntech.de> Acked-by: Tomasz Figa <t.figa@samsung.com> Acked-by: Mike Turquette <mturquette@linaro.org> Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
-rw-r--r--drivers/clk/samsung/clk-pll.c12
-rw-r--r--drivers/clk/samsung/clk-pll.h1
2 files changed, 11 insertions, 2 deletions
diff --git a/drivers/clk/samsung/clk-pll.c b/drivers/clk/samsung/clk-pll.c
index 81e6d2f49aa0..f9a35a612705 100644
--- a/drivers/clk/samsung/clk-pll.c
+++ b/drivers/clk/samsung/clk-pll.c
@@ -564,7 +564,9 @@ static const struct clk_ops samsung_pll46xx_clk_min_ops = {
564#define PLL6552_PDIV_MASK 0x3f 564#define PLL6552_PDIV_MASK 0x3f
565#define PLL6552_SDIV_MASK 0x7 565#define PLL6552_SDIV_MASK 0x7
566#define PLL6552_MDIV_SHIFT 16 566#define PLL6552_MDIV_SHIFT 16
567#define PLL6552_MDIV_SHIFT_2416 14
567#define PLL6552_PDIV_SHIFT 8 568#define PLL6552_PDIV_SHIFT 8
569#define PLL6552_PDIV_SHIFT_2416 5
568#define PLL6552_SDIV_SHIFT 0 570#define PLL6552_SDIV_SHIFT 0
569 571
570static unsigned long samsung_pll6552_recalc_rate(struct clk_hw *hw, 572static unsigned long samsung_pll6552_recalc_rate(struct clk_hw *hw,
@@ -575,8 +577,13 @@ static unsigned long samsung_pll6552_recalc_rate(struct clk_hw *hw,
575 u64 fvco = parent_rate; 577 u64 fvco = parent_rate;
576 578
577 pll_con = __raw_readl(pll->con_reg); 579 pll_con = __raw_readl(pll->con_reg);
578 mdiv = (pll_con >> PLL6552_MDIV_SHIFT) & PLL6552_MDIV_MASK; 580 if (pll->type == pll_6552_s3c2416) {
579 pdiv = (pll_con >> PLL6552_PDIV_SHIFT) & PLL6552_PDIV_MASK; 581 mdiv = (pll_con >> PLL6552_MDIV_SHIFT_2416) & PLL6552_MDIV_MASK;
582 pdiv = (pll_con >> PLL6552_PDIV_SHIFT_2416) & PLL6552_PDIV_MASK;
583 } else {
584 mdiv = (pll_con >> PLL6552_MDIV_SHIFT) & PLL6552_MDIV_MASK;
585 pdiv = (pll_con >> PLL6552_PDIV_SHIFT) & PLL6552_PDIV_MASK;
586 }
580 sdiv = (pll_con >> PLL6552_SDIV_SHIFT) & PLL6552_SDIV_MASK; 587 sdiv = (pll_con >> PLL6552_SDIV_SHIFT) & PLL6552_SDIV_MASK;
581 588
582 fvco *= mdiv; 589 fvco *= mdiv;
@@ -773,6 +780,7 @@ static void __init _samsung_clk_register_pll(struct samsung_pll_clock *pll_clk,
773 init.ops = &samsung_pll36xx_clk_ops; 780 init.ops = &samsung_pll36xx_clk_ops;
774 break; 781 break;
775 case pll_6552: 782 case pll_6552:
783 case pll_6552_s3c2416:
776 init.ops = &samsung_pll6552_clk_ops; 784 init.ops = &samsung_pll6552_clk_ops;
777 break; 785 break;
778 case pll_6553: 786 case pll_6553:
diff --git a/drivers/clk/samsung/clk-pll.h b/drivers/clk/samsung/clk-pll.h
index 6c39030080fb..ddf9029c13c9 100644
--- a/drivers/clk/samsung/clk-pll.h
+++ b/drivers/clk/samsung/clk-pll.h
@@ -24,6 +24,7 @@ enum samsung_pll_type {
24 pll_4650, 24 pll_4650,
25 pll_4650c, 25 pll_4650c,
26 pll_6552, 26 pll_6552,
27 pll_6552_s3c2416,
27 pll_6553, 28 pll_6553,
28}; 29};
29 30