[PATCH] ARM: dts: stm32: Auto-detect second MAC on STM32MP15xx DH electronics DHCOM

Patrice CHOTARD patrice.chotard at foss.st.com
Fri Jun 14 12:05:15 CEST 2024



On 6/6/24 15:01, Marek Vasut wrote:
> Test whether this system is compatible with STM32MP15xx DHCOM SoM,
> if so, test whether R292 pull up is populated on pin PC3, which is
> an indication that the second MAC chip, KS8851-16MLL, is populated.
> Use this information to patch 'status' DT property into the second
> ethernet MAC DT node and enable/disable the MAC on systems where
> the chip is/isn't populated respectively.
> 
> Use spl_perform_fixups() to patch the U-Boot proper DT from SPL and
> ft_board_setup() to patch Linux DT from U-Boot proper. This way both
> software components are configured the same way.
> 
> Signed-off-by: Marek Vasut <marex at denx.de>
> ---
> Cc: Patrice Chotard <patrice.chotard at foss.st.com>
> Cc: Patrick Delaunay <patrick.delaunay at foss.st.com>
> Cc: Simon Glass <sjg at chromium.org>
> Cc: Tom Rini <trini at konsulko.com>
> Cc: u-boot at dh-electronics.com
> Cc: u-boot at lists.denx.de
> Cc: uboot-stm32 at st-md-mailman.stormreply.com
> ---
>  arch/arm/dts/stm32mp15xx-dhcom-u-boot.dtsi |  1 +
>  board/dhelectronics/dh_stm32mp1/board.c    | 65 ++++++++++++++++++++++
>  2 files changed, 66 insertions(+)
> 
> diff --git a/arch/arm/dts/stm32mp15xx-dhcom-u-boot.dtsi b/arch/arm/dts/stm32mp15xx-dhcom-u-boot.dtsi
> index 1b445619325..d7b78cdcfa9 100644
> --- a/arch/arm/dts/stm32mp15xx-dhcom-u-boot.dtsi
> +++ b/arch/arm/dts/stm32mp15xx-dhcom-u-boot.dtsi
> @@ -26,6 +26,7 @@
>  		u-boot,error-led = "error";
>  		dh,som-coding-gpios = <&gpiof 12 0>, <&gpiof 13 0>, <&gpiof 15 0>;
>  		dh,ddr3-coding-gpios = <&gpioz 6 0>, <&gpioz 7 0>;
> +		dh,mac-coding-gpios = <&gpioc 3 0>;
>  	};
>  };
>  
> diff --git a/board/dhelectronics/dh_stm32mp1/board.c b/board/dhelectronics/dh_stm32mp1/board.c
> index 20c9d70737e..ebd45f9053f 100644
> --- a/board/dhelectronics/dh_stm32mp1/board.c
> +++ b/board/dhelectronics/dh_stm32mp1/board.c
> @@ -37,6 +37,7 @@
>  #include <power/regulator.h>
>  #include <remoteproc.h>
>  #include <reset.h>
> +#include <spl.h>
>  #include <syscon.h>
>  #include <usb.h>
>  #include <usb/dwc2_udc.h>
> @@ -672,12 +673,69 @@ void board_quiesce_devices(void)
>  #endif
>  }
>  
> +static void dh_stm32_ks8851_fixup(void *blob)
> +{
> +	struct gpio_desc ks8851intrn;
> +	bool compatible = false;
> +	int ks8851intrn_value;
> +	const char *prop;
> +	ofnode node;
> +	int idx = 0;
> +	int offset;
> +	int ret;
> +
> +	/* Do nothing if not STM32MP15xx DHCOM SoM */
> +	while ((prop = fdt_stringlist_get(blob, 0, "compatible", idx++, NULL))) {
> +		if (!strstr(prop, "dhcom-som"))
> +			continue;
> +		compatible = true;
> +		break;
> +	}
> +
> +	if (!compatible)
> +		return;
> +
> +	/*
> +	 * Read state of INTRN pull up resistor, if this pull up is populated,
> +	 * KS8851-16MLL is populated as well and should be enabled, otherwise
> +	 * it should be disabled.
> +	 */
> +	node = ofnode_path("/config");
> +	if (!ofnode_valid(node))
> +		return;
> +
> +	ret = gpio_request_by_name_nodev(node, "dh,mac-coding-gpios", 0,
> +					 &ks8851intrn, GPIOD_IS_IN);
> +	if (ret)
> +		return;
> +
> +	ks8851intrn_value = dm_gpio_get_value(&ks8851intrn);
> +
> +	dm_gpio_free(NULL, &ks8851intrn);
> +
> +	/* Set the 'status' property into KS8851-16MLL DT node. */
> +	offset = fdt_path_offset(blob, "ethernet1");
> +	ret = fdt_node_check_compatible(blob, offset, "micrel,ks8851-mll");
> +	if (ret)	/* Not compatible */
> +		return;
> +
> +	/* Add a bit of extra space for new 'status' property */
> +	ret = fdt_shrink_to_minimum(blob, 4096);
> +	if (!ret)
> +		return;
> +
> +	fdt_setprop_string(blob, offset, "status",
> +			   ks8851intrn_value ? "okay" : "disabled");
> +}
> +
>  #if defined(CONFIG_OF_BOARD_SETUP)
>  int ft_board_setup(void *blob, struct bd_info *bd)
>  {
>  	const char *buck3path = "/soc/i2c at 5c002000/stpmic at 33/regulators/buck3";
>  	int buck3off, ret, uv;
>  
> +	dh_stm32_ks8851_fixup(blob);
> +
>  	ret = board_get_regulator_buck3_nvm_uv_av96(&uv);
>  	if (ret)	/* Not Avenger96 board, do not patch Buck3 in DT. */
>  		return 0;
> @@ -698,6 +756,13 @@ int ft_board_setup(void *blob, struct bd_info *bd)
>  }
>  #endif
>  
> +#if defined(CONFIG_SPL_BUILD)
> +void spl_perform_fixups(struct spl_image_info *spl_image)
> +{
> +	dh_stm32_ks8851_fixup(spl_image_fdt_addr(spl_image));
> +}
> +#endif
> +
>  static void board_copro_image_process(ulong fw_image, size_t fw_size)
>  {
>  	int ret, id = 0; /* Copro id fixed to 0 as only one coproc on mp1 */


Reviewed-by: Patrice Chotard <patrice.chotard at foss.st.com>

Thanks

PAtrice


More information about the U-Boot mailing list