This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit c90349348effdf50211f7075d67484921065552d
Author: lipengfei28 <lipengfe...@xiaomi.com>
AuthorDate: Fri Aug 1 15:39:25 2025 +0800

    arch/arm64: porting config clock use scmi form arm imx95
    
    Signed-off-by: lipengfei28 <lipengfe...@xiaomi.com>
---
 arch/arm64/src/imx9/Kconfig                      |   8 +
 arch/arm64/src/imx9/Make.defs                    |   4 +-
 arch/arm64/src/imx9/hardware/imx95/imx95_clock.h | 828 +++++++++++++++++++++++
 arch/arm64/src/imx9/imx9_clockconfig.c           | 259 ++++++-
 arch/arm64/src/imx9/imx9_clockconfig.h           |  46 ++
 5 files changed, 1141 insertions(+), 4 deletions(-)

diff --git a/arch/arm64/src/imx9/Kconfig b/arch/arm64/src/imx9/Kconfig
index ba2558d8e96..953bb73f10a 100644
--- a/arch/arm64/src/imx9/Kconfig
+++ b/arch/arm64/src/imx9/Kconfig
@@ -525,6 +525,14 @@ config IMX9_SCMI
        default y
        depends on IMX9_MU
 
+if IMX9_SCMI
+
+config IMX9_CLK_OVER_SCMI
+       bool "Configure CLK over SCMI"
+       default y
+
+endif
+
 menu "LPI2C Peripherals"
 
 menuconfig IMX9_LPI2C1
diff --git a/arch/arm64/src/imx9/Make.defs b/arch/arm64/src/imx9/Make.defs
index 92c760eb46d..a101975f1ff 100644
--- a/arch/arm64/src/imx9/Make.defs
+++ b/arch/arm64/src/imx9/Make.defs
@@ -31,10 +31,10 @@ endif
 CHIP_CSRCS  = imx9_boot.c imx9_timer.c
 
 ifeq ($(CONFIG_ARCH_CHIP_IMX93),y)
-CHIP_CSRCS  += imx9_ccm.c imx9_clockconfig.c imx9_gpio.c imx9_iomuxc.c
+CHIP_CSRCS  += imx9_ccm.c imx9_gpio.c imx9_iomuxc.c
 endif
 
-CHIP_CSRCS += imx9_lpuart.c imx9_lowputc.c
+CHIP_CSRCS += imx9_lpuart.c imx9_lowputc.c imx9_clockconfig.c
 
 ifeq ($(CONFIG_IMX9_GPIO_IRQ),y)
   CHIP_CSRCS += imx9_gpioirq.c
