]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
hwmon: (pwmfan) Do not force disable pwm controller
authorJohannes Kirchmair <johannes.kirchmair@skidata.com>
Tue, 27 Aug 2024 05:44:54 +0000 (07:44 +0200)
committerGuenter Roeck <linux@roeck-us.net>
Tue, 27 Aug 2024 15:12:23 +0000 (08:12 -0700)
The pwm1_enable attribute of the pwmfan driver influences the mode of
operation, especially in case of a requested pwm1 duty cycle of zero.
Especially setting pwm1_enable to two, should keep the pwm controller
enabled even if the duty cycle is set to zero [1].

This is not the case at the moment, as the pwm controller is disabled
always if pwm1 is set to zero.

This commit tries to fix this behavior.

[1] https://docs.kernel.org/hwmon/pwm-fan.html

Signed-off-by: Johannes Kirchmair <johannes.kirchmair@skidata.com>
Message-ID: <20240827054454.521494-1-mailinglist1@johanneskirchmair.de>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/pwm-fan.c

index a1712649b07e3f2cd7181854aa2b69a609b64d4c..c434db4656e7df188fee54bdd233d04a9418115c 100644 (file)
@@ -167,7 +167,7 @@ disable_regulator:
        return ret;
 }
 
-static int pwm_fan_power_off(struct pwm_fan_ctx *ctx)
+static int pwm_fan_power_off(struct pwm_fan_ctx *ctx, bool force_disable)
 {
        struct pwm_state *state = &ctx->pwm_state;
        bool enable_regulator = false;
@@ -180,7 +180,8 @@ static int pwm_fan_power_off(struct pwm_fan_ctx *ctx)
                                    state,
                                    &enable_regulator);
 
-       state->enabled = false;
+       if (force_disable)
+               state->enabled = false;
        state->duty_cycle = 0;
        ret = pwm_apply_might_sleep(ctx->pwm, state);
        if (ret) {
@@ -213,7 +214,7 @@ static int  __set_pwm(struct pwm_fan_ctx *ctx, unsigned long pwm)
                        return ret;
                ret = pwm_fan_power_on(ctx);
        } else {
-               ret = pwm_fan_power_off(ctx);
+               ret = pwm_fan_power_off(ctx, false);
        }
        if (!ret)
                ctx->pwm_value = pwm;
@@ -468,7 +469,7 @@ static void pwm_fan_cleanup(void *__ctx)
        del_timer_sync(&ctx->rpm_timer);
        /* Switch off everything */
        ctx->enable_mode = pwm_disable_reg_disable;
-       pwm_fan_power_off(ctx);
+       pwm_fan_power_off(ctx, true);
 }
 
 static int pwm_fan_probe(struct platform_device *pdev)
@@ -661,7 +662,7 @@ static int pwm_fan_suspend(struct device *dev)
 {
        struct pwm_fan_ctx *ctx = dev_get_drvdata(dev);
 
-       return pwm_fan_power_off(ctx);
+       return pwm_fan_power_off(ctx, true);
 }
 
 static int pwm_fan_resume(struct device *dev)