meta-fii: meta-mori: Add pwm_init package

Add pwm_init service to set fans to pwm mode and initialise them to a value of 50% on boot.

Signed-off-by: Ashwin Murali <ashwin.murali@fii-na.com>
Change-Id: I07963eda9b0c264e66d1dd4f2a0d31f4e74d831e
diff --git a/meta-fii/meta-mori/recipes-phosphor/fans/pwm-init.bb b/meta-fii/meta-mori/recipes-phosphor/fans/pwm-init.bb
new file mode 100644
index 0000000..97daab6
--- /dev/null
+++ b/meta-fii/meta-mori/recipes-phosphor/fans/pwm-init.bb
@@ -0,0 +1,29 @@
+SUMMARY = "Initialize PWM sensors"
+DESCRIPTION = "Initialize PWM sensors"
+LICENSE = "CLOSED"
+PR = "r1"
+
+inherit systemd
+
+DEPENDS = "systemd"
+RDEPENDS:${PN} = "bash"
+
+S = "${WORKDIR}"
+FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
+SRC_URI += " \
+    file://pwm_init.service \
+    file://bin/pwm_init.sh \
+    "
+
+SYSTEMD_PACKAGES = "${PN}"
+SYSTEMD_AUTO_ENABLE = "enable"
+SYSTEMD_SERVICE:${PN} += "pwm_init.service"
+
+FILES:${PN} += "${bindir}/* ${systemd_system_unitdir}/*"
+
+do_install:append() {
+    install -d ${D}${libexecdir}/${PN}
+    install -m 0755 ${S}/bin/* ${D}${libexecdir}/${PN}/
+    install -d ${D}${systemd_system_unitdir}
+    install -m 0644 ${S}/*.service ${D}${systemd_system_unitdir}
+}
diff --git a/meta-fii/meta-mori/recipes-phosphor/fans/pwm-init/bin/pwm_init.sh b/meta-fii/meta-mori/recipes-phosphor/fans/pwm-init/bin/pwm_init.sh
new file mode 100644
index 0000000..d1d7df1
--- /dev/null
+++ b/meta-fii/meta-mori/recipes-phosphor/fans/pwm-init/bin/pwm_init.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+#
+
+# Provide source directive to shellcheck.
+# shellcheck source=meta-fii/meta-mori/recipes-mori/mori-fw-utility/mori-fw/mori-lib.sh
+source /usr/libexec/mori-fw/mori-lib.sh
+
+
+# Set all pwm to 50%
+find /sys/class/hwmon/hwmon*/ -name 'pwm[1-6]' -exec bash -c 'echo "$1" && echo 127 > "$1" && cat "$1"' -- {} \;
+
+
+# Set all fans to pwm mode.
+find /sys/class/hwmon/hwmon*/ -name 'pwm*_enable' -exec bash -c 'echo "$1" && echo 1 > "$1" && cat "$1"' -- {} \;
+
+
+for i in {0..5}
+do
+    fan_pwm_rate_of_change=0x$(printf '%02x' $((8 + i)) | \
+            awk '{print $1}')
+    # Set Fan PWM Rate-of-Change Bits(bits 4:2) to 000b
+    # Register 08h to 0Dh
+    oriRegVal=$(i2cget -y -f "${I2C_FANCTRL[0]}" 0x"${I2C_FANCTRL[1]}" \
+        "$fan_pwm_rate_of_change")
+    updateVal=$((oriRegVal & 0xe3))
+    updateVal=0x$(printf "%x" $updateVal)
+    i2cset -y -f "${I2C_FANCTRL[0]}" 0x"${I2C_FANCTRL[1]}" \
+        "$fan_pwm_rate_of_change" "$updateVal"
+done
+
diff --git a/meta-fii/meta-mori/recipes-phosphor/fans/pwm-init/pwm_init.service b/meta-fii/meta-mori/recipes-phosphor/fans/pwm-init/pwm_init.service
new file mode 100644
index 0000000..351d5f1
--- /dev/null
+++ b/meta-fii/meta-mori/recipes-phosphor/fans/pwm-init/pwm_init.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Init PWM sensors
+Before=xyz.openbmc_project.fansensor.service
+
+[Service]
+Type=oneshot
+ExecStart=/usr/libexec/pwm-init/pwm_init.sh
+
+[Install]
+WantedBy=multi-user.target
+WantedBy=xyz.openbmc_project.fansensor.service
diff --git a/meta-fii/meta-mori/recipes-phosphor/image/obmc-phosphor-image.bbappend b/meta-fii/meta-mori/recipes-phosphor/image/obmc-phosphor-image.bbappend
index 7d3a1ad..88d0fa9 100644
--- a/meta-fii/meta-mori/recipes-phosphor/image/obmc-phosphor-image.bbappend
+++ b/meta-fii/meta-mori/recipes-phosphor/image/obmc-phosphor-image.bbappend
@@ -32,6 +32,7 @@
 OBMC_IMAGE_EXTRA_INSTALL:append:mori = " fru-device"
 OBMC_IMAGE_EXTRA_INSTALL:append:mori = " dbus-sensors"
 OBMC_IMAGE_EXTRA_INSTALL:append:mori = " estoraged"
+OBMC_IMAGE_EXTRA_INSTALL:append:mori = " pwm-init"
 OBMC_IMAGE_EXTRA_INSTALL:append:mori = " phosphor-pid-control"
 OBMC_IMAGE_EXTRA_INSTALL:append:mori = " phosphor-logging"
 OBMC_IMAGE_EXTRA_INSTALL:append:mori = " mori-cmd"