hwmon: (pwm-fan) Simplify enable/disable check
authorAlexander Stein <alexander.stein@ew.tq-group.com>
Wed, 14 Sep 2022 15:31:34 +0000 (17:31 +0200)
committerGuenter Roeck <linux@roeck-us.net>
Sun, 25 Sep 2022 21:22:10 +0000 (14:22 -0700)
Instead of comparing the current to the new pwm duty to decide whether to
enable the PWM, use a dedicated flag. Also apply the new PWM duty in any
case. This is a preparation to enable/disable the regulator dynamically.

Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com>
Link: https://lore.kernel.org/r/20220914153137.613982-3-alexander.stein@ew.tq-group.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/pwm-fan.c

index c8a7926..01412c7 100644 (file)
@@ -29,10 +29,13 @@ struct pwm_fan_tach {
 };
 
 struct pwm_fan_ctx {
+       struct device *dev;
+
        struct mutex lock;
        struct pwm_device *pwm;
        struct pwm_state pwm_state;
        struct regulator *reg_en;
+       bool enabled;
 
        int tach_count;
        struct pwm_fan_tach *tachs;
@@ -85,13 +88,19 @@ static void sample_timer(struct timer_list *t)
 static int pwm_fan_power_on(struct pwm_fan_ctx *ctx)
 {
        struct pwm_state *state = &ctx->pwm_state;
-       unsigned long period;
        int ret;
 
-       period = state->period;
-       state->duty_cycle = DIV_ROUND_UP(ctx->pwm_value * (period - 1), MAX_PWM);
+       if (ctx->enabled)
+               return 0;
+
        state->enabled = true;
        ret = pwm_apply_state(ctx->pwm, state);
+       if (ret) {
+               dev_err(ctx->dev, "failed to enable PWM\n");
+               return ret;
+       }
+
+       ctx->enabled = true;
 
        return ret;
 }
@@ -99,27 +108,42 @@ static int pwm_fan_power_on(struct pwm_fan_ctx *ctx)
 static int pwm_fan_power_off(struct pwm_fan_ctx *ctx)
 {
        struct pwm_state *state = &ctx->pwm_state;
+       int ret;
+
+       if (!ctx->enabled)
+               return 0;
 
        state->enabled = false;
        state->duty_cycle = 0;
-       pwm_apply_state(ctx->pwm, state);
+       ret = pwm_apply_state(ctx->pwm, state);
+       if (ret) {
+               dev_err(ctx->dev, "failed to disable PWM\n");
+               return ret;
+       }
+
+       ctx->enabled = false;
 
        return 0;
 }
 
 static int  __set_pwm(struct pwm_fan_ctx *ctx, unsigned long pwm)
 {
+       struct pwm_state *state = &ctx->pwm_state;
+       unsigned long period;
        int ret = 0;
 
        mutex_lock(&ctx->lock);
-       if (ctx->pwm_value == pwm)
-               goto exit_set_pwm_err;
 
-       if (pwm > 0)
+       if (pwm > 0) {
+               period = state->period;
+               state->duty_cycle = DIV_ROUND_UP(pwm * (period - 1), MAX_PWM);
+               ret = pwm_apply_state(ctx->pwm, state);
+               if (ret)
+                       goto exit_set_pwm_err;
                ret = pwm_fan_power_on(ctx);
-       else
+       } else {
                ret = pwm_fan_power_off(ctx);
-
+       }
        if (!ret)
                ctx->pwm_value = pwm;
 
@@ -326,6 +350,7 @@ static int pwm_fan_probe(struct platform_device *pdev)
 
        mutex_init(&ctx->lock);
 
+       ctx->dev = &pdev->dev;
        ctx->pwm = devm_pwm_get(dev, NULL);
        if (IS_ERR(ctx->pwm))
                return dev_err_probe(dev, PTR_ERR(ctx->pwm), "Could not get PWM\n");