On 7/10/19 11:39 PM, Guenter Roeck wrote: > On Wed, Jul 10, 2019 at 07:20:59PM +0000, Melin Tomas wrote: >> On 7/10/19 12:07 AM, Guenter Roeck wrote: >>> Ah, we are talking about the _smallest_ timeout and about resolution. >>> But that is no reason to declare the clock invalid. Just set the minimum >>> to the actual minimum. There is no reason to reject slow clocks entirely, >>> even if the granularity is in the multi-second range. The only caveat, >>> if granularity is more than one second, is that the set_timeout function >>> must select and report the actual timeout. >> I did consider supporting slower clocks but thought that the required >> >> additional logic was perhaps not worth it. So instead just declared >> >> those clock frequencies invalid. >> > Hmm ... not sure I understand. What makes it so difficult ? Not necessarily difficult, just additional logic for the set_timeout caveat. Thanks, Tomas > > Guenter > >> However, if that logic is required, sure I can try to implement it. >> >> It might take some weeks before I have time to look at it properly. >> >> >> Thanks, >> >> Tomas >> >>> Thanks, >>> Guenter >>> >>>> Thanks, >>>> >>>> Tomas >>>> >>>>>> Signed-off-by: Tomas Melin <tomas.melin@xxxxxxxxxxx> >>>>>> --- >>>>>> drivers/watchdog/cadence_wdt.c | 21 +++++++++++++++------ >>>>>> 1 file changed, 15 insertions(+), 6 deletions(-) >>>>>> >>>>>> diff --git a/drivers/watchdog/cadence_wdt.c b/drivers/watchdog/cadence_wdt.c >>>>>> index 0bdb275d904a..037faf557f9d 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 >>>>> ^ Please use a tab here >>>>> >>>>>> >>>>>> /* Counter maximum value */ >>>>>> #define CDNS_WDT_COUNTER_MAX 0xFFF >>>>>> @@ -318,10 +319,18 @@ static int cdns_wdt_probe(struct platform_device *pdev) >>>>>> return ret; >>>>>> >>>>>> clock_f = clk_get_rate(wdt->clk); >>>>>> - if (clock_f == 0) { >>>>>> - dev_err(dev, "invalid clock frequency, (f=%lu)\n", clock_f); >>>>>> + if (clock_f < CDNS_WDT_CLK_32KHZ) { >>>>>> + dev_err(dev, >>>>>> + "cannot find suitable clock prescaler, (f=%lu)\n", >>>>>> + clock_f); >>>>>> return -EINVAL; >>>>>> - } else if (clock_f <= CDNS_WDT_CLK_75MHZ) { >>>>>> + } 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 >>>>>>