diff options
author | Gabor Juhos <juhosg@openwrt.org> | 2012-03-14 05:45:22 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2012-05-15 11:49:08 -0400 |
commit | 8889612b3e2054617219581ae10dbe33cf3bddfe (patch) | |
tree | c1bc35777092773857c5eeca53630897aeb1ae16 /arch/mips/ath79 | |
parent | d84114660a65e89e27ebd3fb21ce71ff579ee882 (diff) |
MIPS: ath79: add clock initialization code for AR934X
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
Acked-by: Luis R. Rodriguez <mcgrof@qca.qualcomm.com>
Cc: linux-mips@linux-mips.org
Cc: mcgrof@infradead.org
Patchwork: https://patchwork.linux-mips.org/patch/3507/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/ath79')
-rw-r--r-- | arch/mips/ath79/clock.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/arch/mips/ath79/clock.c b/arch/mips/ath79/clock.c index 54d0eb4db987..b91ad3efe29e 100644 --- a/arch/mips/ath79/clock.c +++ b/arch/mips/ath79/clock.c | |||
@@ -1,8 +1,11 @@ | |||
1 | /* | 1 | /* |
2 | * Atheros AR71XX/AR724X/AR913X common routines | 2 | * Atheros AR71XX/AR724X/AR913X common routines |
3 | * | 3 | * |
4 | * Copyright (C) 2010-2011 Jaiganesh Narayanan <jnarayanan@atheros.com> | ||
4 | * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org> | 5 | * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org> |
5 | * | 6 | * |
7 | * Parts of this file are based on Atheros' 2.6.15/2.6.31 BSP | ||
8 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | 9 | * This program is free software; you can redistribute it and/or modify it |
7 | * under the terms of the GNU General Public License version 2 as published | 10 | * under the terms of the GNU General Public License version 2 as published |
8 | * by the Free Software Foundation. | 11 | * by the Free Software Foundation. |
@@ -163,6 +166,82 @@ static void __init ar933x_clocks_init(void) | |||
163 | ath79_uart_clk.rate = ath79_ref_clk.rate; | 166 | ath79_uart_clk.rate = ath79_ref_clk.rate; |
164 | } | 167 | } |
165 | 168 | ||
169 | static void __init ar934x_clocks_init(void) | ||
170 | { | ||
171 | u32 pll, out_div, ref_div, nint, frac, clk_ctrl, postdiv; | ||
172 | u32 cpu_pll, ddr_pll; | ||
173 | u32 bootstrap; | ||
174 | |||
175 | bootstrap = ath79_reset_rr(AR934X_RESET_REG_BOOTSTRAP); | ||
176 | if (bootstrap & AR934X_BOOTSTRAP_REF_CLK_40) | ||
177 | ath79_ref_clk.rate = 40 * 1000 * 1000; | ||
178 | else | ||
179 | ath79_ref_clk.rate = 25 * 1000 * 1000; | ||
180 | |||
181 | pll = ath79_pll_rr(AR934X_PLL_CPU_CONFIG_REG); | ||
182 | out_div = (pll >> AR934X_PLL_CPU_CONFIG_OUTDIV_SHIFT) & | ||
183 | AR934X_PLL_CPU_CONFIG_OUTDIV_MASK; | ||
184 | ref_div = (pll >> AR934X_PLL_CPU_CONFIG_REFDIV_SHIFT) & | ||
185 | AR934X_PLL_CPU_CONFIG_REFDIV_MASK; | ||
186 | nint = (pll >> AR934X_PLL_CPU_CONFIG_NINT_SHIFT) & | ||
187 | AR934X_PLL_CPU_CONFIG_NINT_MASK; | ||
188 | frac = (pll >> AR934X_PLL_CPU_CONFIG_NFRAC_SHIFT) & | ||
189 | AR934X_PLL_CPU_CONFIG_NFRAC_MASK; | ||
190 | |||
191 | cpu_pll = nint * ath79_ref_clk.rate / ref_div; | ||
192 | cpu_pll += frac * ath79_ref_clk.rate / (ref_div * (2 << 6)); | ||
193 | cpu_pll /= (1 << out_div); | ||
194 | |||
195 | pll = ath79_pll_rr(AR934X_PLL_DDR_CONFIG_REG); | ||
196 | out_div = (pll >> AR934X_PLL_DDR_CONFIG_OUTDIV_SHIFT) & | ||
197 | AR934X_PLL_DDR_CONFIG_OUTDIV_MASK; | ||
198 | ref_div = (pll >> AR934X_PLL_DDR_CONFIG_REFDIV_SHIFT) & | ||
199 | AR934X_PLL_DDR_CONFIG_REFDIV_MASK; | ||
200 | nint = (pll >> AR934X_PLL_DDR_CONFIG_NINT_SHIFT) & | ||
201 | AR934X_PLL_DDR_CONFIG_NINT_MASK; | ||
202 | frac = (pll >> AR934X_PLL_DDR_CONFIG_NFRAC_SHIFT) & | ||
203 | AR934X_PLL_DDR_CONFIG_NFRAC_MASK; | ||
204 | |||
205 | ddr_pll = nint * ath79_ref_clk.rate / ref_div; | ||
206 | ddr_pll += frac * ath79_ref_clk.rate / (ref_div * (2 << 10)); | ||
207 | ddr_pll /= (1 << out_div); | ||
208 | |||
209 | clk_ctrl = ath79_pll_rr(AR934X_PLL_CPU_DDR_CLK_CTRL_REG); | ||
210 | |||
211 | postdiv = (clk_ctrl >> AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_POST_DIV_SHIFT) & | ||
212 | AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_POST_DIV_MASK; | ||
213 | |||
214 | if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_PLL_BYPASS) | ||
215 | ath79_cpu_clk.rate = ath79_ref_clk.rate; | ||
216 | else if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_CPUCLK_FROM_CPUPLL) | ||
217 | ath79_cpu_clk.rate = cpu_pll / (postdiv + 1); | ||
218 | else | ||
219 | ath79_cpu_clk.rate = ddr_pll / (postdiv + 1); | ||
220 | |||
221 | postdiv = (clk_ctrl >> AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_POST_DIV_SHIFT) & | ||
222 | AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_POST_DIV_MASK; | ||
223 | |||
224 | if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_PLL_BYPASS) | ||
225 | ath79_ddr_clk.rate = ath79_ref_clk.rate; | ||
226 | else if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_DDRCLK_FROM_DDRPLL) | ||
227 | ath79_ddr_clk.rate = ddr_pll / (postdiv + 1); | ||
228 | else | ||
229 | ath79_ddr_clk.rate = cpu_pll / (postdiv + 1); | ||
230 | |||
231 | postdiv = (clk_ctrl >> AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_POST_DIV_SHIFT) & | ||
232 | AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_POST_DIV_MASK; | ||
233 | |||
234 | if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_PLL_BYPASS) | ||
235 | ath79_ahb_clk.rate = ath79_ref_clk.rate; | ||
236 | else if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_AHBCLK_FROM_DDRPLL) | ||
237 | ath79_ahb_clk.rate = ddr_pll / (postdiv + 1); | ||
238 | else | ||
239 | ath79_ahb_clk.rate = cpu_pll / (postdiv + 1); | ||
240 | |||
241 | ath79_wdt_clk.rate = ath79_ref_clk.rate; | ||
242 | ath79_uart_clk.rate = ath79_ref_clk.rate; | ||
243 | } | ||
244 | |||
166 | void __init ath79_clocks_init(void) | 245 | void __init ath79_clocks_init(void) |
167 | { | 246 | { |
168 | if (soc_is_ar71xx()) | 247 | if (soc_is_ar71xx()) |
@@ -173,6 +252,8 @@ void __init ath79_clocks_init(void) | |||
173 | ar913x_clocks_init(); | 252 | ar913x_clocks_init(); |
174 | else if (soc_is_ar933x()) | 253 | else if (soc_is_ar933x()) |
175 | ar933x_clocks_init(); | 254 | ar933x_clocks_init(); |
255 | else if (soc_is_ar934x()) | ||
256 | ar934x_clocks_init(); | ||
176 | else | 257 | else |
177 | BUG(); | 258 | BUG(); |
178 | 259 | ||