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.kokata...@broadcom.com> Signed-off-by: Bharat Kumar Reddy Gooty <bharat.go...@broadcom.com> Signed-off-by: Pramod Kumar <pramod.ku...@broadcom.com> --- Changes from v1: -Address review comments from Simon, -include <dm.h> instead of <dm/device.h> and <dm/uclass.h> -remove include <fdtdec.h> as its not required -Use if() instead of #if def -rearrange code in start_wdt() -remove #else part of #ifdef CONFIG_DT board/broadcom/bcmns3/ns3.c | 50 +++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/board/broadcom/bcmns3/ns3.c b/board/broadcom/bcmns3/ns3.c index 0dd78cde34..1ba6c3fe5d 100644 --- a/board/broadcom/bcmns3/ns3.c +++ b/board/broadcom/bcmns3/ns3.c @@ -5,7 +5,10 @@ */ #include <common.h> +#include <dm.h> +#include <env.h> #include <fdt_support.h> +#include <wdt.h> #include <asm/io.h> #include <asm/gic.h> #include <asm/gic-v3.h> @@ -133,6 +136,13 @@ int board_init(void) int board_late_init(void) { + /* + * Default WDT service is started with 60 sec time out. + * Disable it and start before giving control to Linux. + */ + if (CONFIG_IS_ENABLED(WDT)) + wdt_stop(gd->watchdog_dev); + return 0; } @@ -184,12 +194,52 @@ void reset_cpu(ulong level) } #ifdef CONFIG_OF_BOARD_SETUP + +#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); + return rc; + } + + 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; +} + int ft_board_setup(void *fdt, bd_t *bd) { gic_lpi_tables_init(BCM_NS3_GIC_LPI_BASE, MAX_GIC_REDISTRIBUTORS); mem_info_parse_fixup(fdt); + if (CONFIG_IS_ENABLED(WDT)) + start_wdt(); + return 0; } #endif /* CONFIG_OF_BOARD_SETUP */ -- 2.17.1