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 | |
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')
-rw-r--r-- | arch/mips/ath79/clock.c | 81 | ||||
-rw-r--r-- | arch/mips/include/asm/mach-ath79/ar71xx_regs.h | 53 |
2 files changed, 134 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 | ||
diff --git a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h index 4e3c55d4b078..bc1c345da009 100644 --- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h +++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h | |||
@@ -151,6 +151,41 @@ | |||
151 | #define AR933X_PLL_CLOCK_CTRL_AHB_DIV_SHIFT 15 | 151 | #define AR933X_PLL_CLOCK_CTRL_AHB_DIV_SHIFT 15 |
152 | #define AR933X_PLL_CLOCK_CTRL_AHB_DIV_MASK 0x7 | 152 | #define AR933X_PLL_CLOCK_CTRL_AHB_DIV_MASK 0x7 |
153 | 153 | ||
154 | #define AR934X_PLL_CPU_CONFIG_REG 0x00 | ||
155 | #define AR934X_PLL_DDR_CONFIG_REG 0x04 | ||
156 | #define AR934X_PLL_CPU_DDR_CLK_CTRL_REG 0x08 | ||
157 | |||
158 | #define AR934X_PLL_CPU_CONFIG_NFRAC_SHIFT 0 | ||
159 | #define AR934X_PLL_CPU_CONFIG_NFRAC_MASK 0x3f | ||
160 | #define AR934X_PLL_CPU_CONFIG_NINT_SHIFT 6 | ||
161 | #define AR934X_PLL_CPU_CONFIG_NINT_MASK 0x3f | ||
162 | #define AR934X_PLL_CPU_CONFIG_REFDIV_SHIFT 12 | ||
163 | #define AR934X_PLL_CPU_CONFIG_REFDIV_MASK 0x1f | ||
164 | #define AR934X_PLL_CPU_CONFIG_OUTDIV_SHIFT 19 | ||
165 | #define AR934X_PLL_CPU_CONFIG_OUTDIV_MASK 0x3 | ||
166 | |||
167 | #define AR934X_PLL_DDR_CONFIG_NFRAC_SHIFT 0 | ||
168 | #define AR934X_PLL_DDR_CONFIG_NFRAC_MASK 0x3ff | ||
169 | #define AR934X_PLL_DDR_CONFIG_NINT_SHIFT 10 | ||
170 | #define AR934X_PLL_DDR_CONFIG_NINT_MASK 0x3f | ||
171 | #define AR934X_PLL_DDR_CONFIG_REFDIV_SHIFT 16 | ||
172 | #define AR934X_PLL_DDR_CONFIG_REFDIV_MASK 0x1f | ||
173 | #define AR934X_PLL_DDR_CONFIG_OUTDIV_SHIFT 23 | ||
174 | #define AR934X_PLL_DDR_CONFIG_OUTDIV_MASK 0x7 | ||
175 | |||
176 | #define AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_PLL_BYPASS BIT(2) | ||
177 | #define AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_PLL_BYPASS BIT(3) | ||
178 | #define AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_PLL_BYPASS BIT(4) | ||
179 | #define AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_POST_DIV_SHIFT 5 | ||
180 | #define AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_POST_DIV_MASK 0x1f | ||
181 | #define AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_POST_DIV_SHIFT 10 | ||
182 | #define AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_POST_DIV_MASK 0x1f | ||
183 | #define AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_POST_DIV_SHIFT 15 | ||
184 | #define AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_POST_DIV_MASK 0x1f | ||
185 | #define AR934X_PLL_CPU_DDR_CLK_CTRL_CPUCLK_FROM_CPUPLL BIT(20) | ||
186 | #define AR934X_PLL_CPU_DDR_CLK_CTRL_DDRCLK_FROM_DDRPLL BIT(21) | ||
187 | #define AR934X_PLL_CPU_DDR_CLK_CTRL_AHBCLK_FROM_DDRPLL BIT(24) | ||
188 | |||
154 | /* | 189 | /* |
155 | * USB_CONFIG block | 190 | * USB_CONFIG block |
156 | */ | 191 | */ |
@@ -186,6 +221,8 @@ | |||
186 | #define AR933X_RESET_REG_RESET_MODULE 0x1c | 221 | #define AR933X_RESET_REG_RESET_MODULE 0x1c |
187 | #define AR933X_RESET_REG_BOOTSTRAP 0xac | 222 | #define AR933X_RESET_REG_BOOTSTRAP 0xac |
188 | 223 | ||
224 | #define AR934X_RESET_REG_BOOTSTRAP 0xb0 | ||
225 | |||
189 | #define MISC_INT_ETHSW BIT(12) | 226 | #define MISC_INT_ETHSW BIT(12) |
190 | #define MISC_INT_TIMER4 BIT(10) | 227 | #define MISC_INT_TIMER4 BIT(10) |
191 | #define MISC_INT_TIMER3 BIT(9) | 228 | #define MISC_INT_TIMER3 BIT(9) |
@@ -242,6 +279,22 @@ | |||
242 | 279 | ||
243 | #define AR933X_BOOTSTRAP_REF_CLK_40 BIT(0) | 280 | #define AR933X_BOOTSTRAP_REF_CLK_40 BIT(0) |
244 | 281 | ||
282 | #define AR934X_BOOTSTRAP_SW_OPTION8 BIT(23) | ||
283 | #define AR934X_BOOTSTRAP_SW_OPTION7 BIT(22) | ||
284 | #define AR934X_BOOTSTRAP_SW_OPTION6 BIT(21) | ||
285 | #define AR934X_BOOTSTRAP_SW_OPTION5 BIT(20) | ||
286 | #define AR934X_BOOTSTRAP_SW_OPTION4 BIT(19) | ||
287 | #define AR934X_BOOTSTRAP_SW_OPTION3 BIT(18) | ||
288 | #define AR934X_BOOTSTRAP_SW_OPTION2 BIT(17) | ||
289 | #define AR934X_BOOTSTRAP_SW_OPTION1 BIT(16) | ||
290 | #define AR934X_BOOTSTRAP_USB_MODE_DEVICE BIT(7) | ||
291 | #define AR934X_BOOTSTRAP_PCIE_RC BIT(6) | ||
292 | #define AR934X_BOOTSTRAP_EJTAG_MODE BIT(5) | ||
293 | #define AR934X_BOOTSTRAP_REF_CLK_40 BIT(4) | ||
294 | #define AR934X_BOOTSTRAP_BOOT_FROM_SPI BIT(2) | ||
295 | #define AR934X_BOOTSTRAP_SDRAM_DISABLED BIT(1) | ||
296 | #define AR934X_BOOTSTRAP_DDR1 BIT(0) | ||
297 | |||
245 | #define REV_ID_MAJOR_MASK 0xfff0 | 298 | #define REV_ID_MAJOR_MASK 0xfff0 |
246 | #define REV_ID_MAJOR_AR71XX 0x00a0 | 299 | #define REV_ID_MAJOR_AR71XX 0x00a0 |
247 | #define REV_ID_MAJOR_AR913X 0x00b0 | 300 | #define REV_ID_MAJOR_AR913X 0x00b0 |