diff options
author | Tom Rini <trini@konsulko.com> | 2021-04-08 07:33:14 -0400 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2021-04-08 07:33:14 -0400 |
commit | f6127db8cc8dec22cf9cd6d6363d812f659ce517 (patch) | |
tree | e302101a2cc971287f1df11f2f9eefd513af621d /drivers/watchdog | |
parent | 8246654e1ef3ea9e2907a42e01b7747ccc62d412 (diff) | |
parent | e7bb113cc4d03aeb573ff938a1d897d4b3ca99df (diff) | |
download | u-boot-WIP/08Apr2021.tar.gz |
Merge https://source.denx.de/u-boot/custodians/u-boot-riscvWIP/08Apr2021
- Watchdog, Unleashed and Icicle improvements
Diffstat (limited to 'drivers/watchdog')
-rw-r--r-- | drivers/watchdog/designware_wdt.c | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/drivers/watchdog/designware_wdt.c b/drivers/watchdog/designware_wdt.c index c020324973..9e5487168c 100644 --- a/drivers/watchdog/designware_wdt.c +++ b/drivers/watchdog/designware_wdt.c @@ -9,7 +9,6 @@ #include <reset.h> #include <wdt.h> #include <asm/io.h> -#include <asm/utils.h> #include <linux/bitops.h> #define DW_WDT_CR 0x00 @@ -35,7 +34,7 @@ static int designware_wdt_settimeout(void __iomem *base, unsigned int clk_khz, signed int i; /* calculate the timeout range value */ - i = log_2_n_round_up(timeout * clk_khz) - 16; + i = fls(timeout * clk_khz - 1) - 16; i = clamp(i, 0, 15); writel(i | (i << 4), base + DW_WDT_TORR); @@ -130,27 +129,39 @@ static int designware_wdt_probe(struct udevice *dev) if (ret) return ret; + ret = clk_enable(&clk); + if (ret) + goto err; + priv->clk_khz = clk_get_rate(&clk) / 1000; - if (!priv->clk_khz) - return -EINVAL; + if (!priv->clk_khz) { + ret = -EINVAL; + goto err; + } #else priv->clk_khz = CONFIG_DW_WDT_CLOCK_KHZ; #endif -#if CONFIG_IS_ENABLED(DM_RESET) - struct reset_ctl_bulk resets; + if (CONFIG_IS_ENABLED(DM_RESET)) { + struct reset_ctl_bulk resets; - ret = reset_get_bulk(dev, &resets); - if (ret) - return ret; + ret = reset_get_bulk(dev, &resets); + if (ret) + goto err; - ret = reset_deassert_bulk(&resets); - if (ret) - return ret; -#endif + ret = reset_deassert_bulk(&resets); + if (ret) + goto err; + } /* reset to disable the watchdog */ return designware_wdt_stop(dev); + +err: +#if CONFIG_IS_ENABLED(CLK) + clk_free(&clk); +#endif + return ret; } static const struct wdt_ops designware_wdt_ops = { |