linux-watchdog.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/4] watchdog: cadence_wdt: Support all available prescaler values
@ 2019-07-05 11:46 Melin Tomas
  2019-07-05 11:46 ` [PATCH v2 1/4] watchdog: cadence_wdt: Move clock detection eariler in probe Melin Tomas
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Melin Tomas @ 2019-07-05 11:46 UTC (permalink / raw)
  To: wim, linux; +Cc: linux-watchdog, Melin Tomas

Cadence watchdog HW supports prescaler values of 8, 64, 512 and 4096,
currently only 512 and 4096 are used by driver.

This series adds support to select prescaler values of 8 and 64 for
lower input clock frequencies.

Changes v2:

- Add calculation of actual min/max timeout values
- Validate input clock frequencies to not allow
  frequencies that would result in timeout granularity
  of > 1 second.

Tomas Melin (4):
  watchdog: cadence_wdt: Move clock detection eariler in probe
  watchdog: cadence_wdt: Calculate actual timeout limits
  watchdog: cadence_wdt: Group struct member init statements
  watchdog: cadence_wdt: Support all available prescaler values

 drivers/watchdog/cadence_wdt.c | 65 ++++++++++++++++++++--------------
 1 file changed, 38 insertions(+), 27 deletions(-)

-- 
2.17.2


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v2 1/4] watchdog: cadence_wdt: Move clock detection eariler in probe
  2019-07-05 11:46 [PATCH v2 0/4] watchdog: cadence_wdt: Support all available prescaler values Melin Tomas
@ 2019-07-05 11:46 ` Melin Tomas
  2019-07-08 18:03   ` Guenter Roeck
  2019-07-05 11:46 ` [PATCH v2 2/4] watchdog: cadence_wdt: Calculate actual timeout limits Melin Tomas
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 9+ messages in thread
From: Melin Tomas @ 2019-07-05 11:46 UTC (permalink / raw)
  To: wim, linux; +Cc: linux-watchdog, Melin Tomas

Timeout calculation needs clock frequency, so init clock and calculate
prescaler value eariler in the probe.

Preparational step for calculating maximum and minimum timeout values
for driver.

Signed-off-by: Tomas Melin <tomas.melin@vaisala.com>
---
 drivers/watchdog/cadence_wdt.c | 32 ++++++++++++++++----------------
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/drivers/watchdog/cadence_wdt.c b/drivers/watchdog/cadence_wdt.c
index c3924356d173..415bd6dd1edb 100644
--- a/drivers/watchdog/cadence_wdt.c
+++ b/drivers/watchdog/cadence_wdt.c
@@ -295,6 +295,22 @@ static int cdns_wdt_probe(struct platform_device *pdev)
 	if (!wdt)
 		return -ENOMEM;
 
+	wdt->clk = devm_clk_get(&pdev->dev, NULL);
+	if (IS_ERR(wdt->clk)) {
+		dev_err(&pdev->dev, "input clock not found\n");
+		ret = PTR_ERR(wdt->clk);
+		return ret;
+	}
+
+	clock_f = clk_get_rate(wdt->clk);
+	if (clock_f <= CDNS_WDT_CLK_75MHZ) {
+		wdt->prescaler = CDNS_WDT_PRESCALE_512;
+		wdt->ctrl_clksel = CDNS_WDT_PRESCALE_SELECT_512;
+	} else {
+		wdt->prescaler = CDNS_WDT_PRESCALE_4096;
+		wdt->ctrl_clksel = CDNS_WDT_PRESCALE_SELECT_4096;
+	}
+
 	cdns_wdt_device = &wdt->cdns_wdt_device;
 	cdns_wdt_device->info = &cdns_wdt_info;
 	cdns_wdt_device->ops = &cdns_wdt_ops;
@@ -334,28 +350,12 @@ static int cdns_wdt_probe(struct platform_device *pdev)
 	watchdog_stop_on_reboot(cdns_wdt_device);
 	watchdog_set_drvdata(cdns_wdt_device, wdt);
 
-	wdt->clk = devm_clk_get(&pdev->dev, NULL);
-	if (IS_ERR(wdt->clk)) {
-		dev_err(&pdev->dev, "input clock not found\n");
-		ret = PTR_ERR(wdt->clk);
-		return ret;
-	}
-
 	ret = clk_prepare_enable(wdt->clk);
 	if (ret) {
 		dev_err(&pdev->dev, "unable to enable clock\n");
 		return ret;
 	}
 
