aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>2019-03-25 05:49:33 -0400
committerThierry Reding <thierry.reding@gmail.com>2019-05-09 11:09:54 -0400
commite926b12c611c2095c7976e2ed31753ad6eb5ff1a (patch)
treec0c74a6953c3949d1d5007cb4e2eb3c6dca287dd
parent738a1cfec2edb4a6c53ac34fcb29447227dd135e (diff)
pwm: Clear chip_data in pwm_put()
After a PWM is disposed by its user the per chip data becomes invalid. Clear the data in common code instead of the device drivers to get consistent behaviour. Before this patch only three of nine drivers cleaned up here. Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
-rw-r--r--drivers/pwm/core.c1
-rw-r--r--drivers/pwm/pwm-berlin.c1
-rw-r--r--drivers/pwm/pwm-pca9685.c1
-rw-r--r--drivers/pwm/pwm-samsung.c1
4 files changed, 1 insertions, 3 deletions
diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
index 8c9200a0df5e..3998ebd51db4 100644
--- a/drivers/pwm/core.c
+++ b/drivers/pwm/core.c
@@ -877,6 +877,7 @@ void pwm_put(struct pwm_device *pwm)
877 if (pwm->chip->ops->free) 877 if (pwm->chip->ops->free)
878 pwm->chip->ops->free(pwm->chip, pwm); 878 pwm->chip->ops->free(pwm->chip, pwm);
879 879
880 pwm_set_chip_data(pwm, NULL);
880 pwm->label = NULL; 881 pwm->label = NULL;
881 882
882 module_put(pwm->chip->ops->owner); 883 module_put(pwm->chip->ops->owner);
diff --git a/drivers/pwm/pwm-berlin.c b/drivers/pwm/pwm-berlin.c
index 7c8d6a168ceb..b91c477cc84b 100644
--- a/drivers/pwm/pwm-berlin.c
+++ b/drivers/pwm/pwm-berlin.c
@@ -84,7 +84,6 @@ static void berlin_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm)
84{ 84{
85 struct berlin_pwm_channel *channel = pwm_get_chip_data(pwm); 85 struct berlin_pwm_channel *channel = pwm_get_chip_data(pwm);
86 86
87 pwm_set_chip_data(pwm, NULL);
88 kfree(channel); 87 kfree(channel);
89} 88}
90 89
diff --git a/drivers/pwm/pwm-pca9685.c b/drivers/pwm/pwm-pca9685.c
index a7eaf962a95b..567f5e2771c4 100644
--- a/drivers/pwm/pwm-pca9685.c
+++ b/drivers/pwm/pwm-pca9685.c
@@ -176,7 +176,6 @@ static void pca9685_pwm_gpio_free(struct gpio_chip *gpio, unsigned int offset)
176 pm_runtime_put(pca->chip.dev); 176 pm_runtime_put(pca->chip.dev);
177 mutex_lock(&pca->lock); 177 mutex_lock(&pca->lock);
178 pwm = &pca->chip.pwms[offset]; 178 pwm = &pca->chip.pwms[offset];
179 pwm_set_chip_data(pwm, NULL);
180 mutex_unlock(&pca->lock); 179 mutex_unlock(&pca->lock);
181} 180}
182 181
diff --git a/drivers/pwm/pwm-samsung.c b/drivers/pwm/pwm-samsung.c
index 062f2cfc45ec..3762432dd6a7 100644
--- a/drivers/pwm/pwm-samsung.c
+++ b/drivers/pwm/pwm-samsung.c
@@ -238,7 +238,6 @@ static int pwm_samsung_request(struct pwm_chip *chip, struct pwm_device *pwm)
238static void pwm_samsung_free(struct pwm_chip *chip, struct pwm_device *pwm) 238static void pwm_samsung_free(struct pwm_chip *chip, struct pwm_device *pwm)
239{ 239{
240 devm_kfree(chip->dev, pwm_get_chip_data(pwm)); 240 devm_kfree(chip->dev, pwm_get_chip_data(pwm));
241 pwm_set_chip_data(pwm, NULL);
242} 241}
243 242
244static int pwm_samsung_enable(struct pwm_chip *chip, struct pwm_device *pwm) 243static int pwm_samsung_enable(struct pwm_chip *chip, struct pwm_device *pwm)