[PATCH] ARM: dts: stm32: Auto-detect second MAC on STM32MP15xx DH electronics DHCOM
Patrice CHOTARD
patrice.chotard at foss.st.com
Fri Jun 14 14:12:46 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 */
Applied to u-boot-stm32/next
Thanks
Patrice
More information about the U-Boot
mailing list