-	clock_f = clk_get_rate(wdt->clk);
-	if (clock_f <= CDNS_WDT_CLK_75MHZ) {
-		wdt->prescaler = CDNS_WDT_PRESCALE_512;
-		wdt->ctrl_clksel = CDNS_WDT_PRESCALE_SELECT_512;
-	} else {
-		wdt->prescaler = CDNS_WDT_PRESCALE_4096;
-		wdt->ctrl_clksel = CDNS_WDT_PRESCALE_SELECT_4096;
-	}
-
 	spin_lock_init(&wdt->io_lock);
 
 	ret = watchdog_register_device(cdns_wdt_device);
-- 
2.17.2


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v2 2/4] watchdog: cadence_wdt: Calculate actual timeout limits
  2019-07-05 11:46 [PATCH v2 0/4] watchdog: cadence_wdt: Support all available prescaler values Melin Tomas
  2019-07-05 11:46 ` [PATCH v2 1/4] watchdog: cadence_wdt: Move clock detection eariler in probe Melin Tomas
@ 2019-07-05 11:46 ` Melin Tomas
  2019-07-08 18:06   ` Guenter Roeck
  2019-07-05 11:46 ` [PATCH v2 3/4] watchdog: cadence_wdt: Group struct member init statements Melin Tomas
  2019-07-05 11:46 ` [PATCH v2 4/4] watchdog: cadence_wdt: Support all available prescaler values Melin Tomas
  3 siblings, 1 reply; 9+ messages in thread
From: Melin Tomas @ 2019-07-05 11:46 UTC (permalink / raw)
  To: wim, linux; +Cc: linux-watchdog, Melin Tomas

Maximum and minimum timeout values depend on the actual input clock
frequency and prescaler selection.

Signed-off-by: Tomas Melin <tomas.melin@vaisala.com>
---
 drivers/watchdog/cadence_wdt.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/watchdog/cadence_wdt.c b/drivers/watchdog/cadence_wdt.c
index 415bd6dd1edb..87b767c87bb6 100644
--- a/drivers/watchdog/cadence_wdt.c
+++ b/drivers/watchdog/cadence_wdt.c
@@ -18,9 +18,6 @@
 #include <linux/watchdog.h>
 
 #define CDNS_WDT_DEFAULT_TIMEOUT	10
-/* Supports 1 - 516 sec */
-#define CDNS_WDT_MIN_TIMEOUT	1
-#define CDNS_WDT_MAX_TIMEOUT	516
 
 /* Restart key */
 #define CDNS_WDT_RESTART_KEY 0x00001999
@@ -28,6 +25,10 @@
 /* Counter register access key */
 #define CDNS_WDT_REGISTER_ACCESS_KEY 0x00920000
 
+/* Counter control register, counter restart values */
+#define CDNS_WDT_CCR_CRV_MIN 0xFFF
+#define CDNS_WDT_CCR_CRV_MAX 0xFFFFFF
+
 /* Counter value divisor */
 #define CDNS_WDT_COUNTER_VALUE_DIVISOR 0x1000
 
@@ -315,8 +316,10 @@ static int cdns_wdt_probe(struct platform_device *pdev)
 	cdns_wdt_device->info = &cdns_wdt_info;
 	cdns_wdt_device->ops = &cdns_wdt_ops;
 	cdns_wdt_device->timeout = CDNS_WDT_DEFAULT_TIMEOUT;
-	cdns_wdt_device->min_timeout = CDNS_WDT_MIN_TIMEOUT;
-	cdns_wdt_device->max_timeout = CDNS_WDT_MAX_TIMEOUT;
+	cdns_wdt_device->min_timeout =
+		CDNS_WDT_CCR_CRV_MIN * wdt->prescaler / clock_f;
+	cdns_wdt_device->max_timeout =
+		CDNS_WDT_CCR_CRV_MAX * wdt->prescaler / clock_f;
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	wdt->regs = devm_ioremap_resource(&pdev->dev, res);
-- 
2.17.2


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v2 3/4] watchdog: cadence_wdt: Group struct member init statements
  2019-07-05 11:46 [PATCH v2 0/4] watchdog: cadence_wdt: Support all available prescaler values Melin Tomas
  2019-07-05 11:46 ` [PATCH v2 1/4] watchdog: cadence_wdt: Move clock detection eariler in probe Melin Tomas
  2019-07-05 11:46 ` [PATCH v2 2/4] watchdog: cadence_wdt: Calculate actual timeout limits Melin Tomas
@ 2019-07-05 11:46 ` Melin Tomas
  2019-07-08 18:09   ` Guenter Roeck
  2019-07-05 11:46 ` [PATCH v2 4/4] watchdog: cadence_wdt: Support all available prescaler values Melin Tomas
  3 siblings, 1 reply; 9+ messages in thread
