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