]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
hwmon: (emc2305) Set initial PWM minimum value during probe based on thermal state
authorFlorin Leotescu <florin.leotescu@nxp.com>
Tue, 3 Jun 2025 11:31:25 +0000 (14:31 +0300)
committerGuenter Roeck <linux@roeck-us.net>
Sun, 20 Jul 2025 23:38:34 +0000 (16:38 -0700)
Prevent the PWM value from being set to minimum when thermal zone
temperature exceeds any trip point during driver probe. Otherwise, the
PWM fan speed will remains at minimum speed and not respond to
temperature changes.

Signed-off-by: Florin Leotescu <florin.leotescu@nxp.com>
Link: https://lore.kernel.org/r/20250603113125.3175103-5-florin.leotescu@oss.nxp.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/emc2305.c

index db65c3177f2920bf0258db570bc7d86cb5a62229..60809289f8169d685a98305fa017339f69ac97d3 100644 (file)
@@ -317,6 +317,12 @@ static int emc2305_set_single_tz(struct device *dev, struct device_node *fan_nod
                dev_err(dev, "Failed to register cooling device %s\n", emc2305_fan_name[idx]);
                return PTR_ERR(data->cdev_data[cdev_idx].cdev);
        }
+
+       if (data->cdev_data[cdev_idx].cur_state > 0)
+               /* Update pwm when temperature is above trips */
+               pwm = EMC2305_PWM_STATE2DUTY(data->cdev_data[cdev_idx].cur_state,
+                                            data->max_state, EMC2305_FAN_MAX);
+
        /* Set minimal PWM speed. */
        if (data->pwm_separate) {
                ret = emc2305_set_pwm(dev, pwm, cdev_idx);
@@ -330,10 +336,10 @@ static int emc2305_set_single_tz(struct device *dev, struct device_node *fan_nod
                }
        }
        data->cdev_data[cdev_idx].cur_state =
-               EMC2305_PWM_DUTY2STATE(data->pwm_min[cdev_idx], data->max_state,
+               EMC2305_PWM_DUTY2STATE(pwm, data->max_state,
                                       EMC2305_FAN_MAX);
        data->cdev_data[cdev_idx].last_hwmon_state =
-               EMC2305_PWM_DUTY2STATE(data->pwm_min[cdev_idx], data->max_state,
+               EMC2305_PWM_DUTY2STATE(pwm, data->max_state,
                                       EMC2305_FAN_MAX);
        return 0;
 }