Refactor MCU status word and MCU firmware features reading to make it
simpler to use.

Signed-off-by: Marek Behún <[email protected]>
---
 board/CZ.NIC/turris_omnia/turris_omnia.c | 81 ++++++++++++++++--------
 1 file changed, 53 insertions(+), 28 deletions(-)

diff --git a/board/CZ.NIC/turris_omnia/turris_omnia.c 
b/board/CZ.NIC/turris_omnia/turris_omnia.c
index adeb69a205b..b285e959d06 100644
--- a/board/CZ.NIC/turris_omnia/turris_omnia.c
+++ b/board/CZ.NIC/turris_omnia/turris_omnia.c
@@ -172,6 +172,48 @@ static int omnia_mcu_write(u8 cmd, const void *buf, int 
len)
        return dm_i2c_write(chip, cmd, buf, len);
 }
 
+static int omnia_mcu_get_sts_and_features(u16 *psts, u16 *pfeatures)
+{
+       u16 sts;
+       int ret;
+
+       ret = omnia_mcu_read(CMD_GET_STATUS_WORD, &sts, sizeof(sts));
+       if (ret)
+               return ret;
+
+       if (psts)
+               *psts = sts;
+
+       if (!pfeatures)
+               return 0;
+
+       if (sts & STS_FEATURES_SUPPORTED) {
+               ret = omnia_mcu_read(CMD_GET_FEATURES, pfeatures,
+                                    sizeof(*pfeatures));
+               if (ret)
+                       return ret;
+       } else {
+               *pfeatures = 0;
+       }
+
+       return 0;
+}
+
+static int omnia_mcu_get_sts(u16 *sts)
+{
+       return omnia_mcu_get_sts_and_features(sts, NULL);
+}
+
+static bool omnia_mcu_has_feature(u16 feature)
+{
+       u16 features;
+
+       if (omnia_mcu_get_sts_and_features(NULL, &features))
+               return false;
+
+       return feature & features;
+}
+
 static void enable_a385_watchdog(unsigned int timeout_minutes)
 {
        struct sar_freq_modes sar_freq;
@@ -249,7 +291,7 @@ static bool omnia_detect_sata(const char *msata_slot)
                }
        }
 
-       ret = omnia_mcu_read(CMD_GET_STATUS_WORD, &stsword, sizeof(stsword));
+       ret = omnia_mcu_get_sts(&stsword);
        if (ret) {
                printf("omnia_mcu_read failed: %i, defaulting to MiniPCIe 
card\n",
                       ret);
@@ -405,20 +447,17 @@ static const char * const omnia_get_mcu_type(void)
                [STS_MCU_TYPE_MKL]   = "MKL (with peripheral resets)",
                [STS_MCU_TYPE_UNKN]  = "unknown (with peripheral resets)",
        };
-       u16 stsword, features;
+       u16 sts;
        int ret;
 
-       ret = omnia_mcu_read(CMD_GET_STATUS_WORD, &stsword, sizeof(stsword));
+       ret = omnia_mcu_get_sts(&sts);
        if (ret)
                return "unknown";
 
-       if (stsword & STS_FEATURES_SUPPORTED) {
-               ret = omnia_mcu_read(CMD_GET_FEATURES, &features, 
sizeof(features));
-               if (ret == 0 && (features & FEAT_PERIPH_MCU))
-                       return mcu_types_with_perip_resets[stsword & 
STS_MCU_TYPE_MASK];
-       }
+       if (omnia_mcu_has_feature(FEAT_PERIPH_MCU))
+               return mcu_types_with_perip_resets[sts & STS_MCU_TYPE_MASK];
 
-       return mcu_types[stsword & STS_MCU_TYPE_MASK];
+       return mcu_types[sts & STS_MCU_TYPE_MASK];
 }
 
 static const char * const omnia_get_mcu_version(void)
@@ -695,9 +734,6 @@ int board_early_init_f(void)
 
 void spl_board_init(void)
 {
-       u16 val;
-       int ret;
-
        /*
         * If booting from UART, disable MCU watchdog in SPL, since uploading
         * U-Boot proper can take too much time and trigger it. Instead enable
@@ -714,12 +750,8 @@ void spl_board_init(void)
         * resets then LAN eth switch is initialized automatically by bootstrap
         * pins when A385 is released from the reset.
         */
-       ret = omnia_mcu_read(CMD_GET_STATUS_WORD, &val, sizeof(val));
-       if (ret == 0 && (val & STS_FEATURES_SUPPORTED)) {
-               ret = omnia_mcu_read(CMD_GET_FEATURES, &val, sizeof(val));
-               if (ret == 0 && (val & FEAT_PERIPH_MCU))
-                       initialize_switch();
-       }
+       if (omnia_mcu_has_feature(FEAT_PERIPH_MCU))
+               initialize_switch();
 }
 
 #if IS_ENABLED(CONFIG_OF_BOARD_FIXUP) || IS_ENABLED(CONFIG_OF_BOARD_SETUP)
@@ -919,16 +951,9 @@ static int fixup_mcu_gpio_in_eth_wan_node(void *blob)
 #if IS_ENABLED(CONFIG_OF_BOARD_FIXUP)
 int board_fix_fdt(void *blob)
 {
-       u16 val;
-       int ret;
-
-       ret = omnia_mcu_read(CMD_GET_STATUS_WORD, &val, sizeof(val));
-       if (ret == 0 && (val & STS_FEATURES_SUPPORTED)) {
-               ret = omnia_mcu_read(CMD_GET_FEATURES, &val, sizeof(val));
-               if (ret == 0 && (val & FEAT_PERIPH_MCU)) {
-                       fixup_mcu_gpio_in_pcie_nodes(blob);
-                       fixup_mcu_gpio_in_eth_wan_node(blob);
-               }
+       if (omnia_mcu_has_feature(FEAT_PERIPH_MCU)) {
+               fixup_mcu_gpio_in_pcie_nodes(blob);
+               fixup_mcu_gpio_in_eth_wan_node(blob);
        }
 
        fixup_msata_port_nodes(blob);
-- 
2.43.0

Reply via email to