summaryrefslogtreecommitdiff
path: root/drivers/watchdog/ts72xx_wdt.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/watchdog/ts72xx_wdt.c')
-rw-r--r--drivers/watchdog/ts72xx_wdt.c38
1 files changed, 21 insertions, 17 deletions
diff --git a/drivers/watchdog/ts72xx_wdt.c b/drivers/watchdog/ts72xx_wdt.c
index 09d4831..c9b0c62 100644
--- a/drivers/watchdog/ts72xx_wdt.c
+++ b/drivers/watchdog/ts72xx_wdt.c
@@ -192,7 +192,7 @@ static int ts72xx_wdt_open(struct inode *inode, struct file *file)
dev_err(&wdt->pdev->dev,
"failed to convert timeout (%d) to register value\n",
timeout);
- return regval;
+ return -EINVAL;
}
if (mutex_lock_interruptible(&wdt->lock))
@@ -305,8 +305,7 @@ static long ts72xx_wdt_ioctl(struct file *file, unsigned int cmd,
switch (cmd) {
case WDIOC_GETSUPPORT:
- if (copy_to_user(argp, &winfo, sizeof(winfo)))
- error = -EFAULT;
+ error = copy_to_user(argp, &winfo, sizeof(winfo));
break;
case WDIOC_GETSTATUS:
@@ -321,9 +320,10 @@ static long ts72xx_wdt_ioctl(struct file *file, unsigned int cmd,
case WDIOC_SETOPTIONS: {
int options;
- error = get_user(options, p);
- if (error)
+ if (get_user(options, p)) {
+ error = -EFAULT;
break;
+ }
error = -EINVAL;
@@ -341,26 +341,30 @@ static long ts72xx_wdt_ioctl(struct file *file, unsigned int cmd,
case WDIOC_SETTIMEOUT: {
int new_timeout;
- int regval;
- error = get_user(new_timeout, p);
+ if (get_user(new_timeout, p)) {
+ error = -EFAULT;
+ } else {
+ int regval;
+
+ regval = timeout_to_regval(new_timeout);
+ if (regval < 0) {
+ error = -EINVAL;
+ } else {
+ ts72xx_wdt_stop(wdt);
+ wdt->regval = regval;
+ ts72xx_wdt_start(wdt);
+ }
+ }
if (error)
break;
- regval = timeout_to_regval(new_timeout);
- if (regval < 0) {
- error = regval;
- break;
- }
- ts72xx_wdt_stop(wdt);
- wdt->regval = regval;
- ts72xx_wdt_start(wdt);
-
/*FALLTHROUGH*/
}
case WDIOC_GETTIMEOUT:
- error = put_user(regval_to_timeout(wdt->regval), p);
+ if (put_user(regval_to_timeout(wdt->regval), p))
+ error = -EFAULT;
break;
default: