From: Daniel Schultz Date: Mon, 24 Nov 2025 08:25:06 +0000 (-0800) Subject: board: phytec: phytec_som_detection: Add support for phyFLEX X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7bcf0160901970f4417488982199fece129567b4;p=thirdparty%2Fu-boot.git board: phytec: phytec_som_detection: Add support for phyFLEX 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 Reviewed-by: Teresa Remmet Tested-by: Dominik Haller --- 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 {