hi3xxx.c 2.4 KB
Newer Older
K
Kevin Hilman 已提交
1
/*
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
 * (Hisilicon's Hi36xx/Hi37xx SoC based) flattened device tree enabled machine
 *
 * Copyright (c) 2012-2013 Hisilicon Ltd.
 * Copyright (c) 2012-2013 Linaro Ltd.
 *
 * Author: Haojian Zhuang <haojian.zhuang@linaro.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
*/

#include <linux/clk-provider.h>
#include <linux/clocksource.h>
#include <linux/irqchip.h>
K
Kevin Hilman 已提交
17
#include <linux/of_address.h>
18 19
#include <linux/of_platform.h>

K
Kevin Hilman 已提交
20 21
#include <asm/proc-fns.h>

22 23 24
#include <asm/mach/arch.h>
#include <asm/mach/map.h>

K
Kevin Hilman 已提交
25 26 27 28 29
#include "core.h"

#define HI3620_SYSCTRL_PHYS_BASE		0xfc802000
#define HI3620_SYSCTRL_VIRT_BASE		0xfe802000

30 31 32 33 34 35 36 37 38 39
/*
 * This table is only for optimization. Since ioremap() could always share
 * the same mapping if it's defined as static IO mapping.
 *
 * Without this table, system could also work. The cost is some virtual address
 * spaces wasted since ioremap() may be called multi times for the same
 * IO space.
 */
static struct map_desc hi3620_io_desc[] __initdata = {
	{
K
Kevin Hilman 已提交
40 41 42
		/* sysctrl */
		.pfn		= __phys_to_pfn(HI3620_SYSCTRL_PHYS_BASE),
		.virtual	= HI3620_SYSCTRL_VIRT_BASE,
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
		.length		= 0x1000,
		.type		= MT_DEVICE,
	},
};

static void __init hi3620_map_io(void)
{
	debug_ll_io_init();
	iotable_init(hi3620_io_desc, ARRAY_SIZE(hi3620_io_desc));
}

static void __init hi3xxx_timer_init(void)
{
	of_clk_init(NULL);
	clocksource_of_init();
}

K
Kevin Hilman 已提交
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
static void hi3xxx_restart(enum reboot_mode mode, const char *cmd)
{
	struct device_node *np;
	void __iomem *base;
	int offset;

	np = of_find_compatible_node(NULL, NULL, "hisilicon,sysctrl");
	if (!np) {
		pr_err("failed to find hisilicon,sysctrl node\n");
		return;
	}
	base = of_iomap(np, 0);
	if (!base) {
		pr_err("failed to map address in hisilicon,sysctrl node\n");
		return;
	}
	if (of_property_read_u32(np, "reboot-offset", &offset) < 0) {
		pr_err("failed to find reboot-offset property\n");
		return;
	}
	writel_relaxed(0xdeadbeef, base + offset);

	while (1)
		cpu_do_idle();
}

86 87 88 89 90 91 92 93 94
static const char *hi3xxx_compat[] __initconst = {
	"hisilicon,hi3620-hi4511",
	NULL,
};

DT_MACHINE_START(HI3620, "Hisilicon Hi3620 (Flattened Device Tree)")
	.map_io		= hi3620_map_io,
	.init_time	= hi3xxx_timer_init,
	.dt_compat	= hi3xxx_compat,
K
Kevin Hilman 已提交
95 96
	.smp		= smp_ops(hi3xxx_smp_ops),
	.restart	= hi3xxx_restart,
97
MACHINE_END