[PATCH v4 0/7] wdt: Add support for watchdogs on Kendryte K210

This series depends on https://patchwork.ozlabs.org/project/uboot/list/?series=200642
Changes in v4: - Fix build error without CONFIG_CLK
Changes in v3: - Note dependency on "time: Fix get_ticks being non-monotonic" - Add a few signed-off-bys which were sent for version 1
Changes in v2: - Fix fls being off-by-one when compared to log_2_n_round_up - Move watchdog enable to k210.dtsi as it does not depend on anything board-specific.
Sean Anderson (7): wdt: dw: Switch to using fls for log2 wdt: dw: Switch to if(CONFIG()) instead of using #if wdt: dw: Fix clock rate being off by 1000 wdt: dw: Enable the clock before using it wdt: dw: Free the clock on error riscv: Add watchdog bindings for the k210 riscv: Enable watchdog for the k210
arch/riscv/dts/k210.dtsi | 1 - board/sipeed/maix/Kconfig | 2 ++ drivers/watchdog/designware_wdt.c | 39 ++++++++++++++++++++----------- 3 files changed, 27 insertions(+), 15 deletions(-)

log_2_n_round_up is only found in arm. fls performs the same job and is generic.
Signed-off-by: Sean Anderson seanga2@gmail.com Reviewed-by: Simon Glass sjg@chromium.org ---
(no changes since v2)
Changes in v2: - Fix fls being off-by-one when compared to log_2_n_round_up
drivers/watchdog/designware_wdt.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/watchdog/designware_wdt.c b/drivers/watchdog/designware_wdt.c index 12f09a7a39..f25c8d9ab3 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);

This is preferred over #if because the compiler can check syntax even if the feature is disabled. This cannot be used for CONFIG_CLK because CONFIG_DW_WDT_CLOCK_KHZ is not defined on all platforms.
Signed-off-by: Sean Anderson seanga2@gmail.com Reviewed-by: Heinrich Schuchardt xypron.glpk@gmx.de ---
(no changes since v1)
drivers/watchdog/designware_wdt.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/drivers/watchdog/designware_wdt.c b/drivers/watchdog/designware_wdt.c index f25c8d9ab3..49cf861d46 100644 --- a/drivers/watchdog/designware_wdt.c +++ b/drivers/watchdog/designware_wdt.c @@ -136,17 +136,17 @@ static int designware_wdt_probe(struct udevice *dev) 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) + return ret;
- ret = reset_deassert_bulk(&resets); - if (ret) - return ret; -#endif + ret = reset_deassert_bulk(&resets); + if (ret) + return ret; + }
/* reset to disable the watchdog */ return designware_wdt_stop(dev);

The clock subsystem returns clock rates in Hz. We need to divide by 1000 so the rate is in kHz.
Fixes: cf89ef8d10f240554541c20b2e1bdcdd58d1d7e6 Signed-off-by: Sean Anderson seanga2@gmail.com Reviewed-by: Simon Glass sjg@chromium.org ---
(no changes since v1)
drivers/watchdog/designware_wdt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/watchdog/designware_wdt.c b/drivers/watchdog/designware_wdt.c index 49cf861d46..41866fa01b 100644 --- a/drivers/watchdog/designware_wdt.c +++ b/drivers/watchdog/designware_wdt.c @@ -129,7 +129,7 @@ static int designware_wdt_probe(struct udevice *dev) if (ret) return ret;
- priv->clk_khz = clk_get_rate(&clk); + priv->clk_khz = clk_get_rate(&clk) / 1000; if (!priv->clk_khz) return -EINVAL; #else

