]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
board: phytec: phytec_som_detection: Add support for phyFLEX
authorDaniel Schultz <d.schultz@phytec.de>
Mon, 24 Nov 2025 08:25:06 +0000 (00:25 -0800)
committerTom Rini <trini@konsulko.com>
Sun, 7 Dec 2025 14:07:07 +0000 (08:07 -0600)
phyFLEX are SoMs based on the FPSC standard.

Add additional "SOM types" for the phyFLEX modules base on the
FPSC Gamma specification. These modules come in four different
variants; prototypes (PT), standard product (SP), KSP (KP) and
KSM (KM).

Signed-off-by: Daniel Schultz <d.schultz@phytec.de>
Reviewed-by: Teresa Remmet <t.remmet@phytec.de>
Tested-by: Dominik Haller <d.haller@phytec.de>
board/phytec/common/phytec_som_detection.c
board/phytec/common/phytec_som_detection.h

index ff1711c24b499f57482effbd45417f91c75da98b..0e30ed9b1bbcf3f46b86c0a7987a704587e39b5a 100644 (file)
@@ -308,14 +308,24 @@ static int phytec_get_product_name(struct phytec_eeprom_data *data,
        case 7:
                som_type = 1;
                break;
+       case 8:
+       case 9:
+       case 10:
+       case 11:
+               som_type = SOM_TYPE_PFL_G;
+               break;
        default:
                pr_err("%s: Invalid SOM type: %i\n", __func__, api2->som_type);
                return -EINVAL;
        };
 
-       len = snprintf(product, PHYTEC_PRODUCT_NAME_MAX_LEN + 1, "%s-%03u",
+       const char *fmt = (som_type == SOM_TYPE_PFL_G) ? "%s-%02u" : "%s-%03u";
+
+       len = snprintf(product, PHYTEC_PRODUCT_NAME_MAX_LEN + 1, fmt,
                       phytec_som_type_str[som_type], api2->som_no);
-       if (len != PHYTEC_PRODUCT_NAME_STD_LEN)
+       if (som_type != SOM_TYPE_PFL_G && len != PHYTEC_PRODUCT_NAME_PCX_LEN)
+               return -EINVAL;
+       if (som_type == SOM_TYPE_PFL_G && len != PHYTEC_PRODUCT_NAME_PFL_LEN)
                return -EINVAL;
        return 0;
 }
@@ -327,6 +337,7 @@ static int phytec_get_part_number(struct phytec_eeprom_data *data,
        struct phytec_api2_data *api2;
        unsigned int ksp_type;
        int res, len;
+       char *variant = "SP";
 
        if (!data->valid || data->payload.api_rev < PHYTEC_API_REV2)
                return -EINVAL;
@@ -341,7 +352,7 @@ static int phytec_get_part_number(struct phytec_eeprom_data *data,
                len = snprintf(part, PHYTEC_PART_NUMBER_MAX_LEN + 1,
                               "%s-%s.%s", product_name, api2->opt,
                               api2->bom_rev);
-               if (len < PHYTEC_PART_NUMBER_STD_LEN)
+               if (len < PHYTEC_PART_NUMBER_PCX_LEN)
                        return -EINVAL;
                return 0;
        }
@@ -353,6 +364,27 @@ static int phytec_get_part_number(struct phytec_eeprom_data *data,
                return 0;
        }
 
+       if (api2->som_type >= 8 && api2->som_type <= 11) {
+               switch (api2->som_type) {
+               case 8:
+                       variant = "PT";
+                       break;
+               case 10:
+                       variant = "KP";
+                       break;
+               case 11:
+                       variant = "KM";
+                       break;
+               }
+
+               len = snprintf(part, PHYTEC_PART_NUMBER_MAX_LEN + 1,
+                              "%s-%s%03u.%s", product_name, variant,
+                              api2->ksp_no, api2->bom_rev);
+               if (len != PHYTEC_PART_NUMBER_PFL_LEN)
+                       return -EINVAL;
+               return 0;
+       }
+
        switch (api2->som_type) {
        case 4:
                ksp_type = 3;
index 187424a2b44c0ae59842473e52a14ebc4cfc8ebe..fdfd3c969ff89a6bdaf6fda89f78f4e2e93cbcb1 100644 (file)
 #define PHYTEC_GET_OPTION(option) \
        (((option) > '9') ? (option) - 'A' + 10 : (option) - '0')
 
-#define PHYTEC_PRODUCT_NAME_STD_LEN    7       // PCx-000
+#define PHYTEC_PRODUCT_NAME_PCX_LEN    7       // PCx-000
+#define PHYTEC_PRODUCT_NAME_PFL_LEN    8       // PFL-x-00
 #define PHYTEC_PRODUCT_NAME_KSP_LEN    8       // KSP-0000
 #define PHYTEC_PRODUCT_NAME_MAX_LEN    PHYTEC_PRODUCT_NAME_KSP_LEN
-#define PHYTEC_PART_NUMBER_STD_LEN     11      // PCx-000-\w{1,17}.Ax
+#define PHYTEC_PART_NUMBER_PCX_LEN     11      // PCx-000-\w{1,17}.Ax
+#define PHYTEC_PART_NUMBER_PFL_LEN     17      // PFL-x-00-xx000.Ax
 #define PHYTEC_PART_NUMBER_KSP_LEN     11      // KSP-0000.Ax
 #define PHYTEC_PART_NUMBER_STD_KSP_LEN 16      // PCx-000-KSx00.Ax
 #define PHYTEC_PART_NUMBER_MAX_LEN     PHYTEC_PRODUCT_NAME_MAX_LEN + 21
@@ -38,6 +40,7 @@ enum phytec_som_type_str {
        SOM_TYPE_PCL,
        SOM_TYPE_KSM,
        SOM_TYPE_KSP,
+       SOM_TYPE_PFL_G,
 };
 
 static const char * const phytec_som_type_str[] = {
@@ -45,6 +48,7 @@ static const char * const phytec_som_type_str[] = {
        "PCL",
        "KSM",
        "KSP",
+       "PFL-G",
 };
 
 struct phytec_api0_data {