diff options
author | Shreenidhi Shedi <yesshedi@gmail.com> | 2018-07-15 02:05:40 +0530 |
---|---|---|
committer | Michal Simek <michal.simek@xilinx.com> | 2018-07-19 10:49:55 +0200 |
commit | 6ec6f5841d7ee9f4f398f5c617a50a14f2f446ef (patch) | |
tree | 0796f8075ba83e36a0f5a394fa0e0cb25c0339f1 /board | |
parent | 88811bb5a11b1d29196694fdcfa26a4e6ebd87d4 (diff) |
microblaze: Support for watchdog_reset in init
We should support watchdog reset so that WATCHDOG_RESET will function
properly.
Signed-off-by: Shreenidhi Shedi <yesshedi@gmail.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Diffstat (limited to 'board')
-rw-r--r-- | board/xilinx/microblaze-generic/microblaze-generic.c | 47 |
1 files changed, 43 insertions, 4 deletions
diff --git a/board/xilinx/microblaze-generic/microblaze-generic.c b/board/xilinx/microblaze-generic/microblaze-generic.c index 9be2cceca7..556d0de7f1 100644 --- a/board/xilinx/microblaze-generic/microblaze-generic.c +++ b/board/xilinx/microblaze-generic/microblaze-generic.c @@ -17,6 +17,8 @@ #include <asm/microblaze_intc.h> #include <asm/asm.h> #include <asm/gpio.h> +#include <dm/uclass.h> +#include <wdt.h> DECLARE_GLOBAL_DATA_PTR; @@ -24,6 +26,10 @@ DECLARE_GLOBAL_DATA_PTR; static int reset_pin = -1; #endif +#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_WDT) +static struct udevice *watchdog_dev; +#endif /* !CONFIG_SPL_BUILD && CONFIG_WDT */ + ulong ram_base; int dram_init_banksize(void) @@ -68,10 +74,6 @@ int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if (reset_pin != -1) gpio_direction_output(reset_pin, 1); #endif - -#ifdef CONFIG_XILINX_TB_WATCHDOG - hw_watchdog_disable(); -#endif #endif puts("Resetting board\n"); __asm__ __volatile__ (" mts rmsr, r0;" \ @@ -91,9 +93,46 @@ static int gpio_init(void) return 0; } +#ifdef CONFIG_WDT +/* Called by macro WATCHDOG_RESET */ +void watchdog_reset(void) +{ +#if !defined(CONFIG_SPL_BUILD) + ulong now; + static ulong next_reset; + + if (!watchdog_dev) + return; + + now = timer_get_us(); + + /* Do not reset the watchdog too often */ + if (now > next_reset) { + wdt_reset(watchdog_dev); + next_reset = now + 1000; + } +#endif /* !CONFIG_SPL_BUILD */ +} +#endif /* CONFIG_WDT */ + int board_late_init(void) { gpio_init(); +#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_WDT) + watchdog_dev = NULL; + + 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, 0, 0); + puts("Watchdog: Started\n"); +#endif /* !CONFIG_SPL_BUILD && CONFIG_WDT */ + return 0; } |