summaryrefslogtreecommitdiff
path: root/arch/arm/mach-k3/am62x/boot.c
diff options
context:
space:
mode:
authorWadim Egorov <w.egorov@phytec.de>2025-05-15 13:15:54 +0200
committerTom Rini <trini@konsulko.com>2025-05-29 08:32:28 -0600
commitbe93c0892d0f0bf83ac669678e01ae27f798738e (patch)
treeeb70b5983ccf0aa913d1bdac35d625d4686104b0 /arch/arm/mach-k3/am62x/boot.c
parenta282950debce20035cc12672c856ff2d70326ad4 (diff)
arm: mach-k3: am62x: Implement get_reset_reason()
Implement get_reset_reason() for AM62x to enable reporting of the reset cause in the cpuinfo output. Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
Diffstat (limited to 'arch/arm/mach-k3/am62x/boot.c')
-rw-r--r--arch/arm/mach-k3/am62x/boot.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/arch/arm/mach-k3/am62x/boot.c b/arch/arm/mach-k3/am62x/boot.c
index 132b42f7edb..a3a6cda6bdb 100644
--- a/arch/arm/mach-k3/am62x/boot.c
+++ b/arch/arm/mach-k3/am62x/boot.c
@@ -101,3 +101,43 @@ u32 get_boot_device(void)
return bootmedia;
}
+
+const char *get_reset_reason(void)
+{
+ u32 reset_reason = readl(CTRLMMR_MCU_RST_SRC);
+
+ /* After reading reset source register, software must clear it */
+ if (reset_reason)
+ writel(reset_reason, CTRLMMR_MCU_RST_SRC);
+
+ if (reset_reason == 0 ||
+ (reset_reason & (RST_SRC_SW_MAIN_POR_FROM_MAIN |
+ RST_SRC_SW_MAIN_POR_FROM_MCU |
+ RST_SRC_DS_MAIN_PORZ)))
+ return "POR";
+
+ if (reset_reason & (RST_SRC_SAFETY_ERR | RST_SRC_MAIN_ESM_ERR))
+ return "ESM";
+
+ if (reset_reason & RST_SRC_DM_WDT_RST)
+ return "WDOG";
+
+ if (reset_reason & (RST_SRC_SW_MAIN_WARM_FROM_MAIN |
+ RST_SRC_SW_MAIN_WARM_FROM_MCU |
+ RST_SRC_SW_MCU_WARM_RST))
+ return "RST";
+
+ if (reset_reason & (RST_SRC_SMS_WARM_RST | RST_SRC_SMS_COLD_RST))
+ return "DMSC";
+
+ if (reset_reason & RST_SRC_DEBUG_RST)
+ return "JTAG";
+
+ if (reset_reason & RST_SRC_THERMAL_RST)
+ return "THERMAL";
+
+ if (reset_reason & (RST_SRC_MAIN_RESET_PIN | RST_SRC_MCU_RESET_PIN))
+ return "PIN";
+
+ return "UNKNOWN";
+}