summaryrefslogtreecommitdiff
path: root/chip/lm4/system.c
diff options
context:
space:
mode:
authorRandall Spangler <rspangler@chromium.org>2012-07-13 16:40:43 -0700
committerRandall Spangler <rspangler@chromium.org>2012-07-16 10:20:58 -0700
commit7ee63359b86be2c5aa9567f51d28613f6e40213e (patch)
treeda54f47eb9ca0a9e76997be34fe15a575484367a /chip/lm4/system.c
parent0e933d1ce987cb68e4c5682508aba47f925613ae (diff)
downloadchrome-ec-7ee63359b86be2c5aa9567f51d28613f6e40213e.tar.gz
Support preserving reset flags across a reset
This is needed for flash pre-init to be able to hard reset to clear uncommitted write protect flags without losing the reset flags. BUG=chrome-os-partner:11368 TEST=manual Use reboot and sysinfo commands... 1. reset with keyboard. flags -> reset-pin 2. 'reboot soft preserve' flags -> soft reset-pin power-on 3. 'reboot hard preserve' flags -> hard soft reset-pin power-on 4. 'reboot soft'. flags -> soft 5. 'reboot hard'. flags -> hard power-on Change-Id: I6164a78d99c5c10330f90f651148c5795e7afdda Signed-off-by: Randall Spangler <rspangler@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/27418
Diffstat (limited to 'chip/lm4/system.c')
-rw-r--r--chip/lm4/system.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/chip/lm4/system.c b/chip/lm4/system.c
index 959c3e4232..7b0a3ed041 100644
--- a/chip/lm4/system.c
+++ b/chip/lm4/system.c
@@ -13,8 +13,9 @@
/* Indices for hibernate data registers */
enum hibdata_index {
- HIBDATA_INDEX_SCRATCHPAD, /* General-purpose scratchpad */
- HIBDATA_INDEX_WAKE, /* Wake reasons for hibernate */
+ HIBDATA_INDEX_SCRATCHPAD, /* General-purpose scratchpad */
+ HIBDATA_INDEX_WAKE, /* Wake reasons for hibernate */
+ HIBDATA_INDEX_SAVED_RESET_FLAGS /* Saved reset flags */
};
/* Flags for HIBDATA_INDEX_WAKE */
@@ -135,6 +136,9 @@ static void check_reset_cause(void)
if (hib_status & 0x04)
flags |= RESET_FLAG_LOW_BATTERY;
+ /* Restore then clear saved reset flags */
+ flags |= hibdata_read(HIBDATA_INDEX_SAVED_RESET_FLAGS);
+ hibdata_write(HIBDATA_INDEX_SAVED_RESET_FLAGS, 0);
system_set_reset_flags(flags);
}
@@ -247,18 +251,23 @@ int system_pre_init(void)
return EC_SUCCESS;
}
-void system_reset(int is_hard)
+void system_reset(int flags)
{
/* Disable interrupts to avoid task swaps during reboot */
interrupt_disable();
- if (is_hard) {
+ /* Save current reset reasons if necessary */
+ if (flags & SYSTEM_RESET_PRESERVE_FLAGS)
+ hibdata_write(HIBDATA_INDEX_SAVED_RESET_FLAGS,
+ system_get_reset_flags());
+ else
+ hibdata_write(HIBDATA_INDEX_SAVED_RESET_FLAGS, 0);
+
+ if (flags & SYSTEM_RESET_HARD) {
/* Bounce through hibernate to trigger a hard reboot */
hibernate(0, 50000, HIBDATA_WAKE_HARD_RESET);
- } else {
- /* Soft reboot */
+ } else
CPU_NVIC_APINT = 0x05fa0004;
- }
/* Spin and wait for reboot; should never return */
while (1)