diff --git a/arch/arm64/src/imx9/hardware/imx95/imx95_clock.h 
b/arch/arm64/src/imx9/hardware/imx95/imx95_clock.h
new file mode 100644
index 00000000000..62ff019ec83
--- /dev/null
+++ b/arch/arm64/src/imx9/hardware/imx95/imx95_clock.h
@@ -0,0 +1,828 @@
+/****************************************************************************
+ * arch/arm64/src/imx9/hardware/imx95/imx95_clock.h
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * SPDX-FileCopyrightText: 2024 NXP
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_ARM_SRC_IMX9_HARDWARE_IMX95_IMX95_CLOCK_H
+#define __ARCH_ARM_SRC_IMX9_HARDWARE_IMX95_IMX95_CLOCK_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdbool.h>
+#include <stdint.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+typedef enum
+{
+    EXT                    = 0,
+    OSC_32K                = 1,
+    OSC_24M                = 2,
+    FRO                    = 3,
+    SYS_PLL1_CTL           = 4,
+    SYS_PLL1_DFS0_CTL      = 5,
+    SYS_PLL1_DFS0          = 6,
+    SYS_PLL1_DFS0_DIV2     = 7,
+    SYS_PLL1_DFS1_CTL      = 8,
+    SYS_PLL1_DFS1          = 9,
+    SYS_PLL1_DFS1_DIV2     = 10,
+    SYS_PLL1_DFS2_CTL      = 11,
+    SYS_PLL1_DFS2          = 12,
+    SYS_PLL1_DFS2_DIV2     = 13,
+    AUDIO_PLL1_CTL         = 14,
+    AUDIO_PLL1             = 15,
+    AUDIO_PLL2_CTL         = 16,
+    AUDIO_PLL2             = 17,
+    VIDEO_PLL1_CTL         = 18,
+    VIDEO_PLL1             = 19,
+    VIDEO_PLL2_CTL         = 20,
+    VIDEO_PLL2             = 21,
+    VIDEO_PLL3_CTL         = 22,
+    VIDEO_PLL3             = 23,
+    ARM_PLL_CTL            = 24,
+    ARM_PLL_DFS0_CTL       = 25,
+    ARM_PLL_DFS0           = 26,
+    ARM_PLL_DFS1_CTL       = 27,
+    ARM_PLL_DFS1           = 28,
+    ARM_PLL_DFS2_CTL       = 29,
+    ARM_PLL_DFS2           = 30,
+    ARM_PLL_DFS3_CTL       = 31,
+    ARM_PLL_DFS3           = 32,
+    DRAM_PLL_CTL           = 33,
+    DRAM_PLL               = 34,
+    HSIO_PLL_CTL           = 35,
+    HSIO_PLL               = 36,
+    LDB_PLL_CTL            = 37,
+    LDB_PLL                = 38,
+} clock_id_e;
+
+#define CCM_CR_COUNT       122
+#define ROOT_CLOCK_OFFSET  41
+
+typedef uint32_t clock_config_t;
+
+#define CLOCK_DIV_SHIFT    (16)
+#define CLOCK_DIV_MASK     (0xff << CLOCK_DIV_SHIFT)
+#define CLOCK_DIV(n)       (((n) << CLOCK_DIV_SHIFT) & CLOCK_DIV_MASK)
+#define GET_DIV(n)         (((n) & CLOCK_DIV_MASK) >> CLOCK_DIV_SHIFT)
+
+#define ROOT_SHIFT         (8)
+#define ROOT_MASK          (0x7f << ROOT_SHIFT)
+#define ROOT(n)            (((n) << ROOT_SHIFT) & ROOT_MASK)
+#define GET_ROOT(n)        (((n) & ROOT_MASK) >> ROOT_SHIFT)
+
+#define ID_SHIFT           (3)
+#define ID_MASK            (0x1f << ID_SHIFT)
+#define ID(n)              (((n) << ID_SHIFT) & ID_MASK)
+#define GET_ID(n)          (((n) & ID_MASK) >> ID_SHIFT)
+
+#define MUX_SHIFT          (0)
+#define MUX_MASK           (0x07 << MUX_SHIFT)
+#define MUX(n)             (((n) << MUX_SHIFT) & MUX_MASK)
+
+/* ADC_gROOT */
+#define ADC_OSC_24M        ROOT(0U) | MUX(0U) | ID(OSC_24M)
+#define ADC_DFS0_DIV2      ROOT(0U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define ADC_DFS1_DIV2      ROOT(0U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define ADC_FRO            ROOT(0U) | MUX(3U) | ID(FRO)
+
+/* TMU_gROOT */
+#define TMU_OSC_24M        ROOT(1U) | MUX(0U) | ID(OSC_24M)
+#define TMU_DFS0_DIV2      ROOT(1U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define TMU_DFS1_DIV2      ROOT(1U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define TMU_FRO            ROOT(1U) | MUX(3U) | ID(FRO)
+
+/* BUS_AON_gROOT */
+#define BUS_AON_OSC_24M    ROOT(2U) | MUX(0U) | ID(OSC_24M)
+#define BUS_AON_DFS0_DIV2  ROOT(2U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define BUS_AON_DFS1_DIV2  ROOT(2U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define BUS_AON_FRO        ROOT(2U) | MUX(3U) | ID(FRO)
+
+/* CAN1_gROOT */
+#define CAN1_OSC_24M       ROOT(3U) | MUX(0U) | ID(OSC_24M)
+#define CAN1_DFS0_DIV2     ROOT(3U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define CAN1_DFS1_DIV2     ROOT(3U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define CAN1_FRO           ROOT(3U) | MUX(3U) | ID(FRO)
+
+/* I3C1_gROOT */
+#define I3C1_OSC_24M       ROOT(4U) | MUX(0U) | ID(OSC_24M)
+#define I3C1_DFS0_DIV2     ROOT(4U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define I3C1_DFS1_DIV2     ROOT(4U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define I3C1_FRO           ROOT(4U) | MUX(3U) | ID(FRO)
+
+/* I3C1_SLOW_gROOT */
+#define I3C1_SL_OSC_24M    ROOT(5U) | MUX(0U) | ID(OSC_24M)
+#define I3C1_SL_DFS0_DIV2  ROOT(5U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define I3C1_SL_DFS1_DIV2  ROOT(5U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define I3C1_SL_FRO        ROOT(5U) | MUX(3U) | ID(FRO)
+
+/* LPI2C1_gROOT */
+#define LPI2C1_OSC_24M     ROOT(6U) | MUX(0U) | ID(OSC_24M)
+#define LPI2C1_DFS0_DIV2   ROOT(6U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPI2C1_DFS1_DIV2   ROOT(6U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPI2C1_FRO         ROOT(6U) | MUX(3U) | ID(FRO)
+
+/* LPI2C2_gROOT */
+#define LPI2C2_OSC_24M     ROOT(7U) | MUX(0U) | ID(OSC_24M)
+#define LPI2C2_DFS0_DIV2   ROOT(7U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPI2C2_DFS1_DIV2   ROOT(7U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPI2C2_FRO         ROOT(7U) | MUX(3U) | ID(FRO)
+
+/* LPSPI1_gROOT */
+#define LPSPI1_OSC_24M     ROOT(8U) | MUX(0U) | ID(OSC_24M)
+#define LPSPI1_DFS0_DIV2   ROOT(8U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPSPI1_DFS1_DIV2   ROOT(8U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPSPI1_FRO         ROOT(8U) | MUX(3U) | ID(FRO)
+
+/* LPSPI2_gROOT */
+#define LPSPI2_OSC_24M     ROOT(9U) | MUX(0U) | ID(OSC_24M)
+#define LPSPI2_DFS0_DIV2   ROOT(9U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPSPI2_DFS1_DIV2   ROOT(9U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPSPI2_FRO         ROOT(9U) | MUX(3U) | ID(FRO)
+
+/* LPTMR1_gROOT */
+#define LPTMR1_OSC_24M     ROOT(10U) | MUX(0U) | ID(OSC_24M)
+#define LPTMR1_DFS0_DIV2   ROOT(10U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPTMR1_DFS1_DIV2   ROOT(10U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPTMR1_FRO         ROOT(10U) | MUX(3U) | ID(FRO)
+
+/* LPUART1_gROOT */
+#define LPUART1_OSC_24M    ROOT(11U) | MUX(0U) | ID(OSC_24M)
+#define LPUART1_DFS0_DIV2  ROOT(11U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPUART1_DFS1_DIV2  ROOT(11U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPUART1_FRO        ROOT(11U) | MUX(3U) | ID(FRO)
+
+/* LPUART2_gROOT */
+#define LPUART2_OSC_24M    ROOT(12U) | MUX(0U) | ID(OSC_24M)
+#define LPUART2_DFS0_DIV2  ROOT(12U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPUART2_DFS1_DIV2  ROOT(12U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPUART2_FRO        ROOT(12U) | MUX(3U) | ID(FRO)
+
+/* M33_gROOT */
+#define M33_OSC_24M        ROOT(13U) | MUX(0U) | ID(OSC_24M)
+#define M33_DFS0           ROOT(13U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define M33_DFS1_DIV2      ROOT(13U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define M33_FRO            ROOT(13U) | MUX(3U) | ID(FRO)
+
+/* M33_SYSTICK_gROOT */
+#define M33_TICK_OSC_24M   ROOT(14U) | MUX(0U) | ID(OSC_24M)
+#define M33_TICK_DFS0_DIV2 ROOT(14U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define M33_TICK_DFS1_DIV2 ROOT(14U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define M33_TICK_FRO       ROOT(14U) | MUX(3U) | ID(FRO)
+
+/* MQS1_gROOT */
+#define MQS1_OSC_24M       ROOT(15U) | MUX(0U) | ID(OSC_24M)
+#define MQS1_AUDIO_PLL1    ROOT(15U) | MUX(1U) | ID(AUDIO_PLL1)
+#define MQS1_AUDIO_PLL2    ROOT(15U) | MUX(2U) | ID(AUDIO_PLL2)
+#define MQS1_EXT           ROOT(15U) | MUX(3U) | ID(EXT)
+
+/* PDM_gROOT */
+#define PDM_OSC_24M        ROOT(16U) | MUX(0U) | ID(OSC_24M)
+#define PDM_AUDIO_PLL1     ROOT(16U) | MUX(1U) | ID(AUDIO_PLL1)
+#define PDM_AUDIO_PLL2     ROOT(16U) | MUX(2U) | ID(AUDIO_PLL2)
+#define PDM_EXT            ROOT(16U) | MUX(3U) | ID(EXT)
+
+/* SAI1_gROOT */
+#define SAI1_OSC_24M       ROOT(17U) | MUX(0U) | ID(OSC_24M)
+#define SAI1_AUDIO_PLL1    ROOT(17U) | MUX(1U) | ID(AUDIO_PLL1)
+#define SAI1_AUDIO_PLL2    ROOT(17U) | MUX(2U) | ID(AUDIO_PLL2)
+#define SAI1_EXT           ROOT(17U) | MUX(3U) | ID(EXT)
+
+/* SENTINEL_gROOT */
+#define SENTINEL_OSC_24M   ROOT(18U) | MUX(0U) | ID(OSC_24M)
+#define SENTINEL_DFS0      ROOT(18U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define SENTINEL_DFS1_DIV2 ROOT(18U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define SENTINEL_FRO       ROOT(18U) | MUX(3U) | ID(FRO)
+
+/* TPM2_gROOT */
+#define TPM2_OSC_24M       ROOT(19U) | MUX(0U) | ID(OSC_24M)
+#define TPM2_DFS0          ROOT(19U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define TPM2_AUDIO_PLL1    ROOT(19U) | MUX(2U) | ID(AUDIO_PLL1)
+#define TPM2_EXT           ROOT(19U) | MUX(3U) | ID(EXT)
+
+/* TSTMR1_gROOT */
+#define TSTMR1_OSC_24M     ROOT(20U) | MUX(0U) | ID(OSC_24M)
+#define TSTMR1_DFS0_DIV2   ROOT(20U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define TSTMR1_DFS1_DIV2   ROOT(20U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define TSTMR1_FRO         ROOT(20U) | MUX(3U) | ID(FRO)
+
+/* CAM_APB_gROOT */
+#define CAM_APB_OSC_24M    ROOT(21U) | MUX(0U) | ID(OSC_24M)
+#define CAM_APB_DFS0_DIV2  ROOT(21U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define CAM_APB_DFS1_DIV2  ROOT(21U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define CAM_APB_FRO        ROOT(21U) | MUX(3U) | ID(FRO)
+
+/* CAM_AXI_gROOT */
+#define CAM_AXI_OSC_24M    ROOT(22U) | MUX(0U) | ID(OSC_24M)
+#define CAM_AXI_DFS0       ROOT(22U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define CAM_AXI_DFS1       ROOT(22U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define CAM_AXI_DFS2       ROOT(22U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* CAM_CM0_gROOT */
+#define CAM_CM0_OSC_24M    ROOT(23U) | MUX(0U) | ID(OSC_24M)
+#define CAM_CM0_DFS0       ROOT(23U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define CAM_CM0_DFS1       ROOT(23U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define CAM_CM0_DFS2       ROOT(23U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* CAM_ISI_gROOT */
+#define CAM_ISI_OSC_24M    ROOT(24U) | MUX(0U) | ID(OSC_24M)
+#define CAM_ISI_DFS0       ROOT(24U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define CAM_ISI_DFS1       ROOT(24U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define CAM_ISI_DFS2       ROOT(24U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* MIPI_PHY_CFG_gROOT */
+#define MIPI_PHY_OSC_24M    ROOT(25U) | MUX(0U) | ID(OSC_24M)
+#define MIPI_PHY_AUDIO_PLL1 ROOT(25U) | MUX(1U) | ID(AUDIO_PLL1)
+#define MIPI_PHY_VIDEO_PLL1 ROOT(25U) | MUX(2U) | ID(VIDEO_PLL1)
+
+/* MIPI_PHY_PLL_BYPASS_gROOT */
+#define MIPI_PHY_BPS_OSC_24M    ROOT(26U) | MUX(0U) | ID(OSC_24M)
+#define MIPI_PHY_BPS_AUDIO_PLL1 ROOT(26U) | MUX(1U) | ID(AUDIO_PLL1)
+#define MIPI_PHY_BPS_VIDEO_PLL1 ROOT(26U) | MUX(2U) | ID(VIDEO_PLL1)
+
+/* MIPI_PHY_PLL_REF_gROOT */
+#define MIPI_PHY_REF_OSC_24M    ROOT(27U) | MUX(0U) | ID(OSC_24M)
+#define MIPI_PHY_REF_AUDIO_PLL1 ROOT(27U) | MUX(1U) | ID(AUDIO_PLL1)
+#define MIPI_PHY_REF_VIDEO_PLL1 ROOT(27U) | MUX(2U) | ID(VIDEO_PLL1)
+
+/* MIPI_TEST_BYTE_gROOT */
+#define MIPI_TEST_OSC_24M       ROOT(28U) | MUX(0U) | ID(OSC_24M)
+#define MIPI_TEST_AUDIO_PLL1    ROOT(28U) | MUX(1U) | ID(AUDIO_PLL1)
+#define MIPI_TEST_VIDEO_PLL1    ROOT(28U) | MUX(2U) | ID(VIDEO_PLL1)
+
+/* ARM_A55_gROOT */
+#define ARM_A55_OSC_24M         ROOT(29U) | MUX(0U) | ID(OSC_24M)
+#define ARM_A55_DFS0            ROOT(29U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define ARM_A55_DFS1            ROOT(29U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define ARM_A55_DFS2            ROOT(29U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* ARM_A55_MTR_BUS_gROOT */
+#define ARM_A55_MTR_OSC_24M     ROOT(30U) | MUX(0U) | ID(OSC_24M)
+#define ARM_A55_MTR_DFS0_DIV2   ROOT(30U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define ARM_A55_MTR_DFS1_DIV2   ROOT(30U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define ARM_A55_MTR_FRO         ROOT(30U) | MUX(3U) | ID(FRO)
+
+/* ARM_A55_PERIPH_gROOT */
+#define ARM_A55_PERIPH_OSC_24M  ROOT(31U) | MUX(0U) | ID(OSC_24M)
+#define ARM_A55_PERIPH_DFS0     ROOT(31U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define ARM_A55_PERIPH_DFS1     ROOT(31U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define ARM_A55_PERIPH_DFS2     ROOT(31U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* DRAM_ALT_gROOT */
+#define DRAM_ALT_OSC_24M        ROOT(32U) | MUX(0U) | ID(OSC_24M)
+#define DRAM_ALT_DFS0           ROOT(32U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define DRAM_ALT_DFS1           ROOT(32U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define DRAM_ALT_DFS2           ROOT(32U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* DRAM_APB_gROOT */
+#define DRAM_APB_OSC_24M       ROOT(33U) | MUX(0U) | ID(OSC_24M)
+#define DRAM_APB_DFS0_DIV2     ROOT(33U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define DRAM_APB_DFS1_DIV2     ROOT(33U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define DRAM_APB_FRO           ROOT(33U) | MUX(3U) | ID(FRO)
+
+/* DISP_APB_gROOT */
+#define DISP_APB_OSC_24M       ROOT(34U) | MUX(0U) | ID(OSC_24M)
+#define DISP_APB_DFS0_DIV2     ROOT(34U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define DISP_APB_DFS1_DIV2     ROOT(34U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define DISP_APB_FRO           ROOT(34U) | MUX(3U) | ID(FRO)
+
+/* DISP_AXI_gROOT */
+#define DISP_AXI_OSC_24M       ROOT(35U) | MUX(0U) | ID(OSC_24M)
+#define DISP_AXI_DFS0          ROOT(35U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define DISP_AXI_DFS1          ROOT(35U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define DISP_AXI_DFS2          ROOT(35U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* DISP_DP_gROOT */
+#define DISP_DP_OSC_24M        ROOT(36U) | MUX(0U) | ID(OSC_24M)
+#define DISP_DP_DFS0           ROOT(36U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define DISP_DP_DFS1           ROOT(36U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define DISP_DP_DFS2           ROOT(36U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* DISP_OCRAM_gROOT */
+#define DISP_OCRAM_OSC_24M     ROOT(37U) | MUX(0U) | ID(OSC_24M)
+#define DISP_OCRAM_DFS0        ROOT(37U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define DISP_OCRAM_DFS1        ROOT(37U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define DISP_OCRAM_DFS2        ROOT(37U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* DISP_USB31_gROOT */
+#define DISP_USB31_OSC_24M     ROOT(38U) | MUX(0U) | ID(OSC_24M)
+#define DISP_USB31_DFS0        ROOT(38U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define DISP_USB31_DFS1        ROOT(38U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define DISP_USB31_DFS2        ROOT(38U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* DISP1_PIX_gROOT */
+#define DISP1_PIX_OSC_24M      ROOT(39U) | MUX(0U) | ID(OSC_24M)
+#define DISP1_PIX_AUDIO_PLL1   ROOT(39U) | MUX(1U) | ID(AUDIO_PLL1)
+#define DISP1_PIX_VIDEO_PLL1   ROOT(39U) | MUX(2U) | ID(VIDEO_PLL1)
+
+/* GPU_APB_gROOT */
+#define GPU_APB_OSC_24M        ROOT(42U) | MUX(0U) | ID(OSC_24M)
+#define GPU_APB_DFS0_DIV2      ROOT(42U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define GPU_APB_DFS1_DIV2      ROOT(42U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define GPU_APB_FRO            ROOT(42U) | MUX(3U) | ID(FRO)
+
+/* GPU_gROOT */
+#define GPU_OSC_24M            ROOT(43U) | MUX(0U) | ID(OSC_24M)
+#define GPU_DFS0               ROOT(43U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define GPU_DFS1               ROOT(43U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define GPU_DFS2               ROOT(43U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* HSIO_ACSCAN_480M_gROOT */
+#define HSIO_ACSCAN_480_OSC_24M  ROOT(44U) | MUX(0U) | ID(OSC_24M)
+#define HSIO_ACSCAN_480_AUDIO    ROOT(44U) | MUX(1U) | ID(AUDIO_PLL1)
+#define HSIO_ACSCAN_480_VIDEO    ROOT(44U) | MUX(2U) | ID(VIDEO_PLL1)
+#define HSIO_ACSCAN_480_DFS2     ROOT(44U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* HSIO_ACSCAN_80M_gROOT */
+#define HSIO_ACSCAN_80_OSC_24M   ROOT(45U) | MUX(0U) | ID(OSC_24M)
+#define HSIO_ACSCAN_80_DFS0_DIV2 ROOT(45U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define HSIO_ACSCAN_80_DFS1_DIV2 ROOT(45U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define HSIO_ACSCAN_80_FRO       ROOT(45U) | MUX(3U) | ID(FRO)
+
+/* HSIO_gROOT */
+#define HSIO_OSC_24M             ROOT(46U) | MUX(0U) | ID(OSC_24M)
+#define HSIO_DFS0                ROOT(46U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define HSIO_DFS1                ROOT(46U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define HSIO_DFS2                ROOT(46U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* HSIO_PCIE_AUX_gROOT */
+#define HSIO_PCIE_AUX_OSC_24M    ROOT(47U) | MUX(0U) | ID(OSC_24M)
+#define HSIO_PCIE_AUX_DFS0_DIV2  ROOT(47U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define HSIO_PCIE_AUX_DFS1_DIV2  ROOT(47U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define HSIO_PCIE_AUX_FRO        ROOT(47U) | MUX(3U) | ID(FRO)
+
+/* HSIO_PCIE_TEST_160M_gROOT */
+#define HSIO_PCIE_160_OSC_24M    ROOT(48U) | MUX(0U) | ID(OSC_24M)
+#define HSIO_PCIE_160_DFS0       ROOT(48U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define HSIO_PCIE_160_DFS1       ROOT(48U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define HSIO_PCIE_160_DFS2       ROOT(48U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* HSIO_PCIE_TEST_400M_gROOT */
+#define HSIO_PCIE_400_OSC_24M    ROOT(49U) | MUX(0U) | ID(OSC_24M)
+#define HSIO_PCIE_400_DFS0       ROOT(49U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define HSIO_PCIE_400_DFS1       ROOT(49U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define HSIO_PCIE_400_DFS2       ROOT(49U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* HSIO_PCIE_TEST_500M_gROOT */
+#define HSIO_PCIE_500_OSC_24M    ROOT(50U) | MUX(0U) | ID(OSC_24M)
+#define HSIO_PCIE_500_DFS0       ROOT(50U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define HSIO_PCIE_500_DFS1       ROOT(50U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define HSIO_PCIE_500_DFS2       ROOT(50U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* HSIO_USB_TEST_50M_gROOT */
+#define HSIO_USB_50_OSC_24M      ROOT(51U) | MUX(0U) | ID(OSC_24M)
+#define HSIO_USB_50_DFS0_DIV2    ROOT(51U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define HSIO_USB_50_DFS1_DIV2    ROOT(51U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define HSIO_USB_50_FRO          ROOT(51U) | MUX(3U) | ID(FRO)
+
+/* HSIO_USB_TEST_60M_gROOT */
+#define HSIO_USB_60_OSC_24M      ROOT(52U) | MUX(0U) | ID(OSC_24M)
+#define HSIO_USB_60_DFS0_DIV2    ROOT(52U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define HSIO_USB_60_DFS1_DIV2    ROOT(52U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define HSIO_USB_60_FRO          ROOT(52U) | MUX(3U) | ID(FRO)
+
+/* BUS_M7_gROOT */
+#define BUS_M7_OSC_24M           ROOT(53U) | MUX(0U) | ID(OSC_24M)
+#define BUS_M7_DFS0_DIV2         ROOT(53U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define BUS_M7_DFS1_DIV2         ROOT(53U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define BUS_M7_FRO               ROOT(53U) | MUX(3U) | ID(FRO)
+
+/* M7_gROOT */
+#define M7_OSC_24M               ROOT(54U) | MUX(0U) | ID(OSC_24M)
+#define M7_DFS0                  ROOT(54U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define M7_DFS1                  ROOT(54U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define M7_DFS2                  ROOT(54U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* M7_SYSTICK_gROOT */
+#define M7_SYSTICK_OSC_24M       ROOT(55U) | MUX(0U) | ID(OSC_24M)
+#define M7_SYSTICK_DFS0_DIV2     ROOT(55U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define M7_SYSTICK_DFS1_DIV2     ROOT(55U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define M7_SYSTICK_FRO           ROOT(55U) | MUX(3U) | ID(FRO)
+
+/* BUS_NETCMIX_gROOT */
+#define BUS_NETCMIX_OSC_24M      ROOT(56U) | MUX(0U) | ID(OSC_24M)
+#define BUS_NETCMIX_DFS0_DIV2    ROOT(56U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define BUS_NETCMIX_DFS1_DIV2    ROOT(56U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define BUS_NETCMIX_FRO          ROOT(56U) | MUX(3U) | ID(FRO)
+
+/* ENET_gROOT */
+#define ENET_OSC_24M             ROOT(57U) | MUX(0U) | ID(OSC_24M)
+#define ENET_DFS0                ROOT(57U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define ENET_DFS1                ROOT(57U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define ENET_DFS2                ROOT(57U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* ENET_PHY_TEST_200M_gROOT */
+#define ENET_PHY_200_OSC_24M     ROOT(58U) | MUX(0U) | ID(OSC_24M)
+#define ENET_PHY_200_DFS0        ROOT(58U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define ENET_PHY_200_DFS1_DIV2   ROOT(58U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define ENET_PHY_200_FRO         ROOT(58U) | MUX(3U) | ID(FRO)
+
+/* ENET_PHY_TEST_500M_gROOT */
+#define ENET_PHY_500_OSC_24M    ROOT(59U) | MUX(0U) | ID(OSC_24M)
+#define ENET_PHY_500_DFS0       ROOT(59U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define ENET_PHY_500_DFS1       ROOT(59U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define ENET_PHY_500_DFS2       ROOT(59U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* ENET_PHY_TEST_667M_gROOT */
+#define ENET_PHY_667_OSC_24M    ROOT(60U) | MUX(0U) | ID(OSC_24M)
+#define ENET_PHY_667_DFS0       ROOT(60U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define ENET_PHY_667_DFS1       ROOT(60U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define ENET_PHY_667_DFS2       ROOT(60U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* ENET_REF_gROOT */
+#define ENET_REF_OSC_24M        ROOT(61U) | MUX(0U) | ID(OSC_24M)
+#define ENET_REF_DFS0           ROOT(61U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define ENET_REF_DFS1_DIV2      ROOT(61U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define ENET_REF_FRO            ROOT(61U) | MUX(3U) | ID(FRO)
+
+/* ENET_TIMER1_gROOT */
+#define ENET_TIMER1_OSC_24M     ROOT(62U) | MUX(0U) | ID(OSC_24M)
+#define ENET_TIMER1_DFS0_DIV2   ROOT(62U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define ENET_TIMER1_DFS1_DIV2   ROOT(62U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define ENET_TIMER1_FRO         ROOT(62U) | MUX(3U) | ID(FRO)
+
+/* MQS2_gROOT */
+#define MQS2_OSC_24M            ROOT(63U) | MUX(0U) | ID(OSC_24M)
+#define MQS2_AUDIO_PLL1         ROOT(63U) | MUX(1U) | ID(AUDIO_PLL1)
+#define MQS2_AUDIO_PLL2         ROOT(63U) | MUX(2U) | ID(AUDIO_PLL2)
+#define MQS2_EXT                ROOT(63U) | MUX(3U) | ID(EXT)
+
+/* SAI2_gROOT */
+#define SAI2_OSC_24M            ROOT(64U) | MUX(0U) | ID(OSC_24M)
+#define SAI2_AUDIO_PLL1         ROOT(64U) | MUX(1U) | ID(AUDIO_PLL1)
+#define SAI2_AUDIO_PLL2         ROOT(64U) | MUX(2U) | ID(AUDIO_PLL2)
+#define SAI2_EXT                ROOT(64U) | MUX(3U) | ID(EXT)
+
+/* NOC_APB_gROOT */
+#define NOC_APB_OSC_24M         ROOT(65U) | MUX(0U) | ID(OSC_24M)
+#define NOC_APB_DFS0_DIV2       ROOT(65U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define NOC_APB_DFS1_DIV2       ROOT(65U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define NOC_APB_FRO             ROOT(65U) | MUX(3U) | ID(FRO)
+
+/* NOC_gROOT */
+#define NOC_OSC_24M             ROOT(66U) | MUX(0U) | ID(OSC_24M)
+#define NOC_DFS0                ROOT(66U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define NOC_DFS1                ROOT(66U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define NOC_DFS2                ROOT(66U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* NPU_APB_gROOT */
+#define NPU_APB_OSC_24M         ROOT(67U) | MUX(0U) | ID(OSC_24M)
+#define NPU_APB_DFS0_DIV2       ROOT(67U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define NPU_APB_DFS1_DIV2       ROOT(67U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define NPU_APB_FRO             ROOT(67U) | MUX(3U) | ID(FRO)
+
+/* NPU_gROOT */
+#define NPU_OSC_24M             ROOT(68U) | MUX(0U) | ID(OSC_24M)
+#define NPU_DFS0                ROOT(68U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define NPU_DFS1                ROOT(68U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define NPU_DFS2                ROOT(68U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* CCM_CKO1_gROOT */
+#define CCM_CKO1_OSC_24M        ROOT(69U) | MUX(0U) | ID(OSC_24M)
+#define CCM_CKO1_DFS0           ROOT(69U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define CCM_CKO1_OSC_32K        ROOT(69U) | MUX(2U) | ID(OSC_32K)
+#define CCM_CKO1_AUDIO_PLL1     ROOT(69U) | MUX(3U) | ID(AUDIO_PLL1)
+
+/* CCM_CKO2_gROOT */
+#define CCM_CKO2_OSC_24M        ROOT(70U) | MUX(0U) | ID(OSC_24M)
+#define CCM_CKO2_DFS0           ROOT(70U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define CCM_CKO2_OSC_32K        ROOT(70U) | MUX(2U) | ID(OSC_32K)
+#define CCM_CKO2_VIDEO_PLL1     ROOT(70U) | MUX(3U) | ID(VIDEO_PLL1)
+
+/* CCM_CKO3_gROOT */
+#define CCM_CKO3_OSC_24M        ROOT(71U) | MUX(0U) | ID(OSC_24M)
+#define CCM_CKO3_DFS0           ROOT(71U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define CCM_CKO3_OSC_32K        ROOT(71U) | MUX(2U) | ID(OSC_32K)
+#define CCM_CKO3_AUDIO_PLL2     ROOT(71U) | MUX(3U) | ID(AUDIO_PLL2)
+
+/* CCM_CKO4_gROOT */
+#define CCM_CKO4_OSC_24M        ROOT(72U) | MUX(0U) | ID(OSC_24M)
+#define CCM_CKO4_DFS0           ROOT(72U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define CCM_CKO4_OSC_32K        ROOT(72U) | MUX(2U) | ID(OSC_32K)
+#define CCM_CKO4_VIDEO_PLL1     ROOT(72U) | MUX(3U) | ID(VIDEO_PLL1)
+
+/* VPU_APB_gROOT */
+#define VPU_APB_OSC_24M         ROOT(73U) | MUX(0U) | ID(OSC_24M)
+#define VPU_APB_DFS0_DIV2       ROOT(73U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define VPU_APB_DFS1_DIV2       ROOT(73U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define VPU_APB_FRO             ROOT(73U) | MUX(3U) | ID(FRO)
+
+/* VPU_gROOT */
+#define VPU_OSC_24M             ROOT(74U) | MUX(0U) | ID(OSC_24M)
+#define VPU_DFS0                ROOT(74U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define VPU_DFS1                ROOT(74U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define VPU_DFS2                ROOT(74U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* VPU_DSP_gROOT */
+#define VPU_DSP_OSC_24M         ROOT(75U) | MUX(0U) | ID(OSC_24M)
+#define VPU_DSP_DFS0            ROOT(75U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define VPU_DSP_DFS1            ROOT(75U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define VPU_DSP_DFS2            ROOT(75U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* VPU_JPEG_gROOT */
+#define VPU_JPEG_OSC_24M        ROOT(76U) | MUX(0U) | ID(OSC_24M)
+#define VPU_JPEG_DFS0           ROOT(76U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define VPU_JPEG_DFS1           ROOT(76U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define VPU_JPEG_DFS2           ROOT(76U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* AUDIO_XCVR_gROOT */
+#define AUDIO_XCVR_OSC_24M      ROOT(77U) | MUX(0U) | ID(OSC_24M)
+#define AUDIO_XCVR_DFS0         ROOT(77U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define AUDIO_XCVR_DFS1_DIV2    ROOT(77U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define AUDIO_XCVR_FRO          ROOT(77U) | MUX(3U) | ID(FRO)
+
+/* BUS_WAKEUP_gROOT */
+#define BUS_WAKEUP_OSC_24M      ROOT(78U) | MUX(0U) | ID(OSC_24M)
+#define BUS_WAKEUP_DFS0_DIV2    ROOT(78U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define BUS_WAKEUP_DFS1_DIV2    ROOT(78U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define BUS_WAKEUP_FRO          ROOT(78U) | MUX(3U) | ID(FRO)
+
+/* CAN2_gROOT */
+#define CAN2_OSC_24M            ROOT(79U) | MUX(0U) | ID(OSC_24M)
+#define CAN2_DFS0_DIV2          ROOT(79U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define CAN2_DFS1_DIV2          ROOT(79U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define CAN2_FRO                ROOT(79U) | MUX(3U) | ID(FRO)
+
+/* CAN3_gROOT */
+#define CAN3_OSC_24M            ROOT(80U) | MUX(0U) | ID(OSC_24M)
+#define CAN3_DFS0_DIV2          ROOT(80U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define CAN3_DFS1_DIV2          ROOT(80U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define CAN3_FRO                ROOT(80U) | MUX(3U) | ID(FRO)
+
+/* CAN4_gROOT */
+#define CAN4_OSC_24M            ROOT(81U) | MUX(0U) | ID(OSC_24M)
+#define CAN4_DFS0_DIV2          ROOT(81U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define CAN4_DFS1_DIV2          ROOT(81U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define CAN4_FRO                ROOT(81U) | MUX(3U) | ID(FRO)
+
+/* CAN5_gROOT */
+#define CAN5_OSC_24M            ROOT(82U) | MUX(0U) | ID(OSC_24M)
+#define CAN5_DFS0_DIV2          ROOT(82U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define CAN5_DFS1_DIV2          ROOT(82U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define CAN5_FRO                ROOT(82U) | MUX(3U) | ID(FRO)
+
+/* FLEXIO1_gROOT */
+#define FLEXIO1_OSC_24M         ROOT(83U) | MUX(0U) | ID(OSC_24M)
+#define FLEXIO1_DFS0_DIV2       ROOT(83U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define FLEXIO1_DFS1_DIV2       ROOT(83U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define FLEXIO1_FRO             ROOT(83U) | MUX(3U) | ID(FRO)
+
+/* FLEXIO2_gROOT */
+#define FLEXIO2_OSC_24M         ROOT(84U) | MUX(0U) | ID(OSC_24M)
+#define FLEXIO2_DFS0_DIV2       ROOT(84U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define FLEXIO2_DFS1_DIV2       ROOT(84U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define FLEXIO2_FRO             ROOT(84U) | MUX(3U) | ID(FRO)
+
+/* FLEXSPI1_gROOT */
+#define FLEXSPI1_OSC_24M        ROOT(85U) | MUX(0U) | ID(OSC_24M)
+#define FLEXSPI1_DFS0           ROOT(85U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define FLEXSPI1_DFS1           ROOT(85U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define FLEXSPI1_DFS2           ROOT(85U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* I3C2_gROOT */
+#define I3C2_OSC_24M            ROOT(86U) | MUX(0U) | ID(OSC_24M)
+#define I3C2_DFS0_DIV2          ROOT(86U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define I3C2_DFS1_DIV2          ROOT(86U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define I3C2_FRO                ROOT(86U) | MUX(3U) | ID(FRO)
+
+/* I3C2_SLOW_gROOT */
+#define I3C2_SLOW_OSC_24M       ROOT(87U) | MUX(0U) | ID(OSC_24M)
+#define I3C2_SLOW_DFS0_DIV2     ROOT(87U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define I3C2_SLOW_DFS1_DIV2     ROOT(87U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define I3C2_SLOW_FRO           ROOT(87U) | MUX(3U) | ID(FRO)
+
+/* LPI2C3_gROOT */
+#define LPI2C3_OSC_24M          ROOT(88U) | MUX(0U) | ID(OSC_24M)
+#define LPI2C3_DFS0_DIV2        ROOT(88U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPI2C3_DFS1_DIV2        ROOT(88U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPI2C3_FRO              ROOT(88U) | MUX(3U) | ID(FRO)
+
+/* LPI2C4_gROOT */
+#define LPI2C4_OSC_24M          ROOT(89U) | MUX(0U) | ID(OSC_24M)
+#define LPI2C4_DFS0_DIV2        ROOT(89U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPI2C4_DFS1_DIV2        ROOT(89U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPI2C4_FRO              ROOT(89U) | MUX(3U) | ID(FRO)
+
+/* LPI2C5_gROOT */
+#define LPI2C5_OSC_24M          ROOT(90U) | MUX(0U) | ID(OSC_24M)
+#define LPI2C5_DFS0_DIV2        ROOT(90U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPI2C5_DFS1_DIV2        ROOT(90U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPI2C5_FRO              ROOT(90U) | MUX(3U) | ID(FRO)
+
+/* LPI2C6_gROOT */
+#define LPI2C6_OSC_24M          ROOT(91U) | MUX(0U) | ID(OSC_24M)
+#define LPI2C6_DFS0_DIV2        ROOT(91U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPI2C6_DFS1_DIV2        ROOT(91U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPI2C6_FRO              ROOT(91U) | MUX(3U) | ID(FRO)
+
+/* LPI2C7_gROOT */
+#define LPI2C7_OSC_24M          ROOT(92U) | MUX(0U) | ID(OSC_24M)
+#define LPI2C7_DFS0_DIV2        ROOT(92U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPI2C7_DFS1_DIV2        ROOT(92U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPI2C7_FRO              ROOT(92U) | MUX(3U) | ID(FRO)
+
+/* LPI2C8_gROOT */
+#define LPI2C8_OSC_24M          ROOT(93U) | MUX(0U) | ID(OSC_24M)
+#define LPI2C8_DFS0_DIV2        ROOT(93U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPI2C8_DFS1_DIV2        ROOT(93U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPI2C8_FRO              ROOT(93U) | MUX(3U) | ID(FRO)
+
+/* LPSPI3_gROOT */
+#define LPSPI3_OSC_24M          ROOT(94U) | MUX(0U) | ID(OSC_24M)
+#define LPSPI3_DFS0_DIV2        ROOT(94U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPSPI3_DFS1_DIV2        ROOT(94U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPSPI3_FRO              ROOT(94U) | MUX(3U) | ID(FRO)
+
+/* LPSPI4_gROOT */
+#define LPSPI4_OSC_24M          ROOT(95U) | MUX(0U) | ID(OSC_24M)
+#define LPSPI4_DFS0_DIV2        ROOT(95U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPSPI4_DFS1_DIV2        ROOT(95U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPSPI4_FRO              ROOT(95U) | MUX(3U) | ID(FRO)
+
+/* LPSPI5_gROOT */
+#define LPSPI5_OSC_24M          ROOT(96U) | MUX(0U) | ID(OSC_24M)
+#define LPSPI5_DFS0_DIV2        ROOT(96U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPSPI5_DFS1_DIV2        ROOT(96U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPSPI5_FRO              ROOT(96U) | MUX(3U) | ID(FRO)
+
+/* LPSPI6_gROOT */
+#define LPSPI6_OSC_24M          ROOT(97U) | MUX(0U) | ID(OSC_24M)
+#define LPSPI6_DFS0_DIV2        ROOT(97U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPSPI6_DFS1_DIV2        ROOT(97U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPSPI6_FRO              ROOT(97U) | MUX(3U) | ID(FRO)
+
+/* LPSPI7_gROOT */
+#define LPSPI7_OSC_24M          ROOT(98U) | MUX(0U) | ID(OSC_24M)
+#define LPSPI7_DFS0_DIV2        ROOT(98U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPSPI7_DFS1_DIV2        ROOT(98U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPSPI7_FRO              ROOT(98U) | MUX(3U) | ID(FRO)
+
+/* LPSPI8_gROOT */
+#define LPSPI8_OSC_24M          ROOT(99U) | MUX(0U) | ID(OSC_24M)
+#define LPSPI8_DFS0_DIV2        ROOT(99U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPSPI8_DFS1_DIV2        ROOT(99U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPSPI8_FRO              ROOT(99U) | MUX(3U) | ID(FRO)
+
+/* LPTMR2_gROOT */
+#define LPTMR2_OSC_24M          ROOT(100U) | MUX(0U) | ID(OSC_24M)
+#define LPTMR2_DFS0_DIV2        ROOT(100U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPTMR2_DFS1_DIV2        ROOT(100U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPTMR2_FRO              ROOT(100U) | MUX(3U) | ID(FRO)
+
+/* LPUART3_gROOT */
+#define LPUART3_OSC_24M         ROOT(101U) | MUX(0U) | ID(OSC_24M)
+#define LPUART3_DFS0_DIV2       ROOT(101U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPUART3_DFS1_DIV2       ROOT(101U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPUART3_FRO             ROOT(101U) | MUX(3U) | ID(FRO)
+
+/* LPUART4_gROOT */
+#define LPUART4_OSC_24M         ROOT(102U) | MUX(0U) | ID(OSC_24M)
+#define LPUART4_DFS0_DIV2       ROOT(102U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPUART4_DFS1_DIV2       ROOT(102U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPUART4_FRO             ROOT(102U) | MUX(3U) | ID(FRO)
+
+/* LPUART5_gROOT */
+#define LPUART5_OSC_24M         ROOT(103U) | MUX(0U) | ID(OSC_24M)
+#define LPUART5_DFS0_DIV2       ROOT(103U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPUART5_DFS1_DIV2       ROOT(103U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPUART5_FRO             ROOT(103U) | MUX(3U) | ID(FRO)
+
+/* LPUART6_gROOT */
+#define LPUART6_OSC_24M         ROOT(104U) | MUX(0U) | ID(OSC_24M)
+#define LPUART6_DFS0_DIV2       ROOT(104U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPUART6_DFS1_DIV2       ROOT(104U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPUART6_FRO             ROOT(104U) | MUX(3U) | ID(FRO)
+
+/* LPUART7_gROOT */
+#define LPUART7_OSC_24M         ROOT(105U) | MUX(0U) | ID(OSC_24M)
+#define LPUART7_DFS0_DIV2       ROOT(105U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPUART7_DFS1_DIV2       ROOT(105U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPUART7_FRO             ROOT(105U) | MUX(3U) | ID(FRO)
+
+/* LPUART8_gROOT */
+#define LPUART8_OSC_24M         ROOT(106U) | MUX(0U) | ID(OSC_24M)
+#define LPUART8_DFS0_DIV2       ROOT(106U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define LPUART8_DFS1_DIV2       ROOT(106U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define LPUART8_FRO             ROOT(106U) | MUX(3U) | ID(FRO)
+
+/* SAI3_gROOT */
+#define SAI3_OSC_24M            ROOT(107U) | MUX(0U) | ID(OSC_24M)
+#define SAI3_AUDIO_PLL1         ROOT(107U) | MUX(1U) | ID(AUDIO_PLL1)
+#define SAI3_AUDIO_PLL2         ROOT(107U) | MUX(2U) | ID(AUDIO_PLL2)
+#define SAI3_EXT                ROOT(107U) | MUX(3U) | ID(EXT)
+
+/* SAI4_gROOT */
+#define SAI4_OSC_24M            ROOT(108U) | MUX(0U) | ID(OSC_24M)
+#define SAI4_AUDIO_PLL1         ROOT(108U) | MUX(1U) | ID(AUDIO_PLL1)
+#define SAI4_AUDIO_PLL2         ROOT(108U) | MUX(2U) | ID(AUDIO_PLL2)
+#define SAI4_EXT                ROOT(108U) | MUX(3U) | ID(EXT)
+
+/* SAI5_gROOT */
+#define SAI5_OSC_24M            ROOT(109U) | MUX(0U) | ID(OSC_24M)
+#define SAI5_AUDIO_PLL1         ROOT(109U) | MUX(1U) | ID(AUDIO_PLL1)
+#define SAI5_AUDIO_PLL2         ROOT(109U) | MUX(2U) | ID(AUDIO_PLL2)
+#define SAI5_EXT                ROOT(109U) | MUX(3U) | ID(EXT)
+
+/* SPDIF_gROOT */
+#define SPDIF_OSC_24M           ROOT(110U) | MUX(0U) | ID(OSC_24M)
+#define SPDIF_AUDIO_PLL1        ROOT(110U) | MUX(1U) | ID(AUDIO_PLL1)
+#define SPDIF_AUDIO_PLL2        ROOT(110U) | MUX(2U) | ID(AUDIO_PLL2)
+#define SPDIF_EXT               ROOT(110U) | MUX(3U) | ID(EXT)
+
+/* SWO_TRACE_gROOT */
+#define SWO_TRACE_OSC_24M       ROOT(111U) | MUX(0U) | ID(OSC_24M)
+#define SWO_TRACE_DFS0_DIV2     ROOT(111U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define SWO_TRACE_DFS1_DIV2     ROOT(111U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define SWO_TRACE_FRO           ROOT(111U) | MUX(3U) | ID(FRO)
+
+/* TPM4_gROOT */
+#define TPM4_OSC_24M            ROOT(112U) | MUX(0U) | ID(OSC_24M)
+#define TPM4_DFS0               ROOT(112U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define TPM4_AUDIO_PLL1         ROOT(112U) | MUX(2U) | ID(AUDIO_PLL1)
+#define TPM4_EXT                ROOT(112U) | MUX(3U) | ID(EXT)
+
+/* TPM5_gROOT */
+#define TPM5_OSC_24M            ROOT(113U) | MUX(0U) | ID(OSC_24M)
+#define TPM5_DFS0               ROOT(113U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define TPM5_AUDIO_PLL1         ROOT(113U) | MUX(2U) | ID(AUDIO_PLL1)
+#define TPM5_EXT                ROOT(113U) | MUX(3U) | ID(EXT)
+
+/* TPM6_gROOT */
+#define TPM6_OSC_24M            ROOT(114U) | MUX(0U) | ID(OSC_24M)
+#define TPM6_DFS0               ROOT(114U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define TPM6_AUDIO_PLL1         ROOT(114U) | MUX(2U) | ID(AUDIO_PLL1)
+#define TPM6_EXT                ROOT(114U) | MUX(3U) | ID(EXT)
+
+/* TSTMR2_gROOT */
+#define TSTMR2_OSC_24M          ROOT(115U) | MUX(0U) | ID(OSC_24M)
+#define TSTMR2_DFS0_DIV2        ROOT(115U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define TSTMR2_DFS1_DIV2        ROOT(115U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define TSTMR2_FRO              ROOT(115U) | MUX(3U) | ID(FRO)
+
+/* USB_PHY_BURUNIN_gROOT */
+#define USB_PHY_OSC_24M         ROOT(116U) | MUX(0U) | ID(OSC_24M)
+#define USB_PHY_DFS0_DIV2       ROOT(116U) | MUX(1U) | ID(SYS_PLL1_DFS0_DIV2)
+#define USB_PHY_DFS1_DIV2       ROOT(116U) | MUX(2U) | ID(SYS_PLL1_DFS1_DIV2)
+#define USB_PHY_FRO             ROOT(116U) | MUX(3U) | ID(FRO)
+
+/* USDHC1_gROOT */
+#define USDHC1_OSC_24M          ROOT(117U) | MUX(0U) | ID(OSC_24M)
+#define USDHC1_DFS0             ROOT(117U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define USDHC1_DFS1             ROOT(117U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define USDHC1_DFS2             ROOT(117U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* USDHC2_gROOT */
+#define USDHC2_OSC_24M          ROOT(118U) | MUX(0U) | ID(OSC_24M)
+#define USDHC2_DFS0             ROOT(118U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define USDHC2_DFS1             ROOT(118U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define USDHC2_DFS2             ROOT(118U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* USDHC3_gROOT */
+#define USDHC3_OSC_24M          ROOT(119U) | MUX(0U) | ID(OSC_24M)
+#define USDHC3_DFS0             ROOT(119U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define USDHC3_DFS1             ROOT(119U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define USDHC3_DFS2             ROOT(119U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* V2X_PK_gROOT */
+#define V2X_PK_OSC_24M          ROOT(120U) | MUX(0U) | ID(OSC_24M)
+#define V2X_PK_DFS0             ROOT(120U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define V2X_PK_DFS1             ROOT(120U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define V2X_PK_DFS2             ROOT(120U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* WAKEUP_AXI_gROOT */
+#define WAKEUP_AXI_OSC_24M      ROOT(121U) | MUX(0U) | ID(OSC_24M)
+#define WAKEUP_AXI_DFS0         ROOT(121U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define WAKEUP_AXI_DFS1         ROOT(121U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define WAKEUP_AXI_DFS2         ROOT(121U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+/* XSPI_SLV_gROOT */
+#define XSPI_SLV_OSC_24M        ROOT(122U) | MUX(0U) | ID(OSC_24M)
+#define XSPI_SLV_DFS0           ROOT(122U) | MUX(1U) | ID(SYS_PLL1_DFS0)
+#define XSPI_SLV_DFS1           ROOT(122U) | MUX(2U) | ID(SYS_PLL1_DFS1)
+#define XSPI_SLV_DFS2           ROOT(122U) | MUX(3U) | ID(SYS_PLL1_DFS2)
+
+#endif /* __ARCH_ARM_SRC_IMX9_HARDWARE_IMX93_IMX93_EDMA_H */
diff --git a/arch/arm64/src/imx9/imx9_clockconfig.c 
b/arch/arm64/src/imx9/imx9_clockconfig.c
index 790d87b6a6c..9de5ac914c4 100644
--- a/arch/arm64/src/imx9/imx9_clockconfig.c
+++ b/arch/arm64/src/imx9/imx9_clockconfig.c
@@ -36,11 +36,16 @@
 #include <arch/board/board.h>
 
 #include "arm64_internal.h"
