diff options
author | Randall Spangler <rspangler@chromium.org> | 2012-07-13 16:40:43 -0700 |
---|---|---|
committer | Randall Spangler <rspangler@chromium.org> | 2012-07-16 10:20:58 -0700 |
commit | 7ee63359b86be2c5aa9567f51d28613f6e40213e (patch) | |
tree | da54f47eb9ca0a9e76997be34fe15a575484367a /chip/lm4/system.c | |
parent | 0e933d1ce987cb68e4c5682508aba47f925613ae (diff) | |
download | chrome-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.c | 23 |
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) |