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