1389ee0c2SHaojian Zhuang /* 2389ee0c2SHaojian Zhuang * (Hisilicon's SoC based) flattened device tree enabled machine 3389ee0c2SHaojian Zhuang * 4389ee0c2SHaojian Zhuang * Copyright (c) 2012-2013 Hisilicon Ltd. 5389ee0c2SHaojian Zhuang * Copyright (c) 2012-2013 Linaro Ltd. 6389ee0c2SHaojian Zhuang * 7389ee0c2SHaojian Zhuang * Author: Haojian Zhuang <haojian.zhuang@linaro.org> 8389ee0c2SHaojian Zhuang * 9389ee0c2SHaojian Zhuang * This program is free software; you can redistribute it and/or modify 10389ee0c2SHaojian Zhuang * it under the terms of the GNU General Public License version 2 as 11389ee0c2SHaojian Zhuang * published by the Free Software Foundation. 12389ee0c2SHaojian Zhuang */ 13389ee0c2SHaojian Zhuang 14389ee0c2SHaojian Zhuang #include <linux/clk-provider.h> 15389ee0c2SHaojian Zhuang #include <linux/clocksource.h> 16389ee0c2SHaojian Zhuang #include <linux/irqchip.h> 17389ee0c2SHaojian Zhuang #include <linux/of_address.h> 18389ee0c2SHaojian Zhuang #include <linux/of_platform.h> 19389ee0c2SHaojian Zhuang 20389ee0c2SHaojian Zhuang #include <asm/proc-fns.h> 21389ee0c2SHaojian Zhuang 22389ee0c2SHaojian Zhuang #include <asm/mach/arch.h> 23389ee0c2SHaojian Zhuang #include <asm/mach/map.h> 24389ee0c2SHaojian Zhuang 25389ee0c2SHaojian Zhuang #include "core.h" 26389ee0c2SHaojian Zhuang 27389ee0c2SHaojian Zhuang #define HI3620_SYSCTRL_PHYS_BASE 0xfc802000 28389ee0c2SHaojian Zhuang #define HI3620_SYSCTRL_VIRT_BASE 0xfe802000 29389ee0c2SHaojian Zhuang 30389ee0c2SHaojian Zhuang /* 31389ee0c2SHaojian Zhuang * This table is only for optimization. Since ioremap() could always share 32389ee0c2SHaojian Zhuang * the same mapping if it's defined as static IO mapping. 33389ee0c2SHaojian Zhuang * 34389ee0c2SHaojian Zhuang * Without this table, system could also work. The cost is some virtual address 35389ee0c2SHaojian Zhuang * spaces wasted since ioremap() may be called multi times for the same 36389ee0c2SHaojian Zhuang * IO space. 37389ee0c2SHaojian Zhuang */ 38389ee0c2SHaojian Zhuang static struct map_desc hi3620_io_desc[] __initdata = { 39389ee0c2SHaojian Zhuang { 40389ee0c2SHaojian Zhuang /* sysctrl */ 41389ee0c2SHaojian Zhuang .pfn = __phys_to_pfn(HI3620_SYSCTRL_PHYS_BASE), 42389ee0c2SHaojian Zhuang .virtual = HI3620_SYSCTRL_VIRT_BASE, 43389ee0c2SHaojian Zhuang .length = 0x1000, 44389ee0c2SHaojian Zhuang .type = MT_DEVICE, 45389ee0c2SHaojian Zhuang }, 46389ee0c2SHaojian Zhuang }; 47389ee0c2SHaojian Zhuang 48389ee0c2SHaojian Zhuang static void __init hi3620_map_io(void) 49389ee0c2SHaojian Zhuang { 50389ee0c2SHaojian Zhuang debug_ll_io_init(); 51389ee0c2SHaojian Zhuang iotable_init(hi3620_io_desc, ARRAY_SIZE(hi3620_io_desc)); 52389ee0c2SHaojian Zhuang } 53389ee0c2SHaojian Zhuang 54389ee0c2SHaojian Zhuang static void __init hi3xxx_timer_init(void) 55389ee0c2SHaojian Zhuang { 56389ee0c2SHaojian Zhuang of_clk_init(NULL); 57389ee0c2SHaojian Zhuang clocksource_of_init(); 58389ee0c2SHaojian Zhuang } 59389ee0c2SHaojian Zhuang 60389ee0c2SHaojian Zhuang static void hi3xxx_restart(enum reboot_mode mode, const char *cmd) 61389ee0c2SHaojian Zhuang { 62389ee0c2SHaojian Zhuang struct device_node *np; 63389ee0c2SHaojian Zhuang void __iomem *base; 64389ee0c2SHaojian Zhuang int offset; 65389ee0c2SHaojian Zhuang 66389ee0c2SHaojian Zhuang np = of_find_compatible_node(NULL, NULL, "hisilicon,sysctrl"); 67389ee0c2SHaojian Zhuang if (!np) { 68389ee0c2SHaojian Zhuang pr_err("failed to find hisilicon,sysctrl node\n"); 69389ee0c2SHaojian Zhuang return; 70389ee0c2SHaojian Zhuang } 71389ee0c2SHaojian Zhuang base = of_iomap(np, 0); 72389ee0c2SHaojian Zhuang if (!base) { 73389ee0c2SHaojian Zhuang pr_err("failed to map address in hisilicon,sysctrl node\n"); 74389ee0c2SHaojian Zhuang return; 75389ee0c2SHaojian Zhuang } 76389ee0c2SHaojian Zhuang if (of_property_read_u32(np, "reboot-offset", &offset) < 0) { 77389ee0c2SHaojian Zhuang pr_err("failed to find reboot-offset property\n"); 78389ee0c2SHaojian Zhuang return; 79389ee0c2SHaojian Zhuang } 80389ee0c2SHaojian Zhuang writel_relaxed(0xdeadbeef, base + offset); 81389ee0c2SHaojian Zhuang 82389ee0c2SHaojian Zhuang while (1) 83389ee0c2SHaojian Zhuang cpu_do_idle(); 84389ee0c2SHaojian Zhuang } 85389ee0c2SHaojian Zhuang 86389ee0c2SHaojian Zhuang static const char *hi3xxx_compat[] __initconst = { 87389ee0c2SHaojian Zhuang "hisilicon,hi3620-hi4511", 88389ee0c2SHaojian Zhuang NULL, 89389ee0c2SHaojian Zhuang }; 90389ee0c2SHaojian Zhuang 91389ee0c2SHaojian Zhuang DT_MACHINE_START(HI3620, "Hisilicon Hi3620 (Flattened Device Tree)") 92389ee0c2SHaojian Zhuang .map_io = hi3620_map_io, 93389ee0c2SHaojian Zhuang .init_time = hi3xxx_timer_init, 94389ee0c2SHaojian Zhuang .dt_compat = hi3xxx_compat, 95389ee0c2SHaojian Zhuang .smp = smp_ops(hi3xxx_smp_ops), 96389ee0c2SHaojian Zhuang .restart = hi3xxx_restart, 97389ee0c2SHaojian Zhuang MACHINE_END 98