Message ID | 3a67fffe50fe267b612d5557bb6b790ff1a792ca.1701860672.git.u.kleine-koenig@pengutronix.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | pwm: Fix lifetime issues for pwm_chips | expand |
On Wed, Dec 6, 2023 at 12:49 PM Uwe Kleine-König <u.kleine-koenig@pengutronix.de> wrote: > > This prepares the pwm driver of the ti-sn65dsi86 to further changes of > the pwm core outlined in the commit introducing devm_pwmchip_alloc(). > There is no intended semantical change and the driver should behave as > before. > > Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> > --- > drivers/gpu/drm/bridge/ti-sn65dsi86.c | 27 ++++++++++++++++++--------- > 1 file changed, 18 insertions(+), 9 deletions(-) > > diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi86.c b/drivers/gpu/drm/bridge/ti-sn65dsi86.c > index c45c07840f64..33eb2ed0a729 100644 > --- a/drivers/gpu/drm/bridge/ti-sn65dsi86.c > +++ b/drivers/gpu/drm/bridge/ti-sn65dsi86.c > @@ -197,7 +197,7 @@ struct ti_sn65dsi86 { > DECLARE_BITMAP(gchip_output, SN_NUM_GPIOS); > #endif > #if defined(CONFIG_PWM) > - struct pwm_chip pchip; > + struct pwm_chip *pchip; > bool pwm_enabled; > atomic_t pwm_pin_busy; > #endif > @@ -1372,7 +1372,7 @@ static void ti_sn_pwm_pin_release(struct ti_sn65dsi86 *pdata) > > static struct ti_sn65dsi86 *pwm_chip_to_ti_sn_bridge(struct pwm_chip *chip) > { > - return container_of(chip, struct ti_sn65dsi86, pchip); > + return pwmchip_get_drvdata(chip); > } > > static int ti_sn_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm) > @@ -1585,22 +1585,31 @@ static const struct pwm_ops ti_sn_pwm_ops = { > static int ti_sn_pwm_probe(struct auxiliary_device *adev, > const struct auxiliary_device_id *id) > { > + struct pwm_chip *chip; > struct ti_sn65dsi86 *pdata = dev_get_drvdata(adev->dev.parent); > > - pdata->pchip.dev = pdata->dev; > - pdata->pchip.ops = &ti_sn_pwm_ops; > - pdata->pchip.npwm = 1; > - pdata->pchip.of_xlate = of_pwm_single_xlate; > - pdata->pchip.of_pwm_n_cells = 1; > + /* > + * This should better use adev->dev instead of pdata->dev. See > + * https://lore.kernel.org/dri-devel/20231127101547.734061-2-u.kleine-koenig@pengutronix.de > + */ > + pdata->pchip = chip = devm_pwmchip_alloc(pdata->dev, 1, 0); > + if (IS_ERR(chip)) > + return PTR_ERR(chip); > > - return pwmchip_add(&pdata->pchip); > + pwmchip_set_drvdata(chip, pdata); > + > + chip->ops = &ti_sn_pwm_ops; > + chip->of_xlate = of_pwm_single_xlate; > + chip->of_pwm_n_cells = 1; > + > + return pwmchip_add(chip); > } > > static void ti_sn_pwm_remove(struct auxiliary_device *adev) > { > struct ti_sn65dsi86 *pdata = dev_get_drvdata(adev->dev.parent); > > - pwmchip_remove(&pdata->pchip); > + pwmchip_remove(pdata->pchip); > > if (pdata->pwm_enabled) > pm_runtime_put_sync(pdata->dev); > -- > 2.42.0 > Acked-by: Robert Foss <rfoss@kernel.org>
diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi86.c b/drivers/gpu/drm/bridge/ti-sn65dsi86.c index c45c07840f64..33eb2ed0a729 100644 --- a/drivers/gpu/drm/bridge/ti-sn65dsi86.c +++ b/drivers/gpu/drm/bridge/ti-sn65dsi86.c @@ -197,7 +197,7 @@ struct ti_sn65dsi86 { DECLARE_BITMAP(gchip_output, SN_NUM_GPIOS); #endif #if defined(CONFIG_PWM) - struct pwm_chip pchip; + struct pwm_chip *pchip; bool pwm_enabled; atomic_t pwm_pin_busy; #endif @@ -1372,7 +1372,7 @@ static void ti_sn_pwm_pin_release(struct ti_sn65dsi86 *pdata) static struct ti_sn65dsi86 *pwm_chip_to_ti_sn_bridge(struct pwm_chip *chip) { - return container_of(chip, struct ti_sn65dsi86, pchip); + return pwmchip_get_drvdata(chip); } static int ti_sn_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm) @@ -1585,22 +1585,31 @@ static const struct pwm_ops ti_sn_pwm_ops = { static int ti_sn_pwm_probe(struct auxiliary_device *adev, const struct auxiliary_device_id *id) { + struct pwm_chip *chip; struct ti_sn65dsi86 *pdata = dev_get_drvdata(adev->dev.parent); - pdata->pchip.dev = pdata->dev; - pdata->pchip.ops = &ti_sn_pwm_ops; - pdata->pchip.npwm = 1; - pdata->pchip.of_xlate = of_pwm_single_xlate; - pdata->pchip.of_pwm_n_cells = 1; + /* + * This should better use adev->dev instead of pdata->dev. See + * https://lore.kernel.org/dri-devel/20231127101547.734061-2-u.kleine-koenig@pengutronix.de + */ + pdata->pchip = chip = devm_pwmchip_alloc(pdata->dev, 1, 0); + if (IS_ERR(chip)) + return PTR_ERR(chip); - return pwmchip_add(&pdata->pchip); + pwmchip_set_drvdata(chip, pdata); + + chip->ops = &ti_sn_pwm_ops; + chip->of_xlate = of_pwm_single_xlate; + chip->of_pwm_n_cells = 1; + + return pwmchip_add(chip); } static void ti_sn_pwm_remove(struct auxiliary_device *adev) { struct ti_sn65dsi86 *pdata = dev_get_drvdata(adev->dev.parent); - pwmchip_remove(&pdata->pchip); + pwmchip_remove(pdata->pchip); if (pdata->pwm_enabled) pm_runtime_put_sync(pdata->dev);
This prepares the pwm driver of the ti-sn65dsi86 to further changes of the pwm core outlined in the commit introducing devm_pwmchip_alloc(). There is no intended semantical change and the driver should behave as before. Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> --- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-)