pwm: Clear chip_data in pwm_put()
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Mon, 25 Mar 2019 09:49:33 +0000 (10:49 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 5 Dec 2019 14:38:12 +0000 (15:38 +0100)
commit e926b12c611c2095c7976e2ed31753ad6eb5ff1a upstream.

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>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/pwm/core.c
drivers/pwm/pwm-berlin.c
drivers/pwm/pwm-pca9685.c
drivers/pwm/pwm-samsung.c

index c45e5719ba172c09e45b7a8f75bf517ed023134d..b1b74cfb157162357b0c59d4f9bc1dfd820cc91d 100644 (file)
@@ -874,6 +874,7 @@ void pwm_put(struct pwm_device *pwm)
        if (pwm->chip->ops->free)
                pwm->chip->ops->free(pwm->chip, pwm);
 
+       pwm_set_chip_data(pwm, NULL);
        pwm->label = NULL;
 
        module_put(pwm->chip->ops->owner);
index 771859aca4be2b104e53f57f1271e8a2c7a9677d..7bb819e3c0c1ac01f1a4c305abb309a09c13fae1 100644 (file)
@@ -78,7 +78,6 @@ static void berlin_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm)
 {
        struct berlin_pwm_channel *channel = pwm_get_chip_data(pwm);
 
-       pwm_set_chip_data(pwm, NULL);
        kfree(channel);
 }
 
index a7eaf962a95b15725e43426edca3bd0f4d28acf6..567f5e2771c47288488063f49363fd3e0b4eaab7 100644 (file)
@@ -176,7 +176,6 @@ static void pca9685_pwm_gpio_free(struct gpio_chip *gpio, unsigned int offset)
        pm_runtime_put(pca->chip.dev);
        mutex_lock(&pca->lock);
        pwm = &pca->chip.pwms[offset];
-       pwm_set_chip_data(pwm, NULL);
        mutex_unlock(&pca->lock);
 }
 
index 062f2cfc45ec69545d3150c212d346597d76335e..3762432dd6a7fe7c245d6d4b843a942e92a6af4b 100644 (file)
@@ -238,7 +238,6 @@ static int pwm_samsung_request(struct pwm_chip *chip, struct pwm_device *pwm)
 static void pwm_samsung_free(struct pwm_chip *chip, struct pwm_device *pwm)
 {
        devm_kfree(chip->dev, pwm_get_chip_data(pwm));
-       pwm_set_chip_data(pwm, NULL);
 }
 
 static int pwm_samsung_enable(struct pwm_chip *chip, struct pwm_device *pwm)