[PATCH v5 3/7] reboot-mode: add REBOOT_MODE_ENV_UPDATE option
Aswin Murugan
aswin.murugan at oss.qualcomm.com
Thu May 21 20:05:45 CEST 2026
Add REBOOT_MODE_ENV_UPDATE Kconfig option and implement
automatic reboot-mode env variable update at last stage init.
When enabled, the reboot-mode uclass registers an
EVT_LAST_STAGE_INIT event handler that probes the first
reboot-mode device and calls dm_reboot_mode_update() to set
the reboot-mode environment variable.
EVT_LAST_STAGE_INIT fires after the environment is fully
initialized.
Signed-off-by: Aswin Murugan <aswin.murugan at oss.qualcomm.com>
---
drivers/reboot-mode/Kconfig | 8 +++++++
drivers/reboot-mode/reboot-mode-uclass.c | 29 ++++++++++++++++++++++--
2 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/drivers/reboot-mode/Kconfig b/drivers/reboot-mode/Kconfig
index 72b33d71223..6e8825f1e67 100644
--- a/drivers/reboot-mode/Kconfig
+++ b/drivers/reboot-mode/Kconfig
@@ -39,4 +39,12 @@ config REBOOT_MODE_NVMEM
Use any kind of non-volatile memory (EEPROM, RTC, etc) to control the
reboot mode.
+config REBOOT_MODE_ENV_UPDATE
+ bool "Automatically update reboot-mode env variable on boot"
+ depends on DM_REBOOT_MODE
+ help
+ When enabled, the reboot-mode uclass will automatically call
+ dm_reboot_mode_update() on the first reboot-mode device at last
+ stage init.
+
endmenu
diff --git a/drivers/reboot-mode/reboot-mode-uclass.c b/drivers/reboot-mode/reboot-mode-uclass.c
index 7cbe02eb4ed..976544d2810 100644
--- a/drivers/reboot-mode/reboot-mode-uclass.c
+++ b/drivers/reboot-mode/reboot-mode-uclass.c
@@ -6,6 +6,7 @@
#include <dm.h>
#include <dm/device_compat.h>
#include <dm/devres.h>
+#include <event.h>
#include <exports.h>
#include <reboot-mode/reboot-mode.h>
@@ -116,9 +117,33 @@ int dm_reboot_mode_pre_probe(struct udevice *dev)
return 0;
}
+/*
+ * reboot_mode_last_stage_init() - Update reboot-mode env variable at last
+ * stage init.
+ *
+ * Called via EVT_LAST_STAGE_INIT, which fires after the environment is fully
+ * initialized.
+ *
+ */
+static int reboot_mode_last_stage_init(void)
+{
+ struct udevice *dev;
+ int ret;
+
+ if (!CONFIG_IS_ENABLED(REBOOT_MODE_ENV_UPDATE))
+ return 0;
+
+ ret = uclass_first_device_err(UCLASS_REBOOT_MODE, &dev);
+ if (ret)
+ return 0;
+
+ return dm_reboot_mode_update(dev);
+}
+EVENT_SPY_SIMPLE(EVT_LAST_STAGE_INIT, reboot_mode_last_stage_init);
+
UCLASS_DRIVER(reboot_mode) = {
- .name = "reboot-mode",
- .id = UCLASS_REBOOT_MODE,
+ .name = "reboot-mode",
+ .id = UCLASS_REBOOT_MODE,
.pre_probe = dm_reboot_mode_pre_probe,
.per_device_plat_auto =
sizeof(struct reboot_mode_uclass_platdata),
--
2.34.1
More information about the U-Boot
mailing list