diff options
Diffstat (limited to 'zephyr/shim/src/fan.c')
-rw-r--r-- | zephyr/shim/src/fan.c | 32 |
1 files changed, 13 insertions, 19 deletions
diff --git a/zephyr/shim/src/fan.c b/zephyr/shim/src/fan.c index c7074b0c4d..9978e6f4ca 100644 --- a/zephyr/shim/src/fan.c +++ b/zephyr/shim/src/fan.c @@ -5,12 +5,6 @@ #define DT_DRV_COMPAT cros_ec_fans -#include <zephyr/drivers/gpio.h> -#include <zephyr/drivers/pwm.h> -#include <zephyr/drivers/sensor.h> -#include <zephyr/logging/log.h> -#include <zephyr/sys/util_macro.h> - #include "fan.h" #include "gpio_signal.h" #include "hooks.h" @@ -18,6 +12,12 @@ #include "system.h" #include "util.h" +#include <zephyr/drivers/gpio.h> +#include <zephyr/drivers/pwm.h> +#include <zephyr/drivers/sensor.h> +#include <zephyr/logging/log.h> +#include <zephyr/sys/util_macro.h> + LOG_MODULE_REGISTER(fan_shim, LOG_LEVEL_ERR); BUILD_ASSERT(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT) == 1, @@ -43,6 +43,7 @@ BUILD_ASSERT(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT) == 1, .rpm_min = DT_PROP(node_id, rpm_min), \ .rpm_start = DT_PROP(node_id, rpm_start), \ .rpm_max = DT_PROP(node_id, rpm_max), \ + .rpm_deviation = DT_PROP(node_id, rpm_deviation), \ }; #define FAN_INST(node_id) \ @@ -61,14 +62,6 @@ DT_INST_FOREACH_CHILD(0, FAN_CONFIGS) const struct fan_t fans[FAN_CH_COUNT] = { DT_INST_FOREACH_CHILD(0, FAN_INST) }; -/* Rpm deviation (Unit:percent) */ -#ifndef RPM_DEVIATION -#define RPM_DEVIATION 7 -#endif - -/* Margin of target rpm */ -#define RPM_MARGIN(rpm_target) (((rpm_target)*RPM_DEVIATION) / 100) - /* Fan mode */ enum fan_mode { /* FAN rpm mode */ @@ -132,9 +125,9 @@ static void fan_pwm_update(int ch) LOG_DBG("FAN PWM %s set percent (%d), pulse %d", pwm_dev->name, data->pwm_percent, pulse_ns); - ret = pwm_set_dt(&cfg->pwm, cfg->pwm.period, pulse_ns); + ret = pwm_set_pulse_dt(&cfg->pwm, pulse_ns); if (ret) { - LOG_ERR("pwm_set() failed %s (%d)", pwm_dev->name, ret); + LOG_ERR("pwm_set_pulse_dt failed %s (%d)", pwm_dev->name, ret); } } @@ -226,9 +219,10 @@ enum fan_status fan_smart_control(int ch) int duty, rpm_diff; int rpm_actual = data->rpm_actual; int rpm_target = data->rpm_target; + int deviation = fans[ch].rpm->rpm_deviation; /* wait rpm is stable */ - if (ABS(rpm_actual - data->rpm_pre) > RPM_MARGIN(rpm_actual)) { + if (ABS(rpm_actual - data->rpm_pre) > (rpm_target * deviation / 100)) { data->rpm_pre = rpm_actual; return FAN_STATUS_CHANGING; } @@ -243,7 +237,7 @@ enum fan_status fan_smart_control(int ch) return FAN_STATUS_STOPPED; } - if (rpm_diff > RPM_MARGIN(rpm_target)) { + if (rpm_diff > (rpm_target * deviation / 100)) { /* Increase PWM duty */ if (duty == 100) { return FAN_STATUS_FRUSTRATED; @@ -251,7 +245,7 @@ enum fan_status fan_smart_control(int ch) fan_adjust_duty(ch, rpm_diff, duty); return FAN_STATUS_CHANGING; - } else if (rpm_diff < -RPM_MARGIN(rpm_target)) { + } else if (rpm_diff < -(rpm_target * deviation / 100)) { /* Decrease PWM duty */ if (duty == 1 && rpm_target != 0) { return FAN_STATUS_FRUSTRATED; |