ARM: hisi: enable hix5hd2 SoC
[cascardo/linux.git] / arch / arm / mach-hisi / hisilicon.c
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
92 static const char *hix5hd2_compat[] __initconst = {
93         "hisilicon,hix5hd2",
94         NULL,
95 };
96
97 DT_MACHINE_START(HIX5HD2_DT, "Hisilicon HIX5HD2 (Flattened Device Tree)")
98         .dt_compat      = hix5hd2_compat,
99         .init_late      = hi3xxx_init_late,
100         .smp            = smp_ops(hix5hd2_smp_ops),
101         .restart        = hi3xxx_restart,
102 MACHINE_END