meta-nuvoton: evb-npcm845: fans: add temp and fan configuration

Enable fan control and apply configuration for Arbel EVB.

Tested:
root@:~# systemctl status phosphor-pid-control.service
* phosphor-pid-control.service - OpenBMC Fan Control Daemon
     Active: active (running) since Tue 2024-02-27 17:26:53 UTC;

swampd[881]: pid: EVB_Temp failSafePercent: 0
swampd[881]: pid: Fan4 failSafePercent: 0
swampd[881]: Final zone1 failSafePercent: 100
swampd[881]: PID Zone 1 max SetPoint 20 requested by EVB_Temp
swampd[881]: pushing zone 0
swampd[881]: zone: Zone0 zoneFailSafePercent: 100
swampd[881]: pid: Fan1 failSafePercent: 0
swampd[881]: Final zone0 failSafePercent: 100

Signed-off-by: Tim Lee <timlee660101@gmail.com>
Change-Id: I9a375141d9e214be285bcd082f567afa769fe0c5
diff --git a/meta-nuvoton/meta-evb-npcm845/recipes-phosphor/fans/phosphor-pid-control/config-evb-npcm845.json b/meta-nuvoton/meta-evb-npcm845/recipes-phosphor/fans/phosphor-pid-control/config-evb-npcm845.json
new file mode 100644
index 0000000..0c54ba6
--- /dev/null
+++ b/meta-nuvoton/meta-evb-npcm845/recipes-phosphor/fans/phosphor-pid-control/config-evb-npcm845.json
@@ -0,0 +1,149 @@
+{
+    "sensors" : [
+        {
+            "name": "Fan1",
+            "type": "fan",
+            "readPath": "/xyz/openbmc_project/sensors/fan_tach/Fan1",
+            "writePath": "/sys/devices/platform/ahb/ahb:apb/f0103000.pwm-fan-controller/hwmon/**/pwm1",
+            "min": 0,
+            "max": 255
+        },
+        {
+            "name": "Fan2",
+            "type": "fan",
+            "readPath": "/xyz/openbmc_project/sensors/fan_tach/Fan2",
+            "writePath": "/sys/devices/platform/ahb/ahb:apb/f0103000.pwm-fan-controller/hwmon/**/pwm2",
+            "min": 0,
+            "max": 255
+        },
+        {
+            "name": "Fan3",
+            "type": "fan",
+            "readPath": "/xyz/openbmc_project/sensors/fan_tach/Fan3",
+            "writePath": "/sys/devices/platform/ahb/ahb:apb/f0103000.pwm-fan-controller/hwmon/**/pwm3",
+            "min": 0,
+            "max": 255
+        },
+        {
+            "name": "Fan4",
+            "type": "fan",
+            "readPath": "/xyz/openbmc_project/sensors/fan_tach/Fan4",
+            "writePath": "/sys/devices/platform/ahb/ahb:apb/f0103000.pwm-fan-controller/hwmon/**/pwm4",
+            "min": 0,
+            "max": 255
+        },
+        {
+            "name": "EVB_Temp",
+            "type": "temp",
+            "readPath": "/xyz/openbmc_project/sensors/temperature/EVB_Temp",
+            "writePath": "",
+            "ignoreDbusMinMax": true,
+            "timeout": 0
+        }
+    ],
+    "zones" : [
+        {
+            "id": 0,
+            "minThermalOutput": 0.0,
+            "failsafePercent": 100.0,
+            "pids": [
+                {
+                    "name": "Fan1",
+                    "type": "fan",
+                    "inputs": ["Fan1"],
+                    "setpoint": 40.0,
+                    "pid": {
+                        "samplePeriod": 1.0,
+                        "proportionalCoeff": 0.0,
+                        "integralCoeff": 0.0,
+                        "feedFwdOffsetCoeff": 0.0,
+                        "feedFwdGainCoeff": 1.0,
+                        "integralLimit_min": 0.0,
+                        "integralLimit_max": 0.0,
+                        "outLim_min": 10.0,
+                        "outLim_max": 100.0,
+                        "slewNeg": 0.0,
+                        "slewPos": 0.0
+                    }
+                }
+            ]
+        },
+        {
+            "id": 1,
+            "minThermalOutput": 0.0,
+            "failsafePercent": 100.0,
+            "pids": [
+                {
+                    "name": "Fan4",
+                    "type": "fan",
+                    "inputs": ["Fan4"],
+                    "setpoint": 90.0,
+                    "pid": {
+                        "samplePeriod": 0.1,
+                        "proportionalCoeff": 0.0,
+                        "integralCoeff": 0.0,
+                        "feedFwdOffsetCoeff": 0.0,
+                        "feedFwdGainCoeff": 1.0,
+                        "integralLimit_min": 0.0,
+                        "integralLimit_max": 0.0,
+                        "outLim_min": 10.0,
+                        "outLim_max": 100.0,
+                        "slewNeg": 0.0,
+                        "slewPos": 0.0
+                    }
+                },
+                 {
+                    "name": "EVB_Temp",
+                    "type": "stepwise",
+                    "inputs": ["EVB_Temp"],
+                    "setpoint": 30.0,
+                    "pid": {
+                        "samplePeriod": 1.0,
+                        "positiveHysteresis": 0.0,
+                        "negativeHysteresis": 0.0,
+                        "isCeiling": false,
+                        "reading": {
+                            "0": 25,
+                            "1": 28,
+                            "2": 31,
+                            "3": 34,
+                            "4": 37,
+                            "5": 40,
+                            "6": 43,
+                            "7": 46,
+                            "8": 49,
+                            "9": 52,
+                            "10": 55,
+                            "11": 58,
+                            "12": 61,
+                            "13": 64,
+                            "14": 67,
+                            "15": 70
+                        },
+                        "output": {
+                            "0": 10,
+                            "1": 10,
+                            "2": 20,
+                            "3": 20,
+                            "4": 20,
+                            "5": 30,
+                            "6": 30,
+                            "7": 30,
+                            "8": 40,
+                            "9": 50,
+                            "10": 60,
+                            "11": 70,
+                            "12": 80,
+                            "13": 90,
+                            "14": 100,
+                            "15": 100
+                        }
+
+
+                    }
+                }
+
+            ]
+        }
+    ]
+}
diff --git a/meta-nuvoton/meta-evb-npcm845/recipes-phosphor/fans/phosphor-pid-control/phosphor-pid-control.service b/meta-nuvoton/meta-evb-npcm845/recipes-phosphor/fans/phosphor-pid-control/phosphor-pid-control.service
new file mode 100644
index 0000000..19e99ec
--- /dev/null
+++ b/meta-nuvoton/meta-evb-npcm845/recipes-phosphor/fans/phosphor-pid-control/phosphor-pid-control.service
@@ -0,0 +1,14 @@
+[Unit]
+Description=OpenBMC Fan Control Daemon
+After=xyz.openbmc_project.fansensor.service
+
+[Service]
+Type=simple
+ExecStartPre=/usr/bin/env mapper wait /xyz/openbmc_project/sensors/temperature/EVB_Temp
+ExecStart=/usr/bin/swampd
+Restart=always
+RestartSec=5
+StartLimitInterval=0
+
+[Install]
+WantedBy=basic.target
diff --git a/meta-nuvoton/meta-evb-npcm845/recipes-phosphor/fans/phosphor-pid-control_%.bbappend b/meta-nuvoton/meta-evb-npcm845/recipes-phosphor/fans/phosphor-pid-control_%.bbappend
new file mode 100644
index 0000000..a75074f
--- /dev/null
+++ b/meta-nuvoton/meta-evb-npcm845/recipes-phosphor/fans/phosphor-pid-control_%.bbappend
@@ -0,0 +1,21 @@
+FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
+
+SRC_URI:append = " \
+    file://config-evb-npcm845.json \
+    file://phosphor-pid-control.service \
+    "
+
+FILES:${PN}:append = " ${datadir}/swampd/config.json"
+RDEPENDS:${PN} += "bash"
+
+SYSTEMD_SERVICE:${PN}:append = " phosphor-pid-control.service"
+
+do_install:append() {
+    install -d ${D}${datadir}/swampd
+    install -m 0644 -D ${WORKDIR}/config-evb-npcm845.json \
+        ${D}${datadir}/swampd/config.json
+
+    install -d ${D}${systemd_system_unitdir}
+    install -m 0644 ${WORKDIR}/phosphor-pid-control.service \
+        ${D}${systemd_system_unitdir}
+}