meta-facebook: catalina: catalina-sys-init: enhance i2c bind

We saw catalina-sys-init service failed at bind command somtimes due to
the device already bound.

Implement bind_12c_device() function, Enhance the bind_12c_device()
function to include a check that determines whether the device is
already bound. The function should only execute the bind command if the
device is not currently bound.

Test results:
catalina-sys-init finished successfully.
```
root@bmc:~# systemctl status catalina-sys-init
○ catalina-sys-init.service - Catalina Early System Init
     Loaded: loaded (/usr/lib/systemd/system/catalina-sys-init.service; enabled; preset: enabled)
     Active: inactive (dead) since Thu 2024-08-22 09:21:20 PDT; 25s ago
    Process: 362 ExecStart=/usr/libexec/catalina/catalina-early-sys-init (code=exited, status=0/SUCCESS)
   Main PID: 362 (code=exited, status=0/SUCCESS)
        CPU: 770ms

Aug 22 09:21:17 bmc Catalina Early Init[364]: set_gpio: set stby_power_gd_cpld = 1 success
Aug 22 09:21:17 bmc Catalina Early Init[364]: set_gpio: can not find gpio, USB_HUB_RESET_L
Aug 22 09:21:18 bmc Catalina Early Init[364]: set_gpio: can not find gpio, USB_HUB_RESET_L
Aug 22 09:21:18 bmc Catalina Early Init[364]: set_gpio: set HMC_PGOOD = 1 success
Aug 22 09:21:18 bmc Catalina Early Init[364]: set_gpio: set EROT_FPGA_RST_L = 1 success
Aug 22 09:21:18 bmc Catalina Early Init[364]: set_gpio: set SEC_EROT_FPGA_RST_L = 1 success
Aug 22 09:21:18 bmc Catalina Early Init[364]: set_gpio: set HMC_EROT_RST_L = 1 success
Aug 22 09:21:18 bmc Catalina Early Init[364]: set_gpio: set SCM_HPM_STBY_RST_N = 1 success
Aug 22 09:21:20 bmc systemd[1]: catalina-sys-init.service: Deactivated successfully.
Aug 22 09:21:20 bmc systemd[1]: Finished Catalina Early System Init.
```

Change-Id: I5284b119ff0d6064f421ddb068132440967406d1
Signed-off-by: Potin Lai <potin.lai@quantatw.com>
diff --git a/meta-facebook/meta-catalina/recipes-catalina/plat-svc/files/catalina-early-sys-init b/meta-facebook/meta-catalina/recipes-catalina/plat-svc/files/catalina-early-sys-init
index 2037f89..4f6191b 100644
--- a/meta-facebook/meta-catalina/recipes-catalina/plat-svc/files/catalina-early-sys-init
+++ b/meta-facebook/meta-catalina/recipes-catalina/plat-svc/files/catalina-early-sys-init
@@ -7,16 +7,16 @@
 
 # Workaround
 # rebind PDB i2c mux
-echo 1-0070 > /sys/bus/i2c/drivers/pca954x/bind
+bind_i2c_device pca954x 1-0070
 # rebind PDB Fan IC
-echo 18-0021 > /sys/bus/i2c/drivers/max31790/bind
-echo 18-0027 > /sys/bus/i2c/drivers/max31790/bind
+bind_i2c_device max31790 18-0021
+bind_i2c_device max31790 18-0027
 # rebind PDB FRU
-echo 21-0054 > /sys/bus/i2c/drivers/at24/bind
+bind_i2c_device at24 21-0054
+bind_i2c_device at24 21-0054
 # rebind OSFP FRU
-echo 22-0051 > /sys/bus/i2c/drivers/at24/bind
+bind_i2c_device at24 22-0051
 # rebind FIO FRU
-echo 23-0053 > /sys/bus/i2c/drivers/at24/bind
-
+bind_i2c_device at24 23-0053
 
 exit 0
