]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
hwmon: mlxreg-fan: Prevent fans from getting stuck at 0 RPM
authorVadim Pasternak <vadimp@nvidia.com>
Wed, 30 Jul 2025 20:17:15 +0000 (23:17 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 9 Sep 2025 17:02:37 +0000 (19:02 +0200)
[ Upstream commit 1180c79fbf36e4c02e76ae4658509523437e52a4 ]

The fans controlled by the driver can get stuck at 0 RPM if they are
configured below a 20% duty cycle. The driver tries to avoid this by
enforcing a minimum duty cycle of 20%, but this is done after the fans
are registered with the thermal subsystem. This is too late as the
thermal subsystem can set their current state before the driver is able
to enforce the minimum duty cycle.

Fix by setting the minimum duty cycle before registering the fans with
the thermal subsystem.

Fixes: d7efb2ebc7b3 ("hwmon: (mlxreg-fan) Extend driver to support multiply cooling devices")
Reported-by: Nikolay Aleksandrov <razor@blackwall.org>
Tested-by: Nikolay Aleksandrov <razor@blackwall.org>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: Vadim Pasternak <vadimp@nvidia.com>
Link: https://lore.kernel.org/r/20250730201715.1111133-1-vadimp@nvidia.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/hwmon/mlxreg-fan.c

index a5f89aab3fb4d2c48ef08e7d759b3fefa5a2004c..c25a54d5b39ad5146dd5337668494091f908a584 100644 (file)
@@ -561,15 +561,14 @@ static int mlxreg_fan_cooling_config(struct device *dev, struct mlxreg_fan *fan)
                if (!pwm->connected)
                        continue;
                pwm->fan = fan;
+               /* Set minimal PWM speed. */
+               pwm->last_hwmon_state = MLXREG_FAN_PWM_DUTY2STATE(MLXREG_FAN_MIN_DUTY);
                pwm->cdev = devm_thermal_of_cooling_device_register(dev, NULL, mlxreg_fan_name[i],
                                                                    pwm, &mlxreg_fan_cooling_ops);
                if (IS_ERR(pwm->cdev)) {
                        dev_err(dev, "Failed to register cooling device\n");
                        return PTR_ERR(pwm->cdev);
                }
-
-               /* Set minimal PWM speed. */
-               pwm->last_hwmon_state = MLXREG_FAN_PWM_DUTY2STATE(MLXREG_FAN_MIN_DUTY);
        }
 
        return 0;