aboutsummaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorPaolo Pisati2017-02-10 17:28:05 +0100
committerTom Rini2017-05-09 20:30:08 -0400
commit45a6d231b2f9b891a7df517fc40b8466e12f2b57 (patch)
tree1297bde1b56a80d0d9e9eeda13db1a6bcac5f475 /drivers
parent3e16705d3e253e54d62c793fc92904840c282576 (diff)
bcm2835_wdt: support for the BCM2835/2836 watchdog
Signed-off-by: Paolo Pisati <p.pisati@gmail.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/watchdog/Kconfig12
-rw-r--r--drivers/watchdog/Makefile1
-rw-r--r--drivers/watchdog/bcm2835_wdt.c35
3 files changed, 48 insertions, 0 deletions
diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
index 2034e3c620f..bdaf5d4101d 100644
--- a/drivers/watchdog/Kconfig
+++ b/drivers/watchdog/Kconfig
@@ -1,5 +1,17 @@
menu "Watchdog Timer Support"
+config HW_WATCHDOG
+ bool
+
+config BCM2835_WDT
+ bool "Enable BCM2835/2836 watchdog driver"
+ select HW_WATCHDOG
+ help
+ Say Y here to enable the BCM2835/2836 watchdog
+
+ This provides basic infrastructure to support BCM2835/2836 watchdog
+ hardware, with a max timeout of ~15secs.
+
config ULP_WATCHDOG
bool "i.MX7ULP watchdog"
help
diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
index dfc7fbda4ab..8378601b331 100644
--- a/drivers/watchdog/Makefile
+++ b/drivers/watchdog/Makefile
@@ -18,3 +18,4 @@ obj-$(CONFIG_ULP_WATCHDOG) += ulp_wdog.o
obj-$(CONFIG_WDT) += wdt-uclass.o
obj-$(CONFIG_WDT_SANDBOX) += sandbox_wdt.o
obj-$(CONFIG_WDT_ASPEED) += ast_wdt.o
+obj-$(CONFIG_BCM2835_WDT) += bcm2835_wdt.o
diff --git a/drivers/watchdog/bcm2835_wdt.c b/drivers/watchdog/bcm2835_wdt.c
new file mode 100644
index 00000000000..6f753ae8ae4
--- /dev/null
+++ b/drivers/watchdog/bcm2835_wdt.c
@@ -0,0 +1,35 @@
+/*
+ * Watchdog driver for Broadcom BCM2835
+ *
+ * Copyright (C) 2017 Paolo Pisati <p.pisati@gmail.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+#include <common.h>
+#include <efi_loader.h>
+#include <asm/io.h>
+#include <asm/arch/wdog.h>
+
+#define SECS_TO_WDOG_TICKS(x) ((x) << 16)
+#define MAX_TIMEOUT 0xf /* ~15s */
+
+static __efi_runtime_data bool enabled = true;
+
+extern void reset_cpu(ulong ticks);
+
+void hw_watchdog_reset(void)
+{
+ if (enabled)
+ reset_cpu(SECS_TO_WDOG_TICKS(MAX_TIMEOUT));
+}
+
+void hw_watchdog_init(void)
+{
+ hw_watchdog_reset();
+}
+
+void __efi_runtime hw_watchdog_disable(void)
+{
+ enabled = false;
+}