diff --git a/meta-facebook/meta-catalina/recipes-catalina/plat-svc/files/standby-power-enable b/meta-facebook/meta-catalina/recipes-catalina/plat-svc/files/standby-power-enable
index f5987b0..72cbd19 100644
--- a/meta-facebook/meta-catalina/recipes-catalina/plat-svc/files/standby-power-enable
+++ b/meta-facebook/meta-catalina/recipes-catalina/plat-svc/files/standby-power-enable
@@ -40,58 +40,58 @@
 {
     # Module 0 I2C Mux
     # i2c24 - i2c27
-    echo "0-0071" > /sys/bus/i2c/drivers/pca954x/bind
+    bind_i2c_device pca954x 0-0071
     # i2c28 - i2c31
-    echo "0-0072" > /sys/bus/i2c/drivers/pca954x/bind
+    bind_i2c_device pca954x 0-0072
     # i2c32 - i2c35
-    echo "0-0073" > /sys/bus/i2c/drivers/pca954x/bind
+    bind_i2c_device pca954x 0-0073
 
     # Module 1 I2C Mux
     # i2c36 - i2c39
-    echo "0-0075" > /sys/bus/i2c/drivers/pca954x/bind
+    bind_i2c_device pca954x 0-0075
     # i2c40 - i2c43
-    echo "0-0076" > /sys/bus/i2c/drivers/pca954x/bind
+    bind_i2c_device pca954x 0-0076
     # i2c44 - i2c47
-    echo "0-0077" > /sys/bus/i2c/drivers/pca954x/bind
+    bind_i2c_device pca954x 0-0077
 
     # HDD Board I2C Mux, i2c48 - i2c55
-    echo "30-0070" > /sys/bus/i2c/drivers/pca954x/bind
+    bind_i2c_device pca954x 30-0070
 }
 
 bind_gpio_expanders()
 {
     # Module 0 IOEXP
-    echo "2-0020" > /sys/bus/i2c/drivers/pca953x/bind
+    bind_i2c_device pca953x 2-0020
     # Module 1 IOEXP
-    echo "2-0021" > /sys/bus/i2c/drivers/pca953x/bind
+    bind_i2c_device pca953x 2-0021
     # HMC IOEXP
-    echo "2-0027" > /sys/bus/i2c/drivers/pca953x/bind
+    bind_i2c_device pca953x 2-0027
     # BMC IOEXP
-    echo "6-0021" > /sys/bus/i2c/drivers/pca953x/bind
+    bind_i2c_device pca953x 6-0021
     # IO Mezz 0 IOEXP
-    echo "29-0020" > /sys/bus/i2c/drivers/pca953x/bind
+    bind_i2c_device pca953x 29-0020
     # IO Mezz 1 IOEXP
-    echo "41-0021" > /sys/bus/i2c/drivers/pca953x/bind
+    bind_i2c_device pca953x 41-0021
 }
 
 bind_fru_eeproms()
 {
     # Module 0 FRU
-    echo "13-0050" /sys/bus/i2c/drivers/at24/bind
+    bind_i2c_device at24 13-0050
     # Module 1 FRU
-    echo "12-0050" /sys/bus/i2c/drivers/at24/bind
+    bind_i2c_device at24 12-0050
     # HMC FRU
-    echo "13-0057" /sys/bus/i2c/drivers/at24/bind
+    bind_i2c_device at24 13-0057
     # Left CBC FRU
-    echo "13-0054" /sys/bus/i2c/drivers/at24/bind
+    bind_i2c_device at24 13-0054
     # Right CBC FRU
-    echo "13-0055" /sys/bus/i2c/drivers/at24/bind
+    bind_i2c_device at24 13-0055
     # IO Mezz 0 FRU
-    echo "29-0050" /sys/bus/i2c/drivers/at24/bind
+    bind_i2c_device at24 29-0050
     # IO Mezz 1 FRU
-    echo "41-0050" /sys/bus/i2c/drivers/at24/bind
+    bind_i2c_device at24 41-0050
     # HDD Board FRU
-    echo "54-0052" /sys/bus/i2c/drivers/at24/bind
+    bind_i2c_device at24 54-0052
 }
 
 reset_host_usb()
diff --git a/meta-facebook/recipes-fb/obmc_functions/files/fb-common-functions b/meta-facebook/recipes-fb/obmc_functions/files/fb-common-functions
index b04332a..d073b66 100644
--- a/meta-facebook/recipes-fb/obmc_functions/files/fb-common-functions
+++ b/meta-facebook/recipes-fb/obmc_functions/files/fb-common-functions
@@ -37,3 +37,15 @@
     echo " success"
     return 0
 }
+
+bind_i2c_device()
+{
+    DRIVER_NAME="$1"
+    DEV_BUS_ADDR="$2"
+    DRIVER_DIR_PATH="/sys/bus/i2c/drivers/${DRIVER_NAME}"
+    DRIVER_BIND_PATH="${DRIVER_DIR_PATH}/bind"
+    if [ ! -L "${DRIVER_DIR_PATH}/${DEV_BUS_ADDR}" ]; then
+        echo "bind_i2c_device: $DRIVER_NAME, $DEV_BUS_ADDR"
+        echo "${DEV_BUS_ADDR}" > "${DRIVER_BIND_PATH}"
+    fi
+}