diff options
| author | Inochi Amaoto <inochiama@gmail.com> | 2026-05-29 16:52:32 +0800 |
|---|---|---|
| committer | Anup Patel <anup@brainfault.org> | 2026-06-15 10:10:25 +0530 |
| commit | dec9141a77058dc941f2d0f07107f7306a995c35 (patch) | |
| tree | 2b974255b12b3be8e9cd93efd0d6e1e737fb3d72 | |
| parent | 9c9767504d4e2e48015642239cea954d17ea6bef (diff) | |
| download | opensbi-dec9141a77058dc941f2d0f07107f7306a995c35.tar.gz opensbi-dec9141a77058dc941f2d0f07107f7306a995c35.zip | |
lib: utils/reset: Add litex SoC reset driver
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 <inochiama@gmail.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Link: https://lore.kernel.org/r/20260529085234.1682842-1-inochiama@gmail.com
Signed-off-by: Anup Patel <anup@brainfault.org>
| -rw-r--r-- | lib/utils/reset/Kconfig | 5 | ||||
| -rw-r--r-- | lib/utils/reset/fdt_reset_litex.c | 66 | ||||
| -rw-r--r-- | lib/utils/reset/objects.mk | 3 | ||||
| -rw-r--r-- | platform/generic/configs/defconfig | 1 |
4 files changed, 75 insertions, 0 deletions
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 <inochiama@gmail.com> + */ + +#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, ®_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 |
