aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--board/st-ericsson/u8500/u8500.c3
-rw-r--r--cpu/arm_cortexa9/db8500/prcmu.c8
-rw-r--r--include/asm-arm/arch-db8500/prcmu.h1
3 files changed, 11 insertions, 1 deletions
diff --git a/board/st-ericsson/u8500/u8500.c b/board/st-ericsson/u8500/u8500.c
index b26abed1c..3ad998dda 100644
--- a/board/st-ericsson/u8500/u8500.c
+++ b/board/st-ericsson/u8500/u8500.c
@@ -707,7 +707,8 @@ int board_late_init(void)
*/
prcmu_reset_status_reg = readl(PRCM_RESET_STATUS);
if (restarted() ||
- (prcmu_reset_status_reg & (PRCM_A9_CPU_WATCHDOG_RESET)))
+ (prcmu_reset_status_reg & (PRCM_A9_CPU_WATCHDOG_RESET)) ||
+ prcmu_crashed())
setenv("preboot", "checkcrash");
return (0);
diff --git a/cpu/arm_cortexa9/db8500/prcmu.c b/cpu/arm_cortexa9/db8500/prcmu.c
index 731cedfb8..29b717413 100644
--- a/cpu/arm_cortexa9/db8500/prcmu.c
+++ b/cpu/arm_cortexa9/db8500/prcmu.c
@@ -41,6 +41,7 @@
#define PRCM_ARM_IT1_VAL (PRCMU_BASE + 0x494)
#define PRCM_XP70_CUR_PWR_STATE (tcdm_base + 0xFFC)
+#define PRCM_SW_RST_REASON (tcdm_base + 0xFF8)
#define PRCM_REQ_MB5 (tcdm_base + 0xE44)
#define PRCM_ACK_MB5 (tcdm_base + 0xDF4)
@@ -262,6 +263,13 @@ static void prcmu_enable(u32 *reg)
writel(readl(reg) | (1 << 8), reg);
}
+int prcmu_crashed()
+{
+ if (!prcmu_is_ready())
+ return 0;
+ return (readl(PRCM_SW_RST_REASON) & 0x0000ffff) == 0xDEAD;
+}
+
void db8500_prcmu_init(void)
{
struct clk_mgt_regs *clks;
diff --git a/include/asm-arm/arch-db8500/prcmu.h b/include/asm-arm/arch-db8500/prcmu.h
index af6e271e0..d1da35519 100644
--- a/include/asm-arm/arch-db8500/prcmu.h
+++ b/include/asm-arm/arch-db8500/prcmu.h
@@ -55,6 +55,7 @@
/* Init PRCMU relatated things in db8500 SoC platform */
void db8500_prcmu_init(void);
+int prcmu_crashed(void);
#endif /* __PRCMU_H__ */