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