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
24static const struct of_device_id omap_dt_match_table[] __initconst = {
25	{ .compatible = "simple-bus", },
26	{ .compatible = "ti,omap-infra", },
27	{ }
28};
29
30static 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 */
37static 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)
45void tick_broadcast(const struct cpumask *mask)
46{
47}
48#endif
49
50#ifdef CONFIG_SOC_OMAP2420
51static const char *const omap242x_boards_compat[] __initconst = {
52	"ti,omap2420",
53	NULL,
54};
55
56DT_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,
64MACHINE_END
65#endif
66
67#ifdef CONFIG_SOC_OMAP2430
68static const char *const omap243x_boards_compat[] __initconst = {
69	"ti,omap2430",
70	NULL,
71};
72
73DT_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,
81MACHINE_END
82#endif
83
84#ifdef CONFIG_ARCH_OMAP3
85/* Some boards need board name for legacy userspace in /proc/cpuinfo */
86static const char *const n900_boards_compat[] __initconst = {
87	"nokia,omap3-n900",
88	NULL,
89};
90
91/* Set system_rev from atags */
92static 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 */
110static 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
119DT_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,
128MACHINE_END
129
130/* Generic omap3 boards, most boards can use these */
131static const char *const omap3_boards_compat[] __initconst = {
132	"ti,omap3430",
133	"ti,omap3",
134	NULL,
135};
136
137DT_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,
146MACHINE_END
147
148static const char *const omap36xx_boards_compat[] __initconst = {
149	"ti,omap3630",
150	"ti,omap36xx",
151	NULL,
152};
153
154DT_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,
163MACHINE_END
164
165static const char *const omap3_gp_boards_compat[] __initconst = {
166	"ti,omap3-beagle",
167	"timll,omap3-devkit8000",
168	NULL,
169};
170
171DT_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,
180MACHINE_END
181
182static const char *const am3517_boards_compat[] __initconst = {
183	"ti,am3517",
184	NULL,
185};
186
187DT_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,
196MACHINE_END
197#endif
198
199#ifdef CONFIG_SOC_TI81XX
200static const char *const ti814x_boards_compat[] __initconst = {
201	"ti,dm8148",
202	"ti,dm814",
203	NULL,
204};
205
206DT_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,
215MACHINE_END
216
217static const char *const ti816x_boards_compat[] __initconst = {
218	"ti,dm8168",
219	"ti,dm816",
220	NULL,
221};
222
223DT_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,
232MACHINE_END
233#endif
234
235#ifdef CONFIG_SOC_AM33XX
236static const char *const am33xx_boards_compat[] __initconst = {
237	"ti,am33xx",
238	NULL,
239};
240
241DT_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,
250MACHINE_END
251#endif
252
253#ifdef CONFIG_ARCH_OMAP4
254static const char *const omap4_boards_compat[] __initconst = {
255	"ti,omap4460",
256	"ti,omap4430",
257	"ti,omap4",
258	NULL,
259};
260
261DT_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,
275MACHINE_END
276#endif
277
278#ifdef CONFIG_SOC_OMAP5
279static const char *const omap5_boards_compat[] __initconst = {
280	"ti,omap5432",
281	"ti,omap5430",
282	"ti,omap5",
283	NULL,
284};
285
286DT_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,
300MACHINE_END
301#endif
302
303#ifdef CONFIG_SOC_AM43XX
304static const char *const am43_boards_compat[] __initconst = {
305	"ti,am4372",
306	"ti,am43",
307	NULL,
308};
309
310DT_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,
322MACHINE_END
323#endif
324
325#ifdef CONFIG_SOC_DRA7XX
326static 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
335DT_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,
349MACHINE_END
350
351static const char *const dra72x_boards_compat[] __initconst = {
352	"ti,am5718",
353	"ti,am5716",
354	"ti,dra722",
355	"ti,dra718",
356	NULL,
357};
358
359DT_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,
372MACHINE_END
373#endif
374