diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-26 15:42:29 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-26 15:42:29 -0400 |
commit | 27953437059c64d14086196eb96f43c78caa9db3 (patch) | |
tree | 0cfd5fb21262a6db3de0c64462847b4c0c43e9df /arch/arm/mach-mv78xx0 | |
parent | 2c757fd5d1a92086f225a75a8fac7cab242d11b0 (diff) | |
parent | 3c0dec5f58b3c7b3627715126d1bf9b030a076f0 (diff) |
Merge tag 'clock' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
Pull arm-soc clock driver changes from Olof Johansson:
"The new clock subsystem was merged in linux-3.4 without any users,
this now moves the first three platforms over to it: imx, mxs and
spear.
The series also contains the changes for the clock subsystem itself,
since Mike preferred to have it together with the platforms that
require these changes, in order to avoid interdependencies and
conflicts."
Fix up trivial conflicts in arch/arm/mach-kirkwood/common.c (code
removed in one branch, added OF support in another) and
drivers/dma/imx-sdma.c (independent changes next to each other).
* tag 'clock' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (97 commits)
clk: Fix CLK_SET_RATE_GATE flag validation in clk_set_rate().
clk: Provide dummy clk_unregister()
SPEAr: Update defconfigs
SPEAr: Add SMI NOR partition info in dts files
SPEAr: Switch to common clock framework
SPEAr: Call clk_prepare() before calling clk_enable
SPEAr: clk: Add General Purpose Timer Synthesizer clock
SPEAr: clk: Add Fractional Synthesizer clock
SPEAr: clk: Add Auxiliary Synthesizer clock
SPEAr: clk: Add VCO-PLL Synthesizer clock
SPEAr: Add DT bindings for SPEAr's timer
ARM i.MX: remove now unused clock files
ARM: i.MX6: implement clocks using common clock framework
ARM i.MX35: implement clocks using common clock framework
ARM i.MX5: implement clocks using common clock framework
ARM: Kirkwood: Replace clock gating
ARM: Orion: Audio: Add clk/clkdev support
ARM: Orion: PCIE: Add support for clk
ARM: Orion: XOR: Add support for clk
ARM: Orion: CESA: Add support for clk
...
Diffstat (limited to 'arch/arm/mach-mv78xx0')
-rw-r--r-- | arch/arm/mach-mv78xx0/common.c | 45 |
1 files changed, 30 insertions, 15 deletions
diff --git a/arch/arm/mach-mv78xx0/common.c b/arch/arm/mach-mv78xx0/common.c index a5dcf766a3f9..b4c53b846c9c 100644 --- a/arch/arm/mach-mv78xx0/common.c +++ b/arch/arm/mach-mv78xx0/common.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/platform_device.h> | 13 | #include <linux/platform_device.h> |
14 | #include <linux/serial_8250.h> | 14 | #include <linux/serial_8250.h> |
15 | #include <linux/ata_platform.h> | 15 | #include <linux/ata_platform.h> |
16 | #include <linux/clk-provider.h> | ||
16 | #include <linux/ethtool.h> | 17 | #include <linux/ethtool.h> |
17 | #include <asm/mach/map.h> | 18 | #include <asm/mach/map.h> |
18 | #include <asm/mach/time.h> | 19 | #include <asm/mach/time.h> |
@@ -103,24 +104,24 @@ static void get_pclk_l2clk(int hclk, int core_index, int *pclk, int *l2clk) | |||
103 | 104 | ||
104 | static int get_tclk(void) | 105 | static int get_tclk(void) |
105 | { | 106 | { |
106 | int tclk; | 107 | int tclk_freq; |
107 | 108 | ||
108 | /* | 109 | /* |
109 | * TCLK tick rate is configured by DEV_A[2:0] strap pins. | 110 | * TCLK tick rate is configured by DEV_A[2:0] strap pins. |
110 | */ | 111 | */ |
111 | switch ((readl(SAMPLE_AT_RESET_HIGH) >> 6) & 7) { | 112 | switch ((readl(SAMPLE_AT_RESET_HIGH) >> 6) & 7) { |
112 | case 1: | 113 | case 1: |
113 | tclk = 166666667; | 114 | tclk_freq = 166666667; |
114 | break; | 115 | break; |
115 | case 3: | 116 | case 3: |
116 | tclk = 200000000; | 117 | tclk_freq = 200000000; |
117 | break; | 118 | break; |
118 | default: | 119 | default: |
119 | panic("unknown TCLK PLL setting: %.8x\n", | 120 | panic("unknown TCLK PLL setting: %.8x\n", |
120 | readl(SAMPLE_AT_RESET_HIGH)); | 121 | readl(SAMPLE_AT_RESET_HIGH)); |
121 | } | 122 | } |
122 | 123 | ||
123 | return tclk; | 124 | return tclk_freq; |
124 | } | 125 | } |
125 | 126 | ||
126 | 127 | ||
@@ -166,6 +167,19 @@ void __init mv78xx0_map_io(void) | |||
166 | 167 | ||
167 | 168 | ||
168 | /***************************************************************************** | 169 | /***************************************************************************** |
170 | * CLK tree | ||
171 | ****************************************************************************/ | ||
172 | static struct clk *tclk; | ||
173 | |||
174 | static void __init clk_init(void) | ||
175 | { | ||
176 | tclk = clk_register_fixed_rate(NULL, "tclk", NULL, CLK_IS_ROOT, | ||
177 | get_tclk()); | ||
178 | |||
179 | orion_clkdev_init(tclk); | ||
180 | } | ||
181 | |||
182 | /***************************************************************************** | ||
169 | * EHCI | 183 | * EHCI |
170 | ****************************************************************************/ | 184 | ****************************************************************************/ |
171 | void __init mv78xx0_ehci0_init(void) | 185 | void __init mv78xx0_ehci0_init(void) |
@@ -199,7 +213,7 @@ void __init mv78xx0_ge00_init(struct mv643xx_eth_platform_data *eth_data) | |||
199 | { | 213 | { |
200 | orion_ge00_init(eth_data, | 214 | orion_ge00_init(eth_data, |
201 | GE00_PHYS_BASE, IRQ_MV78XX0_GE00_SUM, | 215 | GE00_PHYS_BASE, IRQ_MV78XX0_GE00_SUM, |
202 | IRQ_MV78XX0_GE_ERR, get_tclk()); | 216 | IRQ_MV78XX0_GE_ERR); |
203 | } | 217 | } |
204 | 218 | ||
205 | 219 | ||
@@ -210,7 +224,7 @@ void __init mv78xx0_ge01_init(struct mv643xx_eth_platform_data *eth_data) | |||
210 | { | 224 | { |
211 | orion_ge01_init(eth_data, | 225 | orion_ge01_init(eth_data, |
212 | GE01_PHYS_BASE, IRQ_MV78XX0_GE01_SUM, | 226 | GE01_PHYS_BASE, IRQ_MV78XX0_GE01_SUM, |
213 | NO_IRQ, get_tclk()); | 227 | NO_IRQ); |
214 | } | 228 | } |
215 | 229 | ||
216 | 230 | ||
@@ -234,7 +248,7 @@ void __init mv78xx0_ge10_init(struct mv643xx_eth_platform_data *eth_data) | |||
234 | 248 | ||
235 | orion_ge10_init(eth_data, | 249 | orion_ge10_init(eth_data, |
236 | GE10_PHYS_BASE, IRQ_MV78XX0_GE10_SUM, | 250 | GE10_PHYS_BASE, IRQ_MV78XX0_GE10_SUM, |
237 | NO_IRQ, get_tclk()); | 251 | NO_IRQ); |
238 | } | 252 | } |
239 | 253 | ||
240 | 254 | ||
@@ -258,7 +272,7 @@ void __init mv78xx0_ge11_init(struct mv643xx_eth_platform_data *eth_data) | |||
258 | 272 | ||
259 | orion_ge11_init(eth_data, | 273 | orion_ge11_init(eth_data, |
260 | GE11_PHYS_BASE, IRQ_MV78XX0_GE11_SUM, | 274 | GE11_PHYS_BASE, IRQ_MV78XX0_GE11_SUM, |
261 | NO_IRQ, get_tclk()); | 275 | NO_IRQ); |
262 | } | 276 | } |
263 | 277 | ||
264 | /***************************************************************************** | 278 | /***************************************************************************** |
@@ -285,7 +299,7 @@ void __init mv78xx0_sata_init(struct mv_sata_platform_data *sata_data) | |||
285 | void __init mv78xx0_uart0_init(void) | 299 | void __init mv78xx0_uart0_init(void) |
286 | { | 300 | { |
287 | orion_uart0_init(UART0_VIRT_BASE, UART0_PHYS_BASE, | 301 | orion_uart0_init(UART0_VIRT_BASE, UART0_PHYS_BASE, |
288 | IRQ_MV78XX0_UART_0, get_tclk()); | 302 | IRQ_MV78XX0_UART_0, tclk); |
289 | } | 303 | } |
290 | 304 | ||
291 | 305 | ||
@@ -295,7 +309,7 @@ void __init mv78xx0_uart0_init(void) | |||
295 | void __init mv78xx0_uart1_init(void) | 309 | void __init mv78xx0_uart1_init(void) |
296 | { | 310 | { |
297 | orion_uart1_init(UART1_VIRT_BASE, UART1_PHYS_BASE, | 311 | orion_uart1_init(UART1_VIRT_BASE, UART1_PHYS_BASE, |
298 | IRQ_MV78XX0_UART_1, get_tclk()); | 312 | IRQ_MV78XX0_UART_1, tclk); |
299 | } | 313 | } |
300 | 314 | ||
301 | 315 | ||
@@ -305,7 +319,7 @@ void __init mv78xx0_uart1_init(void) | |||
305 | void __init mv78xx0_uart2_init(void) | 319 | void __init mv78xx0_uart2_init(void) |
306 | { | 320 | { |
307 | orion_uart2_init(UART2_VIRT_BASE, UART2_PHYS_BASE, | 321 | orion_uart2_init(UART2_VIRT_BASE, UART2_PHYS_BASE, |
308 | IRQ_MV78XX0_UART_2, get_tclk()); | 322 | IRQ_MV78XX0_UART_2, tclk); |
309 | } | 323 | } |
310 | 324 | ||
311 | /***************************************************************************** | 325 | /***************************************************************************** |
@@ -314,7 +328,7 @@ void __init mv78xx0_uart2_init(void) | |||
314 | void __init mv78xx0_uart3_init(void) | 328 | void __init mv78xx0_uart3_init(void) |
315 | { | 329 | { |
316 | orion_uart3_init(UART3_VIRT_BASE, UART3_PHYS_BASE, | 330 | orion_uart3_init(UART3_VIRT_BASE, UART3_PHYS_BASE, |
317 | IRQ_MV78XX0_UART_3, get_tclk()); | 331 | IRQ_MV78XX0_UART_3, tclk); |
318 | } | 332 | } |
319 | 333 | ||
320 | /***************************************************************************** | 334 | /***************************************************************************** |
@@ -378,25 +392,26 @@ void __init mv78xx0_init(void) | |||
378 | int hclk; | 392 | int hclk; |
379 | int pclk; | 393 | int pclk; |
380 | int l2clk; | 394 | int l2clk; |
381 | int tclk; | ||
382 | 395 | ||
383 | core_index = mv78xx0_core_index(); | 396 | core_index = mv78xx0_core_index(); |
384 | hclk = get_hclk(); | 397 | hclk = get_hclk(); |
385 | get_pclk_l2clk(hclk, core_index, &pclk, &l2clk); | 398 | get_pclk_l2clk(hclk, core_index, &pclk, &l2clk); |
386 | tclk = get_tclk(); | ||
387 | 399 | ||
388 | printk(KERN_INFO "%s ", mv78xx0_id()); | 400 | printk(KERN_INFO "%s ", mv78xx0_id()); |
389 | printk("core #%d, ", core_index); | 401 | printk("core #%d, ", core_index); |
390 | printk("PCLK = %dMHz, ", (pclk + 499999) / 1000000); | 402 | printk("PCLK = %dMHz, ", (pclk + 499999) / 1000000); |
391 | printk("L2 = %dMHz, ", (l2clk + 499999) / 1000000); | 403 | printk("L2 = %dMHz, ", (l2clk + 499999) / 1000000); |
392 | printk("HCLK = %dMHz, ", (hclk + 499999) / 1000000); | 404 | printk("HCLK = %dMHz, ", (hclk + 499999) / 1000000); |
393 | printk("TCLK = %dMHz\n", (tclk + 499999) / 1000000); | 405 | printk("TCLK = %dMHz\n", (get_tclk() + 499999) / 1000000); |
394 | 406 | ||
395 | mv78xx0_setup_cpu_mbus(); | 407 | mv78xx0_setup_cpu_mbus(); |
396 | 408 | ||
397 | #ifdef CONFIG_CACHE_FEROCEON_L2 | 409 | #ifdef CONFIG_CACHE_FEROCEON_L2 |
398 | feroceon_l2_init(is_l2_writethrough()); | 410 | feroceon_l2_init(is_l2_writethrough()); |
399 | #endif | 411 | #endif |
412 | |||
413 | /* Setup root of clk tree */ | ||
414 | clk_init(); | ||
400 | } | 415 | } |
401 | 416 | ||
402 | void mv78xx0_restart(char mode, const char *cmd) | 417 | void mv78xx0_restart(char mode, const char *cmd) |