soc: imx93: a55: initialize video pll
Setup video pll with fixed 400MHz.
Signed-off-by: Winteri Wang <dongjie.wang@nxp.com>
diff --git a/soc/nxp/imx/imx9/imx93/CMakeLists.txt b/soc/nxp/imx/imx9/imx93/CMakeLists.txt
index 1a05efe..ff328de 100644
--- a/soc/nxp/imx/imx9/imx93/CMakeLists.txt
+++ b/soc/nxp/imx/imx9/imx93/CMakeLists.txt
@@ -7,6 +7,7 @@
zephyr_sources_ifdef(CONFIG_ARM_MMU a55/mmu_regions.c)
zephyr_sources(common_clock_set.c)
+ zephyr_sources(a55/soc.c)
set(SOC_LINKER_SCRIPT ${ZEPHYR_BASE}/include/zephyr/arch/arm64/scripts/linker.ld CACHE INTERNAL "")
elseif(CONFIG_SOC_MIMX9352_M33)
zephyr_include_directories(.)
diff --git a/soc/nxp/imx/imx9/imx93/Kconfig b/soc/nxp/imx/imx9/imx93/Kconfig
index 45e7f57..0c8871e 100644
--- a/soc/nxp/imx/imx9/imx93/Kconfig
+++ b/soc/nxp/imx/imx9/imx93/Kconfig
@@ -26,6 +26,9 @@
default "_ca55" if SOC_MIMX9352_A55
default "_cm33" if SOC_MIMX9352_M33
+config INIT_VIDEO_PLL
+ bool "Init Video PLL"
+
if SOC_MIMX9352_M33
config TRDC_MCUX_TRDC_1
diff --git a/soc/nxp/imx/imx9/imx93/a55/soc.c b/soc/nxp/imx/imx9/imx93/a55/soc.c
new file mode 100644
index 0000000..6665b4f
--- /dev/null
+++ b/soc/nxp/imx/imx9/imx93/a55/soc.c
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2025 NXP
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include <stdio.h>
+#include <zephyr/init.h>
+#include <zephyr/kernel.h>
+#include <zephyr/device.h>
+#include <soc.h>
+#include <fsl_common.h>
+
+#define VIDEO_PLL_FREQ 400000000
+
+#if defined(CONFIG_INIT_VIDEO_PLL)
+static int soc_video_pll_init(void)
+{
+ /* Configure Video PLL to 400MHz */
+ const fracn_pll_init_t videoPllCfg = {
+ .rdiv = 1,
+ .mfi = 200,
+ .mfn = 0,
+ .mfd = 100,
+ .odiv = 12,
+ };
+
+ /** PLL_CLKx = (24M / rdiv * (mfi + mfn/mfd) / odiv) */
+ CLOCK_PllInit(VIDEOPLL, &videoPllCfg);
+ g_clockSourceFreq[kCLOCK_VideoPll1] = VIDEO_PLL_FREQ;
+ g_clockSourceFreq[kCLOCK_VideoPll1Out] = VIDEO_PLL_FREQ;
+
+ printf("Initialized VIDEO PLL to %d\n", g_clockSourceFreq[kCLOCK_VideoPll1Out]);
+
+ return 0;
+}
+#endif /* CONFIG_INIT_VIDEO_PLL */
+
+static int soc_init(void)
+{
+#if defined(CONFIG_INIT_VIDEO_PLL)
+ int ret = soc_video_pll_init();
+
+ if (ret) {
+ printf("SoC VIDEO PLL init failed");
+ return ret;
+ }
+#endif /* CONFIG_INIT_VIDEO_PLL */
+
+ return 0;
+}
+/*
+ * Init video pll based on config
+ */
+SYS_INIT(soc_init, PRE_KERNEL_2, 0);