[RFC][PATCH] ARM: imx: verdin-imx8mm: Set CAN oscillator frequency based on model

Marek Vasut marex at denx.de
Sat Jan 13 19:33:17 CET 2024


The older i.MX8M Mini Verdin SoMs before rev. 1.1C came with 20 MHz SPI CAN
controller oscillator, the newer SoMs use 40 MHz oscillator. Handle both by
overriding the oscillator frequency just before booting the kernel.

Signed-off-by: Marek Vasut <marex at denx.de>
---
Cc: "NXP i.MX U-Boot Team" <uboot-imx at nxp.com>
Cc: Fabio Estevam <festevam at gmail.com>
Cc: Francesco Dolcini <francesco.dolcini at toradex.com>
Cc: Marcel Ziswiler <marcel.ziswiler at toradex.com>
Cc: Philippe Schenker <philippe.schenker at toradex.com>
Cc: Stefano Babic <sbabic at denx.de>
---
 board/toradex/verdin-imx8mm/verdin-imx8mm.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/board/toradex/verdin-imx8mm/verdin-imx8mm.c b/board/toradex/verdin-imx8mm/verdin-imx8mm.c
index b2781b51d6a..8bc1a51eeb1 100644
--- a/board/toradex/verdin-imx8mm/verdin-imx8mm.c
+++ b/board/toradex/verdin-imx8mm/verdin-imx8mm.c
@@ -142,6 +142,25 @@ int board_phys_sdram_size(phys_size_t *size)
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
 int ft_board_setup(void *blob, struct bd_info *bd)
 {
+	const char *canoscpath = "/oscillator";
+	int canoscoff, freq, ret;
+
+	canoscoff = fdt_path_offset(blob, canoscpath);
+	if (canoscoff < 0)	/* No CAN oscillator found. */
+		goto exit;
+
+	if (tdx_hw_tag.ver_assembly < 2)        /* rev. A or B */
+		freq = 20000000;
+	else					/* rev. C or newer */
+		freq = 40000000;
+
+	ret = fdt_setprop_u32(blob, canoscoff, "clock-frequency", freq);
+	if (ret < 0) {
+		printf("Failed to set CAN oscillator clock-frequency, ret=%d\n",
+			ret);
+	}
+
+exit:
 	return ft_common_board_setup(blob, bd);
 }
 #endif
-- 
2.43.0



More information about the U-Boot mailing list