[PATCH v2 1/7] wdt: dw: Switch to using fls for log2

classic Classic list List threaded Threaded
8 messages Options
Reply | Threaded
Open this post in threaded view
|

[PATCH v2 1/7] wdt: dw: Switch to using fls for log2

Sean Anderson
log_2_n_round_up is only found in arm. fls performs the same job and is
generic.

Signed-off-by: Sean Anderson <[hidden email]>
---

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);
--
2.28.0

Reply | Threaded
Open this post in threaded view
|

[PATCH v2 2/7] wdt: dw: Switch to if(CONFIG()) instead of using #if

Sean Anderson
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 <[hidden email]>
Reviewed-by: Heinrich Schuchardt <[hidden email]>
---

(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);
--
2.28.0

Reply | Threaded
Open this post in threaded view
|

[PATCH v2 3/7] wdt: dw: Fix clock rate being off by 1000

Sean Anderson
In reply to this post by Sean Anderson
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 <[hidden email]>
---

(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
--
2.28.0

Reply | Threaded
Open this post in threaded view
|

[PATCH v2 4/7] wdt: dw: Enable the clock before using it

Sean Anderson
In reply to this post by Sean Anderson
The watchdog won't work if the clock isn't enabled.

Fixes: cf89ef8d10f240554541c20b2e1bdcdd58d1d7e6
Signed-off-by: Sean Anderson <[hidden email]>
---

(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;
--
2.28.0

Reply | Threaded
Open this post in threaded view
|

[PATCH v2 5/7] wdt: dw: Free the clock on error

Sean Anderson
In reply to this post by Sean Anderson
The clock subsystem requires that clk_free be called on clocks obtained via
clk_get_*.

Signed-off-by: Sean Anderson <[hidden email]>
---

(no changes since v1)

 drivers/watchdog/designware_wdt.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/drivers/watchdog/designware_wdt.c b/drivers/watchdog/designware_wdt.c
index e6f5437056..189d555f29 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,20 @@ 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);
+ return ret;
 }
 
 static const struct wdt_ops designware_wdt_ops = {
--
2.28.0

Reply | Threaded
Open this post in threaded view
|

[PATCH v2 6/7] riscv: Add watchdog bindings for the k210

Sean Anderson
In reply to this post by Sean Anderson
This adds the necessary bindings. Most of them are already there.

Signed-off-by: Sean Anderson <[hidden email]>
---

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 2546c7d4e0..f70318cb12 100644
--- a/arch/riscv/dts/k210.dtsi
+++ b/arch/riscv/dts/k210.dtsi
@@ -425,7 +425,6 @@
  interrupts = <21>;
  clocks = <&sysclk K210_CLK_WDT0>;
  resets = <&sysrst K210_RST_WDT0>;
- status = "disabled";
  };
 
  wdt1: watchdog@50410000 {
--
2.28.0

Reply | Threaded
Open this post in threaded view
|

[PATCH v2 7/7] riscv: Enable watchdog for the k210

Sean Anderson
In reply to this post by Sean Anderson
This enables the necessary config options.

Signed-off-by: Sean Anderson <[hidden email]>
---

(no changes since v1)

 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
--
2.28.0

Reply | Threaded
Open this post in threaded view
|

Re: [PATCH v2 6/7] riscv: Add watchdog bindings for the k210

Rick Chen
In reply to this post by Sean Anderson
> From: U-Boot [mailto:[hidden email]] On Behalf Of Sean Anderson
> Sent: Friday, August 07, 2020 11:04 PM
> To: [hidden email]
> Cc: Heinrich Schuchardt; Marek Vasut; Simon Glass; Jagan Teki; Bin Meng; Sean Anderson
> Subject: [PATCH v2 6/7] riscv: Add watchdog bindings for the k210
>
> This adds the necessary bindings. Most of them are already there.
>
> Signed-off-by: Sean Anderson <[hidden email]>
> ---
>
> 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(-)
>

Acked-by: Rick Chen <[hidden email]>