xref: /linux/arch/arm/mach-hisi/hisilicon.c (revision d083f580e5b940834a93ab741cdf064f0324dc0f)
1 /*
2  * (Hisilicon's SoC based) flattened device tree enabled machine
3  *
4  * Copyright (c) 2012-2013 Hisilicon Ltd.
5  * Copyright (c) 2012-2013 Linaro Ltd.
6  *
7  * Author: Haojian Zhuang <haojian.zhuang@linaro.org>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License version 2 as
11  * published by the Free Software Foundation.
12 */
13 
14 #include <linux/clk-provider.h>
15 #include <linux/clocksource.h>
16 #include <linux/irqchip.h>
17 #include <linux/of_address.h>
18 #include <linux/of_platform.h>
19 
20 #include <asm/proc-fns.h>
21 
22 #include <asm/mach/arch.h>
23 #include <asm/mach/map.h>
24 
25 #include "core.h"
26 
27 #define HI3620_SYSCTRL_PHYS_BASE		0xfc802000
28 #define HI3620_SYSCTRL_VIRT_BASE		0xfe802000
29 
30 /*
31  * This table is only for optimization. Since ioremap() could always share
32  * the same mapping if it's defined as static IO mapping.
33  *
34  * Without this table, system could also work. The cost is some virtual address
35  * spaces wasted since ioremap() may be called multi times for the same
36  * IO space.
37  */
38 static struct map_desc hi3620_io_desc[] __initdata = {
39 	{
40 		/* sysctrl */
41 		.pfn		= __phys_to_pfn(HI3620_SYSCTRL_PHYS_BASE),
42 		.virtual	= HI3620_SYSCTRL_VIRT_BASE,
43 		.length		= 0x1000,
44 		.type		= MT_DEVICE,
45 	},
46 };
47 
48 static void __init hi3620_map_io(void)
49 {
50 	debug_ll_io_init();
51 	iotable_init(hi3620_io_desc, ARRAY_SIZE(hi3620_io_desc));
52 }
53 
54 static void hi3xxx_restart(enum reboot_mode mode, const char *cmd)
55 {
56 	struct device_node *np;
57 	void __iomem *base;
58 	int offset;
59 
60 	np = of_find_compatible_node(NULL, NULL, "hisilicon,sysctrl");
61 	if (!np) {
62 		pr_err("failed to find hisilicon,sysctrl node\n");
63 		return;
64 	}
65 	base = of_iomap(np, 0);
66 	if (!base) {
67 		pr_err("failed to map address in hisilicon,sysctrl node\n");
68 		return;
69 	}
70 	if (of_property_read_u32(np, "reboot-offset", &offset) < 0) {
71 		pr_err("failed to find reboot-offset property\n");
72 		return;
73 	}
74 	writel_relaxed(0xdeadbeef, base + offset);
75 
76 	while (1)
77 		cpu_do_idle();
78 }
79 
80 static const char *hi3xxx_compat[] __initconst = {
81 	"hisilicon,hi3620-hi4511",
82 	NULL,
83 };
84 
85 DT_MACHINE_START(HI3620, "Hisilicon Hi3620 (Flattened Device Tree)")
86 	.map_io		= hi3620_map_io,
87 	.dt_compat	= hi3xxx_compat,
88 	.smp		= smp_ops(hi3xxx_smp_ops),
89 	.restart	= hi3xxx_restart,
90 MACHINE_END
91