Message ID | 20220413085050.61144-3-u.kleine-koenig@pengutronix.de (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Geert Uytterhoeven |
Headers | show |
Series | [1/6] pwm: renesas-tpu: Make use of dev_err_probe() | expand |
On Wed, Apr 13, 2022 at 10:51 AM Uwe Kleine-König <u.kleine-koenig@pengutronix.de> wrote: > > To eventually get rid of all legacy drivers convert this driver to the > modern world implementing .apply(). > > As pwm->state might not be updated in tpu_pwm_apply() before calling > tpu_pwm_config(), an additional parameter is needed for tpu_pwm_config() > to not change the implemented logic. > > Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> LGTM, so Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> The display backlight still works fine on r8a7740/armadillo, so Tested-by: Geert Uytterhoeven <geert+renesas@glider.be> Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds
Hi Uwe, On Thu, Apr 14, 2022 at 11:18 AM Geert Uytterhoeven <geert@linux-m68k.org> wrote: > On Wed, Apr 13, 2022 at 10:51 AM Uwe Kleine-König > <u.kleine-koenig@pengutronix.de> wrote: > > > > To eventually get rid of all legacy drivers convert this driver to the > > modern world implementing .apply(). > > > > As pwm->state might not be updated in tpu_pwm_apply() before calling > > tpu_pwm_config(), an additional parameter is needed for tpu_pwm_config() > > to not change the implemented logic. > > > > Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> > > LGTM, so > Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> > > The display backlight still works fine on r8a7740/armadillo, so > Tested-by: Geert Uytterhoeven <geert+renesas@glider.be> Oops, I spoke too soon... > > @@ -366,13 +366,45 @@ static void tpu_pwm_disable(struct pwm_chip *chip, struct pwm_device *_pwm) > > tpu_pwm_timer_stop(pwm); > > } > > > > +static int tpu_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, > > + const struct pwm_state *state) > > +{ > > + int err; > > + bool enabled = pwm->state.enabled; > > + > > + if (state->polarity != pwm->state.polarity) { > > + if (enabled) { > > + tpu_pwm_disable(chip, pwm); > > + enabled = false; > > + } > > + > > + err = tpu_pwm_set_polarity(chip, pwm, state->polarity); > > + if (err) > > + return err; > > + } > > + > > + if (!state->enabled) { > > + if (enabled) > > + chip->ops->disable(chip, pwm); tpu_pwm_disable else it crashes with a NULL-pointer dereference (e.g. during system shutdown). > > + > > + return 0; > > + } Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds
diff --git a/drivers/pwm/pwm-renesas-tpu.c b/drivers/pwm/pwm-renesas-tpu.c index 12376988c70e..100c21e27648 100644 --- a/drivers/pwm/pwm-renesas-tpu.c +++ b/drivers/pwm/pwm-renesas-tpu.c @@ -242,7 +242,7 @@ static void tpu_pwm_free(struct pwm_chip *chip, struct pwm_device *_pwm) } static int tpu_pwm_config(struct pwm_chip *chip, struct pwm_device *_pwm, - int duty_ns, int period_ns) + int duty_ns, int period_ns, bool enabled) { static const unsigned int prescalers[] = { 1, 4, 16, 64 }; struct tpu_pwm_device *pwm = pwm_get_chip_data(_pwm); @@ -293,7 +293,7 @@ static int tpu_pwm_config(struct pwm_chip *chip, struct pwm_device *_pwm, pwm->duty = duty; /* If the channel is disabled we're done. */ - if (!pwm_is_enabled(_pwm)) + if (!enabled) return 0; if (duty_only && pwm->timer_on) { @@ -366,13 +366,45 @@ static void tpu_pwm_disable(struct pwm_chip *chip, struct pwm_device *_pwm) tpu_pwm_timer_stop(pwm); } +static int tpu_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, + const struct pwm_state *state) +{ + int err; + bool enabled = pwm->state.enabled; + + if (state->polarity != pwm->state.polarity) { + if (enabled) { + tpu_pwm_disable(chip, pwm); + enabled = false; + } + + err = tpu_pwm_set_polarity(chip, pwm, state->polarity); + if (err) + return err; + } + + if (!state->enabled) { + if (enabled) + chip->ops->disable(chip, pwm); + + return 0; + } + + err = tpu_pwm_config(pwm->chip, pwm, + state->duty_cycle, state->period, enabled); + if (err) + return err; + + if (!enabled) + err = tpu_pwm_enable(chip, pwm); + + return err; +} + static const struct pwm_ops tpu_pwm_ops = { .request = tpu_pwm_request, .free = tpu_pwm_free, - .config = tpu_pwm_config, - .set_polarity = tpu_pwm_set_polarity, - .enable = tpu_pwm_enable, - .disable = tpu_pwm_disable, + .apply = tpu_pwm_apply, .owner = THIS_MODULE, };
To eventually get rid of all legacy drivers convert this driver to the modern world implementing .apply(). As pwm->state might not be updated in tpu_pwm_apply() before calling tpu_pwm_config(), an additional parameter is needed for tpu_pwm_config() to not change the implemented logic. Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> --- drivers/pwm/pwm-renesas-tpu.c | 44 ++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 6 deletions(-)