Because of the SoM+Dock design of Lichee Pi 4A, heat dissipation does
not work well; fortunately it comes with a fan port with PWM driving
capability.
As the hardware PWM controller of Lichee Pi 4A isn't ready yet, drive it
with pwm-gpio driver (software PWM) now.
A long PWM period is used, because not only software PWM is used, but
also the fan port is a 2-pin one and fast PWM might confuse the BLDC
driver on fans.
Signed-off-by: Icenowy Zheng <uwu@icenowy.me>
---
.../boot/dts/thead/th1520-lichee-pi-4a.dts | 53 +++++++++++++++++++
arch/riscv/boot/dts/thead/th1520.dtsi | 2 +-
2 files changed, 54 insertions(+), 1 deletion(-)
diff --git a/arch/riscv/boot/dts/thead/th1520-lichee-pi-4a.dts b/arch/riscv/boot/dts/thead/th1520-lichee-pi-4a.dts
index 4020c727f09e8..f696db01353c5 100644
--- a/arch/riscv/boot/dts/thead/th1520-lichee-pi-4a.dts
+++ b/arch/riscv/boot/dts/thead/th1520-lichee-pi-4a.dts
@@ -4,6 +4,7 @@
*/
#include "th1520-lichee-module-4a.dtsi"
+#include <dt-bindings/gpio/gpio.h>
/ {
model = "Sipeed Lichee Pi 4A";
@@ -28,6 +29,58 @@ aliases {
chosen {
stdout-path = "serial0:115200n8";
};
+
+ gpio_pwm: gpio-pwm {
+ #pwm-cells = <3>;
+ compatible = "pwm-gpio";
+ gpios = <&gpio3 3 GPIO_ACTIVE_HIGH>;
+ };
+
+ fan: pwm-fan {
+ compatible = "pwm-fan";
+ #cooling-cells = <2>;
+ pwms = <&gpio_pwm 0 100000000 0>;
+ cooling-levels = <0 66 196 255>;
+ };
+};
+
+&cpu_thermal_zone {
+ trips {
+ fan_trip0: fan-trip-0 {
+ temperature = <40000>;
+ hysteresis = <8000>;
+ type = "active";
+ };
+
+ fan_trip1: fan-trip-1 {
+ temperature = <50000>;
+ hysteresis = <8000>;
+ type = "active";
+ };
+
+ fan_trip2: fan-trip-2 {
+ temperature = <60000>;
+ hysteresis = <8000>;
+ type = "active";
+ };
+ };
+
+ cooling-maps {
+ map-active-0 {
+ cooling-device = <&fan 1 1>;
+ trip = <&fan_trip0>;
+ };
+
+ map-active-1 {
+ cooling-device = <&fan 2 2>;
+ trip = <&fan_trip1>;
+ };
+
+ map-active-2 {
+ cooling-device = <&fan 3 3>;
+ trip = <&fan_trip2>;
+ };
+ };
};
&padctrl0_apsys {
diff --git a/arch/riscv/boot/dts/thead/th1520.dtsi b/arch/riscv/boot/dts/thead/th1520.dtsi
index a48eca5def606..5ac8044a05f1e 100644
--- a/arch/riscv/boot/dts/thead/th1520.dtsi
+++ b/arch/riscv/boot/dts/thead/th1520.dtsi
@@ -703,7 +703,7 @@ gpio4: gpio-controller@0 {
};
thermal-zones {
- cpu-thermal {
+ cpu_thermal_zone: cpu-thermal {
polling-delay-passive = <250>;
polling-delay = <15000>;
--
2.50.1
On Sat, Aug 16, 2025 at 05:32:09PM +0800, Icenowy Zheng wrote: > Because of the SoM+Dock design of Lichee Pi 4A, heat dissipation does > not work well; fortunately it comes with a fan port with PWM driving > capability. > > As the hardware PWM controller of Lichee Pi 4A isn't ready yet, drive it > with pwm-gpio driver (software PWM) now. > > A long PWM period is used, because not only software PWM is used, but > also the fan port is a 2-pin one and fast PWM might confuse the BLDC > driver on fans. > > Signed-off-by: Icenowy Zheng <uwu@icenowy.me> > --- > .../boot/dts/thead/th1520-lichee-pi-4a.dts | 53 +++++++++++++++++++ > arch/riscv/boot/dts/thead/th1520.dtsi | 2 +- > 2 files changed, 54 insertions(+), 1 deletion(-) > > diff --git a/arch/riscv/boot/dts/thead/th1520-lichee-pi-4a.dts b/arch/riscv/boot/dts/thead/th1520-lichee-pi-4a.dts > index 4020c727f09e8..f696db01353c5 100644 > --- a/arch/riscv/boot/dts/thead/th1520-lichee-pi-4a.dts > +++ b/arch/riscv/boot/dts/thead/th1520-lichee-pi-4a.dts > @@ -4,6 +4,7 @@ > */ > > #include "th1520-lichee-module-4a.dtsi" > +#include <dt-bindings/gpio/gpio.h> > > / { > model = "Sipeed Lichee Pi 4A"; > @@ -28,6 +29,58 @@ aliases { > chosen { > stdout-path = "serial0:115200n8"; > }; > + > + gpio_pwm: gpio-pwm { > + #pwm-cells = <3>; > + compatible = "pwm-gpio"; > + gpios = <&gpio3 3 GPIO_ACTIVE_HIGH>; > + }; I think the node name needs to be 'pwm' instead of 'gpio-pwm' as dtbs_check warns that: gpio-pwm: $nodename:0: 'gpio-pwm' does not match '^pwm(@.*|-([0-9]|[1-9][0-9]+))?$' from schema $id: http://devicetree.org/schemas/pwm/pwm-gpio.yaml# Thanks, Drew
在 2025-08-22星期五的 14:32 -0700,Drew Fustini写道: > On Sat, Aug 16, 2025 at 05:32:09PM +0800, Icenowy Zheng wrote: > > Because of the SoM+Dock design of Lichee Pi 4A, heat dissipation > > does > > not work well; fortunately it comes with a fan port with PWM > > driving > > capability. > > > > As the hardware PWM controller of Lichee Pi 4A isn't ready yet, > > drive it > > with pwm-gpio driver (software PWM) now. > > > > A long PWM period is used, because not only software PWM is used, > > but > > also the fan port is a 2-pin one and fast PWM might confuse the > > BLDC > > driver on fans. > > > > Signed-off-by: Icenowy Zheng <uwu@icenowy.me> > > --- > > .../boot/dts/thead/th1520-lichee-pi-4a.dts | 53 > > +++++++++++++++++++ > > arch/riscv/boot/dts/thead/th1520.dtsi | 2 +- > > 2 files changed, 54 insertions(+), 1 deletion(-) > > > > diff --git a/arch/riscv/boot/dts/thead/th1520-lichee-pi-4a.dts > > b/arch/riscv/boot/dts/thead/th1520-lichee-pi-4a.dts > > index 4020c727f09e8..f696db01353c5 100644 > > --- a/arch/riscv/boot/dts/thead/th1520-lichee-pi-4a.dts > > +++ b/arch/riscv/boot/dts/thead/th1520-lichee-pi-4a.dts > > @@ -4,6 +4,7 @@ > > */ > > > > #include "th1520-lichee-module-4a.dtsi" > > +#include <dt-bindings/gpio/gpio.h> > > > > / { > > model = "Sipeed Lichee Pi 4A"; > > @@ -28,6 +29,58 @@ aliases { > > chosen { > > stdout-path = "serial0:115200n8"; > > }; > > + > > + gpio_pwm: gpio-pwm { > > + #pwm-cells = <3>; > > + compatible = "pwm-gpio"; > > + gpios = <&gpio3 3 GPIO_ACTIVE_HIGH>; > > + }; > > I think the node name needs to be 'pwm' instead of 'gpio-pwm' as > dtbs_check > warns that: Sounds reasonable, although 'pwm' seems to be too generic. But the recommended names below looks quite generic too... Is it just some copy-pasta? Well, maybe just take 'pwm' or 'pwm-0' now? > > gpio-pwm: $nodename:0: 'gpio-pwm' does not match '^pwm(@.*|-([0- > 9]|[1-9][0-9]+))?$' > from schema $id: http://devicetree.org/schemas/pwm/pwm-gpio.yaml# > > Thanks, > Drew
On Sat, Aug 16, 2025 at 05:32:09PM +0800, Icenowy Zheng wrote: > Because of the SoM+Dock design of Lichee Pi 4A, heat dissipation does > not work well; fortunately it comes with a fan port with PWM driving > capability. > > As the hardware PWM controller of Lichee Pi 4A isn't ready yet, drive it > with pwm-gpio driver (software PWM) now. > > A long PWM period is used, because not only software PWM is used, but > also the fan port is a 2-pin one and fast PWM might confuse the BLDC > driver on fans. > > Signed-off-by: Icenowy Zheng <uwu@icenowy.me> > --- > .../boot/dts/thead/th1520-lichee-pi-4a.dts | 53 +++++++++++++++++++ > arch/riscv/boot/dts/thead/th1520.dtsi | 2 +- > 2 files changed, 54 insertions(+), 1 deletion(-) Is it possible to reconcile the work that Michal is doing with the hardware PWM controller series [1] and this series? The PWM controller does need Rust which works okay for me when using llvm but that might not be the case for everyone. Maybe there is some way to use the pwm controller if available and then failback to gpio if not. Thanks, Drew [1] https://lore.kernel.org/linux-riscv/20250806-rust-next-pwm-working-fan-for-sending-v13-7-690b669295b6@samsung.com/
© 2016 - 2025 Red Hat, Inc.