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 <ma...@denx.de>
---
Cc: "NXP i.MX U-Boot Team" <uboot-...@nxp.com>
Cc: Fabio Estevam <feste...@gmail.com>
Cc: Francesco Dolcini <francesco.dolc...@toradex.com>
Cc: Marcel Ziswiler <marcel.ziswi...@toradex.com>
Cc: Philippe Schenker <philippe.schen...@toradex.com>
Cc: Stefano Babic <sba...@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

Reply via email to