summaryrefslogtreecommitdiff
path: root/src/superio
diff options
context:
space:
mode:
Diffstat (limited to 'src/superio')
-rw-r--r--src/superio/ite/common/env_ctrl.c18
-rw-r--r--src/superio/ite/common/env_ctrl.h9
-rw-r--r--src/superio/ite/common/env_ctrl_chip.h2
3 files changed, 23 insertions, 6 deletions
diff --git a/src/superio/ite/common/env_ctrl.c b/src/superio/ite/common/env_ctrl.c
index 8668110713..c87f32d3e0 100644
--- a/src/superio/ite/common/env_ctrl.c
+++ b/src/superio/ite/common/env_ctrl.c
@@ -128,13 +128,19 @@ static void fan_smartconfig(const u16 base, const u8 fan,
pwm_ctrl = ITE_EC_FAN_CTL_PWM_MODE_AUTOMATIC;
pwm_ctrl |= ITE_EC_FAN_CTL_TEMPIN(conf->tmpin);
- pwm_start = ITE_EC_FAN_CTL_PWM_START_DUTY(conf->pwm_start);
-
- if (CONFIG(SUPERIO_ITE_ENV_CTRL_7BIT_SLOPE_REG)) {
- pwm_auto = conf->slope & 0x7f;
- } else {
- pwm_start |= ITE_EC_FAN_CTL_PWM_SLOPE_BIT6(conf->slope);
+ if (conf->clsd_loop) {
+ pwm_ctrl |= ITE_EC_FAN_PWM_CLSD_LOOP;
+ pwm_start = ITE_EC_FAN_CTL_PWM_START_RPM(conf->rpm_start);
pwm_auto = ITE_EC_FAN_CTL_PWM_SLOPE_LOWER(conf->slope);
+ } else {
+ pwm_start = ITE_EC_FAN_CTL_PWM_START_DUTY(conf->pwm_start);
+
+ if (CONFIG(SUPERIO_ITE_ENV_CTRL_7BIT_SLOPE_REG)) {
+ pwm_auto = conf->slope & 0x7f;
+ } else {
+ pwm_start |= ITE_EC_FAN_CTL_PWM_SLOPE_BIT6(conf->slope);
+ pwm_auto = ITE_EC_FAN_CTL_PWM_SLOPE_LOWER(conf->slope);
+ }
}
if (conf->smoothing)
diff --git a/src/superio/ite/common/env_ctrl.h b/src/superio/ite/common/env_ctrl.h
index 7bce8097f5..145c6c13e9 100644
--- a/src/superio/ite/common/env_ctrl.h
+++ b/src/superio/ite/common/env_ctrl.h
@@ -91,6 +91,7 @@
? (0x1e + ((x)-4)) \
: (0x15 + ((x)-1)) \
)
+#define ITE_EC_FAN_PWM_CLSD_LOOP (1 << 2)
#if CONFIG(SUPERIO_ITE_ENV_CTRL_5FANS)
#define ITE_EC_FAN_CTL_TEMPIN_MASK (7 << 3)
@@ -110,6 +111,13 @@
? ITE_EC_FAN_MAX_PWM \
: (_p * ITE_EC_FAN_MAX_PWM) / 100; \
})
+#define ITE_EC_FAN_CTL_PWM_RPM(p) \
+ ({ \
+ const unsigned int _p = p; \
+ (_p >= 4080) \
+ ? 0xFF \
+ : (_p / 16); \
+ })
#define ITE_EC_HIGH_TEMP_LIMIT(x) (0x40 + ((x-1) * 2))
#define ITE_EC_LOW_TEMP_LIMIT(x) (0x41 + ((x-1) * 2))
@@ -178,6 +186,7 @@ static const u8 ITE_EC_TEMP_ADJUST[] = { 0x56, 0x57, 0x59 };
/* Common for ITE_EC_FAN_CTL_PWM_START */
#define ITE_EC_FAN_CTL_PWM_SLOPE_BIT6(s) (((s) & 0x40) << 1)
#define ITE_EC_FAN_CTL_PWM_START_DUTY(p) ITE_EC_FAN_CTL_PWM_DUTY(p)
+#define ITE_EC_FAN_CTL_PWM_START_RPM(p) ITE_EC_FAN_CTL_PWM_RPM(p)
/* Common for ITE_EC_FAN_CTL_PWM_AUTO */
#define ITE_EC_FAN_CTL_AUTO_SMOOTHING_EN (1 << 7)
diff --git a/src/superio/ite/common/env_ctrl_chip.h b/src/superio/ite/common/env_ctrl_chip.h
index fa896e4074..2bb0780c53 100644
--- a/src/superio/ite/common/env_ctrl_chip.h
+++ b/src/superio/ite/common/env_ctrl_chip.h
@@ -60,6 +60,8 @@ struct ite_ec_fan_smartconfig {
u8 smoothing; /* enable smoothing */
u8 pwm_start; /* start at this duty cycle (%) */
u8 slope; /* increase duty cycle by `slope`%/°C */
+ u8 clsd_loop; /* tachometer closed-loop mode enable */
+ u16 rpm_start; /* start at this RPM (clsd_loop = 1) */
};
struct ite_ec_fan_config {