[PATCH v1 21/49] board: ns3: start sp805 watchdog service
Rayagonda Kokatanur
rayagonda.kokatanur at broadcom.com
Mon Apr 27 12:51:39 CEST 2020
Start sp805 watchdog service.
Parse wdt timeout from env and dts, give precedence to env
timeout if defined. Set default timeout to 60s if both env
and dts doesn't specifiy timeout.
Stop the WDT in board late init and start the
WDT service before giving control to Linux.
Signed-off-by: Rayagonda Kokatanur <rayagonda.kokatanur at broadcom.com>
Signed-off-by: Bharat Kumar Reddy Gooty <bharat.gooty at broadcom.com>
Signed-off-by: Pramod Kumar <pramod.kumar at broadcom.com>
---
board/broadcom/bcmns3/ns3.c | 62 +++++++++++++++++++++++++++++++++++++
1 file changed, 62 insertions(+)
diff --git a/board/broadcom/bcmns3/ns3.c b/board/broadcom/bcmns3/ns3.c
index 0b9af6ad9b..80f6a516e3 100644
--- a/board/broadcom/bcmns3/ns3.c
+++ b/board/broadcom/bcmns3/ns3.c
@@ -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 */
--
2.17.1
More information about the U-Boot
mailing list