1 /*
2  * Copyright 2020-2024, NXP
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #ifndef _FSL_CLOCK_H_
9 #define _FSL_CLOCK_H_
10 
11 #include "fsl_common.h"
12 #include "fsl_reset.h"
13 
14 /*! @addtogroup clock */
15 /*! @{ */
16 
17 /*! @file */
18 
19 /*******************************************************************************
20  * Configurations
21  ******************************************************************************/
22 
23 /*! @brief Configure whether driver controls clock
24  *
25  * When set to 0, peripheral drivers will enable clock in initialize function
26  * and disable clock in de-initialize function. When set to 1, peripheral
27  * driver will not control the clock, application could control the clock out of
28  * the driver.
29  *
30  * @note All drivers share this feature switcher. If it is set to 1, application
31  * should handle clock enable and disable for all drivers.
32  */
33 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL))
34 #define FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL 0
35 #endif
36 
37 /*******************************************************************************
38  * Definitions
39  ******************************************************************************/
40 
41 /*! @name Driver version */
42 /*@{*/
43 /*! @brief CLOCK driver version 2.3.0. */
44 #define FSL_CLOCK_DRIVER_VERSION (MAKE_VERSION(2, 3, 0))
45 /*@}*/
46 
47 /* Definition for delay API in clock driver, users can redefine it to the real application. */
48 #ifndef SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY
49 #define SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY (260000000UL)
50 #endif
51 
52 /*! @brief Clock ip name array for GPIO. */
53 #define GPIO_CLOCKS                    \
54     {                                  \
55         kCLOCK_HsGpio0, kCLOCK_HsGpio1 \
56     }
57 
58 /*! @brief Clock ip name array for CACHE64. */
59 #define CACHE64_CLOCKS                 \
60     {                                  \
61         kCLOCK_Flexspi, kCLOCK_Flexspi \
62     }
63 
64 /*! @brief Clock ip name array for FLEXSPI. */
65 #define FLEXSPI_CLOCKS \
66     {                  \
67         kCLOCK_Flexspi \
68     }
69 
70 /*! @brief Clock ip name array for FLEXCOMM. */
71 #define FLEXCOMM_CLOCKS                                                                           \
72     {                                                                                             \
73         kCLOCK_Flexcomm0, kCLOCK_Flexcomm1, kCLOCK_Flexcomm2, kCLOCK_Flexcomm3, kCLOCK_Flexcomm14 \
74     }
75 
76 /*! @brief Clock ip name array for LPUART. */
77 #define USART_CLOCKS                                                           \
78     {                                                                          \
79         kCLOCK_Flexcomm0, kCLOCK_Flexcomm1, kCLOCK_Flexcomm2, kCLOCK_Flexcomm3 \
80     }
81 
82 /*! @brief Clock ip name array for I2C. */
83 #define I2C_CLOCKS                                                             \
84     {                                                                          \
85         kCLOCK_Flexcomm0, kCLOCK_Flexcomm1, kCLOCK_Flexcomm2, kCLOCK_Flexcomm3 \
86     }
87 
88 /*! @brief Clock ip name array for SPI. */
89 #define SPI_CLOCKS                                                                                \
90     {                                                                                             \
91         kCLOCK_Flexcomm0, kCLOCK_Flexcomm1, kCLOCK_Flexcomm2, kCLOCK_Flexcomm3, kCLOCK_Flexcomm14 \
92     }
93 
94 /*! @brief Clock ip name array for ACOMP. */
95 #define ACOMP_CLOCKS \
96     {                \
97         kCLOCK_Gau   \
98     }
99 
100 /*! @brief Clock ip name array for ADC. */
101 #define ADC_CLOCKS             \
102     {                          \
103         kCLOCK_Gau, kCLOCK_Gau \
104     }
105 
106 /*! @brief Clock ip name array for DAC. */
107 #define DAC_CLOCKS \
108     {              \
109         kCLOCK_Gau \
110     }
111 
112 /*! @brief Clock ip name array for LCDIC. */
113 #define LCDIC_CLOCKS \
114     {                \
115         kCLOCK_Lcdic \
116     }
117 
118 /*! @brief Clock ip name array for DMA. */
119 #define DMA_CLOCKS               \
120     {                            \
121         kCLOCK_Dma0, kCLOCK_Dma1 \
122     }
123 
124 /*! @brief Clock ip name array for DMIC. */
125 #define DMIC_CLOCKS  \
126     {                \
127         kCLOCK_Dmic0 \
128     }
129 
130 /*! @brief Clock ip name array for ENET. */
131 #define ENET_CLOCKS    \
132     {                  \
133         kCLOCK_EnetIpg \
134     }
135 
136 /*! @brief Extra clock ip name array for ENET. */
137 #define ENET_EXTRA_CLOCKS \
138     {                     \
139         kCLOCK_EnetIpgS   \
140     }
141 
142 /*! @brief Clock ip name array for Powerquad */
143 #define POWERQUAD_CLOCKS \
144     {                    \
145         kCLOCK_PowerQuad \
146     }
147 
148 /*! @brief Clock ip name array for OSTimer */
149 #define OSTIMER_CLOCKS      \
150     {                       \
151         kCLOCK_OsEventTimer \
152     }
153 
154 /*! @brief Clock ip name array for CT32B. */
155 #define CTIMER_CLOCKS                                                             \
156     {                                                                             \
157         kCLOCK_Ct32b0, kCLOCK_Ct32b1, kCLOCK_Ct32b2, kCLOCK_Ct32b3, kCLOCK_Ct32b4 \
158     }
159 
160 /*! @brief Clock ip name array for UTICK. */
161 #define UTICK_CLOCKS \
162     {                \
163         kCLOCK_Utick \
164     }
165 
166 /*! @brief Clock ip name array for MRT. */
167 #define MRT_CLOCKS                 \
168     {                              \
169         kCLOCK_Mrt, kCLOCK_FreeMrt \
170     }
171 
172 /*! @brief Clock ip name array for SCT. */
173 #define SCT_CLOCKS \
174     {              \
175         kCLOCK_Sct \
176     }
177 
178 /*! @brief Clock ip name array for RTC. */
179 #define RTC_CLOCKS \
180     {              \
181         kCLOCK_Rtc \
182     }
183 
184 /*! @brief Clock ip name array for WWDT. */
185 #define WWDT_CLOCKS  \
186     {                \
187         kCLOCK_Wwdt0 \
188     }
189 
190 /*! @brief Clock ip name array for TRNG. */
191 #define TRNG_CLOCKS \
192     {               \
193         kCLOCK_Trng \
194     }
195 
196 /*! @brief Clock ip name array for USIM. */
197 #define USIM_CLOCKS \
198     {               \
199         kCLOCK_Usim \
200     }
201 
202 /*! @brief Clock gate name used for CLOCK_EnableClock/CLOCK_DisableClock. */
203 /*------------------------------------------------------------------------------
204  clock_ip_name_t definition:
205 ------------------------------------------------------------------------------*/
206 
207 #define CLK_GATE_REG_OFFSET_SHIFT 8U
208 #define CLK_GATE_REG_OFFSET_MASK  0xFF00U
209 #define CLK_GATE_BIT_SHIFT_SHIFT  0U
210 #define CLK_GATE_BIT_SHIFT_MASK   0x000000FFU
211 
212 #define CLK_GATE_DEFINE(reg_offset, bit_shift)                                  \
213     ((((reg_offset) << CLK_GATE_REG_OFFSET_SHIFT) & CLK_GATE_REG_OFFSET_MASK) | \
214      (((bit_shift) << CLK_GATE_BIT_SHIFT_SHIFT) & CLK_GATE_BIT_SHIFT_MASK))
215 
216 #define CLK_GATE_ABSTRACT_REG_OFFSET(x) (((uint32_t)(x)&CLK_GATE_REG_OFFSET_MASK) >> CLK_GATE_REG_OFFSET_SHIFT)
217 #define CLK_GATE_ABSTRACT_BITS_SHIFT(x) (((uint32_t)(x)&CLK_GATE_BIT_SHIFT_MASK) >> CLK_GATE_BIT_SHIFT_SHIFT)
218 
219 #define CLK_CTL0_PSCCTL0 0
220 #define CLK_CTL0_PSCCTL1 1
221 #define CLK_CTL0_PSCCTL2 2
222 #define CLK_CTL1_PSCCTL0 3
223 #define CLK_CTL1_PSCCTL1 4
224 #define CLK_CTL1_PSCCTL2 5
225 
226 #define SYS_CLK_GATE_FLAG_MASK         (0x10000UL)
227 #define SYS_CLK_GATE_DEFINE(bit_shift) (((bit_shift)&CLK_GATE_BIT_SHIFT_MASK) | SYS_CLK_GATE_FLAG_MASK)
228 #define SYS_CLK_GATE_BIT_MASK(x)       (1UL << (((uint32_t)(x)&CLK_GATE_BIT_SHIFT_MASK) >> CLK_GATE_BIT_SHIFT_SHIFT))
229 
230 #define CLKCTL0_TUPLE_MUXA(reg, choice) (((reg)&0xFFCU) | ((choice) << 12U))
231 #define CLKCTL0_TUPLE_MUXB(reg, choice) ((((reg)&0xFFCU) << 16) | ((choice) << 28U))
232 #define CLKCTL1_TUPLE_FLAG_MASK         (0x8000U)
233 #define CLKCTL1_TUPLE_MUXA(reg, choice) (((reg)&0xFFCU) | CLKCTL1_TUPLE_FLAG_MASK | ((choice) << 12U))
234 #define CLKCTL1_TUPLE_MUXB(reg, choice) ((((reg)&0xFFCU) | CLKCTL1_TUPLE_FLAG_MASK | ((choice) << 28U)) << 16)
235 #define CLKCTL_TUPLE_REG(base, tuple)   ((volatile uint32_t *)(((uint32_t)(base)) + ((uint32_t)(tuple)&0xFFCU)))
236 #define CLKCTL_TUPLE_SEL(tuple)         (((uint32_t)(tuple) >> 12U) & 0x7U)
237 
238 #define CLKOUT_TUPLE_MUX_AVAIL          (0x2U)
239 #define CLKOUT_TUPLE_MUX(ch0, ch1, ch2) (CLKOUT_TUPLE_MUX_AVAIL | ((ch0) << 4U) | ((ch1) << 8) | ((ch2) << 12))
240 
241 #define PMU_TUPLE_MUX_AVAIL        (0x1U)
242 #define PMU_TUPLE_MUX(reg, choice) (((reg)&0xFFCU) | ((choice) << 12U) | PMU_TUPLE_MUX_AVAIL)
243 #define PMU_TUPLE_REG(base, tuple) ((volatile uint32_t *)(((uint32_t)(base)) + ((uint32_t)(tuple)&0xFFCU)))
244 #define PMU_TUPLE_SEL(tuple)       (((uint32_t)(tuple) >> 12U) & 0x3U)
245 
246 /*! @brief Clock name used to get clock frequency. */
247 typedef enum _clock_name
248 {
249     kCLOCK_CoreSysClk,       /*!< Core clock  (aka HCLK)                                 */
250     kCLOCK_BusClk,           /*!< Bus clock (AHB/APB clock, aka HCLK)                    */
251     kCLOCK_MclkClk,          /*!< MCLK, to MCLK pin                                      */
252 } clock_name_t;
253 
254 /*!
255  * @brief Peripheral clock name difinition used for
256  * clock gate.
257  */
258 typedef enum _clock_ip_name
259 {
260     kCLOCK_IpInvalid = 0U,
261 
262     kCLOCK_TcpuMciClk         = SYS_CLK_GATE_DEFINE(0),
263     kCLOCK_TcpuMciFlexspiClk  = SYS_CLK_GATE_DEFINE(1),
264     kCLOCK_TddrMciEnetClk     = SYS_CLK_GATE_DEFINE(2),
265     kCLOCK_TddrMciFlexspiClk  = SYS_CLK_GATE_DEFINE(3),
266     kCLOCK_T3PllMciIrcClk     = SYS_CLK_GATE_DEFINE(4),
267     kCLOCK_T3PllMci256mClk    = SYS_CLK_GATE_DEFINE(5),
268     kCLOCK_T3PllMci213mClk    = SYS_CLK_GATE_DEFINE(6),
269     kCLOCK_T3PllMciFlexspiClk = SYS_CLK_GATE_DEFINE(7),
270     kCLOCK_RefClkSys          = SYS_CLK_GATE_DEFINE(9),
271     kCLOCK_RefClkTcpu         = SYS_CLK_GATE_DEFINE(28),
272     kCLOCK_RefClkTddr         = SYS_CLK_GATE_DEFINE(29),
273     kCLOCK_RefClkAud          = SYS_CLK_GATE_DEFINE(30),
274     kCLOCK_RefClkUsb          = SYS_CLK_GATE_DEFINE(31),
275     kCLOCK_RefClkCauSlp       = SYS_CLK_GATE_DEFINE(32),
276 
277     kCLOCK_Cpu       = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 0),
278     kCLOCK_Matrix    = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 1),
279     kCLOCK_Romcp     = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 2),
280     kCLOCK_PowerQuad = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 8),
281     kCLOCK_Pkc       = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 9),
282     kCLOCK_Els       = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 10),
283     kCLOCK_Puf       = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 11),
284     kCLOCK_Flexspi   = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 16),
285     kCLOCK_Hpu       = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 20),
286     kCLOCK_Usb       = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 22),
287     kCLOCK_Sct       = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 24),
288     kCLOCK_AonMem    = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 25),
289     kCLOCK_Gdma      = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 28),
290     kCLOCK_Dma0      = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 29),
291     kCLOCK_Dma1      = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 30),
292     kCLOCK_Sdio      = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 31),
293 
294     kCLOCK_ElsApb     = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL1, 0),
295     kCLOCK_SdioSlv    = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL1, 2),
296     kCLOCK_Gau        = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL1, 16),
297     kCLOCK_Otp        = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL1, 17),
298     kCLOCK_SecureGpio = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL1, 24),
299     kCLOCK_EnetIpg    = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL1, 25),
300     kCLOCK_EnetIpgS   = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL1, 26),
301     kCLOCK_Trng       = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL1, 27),
302 
303     kCLOCK_Utick   = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL2, 0),
304     kCLOCK_Wwdt0   = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL2, 1),
305     kCLOCK_Usim    = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL2, 2),
306     kCLOCK_Itrc    = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL2, 3),
307     kCLOCK_FreeMrt = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL2, 26),
308     kCLOCK_Lcdic   = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL2, 27),
309 
310     kCLOCK_Flexcomm0    = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL0, 8),
311     kCLOCK_Flexcomm1    = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL0, 9),
312     kCLOCK_Flexcomm2    = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL0, 10),
313     kCLOCK_Flexcomm3    = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL0, 11),
314     kCLOCK_Flexcomm14   = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL0, 22),
315     kCLOCK_Dmic0        = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL0, 24),
316     kCLOCK_OsEventTimer = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL0, 27),
317 
318     kCLOCK_HsGpio0 = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL1, 0),
319     kCLOCK_HsGpio1 = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL1, 1),
320     kCLOCK_Crc     = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL1, 16),
321     kCLOCK_Freqme  = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL1, 31),
322 
323     kCLOCK_Ct32b0   = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL2, 0),
324     kCLOCK_Ct32b1   = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL2, 1),
325     kCLOCK_Ct32b2   = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL2, 2),
326     kCLOCK_Ct32b3   = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL2, 3),
327     kCLOCK_Ct32b4   = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL2, 4),
328     kCLOCK_Pmu      = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL2, 6),
329     kCLOCK_Rtc      = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL2, 7),
330     kCLOCK_Mrt      = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL2, 8),
331     kCLOCK_Pint     = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL2, 30),
332     kCLOCK_InputMux = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL2, 31),
333 } clock_ip_name_t;
334 
335 /*!
336  * @brief Peripheral clock source selection definition.
337  */
338 typedef enum _clock_attach_id
339 {
340     kXTAL_to_SYSOSC_CLK  = CLKCTL0_TUPLE_MUXA(0x168U, 0),
341     kCLKIN_to_SYSOSC_CLK = CLKCTL0_TUPLE_MUXA(0x168U, 1),
342     kNONE_to_SYSOSC_CLK  = CLKCTL0_TUPLE_MUXA(0x168U, 7),
343 
344     kSYSOSC_to_MAIN_CLK    = CLKCTL0_TUPLE_MUXA(0x430U, 0) | CLKCTL0_TUPLE_MUXB(0x434U, 0),
345     kFFRO_DIV4_to_MAIN_CLK = CLKCTL0_TUPLE_MUXA(0x430U, 1) | CLKCTL0_TUPLE_MUXB(0x434U, 0),
346     kLPOSC_to_MAIN_CLK     = CLKCTL0_TUPLE_MUXA(0x430U, 2) | CLKCTL0_TUPLE_MUXB(0x434U, 0),
347     kFFRO_to_MAIN_CLK      = CLKCTL0_TUPLE_MUXA(0x430U, 3) | CLKCTL0_TUPLE_MUXB(0x434U, 0),
348     kSFRO_to_MAIN_CLK      = CLKCTL0_TUPLE_MUXA(0x434U, 1),
349     kMAIN_PLL_to_MAIN_CLK  = CLKCTL0_TUPLE_MUXA(0x434U, 2),
350     kCLK32K_to_MAIN_CLK    = CLKCTL0_TUPLE_MUXA(0x434U, 3),
351 
352     kMAIN_CLK_to_FLEXSPI_CLK          = CLKCTL0_TUPLE_MUXA(0x620U, 0),
353     kT3PLL_MCI_FLEXSPI_to_FLEXSPI_CLK = CLKCTL0_TUPLE_MUXA(0x620U, 1),
354     kAUX0_PLL_to_FLEXSPI_CLK          = CLKCTL0_TUPLE_MUXA(0x620U, 2),
355     kTCPU_MCI_FLEXSPI_to_FLEXSPI_CLK  = CLKCTL0_TUPLE_MUXA(0x620U, 3),
356     kAUX1_PLL_to_FLEXSPI_CLK          = CLKCTL0_TUPLE_MUXA(0x620U, 4),
357     kTDDR_MCI_FLEXSPI_to_FLEXSPI_CLK  = CLKCTL0_TUPLE_MUXA(0x620U, 5),
358     kT3PLL_MCI_256M_to_FLEXSPI_CLK    = CLKCTL0_TUPLE_MUXA(0x620U, 6),
359     kNONE_to_FLEXSPI_CLK              = CLKCTL0_TUPLE_MUXA(0x620U, 7),
360 
361     kMAIN_CLK_to_SCT_CLK  = CLKCTL0_TUPLE_MUXA(0x640U, 0),
362     kMAIN_PLL_to_SCT_CLK  = CLKCTL0_TUPLE_MUXA(0x640U, 1),
363     kAUX0_PLL_to_SCT_CLK  = CLKCTL0_TUPLE_MUXA(0x640U, 2),
364     kFFRO_to_SCT_CLK      = CLKCTL0_TUPLE_MUXA(0x640U, 3),
365     kAUX1_PLL_to_SCT_CLK  = CLKCTL0_TUPLE_MUXA(0x640U, 4),
366     kAUDIO_PLL_to_SCT_CLK = CLKCTL0_TUPLE_MUXA(0x640U, 5),
367     kNONE_to_SCT_CLK      = CLKCTL0_TUPLE_MUXA(0x640U, 7),
368 
369     kLPOSC_to_UTICK_CLK    = CLKCTL0_TUPLE_MUXA(0x700U, 0),
370     kMAIN_CLK_to_UTICK_CLK = CLKCTL0_TUPLE_MUXA(0x700U, 1),
371     kNONE_to_UTICK_CLK     = CLKCTL0_TUPLE_MUXA(0x700U, 3),
372 
373     kLPOSC_to_WDT0_CLK    = CLKCTL0_TUPLE_MUXA(0x720U, 0),
374     kMAIN_CLK_to_WDT0_CLK = CLKCTL0_TUPLE_MUXA(0x720U, 1),
375     kNONE_to_WDT0_CLK     = CLKCTL0_TUPLE_MUXA(0x720U, 3),
376 
377     kSYSTICK_DIV_to_SYSTICK_CLK = CLKCTL0_TUPLE_MUXA(0x760U, 0),
378     kLPOSC_to_SYSTICK_CLK       = CLKCTL0_TUPLE_MUXA(0x760U, 1),
379     kCLK32K_to_SYSTICK_CLK      = CLKCTL0_TUPLE_MUXA(0x760U, 2),
380     kSFRO_to_SYSTICK_CLK        = CLKCTL0_TUPLE_MUXA(0x760U, 3),
381     kNONE_to_SYSTICK_CLK        = CLKCTL0_TUPLE_MUXA(0x760U, 7),
382 
383     kMAIN_CLK_to_USIM_CLK  = CLKCTL0_TUPLE_MUXA(0x774U, 0),
384     kAUDIO_PLL_to_USIM_CLK = CLKCTL0_TUPLE_MUXA(0x774U, 1),
385     kFFRO_to_USIM_CLK      = CLKCTL0_TUPLE_MUXA(0x774U, 2),
386     kNONE_to_USIM_CLK      = CLKCTL0_TUPLE_MUXA(0x774U, 3),
387 
388     kMAIN_CLK_to_LCD_CLK          = CLKCTL0_TUPLE_MUXA(0x778U, 0),
389     kT3PLL_MCI_FLEXSPI_to_LCD_CLK = CLKCTL0_TUPLE_MUXA(0x778U, 1),
390     kTCPU_MCI_FLEXSPI_to_LCD_CLK  = CLKCTL0_TUPLE_MUXA(0x778U, 2),
391     kTDDR_MCI_FLEXSPI_to_LCD_CLK  = CLKCTL0_TUPLE_MUXA(0x778U, 3),
392     kNONE_to_LCD_CLK              = CLKCTL0_TUPLE_MUXA(0x778U, 7),
393 
394     kMAIN_CLK_to_GAU_CLK       = CLKCTL0_TUPLE_MUXA(0x77CU, 0),
395     kT3PLL_MCI_256M_to_GAU_CLK = CLKCTL0_TUPLE_MUXA(0x77CU, 1),
396     kAVPLL_CH2_to_GAU_CLK      = CLKCTL0_TUPLE_MUXA(0x77CU, 2),
397     kNONE_to_GAU_CLK           = CLKCTL0_TUPLE_MUXA(0x77CU, 3),
398 
399     kT3PLL_MCI_256M_to_ELS_GDET = CLKCTL0_TUPLE_MUXA(0x7A8U, 0),
400     kELS_128M_to_ELS_GDET       = CLKCTL0_TUPLE_MUXA(0x7A8U, 1),
401     kELS_64M_to_ELS_GDET        = CLKCTL0_TUPLE_MUXA(0x7A8U, 2),
402     kOTP_FUSE_32M_to_ELS_GDET   = CLKCTL0_TUPLE_MUXA(0x7A8U, 3),
403     kNONE_to_ELS_GDET           = CLKCTL0_TUPLE_MUXA(0x7A8U, 7),
404 
405     kLPOSC_to_OSTIMER_CLK    = CLKCTL1_TUPLE_MUXA(0x480U, 0),
406     kCLK32K_to_OSTIMER_CLK   = CLKCTL1_TUPLE_MUXA(0x480U, 1),
407     kHCLK_to_OSTIMER_CLK     = CLKCTL1_TUPLE_MUXA(0x480U, 2),
408     kMAIN_CLK_to_OSTIMER_CLK = CLKCTL1_TUPLE_MUXA(0x480U, 3),
409     kNONE_to_OSTIMER_CLK     = CLKCTL1_TUPLE_MUXA(0x480U, 7),
410 
411     kSFRO_to_FLEXCOMM0      = CLKCTL1_TUPLE_MUXA(0x508U, 0),
412     kFFRO_to_FLEXCOMM0      = CLKCTL1_TUPLE_MUXA(0x508U, 1),
413     kAUDIO_PLL_to_FLEXCOMM0 = CLKCTL1_TUPLE_MUXA(0x508U, 2),
414     kMCLK_IN_to_FLEXCOMM0   = CLKCTL1_TUPLE_MUXA(0x508U, 3),
415     kFRG_to_FLEXCOMM0       = CLKCTL1_TUPLE_MUXA(0x508U, 4),
416     kNONE_to_FLEXCOMM0      = CLKCTL1_TUPLE_MUXA(0x508U, 7),
417 
418     kSFRO_to_FLEXCOMM1      = CLKCTL1_TUPLE_MUXA(0x528U, 0),
419     kFFRO_to_FLEXCOMM1      = CLKCTL1_TUPLE_MUXA(0x528U, 1),
420     kAUDIO_PLL_to_FLEXCOMM1 = CLKCTL1_TUPLE_MUXA(0x528U, 2),
421     kMCLK_IN_to_FLEXCOMM1   = CLKCTL1_TUPLE_MUXA(0x528U, 3),
422     kFRG_to_FLEXCOMM1       = CLKCTL1_TUPLE_MUXA(0x528U, 4),
423     kNONE_to_FLEXCOMM1      = CLKCTL1_TUPLE_MUXA(0x528U, 7),
424 
425     kSFRO_to_FLEXCOMM2      = CLKCTL1_TUPLE_MUXA(0x548U, 0),
426     kFFRO_to_FLEXCOMM2      = CLKCTL1_TUPLE_MUXA(0x548U, 1),
427     kAUDIO_PLL_to_FLEXCOMM2 = CLKCTL1_TUPLE_MUXA(0x548U, 2),
428     kMCLK_IN_to_FLEXCOMM2   = CLKCTL1_TUPLE_MUXA(0x548U, 3),
429     kFRG_to_FLEXCOMM2       = CLKCTL1_TUPLE_MUXA(0x548U, 4),
430     kNONE_to_FLEXCOMM2      = CLKCTL1_TUPLE_MUXA(0x548U, 7),
431 
432     kSFRO_to_FLEXCOMM3      = CLKCTL1_TUPLE_MUXA(0x568U, 0),
433     kFFRO_to_FLEXCOMM3      = CLKCTL1_TUPLE_MUXA(0x568U, 1),
434     kAUDIO_PLL_to_FLEXCOMM3 = CLKCTL1_TUPLE_MUXA(0x568U, 2),
435     kMCLK_IN_to_FLEXCOMM3   = CLKCTL1_TUPLE_MUXA(0x568U, 3),
436     kFRG_to_FLEXCOMM3       = CLKCTL1_TUPLE_MUXA(0x568U, 4),
437     kNONE_to_FLEXCOMM3      = CLKCTL1_TUPLE_MUXA(0x568U, 7),
438 
439     kSFRO_to_FLEXCOMM14      = CLKCTL1_TUPLE_MUXA(0x6C8U, 0),
440     kFFRO_to_FLEXCOMM14      = CLKCTL1_TUPLE_MUXA(0x6C8U, 1),
441     kAUDIO_PLL_to_FLEXCOMM14 = CLKCTL1_TUPLE_MUXA(0x6C8U, 2),
442     kMCLK_IN_to_FLEXCOMM14   = CLKCTL1_TUPLE_MUXA(0x6C8U, 3),
443     kFRG_to_FLEXCOMM14       = CLKCTL1_TUPLE_MUXA(0x6C8U, 4),
444     kNONE_to_FLEXCOMM14      = CLKCTL1_TUPLE_MUXA(0x6C8U, 7),
445 
446     kSFRO_to_DMIC_CLK      = CLKCTL1_TUPLE_MUXA(0x700U, 0),
447     kFFRO_to_DMIC_CLK      = CLKCTL1_TUPLE_MUXA(0x700U, 1),
448     kAUDIO_PLL_to_DMIC_CLK = CLKCTL1_TUPLE_MUXA(0x700U, 2),
449     kMCLK_IN_to_DMIC_CLK   = CLKCTL1_TUPLE_MUXA(0x700U, 3),
450     kLPOSC_to_DMIC_CLK     = CLKCTL1_TUPLE_MUXA(0x700U, 4),
451     kCLK32K_to_DMIC_CLK    = CLKCTL1_TUPLE_MUXA(0x700U, 5),
452     kMAIN_CLK_to_DMIC_CLK  = CLKCTL1_TUPLE_MUXA(0x700U, 6),
453     kNONE_to_DMIC_CLK      = CLKCTL1_TUPLE_MUXA(0x700U, 7),
454 
455     kMAIN_CLK_to_CTIMER0  = CLKCTL1_TUPLE_MUXA(0x720U, 0),
456     kSFRO_to_CTIMER0      = CLKCTL1_TUPLE_MUXA(0x720U, 1),
457     kFFRO_to_CTIMER0      = CLKCTL1_TUPLE_MUXA(0x720U, 2),
458     kAUDIO_PLL_to_CTIMER0 = CLKCTL1_TUPLE_MUXA(0x720U, 3),
459     kMCLK_IN_to_CTIMER0   = CLKCTL1_TUPLE_MUXA(0x720U, 4),
460     kLPOSC_to_CTIMER0     = CLKCTL1_TUPLE_MUXA(0x720U, 5),
461     kNONE_to_CTIMER0      = CLKCTL1_TUPLE_MUXA(0x720U, 7),
462 
463     kMAIN_CLK_to_CTIMER1  = CLKCTL1_TUPLE_MUXA(0x724U, 0),
464     kSFRO_to_CTIMER1      = CLKCTL1_TUPLE_MUXA(0x724U, 1),
465     kFFRO_to_CTIMER1      = CLKCTL1_TUPLE_MUXA(0x724U, 2),
466     kAUDIO_PLL_to_CTIMER1 = CLKCTL1_TUPLE_MUXA(0x724U, 3),
467     kMCLK_IN_to_CTIMER1   = CLKCTL1_TUPLE_MUXA(0x724U, 4),
468     kLPOSC_to_CTIMER1     = CLKCTL1_TUPLE_MUXA(0x724U, 5),
469     kNONE_to_CTIMER1      = CLKCTL1_TUPLE_MUXA(0x724U, 7),
470 
471     kMAIN_CLK_to_CTIMER2  = CLKCTL1_TUPLE_MUXA(0x728U, 0),
472     kSFRO_to_CTIMER2      = CLKCTL1_TUPLE_MUXA(0x728U, 1),
473     kFFRO_to_CTIMER2      = CLKCTL1_TUPLE_MUXA(0x728U, 2),
474     kAUDIO_PLL_to_CTIMER2 = CLKCTL1_TUPLE_MUXA(0x728U, 3),
475     kMCLK_IN_to_CTIMER2   = CLKCTL1_TUPLE_MUXA(0x728U, 4),
476     kLPOSC_to_CTIMER2     = CLKCTL1_TUPLE_MUXA(0x728U, 5),
477     kNONE_to_CTIMER2      = CLKCTL1_TUPLE_MUXA(0x728U, 7),
478 
479     kMAIN_CLK_to_CTIMER3  = CLKCTL1_TUPLE_MUXA(0x72CU, 0),
480     kSFRO_to_CTIMER3      = CLKCTL1_TUPLE_MUXA(0x72CU, 1),
481     kFFRO_to_CTIMER3      = CLKCTL1_TUPLE_MUXA(0x72CU, 2),
482     kAUDIO_PLL_to_CTIMER3 = CLKCTL1_TUPLE_MUXA(0x72CU, 3),
483     kMCLK_IN_to_CTIMER3   = CLKCTL1_TUPLE_MUXA(0x72CU, 4),
484     kLPOSC_to_CTIMER3     = CLKCTL1_TUPLE_MUXA(0x72CU, 5),
485     kNONE_to_CTIMER3      = CLKCTL1_TUPLE_MUXA(0x72CU, 7),
486 
487     kFFRO_to_MCLK_CLK      = CLKCTL1_TUPLE_MUXA(0x740U, 0),
488     kAUDIO_PLL_to_MCLK_CLK = CLKCTL1_TUPLE_MUXA(0x740U, 1),
489     kMAIN_CLK_to_MCLK_CLK  = CLKCTL1_TUPLE_MUXA(0x740U, 2),
490     kNONE_to_MCLK_CLK      = CLKCTL1_TUPLE_MUXA(0x740U, 3),
491 
492     kSFRO_to_CLKOUT              = CLKOUT_TUPLE_MUX(0U, 0U, 0U),
493     kSYSOSC_to_CLKOUT            = CLKOUT_TUPLE_MUX(1U, 0U, 0U),
494     kLPOSC_to_CLKOUT             = CLKOUT_TUPLE_MUX(2U, 0U, 0U),
495     kFFRO_to_CLKOUT              = CLKOUT_TUPLE_MUX(3U, 0U, 0U),
496     kMAIN_CLK_to_CLKOUT          = CLKOUT_TUPLE_MUX(4U, 0U, 0U),
497     kREFCLK_SYS_to_CLKOUT        = CLKOUT_TUPLE_MUX(5U, 0U, 0U),
498     kAVPLL_CH2_to_CLKOUT         = CLKOUT_TUPLE_MUX(6U, 0U, 0U),
499     kMAIN_PLL_to_CLKOUT          = CLKOUT_TUPLE_MUX(7U, 1U, 0U),
500     kAUX0_PLL_to_CLKOUT          = CLKOUT_TUPLE_MUX(7U, 2U, 0U),
501     kAUX1_PLL_to_CLKOUT          = CLKOUT_TUPLE_MUX(7U, 4U, 0U),
502     kAUDIO_PLL_to_CLKOUT         = CLKOUT_TUPLE_MUX(7U, 5U, 0U),
503     kCLK32K_to_CLKOUT            = CLKOUT_TUPLE_MUX(7U, 6U, 0U),
504     kTCPU_MCI_FLEXSPI_to_CLKOUT  = CLKOUT_TUPLE_MUX(7U, 7U, 1U),
505     kTDDR_MCI_FLEXSPI_to_CLKOUT  = CLKOUT_TUPLE_MUX(7U, 7U, 2U),
506     kT3PLL_MCI_FLEXSPI_to_CLKOUT = CLKOUT_TUPLE_MUX(7U, 7U, 3U),
507     kT3PLL_MCI_256M_to_CLKOUT    = CLKOUT_TUPLE_MUX(7U, 7U, 4U),
508     kCAU_SLP_REF_CLK_to_CLKOUT   = CLKOUT_TUPLE_MUX(7U, 7U, 5U),
509     kTDDR_MCI_ENET_to_CLKOUT     = CLKOUT_TUPLE_MUX(7U, 7U, 6U),
510     kNONE_to_CLKOUT              = CLKOUT_TUPLE_MUX(7U, 7U, 7U),
511 
512     kRC32K_to_CLK32K   = PMU_TUPLE_MUX(0x70U, 0),
513     kXTAL32K_to_CLK32K = PMU_TUPLE_MUX(0x70U, 1),
514     kNCO32K_to_CLK32K  = PMU_TUPLE_MUX(0x70U, 2),
515 } clock_attach_id_t;
516 
517 /*!
518  * @brief Clock divider definition.
519  */
520 typedef enum _clock_div_name
521 {
522     kCLOCK_DivMainPllClk   = CLKCTL0_TUPLE_MUXA(0x240U, 0),
523     kCLOCK_DivAux0PllClk   = CLKCTL0_TUPLE_MUXA(0x248U, 0),
524     kCLOCK_DivAux1PllClk   = CLKCTL0_TUPLE_MUXA(0x24CU, 0),
525     kCLOCK_DivSysCpuAhbClk = CLKCTL0_TUPLE_MUXA(0x400U, 0),
526     kCLOCK_DivPfc1Clk      = CLKCTL0_TUPLE_MUXA(0x504U, 0),
527     kCLOCK_DivFlexspiClk   = CLKCTL0_TUPLE_MUXA(0x624U, 0),
528     kCLOCK_DivSctClk       = CLKCTL0_TUPLE_MUXA(0x644U, 0),
529     kCLOCK_DivUsbHsFclk    = CLKCTL0_TUPLE_MUXA(0x664U, 0),
530     kCLOCK_DivSystickClk   = CLKCTL0_TUPLE_MUXA(0x764U, 0),
531     kCLOCK_DivLcdClk       = CLKCTL0_TUPLE_MUXA(0x768U, 0),
532     kCLOCK_DivGauClk       = CLKCTL0_TUPLE_MUXA(0x76CU, 0),
533     kCLOCK_DivUsimClk      = CLKCTL0_TUPLE_MUXA(0x770U, 0),
534     kCLOCK_DivPmuFclk      = CLKCTL0_TUPLE_MUXA(0x780U, 0),
535 
536     kCLOCK_DivAudioPllClk = CLKCTL1_TUPLE_MUXA(0x240U, 0),
537     kCLOCK_DivPllFrgClk   = CLKCTL1_TUPLE_MUXA(0x6FCU, 0),
538     kCLOCK_DivDmicClk     = CLKCTL1_TUPLE_MUXA(0x704U, 0),
539     kCLOCK_DivMclkClk     = CLKCTL1_TUPLE_MUXA(0x744U, 0),
540     kCLOCK_DivClockOut    = CLKCTL1_TUPLE_MUXA(0x768U, 0),
541 } clock_div_name_t;
542 
543 /*! @brief PLL configuration for FRG */
544 typedef struct _clock_frg_clk_config
545 {
546     uint8_t num; /*!< FRG clock */
547     enum
548     {
549         kCLOCK_FrgMainClk = 0, /*!< Main System clock */
550         kCLOCK_FrgPllDiv,      /*!< Main pll clock divider*/
551         kCLOCK_FrgSFro,        /*!< 16MHz FRO */
552         kCLOCK_FrgFFro,        /*!< FRO48/60 */
553     } sfg_clock_src;
554     uint8_t divider; /*!< Denominator of the fractional divider. */
555     uint8_t mult;    /*!< Numerator of the fractional divider. */
556 } clock_frg_clk_config_t;
557 
558 /*! @brief TCPU PLL divider for tcpu_mci_flexspi_clk */
559 typedef enum
560 {
561     kCLOCK_TcpuFlexspiDiv12 = 0, /*!< Divided by 12 */
562     kCLOCK_TcpuFlexspiDiv11,     /*!< Divided by 11 */
563     kCLOCK_TcpuFlexspiDiv10,     /*!< Divided by 10 */
564     kCLOCK_TcpuFlexspiDiv9,      /*!< Divided by 9  */
565 } clock_tcpu_flexspi_div_t;
566 
567 /*! @brief TDDR PLL divider for tddr_mci_flexspi_clk */
568 typedef enum
569 {
570     kCLOCK_TddrFlexspiDiv11 = 0, /*!< Divided by 11 */
571     kCLOCK_TddrFlexspiDiv10,     /*!< Divided by 10 */
572     kCLOCK_TddrFlexspiDiv9,      /*!< Divided by 9 */
573     kCLOCK_TddrFlexspiDiv8,      /*!< Divided by 8  */
574 } clock_tddr_flexspi_div_t;
575 
576 /*! @brief T3 PLL IRC configuration */
577 typedef enum
578 {
579     kCLOCK_T3MciIrc60m = 0, /*!< T3 MCI IRC 59.53MHz */
580     kCLOCK_T3MciIrc48m,     /*!< T3 MCI IRC 48.30MHz */
581 } clock_t3_mci_irc_config_t;
582 
583 /*! @brief AVPLL channel1 frequency configuration */
584 typedef enum
585 {
586     kCLOCK_AvPllChUnchanged = 0, /*!< AVPLL channel frequency unchanged. */
587     kCLOCK_AvPllChFreq2p048m,    /*!< AVPLL channel frequency 2.048MHz */
588     kCLOCK_AvPllChFreq4p096m,    /*!< AVPLL channel frequency 4.096MHz */
589     kCLOCK_AvPllChFreq6p144m,    /*!< AVPLL channel frequency 6.144MHz */
590     kCLOCK_AvPllChFreq8p192m,    /*!< AVPLL channel frequency 8.192MHz */
591     kCLOCK_AvPllChFreq11p2896m,  /*!< AVPLL channel frequency 11.2896MHz */
592     kCLOCK_AvPllChFreq12m,       /*!< AVPLL channel frequency 12MHz */
593     kCLOCK_AvPllChFreq12p288m,   /*!< AVPLL channel frequency 12.288MHz */
594     kCLOCK_AvPllChFreq24p576m,   /*!< AVPLL channel frequency 24.576MHz */
595     kCLOCK_AvPllChFreq64m,       /*!< AVPLL channel frequency 64MHz */
596     kCLOCK_AvPllChFreq98p304m,   /*!< AVPLL channel frequency 98.304MHz */
597 } clock_avpll_ch_freq_t;
598 
599 /*! @brief AVPLL configuration */
600 typedef struct
601 {
602     clock_avpll_ch_freq_t ch1Freq; /*!< AVPLL channel 1 frequency configuration */
603     clock_avpll_ch_freq_t ch2Freq; /*!< AVPLL channel 2 frequency configuration */
604     bool enableCali;               /*!< Enable calibration */
605 } clock_avpll_config_t;
606 
607 /*******************************************************************************
608  * API
609  ******************************************************************************/
610 
611 #if defined(__cplusplus)
612 extern "C" {
613 #endif /* __cplusplus */
614 
615 /*! @brief External CLK_IN pin clock frequency (clkin) clock frequency.
616  *
617  * The CLK_IN pin (clkin) clock frequency in Hz, when the clock is setup, use the
618  * function CLOCK_SetClkinFreq to set the value in to clock driver. For example,
619  * if CLK_IN is 16MHz,
620  * @code
621  * CLOCK_SetClkinFreq(16000000);
622  * @endcode
623  */
624 extern volatile uint32_t g_clkinFreq;
625 /*! @brief External MCLK IN clock frequency.
626  *
627  * The MCLK in (mclk_in) PIN clock frequency in Hz, when the clock is setup, use the
628  * function CLOCK_SetMclkInFreq to set the value in to clock driver. For example,
629  * if mclk_In is 16MHz,
630  * @code
631  * CLOCK_SetMclkInFreq(16000000);
632  * @endcode
633  */
634 extern volatile uint32_t g_mclkinFreq;
635 
636 /*! @brief  Return Frequency of t3pll_mci_48_60m_irc
637  *  @return Frequency of t3pll_mci_48_60m_irc
638  */
639 uint32_t CLOCK_GetT3PllMciIrcClkFreq(void);
640 
641 /*! @brief  Return Frequency of t3pll_mci_213p3m
642  *  @return Frequency of t3pll_mci_213p3m
643  */
644 uint32_t CLOCK_GetT3PllMci213mClkFreq(void);
645 
646 /*! @brief  Return Frequency of t3pll_mci_256m
647  *  @return Frequency of t3pll_mci_256m
648  */
649 uint32_t CLOCK_GetT3PllMci256mClkFreq(void);
650 
651 /*! @brief  Return Frequency of t3pll_mci_flexspi_clk
652  *  @return Frequency of t3pll_mci_flexspi_clk
653  */
654 uint32_t CLOCK_GetT3PllMciFlexspiClkFreq(void);
655 
656 /*! @brief  Return Frequency of tcpu_mci_clk
657  *  @return Frequency of tcpu_mci_clk
658  */
659 uint32_t CLOCK_GetTcpuMciClkFreq(void);
660 
661 /*! @brief  Return Frequency of tcpu_mci_flexspi_clk
662  *  @return Frequency of tcpu_mci_flexspi_clk
663  */
664 uint32_t CLOCK_GetTcpuMciFlexspiClkFreq(void);
665 
666 /*! @brief  Return Frequency of tddr_mci_flexspi_clk
667  *  @return Frequency of tddr_mci_flexspi_clk
668  */
669 uint32_t CLOCK_GetTddrMciFlexspiClkFreq(void);
670 
671 /*! @brief  Return Frequency of tddr_mci_enet_clk
672  *  @return Frequency of tddr_mci_enet_clk
673  */
674 uint32_t CLOCK_GetTddrMciEnetClkFreq(void);
675 
676 /*!
677  * @brief Enable the clock for specific IP.
678  *
679  * @param clk  Which clock to enable, see @ref clock_ip_name_t.
680  */
681 void CLOCK_EnableClock(clock_ip_name_t clk);
682 
683 /*!
684  * @brief Disable the clock for specific IP.
685  *
686  * @param clk  Which clock to disable, see @ref clock_ip_name_t.
687  */
688 void CLOCK_DisableClock(clock_ip_name_t clk);
689 
690 /**
691  * @brief   Configure the clock selection muxes.
692  * @param   connection  : Clock to be configured.
693  */
694 void CLOCK_AttachClk(clock_attach_id_t connection);
695 
696 /**
697  * @brief   Setup clock dividers.
698  * @param   name        : Clock divider name
699  * @param   divider     : Value to be divided.
700  */
701 void CLOCK_SetClkDiv(clock_div_name_t name, uint32_t divider);
702 
703 /*! @brief  Return Frequency of selected clock
704  *  @return Frequency of selected clock
705  */
706 uint32_t CLOCK_GetFreq(clock_name_t clockName);
707 
708 /*! @brief  Return Input frequency for the Fractional baud rate generator
709  *  @return Input Frequency for FRG
710  */
711 uint32_t CLOCK_GetFRGClock(uint32_t id);
712 
713 /*! @brief  Set output of the Fractional baud rate generator
714  *  @param  config    : Configuration to set to FRGn clock.
715  */
716 void CLOCK_SetFRGClock(const clock_frg_clk_config_t *config);
717 
718 /*! @brief  Return Frequency of FFRO
719  *  @return Frequency of FFRO
720  */
721 uint32_t CLOCK_GetFFroFreq(void);
722 
723 /*! @brief  Return Frequency of SFRO
724  *  @return Frequency of SFRO
725  */
726 uint32_t CLOCK_GetSFroFreq(void);
727 
728 /*! @brief  Return Frequency of AUDIO PLL (AVPLL CH1)
729  *  @return Frequency of AUDIO PLL
730  */
731 uint32_t CLOCK_GetAvPllCh1Freq(void);
732 
733 /*! @brief  Return Frequency of AVPLL CH2
734  *  @return Frequency of AVPLL CH2
735  */
736 uint32_t CLOCK_GetAvPllCh2Freq(void);
737 
738 /*! @brief  Return Frequency of main clk
739  *  @return Frequency of main clk
740  */
741 uint32_t CLOCK_GetMainClkFreq(void);
742 
743 /*! @brief  Return Frequency of core/bus clk
744  *  @return Frequency of core/bus clk
745  */
746 uint32_t CLOCK_GetCoreSysClkFreq(void);
747 
748 /*! @brief  Return Frequency of systick clk
749  *  @return Frequency of systick clk
750  */
751 uint32_t CLOCK_GetSystickClkFreq(void);
752 
753 /*! @brief  Return Frequency of sys osc Clock
754  *  @return Frequency of sys osc Clock. Or CLK_IN pin frequency.
755  */
CLOCK_GetSysOscFreq(void)756 static inline uint32_t CLOCK_GetSysOscFreq(void)
757 {
758     return (CLKCTL0->SYSOSCBYPASS == 0U) ? CLK_XTAL_OSC_CLK : ((CLKCTL0->SYSOSCBYPASS == 1U) ? g_clkinFreq : 0U);
759 }
760 
761 /*! @brief  Return Frequency of MCLK Input Clock
762  *  @return Frequency of MCLK input Clock.
763  */
CLOCK_GetMclkInClkFreq(void)764 static inline uint32_t CLOCK_GetMclkInClkFreq(void)
765 {
766     return g_mclkinFreq;
767 }
768 
769 /*! @brief  Return Frequency of LPOSC
770  *  @return Frequency of LPOSC
771  */
CLOCK_GetLpOscFreq(void)772 static inline uint32_t CLOCK_GetLpOscFreq(void)
773 {
774     return CLK_XTAL_OSC_CLK / 40U;
775 }
776 
777 /*! @brief  Return Frequency of CLK_32K
778  *  @return Frequency of 32KHz osc
779  */
CLOCK_GetClk32KFreq(void)780 static inline uint32_t CLOCK_GetClk32KFreq(void)
781 {
782     return CLK_RTC_32K_CLK;
783 }
784 
785 /*! @brief  Enables and disables 32KHz XTAL
786  *  @param  enable : true to enable 32k XTAL clock, false to disable clock
787  */
788 void CLOCK_EnableXtal32K(bool enable);
789 
790 /*! @brief  Enables and disables RTC 32KHz
791  *  @param  enable : true to enable 32k RTC clock, false to disable clock
792  */
793 void CLOCK_EnableRtc32K(bool enable);
794 
795 /*!
796  * @brief Set the CLKIN (CLKIN pin) frequency based on GPIO4 input.
797  *
798  * @param freq : The CLK_IN pin input clock frequency in Hz.
799  */
CLOCK_SetClkinFreq(uint32_t freq)800 static inline void CLOCK_SetClkinFreq(uint32_t freq)
801 {
802     g_clkinFreq = freq;
803 }
804 /*!
805  * @brief Set the MCLK in (mclk_in) clock frequency based on board setting.
806  *
807  * @param freq : The MCLK input clock frequency in Hz.
808  */
CLOCK_SetMclkinFreq(uint32_t freq)809 static inline void CLOCK_SetMclkinFreq(uint32_t freq)
810 {
811     g_mclkinFreq = freq;
812 }
813 
814 /*! @brief  Return Frequency of DMIC clk
815  *  @return Frequency of DMIC clk
816  */
817 uint32_t CLOCK_GetDmicClkFreq(void);
818 
819 /*! @brief  Return Frequency of LCD clk
820  *  @return Frequency of LCD clk
821  */
822 uint32_t CLOCK_GetLcdClkFreq(void);
823 
824 /*! @brief  Return Frequency of WDT clk
825  *  @return Frequency of WDT clk
826  */
827 uint32_t CLOCK_GetWdtClkFreq(void);
828 
829 /*! @brief  Return Frequency of mclk
830  *  @return Frequency of mclk clk
831  */
832 uint32_t CLOCK_GetMclkClkFreq(void);
833 
834 /*! @brief  Return Frequency of sct
835  *  @return Frequency of sct clk
836  */
837 uint32_t CLOCK_GetSctClkFreq(void);
838 
839 /*! @brief  Return Frequency of Flexcomm functional Clock
840  *  @param   id    : flexcomm index to get frequency.
841  *  @return Frequency of Flexcomm functional Clock
842  */
843 uint32_t CLOCK_GetFlexCommClkFreq(uint32_t id);
844 
845 /*! @brief  Return Frequency of CTimer Clock
846  *  @param   id    : ctimer index to get frequency.
847  *  @return Frequency of CTimer Clock
848  */
849 uint32_t CLOCK_GetCTimerClkFreq(uint32_t id);
850 
851 /*! @brief  Return Frequency of Utick Clock
852  *  @return Frequency of Utick Clock
853  */
854 uint32_t CLOCK_GetUtickClkFreq(void);
855 
856 /*! @brief  Return Frequency of Flexspi Clock
857  *  @return Frequency of Flexspi.
858  */
859 uint32_t CLOCK_GetFlexspiClkFreq(void);
860 
861 /*! @brief  Return Frequency of USIM Clock
862  *  @return Frequency of USIM.
863  */
864 uint32_t CLOCK_GetUsimClkFreq(void);
865 
866 /*! @brief  Return Frequency of GAU Clock
867  *  @return Frequency of GAU.
868  */
869 uint32_t CLOCK_GetGauClkFreq(void);
870 
871 /*! @brief  Return Frequency of OSTimer Clock
872  *  @return Frequency of OSTimer.
873  */
874 uint32_t CLOCK_GetOSTimerClkFreq(void);
875 
876 /*! @brief  Initialize TCPU FVCO to target frequency.
877  *          For 40MHz XTAL, FVCO ranges from 3000MHz to 3840MHz.
878             For 38.4MHz XTAL, FVCO ranges from 2995.2MHz to 3840MHz
879  *  @param  targetHz  : Target FVCO frequency in Hz.
880  *  @param  div       : Divider for tcpu_mci_flexspi_clk.
881  *  @return Actual FVCO frequency in Hz.
882  */
883 uint32_t CLOCK_InitTcpuRefClk(uint32_t targetHz, clock_tcpu_flexspi_div_t div);
884 
885 /*! @brief  Deinit the TCPU reference clock.
886  */
887 void CLOCK_DeinitTcpuRefClk(void);
888 
889 /*! @brief  Initialize the TDDR reference clock.
890  *  @param  div       : Divider for tddr_mci_flexspi_clk.
891  */
892 void CLOCK_InitTddrRefClk(clock_tddr_flexspi_div_t div);
893 
894 /*! @brief  Deinit the TDDR reference clock.
895  */
896 void CLOCK_DeinitTddrRefClk(void);
897 
898 /*! @brief  Initialize the T3 reference clock.
899  *  @param  cnfg       : t3pll_mci_48_60m_irc clock configuration
900  */
901 void CLOCK_InitT3RefClk(clock_t3_mci_irc_config_t cnfg);
902 
903 /*! @brief  Deinit the T3 reference clock. */
904 void CLOCK_DeinitT3RefClk(void);
905 
906 /*! @brief  Initialize the AVPLL. Both channel 1 and 2 are enabled.
907  *  @param  cnfg       : AVPLL clock configuration
908  */
909 void CLOCK_InitAvPll(const clock_avpll_config_t *cnfg);
910 
911 /*! @brief  Deinit the AVPLL. All channels are disabled.
912  */
913 void CLOCK_DeinitAvPll(void);
914 
915 /*! @brief  Update the AVPLL channel configuration. Enable/Disable state keeps unchanged.
916  *  @param  ch1Freq  : Channel 1 frequency to set.
917  *  @param  ch2Freq  : Channel 2 frequency to set.
918  *  @param  enableCali : Enable AVPLL calibration.
919  */
920 void CLOCK_ConfigAvPllCh(clock_avpll_ch_freq_t ch1Freq, clock_avpll_ch_freq_t ch2Freq, bool enableCali);
921 
922 /*! @brief  Enable the AVPLL channel.
923  *  @param  enableCh1  : Enable AVPLL channel1, channel unchanged on false.
924  *  @param  enableCh2  : Enable AVPLL channel2, channel unchanged on false.
925  *  @param  enableCali : Enable AVPLL calibration.
926  */
927 void CLOCK_EnableAvPllCh(bool enableCh1, bool enableCh2, bool enableCali);
928 
929 /*! @brief  Disable the AVPLL.
930  *  @param  disableCh1  : Disable AVPLL channel1, channel unchanged on false.
931  *  @param  disableCh2  : Disable AVPLL channel2, channel unchanged on false.
932  */
933 void CLOCK_DisableAvPllCh(bool disableCh1, bool disableCh2);
934 
935 /*! @brief Enable USB HS PHY PLL clock.
936  *
937  * This function enables USB HS PHY PLL clock.
938  */
939 void CLOCK_EnableUsbhsPhyClock(void);
940 
941 /*! @brief Disable USB HS PHY PLL clock.
942  *
943  * This function disables USB HS PHY PLL clock.
944  */
945 void CLOCK_DisableUsbhsPhyClock(void);
946 
947 #if defined(__cplusplus)
948 }
949 #endif /* __cplusplus */
950 
951 /*! @} */
952 
953 #endif /* _FSL_CLOCK_H_ */
954