]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
mips: mt76xx: Enable watchdog support
authorStefan Roese <sr@denx.de>
Tue, 9 Oct 2018 06:59:10 +0000 (08:59 +0200)
committerDaniel Schwierzeck <daniel.schwierzeck@gmail.com>
Sun, 18 Nov 2018 15:02:22 +0000 (16:02 +0100)
This patch enables and starts the watchdog on the MT7620 platform.
Currently the WD timeout is configured to 60 seconds.

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
[fixed build error due to missing function prototype arch_misc_init]
Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
arch/mips/Kconfig
arch/mips/include/asm/u-boot-mips.h
arch/mips/mach-mt7620/cpu.c

index 8278c68817bd308fe7f4c2e455b7db6c8f2666ca..1b1b1d7d00319145ad1a76392ab05d36f96ccbf7 100644 (file)
@@ -79,6 +79,7 @@ config ARCH_MT7620
        select DM_SERIAL
        imply DM_SPI
        imply DM_SPI_FLASH
+       select ARCH_MISC_INIT if WATCHDOG
        select MIPS_TUNE_24KC
        select OF_CONTROL
        select ROM_EXCEPTION_VECTORS
index f4bfbdc693366817a948bfffdc7f1776d94dbb5b..88438b9576bbcf8bb9a4520d34c091e62d5d0b6e 100644 (file)
@@ -7,4 +7,6 @@ void exc_handler(void);
 void except_vec3_generic(void);
 void except_vec_ejtag_debug(void);
 
+int arch_misc_init(void);
+
 #endif /* _U_BOOT_MIPS_H_ */
index 457f09f32c627153716a443b18743b0ff6988ea2..87cc973b756ea712f03d814c6428a4552ff39f4a 100644 (file)
@@ -6,6 +6,7 @@
 #include <common.h>
 #include <dm.h>
 #include <ram.h>
+#include <wdt.h>
 #include <asm/io.h>
 #include <linux/io.h>
 #include <linux/sizes.h>
@@ -67,3 +68,42 @@ int print_cpuinfo(void)
 
        return 0;
 }
+
+#ifdef CONFIG_WATCHDOG
+static struct udevice *watchdog_dev;
+
+/* Called by macro WATCHDOG_RESET */
+void watchdog_reset(void)
+{
+       static ulong next_reset;
+       ulong now;
+
+       if (!watchdog_dev)
+               return;
+
+       now = get_timer(0);
+
+       /* Do not reset the watchdog too often */
+       if (now > next_reset) {
+               next_reset = now + 1000;        /* reset every 1000ms */
+               wdt_reset(watchdog_dev);
+       }
+}
+
+int arch_misc_init(void)
+{
+       /* Init watchdog */
+       if (uclass_get_device_by_seq(UCLASS_WDT, 0, &watchdog_dev)) {
+               debug("Watchdog: Not found by seq!\n");
+               if (uclass_get_device(UCLASS_WDT, 0, &watchdog_dev)) {
+                       puts("Watchdog: Not found!\n");
+                       return 0;
+               }
+       }
+
+       wdt_start(watchdog_dev, 60000, 0);      /* 60 seconds */
+       printf("Watchdog: Started\n");
+
+       return 0;
+}
+#endif