-#include "imx9_ccm.h"
-#include "imx9_clockconfig.h"
 
+#ifndef CONFIG_IMX9_CLK_OVER_SCMI
+
+#include "imx9_ccm.h"
 #include "hardware/imx9_ccm.h"
 
+#endif
+
+#include "imx9_clockconfig.h"
+
 /****************************************************************************
  * Pre-processor Definitions
  ****************************************************************************/
@@ -176,6 +181,129 @@ static int pll_pfd_init(uintptr_t reg, int pfd, struct 
pfd_parms_s *pfdparm)
 #endif /* CONFIG_IMX9_CFG_PLLS */
 #endif
 
+#ifdef CONFIG_IMX9_CLK_OVER_SCMI
+
+/****************************************************************************
+ * Name: imx9_sm_getipfreq
+ *
+ * Description:
+ *   This function get the clock rate
+ *
+ * Input Parameters:
+ *  clk - The clock to be get the rate
+ *
+ * Returned Value:
+ *   rate is returned on success; a negated errno value is returned on
+ *   any failure.
+ *
+ ****************************************************************************/
+
+static int imx9_sm_getipfreq(scmi_clock_t *clk)
+{
+  scmi_clock_rate_t rate =
+    {
+      0, 0
+    };
+
+  uint32_t channel  = clk->channel;
+  uint32_t clock_id = clk->clk_id;
+  int status;
+
+  status = imx9_scmi_get_clock_rate(channel, clock_id, &rate);
+  if (status < 0)
+    {
+      return status;
+    }
+
+  return rate.lower;
+}
+
+/****************************************************************************
+ * Name: imx9_sm_setrootclock
+ *
+ * Description:
+ *   This function set root for clock
+ *
+ * Input Parameters:
+ *  clk - The clock to be set root
+ *
+ * Returned Value:
+ *   Zero (OK) is returned on success; a negated errno value is returned on
+ *   any failure.
+ *
+ ****************************************************************************/
+
+static int imx9_sm_setrootclock(scmi_clock_t *clk)
+{
+  scmi_clock_rate_t rate =
+    {
+      0, 0
+    };
+
+  uint32_t channel        = clk->channel;
+  uint32_t clock_id       = clk->clk_id;
+  uint32_t pclk_id        = clk->pclk_id;
+  uint32_t div            = clk->div;
+  uint32_t attributes     = clk->attributes;
+  uint32_t oem_config_val = clk->oem_config_val;
+  uint32_t flags          = clk->flags;
+  uint32_t old_pclk_id    = 0; /* parent clock id */
+  uint64_t src_rate, root_rate;
+  int status;
+
+  if (div == 0)
+    {
+      return -EINVAL;
+    }
+
+  status = imx9_scmi_get_clock_parent(channel, clock_id, &old_pclk_id);
+  if (status != 0)
+    {
+      return status;
+    }
+
+  if (old_pclk_id != pclk_id)
+    {
+      status = imx9_scmi_set_clock_parent(channel, clock_id, pclk_id);
+      if (status != 0)
+        {
+          return status;
+        }
+    }
+
+  status = imx9_scmi_get_clock_rate(channel, pclk_id, &rate);
+  if (status != 0)
+    {
+      return status;
+    }
+
+  src_rate = rate.upper;
+  src_rate = (src_rate << 32);
+  src_rate |= rate.lower;
+
+  root_rate = src_rate / div;
+
+  rate.lower = root_rate & SCMI_CLOCK_RATE_MASK;
+  rate.upper = (root_rate >> 32) & SCMI_CLOCK_RATE_MASK;
+
+  status = imx9_scmi_set_clock_rate(channel, clock_id, flags, rate);
+  if (status != 0)
+    {
+      return status;
+    }
+
+  status = imx9_scmi_set_clock_config(channel, clock_id, attributes,
+                                      oem_config_val);
+  if (status != 0)
+    {
+      return status;
+    }
+
+  return OK;
+}
+
+#else
+
 static uint32_t calculate_vco_freq(const struct pll_parms_s *parm, bool frac)
 {
   /* Base clock is common for all VCO:s */
@@ -514,6 +642,131 @@ int imx9_get_clock(int clkname, uint32_t *frequency)
   return OK;
 }
 
