Skip to content

Commit

Permalink
pwm: renesas-tpu: Implement .apply() callback
Browse files Browse the repository at this point in the history
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>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
  • Loading branch information
Uwe Kleine-König authored and thierryreding committed May 20, 2022
1 parent ff4bcd5 commit ec00cd5
Showing 1 changed file with 38 additions and 6 deletions.
44 changes: 38 additions & 6 deletions drivers/pwm/pwm-renesas-tpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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)
tpu_pwm_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,
};

Expand Down

0 comments on commit ec00cd5

Please sign in to comment.