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 | |
23 | static const struct of_device_id omap_dt_match_table[] __initconst = { |
24 | { .compatible = "simple-bus" , }, |
25 | { .compatible = "ti,omap-infra" , }, |
26 | { } |
27 | }; |
28 | |
29 | static 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 */ |
36 | static 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) |
44 | void tick_broadcast(const struct cpumask *mask) |
45 | { |
46 | } |
47 | #endif |
48 | |
49 | #ifdef CONFIG_SOC_OMAP2420 |
50 | static const char *const omap242x_boards_compat[] __initconst = { |
51 | "ti,omap2420" , |
52 | NULL, |
53 | }; |
54 | |
55 | DT_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, |
63 | MACHINE_END |
64 | #endif |
65 | |
66 | #ifdef CONFIG_SOC_OMAP2430 |
67 | static const char *const omap243x_boards_compat[] __initconst = { |
68 | "ti,omap2430" , |
69 | NULL, |
70 | }; |
71 | |
72 | DT_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, |
80 | MACHINE_END |
81 | #endif |
82 | |
83 | #ifdef CONFIG_ARCH_OMAP3 |
84 | /* Some boards need board name for legacy userspace in /proc/cpuinfo */ |
85 | static const char *const n900_boards_compat[] __initconst = { |
86 | "nokia,omap3-n900" , |
87 | NULL, |
88 | }; |
89 | |
90 | /* Set system_rev from atags */ |
91 | static 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 | */ |
109 | static 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 | |
118 | DT_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, |
127 | MACHINE_END |
128 | |
129 | /* Generic omap3 boards, most boards can use these */ |
130 | static const char *const omap3_boards_compat[] __initconst = { |
131 | "ti,omap3430" , |
132 | "ti,omap3" , |
133 | NULL, |
134 | }; |
135 | |
136 | DT_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, |
145 | MACHINE_END |
146 | |
147 | static const char *const omap36xx_boards_compat[] __initconst = { |
148 | "ti,omap3630" , |
149 | "ti,omap36xx" , |
150 | NULL, |
151 | }; |
152 | |
153 | DT_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, |
162 | MACHINE_END |
163 | |
164 | static const char *const omap3_gp_boards_compat[] __initconst = { |
165 | "ti,omap3-beagle" , |
166 | "timll,omap3-devkit8000" , |
167 | NULL, |
168 | }; |
169 | |
170 | DT_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, |
179 | MACHINE_END |
180 | |
181 | static const char *const am3517_boards_compat[] __initconst = { |
182 | "ti,am3517" , |
183 | NULL, |
184 | }; |
185 | |
186 | DT_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, |
195 | MACHINE_END |
196 | #endif |
197 | |
198 | #ifdef CONFIG_SOC_TI81XX |
199 | static const char *const ti814x_boards_compat[] __initconst = { |
200 | "ti,dm8148" , |
201 | "ti,dm814" , |
202 | NULL, |
203 | }; |
204 | |
205 | DT_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, |
214 | MACHINE_END |
215 | |
216 | static const char *const ti816x_boards_compat[] __initconst = { |
217 | "ti,dm8168" , |
218 | "ti,dm816" , |
219 | NULL, |
220 | }; |
221 | |
222 | DT_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, |
231 | MACHINE_END |
232 | #endif |
233 | |
234 | #ifdef CONFIG_SOC_AM33XX |
235 | static const char *const am33xx_boards_compat[] __initconst = { |
236 | "ti,am33xx" , |
237 | NULL, |
238 | }; |
239 | |
240 | DT_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, |
255 | MACHINE_END |
256 | #endif |
257 | |
258 | #ifdef CONFIG_ARCH_OMAP4 |
259 | static const char *const omap4_boards_compat[] __initconst = { |
260 | "ti,omap4460" , |
261 | "ti,omap4430" , |
262 | "ti,omap4" , |
263 | NULL, |
264 | }; |
265 | |
266 | DT_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, |
280 | MACHINE_END |
281 | #endif |
282 | |
283 | #ifdef CONFIG_SOC_OMAP5 |
284 | static const char *const omap5_boards_compat[] __initconst = { |
285 | "ti,omap5432" , |
286 | "ti,omap5430" , |
287 | "ti,omap5" , |
288 | NULL, |
289 | }; |
290 | |
291 | DT_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, |
305 | MACHINE_END |
306 | #endif |
307 | |
308 | #ifdef CONFIG_SOC_AM43XX |
309 | static const char *const am43_boards_compat[] __initconst = { |
310 | "ti,am4372" , |
311 | "ti,am43" , |
312 | NULL, |
313 | }; |
314 | |
315 | DT_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, |
327 | MACHINE_END |
328 | #endif |
329 | |
330 | #ifdef CONFIG_SOC_DRA7XX |
331 | static 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 | |
340 | DT_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, |
354 | MACHINE_END |
355 | |
356 | static const char *const dra72x_boards_compat[] __initconst = { |
357 | "ti,am5718" , |
358 | "ti,am5716" , |
359 | "ti,dra722" , |
360 | "ti,dra718" , |
361 | NULL, |
362 | }; |
363 | |
364 | DT_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, |
377 | MACHINE_END |
378 | #endif |
379 | |