aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHeiko Stuebner <heiko@sntech.de>2014-02-18 19:25:41 -0500
committerKukjin Kim <kgene.kim@samsung.com>2014-04-14 13:11:07 -0400
commita951b1d91dcca8d373c92666c5e006de8234d34b (patch)
treee4d89ab80b8e674117eff47a4fe53e1c00fc0542
parent06654acb6698a92bb7e6deb6897006ed501cdc47 (diff)
clk: samsung: add plls used by the s3c2443
The s3c2443 uses different plls that are not present yet. Therefore add the two needed types. 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.c72
-rw-r--r--drivers/clk/samsung/clk-pll.h2
2 files changed, 74 insertions, 0 deletions
diff --git a/drivers/clk/samsung/clk-pll.c b/drivers/clk/samsung/clk-pll.c
index f9a35a612705..8c9c015a4538 100644
--- a/drivers/clk/samsung/clk-pll.c
+++ b/drivers/clk/samsung/clk-pll.c
@@ -59,6 +59,72 @@ static long samsung_pll_round_rate(struct clk_hw *hw,
59} 59}
60 60
61/* 61/*
62 * PLL2126 Clock Type
63 */
64
65#define PLL2126_MDIV_MASK (0xff)
66#define PLL2126_PDIV_MASK (0x3f)
67#define PLL2126_SDIV_MASK (0x3)
68#define PLL2126_MDIV_SHIFT (16)
69#define PLL2126_PDIV_SHIFT (8)
70#define PLL2126_SDIV_SHIFT (0)
71
72static unsigned long samsung_pll2126_recalc_rate(struct clk_hw *hw,
73 unsigned long parent_rate)
74{
75 struct samsung_clk_pll *pll = to_clk_pll(hw);
76 u32 pll_con, mdiv, pdiv, sdiv;
77 u64 fvco = parent_rate;
78
79 pll_con = __raw_readl(pll->con_reg);
80 mdiv = (pll_con >> PLL2126_MDIV_SHIFT) & PLL2126_MDIV_MASK;
81 pdiv = (pll_con >> PLL2126_PDIV_SHIFT) & PLL2126_PDIV_MASK;
82 sdiv = (pll_con >> PLL2126_SDIV_SHIFT) & PLL2126_SDIV_MASK;
83
84 fvco *= (mdiv + 8);
85 do_div(fvco, (pdiv + 2) << sdiv);
86
87 return (unsigned long)fvco;
88}
89
90static const struct clk_ops samsung_pll2126_clk_ops = {
91 .recalc_rate = samsung_pll2126_recalc_rate,
92};
93
94/*
95 * PLL3000 Clock Type
96 */
97
98#define PLL3000_MDIV_MASK (0xff)
99#define PLL3000_PDIV_MASK (0x3)
100#define PLL3000_SDIV_MASK (0x3)
101#define PLL3000_MDIV_SHIFT (16)
102#define PLL3000_PDIV_SHIFT (8)
103#define PLL3000_SDIV_SHIFT (0)
104
105static unsigned long samsung_pll3000_recalc_rate(struct clk_hw *hw,
106 unsigned long parent_rate)
107{
108 struct samsung_clk_pll *pll = to_clk_pll(hw);
109 u32 pll_con, mdiv, pdiv, sdiv;
110 u64 fvco = parent_rate;
111
112 pll_con = __raw_readl(pll->con_reg);
113 mdiv = (pll_con >> PLL3000_MDIV_SHIFT) & PLL3000_MDIV_MASK;
114 pdiv = (pll_con >> PLL3000_PDIV_SHIFT) & PLL3000_PDIV_MASK;
115 sdiv = (pll_con >> PLL3000_SDIV_SHIFT) & PLL3000_SDIV_MASK;
116
117 fvco *= (2 * (mdiv + 8));
118 do_div(fvco, pdiv << sdiv);
119
120 return (unsigned long)fvco;
121}
122
123static const struct clk_ops samsung_pll3000_clk_ops = {
124 .recalc_rate = samsung_pll3000_recalc_rate,
125};
126
127/*
62 * PLL35xx Clock Type 128 * PLL35xx Clock Type
63 */ 129 */
64/* Maximum lock time can be 270 * PDIV cycles */ 130/* Maximum lock time can be 270 * PDIV cycles */
@@ -753,6 +819,12 @@ static void __init _samsung_clk_register_pll(struct samsung_pll_clock *pll_clk,
753 } 819 }
754 820
755 switch (pll_clk->type) { 821 switch (pll_clk->type) {
822 case pll_2126:
823 init.ops = &samsung_pll2126_clk_ops;
824 break;
825 case pll_3000:
826 init.ops = &samsung_pll3000_clk_ops;
827 break;
756 /* clk_ops for 35xx and 2550 are similar */ 828 /* clk_ops for 35xx and 2550 are similar */
757 case pll_35xx: 829 case pll_35xx:
758 case pll_2550: 830 case pll_2550:
diff --git a/drivers/clk/samsung/clk-pll.h b/drivers/clk/samsung/clk-pll.h
index ddf9029c13c9..5b64bdbb0906 100644
--- a/drivers/clk/samsung/clk-pll.h
+++ b/drivers/clk/samsung/clk-pll.h
@@ -13,6 +13,8 @@
13#define __SAMSUNG_CLK_PLL_H 13#define __SAMSUNG_CLK_PLL_H
14 14
15enum samsung_pll_type { 15enum samsung_pll_type {
16 pll_2126,
17 pll_3000,
16 pll_35xx, 18 pll_35xx,
17 pll_36xx, 19 pll_36xx,
18 pll_2550, 20 pll_2550,