pwm: ab8500: Implement .apply instead of .config, .enable and .disable
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Mon, 1 Mar 2021 18:45:37 +0000 (19:45 +0100)
committerThierry Reding <thierry.reding@gmail.com>
Mon, 22 Mar 2021 10:48:49 +0000 (11:48 +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>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
drivers/pwm/pwm-ab8500.c

index 58c6c0f..5b0a712 100644 (file)
@@ -24,23 +24,37 @@ struct ab8500_pwm_chip {
        struct pwm_chip chip;
 };
 
-static int ab8500_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
-                            int duty_ns, int period_ns)
+static int ab8500_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
+                           const struct pwm_state *state)
 {
-       int ret = 0;
-       unsigned int higher_val, lower_val;
+       int ret;
        u8 reg;
+       unsigned int higher_val, lower_val;
+
+       if (state->polarity != PWM_POLARITY_NORMAL)
+               return -EINVAL;
+
+       if (!state->enabled) {
+               ret = abx500_mask_and_set_register_interruptible(chip->dev,
+                                       AB8500_MISC, AB8500_PWM_OUT_CTRL7_REG,
+                                       1 << (chip->base - 1), 0);
+
+               if (ret < 0)
+                       dev_err(chip->dev, "%s: Failed to disable PWM, Error %d\n",
+                                                               pwm->label, ret);
+               return ret;
+       }
 
        /*
         * get the first 8 bits that are be written to
         * AB8500_PWM_OUT_CTRL1_REG[0:7]
         */
-       lower_val = duty_ns & 0x00FF;
+       lower_val = state->duty_cycle & 0x00FF;
        /*
         * get bits [9:10] that are to be written to
         * AB8500_PWM_OUT_CTRL2_REG[0:1]
         */
-       higher_val = ((duty_ns & 0x0300) >> 8);
+       higher_val = ((state->duty_cycle & 0x0300) >> 8);
 
        reg = AB8500_PWM_OUT_CTRL1_REG + ((chip->base - 1) * 2);
 
@@ -48,15 +62,11 @@ static int ab8500_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
                        reg, (u8)lower_val);
        if (ret < 0)
                return ret;
+
        ret = abx500_set_register_interruptible(chip->dev, AB8500_MISC,
                        (reg + 1), (u8)higher_val);
-
-       return ret;
-}
-
-static int ab8500_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
-{
-       int ret;
+       if (ret < 0)
+               return ret;
 
        ret = abx500_mask_and_set_register_interruptible(chip->dev,
                                AB8500_MISC, AB8500_PWM_OUT_CTRL7_REG,
@@ -64,25 +74,12 @@ static int ab8500_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
        if (ret < 0)
                dev_err(chip->dev, "%s: Failed to enable PWM, Error %d\n",
                                                        pwm->label, ret);
-       return ret;
-}
 
-static void ab8500_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
-{
-       int ret;
-
-       ret = abx500_mask_and_set_register_interruptible(chip->dev,
-                               AB8500_MISC, AB8500_PWM_OUT_CTRL7_REG,
-                               1 << (chip->base - 1), 0);
-       if (ret < 0)
-               dev_err(chip->dev, "%s: Failed to disable PWM, Error %d\n",
-                                                       pwm->label, ret);
+       return ret;
 }
 
 static const struct pwm_ops ab8500_pwm_ops = {
-       .config = ab8500_pwm_config,
-       .enable = ab8500_pwm_enable,
-       .disable = ab8500_pwm_disable,
+       .apply = ab8500_pwm_apply,
        .owner = THIS_MODULE,
 };