diff options
author | Arnd Bergmann <arnd@arndb.de> | 2014-12-04 10:46:43 -0500 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2014-12-04 10:46:43 -0500 |
commit | ab64920c3742ba992a3bf0b06f9750d1cad9d050 (patch) | |
tree | 3391e85b0bb7372d7d34775047e9d8c894042938 /arch/arm/mach-mvebu/board-v7.c | |
parent | 756f80cee766574ae282baa97fdcf9cc6d0cc70c (diff) | |
parent | 6e6db2bea3ea9424a0cb19d89d47664bc13e31bc (diff) |
Merge tag 'mvebu-soc-suspend-3.19' of git://git.infradead.org/linux-mvebu into next/soc
Pull "mvebu SoC suspend changes for v3.19" from Jason Cooper:
- Armada 370/XP suspend/resume support
- mvebu SoC driver suspend/resume support
- irqchip
- clocksource
- mbus
- clk
* tag 'mvebu-soc-suspend-3.19' of git://git.infradead.org/linux-mvebu:
ARM: mvebu: add SDRAM controller description for Armada XP
ARM: mvebu: adjust mbus controller description on Armada 370/XP
ARM: mvebu: add suspend/resume DT information for Armada XP GP
ARM: mvebu: synchronize secondary CPU clocks on resume
ARM: mvebu: make sure MMU is disabled in armada_370_xp_cpu_resume
ARM: mvebu: Armada XP GP specific suspend/resume code
ARM: mvebu: reserve the first 10 KB of each memory bank for suspend/resume
ARM: mvebu: implement suspend/resume support for Armada XP
clk: mvebu: add suspend/resume for gatable clocks
bus: mvebu-mbus: provide a mechanism to save SDRAM window configuration
bus: mvebu-mbus: suspend/resume support
clocksource: time-armada-370-xp: add suspend/resume support
irqchip: armada-370-xp: Add suspend/resume support
Documentation: dt-bindings: minimal documentation for MVEBU SDRAM controller
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'arch/arm/mach-mvebu/board-v7.c')
-rw-r--r-- | arch/arm/mach-mvebu/board-v7.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/arch/arm/mach-mvebu/board-v7.c b/arch/arm/mach-mvebu/board-v7.c index e15ead876a48..89a139ed7d5b 100644 --- a/arch/arm/mach-mvebu/board-v7.c +++ b/arch/arm/mach-mvebu/board-v7.c | |||
@@ -16,10 +16,12 @@ | |||
16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
17 | #include <linux/clk-provider.h> | 17 | #include <linux/clk-provider.h> |
18 | #include <linux/of_address.h> | 18 | #include <linux/of_address.h> |
19 | #include <linux/of_fdt.h> | ||
19 | #include <linux/of_platform.h> | 20 | #include <linux/of_platform.h> |
20 | #include <linux/io.h> | 21 | #include <linux/io.h> |
21 | #include <linux/clocksource.h> | 22 | #include <linux/clocksource.h> |
22 | #include <linux/dma-mapping.h> | 23 | #include <linux/dma-mapping.h> |
24 | #include <linux/memblock.h> | ||
23 | #include <linux/mbus.h> | 25 | #include <linux/mbus.h> |
24 | #include <linux/signal.h> | 26 | #include <linux/signal.h> |
25 | #include <linux/slab.h> | 27 | #include <linux/slab.h> |
@@ -57,6 +59,54 @@ void __iomem *mvebu_get_scu_base(void) | |||
57 | } | 59 | } |
58 | 60 | ||
59 | /* | 61 | /* |
62 | * When returning from suspend, the platform goes through the | ||
63 | * bootloader, which executes its DDR3 training code. This code has | ||
64 | * the unfortunate idea of using the first 10 KB of each DRAM bank to | ||
65 | * exercise the RAM and calculate the optimal timings. Therefore, this | ||
66 | * area of RAM is overwritten, and shouldn't be used by the kernel if | ||
67 | * suspend/resume is supported. | ||
68 | */ | ||
69 | |||
70 | #ifdef CONFIG_SUSPEND | ||
71 | #define MVEBU_DDR_TRAINING_AREA_SZ (10 * SZ_1K) | ||
72 | static int __init mvebu_scan_mem(unsigned long node, const char *uname, | ||
73 | int depth, void *data) | ||
74 | { | ||
75 | const char *type = of_get_flat_dt_prop(node, "device_type", NULL); | ||
76 | const __be32 *reg, *endp; | ||
77 | int l; | ||
78 | |||
79 | if (type == NULL || strcmp(type, "memory")) | ||
80 | return 0; | ||
81 | |||
82 | reg = of_get_flat_dt_prop(node, "linux,usable-memory", &l); | ||
83 | if (reg == NULL) | ||
84 | reg = of_get_flat_dt_prop(node, "reg", &l); | ||
85 | if (reg == NULL) | ||
86 | return 0; | ||
87 | |||
88 | endp = reg + (l / sizeof(__be32)); | ||
89 | while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) { | ||
90 | u64 base, size; | ||
91 | |||
92 | base = dt_mem_next_cell(dt_root_addr_cells, ®); | ||
93 | size = dt_mem_next_cell(dt_root_size_cells, ®); | ||
94 | |||
95 | memblock_reserve(base, MVEBU_DDR_TRAINING_AREA_SZ); | ||
96 | } | ||
97 | |||
98 | return 0; | ||
99 | } | ||
100 | |||
101 | static void __init mvebu_memblock_reserve(void) | ||
102 | { | ||
103 | of_scan_flat_dt(mvebu_scan_mem, NULL); | ||
104 | } | ||
105 | #else | ||
106 | static void __init mvebu_memblock_reserve(void) {} | ||
107 | #endif | ||
108 | |||
109 | /* | ||
60 | * Early versions of Armada 375 SoC have a bug where the BootROM | 110 | * Early versions of Armada 375 SoC have a bug where the BootROM |
61 | * leaves an external data abort pending. The kernel is hit by this | 111 | * leaves an external data abort pending. The kernel is hit by this |
62 | * data abort as soon as it enters userspace, because it unmasks the | 112 | * data abort as soon as it enters userspace, because it unmasks the |
@@ -151,6 +201,7 @@ DT_MACHINE_START(ARMADA_370_XP_DT, "Marvell Armada 370/XP (Device Tree)") | |||
151 | .init_machine = mvebu_dt_init, | 201 | .init_machine = mvebu_dt_init, |
152 | .init_irq = mvebu_init_irq, | 202 | .init_irq = mvebu_init_irq, |
153 | .restart = mvebu_restart, | 203 | .restart = mvebu_restart, |
204 | .reserve = mvebu_memblock_reserve, | ||
154 | .dt_compat = armada_370_xp_dt_compat, | 205 | .dt_compat = armada_370_xp_dt_compat, |
155 | MACHINE_END | 206 | MACHINE_END |
156 | 207 | ||