diff options
author | Heiko Stuebner <heiko@sntech.de> | 2014-02-18 19:25:41 -0500 |
---|---|---|
committer | Kukjin Kim <kgene.kim@samsung.com> | 2014-04-14 13:11:07 -0400 |
commit | a951b1d91dcca8d373c92666c5e006de8234d34b (patch) | |
tree | e4d89ab80b8e674117eff47a4fe53e1c00fc0542 | |
parent | 06654acb6698a92bb7e6deb6897006ed501cdc47 (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.c | 72 | ||||
-rw-r--r-- | drivers/clk/samsung/clk-pll.h | 2 |
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 | |||
72 | static 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 | |||
90 | static 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 | |||
105 | static 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 | |||
123 | static 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 | ||
15 | enum samsung_pll_type { | 15 | enum 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, |