diff options
author | Haojian Zhuang <haojian.zhuang@linaro.org> | 2012-12-29 11:36:20 +0800 |
---|---|---|
committer | Guodong Xu <guodong.xu@linaro.org> | 2013-01-21 15:28:13 +0800 |
commit | da7b16e4ec5ac18944ca360bd10e3d3a2219ad26 (patch) | |
tree | b7a651ae0b88289b334c6b431aa9f0c54e3bc973 | |
parent | 51cbea611b6ab7d74c20e58c977883756996a5fe (diff) |
ARM: hs: add board support with device tree
Add board support with device tree for Hisilicon Hi36xx/Hi37xx platform.
Signed-off-by: Haojian Zhuang <haojian.zhuang@linaro.org>
-rw-r--r-- | arch/arm/Kconfig | 2 | ||||
-rw-r--r-- | arch/arm/Makefile | 1 | ||||
-rw-r--r-- | arch/arm/mach-hs/Kconfig | 21 | ||||
-rw-r--r-- | arch/arm/mach-hs/Makefile | 5 | ||||
-rw-r--r-- | arch/arm/mach-hs/hs-dt.c | 97 |
5 files changed, 126 insertions, 0 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 67874b82a4ed..53d4045374c5 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -1040,6 +1040,8 @@ source "arch/arm/mach-h720x/Kconfig" source "arch/arm/mach-highbank/Kconfig" +source "arch/arm/mach-hs/Kconfig" + source "arch/arm/mach-integrator/Kconfig" source "arch/arm/mach-iop32x/Kconfig" diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 30c443c406f3..b9d358732b71 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -149,6 +149,7 @@ machine-$(CONFIG_ARCH_EP93XX) += ep93xx machine-$(CONFIG_ARCH_GEMINI) += gemini machine-$(CONFIG_ARCH_H720X) += h720x machine-$(CONFIG_ARCH_HIGHBANK) += highbank +machine-$(CONFIG_ARCH_HS) += hs machine-$(CONFIG_ARCH_INTEGRATOR) += integrator machine-$(CONFIG_ARCH_IOP13XX) += iop13xx machine-$(CONFIG_ARCH_IOP32X) += iop32x diff --git a/arch/arm/mach-hs/Kconfig b/arch/arm/mach-hs/Kconfig new file mode 100644 index 000000000000..6fbc2e3ed560 --- /dev/null +++ b/arch/arm/mach-hs/Kconfig @@ -0,0 +1,21 @@ +config ARCH_HS + bool "Hisilicon Hi36xx/Hi37xx family" if ARCH_MULTI_V7 + select CACHE_L2X0 + select CACHE_PL310 + select PINCTRL + select PINCTRL_SINGLE + select SERIAL_AMBA_PL011 + select SERIAL_AMBA_PL011_CONSOLE + help + Support for Hislicon Hi36xx/Hi37xx processor family + +if ARCH_HS + +config MACH_HS_DT + bool "Hisilicon Development Board" + default y + help + Say 'Y' here if you want to support the Hisilicon Development + Board. + +endif diff --git a/arch/arm/mach-hs/Makefile b/arch/arm/mach-hs/Makefile new file mode 100644 index 000000000000..d79ecb55a2c9 --- /dev/null +++ b/arch/arm/mach-hs/Makefile @@ -0,0 +1,5 @@ +# +# Makefile for Hisilicon Hi36xx/Hi37xx processors line +# + +obj-$(CONFIG_MACH_HS_DT) += hs-dt.o diff --git a/arch/arm/mach-hs/hs-dt.c b/arch/arm/mach-hs/hs-dt.c new file mode 100644 index 000000000000..8599c0c91c46 --- /dev/null +++ b/arch/arm/mach-hs/hs-dt.c @@ -0,0 +1,97 @@ +/* + * (Hisilicon's Hi36xx/Hi37xx SoC based) flattened device tree enabled machine + * + * Copyright (c) 2012-2013 Linaro Ltd. + * + * 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.h> +#include <linux/clkdev.h> +#include <linux/of_address.h> +#include <linux/of_irq.h> +#include <linux/of_platform.h> + +#include <asm/hardware/arm_timer.h> +#include <asm/hardware/gic.h> +#include <asm/hardware/timer-sp.h> +#include <asm/mach/arch.h> +#include <asm/mach/map.h> +#include <asm/mach/time.h> + +static struct of_device_id hs_timer_match[] __initdata = { + { .compatible = "arm,sp804", }, + {} +}; + +static struct clk_lookup sp804_lookup = { + .dev_id = "sp804", + .clk = NULL, +}; + +extern void __init hs_init_clocks(void); +static void __init hs_timer_init(void) +{ + struct device_node *node = NULL; + void __iomem *base; + int irq; + + hs_init_clocks(); + + node = of_find_matching_node(NULL, hs_timer_match); + WARN_ON(!node); + if (!node) { + pr_err("Failed to find sp804 timer\n"); + return; + } + base = of_iomap(node, 0); + WARN_ON(!base); + + /* timer0 is used as clock event, and timer1 is clock source. */ + irq = irq_of_parse_and_map(node, 0); + WARN_ON(!irq); + + sp804_lookup.clk = of_clk_get(node, 0); + clkdev_add(&sp804_lookup); + + sp804_clocksource_and_sched_clock_init(base + TIMER_2_BASE, "timer1"); + sp804_clockevents_init(base, irq, "timer0"); +} + +static struct sys_timer hs_timer = { + .init = hs_timer_init, +}; + +static struct of_device_id hs_irq_match[] __initdata = { + { .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, + {} +}; + +static void __init hs_irq_init(void) +{ + of_irq_init(hs_irq_match); +} + +static void __init hs_init(void) +{ + of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); +} + +static const char *hs_compat[] __initdata = { + "hisilicon,hi3620-hi4511", + NULL, +}; + +DT_MACHINE_START(HS_DT, "Hisilicon Hi36xx/Hi37xx (Flattened Device Tree)") + /* Maintainer: Haojian Zhuang <haojian.zhuang@linaro.org> */ + .map_io = debug_ll_io_init, + .init_irq = hs_irq_init, + .timer = &hs_timer, + .init_machine = hs_init, + .handle_irq = gic_handle_irq, + .dt_compat = hs_compat, +MACHINE_END |