summaryrefslogtreecommitdiffstats
path: root/arch/kvx
diff options
context:
space:
mode:
authorClement Leger <cleger@kalray.eu>2020-04-04 22:29:08 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2020-04-15 08:40:34 +0200
commit83040a72125f3f0211fbc9d237f8567e3022ef3c (patch)
treede1d4b3625fc0607d4c600f8736ac0d50c5be436 /arch/kvx
parentb9f8a97e130769a1d00c6461013cd1e48e42361c (diff)
downloadbarebox-83040a72125f3f0211fbc9d237f8567e3022ef3c.tar.gz
barebox-83040a72125f3f0211fbc9d237f8567e3022ef3c.tar.xz
kvx: Implement reset source and reset
Implement reset and reset source handling using ftu. This support uses regmap to access the ftu easily using "kalray,kvx-syscon" compatible. Signed-off-by: Clement Leger <cleger@kalray.eu> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/kvx')
-rw-r--r--arch/kvx/Kconfig2
-rw-r--r--arch/kvx/configs/generic_defconfig1
-rw-r--r--arch/kvx/cpu/Makefile2
-rw-r--r--arch/kvx/cpu/reset.c67
-rw-r--r--arch/kvx/include/asm/ftu.h24
5 files changed, 95 insertions, 1 deletions
diff --git a/arch/kvx/Kconfig b/arch/kvx/Kconfig
index 5af94cca77..5463bb4f14 100644
--- a/arch/kvx/Kconfig
+++ b/arch/kvx/Kconfig
@@ -7,9 +7,11 @@ config KVX
select FLEXIBLE_BOOTARGS
select GENERIC_FIND_NEXT_BIT
select LIBFDT
+ select MFD_SYSCON
select OF_BAREBOX_DRIVERS
select OFDEVICE
select PARTITION
+ select RESET_SOURCE
default y
config PHYS_ADDR_T_64BIT
diff --git a/arch/kvx/configs/generic_defconfig b/arch/kvx/configs/generic_defconfig
index 535f1cf8be..3f7bb0f195 100644
--- a/arch/kvx/configs/generic_defconfig
+++ b/arch/kvx/configs/generic_defconfig
@@ -4,6 +4,7 @@ CONFIG_BAUDRATE=115200
CONFIG_CMD_CMP=y
CONFIG_CMD_OF_DUMP=y
CONFIG_CMD_POWEROFF=y
+CONFIG_CMD_RESET=y
CONFIG_CONSOLE_RATP=y
CONFIG_DRIVER_SERIAL_NS16550=y
CONFIG_PINCTRL_SINGLE=y
diff --git a/arch/kvx/cpu/Makefile b/arch/kvx/cpu/Makefile
index 1d06352061..4a140ffd1b 100644
--- a/arch/kvx/cpu/Makefile
+++ b/arch/kvx/cpu/Makefile
@@ -3,5 +3,5 @@
# Copyright (C) 2019 Kalray Inc.
#
-obj-y += start.o cpu.o exception.o
+obj-y += start.o cpu.o exception.o reset.o
extra-y += barebox.lds
diff --git a/arch/kvx/cpu/reset.c b/arch/kvx/cpu/reset.c
new file mode 100644
index 0000000000..c7f2018e00
--- /dev/null
+++ b/arch/kvx/cpu/reset.c
@@ -0,0 +1,67 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2020 Kalray Inc.
+ */
+
+#include <common.h>
+#include <reset_source.h>
+#include <mfd/syscon.h>
+#include <restart.h>
+#include <regmap.h>
+#include <init.h>
+
+#include <asm/ftu.h>
+
+static struct regmap *ftu_regmap;
+
+static void __noreturn kvx_restart_soc(struct restart_handler *rst)
+{
+ regmap_write(ftu_regmap, KVX_FTU_SW_RESET_OFFSET, 0x1);
+
+ /* Not reached */
+ hang();
+}
+
+
+static int kvx_reset_init(void)
+{
+ int ret;
+ u32 rst_cause;
+
+ ftu_regmap = syscon_regmap_lookup_by_compatible("kalray,kvx-syscon");
+ if (IS_ERR(ftu_regmap))
+ return PTR_ERR(ftu_regmap);
+
+ ret = regmap_read(ftu_regmap, KVX_FTU_RESET_CAUSE_OFFSET, &rst_cause);
+ if (ret < 0) {
+ reset_source_set(RESET_UKWN);
+ return ret;
+ }
+
+ switch (rst_cause) {
+ case KVX_FTU_RESET_CAUSE_CODE_DSU:
+ reset_source_set(RESET_JTAG);
+ break;
+ case KVX_FTU_RESET_CAUSE_CODE_SW:
+ reset_source_set(RESET_RST);
+ break;
+ case KVX_FTU_RESET_CAUSE_CODE_MPPA:
+ reset_source_set(RESET_POR);
+ break;
+ case KVX_FTU_RESET_CAUSE_CODE_PCIE:
+ reset_source_set(RESET_EXT);
+ break;
+ case KVX_FTU_RESET_CAUSE_CODE_WDOG_0:
+ case KVX_FTU_RESET_CAUSE_CODE_WDOG_1:
+ case KVX_FTU_RESET_CAUSE_CODE_WDOG_2:
+ case KVX_FTU_RESET_CAUSE_CODE_WDOG_3:
+ case KVX_FTU_RESET_CAUSE_CODE_WDOG_4:
+ reset_source_set(RESET_WDG);
+ break;
+ }
+
+ restart_handler_register_fn(kvx_restart_soc);
+
+ return 0;
+}
+device_initcall(kvx_reset_init);
diff --git a/arch/kvx/include/asm/ftu.h b/arch/kvx/include/asm/ftu.h
new file mode 100644
index 0000000000..4bc935721d
--- /dev/null
+++ b/arch/kvx/include/asm/ftu.h
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (C) 2019 Kalray Inc.
+ */
+
+#ifndef _ASM_KVX_FTU_H
+#define _ASM_KVX_FTU_H
+
+/* FTU reset cause register definitions */
+#define KVX_FTU_RESET_CAUSE_OFFSET 0x48
+#define KVX_FTU_RESET_CAUSE_CODE_MPPA 0x0
+#define KVX_FTU_RESET_CAUSE_CODE_DSU 0x1
+#define KVX_FTU_RESET_CAUSE_CODE_SW 0x2
+#define KVX_FTU_RESET_CAUSE_CODE_PCIE 0x3
+#define KVX_FTU_RESET_CAUSE_CODE_WDOG_0 0x8
+#define KVX_FTU_RESET_CAUSE_CODE_WDOG_1 0x9
+#define KVX_FTU_RESET_CAUSE_CODE_WDOG_2 0xA
+#define KVX_FTU_RESET_CAUSE_CODE_WDOG_3 0xB
+#define KVX_FTU_RESET_CAUSE_CODE_WDOG_4 0xC
+
+/* FTU reset register definitions */
+#define KVX_FTU_SW_RESET_OFFSET 0x50
+
+#endif /* _ASM_KVX_FTU_H */