diff options
author | Masahiro Yamada <yamada.masahiro@socionext.com> | 2016-06-29 19:39:03 +0900 |
---|---|---|
committer | Masahiro Yamada <yamada.masahiro@socionext.com> | 2016-07-02 05:44:30 +0900 |
commit | e64a6b11411befbaf166443d02d8b10e06852f6a (patch) | |
tree | b9fbba6c1c6937467d0516e5e4048b4aec64e184 /arch/arm/mach-uniphier/board_early_init_f.c | |
parent | 1013aef3307e6cc3e1b654314aa9f48dc5cf62c7 (diff) | |
download | u-boot-imx-e64a6b11411befbaf166443d02d8b10e06852f6a.zip u-boot-imx-e64a6b11411befbaf166443d02d8b10e06852f6a.tar.gz u-boot-imx-e64a6b11411befbaf166443d02d8b10e06852f6a.tar.bz2 |
ARM: uniphier: add external IRQ setup code
I will carry this work-around until it is cared in the kernel.
This looks up the AIDET node and sets up a register to handle
active low interrupt signals.
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Diffstat (limited to 'arch/arm/mach-uniphier/board_early_init_f.c')
-rw-r--r-- | arch/arm/mach-uniphier/board_early_init_f.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/arch/arm/mach-uniphier/board_early_init_f.c b/arch/arm/mach-uniphier/board_early_init_f.c index f853701..d35d38d 100644 --- a/arch/arm/mach-uniphier/board_early_init_f.c +++ b/arch/arm/mach-uniphier/board_early_init_f.c @@ -4,10 +4,47 @@ * SPDX-License-Identifier: GPL-2.0+ */ +#include <common.h> +#include <libfdt.h> +#include <linux/io.h> + #include "init.h" #include "micro-support-card.h" #include "soc-info.h" +DECLARE_GLOBAL_DATA_PTR; + +static void uniphier_setup_xirq(void) +{ + const void *fdt = gd->fdt_blob; + int soc_node, aidet_node; + const u32 *val; + unsigned long aidet_base; + u32 tmp; + + soc_node = fdt_path_offset(fdt, "/soc"); + if (soc_node < 0) + return; + + aidet_node = fdt_subnode_offset_namelen(fdt, soc_node, "aidet", 5); + if (aidet_node < 0) + return; + + val = fdt_getprop(fdt, aidet_node, "reg", NULL); + if (!val) + return; + + aidet_base = fdt32_to_cpu(*val); + + tmp = readl(aidet_base + 8); /* AIDET DETCONFR2 */ + tmp |= 0x00ff0000; /* Set XIRQ0-7 low active */ + writel(tmp, aidet_base + 8); + + tmp = readl(0x55000090); /* IRQCTL */ + tmp |= 0x000000ff; + writel(tmp, 0x55000090); +} + int board_early_init_f(void) { led_puts("U0"); @@ -81,6 +118,8 @@ int board_early_init_f(void) break; } + uniphier_setup_xirq(); + led_puts("U2"); return 0; |