summaryrefslogtreecommitdiff
path: root/chip/it83xx/hwtimer.c
diff options
context:
space:
mode:
authorAlec Berg <alecaberg@chromium.org>2013-11-20 11:38:11 -0800
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2014-01-15 04:52:40 +0000
commit5edde63ac253c98ddb8a5c8584b766f09336d49c (patch)
tree5c4af6a0f63fecc638faec3d9123dce2fad75023 /chip/it83xx/hwtimer.c
parent727053a3761b52a60c94c9cfc75d2f842595cc55 (diff)
downloadchrome-ec-5edde63ac253c98ddb8a5c8584b766f09336d49c.tar.gz
ite: Watchdog module added
Watchdog module added. Off by default because of following limitations: - When programming, the WD fires, and programming fails. For now, you have to program twice. BRANCH=none BUG=chrome-os-partner:23575 TEST=Manually wrote in a while(1); and made sure watchdog warning triggers first, prints IPC register, and then soon after the watchdog timer resets the chip. Signed-off-by: Alec Berg <alecaberg@chromium.org> Change-Id: Ia83f58f3ae108f755d2f139ada22a22e2fbdc2fa Reviewed-on: https://chromium-review.googlesource.com/177397 Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
Diffstat (limited to 'chip/it83xx/hwtimer.c')
-rw-r--r--chip/it83xx/hwtimer.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/chip/it83xx/hwtimer.c b/chip/it83xx/hwtimer.c
index cf4de26be8..3493843adc 100644
--- a/chip/it83xx/hwtimer.c
+++ b/chip/it83xx/hwtimer.c
@@ -13,6 +13,7 @@
#include "task.h"
#include "timer.h"
#include "util.h"
+#include "watchdog.h"
/* 128us (2^7 us) between 2 ticks */
#define TICK_INTERVAL_LOG2 7
@@ -64,6 +65,11 @@ void __hw_clock_source_set(uint32_t ts)
static void __hw_clock_source_irq(void)
{
+#ifdef CONFIG_WATCHDOG
+ /* Determine interrupt number. */
+ int irq = IT83XX_INTC_IVCT3 - 16;
+#endif
+
/*
* If this is a SW interrupt, then process the timers, but don't
* increment the time_us.
@@ -73,6 +79,18 @@ static void __hw_clock_source_irq(void)
return;
}
+#ifdef CONFIG_WATCHDOG
+ /*
+ * Both the external timer for the watchdog warning and the HW timer
+ * go through this irq. So, if this interrupt was caused by watchdog
+ * warning timer, then call that function.
+ */
+ if (irq == IT83XX_IRQ_EXT_TIMER3) {
+ watchdog_warning_irq();
+ return;
+ }
+#endif
+
/* clear interrupt status */
task_clear_pending_irq(IT83XX_IRQ_TMR_B0);