18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci// 38c2ecf20Sopenharmony_ci// Samsung's S5PC110/S5PV210 flattened device tree enabled machine. 48c2ecf20Sopenharmony_ci// 58c2ecf20Sopenharmony_ci// Copyright (c) 2013-2014 Samsung Electronics Co., Ltd. 68c2ecf20Sopenharmony_ci// Mateusz Krawczuk <m.krawczuk@partner.samsung.com> 78c2ecf20Sopenharmony_ci// Tomasz Figa <t.figa@samsung.com> 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/of_fdt.h> 108c2ecf20Sopenharmony_ci#include <linux/of_platform.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include <asm/mach/arch.h> 138c2ecf20Sopenharmony_ci#include <asm/mach/map.h> 148c2ecf20Sopenharmony_ci#include <asm/system_misc.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#include "common.h" 178c2ecf20Sopenharmony_ci#include "regs-clock.h" 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_cistatic int __init s5pv210_fdt_map_sys(unsigned long node, const char *uname, 208c2ecf20Sopenharmony_ci int depth, void *data) 218c2ecf20Sopenharmony_ci{ 228c2ecf20Sopenharmony_ci struct map_desc iodesc; 238c2ecf20Sopenharmony_ci const __be32 *reg; 248c2ecf20Sopenharmony_ci int len; 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci if (!of_flat_dt_is_compatible(node, "samsung,s5pv210-clock")) 278c2ecf20Sopenharmony_ci return 0; 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci reg = of_get_flat_dt_prop(node, "reg", &len); 308c2ecf20Sopenharmony_ci if (reg == NULL || len != (sizeof(unsigned long) * 2)) 318c2ecf20Sopenharmony_ci return 0; 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci iodesc.pfn = __phys_to_pfn(be32_to_cpu(reg[0])); 348c2ecf20Sopenharmony_ci iodesc.length = be32_to_cpu(reg[1]) - 1; 358c2ecf20Sopenharmony_ci iodesc.virtual = (unsigned long)S3C_VA_SYS; 368c2ecf20Sopenharmony_ci iodesc.type = MT_DEVICE; 378c2ecf20Sopenharmony_ci iotable_init(&iodesc, 1); 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci return 1; 408c2ecf20Sopenharmony_ci} 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_cistatic void __init s5pv210_dt_map_io(void) 438c2ecf20Sopenharmony_ci{ 448c2ecf20Sopenharmony_ci debug_ll_io_init(); 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci of_scan_flat_dt(s5pv210_fdt_map_sys, NULL); 478c2ecf20Sopenharmony_ci} 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_cistatic void s5pv210_dt_restart(enum reboot_mode mode, const char *cmd) 508c2ecf20Sopenharmony_ci{ 518c2ecf20Sopenharmony_ci __raw_writel(0x1, S5P_SWRESET); 528c2ecf20Sopenharmony_ci} 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_cistatic void __init s5pv210_dt_init_late(void) 558c2ecf20Sopenharmony_ci{ 568c2ecf20Sopenharmony_ci platform_device_register_simple("s5pv210-cpufreq", -1, NULL, 0); 578c2ecf20Sopenharmony_ci s5pv210_pm_init(); 588c2ecf20Sopenharmony_ci} 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_cistatic char const *const s5pv210_dt_compat[] __initconst = { 618c2ecf20Sopenharmony_ci "samsung,s5pc110", 628c2ecf20Sopenharmony_ci "samsung,s5pv210", 638c2ecf20Sopenharmony_ci NULL 648c2ecf20Sopenharmony_ci}; 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ciDT_MACHINE_START(S5PV210_DT, "Samsung S5PC110/S5PV210-based board") 678c2ecf20Sopenharmony_ci .dt_compat = s5pv210_dt_compat, 688c2ecf20Sopenharmony_ci .map_io = s5pv210_dt_map_io, 698c2ecf20Sopenharmony_ci .restart = s5pv210_dt_restart, 708c2ecf20Sopenharmony_ci .init_late = s5pv210_dt_init_late, 718c2ecf20Sopenharmony_ciMACHINE_END 72