summaryrefslogtreecommitdiff
path: root/chip/mchp/watchdog.c
diff options
context:
space:
mode:
Diffstat (limited to 'chip/mchp/watchdog.c')
-rw-r--r--chip/mchp/watchdog.c127
1 files changed, 72 insertions, 55 deletions
diff --git a/chip/mchp/watchdog.c b/chip/mchp/watchdog.c
index f7e47ee3b7..b8f986f5cd 100644
--- a/chip/mchp/watchdog.c
+++ b/chip/mchp/watchdog.c
@@ -15,15 +15,39 @@ void watchdog_reload(void)
{
MCHP_WDG_KICK = 1;
-#ifdef CONFIG_WATCHDOG_HELP
- /* Reload the auxiliary timer */
- MCHP_TMR16_CTL(0) &= ~BIT(5);
- MCHP_TMR16_CNT(0) = CONFIG_AUX_TIMER_PERIOD_MS;
- MCHP_TMR16_CTL(0) |= BIT(5);
-#endif
+ if (IS_ENABLED(CONFIG_WATCHDOG_HELP)) {
+ /* Reload the auxiliary timer */
+ MCHP_TMR16_CTL(0) &= ~BIT(5);
+ MCHP_TMR16_CNT(0) = CONFIG_AUX_TIMER_PERIOD_MS;
+ MCHP_TMR16_CTL(0) |= BIT(5);
+ }
}
DECLARE_HOOK(HOOK_TICK, watchdog_reload, HOOK_PRIO_DEFAULT);
+#if defined(CHIP_FAMILY_MEC152X) || defined(CHIP_FAMILY_MEC172X)
+static void wdg_intr_enable(int enable)
+{
+ if (enable) {
+ MCHP_WDG_STATUS = MCHP_WDG_STS_IRQ;
+ MCHP_WDG_IEN = MCHP_WDG_IEN_IRQ_EN;
+ MCHP_WDG_CTL |= MCHP_WDG_RESET_IRQ_EN;
+ MCHP_INT_ENABLE(MCHP_WDG_GIRQ) = MCHP_WDG_GIRQ_BIT;
+ task_enable_irq(MCHP_IRQ_WDG);
+ } else {
+ MCHP_WDG_IEN = 0U;
+ MCHP_WDG_CTL &= ~(MCHP_WDG_RESET_IRQ_EN);
+ MCHP_INT_DISABLE(MCHP_WDG_GIRQ) = MCHP_WDG_GIRQ_BIT;
+ task_disable_irq(MCHP_IRQ_WDG);
+ }
+}
+#else
+static void wdg_intr_enable(int enable)
+{
+ (void) enable;
+}
+#endif
+
+
/*
* MEC1701 WDG asserts chip reset on LOAD count expiration.
* WDG interrupt is simulated using a 16-bit general purpose
@@ -41,74 +65,67 @@ DECLARE_HOOK(HOOK_TICK, watchdog_reload, HOOK_PRIO_DEFAULT);
*/
int watchdog_init(void)
{
-#ifdef CONFIG_WATCHDOG_HELP
- uint32_t val;
+ if (IS_ENABLED(CONFIG_WATCHDOG_HELP)) {
+ /*
+ * MEC170x Watchdog does not warn us before expiring.
+ * Let's use a 16-bit timer as an auxiliary timer.
+ */
- /*
- * Watchdog does not warn us before expiring. Let's use a 16-bit
- * timer as an auxiliary timer.
- */
-
- /* Clear 16-bit basic timer 0 PCR sleep enable */
- MCHP_PCR_SLP_DIS_DEV(MCHP_PCR_BTMR16_0);
-
- /* Stop the auxiliary timer if it's running */
- MCHP_TMR16_CTL(0) &= ~BIT(5);
+ /* Clear 16-bit basic timer 0 PCR sleep enable */
+ MCHP_PCR_SLP_DIS_DEV(MCHP_PCR_BTMR16_0);
- /* Enable auxiliary timer */
- MCHP_TMR16_CTL(0) |= BIT(0);
+ /* Stop the auxiliary timer if it's running */
+ MCHP_TMR16_CTL(0) &= ~BIT(5);
- val = MCHP_TMR16_CTL(0);
+ /* Enable auxiliary timer */
+ MCHP_TMR16_CTL(0) |= BIT(0);
- /* Pre-scale = 48000 -> 1kHz -> Period = 1ms */
- val = (val & 0xffff) | (47999 << 16);
+ /* Prescaler = 48000 -> 1kHz -> Period = 1 ms */
+ MCHP_TMR16_CTL(0) = (MCHP_TMR16_CTL(0) & 0xffffU)
+ | (47999 << 16);
- /* No auto restart */
- val &= ~BIT(3);
+ /* No auto restart */
+ MCHP_TMR16_CTL(0) &= ~BIT(3);
- /* Count down */
- val &= ~BIT(2);
+ /* Count down */
+ MCHP_TMR16_CTL(0) &= ~BIT(2);
- MCHP_TMR16_CTL(0) = val;
+ /* Enable interrupt from auxiliary timer */
+ MCHP_TMR16_IEN(0) |= BIT(0);
+ task_enable_irq(MCHP_IRQ_TIMER16_0);
+ MCHP_INT_ENABLE(MCHP_TMR16_GIRQ) = MCHP_TMR16_GIRQ_BIT(0);
- /* Enable interrupt from auxiliary timer */
- MCHP_TMR16_IEN(0) |= 1;
- task_enable_irq(MCHP_IRQ_TIMER16_0);
- MCHP_INT_ENABLE(MCHP_TMR16_GIRQ) = MCHP_TMR16_GIRQ_BIT(0);
+ /* Load and start the auxiliary timer */
+ MCHP_TMR16_CNT(0) = CONFIG_AUX_TIMER_PERIOD_MS;
+ MCHP_TMR16_CNT(0) |= BIT(5);
+ }
- /* Load and start the auxiliary timer */
- MCHP_TMR16_CNT(0) = CONFIG_AUX_TIMER_PERIOD_MS;
- MCHP_TMR16_CNT(0) |= BIT(5);
-#endif
MCHP_WDG_CTL = 0;
/* Clear WDT PCR sleep enable */
MCHP_PCR_SLP_DIS_DEV(MCHP_PCR_WDT);
- /* Set timeout. It takes 1007us to decrement WDG_CNT by 1. */
+ /* Set timeout. It takes 1007 us to decrement WDG_CNT by 1. */
MCHP_WDG_LOAD = CONFIG_WATCHDOG_PERIOD_MS * 1000 / 1007;
-#if defined(CHIP_FAMILY_MEC152X)
- MCHP_WDG_STATUS = MCHP_WDG_STS_IRQ;
- MCHP_WDG_IEN = MCHP_WDG_IEN_IRQ_EN;
- MCHP_WDG_CTL |= MCHP_WDG_RESET_IRQ_EN;
- MCHP_INT_ENABLE(MCHP_WDG_GIRQ) = MCHP_WDG_GIRQ_BIT;
- task_enable_irq(MCHP_IRQ_WDG);
-#endif
+ wdg_intr_enable(1);
- /* Start watchdog */
-#ifdef CONFIG_CHIPSET_DEBUG
- /* WDT will not count if JTAG TRST# is pulled high by JTAG cable */
- MCHP_WDG_CTL = MCHP_WDT_CTL_ENABLE | MCHP_WDT_CTL_JTAG_STALL_EN;
-#else
- MCHP_WDG_CTL |= MCHP_WDT_CTL_ENABLE;
-#endif
+ /*
+ * Start watchdog
+ * If chipset debug build enable feature to prevent watchdog from
+ * counting if a debug cable is attached to JTAG_RST#.
+ */
+ if (IS_ENABLED(CONFIG_CHIPSET_DEBUG))
+ MCHP_WDG_CTL |= (MCHP_WDT_CTL_ENABLE
+ | MCHP_WDT_CTL_JTAG_STALL_EN);
+ else
+ MCHP_WDG_CTL |= MCHP_WDT_CTL_ENABLE;
return EC_SUCCESS;
}
/* MEC152x Watchdog can fire an interrupt to CPU before system reset */
-#if defined(CHIP_FAMILY_MEC152X)
+#if defined(CHIP_FAMILY_MEC152X) || defined(CHIP_FAMILY_MEC172X)
void __keep watchdog_check(uint32_t excep_lr, uint32_t excep_sp)
{
@@ -138,7 +155,7 @@ void IRQ_HANDLER(MCHP_IRQ_WDG)(void)
"mov r1, sp\n"
/*
* Must push registers in pairs to keep 64-bit aligned
- * stack for ARM EABI. This also conveninently saves
+ * stack for ARM EABI. This also conveniently saves
* R0=LR so we can pass it to task_resched_if_needed.
*/
"push {r0, lr}\n"
@@ -177,7 +194,7 @@ void IRQ_HANDLER(MCHP_IRQ_TIMER16_0)(void)
"mov r1, sp\n"
/*
* Must push registers in pairs to keep 64-bit aligned
- * stack for ARM EABI. This also conveninently saves
+ * stack for ARM EABI. This also conveniently saves
* R0=LR so we can pass it to task_resched_if_needed.
*/
"push {r0, lr}\n"
@@ -192,4 +209,4 @@ const struct irq_priority __keep IRQ_PRIORITY(MCHP_IRQ_TIMER16_0)
= {MCHP_IRQ_TIMER16_0, 0};
#endif /* #ifdef CONFIG_WATCHDOG_HELP */
-#endif /* #if defined(CHIP_FAMILY_MEC152X) */
+#endif /* #if defined(CHIP_FAMILY_MEC152X) || defined(CHIP_FAMILY_MEC172X) */