pwm: brcmstb: Implement .apply() callback
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Mon, 14 Feb 2022 08:23:53 +0000 (09:23 +0100)
committerThierry Reding <thierry.reding@gmail.com>
Thu, 24 Feb 2022 13:46:21 +0000 (14:46 +0100)
To eventually get rid of all legacy drivers convert this driver to the
modern world implementing .apply().

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Tested-by: Florian Fainelli <f.fainelli@gmail.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
drivers/pwm/pwm-brcmstb.c

index 3b529f8..9997439 100644 (file)
@@ -95,7 +95,7 @@ static inline struct brcmstb_pwm *to_brcmstb_pwm(struct pwm_chip *chip)
  * "on" time, so this translates directly into our HW programming here.
  */
 static int brcmstb_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
-                             int duty_ns, int period_ns)
+                             u64 duty_ns, u64 period_ns)
 {
        struct brcmstb_pwm *p = to_brcmstb_pwm(chip);
        unsigned long pc, dc, cword = CONST_VAR_F_MAX;
@@ -114,22 +114,17 @@ static int brcmstb_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
        }
 
        while (1) {
-               u64 rate, tmp;
+               u64 rate;
 
                /*
                 * Calculate the base rate from base frequency and current
                 * cword
                 */
                rate = (u64)clk_get_rate(p->clk) * (u64)cword;
-               do_div(rate, 1 << CWORD_BIT_SIZE);
+               rate >>= CWORD_BIT_SIZE;
 
-               tmp = period_ns * rate;
-               do_div(tmp, NSEC_PER_SEC);
-               pc = tmp;
-
-               tmp = (duty_ns + 1) * rate;
-               do_div(tmp, NSEC_PER_SEC);
-               dc = tmp;
+               pc = mul_u64_u64_div_u64(period_ns, rate, NSEC_PER_SEC);
+               dc = mul_u64_u64_div_u64(duty_ns + 1, rate, NSEC_PER_SEC);
 
                /*
                 * We can be called with separate duty and period updates,
@@ -202,26 +197,34 @@ static inline void brcmstb_pwm_enable_set(struct brcmstb_pwm *p,
        spin_unlock(&p->lock);
 }
 
-static int brcmstb_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
+static int brcmstb_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
+                            const struct pwm_state *state)
 {
        struct brcmstb_pwm *p = to_brcmstb_pwm(chip);
+       int err;
 
-       brcmstb_pwm_enable_set(p, pwm->hwpwm, true);
+       if (state->polarity != PWM_POLARITY_NORMAL)
+               return -EINVAL;
 
-       return 0;
-}
+       if (!state->enabled) {
+               if (pwm->state.enabled)
+                       brcmstb_pwm_enable_set(p, pwm->hwpwm, false);
 
-static void brcmstb_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
-{
-       struct brcmstb_pwm *p = to_brcmstb_pwm(chip);
+               return 0;
+       }
+
+       err = brcmstb_pwm_config(chip, pwm, state->duty_cycle, state->period);
+       if (err)
+               return err;
 
-       brcmstb_pwm_enable_set(p, pwm->hwpwm, false);
+       if (!pwm->state.enabled)
+               brcmstb_pwm_enable_set(p, pwm->hwpwm, true);
+
+       return 0;
 }
 
 static const struct pwm_ops brcmstb_pwm_ops = {
-       .config = brcmstb_pwm_config,
-       .enable = brcmstb_pwm_enable,
-       .disable = brcmstb_pwm_disable,
+       .apply = brcmstb_pwm_apply,
        .owner = THIS_MODULE,
 };