On Thu, Jul 24, 2025 at 3:13 AM Sangwook Shin <sw617.shin@xxxxxxxxxxx> wrote: > > Fix the issue of max_timeout being calculated larger than actual value. > The calculation result of freq / (S3C2410_WTCON_PRESCALE_MAX + 1) / > S3C2410_WTCON_MAXDIV is smaller than the actual value because the remainder > is discarded during the calculation process. This leads to a larger > calculated value for max_timeout compared to the actual settable value. > A ceiling operation is applied in the calculation process to resolve this. > > Reviewed-by: Alim Akhtar <alim.akhtar@xxxxxxxxxxx> > Signed-off-by: Sangwook Shin <sw617.shin@xxxxxxxxxxx> > --- > drivers/watchdog/s3c2410_wdt.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/watchdog/s3c2410_wdt.c b/drivers/watchdog/s3c2410_wdt.c > index 95f7207e390a..31f7e1ec779e 100644 > --- a/drivers/watchdog/s3c2410_wdt.c > +++ b/drivers/watchdog/s3c2410_wdt.c > @@ -411,8 +411,8 @@ static inline unsigned int s3c2410wdt_max_timeout(struct s3c2410_wdt *wdt) > { > const unsigned long freq = s3c2410wdt_get_freq(wdt); > > - return S3C2410_WTCNT_MAXCNT / (freq / (S3C2410_WTCON_PRESCALE_MAX + 1) > - / S3C2410_WTCON_MAXDIV); > + return S3C2410_WTCNT_MAXCNT / DIV_ROUND_UP(freq, > + (S3C2410_WTCON_PRESCALE_MAX + 1) * S3C2410_WTCON_MAXDIV); > } > How about something like this instead? 8<--------------------------------------------------------------------->8 static inline unsigned int s3c2410wdt_max_timeout(unsigned long freq) { const u64 div_max = (S3C2410_WTCON_PRESCALE_MAX + 1) * S3C2410_WTCON_MAXDIV; /* 32768 */ const u64 n_max = S3C2410_WTCNT_MAXCNT * div_max; u64 t_max = n_max / freq; if (t_max > UINT_MAX) t_max = UINT_MAX; return (unsigned int)t_max; } 8<--------------------------------------------------------------------->8 This implementation's result: - is never greater than real timeout, as it loses the decimal part after integer division in t_max - much closer to the real timeout value, as it benefits from very big n_max in the numerator (this is the main trick here) - prepared for using 32-bit max counter value in your next patch, as it uses u64 type for calculations For example, at the clock frequency of 33 kHz: - real timeout is: 65074.269 sec - old function returns: 65535 sec - your function returns: 32767 sec - the suggested function returns: 65074 sec I've prepared the test program you can run on your machine to play with all implementations: [1]. Thanks! [1] https://gist.github.com/joe-skb7/c2b2290bb0b0572a4018d81fc4ba1f3e > static int s3c2410wdt_disable_wdt_reset(struct s3c2410_wdt *wdt, bool mask) > -- > 2.25.1 >