summaryrefslogtreecommitdiff
path: root/zephyr/shim/src/fan.c
diff options
context:
space:
mode:
Diffstat (limited to 'zephyr/shim/src/fan.c')
-rw-r--r--zephyr/shim/src/fan.c32
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;