[PATCH] arm64: dts: qcom: monaco-arduino-monza: Rework fan cooling map

Loic Poulain posted 1 patch 13 hours ago
arch/arm64/boot/dts/qcom/monaco-arduino-monza.dts | 47 +++++++++++++++++++----
1 file changed, 39 insertions(+), 8 deletions(-)
[PATCH] arm64: dts: qcom: monaco-arduino-monza: Rework fan cooling map
Posted by Loic Poulain 13 hours ago
The fan thermal zone previously had a single "active" trip at 32C mapped
to the fan over the full cooling range (<&fan 0 THERMAL_NO_LIMIT>). With
the default step_wise governor this only ramps the fan one step per poll
according to the thermal trend, so the fan speed tracked whether the
temperature was rising or falling rather than the temperature itself.

A visible consequence is at boot/reboot: if the board comes up already
hot but thermally stable (temperature above the trip but not rising),
step_wise sees no upward trend and leaves the fan at a low or zero
cooling state, so the fan stays slow despite the high temperature.

Replace it with a ladder of active trips that each pin the fan to a fixed
cooling state (lower == upper in the cooling-maps), turning the fan speed
into a function of the actual temperature band. The multiple trips also
give the tsens hardware several thresholds to raise an interrupt on, so
the fan is re-evaluated whenever the temperature crosses a band boundary
instead of only when leaving the single operating point. The zone is now
purely interrupt driven, so the polling-delay is dropped.

This also shifts fan enablement to a higher starting point: the fan now
first engages at 50C rather than 32C as the fan was spinning almost all
the time at such low threshold. The values are picked based on empirical
board testing.

Signed-off-by: Loic Poulain <loic.poulain@oss.qualcomm.com>
---
 arch/arm64/boot/dts/qcom/monaco-arduino-monza.dts | 47 +++++++++++++++++++----
 1 file changed, 39 insertions(+), 8 deletions(-)

diff --git a/arch/arm64/boot/dts/qcom/monaco-arduino-monza.dts b/arch/arm64/boot/dts/qcom/monaco-arduino-monza.dts
index d1346ca5dd4ef75072b09afd78e914e3f6b12534..40470286eaf98a0f08ede191957c7f0668077685 100644
--- a/arch/arm64/boot/dts/qcom/monaco-arduino-monza.dts
+++ b/arch/arm64/boot/dts/qcom/monaco-arduino-monza.dts
@@ -452,20 +452,51 @@ &pcieport1 {
 
 &thermal_zones {
 	cpuss-0-0-thermal {
-		polling-delay = <2000>;
-
 		trips {
-			cpuss0_active: cpuss-active {
-				temperature = <32000>;
-				hysteresis = <2000>;
+			cpuss0_active0: cpuss-active0 {
+				temperature = <50000>;
+				hysteresis = <4000>;
+				type = "active";
+			};
+
+			cpuss0_active1: cpuss-active1 {
+				temperature = <60000>;
+				hysteresis = <4000>;
+				type = "active";
+			};
+
+			cpuss0_active2: cpuss-active2 {
+				temperature = <70000>;
+				hysteresis = <4000>;
+				type = "active";
+			};
+
+			cpuss0_active3: cpuss-active3 {
+				temperature = <80000>;
+				hysteresis = <4000>;
 				type = "active";
 			};
 		};
 
 		cooling-maps {
-			map-active {
-				trip = <&cpuss0_active>;
-				cooling-device = <&fan 0 THERMAL_NO_LIMIT>;
+			map-active0 {
+				trip = <&cpuss0_active0>;
+				cooling-device = <&fan 4 4>;
+			};
+
+			map-active1 {
+				trip = <&cpuss0_active1>;
+				cooling-device = <&fan 6 6>;
+			};
+
+			map-active2 {
+				trip = <&cpuss0_active2>;
+				cooling-device = <&fan 8 8>;
+			};
+
+			map-active3 {
+				trip = <&cpuss0_active3>;
+				cooling-device = <&fan 10 10>;
 			};
 		};
 	};

---
base-commit: 2edbea82d8edbddb2a235b8f988f17b86f075476
change-id: 20260722-fix-fan-monza-7c27404fe7e3

Best regards,
-- 
Loic Poulain <loic.poulain@oss.qualcomm.com>
Re: [PATCH] arm64: dts: qcom: monaco-arduino-monza: Rework fan cooling map
Posted by Konrad Dybcio 9 hours ago
On 7/24/26 9:50 AM, Loic Poulain wrote:
> The fan thermal zone previously had a single "active" trip at 32C mapped
> to the fan over the full cooling range (<&fan 0 THERMAL_NO_LIMIT>). With
> the default step_wise governor this only ramps the fan one step per poll
> according to the thermal trend, so the fan speed tracked whether the
> temperature was rising or falling rather than the temperature itself.

[...]

> +			map-active2 {
> +				trip = <&cpuss0_active2>;
> +				cooling-device = <&fan 8 8>;
> +			};
> +
> +			map-active3 {
> +				trip = <&cpuss0_active3>;
> +				cooling-device = <&fan 10 10>;
>  			};

No NO_LIMIT at the end?

Konrad