+#endif /* CONFIG_IMX9_CLK_OVER_SCMI */
+
+#ifdef CONFIG_IMX9_CLK_OVER_SCMI
+/****************************************************************************
+ * Name: imx9_configure_clock
+ *
+ * Description:
+ *   This function config and enable the clock
+ *
+ * Input Parameters:
+ *   config  - The clock config
+ *   enabled - If enable the clock
+ *
+ * Returned Value:
+ *   Zero (OK) is returned on success; a negated errno value is returned on
+ *   any failure.
+ *
+ ****************************************************************************/
+
+int imx9_configure_clock(clock_config_t config, bool enabled)
+{
+  scmi_clock_t clk =
+    {
+      0
+    };
+
+  clk.clk_id  = GET_ROOT(config) + ROOT_CLOCK_OFFSET;
+  clk.pclk_id = GET_ID(config);
+  clk.channel = SCMI_PLATFORM_A2P;
+  clk.div     = GET_DIV(config);
+
+  if (clk.div == 0)
+    {
+      /* Make sure div is always 1 */
+
+      clk.div = 1;
+    }
+
+  clk.attributes = SCMI_CLOCK_CONFIG_SET_ENABLE(enabled);
+  clk.flags      = SCMI_CLOCK_RATE_FLAGS_ROUND(SCMI_CLOCK_ROUND_AUTO);
+
+  return imx9_sm_setrootclock(&clk);
+}
+
+/****************************************************************************
+ * Name: imx9_get_rootclock
+ *
+ * Description:
+ *   This function returns the clock frequency of the specified root
+ *   functional clock.
+ *
+ * Input Parameters:
+ *   clkroot   - Identifies the peripheral clock of interest
+ *   frequency - The location where the peripheral clock frequency will be
+ *              returned
+ *
+ * Returned Value:
+ *   Zero (OK) is returned on success; a negated errno value is returned on
+ *   any failure.
+ *
+ ****************************************************************************/
+
+int imx9_get_rootclock(int clkroot, uint32_t *frequency)
+{
+  if (clkroot < CCM_CR_COUNT)
+    {
+      int ret = 0;
+
+      scmi_clock_t clk =
+        {
+          0
+        };
+
+      clk.clk_id  = (uint32_t)(clkroot + ROOT_CLOCK_OFFSET);
+      clk.channel = SCMI_PLATFORM_A2P;
+
+      ret = imx9_sm_getipfreq(&clk);
+
+      if (ret < 0)
+        {
+          return ret;
+        }
+      else
+        {
+          *frequency = ret;
+          return OK;
+        }
+    }
+
+  return -ENODEV;
+}
+
+/****************************************************************************
+ * Name: imx9_set_clock_freq
+ *
+ * Description:
+ *   This function set the clock frequency of the specified clock.
+ *
+ * Input Parameters:
+ *   clkid     - Identifies the peripheral clock of interest
+ *   frequency - The location where the peripheral clock frequency will be
+ *               set
+ *
+ * Returned Value:
+ *   Zero (OK) is returned on success; a negated errno value is returned on
+ *   any failure.
+ *
+ ****************************************************************************/
+
+int imx9_set_clock_freq(int clock_id, uint32_t frequency)
+{
+  scmi_clock_rate_t rate =
+    {
+      0, 0
+    };
+
+  rate.lower = frequency;
+
+  return imx9_scmi_set_clock_rate(SCMI_PLATFORM_A2P, clock_id,
+                                  SCMI_CLOCK_RATE_FLAGS_ROUND(
+                                  SCMI_CLOCK_ROUND_AUTO), rate);
+}
+
+#else
+
 /****************************************************************************
  * Name: imx9_get_rootclock
  *
@@ -562,3 +815,5 @@ int imx9_get_rootclock(int clkroot, uint32_t *frequency)
 
   return -ENODEV;
 }
+
+#endif /* CONFIG_IMX9_CLK_OVER_SCMI */
diff --git a/arch/arm64/src/imx9/imx9_clockconfig.h 
b/arch/arm64/src/imx9/imx9_clockconfig.h
index 3f9feaf5a6c..417a9a19136 100644
--- a/arch/arm64/src/imx9/imx9_clockconfig.h
+++ b/arch/arm64/src/imx9/imx9_clockconfig.h
@@ -31,10 +31,18 @@
 
 #include <stdint.h>
 
