[PATCH] lib: utils/reset: Add litex SoC reset driver

Inochi Amaoto <[email protected]>
Newsgroups org.infradead.lists.opensbi
Message-ID <[email protected]>
Litex SoC controller supports reboot function by toggling the first
bit of the ctrl register. Add a reset driver so other software can
use it.

Signed-off-by: Inochi Amaoto <[email protected]>
---
 lib/utils/reset/Kconfig            |  5 +++
 lib/utils/reset/fdt_reset_litex.c  | 66 ++++++++++++++++++++++++++++++
 lib/utils/reset/objects.mk         |  3 ++
 platform/generic/configs/defconfig |  1 +
 4 files changed, 75 insertions(+)
 create mode 100644 lib/utils/reset/fdt_reset_litex.c

diff --git a/lib/utils/reset/Kconfig b/lib/utils/reset/Kconfig
index f98926e5..b2ac120e 100644
--- a/lib/utils/reset/Kconfig
+++ b/lib/utils/reset/Kconfig
@@ -24,6 +24,11 @@ config FDT_RESET_HTIF
 	select SYS_HTIF
 	default n

+config FDT_RESET_LITEX
+	bool "LITEX SoC reset driver"
+	depends on FDT_GPIO
+	default n
+
 config FDT_RESET_RPMI
 	bool "RPMI FDT reset driver"
 	depends on FDT_MAILBOX && RPMI_MAILBOX
diff --git a/lib/utils/reset/fdt_reset_litex.c b/lib/utils/reset/fdt_reset_litex.c
new file mode 100644
index 00000000..287745f0
--- /dev/null
+++ b/lib/utils/reset/fdt_reset_litex.c
@@ -0,0 +1,66 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2026 Inochi Amaoto <[email protected]>
+ */
+
+#include <libfdt.h>
+#include <sbi/riscv_io.h>
+#include <sbi/sbi_error.h>
+#include <sbi/sbi_system.h>
+#include <sbi_utils/fdt/fdt_driver.h>
+#include <sbi_utils/fdt/fdt_helper.h>
+
+#define RESET_CTRL			0x0
+
+static volatile u32 *litex_soc_base;
+
+static int litex_reset_check(u32 type, u32 reason)
+{
+	switch (type) {
+	case SBI_SRST_RESET_TYPE_COLD_REBOOT:
+	case SBI_SRST_RESET_TYPE_WARM_REBOOT:
+		return 255;
+	}
+
+	return 0;
+}
+
+static void litex_do_reset(u32 type, u32 reason)
+{
+	writel_relaxed(0x1, litex_soc_base + RESET_CTRL);
+}
+
+static struct sbi_system_reset_device litex_reset = {
+	.name = "litex-reset",
+	.system_reset_check = litex_reset_check,
+	.system_reset = litex_do_reset
+};
+
+static int litex_reset_init(const void *fdt, int nodeoff,
+			    const struct fdt_match *match)
+{
+	uint64_t reg_addr;
+	int rc;
+
+	rc = fdt_get_node_addr_size(fdt, nodeoff, 0, &reg_addr, NULL);
+	if (rc < 0 || !reg_addr)
+		return SBI_ENODEV;
+
+
+	litex_soc_base = (volatile u32 *)(unsigned long)reg_addr;
+
+	sbi_system_reset_add_device(&litex_reset);
+
+	return 0;
+}
+
+static const struct fdt_match litex_reset_match[] = {
+	{ .compatible = "litex,soc-controller" },
+	{ },
+};
+
+const struct fdt_driver fdt_reset_litex = {
+	.match_table = litex_reset_match,
+	.init = litex_reset_init,
+};
diff --git a/lib/utils/reset/objects.mk b/lib/utils/reset/objects.mk
index 3c681c27..38b4e306 100644
--- a/lib/utils/reset/objects.mk
+++ b/lib/utils/reset/objects.mk
@@ -17,6 +17,9 @@ libsbiutils-objs-$(CONFIG_FDT_RESET_GPIO) += reset/fdt_reset_gpio.o
 carray-fdt_early_drivers-$(CONFIG_FDT_RESET_HTIF) += fdt_reset_htif
 libsbiutils-objs-$(CONFIG_FDT_RESET_HTIF) += reset/fdt_reset_htif.o

+carray-fdt_early_drivers-$(CONFIG_FDT_RESET_LITEX) += fdt_reset_litex
+libsbiutils-objs-$(CONFIG_FDT_RESET_LITEX) += reset/fdt_reset_litex.o
+
 carray-fdt_early_drivers-$(CONFIG_FDT_RESET_SG2042_HWMON_MCU) += fdt_reset_sg2042_mcu
 libsbiutils-objs-$(CONFIG_FDT_RESET_SG2042_HWMON_MCU) += reset/fdt_reset_sg2042_hwmon_mcu.o

diff --git a/platform/generic/configs/defconfig b/platform/generic/configs/defconfig
index 818b71f4..969639e3 100644
--- a/platform/generic/configs/defconfig
+++ b/platform/generic/configs/defconfig
@@ -49,6 +49,7 @@ CONFIG_FDT_REGMAP_SYSCON=y
 CONFIG_FDT_RESET=y
 CONFIG_FDT_RESET_ATCWDT200=y
 CONFIG_FDT_RESET_GPIO=y
+CONFIG_FDT_RESET_LITEX=y
 CONFIG_FDT_RESET_HTIF=y
 CONFIG_FDT_RESET_RPMI=y
 CONFIG_FDT_RESET_SG2042_HWMON_MCU=y
--
2.54.0


-- 
opensbi mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/opensbi
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.