@@ -8,7 +8,10 @@
#include <common.h>
#include <asm/armv8/mmu.h>
#include <asm/system.h>
+#include <dm/device.h>
+#include <dm/uclass.h>
#include <fdtdec.h>
+#include <wdt.h>
static struct mm_region ns3_mem_map[] = {
{
@@ -41,6 +44,13 @@ int board_init(void)
int board_late_init(void)
{
+#if CONFIG_IS_ENABLED(WDT)
+ /*
+ * Default WDT service is started with 60 sec time out.
+ * Disable it and start before giving control to Linux.
+ */
+ wdt_stop(gd->watchdog_dev);
+#endif
return 0;
}
@@ -63,3 +73,55 @@ void reset_cpu(ulong addr)
{
psci_system_reset();
}
+
+#ifdef CONFIG_OF_BOARD_SETUP
+#if CONFIG_IS_ENABLED(WDT)
+
+#ifndef CONFIG_WATCHDOG_TIMEOUT_MSECS
+#define CONFIG_WATCHDOG_TIMEOUT_MSECS (60 * 1000)
+#endif
+#define DEF_TIMEOUT_SEC (CONFIG_WATCHDOG_TIMEOUT_MSECS / 1000)
+
+static int start_wdt(void)
+{
+ u32 timeout = DEF_TIMEOUT_SEC;
+ struct udevice *udev;
+ int rc = 0;
+ u32 wdt_enable;
+
+ wdt_enable = env_get_ulong("wdt_enable", 16, 0);
+ printf("wdt_enable :%u\n", wdt_enable);
+ if (!wdt_enable)
+ return rc;
+
+ rc = uclass_get_device(UCLASS_WDT, 0, &udev);
+ if (rc) {
+ printf("Failed to get wdt rc:%d\n", rc);
+ } else {
+ timeout = env_get_ulong("wdt_timeout_sec", 10, 0);
+ if (!timeout) {
+ if (CONFIG_IS_ENABLED(OF_CONTROL))
+ timeout = dev_read_u32_default(gd->watchdog_dev,
+ "timeout-sec",
+ DEF_TIMEOUT_SEC);
+ }
+ wdt_start(udev, timeout * 1000, 0);
+ printf("Started wdt (%ds timeout)\n", timeout);
+ }
+
+ return rc;
+}
+#else
+static int start_wdt(void)
+{
+ return 0;
+}
+#endif /* CONFIG_WDT */
+
+int ft_board_setup(void *fdt, bd_t *bd)
+{
+ start_wdt();
+
+ return 0;
+}
+#endif /* CONFIG_OF_BOARD_SETUP */