]> Git Repo - linux.git/blobdiff - drivers/pwm/pwm-img.c
platform/x86: amd-pmc: Move to later in the suspend process
[linux.git] / drivers / pwm / pwm-img.c
index f97f825482934197ea2a1216566431d3842ebf08..5996049f66ece366e23d22be732b683874900f71 100644 (file)
@@ -128,11 +128,9 @@ static int img_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
 
        duty = DIV_ROUND_UP(timebase * duty_ns, period_ns);
 
-       ret = pm_runtime_get_sync(chip->dev);
-       if (ret < 0) {
-               pm_runtime_put_autosuspend(chip->dev);
+       ret = pm_runtime_resume_and_get(chip->dev);
+       if (ret < 0)
                return ret;
-       }
 
        val = img_pwm_readl(pwm_chip, PWM_CTRL_CFG);
        val &= ~(PWM_CTRL_CFG_DIV_MASK << PWM_CTRL_CFG_DIV_SHIFT(pwm->hwpwm));
@@ -184,10 +182,33 @@ static void img_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
        pm_runtime_put_autosuspend(chip->dev);
 }
 
+static int img_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
+                        const struct pwm_state *state)
+{
+       int err;
+
+       if (state->polarity != PWM_POLARITY_NORMAL)
+               return -EINVAL;
+
+       if (!state->enabled) {
+               if (pwm->state.enabled)
+                       img_pwm_disable(chip, pwm);
+
+               return 0;
+       }
+
+       err = img_pwm_config(pwm->chip, pwm, state->duty_cycle, state->period);
+       if (err)
+               return err;
+
+       if (!pwm->state.enabled)
+               err = img_pwm_enable(chip, pwm);
+
+       return err;
+}
+
 static const struct pwm_ops img_pwm_ops = {
-       .config = img_pwm_config,
-       .enable = img_pwm_enable,
-       .disable = img_pwm_disable,
+       .apply = img_pwm_apply,
        .owner = THIS_MODULE,
 };
 
This page took 0.032933 seconds and 4 git commands to generate.