+#ifdef CONFIG_IMX9_CLK_OVER_SCMI
+
+#include "hardware/imx95/imx95_clock.h"
+#include "imx9_scmi.h"
+
+#endif
+
 /****************************************************************************
  * Pre-processor Definitions
  ****************************************************************************/
 
+#ifndef CONFIG_IMX9_CLK_OVER_SCMI
 #define PLL_PARMS(_rdiv, _odiv, _mfi, _mfn, _mfd) \
   {                                               \
     .rdiv = (_rdiv),                              \
@@ -146,7 +154,45 @@ void imx9_clockconfig(void);
  ****************************************************************************/
 
 int imx9_get_clock(int clkname, uint32_t *frequency);
+#else
+
+/****************************************************************************
+ * Name: imx9_configure_clock
+ *
+ * Description:
+ *   This function config and enable the clock
+ *
+ * Input Parameters:
+ *   clk_config - The clock config
+ *   enabled    - If enable the clock
+ *
+ * Returned Value:
+ *   Zero (OK) is returned on success; a negated errno value is returned on
+ *   any failure.
+ *
+ ****************************************************************************/
+
+int imx9_configure_clock(clock_config_t clk_config, bool enabled);
+
+/****************************************************************************
+ * Name: imx9_set_clock_freq
+ *
+ * Description:
+ *   This function set the clock frequency of the specified clock.
+ *
+ * Input Parameters:
+ *   clkid     - Identifies the peripheral clock of interest
+ *   frequency - The location where the peripheral clock frequency will be
+ *               set
+ *
+ * Returned Value:
+ *   Zero (OK) is returned on success; a negated errno value is returned on
+ *   any failure.
+ *
+ ****************************************************************************/
 
+int imx9_set_clock_freq(int clock_id, uint32_t frequency);
+#endif
 /****************************************************************************
  * Name: imx9_get_rootclock
  *

Reply via email to