From: Melin Tomas @ 2019-07-05 11:46 UTC (permalink / raw)
  To: wim, linux; +Cc: linux-watchdog, Melin Tomas

Move init statement and remove stray comment.

Signed-off-by: Tomas Melin <tomas.melin@vaisala.com>
---
 drivers/watchdog/cadence_wdt.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/watchdog/cadence_wdt.c b/drivers/watchdog/cadence_wdt.c
index 87b767c87bb6..4657800d9d8e 100644
--- a/drivers/watchdog/cadence_wdt.c
+++ b/drivers/watchdog/cadence_wdt.c
@@ -313,6 +313,7 @@ static int cdns_wdt_probe(struct platform_device *pdev)
 	}
 	
 	cdns_wdt_device = &wdt->cdns_wdt_device;
+	cdns_wdt_device->parent = &pdev->dev;
 	cdns_wdt_device->info = &cdns_wdt_info;
 	cdns_wdt_device->ops = &cdns_wdt_ops;
 	cdns_wdt_device->timeout = CDNS_WDT_DEFAULT_TIMEOUT;
@@ -340,9 +341,6 @@ static int cdns_wdt_probe(struct platform_device *pdev)
 		}
 	}
 
-	/* Initialize the members of cdns_wdt structure */
-	cdns_wdt_device->parent = &pdev->dev;
-
 	ret = watchdog_init_timeout(cdns_wdt_device, wdt_timeout, &pdev->dev);
 	if (ret) {
 		dev_err(&pdev->dev, "unable to set timeout value\n");
-- 
2.17.2


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v2 4/4] watchdog: cadence_wdt: Support all available prescaler values
  2019-07-05 11:46 [PATCH v2 0/4] watchdog: cadence_wdt: Support all available prescaler values Melin Tomas
                   ` (2 preceding siblings ...)
  2019-07-05 11:46 ` [PATCH v2 3/4] watchdog: cadence_wdt: Group struct member init statements Melin Tomas
@ 2019-07-05 11:46 ` Melin Tomas
  2019-07-08 18:14   ` Guenter Roeck
  3 siblings, 1 reply; 9+ messages in thread
From: Melin Tomas @ 2019-07-05 11:46 UTC (permalink / raw)
  To: wim, linux; +Cc: linux-watchdog, Melin Tomas

Cadence watchdog HW supports prescaler values of
8, 64, 512 and 4096.

Add support to select prescaler values of 8 and 64 for lower
input clock frequencies.

Prescaler value is selected to keep timeout resolution of 1 second.
For clock frequencies below 32kHz, 1 second resolution does
no longer hold, thereby returning an error.

Signed-off-by: Tomas Melin <tomas.melin@vaisala.com>
---
 drivers/watchdog/cadence_wdt.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/drivers/watchdog/cadence_wdt.c b/drivers/watchdog/cadence_wdt.c
index 4657800d9d8e..39109b5721c1 100644
--- a/drivers/watchdog/cadence_wdt.c
+++ b/drivers/watchdog/cadence_wdt.c
@@ -33,16 +33,17 @@
 #define CDNS_WDT_COUNTER_VALUE_DIVISOR 0x1000
 
 /* Clock prescaler value and selection */
+#define CDNS_WDT_PRESCALE_8	8
 #define CDNS_WDT_PRESCALE_64	64
 #define CDNS_WDT_PRESCALE_512	512
 #define CDNS_WDT_PRESCALE_4096	4096
