Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

watchdog: coh901327_wdt.c: fix timeout

Set the timeout value properly so that we don't get faulty values
for the WDIOC_GETTIMEOUT iotcl. 'margin' should be an unsigned int.
Also add a check to see if margin is a valid parameter after it is
loaded as a module.

Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Acked-by: Wolfram Sang <w.sang@pengutronix.de>

+10 -6
+10 -6
drivers/watchdog/coh901327_wdt.c
··· 67 67 #define U300_WDOG_IFR_WILL_BARK_IRQ_FORCE_ENABLE 0x0001U 68 68 69 69 /* Default timeout in seconds = 1 minute */ 70 - static int margin = 60; 70 + static unsigned int margin = 60; 71 71 static resource_size_t phybase; 72 72 static resource_size_t physize; 73 73 static int irq; ··· 153 153 154 154 static int coh901327_start(struct watchdog_device *wdt_dev) 155 155 { 156 - coh901327_enable(margin * 100); 156 + coh901327_enable(wdt_dev->timeout * 100); 157 157 return 0; 158 158 } 159 159 ··· 176 176 static int coh901327_settimeout(struct watchdog_device *wdt_dev, 177 177 unsigned int time) 178 178 { 179 - margin = time; 179 + wdt_dev->timeout = time; 180 180 clk_enable(clk); 181 181 /* Set new timeout value */ 182 - writew(margin * 100, virtbase + U300_WDOG_TR); 182 + writew(time * 100, virtbase + U300_WDOG_TR); 183 183 /* Feed the dog */ 184 184 writew(U300_WDOG_FR_FEED_RESTART_TIMER, 185 185 virtbase + U300_WDOG_FR); ··· 250 250 .info = &coh901327_ident, 251 251 .ops = &coh901327_ops, 252 252 /* 253 - * Max margin is 327 since the 10ms 253 + * Max timeout is 327 since the 10ms 254 254 * timeout register is max 255 255 * 0x7FFF = 327670ms ~= 327s. 256 256 */ ··· 352 352 } 353 353 354 354 clk_disable(clk); 355 + 356 + if (margin < 1 || margin > 327) 357 + margin = 60; 358 + coh901327_wdt.timeout = margin; 355 359 356 360 ret = watchdog_register_device(&coh901327_wdt); 357 361 if (ret == 0) ··· 465 461 MODULE_AUTHOR("Linus Walleij <linus.walleij@stericsson.com>"); 466 462 MODULE_DESCRIPTION("COH 901 327 Watchdog"); 467 463 468 - module_param(margin, int, 0); 464 + module_param(margin, uint, 0); 469 465 MODULE_PARM_DESC(margin, "Watchdog margin in seconds (default 60s)"); 470 466 471 467 MODULE_LICENSE("GPL");