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