ARM: EXYNOS: Fix build breakage cpuidle on !SMP
[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>
cbf08b9e 14#include <linux/kernel.h>
334a1c70 15#include <linux/serial_s3c.h>
237c78be 16#include <linux/of.h>
e873a47c 17#include <linux/of_address.h>
cbf08b9e
SK
18#include <linux/of_fdt.h>
19#include <linux/of_platform.h>
35baa336 20#include <linux/platform_device.h>
cbf08b9e 21#include <linux/pm_domain.h>
fce9e5bb 22#include <linux/irqchip.h>
cc511b8d 23
cbf08b9e 24#include <asm/cacheflush.h>
cc511b8d 25#include <asm/hardware/cache-l2x0.h>
cbf08b9e 26#include <asm/mach/arch.h>
cc511b8d 27#include <asm/mach/map.h>
cbf08b9e 28#include <asm/memory.h>
cc511b8d 29
32b0aa9a
PD
30#include <mach/map.h>
31
cc511b8d 32#include "common.h"
cbf08b9e 33#include "mfc.h"
65c9a853
KK
34#include "regs-pmu.h"
35
fce9e5bb 36void __iomem *pmu_base_addr;
65c9a853 37
94c7ca71
KK
38static struct map_desc exynos4_iodesc[] __initdata = {
39 {
cc511b8d
KK
40 .virtual = (unsigned long)S5P_VA_SROMC,
41 .pfn = __phys_to_pfn(EXYNOS4_PA_SROMC),
42 .length = SZ_4K,
43 .type = MT_DEVICE,
94c7ca71 44 }, {
cc511b8d
KK
45 .virtual = (unsigned long)S5P_VA_CMU,
46 .pfn = __phys_to_pfn(EXYNOS4_PA_CMU),
47 .length = SZ_128K,
48 .type = MT_DEVICE,
49 }, {
50 .virtual = (unsigned long)S5P_VA_COREPERI_BASE,
51 .pfn = __phys_to_pfn(EXYNOS4_PA_COREPERI),
52 .length = SZ_8K,
53 .type = MT_DEVICE,
cc511b8d
KK
54 }, {
55 .virtual = (unsigned long)S5P_VA_DMC0,
56 .pfn = __phys_to_pfn(EXYNOS4_PA_DMC0),
2bde0b08
MH
57 .length = SZ_64K,
58 .type = MT_DEVICE,
59 }, {
60 .virtual = (unsigned long)S5P_VA_DMC1,
61 .pfn = __phys_to_pfn(EXYNOS4_PA_DMC1),
62 .length = SZ_64K,
cc511b8d 63 .type = MT_DEVICE,
cc511b8d
KK
64 },
65};
66
94c7ca71
KK
67static struct map_desc exynos5_iodesc[] __initdata = {
68 {
94c7ca71
KK
69 .virtual = (unsigned long)S5P_VA_SROMC,
70 .pfn = __phys_to_pfn(EXYNOS5_PA_SROMC),
71 .length = SZ_4K,
72 .type = MT_DEVICE,
94c7ca71
KK
73 }, {
74 .virtual = (unsigned long)S5P_VA_CMU,
75 .pfn = __phys_to_pfn(EXYNOS5_PA_CMU),
76 .length = 144 * SZ_1K,
77 .type = MT_DEVICE,
2edb36c4
KK
78 },
79};
80
35baa336 81static struct platform_device exynos_cpuidle = {
277f5046 82 .name = "exynos_cpuidle",
658cff0d 83#ifdef CONFIG_ARM_EXYNOS_CPUIDLE
277f5046 84 .dev.platform_data = exynos_enter_aftr,
658cff0d 85#endif
277f5046 86 .id = -1,
35baa336
BZ
87};
88
1754c42e
OJ
89void __iomem *sysram_base_addr;
90void __iomem *sysram_ns_base_addr;
91
92void __init exynos_sysram_init(void)
93{
94 struct device_node *node;
95
96 for_each_compatible_node(node, NULL, "samsung,exynos4210-sysram") {
97 if (!of_device_is_available(node))
98 continue;
99 sysram_base_addr = of_iomap(node, 0);
100 break;
101 }
102
103 for_each_compatible_node(node, NULL, "samsung,exynos4210-sysram-ns") {
104 if (!of_device_is_available(node))
105 continue;
106 sysram_ns_base_addr = of_iomap(node, 0);
107 break;
108 }
109}
110
5e299f65 111static void __init exynos_init_late(void)
bb13fabc 112{
2edb36c4
KK
113 if (of_machine_is_compatible("samsung,exynos5440"))
114 /* to be supported later */
115 return;
116
559ba237 117 exynos_pm_init();
bb13fabc
SG
118}
119
564d06b1 120static int __init exynos_fdt_map_chipid(unsigned long node, const char *uname,
f5f83c71
TA
121 int depth, void *data)
122{
123 struct map_desc iodesc;
3eb93646 124 const __be32 *reg;
9d0c4dfe 125 int len;
f5f83c71
TA
126
127 if (!of_flat_dt_is_compatible(node, "samsung,exynos4210-chipid") &&
128 !of_flat_dt_is_compatible(node, "samsung,exynos5440-clock"))
129 return 0;
130
131 reg = of_get_flat_dt_prop(node, "reg", &len);
132 if (reg == NULL || len != (sizeof(unsigned long) * 2))
133 return 0;
134
135 iodesc.pfn = __phys_to_pfn(be32_to_cpu(reg[0]));
136 iodesc.length = be32_to_cpu(reg[1]) - 1;
137 iodesc.virtual = (unsigned long)S5P_VA_CHIPID;
138 iodesc.type = MT_DEVICE;
139 iotable_init(&iodesc, 1);
140 return 1;
141}
f5f83c71 142
cc511b8d
KK
143/*
144 * exynos_map_io
145 *
146 * register the standard cpu IO areas
147 */
6eb84669
SK
148static void __init exynos_map_io(void)
149{
cbf08b9e 150 if (soc_is_exynos4())
6eb84669
SK
151 iotable_init(exynos4_iodesc, ARRAY_SIZE(exynos4_iodesc));
152
cbf08b9e 153 if (soc_is_exynos5())
6eb84669 154 iotable_init(exynos5_iodesc, ARRAY_SIZE(exynos5_iodesc));
6eb84669 155}
cc511b8d 156
5e299f65 157static void __init exynos_init_io(void)
cc511b8d 158{
9c1fcdcc
DA
159 debug_ll_io_init();
160
04fae596 161 of_scan_flat_dt(exynos_fdt_map_chipid, NULL);
2edb36c4 162
cc511b8d
KK
163 /* detect cpu id and rev. */
164 s5p_init_cpu(S5P_VA_CHIPID);
165
6eb84669 166 exynos_map_io();
94c7ca71
KK
167}
168
fce9e5bb
PD
169static const struct of_device_id exynos_dt_pmu_match[] = {
170 { .compatible = "samsung,exynos3250-pmu" },
171 { .compatible = "samsung,exynos4210-pmu" },
172 { .compatible = "samsung,exynos4212-pmu" },
173 { .compatible = "samsung,exynos4412-pmu" },
c0adae9e 174 { .compatible = "samsung,exynos4415-pmu" },
fce9e5bb 175 { .compatible = "samsung,exynos5250-pmu" },
22ead0d7 176 { .compatible = "samsung,exynos5260-pmu" },
98504def 177 { .compatible = "samsung,exynos5410-pmu" },
fce9e5bb
PD
178 { .compatible = "samsung,exynos5420-pmu" },
179 { /*sentinel*/ },
180};
181
182static void exynos_map_pmu(void)
183{
184 struct device_node *np;
185
186 np = of_find_matching_node(NULL, exynos_dt_pmu_match);
187 if (np)
188 pmu_base_addr = of_iomap(np, 0);
189
190 if (!pmu_base_addr)
191 panic("failed to find exynos pmu register\n");
192}
193
194static void __init exynos_init_irq(void)
195{
196 irqchip_init();
197 /*
198 * Since platsmp.c needs pmu base address by the time
199 * DT is not unflatten so we can't use DT APIs before
200 * init_irq
201 */
202 exynos_map_pmu();
203}
204
cbf08b9e 205static void __init exynos_dt_machine_init(void)
cc511b8d 206{
1754c42e
OJ
207 /*
208 * This is called from smp_prepare_cpus if we've built for SMP, but
209 * we still need to set it up for PM and firmware ops if not.
210 */
73ea6ec6 211 if (!IS_ENABLED(CONFIG_SMP))
1754c42e
OJ
212 exynos_sysram_init();
213
cfdda353 214#if defined(CONFIG_SMP) && defined(CONFIG_ARM_EXYNOS_CPUIDLE)
712eddf7
BZ
215 if (of_machine_is_compatible("samsung,exynos4210"))
216 exynos_cpuidle.dev.platform_data = &cpuidle_coupled_exynos_data;
217#endif
6887d9e5 218 if (of_machine_is_compatible("samsung,exynos4210") ||
42d5dc37
BZ
219 of_machine_is_compatible("samsung,exynos4212") ||
220 (of_machine_is_compatible("samsung,exynos4412") &&
221 of_machine_is_compatible("samsung,trats2")) ||
222 of_machine_is_compatible("samsung,exynos5250"))
6887d9e5 223 platform_device_register(&exynos_cpuidle);
b5a296cd 224
6887d9e5 225 platform_device_register_simple("exynos-cpufreq", -1, NULL, 0);
cbf08b9e
SK
226
227 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
cc511b8d 228}
cbf08b9e 229
543c5040 230static char const *const exynos_dt_compat[] __initconst = {
940bc58d
CC
231 "samsung,exynos3",
232 "samsung,exynos3250",
4868123c 233 "samsung,exynos4",
cbf08b9e
SK
234 "samsung,exynos4210",
235 "samsung,exynos4212",
236 "samsung,exynos4412",
c0adae9e 237 "samsung,exynos4415",
4868123c 238 "samsung,exynos5",
cbf08b9e 239 "samsung,exynos5250",
ed08f103 240 "samsung,exynos5260",
cbf08b9e
SK
241 "samsung,exynos5420",
242 "samsung,exynos5440",
243 NULL
244};
245
246static void __init exynos_reserve(void)
247{
248#ifdef CONFIG_S5P_DEV_MFC
249 int i;
250 char *mfc_mem[] = {
251 "samsung,mfc-v5",
252 "samsung,mfc-v6",
253 "samsung,mfc-v7",
adacba58 254 "samsung,mfc-v8",
cbf08b9e
SK
255 };
256
257 for (i = 0; i < ARRAY_SIZE(mfc_mem); i++)
258 if (of_scan_flat_dt(s5p_fdt_alloc_mfc_mem, mfc_mem[i]))
259 break;
260#endif
261}
262
5a12a597
LA
263static void __init exynos_dt_fixup(void)
264{
265 /*
266 * Some versions of uboot pass garbage entries in the memory node,
267 * use the old CONFIG_ARM_NR_BANKS
268 */
269 of_fdt_limit_memory(8);
270}
271
cbf08b9e
SK
272DT_MACHINE_START(EXYNOS_DT, "SAMSUNG EXYNOS (Flattened Device Tree)")
273 /* Maintainer: Thomas Abraham <thomas.abraham@linaro.org> */
274 /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
15b0bc40
RK
275 .l2c_aux_val = 0x3c400001,
276 .l2c_aux_mask = 0xc20fffff,
cbf08b9e
SK
277 .smp = smp_ops(exynos_smp_ops),
278 .map_io = exynos_init_io,
279 .init_early = exynos_firmware_init,
fce9e5bb 280 .init_irq = exynos_init_irq,
cbf08b9e
SK
281 .init_machine = exynos_dt_machine_init,
282 .init_late = exynos_init_late,
283 .dt_compat = exynos_dt_compat,
cbf08b9e 284 .reserve = exynos_reserve,
5a12a597 285 .dt_fixup = exynos_dt_fixup,
cbf08b9e 286MACHINE_END
This page took 0.211895 seconds and 5 git commands to generate.