ARM: EXYNOS: Clear OF_POPULATED flag from PMU node in IRQ init callback
[deliverable/linux.git] / arch / arm / mach-exynos / exynos.c
CommitLineData
cc511b8d 1/*
cbf08b9e 2 * SAMSUNG EXYNOS Flattened Device Tree enabled machine
cc511b8d 3 *
cbf08b9e
SK
4 * Copyright (c) 2010-2014 Samsung Electronics Co., Ltd.
5 * http://www.samsung.com
cc511b8d
KK
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
cbf08b9e 12#include <linux/init.h>
cc511b8d 13#include <linux/io.h>
237c78be 14#include <linux/of.h>
e873a47c 15#include <linux/of_address.h>
cbf08b9e 16#include <linux/of_fdt.h>
35baa336 17#include <linux/platform_device.h>
fce9e5bb 18#include <linux/irqchip.h>
2262d6ef 19#include <linux/soc/samsung/exynos-regs-pmu.h>
cc511b8d 20
cbf08b9e 21#include <asm/cacheflush.h>
cc511b8d 22#include <asm/hardware/cache-l2x0.h>
cbf08b9e 23#include <asm/mach/arch.h>
cc511b8d 24#include <asm/mach/map.h>
cc511b8d 25
32b0aa9a 26#include <mach/map.h>
d3221cc6 27#include <plat/cpu.h>
32b0aa9a 28
cc511b8d 29#include "common.h"
65c9a853 30
94c7ca71
KK
31static struct map_desc exynos4_iodesc[] __initdata = {
32 {
cc511b8d
KK
33 .virtual = (unsigned long)S5P_VA_CMU,
34 .pfn = __phys_to_pfn(EXYNOS4_PA_CMU),
35 .length = SZ_128K,
36 .type = MT_DEVICE,
37 }, {
38 .virtual = (unsigned long)S5P_VA_COREPERI_BASE,
39 .pfn = __phys_to_pfn(EXYNOS4_PA_COREPERI),
40 .length = SZ_8K,
41 .type = MT_DEVICE,
cc511b8d
KK
42 }, {
43 .virtual = (unsigned long)S5P_VA_DMC0,
44 .pfn = __phys_to_pfn(EXYNOS4_PA_DMC0),
2bde0b08
MH
45 .length = SZ_64K,
46 .type = MT_DEVICE,
47 }, {
48 .virtual = (unsigned long)S5P_VA_DMC1,
49 .pfn = __phys_to_pfn(EXYNOS4_PA_DMC1),
50 .length = SZ_64K,
cc511b8d 51 .type = MT_DEVICE,
cc511b8d
KK
52 },
53};
54
35baa336 55static struct platform_device exynos_cpuidle = {
277f5046 56 .name = "exynos_cpuidle",
658cff0d 57#ifdef CONFIG_ARM_EXYNOS_CPUIDLE
277f5046 58 .dev.platform_data = exynos_enter_aftr,
658cff0d 59#endif
277f5046 60 .id = -1,
35baa336
BZ
61};
62
1754c42e
OJ
63void __iomem *sysram_base_addr;
64void __iomem *sysram_ns_base_addr;
65
66void __init exynos_sysram_init(void)
67{
68 struct device_node *node;
69
70 for_each_compatible_node(node, NULL, "samsung,exynos4210-sysram") {
71 if (!of_device_is_available(node))
72 continue;
73 sysram_base_addr = of_iomap(node, 0);
74 break;
75 }
76
77 for_each_compatible_node(node, NULL, "samsung,exynos4210-sysram-ns") {
78 if (!of_device_is_available(node))
79 continue;
80 sysram_ns_base_addr = of_iomap(node, 0);
81 break;
82 }
83}
84
5e299f65 85static void __init exynos_init_late(void)
bb13fabc 86{
2edb36c4
KK
87 if (of_machine_is_compatible("samsung,exynos5440"))
88 /* to be supported later */
89 return;
90
559ba237 91 exynos_pm_init();
bb13fabc
SG
92}
93
564d06b1 94static int __init exynos_fdt_map_chipid(unsigned long node, const char *uname,
f5f83c71
TA
95 int depth, void *data)
96{
97 struct map_desc iodesc;
3eb93646 98 const __be32 *reg;
9d0c4dfe 99 int len;
f5f83c71
TA
100
101 if (!of_flat_dt_is_compatible(node, "samsung,exynos4210-chipid") &&
102 !of_flat_dt_is_compatible(node, "samsung,exynos5440-clock"))
103 return 0;
104
105 reg = of_get_flat_dt_prop(node, "reg", &len);
106 if (reg == NULL || len != (sizeof(unsigned long) * 2))
107 return 0;
108
109 iodesc.pfn = __phys_to_pfn(be32_to_cpu(reg[0]));
110 iodesc.length = be32_to_cpu(reg[1]) - 1;
111 iodesc.virtual = (unsigned long)S5P_VA_CHIPID;
112 iodesc.type = MT_DEVICE;
113 iotable_init(&iodesc, 1);
114 return 1;
115}
f5f83c71 116
cc511b8d
KK
117/*
118 * exynos_map_io
119 *
120 * register the standard cpu IO areas
121 */
6eb84669
SK
122static void __init exynos_map_io(void)
123{
cbf08b9e 124 if (soc_is_exynos4())
6eb84669 125 iotable_init(exynos4_iodesc, ARRAY_SIZE(exynos4_iodesc));
6eb84669 126}
cc511b8d 127
5e299f65 128static void __init exynos_init_io(void)
cc511b8d 129{
9c1fcdcc
DA
130 debug_ll_io_init();
131
04fae596 132 of_scan_flat_dt(exynos_fdt_map_chipid, NULL);
2edb36c4 133
cc511b8d
KK
134 /* detect cpu id and rev. */
135 s5p_init_cpu(S5P_VA_CHIPID);
136
6eb84669 137 exynos_map_io();
94c7ca71
KK
138}
139
6f024978
KK
140/*
141 * Set or clear the USE_DELAYED_RESET_ASSERTION option. Used by smp code
142 * and suspend.
143 *
144 * This is necessary only on Exynos4 SoCs. When system is running
145 * USE_DELAYED_RESET_ASSERTION should be set so the ARM CLK clock down
146 * feature could properly detect global idle state when secondary CPU is
147 * powered down.
148 *
149 * However this should not be set when such system is going into suspend.
150 */
151void exynos_set_delayed_reset_assertion(bool enable)
152{
c1f0ecff 153 if (of_machine_is_compatible("samsung,exynos4")) {
6f024978
KK
154 unsigned int tmp, core_id;
155
156 for (core_id = 0; core_id < num_possible_cpus(); core_id++) {
157 tmp = pmu_raw_readl(EXYNOS_ARM_CORE_OPTION(core_id));
158 if (enable)
159 tmp |= S5P_USE_DELAYED_RESET_ASSERTION;
160 else
161 tmp &= ~(S5P_USE_DELAYED_RESET_ASSERTION);
162 pmu_raw_writel(tmp, EXYNOS_ARM_CORE_OPTION(core_id));
163 }
164 }
165}
166
8b283c02
MZ
167/*
168 * Apparently, these SoCs are not able to wake-up from suspend using
169 * the PMU. Too bad. Should they suddenly become capable of such a
170 * feat, the matches below should be moved to suspend.c.
171 */
fce9e5bb 172static const struct of_device_id exynos_dt_pmu_match[] = {
22ead0d7 173 { .compatible = "samsung,exynos5260-pmu" },
98504def 174 { .compatible = "samsung,exynos5410-pmu" },
fce9e5bb
PD
175 { /*sentinel*/ },
176};
177
178static void exynos_map_pmu(void)
179{
180 struct device_node *np;
181
182 np = of_find_matching_node(NULL, exynos_dt_pmu_match);
183 if (np)
184 pmu_base_addr = of_iomap(np, 0);
fce9e5bb
PD
185}
186
187static void __init exynos_init_irq(void)
188{
189 irqchip_init();
190 /*
191 * Since platsmp.c needs pmu base address by the time
192 * DT is not unflatten so we can't use DT APIs before
193 * init_irq
194 */
195 exynos_map_pmu();
196}
197
cbf08b9e 198static void __init exynos_dt_machine_init(void)
cc511b8d 199{
1754c42e
OJ
200 /*
201 * This is called from smp_prepare_cpus if we've built for SMP, but
202 * we still need to set it up for PM and firmware ops if not.
203 */
73ea6ec6 204 if (!IS_ENABLED(CONFIG_SMP))
1754c42e
OJ
205 exynos_sysram_init();
206
cfdda353 207#if defined(CONFIG_SMP) && defined(CONFIG_ARM_EXYNOS_CPUIDLE)
af997114
BZ
208 if (of_machine_is_compatible("samsung,exynos4210") ||
209 of_machine_is_compatible("samsung,exynos3250"))
712eddf7
BZ
210 exynos_cpuidle.dev.platform_data = &cpuidle_coupled_exynos_data;
211#endif
6887d9e5 212 if (of_machine_is_compatible("samsung,exynos4210") ||
42d5dc37
BZ
213 of_machine_is_compatible("samsung,exynos4212") ||
214 (of_machine_is_compatible("samsung,exynos4412") &&
215 of_machine_is_compatible("samsung,trats2")) ||
bd0d888c 216 of_machine_is_compatible("samsung,exynos3250") ||
42d5dc37 217 of_machine_is_compatible("samsung,exynos5250"))
6887d9e5 218 platform_device_register(&exynos_cpuidle);
cc511b8d 219}
cbf08b9e 220
543c5040 221static char const *const exynos_dt_compat[] __initconst = {
940bc58d
CC
222 "samsung,exynos3",
223 "samsung,exynos3250",
4868123c 224 "samsung,exynos4",
cbf08b9e
SK
225 "samsung,exynos4210",
226 "samsung,exynos4212",
227 "samsung,exynos4412",
c0adae9e 228 "samsung,exynos4415",
4868123c 229 "samsung,exynos5",
cbf08b9e 230 "samsung,exynos5250",
ed08f103 231 "samsung,exynos5260",
cbf08b9e
SK
232 "samsung,exynos5420",
233 "samsung,exynos5440",
234 NULL
235};
236
5a12a597
LA
237static void __init exynos_dt_fixup(void)
238{
239 /*
240 * Some versions of uboot pass garbage entries in the memory node,
241 * use the old CONFIG_ARM_NR_BANKS
242 */
243 of_fdt_limit_memory(8);
244}
245
cbf08b9e
SK
246DT_MACHINE_START(EXYNOS_DT, "SAMSUNG EXYNOS (Flattened Device Tree)")
247 /* Maintainer: Thomas Abraham <thomas.abraham@linaro.org> */
248 /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
15b0bc40
RK
249 .l2c_aux_val = 0x3c400001,
250 .l2c_aux_mask = 0xc20fffff,
cbf08b9e
SK
251 .smp = smp_ops(exynos_smp_ops),
252 .map_io = exynos_init_io,
253 .init_early = exynos_firmware_init,
fce9e5bb 254 .init_irq = exynos_init_irq,
cbf08b9e
SK
255 .init_machine = exynos_dt_machine_init,
256 .init_late = exynos_init_late,
257 .dt_compat = exynos_dt_compat,
5a12a597 258 .dt_fixup = exynos_dt_fixup,
cbf08b9e 259MACHINE_END
This page took 0.23522 seconds and 5 git commands to generate.