1adbd1ad1SMateusz Krawczuk /* 2adbd1ad1SMateusz Krawczuk * Samsung's S5PC110/S5PV210 flattened device tree enabled machine. 3adbd1ad1SMateusz Krawczuk * 4adbd1ad1SMateusz Krawczuk * Copyright (c) 2013-2014 Samsung Electronics Co., Ltd. 5adbd1ad1SMateusz Krawczuk * Mateusz Krawczuk <m.krawczuk@partner.samsung.com> 6adbd1ad1SMateusz Krawczuk * Tomasz Figa <t.figa@samsung.com> 7adbd1ad1SMateusz Krawczuk * 8adbd1ad1SMateusz Krawczuk * This program is free software; you can redistribute it and/or modify 9adbd1ad1SMateusz Krawczuk * it under the terms of the GNU General Public License version 2 as 10adbd1ad1SMateusz Krawczuk * published by the Free Software Foundation. 11adbd1ad1SMateusz Krawczuk */ 12adbd1ad1SMateusz Krawczuk 13adbd1ad1SMateusz Krawczuk #include <linux/of_fdt.h> 14adbd1ad1SMateusz Krawczuk #include <linux/of_platform.h> 15adbd1ad1SMateusz Krawczuk 16adbd1ad1SMateusz Krawczuk #include <asm/mach/arch.h> 17adbd1ad1SMateusz Krawczuk #include <asm/mach/map.h> 18adbd1ad1SMateusz Krawczuk #include <asm/system_misc.h> 19adbd1ad1SMateusz Krawczuk 20adbd1ad1SMateusz Krawczuk #include <plat/map-base.h> 21adbd1ad1SMateusz Krawczuk #include <mach/regs-clock.h> 22adbd1ad1SMateusz Krawczuk 230a90d4d6STomasz Figa #include "common.h" 240a90d4d6STomasz Figa 25adbd1ad1SMateusz Krawczuk static int __init s5pv210_fdt_map_sys(unsigned long node, const char *uname, 26adbd1ad1SMateusz Krawczuk int depth, void *data) 27adbd1ad1SMateusz Krawczuk { 28adbd1ad1SMateusz Krawczuk struct map_desc iodesc; 29adbd1ad1SMateusz Krawczuk const __be32 *reg; 30adbd1ad1SMateusz Krawczuk int len; 31adbd1ad1SMateusz Krawczuk 32adbd1ad1SMateusz Krawczuk if (!of_flat_dt_is_compatible(node, "samsung,s5pv210-clock")) 33adbd1ad1SMateusz Krawczuk return 0; 34adbd1ad1SMateusz Krawczuk 35adbd1ad1SMateusz Krawczuk reg = of_get_flat_dt_prop(node, "reg", &len); 36adbd1ad1SMateusz Krawczuk if (reg == NULL || len != (sizeof(unsigned long) * 2)) 37adbd1ad1SMateusz Krawczuk return 0; 38adbd1ad1SMateusz Krawczuk 39adbd1ad1SMateusz Krawczuk iodesc.pfn = __phys_to_pfn(be32_to_cpu(reg[0])); 40adbd1ad1SMateusz Krawczuk iodesc.length = be32_to_cpu(reg[1]) - 1; 41adbd1ad1SMateusz Krawczuk iodesc.virtual = (unsigned long)S3C_VA_SYS; 42adbd1ad1SMateusz Krawczuk iodesc.type = MT_DEVICE; 43adbd1ad1SMateusz Krawczuk iotable_init(&iodesc, 1); 44adbd1ad1SMateusz Krawczuk 45adbd1ad1SMateusz Krawczuk return 1; 46adbd1ad1SMateusz Krawczuk } 47adbd1ad1SMateusz Krawczuk 48adbd1ad1SMateusz Krawczuk static void __init s5pv210_dt_map_io(void) 49adbd1ad1SMateusz Krawczuk { 50adbd1ad1SMateusz Krawczuk debug_ll_io_init(); 51adbd1ad1SMateusz Krawczuk 52adbd1ad1SMateusz Krawczuk of_scan_flat_dt(s5pv210_fdt_map_sys, NULL); 53adbd1ad1SMateusz Krawczuk } 54adbd1ad1SMateusz Krawczuk 55adbd1ad1SMateusz Krawczuk static void s5pv210_dt_restart(enum reboot_mode mode, const char *cmd) 56adbd1ad1SMateusz Krawczuk { 57adbd1ad1SMateusz Krawczuk __raw_writel(0x1, S5P_SWRESET); 58adbd1ad1SMateusz Krawczuk } 59adbd1ad1SMateusz Krawczuk 600a90d4d6STomasz Figa static void __init s5pv210_dt_init_late(void) 610a90d4d6STomasz Figa { 62*7d6764b3STomasz Figa platform_device_register_simple("s5pv210-cpufreq", -1, NULL, 0); 630a90d4d6STomasz Figa s5pv210_pm_init(); 640a90d4d6STomasz Figa } 650a90d4d6STomasz Figa 66adbd1ad1SMateusz Krawczuk static char const *s5pv210_dt_compat[] __initconst = { 67adbd1ad1SMateusz Krawczuk "samsung,s5pc110", 68adbd1ad1SMateusz Krawczuk "samsung,s5pv210", 69adbd1ad1SMateusz Krawczuk NULL 70adbd1ad1SMateusz Krawczuk }; 71adbd1ad1SMateusz Krawczuk 72adbd1ad1SMateusz Krawczuk DT_MACHINE_START(S5PV210_DT, "Samsung S5PC110/S5PV210-based board") 73adbd1ad1SMateusz Krawczuk .dt_compat = s5pv210_dt_compat, 74adbd1ad1SMateusz Krawczuk .map_io = s5pv210_dt_map_io, 75adbd1ad1SMateusz Krawczuk .restart = s5pv210_dt_restart, 760a90d4d6STomasz Figa .init_late = s5pv210_dt_init_late, 77adbd1ad1SMateusz Krawczuk MACHINE_END 78