summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/pwm/core.c12
-rw-r--r--include/pwm.h2
2 files changed, 10 insertions, 4 deletions
diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
index c8016999f0..cae23c98ee 100644
--- a/drivers/pwm/core.c
+++ b/drivers/pwm/core.c
@@ -24,7 +24,6 @@ struct pwm_device {
struct pwm_chip *chip;
unsigned long flags;
#define FLAG_REQUESTED 0
-#define FLAG_ENABLED 1
struct list_head node;
struct device_d *hwdev;
struct device_d dev;
@@ -283,8 +282,10 @@ int pwm_enable(struct pwm_device *pwm)
{
pwm->p_enable = 1;
- if (!test_and_set_bit(FLAG_ENABLED, &pwm->flags))
+ if (!pwm->chip->p_enable) {
+ pwm->chip->p_enable = 1;
return pwm->chip->ops->enable(pwm->chip);
+ }
return 0;
}
@@ -297,7 +298,10 @@ void pwm_disable(struct pwm_device *pwm)
{
pwm->p_enable = 0;
- if (test_and_clear_bit(FLAG_ENABLED, &pwm->flags))
- pwm->chip->ops->disable(pwm->chip);
+ if (!pwm->chip->p_enable)
+ return;
+
+ pwm->chip->p_enable = 0;
+ pwm->chip->ops->disable(pwm->chip);
}
EXPORT_SYMBOL_GPL(pwm_disable);
diff --git a/include/pwm.h b/include/pwm.h
index ca01f5b53d..98af129974 100644
--- a/include/pwm.h
+++ b/include/pwm.h
@@ -63,6 +63,7 @@ struct pwm_ops {
* @ops: The callbacks for this PWM
* @duty_ns: The duty cycle of the PWM, in nano-seconds
* @period_ns: The period of the PWM, in nano-seconds
+ * @p_enable: whether the PWM is enabled
*/
struct pwm_chip {
int id;
@@ -70,6 +71,7 @@ struct pwm_chip {
const struct pwm_ops *ops;
int duty_ns;
int period_ns;
+ int p_enable;
};
int pwmchip_add(struct pwm_chip *chip, struct device_d *dev);