1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (C) 2005 Nokia Corporation
4  * Author: Paul Mundt <paul.mundt@nokia.com>
5  *
6  * Copyright (C) 2011 Texas Instruments Incorporated - https://www.ti.com/
7  *
8  * Modified from the original mach-omap/omap2/board-generic.c did by Paul
9  * to support the OMAP2+ device tree boards with an unique board file.
10  */
11 #include <linux/io.h>
12 #include <linux/of_irq.h>
13 #include <linux/of_platform.h>
14 #include <linux/irqdomain.h>
15 #include <linux/clocksource.h>
16 #include <linux/clockchips.h>
17 
18 #include <asm/setup.h>
19 #include <asm/mach/arch.h>
20 #include <asm/system_info.h>
21 
22 #include "common.h"
23 
24 static const struct of_device_id omap_dt_match_table[] __initconst = {
25 	{ .compatible = "simple-bus", },
26 	{ .compatible = "ti,omap-infra", },
27 	{ }
28 };
29 
30 static void __init __maybe_unused omap_generic_init(void)
31 {
32 	pdata_quirks_init(omap_dt_match_table);
33 	omap_soc_device_init();
34 }
35 
36 /* Clocks are needed early, see drivers/clocksource for the rest */
37 static void __init __maybe_unused omap_init_time_of(void)
38 {
39 	omap_clk_init();
40 	timer_probe();
41 }
42 
43 /* Used by am437x for ARM timer in non-SMP configurations */
44 #if !defined(CONFIG_SMP) && defined(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST)
45 void tick_broadcast(const struct cpumask *mask)
46 {
47 }
48 #endif
49 
50 #ifdef CONFIG_SOC_OMAP2420
51 static const char *const omap242x_boards_compat[] __initconst = {
52 	"ti,omap2420",
53 	NULL,
54 };
55 
56 DT_MACHINE_START(OMAP242X_DT, "Generic OMAP2420 (Flattened Device Tree)")
57 	.reserve	= omap_reserve,
58 	.map_io		= omap242x_map_io,
59 	.init_early	= omap2420_init_early,
60 	.init_machine	= omap_generic_init,
61 	.init_time	= omap_init_time_of,
62 	.dt_compat	= omap242x_boards_compat,
63 	.restart	= omap2xxx_restart,
64 MACHINE_END
65 #endif
66 
67 #ifdef CONFIG_SOC_OMAP2430
68 static const char *const omap243x_boards_compat[] __initconst = {
69 	"ti,omap2430",
70 	NULL,
71 };
72 
73 DT_MACHINE_START(OMAP243X_DT, "Generic OMAP2430 (Flattened Device Tree)")
74 	.reserve	= omap_reserve,
75 	.map_io		= omap243x_map_io,
76 	.init_early	= omap2430_init_early,
77 	.init_machine	= omap_generic_init,
78 	.init_time	= omap_init_time_of,
79 	.dt_compat	= omap243x_boards_compat,
80 	.restart	= omap2xxx_restart,
81 MACHINE_END
82 #endif
83 
84 #ifdef CONFIG_ARCH_OMAP3
85 /* Some boards need board name for legacy userspace in /proc/cpuinfo */
86 static const char *const n900_boards_compat[] __initconst = {
87 	"nokia,omap3-n900",
88 	NULL,
89 };
90 
91 /* Set system_rev from atags */
92 static void __init rx51_set_system_rev(const struct tag *tags)
93 {
94 	const struct tag *tag;
95 
96 	if (tags->hdr.tag != ATAG_CORE)
97 		return;
98 
99 	for_each_tag(tag, tags) {
100 		if (tag->hdr.tag == ATAG_REVISION) {
101 			system_rev = tag->u.revision.rev;
102 			break;
103 		}
104 	}
105 }
106 
107 /* Legacy userspace on Nokia N900 needs ATAGS exported in /proc/atags,
108  * save them while the data is still not overwritten
109  */
110 static void __init rx51_reserve(void)
111 {
112 	const struct tag *tags = (const struct tag *)(PAGE_OFFSET + 0x100);
113 
114 	save_atags(tags);
115 	rx51_set_system_rev(tags);
116 	omap_reserve();
117 }
118 
119 DT_MACHINE_START(OMAP3_N900_DT, "Nokia RX-51 board")
120 	.reserve	= rx51_reserve,
121 	.map_io		= omap3_map_io,
122 	.init_early	= omap3430_init_early,
123 	.init_machine	= omap_generic_init,
124 	.init_late	= omap3_init_late,
125 	.init_time	= omap_init_time_of,
126 	.dt_compat	= n900_boards_compat,
127 	.restart	= omap3xxx_restart,
128 MACHINE_END
129 
130 /* Generic omap3 boards, most boards can use these */
131 static const char *const omap3_boards_compat[] __initconst = {
132 	"ti,omap3430",
133 	"ti,omap3",
134 	NULL,
135 };
136 
137 DT_MACHINE_START(OMAP3_DT, "Generic OMAP3 (Flattened Device Tree)")
138 	.reserve	= omap_reserve,
139 	.map_io		= omap3_map_io,
140 	.init_early	= omap3430_init_early,
141 	.init_machine	= omap_generic_init,
142 	.init_late	= omap3_init_late,
143 	.init_time	= omap_init_time_of,
144 	.dt_compat	= omap3_boards_compat,
145 	.restart	= omap3xxx_restart,
146 MACHINE_END
147 
148 static const char *const omap36xx_boards_compat[] __initconst = {
149 	"ti,omap3630",
150 	"ti,omap36xx",
151 	NULL,
152 };
153 
154 DT_MACHINE_START(OMAP36XX_DT, "Generic OMAP36xx (Flattened Device Tree)")
155 	.reserve	= omap_reserve,
156 	.map_io		= omap3_map_io,
157 	.init_early	= omap3630_init_early,
158 	.init_machine	= omap_generic_init,
159 	.init_late	= omap3_init_late,
160 	.init_time	= omap_init_time_of,
161 	.dt_compat	= omap36xx_boards_compat,
162 	.restart	= omap3xxx_restart,
163 MACHINE_END
164 
165 static const char *const omap3_gp_boards_compat[] __initconst = {
166 	"ti,omap3-beagle",
167 	"timll,omap3-devkit8000",
168 	NULL,
169 };
170 
171 DT_MACHINE_START(OMAP3_GP_DT, "Generic OMAP3-GP (Flattened Device Tree)")
172 	.reserve	= omap_reserve,
173 	.map_io		= omap3_map_io,
174 	.init_early	= omap3430_init_early,
175 	.init_machine	= omap_generic_init,
176 	.init_late	= omap3_init_late,
177 	.init_time	= omap_init_time_of,
178 	.dt_compat	= omap3_gp_boards_compat,
179 	.restart	= omap3xxx_restart,
180 MACHINE_END
181 
182 static const char *const am3517_boards_compat[] __initconst = {
183 	"ti,am3517",
184 	NULL,
185 };
186 
187 DT_MACHINE_START(AM3517_DT, "Generic AM3517 (Flattened Device Tree)")
188 	.reserve	= omap_reserve,
189 	.map_io		= omap3_map_io,
190 	.init_early	= am35xx_init_early,
191 	.init_machine	= omap_generic_init,
192 	.init_late	= omap3_init_late,
193 	.init_time	= omap_init_time_of,
194 	.dt_compat	= am3517_boards_compat,
195 	.restart	= omap3xxx_restart,
196 MACHINE_END
197 #endif
198 
199 #ifdef CONFIG_SOC_TI81XX
200 static const char *const ti814x_boards_compat[] __initconst = {
201 	"ti,dm8148",
202 	"ti,dm814",
203 	NULL,
204 };
205 
206 DT_MACHINE_START(TI814X_DT, "Generic ti814x (Flattened Device Tree)")
207 	.reserve	= omap_reserve,
208 	.map_io		= ti81xx_map_io,
209 	.init_early	= ti814x_init_early,
210 	.init_machine	= omap_generic_init,
211 	.init_late	= ti81xx_init_late,
212 	.init_time	= omap_init_time_of,
213 	.dt_compat	= ti814x_boards_compat,
214 	.restart	= ti81xx_restart,
215 MACHINE_END
216 
217 static const char *const ti816x_boards_compat[] __initconst = {
218 	"ti,dm8168",
219 	"ti,dm816",
220 	NULL,
221 };
222 
223 DT_MACHINE_START(TI816X_DT, "Generic ti816x (Flattened Device Tree)")
224 	.reserve	= omap_reserve,
225 	.map_io		= ti81xx_map_io,
226 	.init_early	= ti816x_init_early,
227 	.init_machine	= omap_generic_init,
228 	.init_late	= ti81xx_init_late,
229 	.init_time	= omap_init_time_of,
230 	.dt_compat	= ti816x_boards_compat,
231 	.restart	= ti81xx_restart,
232 MACHINE_END
233 #endif
234 
235 #ifdef CONFIG_SOC_AM33XX
236 static const char *const am33xx_boards_compat[] __initconst = {
237 	"ti,am33xx",
238 	NULL,
239 };
240 
241 DT_MACHINE_START(AM33XX_DT, "Generic AM33XX (Flattened Device Tree)")
242 	.reserve	= omap_reserve,
243 	.map_io		= am33xx_map_io,
244 	.init_early	= am33xx_init_early,
245 	.init_machine	= omap_generic_init,
246 	.init_late	= am33xx_init_late,
247 	.init_time	= omap_init_time_of,
248 	.dt_compat	= am33xx_boards_compat,
249 	.restart	= am33xx_restart,
250 MACHINE_END
251 #endif
252 
253 #ifdef CONFIG_ARCH_OMAP4
254 static const char *const omap4_boards_compat[] __initconst = {
255 	"ti,omap4460",
256 	"ti,omap4430",
257 	"ti,omap4",
258 	NULL,
259 };
260 
261 DT_MACHINE_START(OMAP4_DT, "Generic OMAP4 (Flattened Device Tree)")
262 	.l2c_aux_val	= OMAP_L2C_AUX_CTRL,
263 	.l2c_aux_mask	= 0xcf9fffff,
264 	.l2c_write_sec	= omap4_l2c310_write_sec,
265 	.reserve	= omap_reserve,
266 	.smp		= smp_ops(omap4_smp_ops),
267 	.map_io		= omap4_map_io,
268 	.init_early	= omap4430_init_early,
269 	.init_irq	= omap_gic_of_init,
270 	.init_machine	= omap_generic_init,
271 	.init_late	= omap4430_init_late,
272 	.init_time	= omap_init_time_of,
273 	.dt_compat	= omap4_boards_compat,
274 	.restart	= omap44xx_restart,
275 MACHINE_END
276 #endif
277 
278 #ifdef CONFIG_SOC_OMAP5
279 static const char *const omap5_boards_compat[] __initconst = {
280 	"ti,omap5432",
281 	"ti,omap5430",
282 	"ti,omap5",
283 	NULL,
284 };
285 
286 DT_MACHINE_START(OMAP5_DT, "Generic OMAP5 (Flattened Device Tree)")
287 #if defined(CONFIG_ZONE_DMA) && defined(CONFIG_ARM_LPAE)
288 	.dma_zone_size	= SZ_2G,
289 #endif
290 	.reserve	= omap_reserve,
291 	.smp		= smp_ops(omap4_smp_ops),
292 	.map_io		= omap5_map_io,
293 	.init_early	= omap5_init_early,
294 	.init_irq	= omap_gic_of_init,
295 	.init_machine	= omap_generic_init,
296 	.init_late	= omap5_init_late,
297 	.init_time	= omap5_realtime_timer_init,
298 	.dt_compat	= omap5_boards_compat,
299 	.restart	= omap44xx_restart,
300 MACHINE_END
301 #endif
302 
303 #ifdef CONFIG_SOC_AM43XX
304 static const char *const am43_boards_compat[] __initconst = {
305 	"ti,am4372",
306 	"ti,am43",
307 	NULL,
308 };
309 
310 DT_MACHINE_START(AM43_DT, "Generic AM43 (Flattened Device Tree)")
311 	.l2c_aux_val	= OMAP_L2C_AUX_CTRL,
312 	.l2c_aux_mask	= 0xcf9fffff,
313 	.l2c_write_sec	= omap4_l2c310_write_sec,
314 	.map_io		= am33xx_map_io,
315 	.init_early	= am43xx_init_early,
316 	.init_late	= am43xx_init_late,
317 	.init_irq	= omap_gic_of_init,
318 	.init_machine	= omap_generic_init,
319 	.init_time	= omap_init_time_of,
320 	.dt_compat	= am43_boards_compat,
321 	.restart	= omap44xx_restart,
322 MACHINE_END
323 #endif
324 
325 #ifdef CONFIG_SOC_DRA7XX
326 static const char *const dra74x_boards_compat[] __initconst = {
327 	"ti,dra762",
328 	"ti,am5728",
329 	"ti,am5726",
330 	"ti,dra742",
331 	"ti,dra7",
332 	NULL,
333 };
334 
335 DT_MACHINE_START(DRA74X_DT, "Generic DRA74X (Flattened Device Tree)")
336 #if defined(CONFIG_ZONE_DMA) && defined(CONFIG_ARM_LPAE)
337 	.dma_zone_size	= SZ_2G,
338 #endif
339 	.reserve	= omap_reserve,
340 	.smp		= smp_ops(omap4_smp_ops),
341 	.map_io		= dra7xx_map_io,
342 	.init_early	= dra7xx_init_early,
343 	.init_late	= dra7xx_init_late,
344 	.init_irq	= omap_gic_of_init,
345 	.init_machine	= omap_generic_init,
346 	.init_time	= omap5_realtime_timer_init,
347 	.dt_compat	= dra74x_boards_compat,
348 	.restart	= omap44xx_restart,
349 MACHINE_END
350 
351 static const char *const dra72x_boards_compat[] __initconst = {
352 	"ti,am5718",
353 	"ti,am5716",
354 	"ti,dra722",
355 	"ti,dra718",
356 	NULL,
357 };
358 
359 DT_MACHINE_START(DRA72X_DT, "Generic DRA72X (Flattened Device Tree)")
360 #if defined(CONFIG_ZONE_DMA) && defined(CONFIG_ARM_LPAE)
361 	.dma_zone_size	= SZ_2G,
362 #endif
363 	.reserve	= omap_reserve,
364 	.map_io		= dra7xx_map_io,
365 	.init_early	= dra7xx_init_early,
366 	.init_late	= dra7xx_init_late,
367 	.init_irq	= omap_gic_of_init,
368 	.init_machine	= omap_generic_init,
369 	.init_time	= omap5_realtime_timer_init,
370 	.dt_compat	= dra72x_boards_compat,
371 	.restart	= omap44xx_restart,
372 MACHINE_END
373 #endif
374