summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--board/samus/board.h1
-rw-r--r--common/fan.c12
-rw-r--r--include/config.h7
3 files changed, 20 insertions, 0 deletions
diff --git a/board/samus/board.h b/board/samus/board.h
index da51e73631..05bb3c6961 100644
--- a/board/samus/board.h
+++ b/board/samus/board.h
@@ -53,6 +53,7 @@
#define CONFIG_CHARGER_DISCHARGE_ON_AC
#define CONFIG_CHARGER_MIN_BAT_PCT_FOR_POWER_ON 1
#define CONFIG_FANS 2
+#define CONFIG_FAN_UPDATE_PERIOD 10
#define CONFIG_GESTURE_DETECTION
#define CONFIG_GESTURE_SAMPLING_INTERVAL_MS 5
#undef CONFIG_HIBERNATE_DELAY_SEC
diff --git a/common/fan.c b/common/fan.c
index cb080c15c9..9196ddf36b 100644
--- a/common/fan.c
+++ b/common/fan.c
@@ -19,6 +19,11 @@
* things manually. */
static int thermal_control_enabled[CONFIG_FANS];
+#ifdef CONFIG_FAN_UPDATE_PERIOD
+/* Should we ignore the fans for a while? */
+static int fan_update_counter[CONFIG_FANS];
+#endif
+
#ifndef CONFIG_FAN_RPM_CUSTOM
/* This is the default implementation. It's only called over [0,100].
* Convert the percentage to a target RPM. We can't simply scale all
@@ -49,6 +54,13 @@ test_mockable void fan_set_percent_needed(int fan, int pct)
if (!thermal_control_enabled[fan])
return;
+#ifdef CONFIG_FAN_UPDATE_PERIOD
+ /* Only set each fan every so often, to avoid rapid changes. */
+ fan_update_counter[fan] %= CONFIG_FAN_UPDATE_PERIOD;
+ if (fan_update_counter[fan]++)
+ return;
+#endif
+
new_rpm = fan_percent_to_rpm(fan, pct);
actual_rpm = fan_get_rpm_actual(fans[fan].ch);
diff --git a/include/config.h b/include/config.h
index 9e4e1999f7..9fb9508644 100644
--- a/include/config.h
+++ b/include/config.h
@@ -551,6 +551,13 @@
*/
#undef CONFIG_FAN_RPM_CUSTOM
+/*
+ * We normally check and update the fans once per second (HOOK_SECOND). If this
+ * is #defined to a postive integer N, we will only update the fans every N
+ * seconds instead.
+ */
+#undef CONFIG_FAN_UPDATE_PERIOD
+
/*****************************************************************************/
/* Flash configuration */