summaryrefslogtreecommitdiffstats
path: root/drivers/watchdog
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/watchdog')
-rw-r--r--drivers/watchdog/watchdog_core.c1
-rw-r--r--drivers/watchdog/watchdog_dev.c21
2 files changed, 22 insertions, 0 deletions
diff --git a/drivers/watchdog/watchdog_core.c b/drivers/watchdog/watchdog_core.c
index 86a57673abf9..6aa46a90ff02 100644
--- a/drivers/watchdog/watchdog_core.c
+++ b/drivers/watchdog/watchdog_core.c
@@ -79,6 +79,7 @@ int watchdog_register_device(struct watchdog_device *wdd)
* corrupted in a later stage then we expect a kernel panic!
*/
+ mutex_init(&wdd->lock);
id = ida_simple_get(&watchdog_ida, 0, MAX_DOGS, GFP_KERNEL);
if (id < 0)
return id;
diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c
index 76d2572fed25..4d295d229a07 100644
--- a/drivers/watchdog/watchdog_dev.c
+++ b/drivers/watchdog/watchdog_dev.c
@@ -63,6 +63,8 @@ static int watchdog_ping(struct watchdog_device *wddev)
{
int err = 0;
+ mutex_lock(&wddev->lock);
+
if (!watchdog_active(wddev))
goto out_ping;
@@ -72,6 +74,7 @@ static int watchdog_ping(struct watchdog_device *wddev)
err = wddev->ops->start(wddev); /* restart watchdog */
out_ping:
+ mutex_unlock(&wddev->lock);
return err;
}
@@ -88,6 +91,8 @@ static int watchdog_start(struct watchdog_device *wddev)
{
int err = 0;
+ mutex_lock(&wddev->lock);
+
if (watchdog_active(wddev))
goto out_start;
@@ -96,6 +101,7 @@ static int watchdog_start(struct watchdog_device *wddev)
set_bit(WDOG_ACTIVE, &wddev->status);
out_start:
+ mutex_unlock(&wddev->lock);
return err;
}
@@ -113,6 +119,8 @@ static int watchdog_stop(struct watchdog_device *wddev)
{
int err = 0;
+ mutex_lock(&wddev->lock);
+
if (!watchdog_active(wddev))
goto out_stop;
@@ -127,6 +135,7 @@ static int watchdog_stop(struct watchdog_device *wddev)
clear_bit(WDOG_ACTIVE, &wddev->status);
out_stop:
+ mutex_unlock(&wddev->lock);
return err;
}
@@ -147,8 +156,11 @@ static int watchdog_get_status(struct watchdog_device *wddev,
if (!wddev->ops->status)
return -EOPNOTSUPP;
+ mutex_lock(&wddev->lock);
+
*status = wddev->ops->status(wddev);
+ mutex_unlock(&wddev->lock);
return err;
}
@@ -171,8 +183,11 @@ static int watchdog_set_timeout(struct watchdog_device *wddev,
(timeout < wddev->min_timeout || timeout > wddev->max_timeout))
return -EINVAL;
+ mutex_lock(&wddev->lock);
+
err = wddev->ops->set_timeout(wddev, timeout);
+ mutex_unlock(&wddev->lock);
return err;
}
@@ -193,8 +208,11 @@ static int watchdog_get_timeleft(struct watchdog_device *wddev,
if (!wddev->ops->get_timeleft)
return -EOPNOTSUPP;
+ mutex_lock(&wddev->lock);
+
*timeleft = wddev->ops->get_timeleft(wddev);
+ mutex_unlock(&wddev->lock);
return err;
}
@@ -213,8 +231,11 @@ static int watchdog_ioctl_op(struct watchdog_device *wddev, unsigned int cmd,
if (!wddev->ops->ioctl)
return -ENOIOCTLCMD;
+ mutex_lock(&wddev->lock);
+
err = wddev->ops->ioctl(wddev, cmd, arg);
+ mutex_unlock(&wddev->lock);
return err;
}