Skip to content

Commit

Permalink
realtek: add fan controller support to D-Link DGS-1210-28MP
Browse files Browse the repository at this point in the history
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 <[email protected]>
Link: openwrt#15616
Signed-off-by: Sander Vanheule <[email protected]>
  • Loading branch information
andyboeh authored and svanheule committed Sep 15, 2024
1 parent 257a356 commit 3c15290
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 1 deletion.
26 changes: 26 additions & 0 deletions target/linux/realtek/base-files/etc/uci-defaults/04_dlinkfan
Original file line number Diff line number Diff line change
@@ -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
13 changes: 13 additions & 0 deletions target/linux/realtek/base-files/sbin/fan_ctrl.sh
Original file line number Diff line number Diff line change
@@ -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
16 changes: 16 additions & 0 deletions target/linux/realtek/dts/rtl8382_d-link_dgs-1210-28mp-f.dts
Original file line number Diff line number Diff line change
Expand Up @@ -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@4c {
compatible = "national,lm63";
reg = <0x4c>;
};
};
};

&leds {
Expand Down
2 changes: 1 addition & 1 deletion target/linux/realtek/image/rtl838x.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down

0 comments on commit 3c15290

Please sign in to comment.