The watchdog won't work if the clock isn't enabled.
Fixes: cf89ef8d10f240554541c20b2e1bdcdd58d1d7e6 Signed-off-by: Sean Anderson seanga2@gmail.com Reviewed-by: Simon Glass sjg@chromium.org ---
(no changes since v1)
drivers/watchdog/designware_wdt.c | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/drivers/watchdog/designware_wdt.c b/drivers/watchdog/designware_wdt.c index 41866fa01b..e6f5437056 100644 --- a/drivers/watchdog/designware_wdt.c +++ b/drivers/watchdog/designware_wdt.c @@ -129,6 +129,10 @@ static int designware_wdt_probe(struct udevice *dev) if (ret) return ret;
+ ret = clk_enable(&clk); + if (ret) + return ret; + priv->clk_khz = clk_get_rate(&clk) / 1000; if (!priv->clk_khz) return -EINVAL;

The clock subsystem requires that clk_free be called on clocks obtained via clk_get_*.
Signed-off-by: Sean Anderson seanga2@gmail.com Reviewed-by: Simon Glass sjg@chromium.org ---
Changes in v4: - Fix build error without CONFIG_CLK
drivers/watchdog/designware_wdt.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/drivers/watchdog/designware_wdt.c b/drivers/watchdog/designware_wdt.c index e6f5437056..b952737fb4 100644 --- a/drivers/watchdog/designware_wdt.c +++ b/drivers/watchdog/designware_wdt.c @@ -131,11 +131,13 @@ static int designware_wdt_probe(struct udevice *dev)
ret = clk_enable(&clk); if (ret) - return 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 @@ -145,15 +147,21 @@ static int designware_wdt_probe(struct udevice *dev)
ret = reset_get_bulk(dev, &resets); if (ret) - return ret; + goto err;
ret = reset_deassert_bulk(&resets); if (ret) - return 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 = {

This adds the necessary bindings. Most of them are already there.
Signed-off-by: Sean Anderson seanga2@gmail.com Acked-by: Rick Chen rick@andestech.com ---
(no changes since v2)
Changes in v2: - Move watchdog enable to k210.dtsi as it does not depend on anything board-specific.
arch/riscv/dts/k210.dtsi | 1 - 1 file changed, 1 deletion(-)
diff --git a/arch/riscv/dts/k210.dtsi b/arch/riscv/dts/k210.dtsi index 84cff51c36..81ac417dde 100644 --- a/arch/riscv/dts/k210.dtsi +++ b/arch/riscv/dts/k210.dtsi @@ -426,7 +426,6 @@ interrupts = <21>; clocks = <&sysclk K210_CLK_WDT0>; resets = <&sysrst K210_RST_WDT0>; - status = "disabled"; };
wdt1: watchdog@50410000 {

This enables the necessary config options.
Signed-off-by: Sean Anderson seanga2@gmail.com Reviewed-by: Simon Glass sjg@chromium.org ---
(no changes since v3)
Changes in v3: - Note dependency on "time: Fix get_ticks being non-monotonic" - Add a few signed-off-bys which were sent for version 1
board/sipeed/maix/Kconfig | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/board/sipeed/maix/Kconfig b/board/sipeed/maix/Kconfig index 0cdcd32adc..b9dac5a64e 100644 --- a/board/sipeed/maix/Kconfig +++ b/board/sipeed/maix/Kconfig @@ -44,4 +44,6 @@ config BOARD_SPECIFIC_OPTIONS imply RESET_SYSCON imply SYSRESET imply SYSRESET_SYSCON + imply WDT + imply DESIGNWARE_WATCHDOG endif

On 9/9/20 5:04 PM, Sean Anderson wrote:
This series depends on https://patchwork.ozlabs.org/project/uboot/list/?series=200642
Changes in v4:
- Fix build error without CONFIG_CLK
Changes in v3:
- Note dependency on "time: Fix get_ticks being non-monotonic"
- Add a few signed-off-bys which were sent for version 1
Changes in v2:
- Fix fls being off-by-one when compared to log_2_n_round_up
- Move watchdog enable to k210.dtsi as it does not depend on anything board-specific.
Sean Anderson (7): wdt: dw: Switch to using fls for log2 wdt: dw: Switch to if(CONFIG()) instead of using #if wdt: dw: Fix clock rate being off by 1000 wdt: dw: Enable the clock before using it wdt: dw: Free the clock on error riscv: Add watchdog bindings for the k210 riscv: Enable watchdog for the k210
arch/riscv/dts/k210.dtsi | 1 - board/sipeed/maix/Kconfig | 2 ++ drivers/watchdog/designware_wdt.c | 39 ++++++++++++++++++++----------- 3 files changed, 27 insertions(+), 15 deletions(-)
*ping*
Marek can these go into -next?
--Sean

On 10/1/20 10:56 AM, Sean Anderson wrote:
On 9/9/20 5:04 PM, Sean Anderson wrote:
This series depends on https://patchwork.ozlabs.org/project/uboot/list/?series=200642
Changes in v4:
- Fix build error without CONFIG_CLK
Changes in v3:
- Note dependency on "time: Fix get_ticks being non-monotonic"
- Add a few signed-off-bys which were sent for version 1
Changes in v2:
- Fix fls being off-by-one when compared to log_2_n_round_up
- Move watchdog enable to k210.dtsi as it does not depend on anything board-specific.
Sean Anderson (7): wdt: dw: Switch to using fls for log2 wdt: dw: Switch to if(CONFIG()) instead of using #if wdt: dw: Fix clock rate being off by 1000 wdt: dw: Enable the clock before using it wdt: dw: Free the clock on error riscv: Add watchdog bindings for the k210 riscv: Enable watchdog for the k210
arch/riscv/dts/k210.dtsi | 1 - board/sipeed/maix/Kconfig | 2 ++ drivers/watchdog/designware_wdt.c | 39 ++++++++++++++++++++----------- 3 files changed, 27 insertions(+), 15 deletions(-)
*ping*
Marek can these go into -next?
--Sean
*second ping*
It appears that an earlier version of this series [1] was assigned to Marek Vasut, but that the current version is assigned to Rick Chen. v2 should be marked as superseded. Can this get picked up for the merge window?
--Sean
[1] https://patchwork.ozlabs.org/project/uboot/list/?series=194673 [2] https://patchwork.ozlabs.org/project/uboot/list/?series=200657

On Fri, Oct 23, 2020 at 09:30:24AM -0400, Sean Anderson wrote:
On 10/1/20 10:56 AM, Sean Anderson wrote:
On 9/9/20 5:04 PM, Sean Anderson wrote:
This series depends on https://patchwork.ozlabs.org/project/uboot/list/?series=200642
Changes in v4:
- Fix build error without CONFIG_CLK
Changes in v3:
- Note dependency on "time: Fix get_ticks being non-monotonic"
- Add a few signed-off-bys which were sent for version 1
Changes in v2:
- Fix fls being off-by-one when compared to log_2_n_round_up
- Move watchdog enable to k210.dtsi as it does not depend on anything board-specific.
Sean Anderson (7): wdt: dw: Switch to using fls for log2 wdt: dw: Switch to if(CONFIG()) instead of using #if wdt: dw: Fix clock rate being off by 1000 wdt: dw: Enable the clock before using it wdt: dw: Free the clock on error riscv: Add watchdog bindings for the k210 riscv: Enable watchdog for the k210
arch/riscv/dts/k210.dtsi | 1 - board/sipeed/maix/Kconfig | 2 ++ drivers/watchdog/designware_wdt.c | 39 ++++++++++++++++++++----------- 3 files changed, 27 insertions(+), 15 deletions(-)
*ping*
Marek can these go into -next?
--Sean
*second ping*
It appears that an earlier version of this series [1] was assigned to Marek Vasut, but that the current version is assigned to Rick Chen. v2 should be marked as superseded. Can this get picked up for the merge window?
The v2 mess-up was me, probably, some typo or another. For v4, it looks fine to me. Rick?
participants (2)
-
Sean Anderson
-
Tom Rini