[PATCH v2 06/16] board: ti: evm: Store wakeup reason on scratchpad memory
Richard Genoud (TI)
richard.genoud at bootlin.com
Wed Jun 3 11:54:39 CEST 2026
From: Abhash Kumar Jha <a-kumar2 at ti.com>
While resuming from suspend, the wakeup reason need to be stored
and this will be used by the Linux kernel once its up.
Use the 32 bytes of MCU_PSRAM0_RAM area (addr = 0x40280000) to
store the wakeup reason.
Read the value as soon as it starts and store it internally.
Signed-off-by: Abhash Kumar Jha <a-kumar2 at ti.com>
Co-developed-by: Richard Genoud (TI) <richard.genoud at bootlin.com>
Signed-off-by: Richard Genoud (TI) <richard.genoud at bootlin.com>
---
arch/arm/mach-k3/Kconfig | 10 ++++++++++
arch/arm/mach-k3/r5/lpm-common.c | 24 ++++++++++++++++++++++++
2 files changed, 34 insertions(+)
diff --git a/arch/arm/mach-k3/Kconfig b/arch/arm/mach-k3/Kconfig
index 4b7cef64935c..667e23bf2293 100644
--- a/arch/arm/mach-k3/Kconfig
+++ b/arch/arm/mach-k3/Kconfig
@@ -101,6 +101,16 @@ config SYS_K3_BOOT_CORE_ID
int
default 16
+config SYS_K3_SCRATCH_LPM_ADDR
+ hex
+ default 0x40280000 if SOC_K3_J721E || SOC_K3_J7200 || SOC_K3_J784S4
+ default 0x0
+ help
+ Address where the wake-up reason is stored at resume (32 bits).
+ It will be read by the Linux kernel once its up.
+ On J7200/J784s4 the MCU_PSRAM0_RAM is used by default.
+ Set it to 0 if unused.
+
config K3_EARLY_CONS
bool "Activate to allow for an early console during SPL"
depends on SPL
diff --git a/arch/arm/mach-k3/r5/lpm-common.c b/arch/arm/mach-k3/r5/lpm-common.c
index 1b3660f8243b..539a2207f986 100644
--- a/arch/arm/mach-k3/r5/lpm-common.c
+++ b/arch/arm/mach-k3/r5/lpm-common.c
@@ -29,6 +29,11 @@
/* PMIC register where the magic value resides */
#define K3_LPM_SCRATCH_PAD_REG_3 0xcb
+/* Wake-up source IDs */
+#define K3_LPM_WAKE_SOURCE_MAIN_IO 0x80
+#define K3_LPM_WAKE_SOURCE_MCU_IO 0x81
+#define K3_LPM_WAKE_SOURCE_PMIC_GPIO 0xB0
+
#define IO_ISO_STATUS BIT(25)
#define FW_IMAGE_SIZE 0x80000
@@ -40,6 +45,11 @@ struct lpm_addr_info {
u32 size;
};
+struct lpm_scratch_space {
+ u16 wake_src;
+ u16 reserved;
+} __packed;
+
__weak void clear_isolation(void) { }
/* This is used by J722s */
@@ -48,6 +58,7 @@ __weak void ctrl_mmr_unlock(void) { }
/* in board_init_f(), there's no BSS, so we can't use global/static variables */
bool j7xx_board_is_resuming(void)
{
+ struct lpm_scratch_space *lpm_scratch;
struct udevice *pmic, *i2c;
u32 pmctrl_val = 0;
int ret;
@@ -58,7 +69,18 @@ bool j7xx_board_is_resuming(void)
#ifdef PMCTRL_IO_LPM
pmctrl_val = readl(PMCTRL_IO_LPM);
#endif
+ lpm_scratch = (struct lpm_scratch_space *)CONFIG_SYS_K3_SCRATCH_LPM_ADDR;
+ if (lpm_scratch) {
+ lpm_scratch->wake_src = 0;
+ lpm_scratch->reserved = 0;
+ }
if ((pmctrl_val & IO_ISO_STATUS) == IO_ISO_STATUS) {
+ if (lpm_scratch) {
+ if (IS_ENABLED(CONFIG_SOC_K3_J784S4))
+ lpm_scratch->wake_src = K3_LPM_WAKE_SOURCE_MCU_IO;
+ else
+ lpm_scratch->wake_src = K3_LPM_WAKE_SOURCE_MAIN_IO;
+ }
clear_isolation();
gd_set_k3_resuming(K3_RESUME_STATE_RESUMING);
debug("board is resuming from IO_DDR mode\n");
@@ -100,6 +122,8 @@ bool j7xx_board_is_resuming(void)
if (ret == K3_LPM_MAGIC_SUSPEND) {
debug("%s: board is resuming\n", __func__);
+ if (lpm_scratch)
+ lpm_scratch->wake_src = K3_LPM_WAKE_SOURCE_PMIC_GPIO;
gd_set_k3_resuming(K3_RESUME_STATE_RESUMING);
/* clean magic suspend */
--
2.47.3
More information about the U-Boot
mailing list