+#define CDNS_WDT_PRESCALE_SELECT_8	0
 #define CDNS_WDT_PRESCALE_SELECT_64	1
 #define CDNS_WDT_PRESCALE_SELECT_512	2
 #define CDNS_WDT_PRESCALE_SELECT_4096	3
 
-/* Input clock frequency */
-#define CDNS_WDT_CLK_10MHZ	10000000
-#define CDNS_WDT_CLK_75MHZ	75000000
+/* Base input clock frequency */
+#define CDNS_WDT_CLK_32KHZ 32768
 
 /* Counter maximum value */
 #define CDNS_WDT_COUNTER_MAX 0xFFF
@@ -304,7 +305,16 @@ static int cdns_wdt_probe(struct platform_device *pdev)
 	}
 
 	clock_f = clk_get_rate(wdt->clk);
-	if (clock_f <= CDNS_WDT_CLK_75MHZ) {
+	if (clock_f < CDNS_WDT_CLK_32KHZ) {
+		dev_err(&pdev->dev, "cannot find suitable clock prescaler\n");
+		return -ERANGE;
+	} else if (clock_f <= CDNS_WDT_CLK_32KHZ * CDNS_WDT_PRESCALE_8) {
+		wdt->prescaler = CDNS_WDT_PRESCALE_8;
+		wdt->ctrl_clksel = CDNS_WDT_PRESCALE_SELECT_8;
+	} else if (clock_f <= CDNS_WDT_CLK_32KHZ * CDNS_WDT_PRESCALE_64) {
+		wdt->prescaler = CDNS_WDT_PRESCALE_64;
+		wdt->ctrl_clksel = CDNS_WDT_PRESCALE_SELECT_64;
+	} else if (clock_f <= CDNS_WDT_CLK_32KHZ * CDNS_WDT_PRESCALE_512) {
 		wdt->prescaler = CDNS_WDT_PRESCALE_512;
 		wdt->ctrl_clksel = CDNS_WDT_PRESCALE_SELECT_512;
 	} else {
-- 
2.17.2


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 1/4] watchdog: cadence_wdt: Move clock detection eariler in probe
  2019-07-05 11:46 ` [PATCH v2 1/4] watchdog: cadence_wdt: Move clock detection eariler in probe Melin Tomas
@ 2019-07-08 18:03   ` Guenter Roeck
  0 siblings, 0 replies; 9+ messages in thread
From: Guenter Roeck @ 2019-07-08 18:03 UTC (permalink / raw)
  To: Melin Tomas; +Cc: wim, linux-watchdog

On Fri, Jul 05, 2019 at 11:46:02AM +0000, Melin Tomas wrote:
> Timeout calculation needs clock frequency, so init clock and calculate
> prescaler value eariler in the probe.
> 
earlier; also in subject line

> Preparational step for calculating maximum and minimum timeout values
> for driver.
> 
> Signed-off-by: Tomas Melin <tomas.melin@vaisala.com>
> ---
>  drivers/watchdog/cadence_wdt.c | 32 ++++++++++++++++----------------
>  1 file changed, 16 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/watchdog/cadence_wdt.c b/drivers/watchdog/cadence_wdt.c
> index c3924356d173..415bd6dd1edb 100644
> --- a/drivers/watchdog/cadence_wdt.c
> +++ b/drivers/watchdog/cadence_wdt.c
> @@ -295,6 +295,22 @@ static int cdns_wdt_probe(struct platform_device *pdev)
>  	if (!wdt)
>  		return -ENOMEM;
>  
> +	wdt->clk = devm_clk_get(&pdev->dev, NULL);
> +	if (IS_ERR(wdt->clk)) {
> +		dev_err(&pdev->dev, "input clock not found\n");
> +		ret = PTR_ERR(wdt->clk);
> +		return ret;

		return PTR_ERR(wdt->clk);

[ ok, that is from the old code ... ]

> +	}
> +
> +	clock_f = clk_get_rate(wdt->clk);
> +	if (clock_f <= CDNS_WDT_CLK_75MHZ) {
> +		wdt->prescaler = CDNS_WDT_PRESCALE_512;
> +		wdt->ctrl_clksel = CDNS_WDT_PRESCALE_SELECT_512;
> +	} else {
> +		wdt->prescaler = CDNS_WDT_PRESCALE_4096;
> +		wdt->ctrl_clksel = CDNS_WDT_PRESCALE_SELECT_4096;
> +	}
> +
>  	cdns_wdt_device = &wdt->cdns_wdt_device;
>  	cdns_wdt_device->info = &cdns_wdt_info;
>  	cdns_wdt_device->ops = &cdns_wdt_ops;
> @@ -334,28 +350,12 @@ static int cdns_wdt_probe(struct platform_device *pdev)
>  	watchdog_stop_on_reboot(cdns_wdt_device);
>  	watchdog_set_drvdata(cdns_wdt_device, wdt);
>  
> -	wdt->clk = devm_clk_get(&pdev->dev, NULL);
> -	if (IS_ERR(wdt->clk)) {
> -		dev_err(&pdev->dev, "input clock not found\n");
> -		ret = PTR_ERR(wdt->clk);
> -		return ret;
> -	}
> -
>  	ret = clk_prepare_enable(wdt->clk);
>  	if (ret) {
>  		dev_err(&pdev->dev, "unable to enable clock\n");
>  		return ret;
>  	}
>  
The substantial difference here is that clk_prepare_enable() was called
before the actual clock rate was retrieved. I don't know if that makes
a substantial difference, but on the other side I don't see why the above
code isn't moved as well. What I _do_ see, however, is that this patch
isn't based on the latest mainline kenrel, since mainline has a call to
devm_add_action_or_reset() after clk_prepare_enable(). Please rebase.

> -	clock_f = clk_get_rate(wdt->clk);
> -	if (clock_f <= CDNS_WDT_CLK_75MHZ) {
> -		wdt->prescaler = CDNS_WDT_PRESCALE_512;
> -		wdt->ctrl_clksel = CDNS_WDT_PRESCALE_SELECT_512;
> -	} else {
> -		wdt->prescaler = CDNS_WDT_PRESCALE_4096;
> -		wdt->ctrl_clksel = CDNS_WDT_PRESCALE_SELECT_4096;
> -	}
> -
>  	spin_lock_init(&wdt->io_lock);
>  
>  	ret = watchdog_register_device(cdns_wdt_device);

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 2/4] watchdog: cadence_wdt: Calculate actual timeout limits
  2019-07-05 11:46 ` [PATCH v2 2/4] watchdog: cadence_wdt: Calculate actual timeout limits Melin Tomas
@ 2019-07-08 18:06   ` Guenter Roeck
  0 siblings, 0 replies; 9+ messages in thread
