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 <[email protected]>
Reviewed-by: Teresa Remmet <[email protected]>
Tested-by: Dominik Haller <[email protected]>
---
Changes in v2:
  Fixed three spelling errors.

  "addition" -> "additional"
  "specifiction" -> "specification"
  "differnt" -> "different"

 board/phytec/common/phytec_som_detection.c | 38 ++++++++++++++++++++--
 board/phytec/common/phytec_som_detection.h |  8 +++--
 2 files changed, 41 insertions(+), 5 deletions(-)

diff --git a/board/phytec/common/phytec_som_detection.c 
b/board/phytec/common/phytec_som_detection.c
index ff1711c24b4..0e30ed9b1bb 100644
--- a/board/phytec/common/phytec_som_detection.c
+++ b/board/phytec/common/phytec_som_detection.c
@@ -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;
diff --git a/board/phytec/common/phytec_som_detection.h 
b/board/phytec/common/phytec_som_detection.h
index 187424a2b44..fdfd3c969ff 100644
--- a/board/phytec/common/phytec_som_detection.h
+++ b/board/phytec/common/phytec_som_detection.h
@@ -18,10 +18,12 @@
 #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 {
-- 
2.25.1

Reply via email to