Skip to content

Commit cac79ba

Browse files
WinteriWangJonyZhang7
authored andcommitted
drivers: clock: ccm_rev2: add imx93 common clocks set support
Setup most clocks with common_clock_set_freq(). PLL and mux are preset. Signed-off-by: Winteri Wang <dongjie.wang@nxp.com>
1 parent 35f8f79 commit cac79ba

File tree

5 files changed

+125
-0
lines changed

5 files changed

+125
-0
lines changed

drivers/clock_control/clock_control_mcux_ccm_rev2.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
#include <zephyr/drivers/clock_control.h>
1010
#include <zephyr/dt-bindings/clock/imx_ccm_rev2.h>
1111
#include <fsl_clock.h>
12+
#if defined(CONFIG_SOC_MIMX9352)
13+
#include <soc.h>
14+
#endif
1215

1316
#define LOG_LEVEL CONFIG_CLOCK_CONTROL_LOG_LEVEL
1417
#include <zephyr/logging/log.h>
@@ -182,6 +185,27 @@ static int mcux_ccm_get_subsys_rate(const struct device *dev,
182185
break;
183186
#endif
184187

188+
#if defined(CONFIG_SOC_MIMX9352)
189+
case IMX_CCM_MEDIA_AXI_CLK:
190+
clock_root = kCLOCK_Root_MediaAxi;
191+
break;
192+
case IMX_CCM_MEDIA_APB_CLK:
193+
clock_root = kCLOCK_Root_MediaApb;
194+
break;
195+
case IMX_CCM_MEDIA_DISP_PIX_CLK:
196+
clock_root = kCLOCK_Root_MediaDispPix;
197+
break;
198+
case IMX_CCM_MEDIA_LDB_CLK:
199+
clock_root = kCLOCK_Root_MediaLdb;
200+
break;
201+
case IMX_CCM_MIPI_PHY_CFG_CLK:
202+
clock_root = kCLOCK_Root_MipiPhyCfg;
203+
break;
204+
case IMX_CCM_CAM_PIX_CLK:
205+
clock_root = kCLOCK_Root_CamPix;
206+
break;
207+
#endif
208+
185209
#if defined(CONFIG_SOC_MIMX9352) && defined(CONFIG_DAI_NXP_SAI)
186210
case IMX_CCM_SAI1_CLK:
187211
case IMX_CCM_SAI2_CLK:
@@ -372,6 +396,16 @@ static int CCM_SET_FUNC_ATTR mcux_ccm_set_subsys_rate(const struct device *dev,
372396
return mipi_csi2rx_clock_set_freq(kCLOCK_Root_Csi2_Esc, clock_rate);
373397
#endif
374398

399+
#if defined(CONFIG_SOC_MIMX9352)
400+
case IMX_CCM_MEDIA_AXI_CLK:
401+
case IMX_CCM_MEDIA_APB_CLK:
402+
case IMX_CCM_MEDIA_DISP_PIX_CLK:
403+
case IMX_CCM_MEDIA_LDB_CLK:
404+
case IMX_CCM_MIPI_PHY_CFG_CLK:
405+
case IMX_CCM_CAM_PIX_CLK:
406+
return common_clock_set_freq(clock_name, (uint32_t)clock_rate);
407+
#endif
408+
375409
default:
376410
/* Silence unused variable warning */
377411
ARG_UNUSED(clock_rate);

include/zephyr/dt-bindings/clock/imx_ccm_rev2.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,4 +166,12 @@
166166
#define IMX_CCM_QTMR3_CLK 0x6002UL
167167
#define IMX_CCM_QTMR4_CLK 0x6003UL
168168

169+
/* MEDIA */
170+
#define IMX_CCM_MEDIA_AXI_CLK 0x3000UL
171+
#define IMX_CCM_MEDIA_APB_CLK 0x3100UL
172+
#define IMX_CCM_MEDIA_DISP_PIX_CLK 0x3200UL
173+
#define IMX_CCM_MEDIA_LDB_CLK 0x3300UL
174+
#define IMX_CCM_MIPI_PHY_CFG_CLK 0x3400UL
175+
#define IMX_CCM_CAM_PIX_CLK 0x3500UL
176+
169177
#endif /* ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_IMX_CCM_REV2_H_ */

soc/nxp/imx/imx9/imx93/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ if(CONFIG_SOC_MIMX9352_A55)
55
zephyr_include_directories(a55)
66

77
zephyr_sources_ifdef(CONFIG_ARM_MMU a55/mmu_regions.c)
8+
zephyr_sources(common_clock_set.c)
89

910
set(SOC_LINKER_SCRIPT ${ZEPHYR_BASE}/include/zephyr/arch/arm64/scripts/linker.ld CACHE INTERNAL "")
1011
elseif(CONFIG_SOC_MIMX9352_M33)

soc/nxp/imx/imx9/imx93/a55/soc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@
77
#ifndef _SOC_NXP_IMX_IMX93_A55_SOC_H_
88
#define _SOC_NXP_IMX_IMX93_A55_SOC_H_
99

10+
uint32_t common_clock_set_freq(uint32_t clock_name, uint32_t rate);
1011

1112
#endif /* _SOC_NXP_IMX_IMX93_A55_SOC_H_ */
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
* Copyright 2025 NXP
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <fsl_clock.h>
8+
#include <soc.h>
9+
#include <errno.h>
10+
#include <zephyr/irq.h>
11+
#include <zephyr/dt-bindings/clock/imx_ccm_rev2.h>
12+
#include <zephyr/logging/log.h>
13+
14+
LOG_MODULE_REGISTER(imx93_common_clock_set, CONFIG_SOC_LOG_LEVEL);
15+
16+
uint32_t common_clock_set_freq(uint32_t clock_name, uint32_t rate)
17+
{
18+
clock_name_t root;
19+
uint32_t root_rate;
20+
clock_root_t clk_root;
21+
clock_lpcg_t clk_gate;
22+
uint32_t divider;
23+
24+
switch (clock_name) {
25+
case IMX_CCM_MEDIA_AXI_CLK:
26+
clk_root = kCLOCK_Root_MediaAxi;
27+
clk_gate = kCLOCK_IpInvalid;
28+
CLOCK_SetRootClockMux(kCLOCK_Root_MediaAxi,
29+
kCLOCK_MEDIAAXI_ClockRoot_MuxSysPll1Pfd1);
30+
break;
31+
case IMX_CCM_MEDIA_APB_CLK:
32+
clk_root = kCLOCK_Root_MediaApb;
33+
clk_gate = kCLOCK_IpInvalid;
34+
CLOCK_SetRootClockMux(kCLOCK_Root_MediaApb,
35+
kCLOCK_MEDIAAPB_ClockRoot_MuxSysPll1Pfd1Div2);
36+
break;
37+
case IMX_CCM_MEDIA_DISP_PIX_CLK:
38+
clk_root = kCLOCK_Root_MediaDispPix;
39+
clk_gate = kCLOCK_Lcdif;
40+
CLOCK_SetRootClockMux(kCLOCK_Root_MediaDispPix,
41+
kCLOCK_MEDIADISPPIX_ClockRoot_MuxVideoPll1Out);
42+
break;
43+
case IMX_CCM_MEDIA_LDB_CLK:
44+
clk_root = kCLOCK_Root_MediaLdb;
45+
clk_gate = kCLOCK_Lvds;
46+
CLOCK_SetRootClockMux(kCLOCK_Root_MediaLdb,
47+
kCLOCK_MEDIALDB_ClockRoot_MuxVideoPll1Out);
48+
break;
49+
case IMX_CCM_MIPI_PHY_CFG_CLK:
50+
clk_root = kCLOCK_Root_MipiPhyCfg;
51+
clk_gate = kCLOCK_Mipi_Dsi;
52+
break;
53+
case IMX_CCM_CAM_PIX_CLK:
54+
clk_root = kCLOCK_Root_CamPix;
55+
clk_gate = kCLOCK_Mipi_Csi;
56+
CLOCK_SetRootClockMux(kCLOCK_Root_CamPix,
57+
kCLOCK_MEDIALDB_ClockRoot_MuxVideoPll1Out);
58+
break;
59+
default:
60+
return -ENOTSUP;
61+
}
62+
63+
root = CLOCK_GetRootClockSource(clk_root, CLOCK_GetRootClockMux(clk_root));
64+
root_rate = g_clockSourceFreq[root];
65+
divider = ((root_rate + (rate - 1)) / rate);
66+
67+
LOG_DBG("clock_name: 0x%x, root_rate: %d, divider: %d", clock_name, root_rate, divider);
68+
69+
if (clk_gate < kCLOCK_IpInvalid) {
70+
CLOCK_DisableClock(clk_gate);
71+
}
72+
73+
CLOCK_SetRootClockDiv(clk_root, divider);
74+
CLOCK_PowerOnRootClock(clk_root);
75+
76+
if (clk_gate < kCLOCK_IpInvalid) {
77+
CLOCK_EnableClock(clk_gate);
78+
}
79+
80+
return 0;
81+
}

0 commit comments

Comments
 (0)