From: Guenter Roeck @ 2019-07-08 18:06 UTC (permalink / raw)
  To: Melin Tomas; +Cc: wim, linux-watchdog

On Fri, Jul 05, 2019 at 11:46:02AM +0000, Melin Tomas wrote:
> Maximum and minimum timeout values depend on the actual input clock
> frequency and prescaler selection.
> 
> Signed-off-by: Tomas Melin <tomas.melin@vaisala.com>
> ---
>  drivers/watchdog/cadence_wdt.c | 13 ++++++++-----
>  1 file changed, 8 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/watchdog/cadence_wdt.c b/drivers/watchdog/cadence_wdt.c
> index 415bd6dd1edb..87b767c87bb6 100644
> --- a/drivers/watchdog/cadence_wdt.c
> +++ b/drivers/watchdog/cadence_wdt.c
> @@ -18,9 +18,6 @@
>  #include <linux/watchdog.h>
>  
>  #define CDNS_WDT_DEFAULT_TIMEOUT	10
> -/* Supports 1 - 516 sec */
> -#define CDNS_WDT_MIN_TIMEOUT	1
> -#define CDNS_WDT_MAX_TIMEOUT	516
>  
>  /* Restart key */
>  #define CDNS_WDT_RESTART_KEY 0x00001999
> @@ -28,6 +25,10 @@
>  /* Counter register access key */
>  #define CDNS_WDT_REGISTER_ACCESS_KEY 0x00920000
>  
> +/* Counter control register, counter restart values */
> +#define CDNS_WDT_CCR_CRV_MIN 0xFFF
> +#define CDNS_WDT_CCR_CRV_MAX 0xFFFFFF
> +
>  /* Counter value divisor */
>  #define CDNS_WDT_COUNTER_VALUE_DIVISOR 0x1000
>  
> @@ -315,8 +316,10 @@ static int cdns_wdt_probe(struct platform_device *pdev)
>  	cdns_wdt_device->info = &cdns_wdt_info;
>  	cdns_wdt_device->ops = &cdns_wdt_ops;
>  	cdns_wdt_device->timeout = CDNS_WDT_DEFAULT_TIMEOUT;
> -	cdns_wdt_device->min_timeout = CDNS_WDT_MIN_TIMEOUT;
> -	cdns_wdt_device->max_timeout = CDNS_WDT_MAX_TIMEOUT;
> +	cdns_wdt_device->min_timeout =
> +		CDNS_WDT_CCR_CRV_MIN * wdt->prescaler / clock_f;
> +	cdns_wdt_device->max_timeout =
> +		CDNS_WDT_CCR_CRV_MAX * wdt->prescaler / clock_f;

