pwm: atmel-tcb: Implement .apply callback
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Mon, 8 Mar 2021 09:50:12 +0000 (10:50 +0100)
committerThierry Reding <thierry.reding@gmail.com>
Mon, 22 Mar 2021 11:06:26 +0000 (12:06 +0100)
This is just pushing down the core's compat code down into the driver using
the legacy callback nearly unchanged. The call to .enable() was just
dropped from .config() because .apply() calls it unconditionally.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
drivers/pwm/pwm-atmel-tcb.c

index ee70a615532b426df9adcf2c937a1209e1a6d194..4d2253f3048c425776fe100ba10a2b479a74e489 100644 (file)
@@ -362,20 +362,37 @@ static int atmel_tcb_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
        tcbpwm->div = i;
        tcbpwm->duty = duty;
 
-       /* If the PWM is enabled, call enable to apply the new conf */
-       if (pwm_is_enabled(pwm))
-               atmel_tcb_pwm_enable(chip, pwm);
-
        return 0;
 }
 
+static int atmel_tcb_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
+                              const struct pwm_state *state)
+{
+       int duty_cycle, period;
+       int ret;
+
+       /* This function only sets a flag in driver data */
+       atmel_tcb_pwm_set_polarity(chip, pwm, state->polarity);
+
+       if (!state->enabled) {
+               atmel_tcb_pwm_disable(chip, pwm);
+               return 0;
+       }
+
+       period = state->period < INT_MAX ? state->period : INT_MAX;
+       duty_cycle = state->duty_cycle < INT_MAX ? state->duty_cycle : INT_MAX;
+
+       ret = atmel_tcb_pwm_config(chip, pwm, duty_cycle, period);
+       if (ret)
+               return ret;
+
+       return atmel_tcb_pwm_enable(chip, pwm);
+}
+
 static const struct pwm_ops atmel_tcb_pwm_ops = {
        .request = atmel_tcb_pwm_request,
        .free = atmel_tcb_pwm_free,
-       .config = atmel_tcb_pwm_config,
-       .set_polarity = atmel_tcb_pwm_set_polarity,
-       .enable = atmel_tcb_pwm_enable,
-       .disable = atmel_tcb_pwm_disable,
+       .apply = atmel_tcb_pwm_apply,
        .owner = THIS_MODULE,
 };