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>
This commit is contained in:
Wim Van Sebroeck 2012-03-22 20:42:16 +01:00
Родитель 15b25701b2
Коммит dddbc6a051
1 изменённых файлов: 10 добавлений и 6 удалений

Просмотреть файл

@ -67,7 +67,7 @@
#define U300_WDOG_IFR_WILL_BARK_IRQ_FORCE_ENABLE 0x0001U #define U300_WDOG_IFR_WILL_BARK_IRQ_FORCE_ENABLE 0x0001U
/* Default timeout in seconds = 1 minute */ /* Default timeout in seconds = 1 minute */
static int margin = 60; static unsigned int margin = 60;
static resource_size_t phybase; static resource_size_t phybase;
static resource_size_t physize; static resource_size_t physize;
static int irq; static int irq;
@ -153,7 +153,7 @@ static void coh901327_disable(void)
static int coh901327_start(struct watchdog_device *wdt_dev) static int coh901327_start(struct watchdog_device *wdt_dev)
{ {
coh901327_enable(margin * 100); coh901327_enable(wdt_dev->timeout * 100);
return 0; return 0;
} }
@ -176,10 +176,10 @@ static int coh901327_ping(struct watchdog_device *wdd)
static int coh901327_settimeout(struct watchdog_device *wdt_dev, static int coh901327_settimeout(struct watchdog_device *wdt_dev,
unsigned int time) unsigned int time)
{ {
margin = time; wdt_dev->timeout = time;
clk_enable(clk); clk_enable(clk);
/* Set new timeout value */ /* Set new timeout value */
writew(margin * 100, virtbase + U300_WDOG_TR); writew(time * 100, virtbase + U300_WDOG_TR);
/* Feed the dog */ /* Feed the dog */
writew(U300_WDOG_FR_FEED_RESTART_TIMER, writew(U300_WDOG_FR_FEED_RESTART_TIMER,
virtbase + U300_WDOG_FR); virtbase + U300_WDOG_FR);
@ -250,7 +250,7 @@ static struct watchdog_device coh901327_wdt = {
.info = &coh901327_ident, .info = &coh901327_ident,
.ops = &coh901327_ops, .ops = &coh901327_ops,
/* /*
* Max margin is 327 since the 10ms * Max timeout is 327 since the 10ms
* timeout register is max * timeout register is max
* 0x7FFF = 327670ms ~= 327s. * 0x7FFF = 327670ms ~= 327s.
*/ */
@ -353,6 +353,10 @@ static int __init coh901327_probe(struct platform_device *pdev)
clk_disable(clk); clk_disable(clk);
if (margin < 1 || margin > 327)
margin = 60;
coh901327_wdt.timeout = margin;
ret = watchdog_register_device(&coh901327_wdt); ret = watchdog_register_device(&coh901327_wdt);
if (ret == 0) if (ret == 0)
dev_info(&pdev->dev, dev_info(&pdev->dev,
@ -461,7 +465,7 @@ module_exit(coh901327_exit);
MODULE_AUTHOR("Linus Walleij <linus.walleij@stericsson.com>"); MODULE_AUTHOR("Linus Walleij <linus.walleij@stericsson.com>");
MODULE_DESCRIPTION("COH 901 327 Watchdog"); MODULE_DESCRIPTION("COH 901 327 Watchdog");
module_param(margin, int, 0); module_param(margin, uint, 0);
MODULE_PARM_DESC(margin, "Watchdog margin in seconds (default 60s)"); MODULE_PARM_DESC(margin, "Watchdog margin in seconds (default 60s)");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");