[openwrt/openwrt] realtek: add fan controller support to D-Link DGS-1210-28MP

LEDE Commits lede-commits at lists.infradead.org
Sun Sep 15 07:44:41 PDT 2024


svanheule pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/3c152904c22fb6754820e36a0b7bd20b90b64dc1

commit 3c152904c22fb6754820e36a0b7bd20b90b64dc1
Author: Andreas Böhler <dev at aboehler.at>
AuthorDate: Sat Jun 1 19:28:22 2024 +0200

    realtek: add fan controller support to D-Link DGS-1210-28MP
    
    The DGS-1210-28MP has a LM63 fan controller connected via i2c of the
    RTL8231. The clock line is always low if the property
    i2c-gpio,scl-open-drain is not set; with this property, the GPIO pin is
    force-drive and the clock works as expected.
    
    The LM63 is not configured by U-Boot, thus only manual fan control is
    possible by settings pwm1_enable to "1" and writing the desired values to
    pwm1.
    
    The OEM firmware drives the fan from user mode and sets it up like this:
    
    // PWM LUT/value r/w, PWM Clock = 1.4kHz
    0x4a 0x28
    // Tachometer spinup disabled, spin-up cycles bypassed
    0x4b 0x00
    // PWM Frequency = default
    0x4d 0x17
    // PWM Value (28)
    0x4c 0x1c
    // If > 0 C, use
    0x50 0x00
    // PWM = 28
    0x51 0x1c
    // If > 51 C, use
    0x52 0x33
    // PWM = 44
    0x53 0x2e
    // Set hysteresis to 100 = default
    0x4f 0x03
    // Turn on automatic mode and w/p the LUT values
    0x4a 0x08
    
    A thread in the OEM firmware polls the ALERT status register for fan
    failures.
    
    Unfortunately, the lm63 kernel driver does not perform any initialization
    of the chip and it does not support changing some config registers (like
    PWM frequency or LUT). Hence, we are stuck with the defaults and need to do
    fan control in software.
    
    Signed-off-by: Andreas Böhler <dev at aboehler.at>
    Link: https://github.com/openwrt/openwrt/pull/15616
    Signed-off-by: Sander Vanheule <sander at svanheule.net>
---
 .../base-files/etc/uci-defaults/04_dlinkfan        | 26 ++++++++++++++++++++++
 target/linux/realtek/base-files/sbin/fan_ctrl.sh   | 13 +++++++++++
 .../realtek/dts/rtl8382_d-link_dgs-1210-28mp-f.dts | 16 +++++++++++++
 target/linux/realtek/image/rtl838x.mk              |  2 +-
 4 files changed, 56 insertions(+), 1 deletion(-)

diff --git a/target/linux/realtek/base-files/etc/uci-defaults/04_dlinkfan b/target/linux/realtek/base-files/etc/uci-defaults/04_dlinkfan
new file mode 100644
index 0000000000..1a5fd3606f
--- /dev/null
+++ b/target/linux/realtek/base-files/etc/uci-defaults/04_dlinkfan
@@ -0,0 +1,26 @@
+#
+# Copyright (C) 2024 openwrt.org
+#
+
+. /lib/functions.sh
+
+board=$(board_name)
+
+case "$board" in
+d-link,dgs-1210-28mp-f)
+	# Enable fan control
+	FAN_CTRL='/sys/class/hwmon/hwmon0'
+	echo 1 > "$FAN_PATH/pwm1_enable"
+
+	# Set fan script execution in crontab
+	grep -s -q fan_ctrl.sh /etc/crontabs/root && exit 0
+
+	echo "# dlink fan script runs every 5 minutes" >> /etc/crontabs/root
+	echo "*/5 * * * * /sbin/fan_ctrl.sh" >> /etc/crontabs/root
+
+	# Execute one time after initial flash (instead of waiting 5 min for cron)
+	/sbin/fan_ctrl.sh
+	;;
+esac
+
+exit 0
diff --git a/target/linux/realtek/base-files/sbin/fan_ctrl.sh b/target/linux/realtek/base-files/sbin/fan_ctrl.sh
new file mode 100755
index 0000000000..e7b661d7bb
--- /dev/null
+++ b/target/linux/realtek/base-files/sbin/fan_ctrl.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+PSU_TEMP=$(cut -c1-2 /sys/class/hwmon/hwmon0/temp1_input)
+
+FAN_CTRL='/sys/class/hwmon/hwmon0/pwm1'
+
+PSU_THRESH=51000
+
+if [ "$PSU_TEMP" -ge "$PSU_THRESH" ];then
+	echo "250" > $FAN_CTRL
+else
+	echo "156" > $FAN_CTRL
+fi
diff --git a/target/linux/realtek/dts/rtl8382_d-link_dgs-1210-28mp-f.dts b/target/linux/realtek/dts/rtl8382_d-link_dgs-1210-28mp-f.dts
index d1419cf7ed..4c20a4ae6e 100644
--- a/target/linux/realtek/dts/rtl8382_d-link_dgs-1210-28mp-f.dts
+++ b/target/linux/realtek/dts/rtl8382_d-link_dgs-1210-28mp-f.dts
@@ -9,6 +9,22 @@
 / {
 	compatible = "d-link,dgs-1210-28mp-f", "realtek,rtl8382-soc", "realtek,rtl838x-soc";
 	model = "D-Link DGS-1210-28MP F";
+
+	/* LM63 */
+	i2c-gpio-4 {
+		compatible = "i2c-gpio";
+		sda-gpios = <&gpio1 32 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+		scl-gpios = <&gpio1 31 GPIO_ACTIVE_HIGH>;
+		i2c-gpio,delay-us = <2>;
+		i2c-gpio,scl-open-drain; /* should be replaced by i2c-gpio,scl-has-no-pullup in kernel 6.6 */
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		lm63 at 4c {
+			compatible = "national,lm63";
+			reg = <0x4c>;
+		};
+	};
 };
 
 &leds {
diff --git a/target/linux/realtek/image/rtl838x.mk b/target/linux/realtek/image/rtl838x.mk
index 05574e5375..c44e3a74f7 100644
--- a/target/linux/realtek/image/rtl838x.mk
+++ b/target/linux/realtek/image/rtl838x.mk
@@ -71,7 +71,7 @@ define Device/d-link_dgs-1210-28mp-f
   SOC := rtl8382
   DEVICE_MODEL := DGS-1210-28MP
   DEVICE_VARIANT := F
-  DEVICE_PACKAGES += realtek-poe
+  DEVICE_PACKAGES += realtek-poe kmod-hwmon-lm63
 endef
 TARGET_DEVICES += d-link_dgs-1210-28mp-f
 




More information about the lede-commits mailing list