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 | MACHINE_END |
250 | #endif |
251 | |
252 | #ifdef CONFIG_ARCH_OMAP4 |
253 | static const char *const omap4_boards_compat[] __initconst = { |
254 | "ti,omap4460" , |
255 | "ti,omap4430" , |
256 | "ti,omap4" , |
257 | NULL, |
258 | }; |
259 | |
260 | DT_MACHINE_START(OMAP4_DT, "Generic OMAP4 (Flattened Device Tree)" ) |
261 | .l2c_aux_val = OMAP_L2C_AUX_CTRL, |
262 | .l2c_aux_mask = 0xcf9fffff, |
263 | .l2c_write_sec = omap4_l2c310_write_sec, |
264 | .reserve = omap_reserve, |
265 | .smp = smp_ops(omap4_smp_ops), |
266 | .map_io = omap4_map_io, |
267 | .init_early = omap4430_init_early, |
268 | .init_irq = omap_gic_of_init, |
269 | .init_machine = omap_generic_init, |
270 | .init_late = omap4430_init_late, |
271 | .init_time = omap_init_time_of, |
272 | .dt_compat = omap4_boards_compat, |
273 | .restart = omap44xx_restart, |
274 | MACHINE_END |
275 | #endif |
276 | |
277 | #ifdef CONFIG_SOC_OMAP5 |
278 | static const char *const omap5_boards_compat[] __initconst = { |
279 | "ti,omap5432" , |
280 | "ti,omap5430" , |
281 | "ti,omap5" , |
282 | NULL, |
283 | }; |
284 | |
285 | DT_MACHINE_START(OMAP5_DT, "Generic OMAP5 (Flattened Device Tree)" ) |
286 | #if defined(CONFIG_ZONE_DMA) && defined(CONFIG_ARM_LPAE) |
287 | .dma_zone_size = SZ_2G, |
288 | #endif |
289 | .reserve = omap_reserve, |
290 | .smp = smp_ops(omap4_smp_ops), |
291 | .map_io = omap5_map_io, |
292 | .init_early = omap5_init_early, |
293 | .init_irq = omap_gic_of_init, |
294 | .init_machine = omap_generic_init, |
295 | .init_late = omap5_init_late, |
296 | .init_time = omap5_realtime_timer_init, |
297 | .dt_compat = omap5_boards_compat, |
298 | .restart = omap44xx_restart, |
299 | MACHINE_END |
300 | #endif |
301 | |
302 | #ifdef CONFIG_SOC_AM43XX |
303 | static const char *const am43_boards_compat[] __initconst = { |
304 | "ti,am4372" , |
305 | "ti,am43" , |
306 | NULL, |
307 | }; |
308 | |
309 | DT_MACHINE_START(AM43_DT, "Generic AM43 (Flattened Device Tree)" ) |
310 | .l2c_aux_val = OMAP_L2C_AUX_CTRL, |
311 | .l2c_aux_mask = 0xcf9fffff, |
312 | .l2c_write_sec = omap4_l2c310_write_sec, |
313 | .map_io = am33xx_map_io, |
314 | .init_early = am43xx_init_early, |
315 | .init_late = am43xx_init_late, |
316 | .init_irq = omap_gic_of_init, |
317 | .init_machine = omap_generic_init, |
318 | .init_time = omap_init_time_of, |
319 | .dt_compat = am43_boards_compat, |
320 | .restart = omap44xx_restart, |
321 | MACHINE_END |
322 | #endif |
323 | |
324 | #ifdef CONFIG_SOC_DRA7XX |
325 | static const char *const dra74x_boards_compat[] __initconst = { |
326 | "ti,dra762" , |
327 | "ti,am5728" , |
328 | "ti,am5726" , |
329 | "ti,dra742" , |
330 | "ti,dra7" , |
331 | NULL, |
332 | }; |
333 | |
334 | DT_MACHINE_START(DRA74X_DT, "Generic DRA74X (Flattened Device Tree)" ) |
335 | #if defined(CONFIG_ZONE_DMA) && defined(CONFIG_ARM_LPAE) |
336 | .dma_zone_size = SZ_2G, |
337 | #endif |
338 | .reserve = omap_reserve, |
339 | .smp = smp_ops(omap4_smp_ops), |
340 | .map_io = dra7xx_map_io, |
341 | .init_early = dra7xx_init_early, |
342 | .init_late = dra7xx_init_late, |
343 | .init_irq = omap_gic_of_init, |
344 | .init_machine = omap_generic_init, |
345 | .init_time = omap5_realtime_timer_init, |
346 | .dt_compat = dra74x_boards_compat, |
347 | .restart = omap44xx_restart, |
348 | MACHINE_END |
349 | |
350 | static const char *const dra72x_boards_compat[] __initconst = { |
351 | "ti,am5718" , |
352 | "ti,am5716" , |
353 | "ti,dra722" , |
354 | "ti,dra718" , |
355 | NULL, |
356 | }; |
357 | |
358 | DT_MACHINE_START(DRA72X_DT, "Generic DRA72X (Flattened Device Tree)" ) |
359 | #if defined(CONFIG_ZONE_DMA) && defined(CONFIG_ARM_LPAE) |
360 | .dma_zone_size = SZ_2G, |
361 | #endif |
362 | .reserve = omap_reserve, |
363 | .map_io = dra7xx_map_io, |
364 | .init_early = dra7xx_init_early, |
365 | .init_late = dra7xx_init_late, |
366 | .init_irq = omap_gic_of_init, |
367 | .init_machine = omap_generic_init, |
368 | .init_time = omap5_realtime_timer_init, |
369 | .dt_compat = dra72x_boards_compat, |
370 | .restart = omap44xx_restart, |
371 | MACHINE_END |
372 | #endif |
373 | |