clock_f can at least in theory be 0. So far that didn't matter as
much, but now it would crash the kernel. Please add a respective
check into the code.

>  
>  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>  	wdt->regs = devm_ioremap_resource(&pdev->dev, res);

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 3/4] watchdog: cadence_wdt: Group struct member init statements
  2019-07-05 11:46 ` [PATCH v2 3/4] watchdog: cadence_wdt: Group struct member init statements Melin Tomas
@ 2019-07-08 18:09   ` Guenter Roeck
  0 siblings, 0 replies; 9+ messages in thread
From: Guenter Roeck @ 2019-07-08 18:09 UTC (permalink / raw)
  To: Melin Tomas; +Cc: wim, linux-watchdog

On Fri, Jul 05, 2019 at 11:46:03AM +0000, Melin Tomas wrote:
> Move init statement and remove stray comment.
> 
> Signed-off-by: Tomas Melin <tomas.melin@vaisala.com>
> ---
>  drivers/watchdog/cadence_wdt.c | 4 +---
>  1 file changed, 1 insertion(+), 3 deletions(-)
> 
> diff --git a/drivers/watchdog/cadence_wdt.c b/drivers/watchdog/cadence_wdt.c
> index 87b767c87bb6..4657800d9d8e 100644
> --- a/drivers/watchdog/cadence_wdt.c
> +++ b/drivers/watchdog/cadence_wdt.c
> @@ -313,6 +313,7 @@ static int cdns_wdt_probe(struct platform_device *pdev)
>  	}
>  	
>  	cdns_wdt_device = &wdt->cdns_wdt_device;
> +	cdns_wdt_device->parent = &pdev->dev;

In the upstream kernel, we have
	struct device *dev = &pdev->dev;
and
	cdns_wdt_device->parent = dev;

so this patch no longer applies.

>  	cdns_wdt_device->info = &cdns_wdt_info;
>  	cdns_wdt_device->ops = &cdns_wdt_ops;
>  	cdns_wdt_device->timeout = CDNS_WDT_DEFAULT_TIMEOUT;
> @@ -340,9 +341,6 @@ static int cdns_wdt_probe(struct platform_device *pdev)
>  		}
>  	}
>  
> -	/* Initialize the members of cdns_wdt structure */
> -	cdns_wdt_device->parent = &pdev->dev;
> -
>  	ret = watchdog_init_timeout(cdns_wdt_device, wdt_timeout, &pdev->dev);
>  	if (ret) {
>  		dev_err(&pdev->dev, "unable to set timeout value\n");

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 4/4] watchdog: cadence_wdt: Support all available prescaler values
  2019-07-05 11:46 ` [PATCH v2 4/4] watchdog: cadence_wdt: Support all available prescaler values Melin Tomas
@ 2019-07-08 18:14   ` Guenter Roeck
  0 siblings, 0 replies; 9+ messages in thread
From: Guenter Roeck @ 2019-07-08 18:14 UTC (permalink / raw)
  To: Melin Tomas; +Cc: wim, linux-watchdog

