aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pwm/core.c
diff options
context:
space:
mode:
authorBoris BREZILLON <boris.brezillon@free-electrons.com>2016-03-30 22:03:27 +0200
committerThierry Reding <thierry.reding@gmail.com>2016-05-17 14:44:59 +0200
commit459a25afe97cb3d7f978b90c881f4d7aac8fb755 (patch)
tree233902a29b5d0f418de168ffe531149b997cbcf4 /drivers/pwm/core.c
parentbacklight: lm3630a_bl: Stop messing with the pwm->period field (diff)
downloadlinux-dev-459a25afe97cb3d7f978b90c881f4d7aac8fb755.tar.xz
linux-dev-459a25afe97cb3d7f978b90c881f4d7aac8fb755.zip
pwm: Get rid of pwm->lock
PWM devices are not protected against concurrent accesses. The lock in struct pwm_device might let PWM users think it is, but it's actually only protecting the enabled state. Removing this lock should be fine as long as all PWM users are aware that accesses to the PWM device have to be serialized, which seems to be the case for all of them except the sysfs interface. Patch the sysfs code by adding a lock to the pwm_export struct and making sure it's taken for all relevant accesses to the exported PWM device. Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
Diffstat (limited to 'drivers/pwm/core.c')
-rw-r--r--drivers/pwm/core.c19
1 files changed, 4 insertions, 15 deletions
diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
index 22cf3959041c..cb762cf51332 100644
--- a/drivers/pwm/core.c
+++ b/drivers/pwm/core.c
@@ -269,7 +269,6 @@ int pwmchip_add_with_polarity(struct pwm_chip *chip,
pwm->pwm = chip->base + i;
pwm->hwpwm = i;
pwm->polarity = polarity;
- mutex_init(&pwm->lock);
radix_tree_insert(&pwm_tree, pwm->pwm, pwm);
}
@@ -474,22 +473,16 @@ int pwm_set_polarity(struct pwm_device *pwm, enum pwm_polarity polarity)
if (!pwm->chip->ops->set_polarity)
return -ENOSYS;
- mutex_lock(&pwm->lock);
-
- if (pwm_is_enabled(pwm)) {
- err = -EBUSY;
- goto unlock;
- }
+ if (pwm_is_enabled(pwm))
+ return -EBUSY;
err = pwm->chip->ops->set_polarity(pwm->chip, pwm, polarity);
if (err)
- goto unlock;
+ return err;
pwm->polarity = polarity;
-unlock:
- mutex_unlock(&pwm->lock);
- return err;
+ return 0;
}
EXPORT_SYMBOL_GPL(pwm_set_polarity);
@@ -506,16 +499,12 @@ int pwm_enable(struct pwm_device *pwm)
if (!pwm)
return -EINVAL;
- mutex_lock(&pwm->lock);
-
if (!test_and_set_bit(PWMF_ENABLED, &pwm->flags)) {
err = pwm->chip->ops->enable(pwm->chip, pwm);
if (err)
clear_bit(PWMF_ENABLED, &pwm->flags);
}
- mutex_unlock(&pwm->lock);
-
return err;
}
EXPORT_SYMBOL_GPL(pwm_enable);