diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-14 16:42:43 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-14 16:42:43 -0400 |
commit | 2cf4d4514d5b43c1f3b64bd0ec8b9853bde8f1dc (patch) | |
tree | e35a625496acc6ac852846d40b8851186b9d1ac4 /arch/arm/mach-kirkwood/common.c | |
parent | 44b7532b8b464f606053562400719c9c21276037 (diff) | |
parent | ce53895a5d24e0ee19fb92f56c17323fb4c9ab27 (diff) |
Merge branch 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm
* 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm: (417 commits)
MAINTAINERS: EB110ATX is not ebsa110
MAINTAINERS: update Eric Miao's email address and status
fb: add support of LCD display controller on pxa168/910 (base layer)
[ARM] 5552/1: ep93xx get_uart_rate(): use EP93XX_SYSCON_PWRCNT and EP93XX_SYSCON_PWRCN
[ARM] pxa/sharpsl_pm: zaurus needs generic pxa suspend/resume routines
[ARM] 5544/1: Trust PrimeCell resource sizes
[ARM] pxa/sharpsl_pm: cleanup of gpio-related code.
[ARM] pxa/sharpsl_pm: drop set_irq_type calls
[ARM] pxa/sharpsl_pm: merge pxa-specific code into generic one
[ARM] pxa/sharpsl_pm: merge the two sharpsl_pm.c since it's now pxa specific
[ARM] sa1100: remove unused collie_pm.c
[ARM] pxa: fix the conflicting non-static declarations of global_gpios[]
[ARM] 5550/1: Add default configure file for w90p910 platform
[ARM] 5549/1: Add clock api for w90p910 platform.
[ARM] 5548/1: Add gpio api for w90p910 platform
[ARM] 5551/1: Add multi-function pin api for w90p910 platform.
[ARM] Make ARM_VIC_NR depend on ARM_VIC
[ARM] 5546/1: ARM PL022 SSP/SPI driver v3
ARM: OMAP4: SMP: Update defconfig for OMAP4430
ARM: OMAP4: SMP: Enable SMP support for OMAP4430
...
Diffstat (limited to 'arch/arm/mach-kirkwood/common.c')
-rw-r--r-- | arch/arm/mach-kirkwood/common.c | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index be1ca28fed3f..0f6919838011 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/mv643xx_eth.h> | 16 | #include <linux/mv643xx_eth.h> |
17 | #include <linux/mv643xx_i2c.h> | 17 | #include <linux/mv643xx_i2c.h> |
18 | #include <linux/ata_platform.h> | 18 | #include <linux/ata_platform.h> |
19 | #include <linux/mtd/nand.h> | ||
19 | #include <linux/spi/orion_spi.h> | 20 | #include <linux/spi/orion_spi.h> |
20 | #include <net/dsa.h> | 21 | #include <net/dsa.h> |
21 | #include <asm/page.h> | 22 | #include <asm/page.h> |
@@ -29,6 +30,7 @@ | |||
29 | #include <plat/mvsdio.h> | 30 | #include <plat/mvsdio.h> |
30 | #include <plat/mv_xor.h> | 31 | #include <plat/mv_xor.h> |
31 | #include <plat/orion_nand.h> | 32 | #include <plat/orion_nand.h> |
33 | #include <plat/orion_wdt.h> | ||
32 | #include <plat/time.h> | 34 | #include <plat/time.h> |
33 | #include "common.h" | 35 | #include "common.h" |
34 | 36 | ||
@@ -54,6 +56,13 @@ void __init kirkwood_map_io(void) | |||
54 | iotable_init(kirkwood_io_desc, ARRAY_SIZE(kirkwood_io_desc)); | 56 | iotable_init(kirkwood_io_desc, ARRAY_SIZE(kirkwood_io_desc)); |
55 | } | 57 | } |
56 | 58 | ||
59 | /* | ||
60 | * Default clock control bits. Any bit _not_ set in this variable | ||
61 | * will be cleared from the hardware after platform devices have been | ||
62 | * registered. Some reserved bits must be set to 1. | ||
63 | */ | ||
64 | unsigned int kirkwood_clk_ctrl = CGC_DUNIT | CGC_RESERVED; | ||
65 | |||
57 | 66 | ||
58 | /***************************************************************************** | 67 | /***************************************************************************** |
59 | * EHCI | 68 | * EHCI |
@@ -95,6 +104,7 @@ static struct platform_device kirkwood_ehci = { | |||
95 | 104 | ||
96 | void __init kirkwood_ehci_init(void) | 105 | void __init kirkwood_ehci_init(void) |
97 | { | 106 | { |
107 | kirkwood_clk_ctrl |= CGC_USB0; | ||
98 | platform_device_register(&kirkwood_ehci); | 108 | platform_device_register(&kirkwood_ehci); |
99 | } | 109 | } |
100 | 110 | ||
@@ -151,6 +161,7 @@ static struct platform_device kirkwood_ge00 = { | |||
151 | 161 | ||
152 | void __init kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data) | 162 | void __init kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data) |
153 | { | 163 | { |
164 | kirkwood_clk_ctrl |= CGC_GE0; | ||
154 | eth_data->shared = &kirkwood_ge00_shared; | 165 | eth_data->shared = &kirkwood_ge00_shared; |
155 | kirkwood_ge00.dev.platform_data = eth_data; | 166 | kirkwood_ge00.dev.platform_data = eth_data; |
156 | 167 | ||
@@ -212,6 +223,7 @@ static struct platform_device kirkwood_ge01 = { | |||
212 | 223 | ||
213 | void __init kirkwood_ge01_init(struct mv643xx_eth_platform_data *eth_data) | 224 | void __init kirkwood_ge01_init(struct mv643xx_eth_platform_data *eth_data) |
214 | { | 225 | { |
226 | kirkwood_clk_ctrl |= CGC_GE1; | ||
215 | eth_data->shared = &kirkwood_ge01_shared; | 227 | eth_data->shared = &kirkwood_ge01_shared; |
216 | kirkwood_ge01.dev.platform_data = eth_data; | 228 | kirkwood_ge01.dev.platform_data = eth_data; |
217 | 229 | ||
@@ -258,6 +270,43 @@ void __init kirkwood_ge00_switch_init(struct dsa_platform_data *d, int irq) | |||
258 | 270 | ||
259 | 271 | ||
260 | /***************************************************************************** | 272 | /***************************************************************************** |
273 | * NAND flash | ||
274 | ****************************************************************************/ | ||
275 | static struct resource kirkwood_nand_resource = { | ||
276 | .flags = IORESOURCE_MEM, | ||
277 | .start = KIRKWOOD_NAND_MEM_PHYS_BASE, | ||
278 | .end = KIRKWOOD_NAND_MEM_PHYS_BASE + | ||
279 | KIRKWOOD_NAND_MEM_SIZE - 1, | ||
280 | }; | ||
281 | |||
282 | static struct orion_nand_data kirkwood_nand_data = { | ||
283 | .cle = 0, | ||
284 | .ale = 1, | ||
285 | .width = 8, | ||
286 | }; | ||
287 | |||
288 | static struct platform_device kirkwood_nand_flash = { | ||
289 | .name = "orion_nand", | ||
290 | .id = -1, | ||
291 | .dev = { | ||
292 | .platform_data = &kirkwood_nand_data, | ||
293 | }, | ||
294 | .resource = &kirkwood_nand_resource, | ||
295 | .num_resources = 1, | ||
296 | }; | ||
297 | |||
298 | void __init kirkwood_nand_init(struct mtd_partition *parts, int nr_parts, | ||
299 | int chip_delay) | ||
300 | { | ||
301 | kirkwood_clk_ctrl |= CGC_RUNIT; | ||
302 | kirkwood_nand_data.parts = parts; | ||
303 | kirkwood_nand_data.nr_parts = nr_parts; | ||
304 | kirkwood_nand_data.chip_delay = chip_delay; | ||
305 | platform_device_register(&kirkwood_nand_flash); | ||
306 | } | ||
307 | |||
308 | |||
309 | /***************************************************************************** | ||
261 | * SoC RTC | 310 | * SoC RTC |
262 | ****************************************************************************/ | 311 | ****************************************************************************/ |
263 | static struct resource kirkwood_rtc_resource = { | 312 | static struct resource kirkwood_rtc_resource = { |
@@ -301,6 +350,9 @@ static struct platform_device kirkwood_sata = { | |||
301 | 350 | ||
302 | void __init kirkwood_sata_init(struct mv_sata_platform_data *sata_data) | 351 | void __init kirkwood_sata_init(struct mv_sata_platform_data *sata_data) |
303 | { | 352 | { |
353 | kirkwood_clk_ctrl |= CGC_SATA0; | ||
354 | if (sata_data->n_ports > 1) | ||
355 | kirkwood_clk_ctrl |= CGC_SATA1; | ||
304 | sata_data->dram = &kirkwood_mbus_dram_info; | 356 | sata_data->dram = &kirkwood_mbus_dram_info; |
305 | kirkwood_sata.dev.platform_data = sata_data; | 357 | kirkwood_sata.dev.platform_data = sata_data; |
306 | platform_device_register(&kirkwood_sata); | 358 | platform_device_register(&kirkwood_sata); |
@@ -346,6 +398,7 @@ void __init kirkwood_sdio_init(struct mvsdio_platform_data *mvsdio_data) | |||
346 | else | 398 | else |
347 | mvsdio_data->clock = 200000000; | 399 | mvsdio_data->clock = 200000000; |
348 | mvsdio_data->dram = &kirkwood_mbus_dram_info; | 400 | mvsdio_data->dram = &kirkwood_mbus_dram_info; |
401 | kirkwood_clk_ctrl |= CGC_SDIO; | ||
349 | kirkwood_sdio.dev.platform_data = mvsdio_data; | 402 | kirkwood_sdio.dev.platform_data = mvsdio_data; |
350 | platform_device_register(&kirkwood_sdio); | 403 | platform_device_register(&kirkwood_sdio); |
351 | } | 404 | } |
@@ -377,6 +430,7 @@ static struct platform_device kirkwood_spi = { | |||
377 | 430 | ||
378 | void __init kirkwood_spi_init() | 431 | void __init kirkwood_spi_init() |
379 | { | 432 | { |
433 | kirkwood_clk_ctrl |= CGC_RUNIT; | ||
380 | platform_device_register(&kirkwood_spi); | 434 | platform_device_register(&kirkwood_spi); |
381 | } | 435 | } |
382 | 436 | ||
@@ -507,6 +561,43 @@ void __init kirkwood_uart1_init(void) | |||
507 | 561 | ||
508 | 562 | ||
509 | /***************************************************************************** | 563 | /***************************************************************************** |
564 | * Cryptographic Engines and Security Accelerator (CESA) | ||
565 | ****************************************************************************/ | ||
566 | |||
567 | static struct resource kirkwood_crypto_res[] = { | ||
568 | { | ||
569 | .name = "regs", | ||
570 | .start = CRYPTO_PHYS_BASE, | ||
571 | .end = CRYPTO_PHYS_BASE + 0xffff, | ||
572 | .flags = IORESOURCE_MEM, | ||
573 | }, { | ||
574 | .name = "sram", | ||
575 | .start = KIRKWOOD_SRAM_PHYS_BASE, | ||
576 | .end = KIRKWOOD_SRAM_PHYS_BASE + KIRKWOOD_SRAM_SIZE - 1, | ||
577 | .flags = IORESOURCE_MEM, | ||
578 | }, { | ||
579 | .name = "crypto interrupt", | ||
580 | .start = IRQ_KIRKWOOD_CRYPTO, | ||
581 | .end = IRQ_KIRKWOOD_CRYPTO, | ||
582 | .flags = IORESOURCE_IRQ, | ||
583 | }, | ||
584 | }; | ||
585 | |||
586 | static struct platform_device kirkwood_crypto_device = { | ||
587 | .name = "mv_crypto", | ||
588 | .id = -1, | ||
589 | .num_resources = ARRAY_SIZE(kirkwood_crypto_res), | ||
590 | .resource = kirkwood_crypto_res, | ||
591 | }; | ||
592 | |||
593 | void __init kirkwood_crypto_init(void) | ||
594 | { | ||
595 | kirkwood_clk_ctrl |= CGC_CRYPTO; | ||
596 | platform_device_register(&kirkwood_crypto_device); | ||
597 | } | ||
598 | |||
599 | |||
600 | /***************************************************************************** | ||
510 | * XOR | 601 | * XOR |
511 | ****************************************************************************/ | 602 | ****************************************************************************/ |
512 | static struct mv_xor_platform_shared_data kirkwood_xor_shared_data = { | 603 | static struct mv_xor_platform_shared_data kirkwood_xor_shared_data = { |
@@ -597,6 +688,7 @@ static struct platform_device kirkwood_xor01_channel = { | |||
597 | 688 | ||
598 | static void __init kirkwood_xor0_init(void) | 689 | static void __init kirkwood_xor0_init(void) |
599 | { | 690 | { |
691 | kirkwood_clk_ctrl |= CGC_XOR0; | ||
600 | platform_device_register(&kirkwood_xor0_shared); | 692 | platform_device_register(&kirkwood_xor0_shared); |
601 | 693 | ||
602 | /* | 694 | /* |
@@ -695,6 +787,7 @@ static struct platform_device kirkwood_xor11_channel = { | |||
695 | 787 | ||
696 | static void __init kirkwood_xor1_init(void) | 788 | static void __init kirkwood_xor1_init(void) |
697 | { | 789 | { |
790 | kirkwood_clk_ctrl |= CGC_XOR1; | ||
698 | platform_device_register(&kirkwood_xor1_shared); | 791 | platform_device_register(&kirkwood_xor1_shared); |
699 | 792 | ||
700 | /* | 793 | /* |
@@ -713,6 +806,29 @@ static void __init kirkwood_xor1_init(void) | |||
713 | 806 | ||
714 | 807 | ||
715 | /***************************************************************************** | 808 | /***************************************************************************** |
809 | * Watchdog | ||
810 | ****************************************************************************/ | ||
811 | static struct orion_wdt_platform_data kirkwood_wdt_data = { | ||
812 | .tclk = 0, | ||
813 | }; | ||
814 | |||
815 | static struct platform_device kirkwood_wdt_device = { | ||
816 | .name = "orion_wdt", | ||
817 | .id = -1, | ||
818 | .dev = { | ||
819 | .platform_data = &kirkwood_wdt_data, | ||
820 | }, | ||
821 | .num_resources = 0, | ||
822 | }; | ||
823 | |||
824 | static void __init kirkwood_wdt_init(void) | ||
825 | { | ||
826 | kirkwood_wdt_data.tclk = kirkwood_tclk; | ||
827 | platform_device_register(&kirkwood_wdt_device); | ||
828 | } | ||
829 | |||
830 | |||
831 | /***************************************************************************** | ||
716 | * Time handling | 832 | * Time handling |
717 | ****************************************************************************/ | 833 | ****************************************************************************/ |
718 | int kirkwood_tclk; | 834 | int kirkwood_tclk; |
@@ -804,6 +920,49 @@ void __init kirkwood_init(void) | |||
804 | 920 | ||
805 | /* internal devices that every board has */ | 921 | /* internal devices that every board has */ |
806 | kirkwood_rtc_init(); | 922 | kirkwood_rtc_init(); |
923 | kirkwood_wdt_init(); | ||
807 | kirkwood_xor0_init(); | 924 | kirkwood_xor0_init(); |
808 | kirkwood_xor1_init(); | 925 | kirkwood_xor1_init(); |
926 | kirkwood_crypto_init(); | ||
927 | } | ||
928 | |||
929 | static int __init kirkwood_clock_gate(void) | ||
930 | { | ||
931 | unsigned int curr = readl(CLOCK_GATING_CTRL); | ||
932 | |||
933 | printk(KERN_DEBUG "Gating clock of unused units\n"); | ||
934 | printk(KERN_DEBUG "before: 0x%08x\n", curr); | ||
935 | |||
936 | /* Make sure those units are accessible */ | ||
937 | writel(curr | CGC_SATA0 | CGC_SATA1 | CGC_PEX0, CLOCK_GATING_CTRL); | ||
938 | |||
939 | /* For SATA: first shutdown the phy */ | ||
940 | if (!(kirkwood_clk_ctrl & CGC_SATA0)) { | ||
941 | /* Disable PLL and IVREF */ | ||
942 | writel(readl(SATA0_PHY_MODE_2) & ~0xf, SATA0_PHY_MODE_2); | ||
943 | /* Disable PHY */ | ||
944 | writel(readl(SATA0_IF_CTRL) | 0x200, SATA0_IF_CTRL); | ||
945 | } | ||
946 | if (!(kirkwood_clk_ctrl & CGC_SATA1)) { | ||
947 | /* Disable PLL and IVREF */ | ||
948 | writel(readl(SATA1_PHY_MODE_2) & ~0xf, SATA1_PHY_MODE_2); | ||
949 | /* Disable PHY */ | ||
950 | writel(readl(SATA1_IF_CTRL) | 0x200, SATA1_IF_CTRL); | ||
951 | } | ||
952 | |||
953 | /* For PCIe: first shutdown the phy */ | ||
954 | if (!(kirkwood_clk_ctrl & CGC_PEX0)) { | ||
955 | writel(readl(PCIE_LINK_CTRL) | 0x10, PCIE_LINK_CTRL); | ||
956 | while (1) | ||
957 | if (readl(PCIE_STATUS) & 0x1) | ||
958 | break; | ||
959 | writel(readl(PCIE_LINK_CTRL) & ~0x10, PCIE_LINK_CTRL); | ||
960 | } | ||
961 | |||
962 | /* Now gate clock the required units */ | ||
963 | writel(kirkwood_clk_ctrl, CLOCK_GATING_CTRL); | ||
964 | printk(KERN_DEBUG " after: 0x%08x\n", readl(CLOCK_GATING_CTRL)); | ||
965 | |||
966 | return 0; | ||
809 | } | 967 | } |
968 | late_initcall(kirkwood_clock_gate); | ||