On Fri, Jul 05, 2019 at 11:46:04AM +0000, Melin Tomas wrote:
> Cadence watchdog HW supports prescaler values of
> 8, 64, 512 and 4096.
> 
> Add support to select prescaler values of 8 and 64 for lower
> input clock frequencies.
> 
> Prescaler value is selected to keep timeout resolution of 1 second.
> For clock frequencies below 32kHz, 1 second resolution does
> no longer hold, thereby returning an error.
> 
> Signed-off-by: Tomas Melin <tomas.melin@vaisala.com>
> ---
>  drivers/watchdog/cadence_wdt.c | 18 ++++++++++++++----
>  1 file changed, 14 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/watchdog/cadence_wdt.c b/drivers/watchdog/cadence_wdt.c
> index 4657800d9d8e..39109b5721c1 100644
> --- a/drivers/watchdog/cadence_wdt.c
> +++ b/drivers/watchdog/cadence_wdt.c
> @@ -33,16 +33,17 @@
>  #define CDNS_WDT_COUNTER_VALUE_DIVISOR 0x1000
>  
>  /* Clock prescaler value and selection */
> +#define CDNS_WDT_PRESCALE_8	8
>  #define CDNS_WDT_PRESCALE_64	64
>  #define CDNS_WDT_PRESCALE_512	512
>  #define CDNS_WDT_PRESCALE_4096	4096
> +#define CDNS_WDT_PRESCALE_SELECT_8	0
>  #define CDNS_WDT_PRESCALE_SELECT_64	1
>  #define CDNS_WDT_PRESCALE_SELECT_512	2
>  #define CDNS_WDT_PRESCALE_SELECT_4096	3
>  
> -/* Input clock frequency */
> -#define CDNS_WDT_CLK_10MHZ	10000000
> -#define CDNS_WDT_CLK_75MHZ	75000000
> +/* Base input clock frequency */
> +#define CDNS_WDT_CLK_32KHZ 32768
>  
>  /* Counter maximum value */
>  #define CDNS_WDT_COUNTER_MAX 0xFFF
> @@ -304,7 +305,16 @@ static int cdns_wdt_probe(struct platform_device *pdev)
>  	}
>  
>  	clock_f = clk_get_rate(wdt->clk);
> -	if (clock_f <= CDNS_WDT_CLK_75MHZ) {
> +	if (clock_f < CDNS_WDT_CLK_32KHZ) {
> +		dev_err(&pdev->dev, "cannot find suitable clock prescaler\n");
> +		return -ERANGE;

	/* Math result not representable */

is a bit misleading here. I understand there isn't a good option,
but using math errors isn't it. Just use -EINVAL if you don't have
a better idea. It might also make sense to display the returned
clock frequency.

> +	} else if (clock_f <= CDNS_WDT_CLK_32KHZ * CDNS_WDT_PRESCALE_8) {
> +		wdt->prescaler = CDNS_WDT_PRESCALE_8;
> +		wdt->ctrl_clksel = CDNS_WDT_PRESCALE_SELECT_8;
> +	} else if (clock_f <= CDNS_WDT_CLK_32KHZ * CDNS_WDT_PRESCALE_64) {
> +		wdt->prescaler = CDNS_WDT_PRESCALE_64;
> +		wdt->ctrl_clksel = CDNS_WDT_PRESCALE_SELECT_64;
> +	} else if (clock_f <= CDNS_WDT_CLK_32KHZ * CDNS_WDT_PRESCALE_512) {
>  		wdt->prescaler = CDNS_WDT_PRESCALE_512;
>  		wdt->ctrl_clksel = CDNS_WDT_PRESCALE_SELECT_512;
>  	} else {

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2019-07-08 18:14 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-07-05 11:46 [PATCH v2 0/4] watchdog: cadence_wdt: Support all available prescaler values Melin Tomas
2019-07-05 11:46 ` [PATCH v2 1/4] watchdog: cadence_wdt: Move clock detection eariler in probe Melin Tomas
2019-07-08 18:03   ` Guenter Roeck
2019-07-05 11:46 ` [PATCH v2 2/4] watchdog: cadence_wdt: Calculate actual timeout limits Melin Tomas
2019-07-08 18:06   ` Guenter Roeck
2019-07-05 11:46 ` [PATCH v2 3/4] watchdog: cadence_wdt: Group struct member init statements Melin Tomas
2019-07-08 18:09   ` Guenter Roeck
2019-07-05 11:46 ` [PATCH v2 4/4] watchdog: cadence_wdt: Support all available prescaler values Melin Tomas
2019-07-08 18:14   ` Guenter Roeck

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).