diff options
author | Olof Johansson <olof@lixom.net> | 2012-09-22 16:22:21 -0400 |
---|---|---|
committer | Olof Johansson <olof@lixom.net> | 2012-09-22 16:22:21 -0400 |
commit | 80868a36913e11cfcd06764699b4284d34be0e59 (patch) | |
tree | af4c634ccde4c0b4b7bf361e53611ab9903d1a2c /arch/arm/mach-dove/common.c | |
parent | b1618547bb68bd32a8b5ed20f97fa577d16b6801 (diff) | |
parent | 0f81bd438bed6af47a01a97d5ecbb23a7e478de6 (diff) |
Merge branch 'kirkwood/boards' of git://git.infradead.org/users/jcooper/linux into late/kirkwood
* 'kirkwood/boards' of git://git.infradead.org/users/jcooper/linux:
ARM: Dove: allow PCI to be disabled
ARM: dove: SolidRun CuBox DT
ARM: dove: add device tree descriptors
ARM: dove: add device tree based machine descriptor
ARM: dove: add crypto engine
ARM: dove: add clock gating control
ARM: dove: unify clock setup
ARM: initial DTS support for km_kirkwood
arm: add documentation describing Marvell families of SoC
ARM: kirkwood: DT descriptor for Seagate FreeAgent Dockstar
ARM: kirkwood: DT board setup for Seagate FreeAgent Dockstar
ARM: Kirkwood: Iomega ix2-200 DT support
Context conflicts in arch/arm/Kconfig and arch/arm/mach-dove/common.c.
The new device trees added to arch/arm/mach-kirkwood/Makefile.boot are
kept and dealt with in a separate changeset, since moving them out to
the new Makefile in this merge commit doesn't work well.
Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'arch/arm/mach-dove/common.c')
-rw-r--r-- | arch/arm/mach-dove/common.c | 153 |
1 files changed, 141 insertions, 12 deletions
diff --git a/arch/arm/mach-dove/common.c b/arch/arm/mach-dove/common.c index 950ad9533d19..28475bb7d36f 100644 --- a/arch/arm/mach-dove/common.c +++ b/arch/arm/mach-dove/common.c | |||
@@ -16,6 +16,8 @@ | |||
16 | #include <linux/clk-provider.h> | 16 | #include <linux/clk-provider.h> |
17 | #include <linux/ata_platform.h> | 17 | #include <linux/ata_platform.h> |
18 | #include <linux/gpio.h> | 18 | #include <linux/gpio.h> |
19 | #include <linux/of.h> | ||
20 | #include <linux/of_platform.h> | ||
19 | #include <asm/page.h> | 21 | #include <asm/page.h> |
20 | #include <asm/setup.h> | 22 | #include <asm/setup.h> |
21 | #include <asm/timex.h> | 23 | #include <asm/timex.h> |
@@ -24,6 +26,7 @@ | |||
24 | #include <asm/mach/time.h> | 26 | #include <asm/mach/time.h> |
25 | #include <asm/mach/pci.h> | 27 | #include <asm/mach/pci.h> |
26 | #include <mach/dove.h> | 28 | #include <mach/dove.h> |
29 | #include <mach/pm.h> | ||
27 | #include <mach/bridge-regs.h> | 30 | #include <mach/bridge-regs.h> |
28 | #include <asm/mach/arch.h> | 31 | #include <asm/mach/arch.h> |
29 | #include <linux/irq.h> | 32 | #include <linux/irq.h> |
@@ -33,8 +36,6 @@ | |||
33 | #include <plat/addr-map.h> | 36 | #include <plat/addr-map.h> |
34 | #include "common.h" | 37 | #include "common.h" |
35 | 38 | ||
36 | static int get_tclk(void); | ||
37 | |||
38 | /***************************************************************************** | 39 | /***************************************************************************** |
39 | * I/O Address Mapping | 40 | * I/O Address Mapping |
40 | ****************************************************************************/ | 41 | ****************************************************************************/ |
@@ -60,14 +61,69 @@ void __init dove_map_io(void) | |||
60 | /***************************************************************************** | 61 | /***************************************************************************** |
61 | * CLK tree | 62 | * CLK tree |
62 | ****************************************************************************/ | 63 | ****************************************************************************/ |
64 | static int dove_tclk; | ||
65 | |||
66 | static DEFINE_SPINLOCK(gating_lock); | ||
63 | static struct clk *tclk; | 67 | static struct clk *tclk; |
64 | 68 | ||
65 | static void __init clk_init(void) | 69 | static struct clk __init *dove_register_gate(const char *name, |
70 | const char *parent, u8 bit_idx) | ||
66 | { | 71 | { |
67 | tclk = clk_register_fixed_rate(NULL, "tclk", NULL, CLK_IS_ROOT, | 72 | return clk_register_gate(NULL, name, parent, 0, |
68 | get_tclk()); | 73 | (void __iomem *)CLOCK_GATING_CONTROL, |
74 | bit_idx, 0, &gating_lock); | ||
75 | } | ||
76 | |||
77 | static void __init dove_clk_init(void) | ||
78 | { | ||
79 | struct clk *usb0, *usb1, *sata, *pex0, *pex1, *sdio0, *sdio1; | ||
80 | struct clk *nand, *camera, *i2s0, *i2s1, *crypto, *ac97, *pdma; | ||
81 | struct clk *xor0, *xor1, *ge, *gephy; | ||
69 | 82 | ||
70 | orion_clkdev_init(tclk); | 83 | tclk = clk_register_fixed_rate(NULL, "tclk", NULL, CLK_IS_ROOT, |
84 | dove_tclk); | ||
85 | |||
86 | usb0 = dove_register_gate("usb0", "tclk", CLOCK_GATING_BIT_USB0); | ||
87 | usb1 = dove_register_gate("usb1", "tclk", CLOCK_GATING_BIT_USB1); | ||
88 | sata = dove_register_gate("sata", "tclk", CLOCK_GATING_BIT_SATA); | ||
89 | pex0 = dove_register_gate("pex0", "tclk", CLOCK_GATING_BIT_PCIE0); | ||
90 | pex1 = dove_register_gate("pex1", "tclk", CLOCK_GATING_BIT_PCIE1); | ||
91 | sdio0 = dove_register_gate("sdio0", "tclk", CLOCK_GATING_BIT_SDIO0); | ||
92 | sdio1 = dove_register_gate("sdio1", "tclk", CLOCK_GATING_BIT_SDIO1); | ||
93 | nand = dove_register_gate("nand", "tclk", CLOCK_GATING_BIT_NAND); | ||
94 | camera = dove_register_gate("camera", "tclk", CLOCK_GATING_BIT_CAMERA); | ||
95 | i2s0 = dove_register_gate("i2s0", "tclk", CLOCK_GATING_BIT_I2S0); | ||
96 | i2s1 = dove_register_gate("i2s1", "tclk", CLOCK_GATING_BIT_I2S1); | ||
97 | crypto = dove_register_gate("crypto", "tclk", CLOCK_GATING_BIT_CRYPTO); | ||
98 | ac97 = dove_register_gate("ac97", "tclk", CLOCK_GATING_BIT_AC97); | ||
99 | pdma = dove_register_gate("pdma", "tclk", CLOCK_GATING_BIT_PDMA); | ||
100 | xor0 = dove_register_gate("xor0", "tclk", CLOCK_GATING_BIT_XOR0); | ||
101 | xor1 = dove_register_gate("xor1", "tclk", CLOCK_GATING_BIT_XOR1); | ||
102 | gephy = dove_register_gate("gephy", "tclk", CLOCK_GATING_BIT_GIGA_PHY); | ||
103 | ge = dove_register_gate("ge", "gephy", CLOCK_GATING_BIT_GBE); | ||
104 | |||
105 | orion_clkdev_add(NULL, "orion_spi.0", tclk); | ||
106 | orion_clkdev_add(NULL, "orion_spi.1", tclk); | ||
107 | orion_clkdev_add(NULL, "orion_wdt", tclk); | ||
108 | orion_clkdev_add(NULL, "mv64xxx_i2c.0", tclk); | ||
109 | |||
110 | orion_clkdev_add(NULL, "orion-ehci.0", usb0); | ||
111 | orion_clkdev_add(NULL, "orion-ehci.1", usb1); | ||
112 | orion_clkdev_add(NULL, "mv643xx_eth.0", ge); | ||
113 | orion_clkdev_add("0", "sata_mv.0", sata); | ||
114 | orion_clkdev_add("0", "pcie", pex0); | ||
115 | orion_clkdev_add("1", "pcie", pex1); | ||
116 | orion_clkdev_add(NULL, "sdhci-dove.0", sdio0); | ||
117 | orion_clkdev_add(NULL, "sdhci-dove.1", sdio1); | ||
118 | orion_clkdev_add(NULL, "orion_nand", nand); | ||
119 | orion_clkdev_add(NULL, "cafe1000-ccic.0", camera); | ||
120 | orion_clkdev_add(NULL, "kirkwood-i2s.0", i2s0); | ||
121 | orion_clkdev_add(NULL, "kirkwood-i2s.1", i2s1); | ||
122 | orion_clkdev_add(NULL, "mv_crypto", crypto); | ||
123 | orion_clkdev_add(NULL, "dove-ac97", ac97); | ||
124 | orion_clkdev_add(NULL, "dove-pdma", pdma); | ||
125 | orion_clkdev_add(NULL, "mv_xor_shared.0", xor0); | ||
126 | orion_clkdev_add(NULL, "mv_xor_shared.1", xor1); | ||
71 | } | 127 | } |
72 | 128 | ||
73 | /***************************************************************************** | 129 | /***************************************************************************** |
@@ -178,16 +234,16 @@ void __init dove_init_early(void) | |||
178 | orion_time_set_base(TIMER_VIRT_BASE); | 234 | orion_time_set_base(TIMER_VIRT_BASE); |
179 | } | 235 | } |
180 | 236 | ||
181 | static int get_tclk(void) | 237 | static int __init dove_find_tclk(void) |
182 | { | 238 | { |
183 | /* use DOVE_RESET_SAMPLE_HI/LO to detect tclk */ | ||
184 | return 166666667; | 239 | return 166666667; |
185 | } | 240 | } |
186 | 241 | ||
187 | static void __init dove_timer_init(void) | 242 | static void __init dove_timer_init(void) |
188 | { | 243 | { |
244 | dove_tclk = dove_find_tclk(); | ||
189 | orion_time_init(BRIDGE_VIRT_BASE, BRIDGE_INT_TIMER1_CLR, | 245 | orion_time_init(BRIDGE_VIRT_BASE, BRIDGE_INT_TIMER1_CLR, |
190 | IRQ_DOVE_BRIDGE, get_tclk()); | 246 | IRQ_DOVE_BRIDGE, dove_tclk); |
191 | } | 247 | } |
192 | 248 | ||
193 | struct sys_timer dove_timer = { | 249 | struct sys_timer dove_timer = { |
@@ -195,6 +251,15 @@ struct sys_timer dove_timer = { | |||
195 | }; | 251 | }; |
196 | 252 | ||
197 | /***************************************************************************** | 253 | /***************************************************************************** |
254 | * Cryptographic Engines and Security Accelerator (CESA) | ||
255 | ****************************************************************************/ | ||
256 | void __init dove_crypto_init(void) | ||
257 | { | ||
258 | orion_crypto_init(DOVE_CRYPT_PHYS_BASE, DOVE_CESA_PHYS_BASE, | ||
259 | DOVE_CESA_SIZE, IRQ_DOVE_CRYPTO); | ||
260 | } | ||
261 | |||
262 | /***************************************************************************** | ||
198 | * XOR 0 | 263 | * XOR 0 |
199 | ****************************************************************************/ | 264 | ****************************************************************************/ |
200 | void __init dove_xor0_init(void) | 265 | void __init dove_xor0_init(void) |
@@ -275,8 +340,8 @@ void __init dove_sdio1_init(void) | |||
275 | 340 | ||
276 | void __init dove_init(void) | 341 | void __init dove_init(void) |
277 | { | 342 | { |
278 | printk(KERN_INFO "Dove 88AP510 SoC, "); | 343 | pr_info("Dove 88AP510 SoC, TCLK = %d MHz.\n", |
279 | printk(KERN_INFO "TCLK = %dMHz\n", (get_tclk() + 499999) / 1000000); | 344 | (dove_tclk + 499999) / 1000000); |
280 | 345 | ||
281 | #ifdef CONFIG_CACHE_TAUROS2 | 346 | #ifdef CONFIG_CACHE_TAUROS2 |
282 | tauros2_init(0); | 347 | tauros2_init(0); |
@@ -284,7 +349,7 @@ void __init dove_init(void) | |||
284 | dove_setup_cpu_mbus(); | 349 | dove_setup_cpu_mbus(); |
285 | 350 | ||
286 | /* Setup root of clk tree */ | 351 | /* Setup root of clk tree */ |
287 | clk_init(); | 352 | dove_clk_init(); |
288 | 353 | ||
289 | /* internal devices that every board has */ | 354 | /* internal devices that every board has */ |
290 | dove_rtc_init(); | 355 | dove_rtc_init(); |
@@ -307,3 +372,67 @@ void dove_restart(char mode, const char *cmd) | |||
307 | while (1) | 372 | while (1) |
308 | ; | 373 | ; |
309 | } | 374 | } |
375 | |||
376 | #if defined(CONFIG_MACH_DOVE_DT) | ||
377 | /* | ||
378 | * Auxdata required until real OF clock provider | ||
379 | */ | ||
380 | struct of_dev_auxdata dove_auxdata_lookup[] __initdata = { | ||
381 | OF_DEV_AUXDATA("marvell,orion-spi", 0xf1010600, "orion_spi.0", NULL), | ||
382 | OF_DEV_AUXDATA("marvell,orion-spi", 0xf1014600, "orion_spi.1", NULL), | ||
383 | OF_DEV_AUXDATA("marvell,orion-wdt", 0xf1020300, "orion_wdt", NULL), | ||
384 | OF_DEV_AUXDATA("marvell,mv64xxx-i2c", 0xf1011000, "mv64xxx_i2c.0", | ||
385 | NULL), | ||
386 | OF_DEV_AUXDATA("marvell,orion-sata", 0xf10a0000, "sata_mv.0", NULL), | ||
387 | OF_DEV_AUXDATA("marvell,dove-sdhci", 0xf1092000, "sdhci-dove.0", NULL), | ||
388 | OF_DEV_AUXDATA("marvell,dove-sdhci", 0xf1090000, "sdhci-dove.1", NULL), | ||
389 | {}, | ||
390 | }; | ||
391 | |||
392 | static struct mv643xx_eth_platform_data dove_dt_ge00_data = { | ||
393 | .phy_addr = MV643XX_ETH_PHY_ADDR_DEFAULT, | ||
394 | }; | ||
395 | |||
396 | static void __init dove_dt_init(void) | ||
397 | { | ||
398 | pr_info("Dove 88AP510 SoC, TCLK = %d MHz.\n", | ||
399 | (dove_tclk + 499999) / 1000000); | ||
400 | |||
401 | #ifdef CONFIG_CACHE_TAUROS2 | ||
402 | tauros2_init(); | ||
403 | #endif | ||
404 | dove_setup_cpu_mbus(); | ||
405 | |||
406 | /* Setup root of clk tree */ | ||
407 | dove_clk_init(); | ||
408 | |||
409 | /* Internal devices not ported to DT yet */ | ||
410 | dove_rtc_init(); | ||
411 | dove_xor0_init(); | ||
412 | dove_xor1_init(); | ||
413 | |||
414 | dove_ge00_init(&dove_dt_ge00_data); | ||
415 | dove_ehci0_init(); | ||
416 | dove_ehci1_init(); | ||
417 | dove_pcie_init(1, 1); | ||
418 | dove_crypto_init(); | ||
419 | |||
420 | of_platform_populate(NULL, of_default_bus_match_table, | ||
421 | dove_auxdata_lookup, NULL); | ||
422 | } | ||
423 | |||
424 | static const char * const dove_dt_board_compat[] = { | ||
425 | "marvell,dove", | ||
426 | NULL | ||
427 | }; | ||
428 | |||
429 | DT_MACHINE_START(DOVE_DT, "Marvell Dove (Flattened Device Tree)") | ||
430 | .map_io = dove_map_io, | ||
431 | .init_early = dove_init_early, | ||
432 | .init_irq = orion_dt_init_irq, | ||
433 | .timer = &dove_timer, | ||
434 | .init_machine = dove_dt_init, | ||
435 | .restart = dove_restart, | ||
436 | .dt_compat = dove_dt_board_compat, | ||
437 | MACHINE_END | ||
438 | #endif | ||