summaryrefslogtreecommitdiff
path: root/chip/max32660/wdt_chip.c
diff options
context:
space:
mode:
authorJerry Bradshaw <jerry.bradshaw@maximintegrated.com>2019-06-06 08:52:13 -0500
committerCommit Bot <commit-bot@chromium.org>2019-07-17 21:27:38 +0000
commit21a255ea953e8ac64d05147ad7f11491db126cf4 (patch)
treec71d32772410dd7748b599619d8741b10d152b93 /chip/max32660/wdt_chip.c
parent0e3dd9d2cc19b65654f8090aa02f8dac20358c2e (diff)
downloadchrome-ec-21a255ea953e8ac64d05147ad7f11491db126cf4.tar.gz
Basic implentation of the Maxim Integrated MAX32660 within the EC OS
Includes System Clock, Timer, Uart, Watchdog Change-Id: I195059c87d97e70c6a134304143613b86b623e22 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1647741 Reviewed-by: Jes Klinke <jbk@chromium.org> Reviewed-by: Randall Spangler <rspangler@chromium.org> Tested-by: Jerry Bradshaw <jerry.bradshaw@maximintegrated.com> Commit-Queue: Jes Klinke <jbk@chromium.org>
Diffstat (limited to 'chip/max32660/wdt_chip.c')
-rw-r--r--chip/max32660/wdt_chip.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/chip/max32660/wdt_chip.c b/chip/max32660/wdt_chip.c
new file mode 100644
index 0000000000..1c99c798fc
--- /dev/null
+++ b/chip/max32660/wdt_chip.c
@@ -0,0 +1,67 @@
+/* Copyright 2019 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/* MAX32660 Watchdog Module */
+
+#include "clock.h"
+#include "common.h"
+#include "gpio.h"
+#include "hooks.h"
+#include "task.h"
+#include "util.h"
+#include "watchdog.h"
+#include "console.h"
+#include "registers.h"
+#include "board.h"
+#include "wdt_regs.h"
+
+#define CPUTS(outstr) cputs(CC_COMMAND, outstr)
+#define CPRINTS(format, args...) cprints(CC_COMMAND, format, ##args)
+
+/* For a System clock of 96MHz,
+ * Time in seconds = 96000000 / 2 * 2^power
+ * Example for MXC_S_WDT_CTRL_INT_PERIOD_WDT2POW29
+ * Time in seconds = 96000000 / 2 * 2^29
+ * = 11.1 Seconds
+ */
+#define WATCHDOG_TIMER_PERIOD MXC_S_WDT_CTRL_INT_PERIOD_WDT2POW29
+
+volatile int starve_dog = 0;
+
+void watchdog_reload(void)
+{
+ if (!starve_dog) {
+ /* Reset the watchdog */
+ MXC_WDT0->rst = 0x00A5;
+ MXC_WDT0->rst = 0x005A;
+ }
+}
+DECLARE_HOOK(HOOK_TICK, watchdog_reload, HOOK_PRIO_DEFAULT);
+
+int watchdog_init(void)
+{
+ /* Set the Watchdog period */
+ MXC_SETFIELD(MXC_WDT0->ctrl, MXC_F_WDT_CTRL_RST_PERIOD,
+ (WATCHDOG_TIMER_PERIOD << 4));
+
+ /* We want the WD to reset us if it is not fed in time. */
+ MXC_WDT0->ctrl |= MXC_F_WDT_CTRL_RST_EN;
+ /* Enable the watchdog */
+ MXC_WDT0->ctrl |= MXC_F_WDT_CTRL_WDT_EN;
+ /* Reset the watchdog */
+ MXC_WDT0->rst = 0x00A5;
+ MXC_WDT0->rst = 0x005A;
+ return EC_SUCCESS;
+}
+
+static int command_watchdog_test(int argc, char **argv)
+{
+ starve_dog = 1;
+
+ CPRINTS("done command_watchdog_test.");
+ return EC_SUCCESS;
+}
+DECLARE_CONSOLE_COMMAND(wdttest, command_watchdog_test, "wdttest",
+ "Force a WDT reset.");