Hi Daniel,

the phyFLEX-AM62Lx is not upstream yet but since our som detection is
in sync with upstream:


Tested-by: Dominik Haller <[email protected]>


On Mo, 2025-11-10 at 05:52 -0800, Daniel Schultz wrote:
> phyFLEX are SoMs based on the FPSC standard.
> 
> Add addition "SOM types" for the phyFLEX modules base on the
> FPSC Gamma specifiction. These modules come in four differnt
> variants; prototypes (PT), standard product (SP), KSP (KP) and
> KSM (KM).
> 
> Signed-off-by: Daniel Schultz <[email protected]>
> ---
>  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 {

Reply via email to