* [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
* 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
* [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
* 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
* [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
* 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
* [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 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