diff options
Diffstat (limited to 'lib/chibios-contrib/ext/mcux-sdk/devices/MIMX8DX4/drivers/fsl_clock.h')
-rw-r--r-- | lib/chibios-contrib/ext/mcux-sdk/devices/MIMX8DX4/drivers/fsl_clock.h | 526 |
1 files changed, 526 insertions, 0 deletions
diff --git a/lib/chibios-contrib/ext/mcux-sdk/devices/MIMX8DX4/drivers/fsl_clock.h b/lib/chibios-contrib/ext/mcux-sdk/devices/MIMX8DX4/drivers/fsl_clock.h new file mode 100644 index 000000000..8634d8084 --- /dev/null +++ b/lib/chibios-contrib/ext/mcux-sdk/devices/MIMX8DX4/drivers/fsl_clock.h | |||
@@ -0,0 +1,526 @@ | |||
1 | /* | ||
2 | * Copyright 2017-2019 NXP | ||
3 | * | ||
4 | * SPDX-License-Identifier: BSD-3-Clause | ||
5 | */ | ||
6 | |||
7 | #ifndef _FSL_CLOCK_H_ | ||
8 | #define _FSL_CLOCK_H_ | ||
9 | |||
10 | #include "fsl_device_registers.h" | ||
11 | #include <stdint.h> | ||
12 | #include <stdbool.h> | ||
13 | #include <assert.h> | ||
14 | |||
15 | #include "svc/pm/pm_api.h" | ||
16 | |||
17 | /*! @addtogroup clock */ | ||
18 | /*! @{ */ | ||
19 | |||
20 | /*! @file */ | ||
21 | |||
22 | /******************************************************************************* | ||
23 | * Definitions | ||
24 | ******************************************************************************/ | ||
25 | |||
26 | /*! @brief Configure whether driver controls clock | ||
27 | * | ||
28 | * When set to 0, peripheral drivers will enable clock in initialize function | ||
29 | * and disable clock in de-initialize function. When set to 1, peripheral | ||
30 | * driver will not control the clock, application could control the clock out of | ||
31 | * the driver. | ||
32 | * | ||
33 | * @note All drivers share this feature switcher. If it is set to 1, application | ||
34 | * should handle clock enable and disable for all drivers. | ||
35 | */ | ||
36 | #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)) | ||
37 | #define FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL 0 | ||
38 | #endif | ||
39 | |||
40 | /*! @name Driver version */ | ||
41 | /*@{*/ | ||
42 | /*! @brief CLOCK driver version 2.3.1. */ | ||
43 | #define FSL_CLOCK_DRIVER_VERSION (MAKE_VERSION(2, 3, 1)) | ||
44 | /*@}*/ | ||
45 | |||
46 | /* Definition for delay API in clock driver, users can redefine it to the real application. */ | ||
47 | #ifndef SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY | ||
48 | #define SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY (400000000UL) | ||
49 | #endif | ||
50 | |||
51 | /*! @brief Clock ip name array for MU. */ | ||
52 | #define MU_CLOCKS \ | ||
53 | { \ | ||
54 | kCLOCK_M4_0_Mu0A0, kCLOCK_M4_0_Mu0A1, kCLOCK_M4_0_Mu0A2, kCLOCK_M4_0_Mu0A3, kCLOCK_M4_0_Mu0B, \ | ||
55 | kCLOCK_M4_0_Mu0B, kCLOCK_M4_0_Mu0B, kCLOCK_M4_0_Mu0B, kCLOCK_M4_0_Mu1A, kCLOCK_LSIO_Mu0A, \ | ||
56 | kCLOCK_LSIO_Mu1A, kCLOCK_LSIO_Mu2A, kCLOCK_LSIO_Mu3A, kCLOCK_LSIO_Mu4A, kCLOCK_LSIO_Mu5A, \ | ||
57 | kCLOCK_LSIO_Mu5B, kCLOCK_LSIO_Mu6A, kCLOCK_LSIO_Mu6B, kCLOCK_LSIO_Mu7A, kCLOCK_LSIO_Mu7B, \ | ||
58 | kCLOCK_LSIO_Mu8A, kCLOCK_LSIO_Mu8B, kCLOCK_LSIO_Mu9A, kCLOCK_LSIO_Mu9B, kCLOCK_LSIO_Mu10A, \ | ||
59 | kCLOCK_LSIO_Mu10B, kCLOCK_LSIO_Mu11A, kCLOCK_LSIO_Mu11B, kCLOCK_LSIO_Mu12A, kCLOCK_LSIO_Mu12B, \ | ||
60 | kCLOCK_LSIO_Mu13A, kCLOCK_LSIO_Mu13B, kCLOCK_SCU_Mu0A0, kCLOCK_SCU_Mu0A1, kCLOCK_SCU_Mu0A2, \ | ||
61 | kCLOCK_SCU_Mu0A3, kCLOCK_SCU_Mu0B, kCLOCK_SCU_Mu0B, kCLOCK_SCU_Mu0B, kCLOCK_SCU_Mu0B, kCLOCK_SCU_Mu1A, \ | ||
62 | } | ||
63 | |||
64 | /*! @brief Clock ip name array for GPIO. */ | ||
65 | #define GPIO_CLOCKS \ | ||
66 | { \ | ||
67 | kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_IpInvalid, kCLOCK_HSIO_Gpio, kCLOCK_LSIO_Gpio0, kCLOCK_LSIO_Gpio1, \ | ||
68 | kCLOCK_LSIO_Gpio2, kCLOCK_LSIO_Gpio3, kCLOCK_LSIO_Gpio4, kCLOCK_LSIO_Gpio5, kCLOCK_LSIO_Gpio6, \ | ||
69 | kCLOCK_LSIO_Gpio7, kCLOCK_IpInvalid, \ | ||
70 | } | ||
71 | |||
72 | /*! @brief Clock ip name array for FLEXSPI. */ | ||
73 | #define FLEXSPI_CLOCKS \ | ||
74 | { \ | ||
75 | kCLOCK_LSIO_Flexspi0, kCLOCK_LSIO_Flexspi1, \ | ||
76 | } | ||
77 | |||
78 | /*! @brief Clock ip name array for RGPIO. */ | ||
79 | #define RGPIO_CLOCKS \ | ||
80 | { \ | ||
81 | kCLOCK_M4_0_Rgpio, \ | ||
82 | } | ||
83 | |||
84 | /*! @brief Clock ip name array for FTM. */ | ||
85 | #define FTM_CLOCKS \ | ||
86 | { \ | ||
87 | kCLOCK_DMA_Ftm0, kCLOCK_DMA_Ftm1, \ | ||
88 | } | ||
89 | |||
90 | /*! @brief Clock ip name array for GPT. */ | ||
91 | #define GPT_CLOCKS \ | ||
92 | { \ | ||
93 | kCLOCK_AUDIO_Gpt0, kCLOCK_AUDIO_Gpt1, kCLOCK_AUDIO_Gpt2, kCLOCK_AUDIO_Gpt3, kCLOCK_AUDIO_Gpt4, \ | ||
94 | kCLOCK_AUDIO_Gpt5, kCLOCK_LSIO_Gpt0, kCLOCK_LSIO_Gpt1, kCLOCK_LSIO_Gpt2, kCLOCK_LSIO_Gpt3, \ | ||
95 | kCLOCK_LSIO_Gpt4, \ | ||
96 | } | ||
97 | /*! @brief Clock ip name array for FLEXCAN. */ | ||
98 | #define FLEXCAN_CLOCKS \ | ||
99 | { \ | ||
100 | kCLOCK_DMA_Can0, kCLOCK_DMA_Can0, kCLOCK_DMA_Can0, \ | ||
101 | } | ||
102 | |||
103 | /*! @brief Clock ip name array for LPUART. */ | ||
104 | #define LPUART_CLOCKS \ | ||
105 | { \ | ||
106 | kCLOCK_DMA_Lpuart0, kCLOCK_DMA_Lpuart1, kCLOCK_DMA_Lpuart2, kCLOCK_DMA_Lpuart3, kCLOCK_M4_0_Lpuart, \ | ||
107 | kCLOCK_SCU_Lpuart, \ | ||
108 | } | ||
109 | |||
110 | /*! @brief Clock ip name array for LPADC. */ | ||
111 | #define LPADC_CLOCKS \ | ||
112 | { \ | ||
113 | kCLOCK_ADMA_Lpadc0, \ | ||
114 | } | ||
115 | |||
116 | /*! @brief Clock ip name array for INTMUX. */ | ||
117 | #define INTMUX_CLOCKS \ | ||
118 | { \ | ||
119 | kCLOCK_M4_0_Intmux, kCLOCK_SCU_Intmux, \ | ||
120 | } | ||
121 | |||
122 | /*! @brief Clock ip name array for SAI. */ | ||
123 | #define SAI_CLOCKS \ | ||
124 | { \ | ||
125 | kCLOCK_AUDIO_Sai0, kCLOCK_AUDIO_Sai1, kCLOCK_AUDIO_Sai2, kCLOCK_AUDIO_Sai3, kCLOCK_AUDIO_Sai4, \ | ||
126 | kCLOCK_AUDIO_Sai5, \ | ||
127 | } | ||
128 | |||
129 | /*! @brief Clock ip name array for SAI. */ | ||
130 | #define SEMA42_CLOCKS \ | ||
131 | { \ | ||
132 | kCLOCK_M4_0_Sema42, kCLOCK_SCU_Sema42, \ | ||
133 | } | ||
134 | |||
135 | /*! @brief Clock ip name array for TPM. */ | ||
136 | #define TPM_CLOCKS \ | ||
137 | { \ | ||
138 | kCLOCK_M4_0_Tpm, kCLOCK_SCU_Tpm, \ | ||
139 | } | ||
140 | |||
141 | /*! @brief Clock ip name array for LPIT. */ | ||
142 | #define LPIT_CLOCKS \ | ||
143 | { \ | ||
144 | kCLOCK_M4_0_Lpit, kCLOCK_SCU_Lpit, \ | ||
145 | } | ||
146 | |||
147 | /*! @brief Clock ip name array for LPI2C. */ | ||
148 | #define LPI2C_CLOCKS \ | ||
149 | { \ | ||
150 | kCLOCK_DMA_Lpi2c0, kCLOCK_DMA_Lpi2c1, kCLOCK_DMA_Lpi2c2, kCLOCK_DMA_Lpi2c3, kCLOCK_CiPiLpi2c, \ | ||
151 | kCLOCK_M4_0_Lpi2c, kCLOCK_DiMiPiDsiLvds0Lpi2c0, kCLOCK_DiMiPiDsiLvds0Lpi2c1, kCLOCK_DiMiPiDsiLvds1Lpi2c0, \ | ||
152 | kCLOCK_DiMiPiDsiLvds1Lpi2c1, kCLOCK_MipiCsiLpi2c, kCLOCK_SCU_Lpi2c, \ | ||
153 | } | ||
154 | |||
155 | /*! @brief Clock ip name array for LPSPI. */ | ||
156 | #define LPSPI_CLOCKS \ | ||
157 | { \ | ||
158 | kCLOCK_DMA_Lpspi0, kCLOCK_DMA_Lpspi1, kCLOCK_DMA_Lpspi2, kCLOCK_DMA_Lpspi3, \ | ||
159 | } | ||
160 | |||
161 | /*! @brief Clock ip name array for IRQSTEER */ | ||
162 | #define IRQSTEER_CLOCKS \ | ||
163 | { \ | ||
164 | kCLOCK_M4_0_Irqsteer, \ | ||
165 | } | ||
166 | |||
167 | /*! @brief Clock ip name array for EDMA. */ | ||
168 | #define EDMA_CLOCKS \ | ||
169 | { \ | ||
170 | kCLOCK_DMA_Dma0, \ | ||
171 | } | ||
172 | |||
173 | /*! @brief Clock ip name array for LPIT. */ | ||
174 | #define ESAI_CLOCKS \ | ||
175 | { \ | ||
176 | kCLOCK_AUDIO_Esai0, kCLOCK_AUDIO_Esai1, \ | ||
177 | } | ||
178 | |||
179 | /*! @brief Clock ip name array for ISI. */ | ||
180 | #define ISI_CLOCKS \ | ||
181 | { \ | ||
182 | kCLOCK_IMAGING_Isi0, kCLOCK_IMAGING_Isi1, kCLOCK_IMAGING_Isi2, kCLOCK_IMAGING_Isi3, kCLOCK_IMAGING_Isi4, \ | ||
183 | kCLOCK_IMAGING_Isi5, \ | ||
184 | } | ||
185 | |||
186 | /*! @brief Clock ip name array for MIPI CSI2 RX. */ | ||
187 | #define MIPI_CSI2RX_CLOCKS \ | ||
188 | { \ | ||
189 | kCLOCK_MipiCsi2Rx0, \ | ||
190 | } | ||
191 | |||
192 | /*! @brief Clock ip name array for MIPI DSI host. */ | ||
193 | #define MIPI_DSI_HOST_CLOCKS \ | ||
194 | { \ | ||
195 | kCLOCK_MipiDsiHost0, kCLOCK_MipiDsiHost1 \ | ||
196 | } | ||
197 | |||
198 | /*! @brief Clock ip name array for ENET. */ | ||
199 | #define ENET_CLOCKS \ | ||
200 | { \ | ||
201 | kCLOCK_CONNECTIVITY_Enet0, kCLOCK_CONNECTIVITY_Enet1 \ | ||
202 | } | ||
203 | |||
204 | /*! @brief Clock ip name array for DPU. */ | ||
205 | #define DPU_CLOCKS \ | ||
206 | { \ | ||
207 | kCLOCK_Dpu0, \ | ||
208 | } | ||
209 | |||
210 | /*! @brief Clock ip name array for CI_PI. */ | ||
211 | #define CI_PI_CLOCKS \ | ||
212 | { \ | ||
213 | kCLOCK_CiPi0, \ | ||
214 | } | ||
215 | |||
216 | /*! @brief Clock ip name array for CAAM. */ | ||
217 | #define CAAM_CLOCKS \ | ||
218 | { \ | ||
219 | kCLOCK_CAAM_JR1, kCLOCK_CAAM_JR2, kCLOCK_CAAM_JR3, \ | ||
220 | } | ||
221 | |||
222 | /*! @brief Clock ip name array for LVDS display bridge(LDB). */ | ||
223 | #define LDB_CLOCKS \ | ||
224 | { \ | ||
225 | kCLOCK_Ldb0, kCLOCK_Ldb1 \ | ||
226 | } | ||
227 | |||
228 | /*! | ||
229 | * @brief Clock source for peripherals that support various clock selections. | ||
230 | */ | ||
231 | typedef enum _clock_ip_src | ||
232 | { | ||
233 | kCLOCK_IpSrcNone = 0U, /*!< Clock is off. */ | ||
234 | kCLOCK_IpSrcDummy = 1U, /*!< Clock option 1. */ | ||
235 | } clock_ip_src_t; | ||
236 | |||
237 | /*! @brief Clock name used to get clock frequency. */ | ||
238 | typedef enum _clock_name | ||
239 | { | ||
240 | /* ----------------------------- System layer clock ---------------------- */ | ||
241 | kCLOCK_CoreSysClk, /*!< Core/system clock for M4 */ | ||
242 | |||
243 | /* --------------------------------- Other clock ------------------------- */ | ||
244 | kCLOCK_CONECTIVITY_AhbClk, /*!< AHB clock in Connectivity subsystem */ | ||
245 | } clock_name_t; | ||
246 | |||
247 | /*! | ||
248 | * @brief LPCG TUPLE macors to map corresponding ip clock name, SCFW API resource index and LPCG Register base address. | ||
249 | * The LPCG base should be 4KB aligned, if not it will be truncated. | ||
250 | */ | ||
251 | #define LPCG_TUPLE(rsrc, base) ((uint32_t)((((base) >> 12U) << 10U) | (rsrc))) | ||
252 | /*! @brief Get the LPCG REG base address. */ | ||
253 | #define LPCG_TUPLE_REG_BASE(tuple) ((volatile uint32_t *)((((uint32_t)(tuple) >> 10U) & 0xFFFFFU) << 12U)) | ||
254 | /*! @brief Get the resource index. */ | ||
255 | #define LPCG_TUPLE_RSRC(tuple) ((sc_rsrc_t)((uint32_t)(tuple)&0x3FFU)) | ||
256 | /*! @brief LPCG Cell not available. */ | ||
257 | #define NV (0U) | ||
258 | |||
259 | /*! | ||
260 | * @brief Peripheral clock name difinition used for clock gate, clock source | ||
261 | * and clock divider setting. It is defined as the corresponding register address. | ||
262 | */ | ||
263 | typedef enum _clock_ip_name | ||
264 | { | ||
265 | kCLOCK_M4_0_Irqsteer = LPCG_TUPLE(SC_R_IRQSTR_M4_0, NV), | ||
266 | kCLOCK_DMA_Lpspi0 = LPCG_TUPLE(SC_R_SPI_0, ADMA__LPCG_SPI0_IPG_CLK_BASE), | ||
267 | kCLOCK_DMA_Lpspi1 = LPCG_TUPLE(SC_R_SPI_1, ADMA__LPCG_SPI1_IPG_CLK_BASE), | ||
268 | kCLOCK_DMA_Lpspi2 = LPCG_TUPLE(SC_R_SPI_2, ADMA__LPCG_SPI2_IPG_CLK_BASE), | ||
269 | kCLOCK_DMA_Lpspi3 = LPCG_TUPLE(SC_R_SPI_3, ADMA__LPCG_SPI3_IPG_CLK_BASE), | ||
270 | kCLOCK_DMA_Lpuart0 = LPCG_TUPLE(SC_R_UART_0, ADMA__LPCG_UART0_IPG_CLK_BASE), | ||
271 | kCLOCK_DMA_Lpuart1 = LPCG_TUPLE(SC_R_UART_1, ADMA__LPCG_UART1_IPG_CLK_BASE), | ||
272 | kCLOCK_DMA_Lpuart2 = LPCG_TUPLE(SC_R_UART_2, ADMA__LPCG_UART2_IPG_CLK_BASE), | ||
273 | kCLOCK_DMA_Lpuart3 = LPCG_TUPLE(SC_R_UART_3, ADMA__LPCG_UART3_IPG_CLK_BASE), | ||
274 | kCLOCK_DMA_Dma0 = LPCG_TUPLE(SC_R_DMA_0_CH0, NV), | ||
275 | kCLOCK_DMA_Lpi2c0 = LPCG_TUPLE(SC_R_I2C_0, ADMA__LPCG_I2C0_IPG_CLK_BASE), | ||
276 | kCLOCK_DMA_Lpi2c1 = LPCG_TUPLE(SC_R_I2C_1, ADMA__LPCG_I2C1_IPG_CLK_BASE), | ||
277 | kCLOCK_DMA_Lpi2c2 = LPCG_TUPLE(SC_R_I2C_2, ADMA__LPCG_I2C2_IPG_CLK_BASE), | ||
278 | kCLOCK_DMA_Lpi2c3 = LPCG_TUPLE(SC_R_I2C_3, ADMA__LPCG_I2C3_IPG_CLK_BASE), | ||
279 | kCLOCK_DMA_Ftm0 = LPCG_TUPLE(SC_R_FTM_0, ADMA__LPCG_FTM0_IPG_CLK_BASE), | ||
280 | kCLOCK_DMA_Ftm1 = LPCG_TUPLE(SC_R_FTM_1, ADMA__LPCG_FTM1_IPG_CLK_BASE), | ||
281 | kCLOCK_DMA_Can0 = LPCG_TUPLE(SC_R_CAN_0, ADMA__LPCG_CAN0_IPG_CLK_BASE), | ||
282 | kCLOCK_DMA_Can1 = LPCG_TUPLE(SC_R_CAN_1, ADMA__LPCG_CAN1_IPG_CLK_BASE), | ||
283 | kCLOCK_DMA_Can2 = LPCG_TUPLE(SC_R_CAN_2, ADMA__LPCG_CAN2_IPG_CLK_BASE), | ||
284 | kCLOCK_HSIO_Gpio = LPCG_TUPLE(SC_R_HSIO_GPIO, HSIO__LPCG_GPIO_IPG_CLK_S_BASE), | ||
285 | kCLOCK_LVDS_0_Lpi2c0 = LPCG_TUPLE(SC_R_LVDS_0_I2C_0, NV), | ||
286 | kCLOCK_LVDS_0_Lpi2c1 = LPCG_TUPLE(SC_R_LVDS_0_I2C_1, NV), | ||
287 | kCLOCK_LVDS_1_Lpi2c0 = LPCG_TUPLE(SC_R_LVDS_1_I2C_0, NV), | ||
288 | kCLOCK_LVDS_1_Lpi2c1 = LPCG_TUPLE(SC_R_LVDS_1_I2C_1, NV), | ||
289 | kCLOCK_LSIO_Pwm0 = LPCG_TUPLE(SC_R_PWM_0, LSIO__LPCG_PWM0_BASE), | ||
290 | kCLOCK_LSIO_Pwm1 = LPCG_TUPLE(SC_R_PWM_1, LSIO__LPCG_PWM1_BASE), | ||
291 | kCLOCK_LSIO_Pwm2 = LPCG_TUPLE(SC_R_PWM_2, LSIO__LPCG_PWM2_BASE), | ||
292 | kCLOCK_LSIO_Pwm3 = LPCG_TUPLE(SC_R_PWM_3, LSIO__LPCG_PWM3_BASE), | ||
293 | kCLOCK_LSIO_Pwm4 = LPCG_TUPLE(SC_R_PWM_4, LSIO__LPCG_PWM4_BASE), | ||
294 | kCLOCK_LSIO_Pwm5 = LPCG_TUPLE(SC_R_PWM_5, LSIO__LPCG_PWM5_BASE), | ||
295 | kCLOCK_LSIO_Pwm6 = LPCG_TUPLE(SC_R_PWM_6, LSIO__LPCG_PWM6_BASE), | ||
296 | kCLOCK_LSIO_Pwm7 = LPCG_TUPLE(SC_R_PWM_7, LSIO__LPCG_PWM7_BASE), | ||
297 | kCLOCK_LSIO_Gpio0 = LPCG_TUPLE(SC_R_GPIO_0, LSIO__LPCG_GPIO0_BASE), | ||
298 | kCLOCK_LSIO_Gpio1 = LPCG_TUPLE(SC_R_GPIO_1, LSIO__LPCG_GPIO1_BASE), | ||
299 | kCLOCK_LSIO_Gpio2 = LPCG_TUPLE(SC_R_GPIO_2, LSIO__LPCG_GPIO2_BASE), | ||
300 | kCLOCK_LSIO_Gpio3 = LPCG_TUPLE(SC_R_GPIO_3, LSIO__LPCG_GPIO3_BASE), | ||
301 | kCLOCK_LSIO_Gpio4 = LPCG_TUPLE(SC_R_GPIO_4, LSIO__LPCG_GPIO4_BASE), | ||
302 | kCLOCK_LSIO_Gpio5 = LPCG_TUPLE(SC_R_GPIO_5, LSIO__LPCG_GPIO5_BASE), | ||
303 | kCLOCK_LSIO_Gpio6 = LPCG_TUPLE(SC_R_GPIO_6, LSIO__LPCG_GPIO6_BASE), | ||
304 | kCLOCK_LSIO_Gpio7 = LPCG_TUPLE(SC_R_GPIO_7, LSIO__LPCG_GPIO7_BASE), | ||
305 | kCLOCK_AUDIO_Gpt0 = LPCG_TUPLE(SC_R_GPT_5, ADMA__LPCG_GPT0_IPG_CLK_24M_BASE), | ||
306 | kCLOCK_AUDIO_Gpt1 = LPCG_TUPLE(SC_R_GPT_6, ADMA__LPCG_GPT1_IPG_CLK_24M_BASE), | ||
307 | kCLOCK_AUDIO_Gpt2 = LPCG_TUPLE(SC_R_GPT_7, ADMA__LPCG_GPT2_IPG_CLK_24M_BASE), | ||
308 | kCLOCK_AUDIO_Gpt3 = LPCG_TUPLE(SC_R_GPT_8, ADMA__LPCG_GPT3_IPG_CLK_24M_BASE), | ||
309 | kCLOCK_AUDIO_Gpt4 = LPCG_TUPLE(SC_R_GPT_9, ADMA__LPCG_GPT4_IPG_CLK_24M_BASE), | ||
310 | kCLOCK_AUDIO_Gpt5 = LPCG_TUPLE(SC_R_GPT_10, ADMA__LPCG_GPT5_IPG_CLK_24M_BASE), | ||
311 | kCLOCK_LSIO_Gpt0 = LPCG_TUPLE(SC_R_GPT_0, LSIO__LPCG_GPT0_BASE), | ||
312 | kCLOCK_LSIO_Gpt1 = LPCG_TUPLE(SC_R_GPT_1, LSIO__LPCG_GPT1_BASE), | ||
313 | kCLOCK_LSIO_Gpt2 = LPCG_TUPLE(SC_R_GPT_2, LSIO__LPCG_GPT2_BASE), | ||
314 | kCLOCK_LSIO_Gpt3 = LPCG_TUPLE(SC_R_GPT_3, LSIO__LPCG_GPT3_BASE), | ||
315 | kCLOCK_LSIO_Gpt4 = LPCG_TUPLE(SC_R_GPT_4, LSIO__LPCG_GPT4_BASE), | ||
316 | kCLOCK_LSIO_Mu0A = LPCG_TUPLE(SC_R_MU_0A, NV), | ||
317 | kCLOCK_LSIO_Mu1A = LPCG_TUPLE(SC_R_MU_1A, NV), | ||
318 | kCLOCK_LSIO_Mu2A = LPCG_TUPLE(SC_R_MU_2A, NV), | ||
319 | kCLOCK_LSIO_Mu3A = LPCG_TUPLE(SC_R_MU_3A, NV), | ||
320 | kCLOCK_LSIO_Mu4A = LPCG_TUPLE(SC_R_MU_4A, NV), | ||
321 | kCLOCK_LSIO_Mu5A = LPCG_TUPLE(SC_R_MU_5A, LSIO__LPCG_MU5_MCU_BASE), | ||
322 | kCLOCK_LSIO_Mu6A = LPCG_TUPLE(SC_R_MU_6A, LSIO__LPCG_MU6_MCU_BASE), | ||
323 | kCLOCK_LSIO_Mu7A = LPCG_TUPLE(SC_R_MU_7A, LSIO__LPCG_MU7_MCU_BASE), | ||
324 | kCLOCK_LSIO_Mu8A = LPCG_TUPLE(SC_R_MU_8A, LSIO__LPCG_MU8_MCU_BASE), | ||
325 | kCLOCK_LSIO_Mu9A = LPCG_TUPLE(SC_R_MU_9A, LSIO__LPCG_MU9_MCU_BASE), | ||
326 | kCLOCK_LSIO_Mu10A = LPCG_TUPLE(SC_R_MU_10A, LSIO__LPCG_MU10_MCU_BASE), | ||
327 | kCLOCK_LSIO_Mu11A = LPCG_TUPLE(SC_R_MU_11A, LSIO__LPCG_MU11_MCU_BASE), | ||
328 | kCLOCK_LSIO_Mu12A = LPCG_TUPLE(SC_R_MU_12A, LSIO__LPCG_MU12_MCU_BASE), | ||
329 | kCLOCK_LSIO_Mu13A = LPCG_TUPLE(SC_R_MU_13A, LSIO__LPCG_MU13_MCU_BASE), | ||
330 | kCLOCK_LSIO_Mu5B = LPCG_TUPLE(SC_R_MU_5B, LSIO__LPCG_MU5_DSP_BASE), | ||
331 | kCLOCK_LSIO_Mu6B = LPCG_TUPLE(SC_R_MU_6B, LSIO__LPCG_MU6_DSP_BASE), | ||
332 | kCLOCK_LSIO_Mu7B = LPCG_TUPLE(SC_R_MU_7B, LSIO__LPCG_MU7_DSP_BASE), | ||
333 | kCLOCK_LSIO_Mu8B = LPCG_TUPLE(SC_R_MU_8B, LSIO__LPCG_MU8_DSP_BASE), | ||
334 | kCLOCK_LSIO_Mu9B = LPCG_TUPLE(SC_R_MU_9B, LSIO__LPCG_MU9_DSP_BASE), | ||
335 | kCLOCK_LSIO_Mu10B = LPCG_TUPLE(SC_R_MU_10B, LSIO__LPCG_MU10_DSP_BASE), | ||
336 | kCLOCK_LSIO_Mu11B = LPCG_TUPLE(SC_R_MU_11B, LSIO__LPCG_MU11_DSP_BASE), | ||
337 | kCLOCK_LSIO_Mu12B = LPCG_TUPLE(SC_R_MU_12B, LSIO__LPCG_MU12_DSP_BASE), | ||
338 | kCLOCK_LSIO_Mu13B = LPCG_TUPLE(SC_R_MU_13B, LSIO__LPCG_MU13_DSP_BASE), | ||
339 | kCLOCK_SCU_Mu0B = LPCG_TUPLE(SC_R_SC_MU_0B, NV), | ||
340 | kCLOCK_SCU_Mu0A0 = LPCG_TUPLE(SC_R_SC_MU_0A0, NV), | ||
341 | kCLOCK_SCU_Mu0A1 = LPCG_TUPLE(SC_R_SC_MU_0A1, NV), | ||
342 | kCLOCK_SCU_Mu0A2 = LPCG_TUPLE(SC_R_SC_MU_0A2, NV), | ||
343 | kCLOCK_SCU_Mu0A3 = LPCG_TUPLE(SC_R_SC_MU_0A3, NV), | ||
344 | kCLOCK_SCU_Mu1A = LPCG_TUPLE(SC_R_SC_MU_1A, NV), | ||
345 | kCLOCK_LSIO_Flexspi0 = LPCG_TUPLE(SC_R_FSPI_0, LSIO__LPCG_QSPI0_BASE), | ||
346 | kCLOCK_LSIO_Flexspi1 = LPCG_TUPLE(SC_R_FSPI_1, LSIO__LPCG_QSPI1_BASE), | ||
347 | kCLOCK_M4_0_Rgpio = LPCG_TUPLE(SC_R_M4_0_RGPIO, NV), | ||
348 | kCLOCK_M4_0_Sema42 = LPCG_TUPLE(SC_R_M4_0_SEMA42, NV), | ||
349 | kCLOCK_M4_0_Tpm = LPCG_TUPLE(SC_R_M4_0_TPM, CM4__LPCG_TPM_BASE), | ||
350 | kCLOCK_M4_0_Lpit = LPCG_TUPLE(SC_R_M4_0_PIT, CM4__LPCG_LPIT_BASE), | ||
351 | kCLOCK_M4_0_Lpuart = LPCG_TUPLE(SC_R_M4_0_UART, CM4__LPCG_LPUART_BASE), | ||
352 | kCLOCK_M4_0_Lpi2c = LPCG_TUPLE(SC_R_M4_0_I2C, CM4__LPCG_LPI2C_BASE), | ||
353 | kCLOCK_M4_0_Intmux = LPCG_TUPLE(SC_R_M4_0_INTMUX, NV), | ||
354 | kCLOCK_M4_0_Mu0B = LPCG_TUPLE(SC_R_M4_0_MU_0B, NV), | ||
355 | kCLOCK_M4_0_Mu0A0 = LPCG_TUPLE(SC_R_M4_0_MU_0A0, NV), | ||
356 | kCLOCK_M4_0_Mu0A1 = LPCG_TUPLE(SC_R_M4_0_MU_0A1, NV), | ||
357 | kCLOCK_M4_0_Mu0A2 = LPCG_TUPLE(SC_R_M4_0_MU_0A2, NV), | ||
358 | kCLOCK_M4_0_Mu0A3 = LPCG_TUPLE(SC_R_M4_0_MU_0A3, NV), | ||
359 | kCLOCK_M4_0_Mu1A = LPCG_TUPLE(SC_R_M4_0_MU_1A, NV), | ||
360 | kCLOCK_SCU_Lpuart = LPCG_TUPLE(SC_R_SC_UART, SCU__LPCG_LPUART_BASE), | ||
361 | kCLOCK_ADMA_Lpadc0 = LPCG_TUPLE(SC_R_ADC_0, NV), | ||
362 | kCLOCK_SCU_Lpi2c = LPCG_TUPLE(SC_R_SC_I2C, SCU__LPCG_LPI2C_BASE), | ||
363 | kCLOCK_SCU_Sema42 = LPCG_TUPLE(SC_R_SC_SEMA42, NV), | ||
364 | kCLOCK_SCU_Lpit = LPCG_TUPLE(SC_R_SC_PIT, SCU__LPCG_LPIT_BASE), | ||
365 | kCLOCK_SCU_Tpm = LPCG_TUPLE(SC_R_SC_TPM, SCU__LPCG_TPM_BASE), | ||
366 | kCLOCK_SCU_Intmux = LPCG_TUPLE(SC_R_LAST, NV), | ||
367 | kCLOCK_AUDIO_Sai0 = LPCG_TUPLE(SC_R_SAI_0, ADMA__LPCG_SAI0_IPG_CLK_BASE), | ||
368 | kCLOCK_AUDIO_Sai1 = LPCG_TUPLE(SC_R_SAI_1, ADMA__LPCG_SAI1_IPG_CLK_BASE), | ||
369 | kCLOCK_AUDIO_Sai2 = LPCG_TUPLE(SC_R_SAI_2, ADMA__LPCG_SAI2_IPG_CLK_BASE), | ||
370 | kCLOCK_AUDIO_Sai3 = LPCG_TUPLE(SC_R_SAI_3, ADMA__LPCG_SAI3_IPG_CLK_BASE), | ||
371 | kCLOCK_AUDIO_Sai4 = LPCG_TUPLE(SC_R_SAI_4, ADMA__LPCG_SAI4_IPG_CLK_BASE), | ||
372 | kCLOCK_AUDIO_Sai5 = LPCG_TUPLE(SC_R_SAI_5, ADMA__LPCG_SAI5_IPG_CLK_BASE), | ||
373 | kCLOCK_AUDIO_Esai0 = LPCG_TUPLE(SC_R_ESAI_0, ADMA__LPCG_ESAI0_EXTAL_CLK_BASE), | ||
374 | kCLOCK_AUDIO_Esai1 = LPCG_TUPLE(SC_R_ESAI_0, NV), | ||
375 | kCLOCK_IMAGING_Isi0 = LPCG_TUPLE(SC_R_ISI_CH0, NV), | ||
376 | kCLOCK_IMAGING_Isi1 = LPCG_TUPLE(SC_R_ISI_CH1, NV), | ||
377 | kCLOCK_IMAGING_Isi2 = LPCG_TUPLE(SC_R_ISI_CH2, NV), | ||
378 | kCLOCK_IMAGING_Isi3 = LPCG_TUPLE(SC_R_ISI_CH3, NV), | ||
379 | kCLOCK_IMAGING_Isi4 = LPCG_TUPLE(SC_R_ISI_CH4, NV), | ||
380 | kCLOCK_IMAGING_Isi5 = LPCG_TUPLE(SC_R_ISI_CH5, NV), | ||
381 | kCLOCK_MipiCsi2Rx0 = LPCG_TUPLE(SC_R_CSI_0, NV), | ||
382 | kCLOCK_MipiCsi2Rx1 = LPCG_TUPLE(SC_R_CSI_1, NV), | ||
383 | kCLOCK_DiMiPiDsiLvds0Lpi2c0 = LPCG_TUPLE(SC_R_MIPI_0_I2C_0, DI_MIPI_DSI_LVDS_0__LPCG_LIS_IPG_CLK_BASE), | ||
384 | kCLOCK_DiMiPiDsiLvds0Lpi2c1 = LPCG_TUPLE(SC_R_MIPI_0_I2C_1, DI_MIPI_DSI_LVDS_0__LPCG_LIS_IPG_CLK_BASE), | ||
385 | kCLOCK_DiMiPiDsiLvds1Lpi2c0 = LPCG_TUPLE(SC_R_MIPI_1_I2C_0, DI_MIPI_DSI_LVDS_1__LPCG_LIS_IPG_CLK_BASE), | ||
386 | kCLOCK_DiMiPiDsiLvds1Lpi2c1 = LPCG_TUPLE(SC_R_MIPI_1_I2C_1, DI_MIPI_DSI_LVDS_1__LPCG_LIS_IPG_CLK_BASE), | ||
387 | kCLOCK_CiPiLpi2c = LPCG_TUPLE(SC_R_LAST, NV), | ||
388 | kCLOCK_MipiCsiLpi2c = LPCG_TUPLE(SC_R_CSI_0_I2C_0, NV), | ||
389 | kCLOCK_MipiDsiHost0 = LPCG_TUPLE(SC_R_MIPI_0, NV), | ||
390 | kCLOCK_MipiDsiHost1 = LPCG_TUPLE(SC_R_MIPI_1, NV), | ||
391 | kCLOCK_Dpu0 = LPCG_TUPLE(SC_R_DC_0, DC__LPCG_DSP0_CLK_BASE), | ||
392 | kCLOCK_Dpu1 = LPCG_TUPLE(SC_R_DC_1, NV), | ||
393 | kCLOCK_HDMI_Lpi2c0 = LPCG_TUPLE(SC_R_HDMI_I2C_0, NV), | ||
394 | kCLOCK_HDMI_RX_Lpi2c0 = LPCG_TUPLE(SC_R_HDMI_RX_I2C_0, NV), | ||
395 | kCLOCK_Ldb0 = LPCG_TUPLE(SC_R_LVDS_0, NV), | ||
396 | kCLOCK_Ldb1 = LPCG_TUPLE(SC_R_LVDS_1, NV), | ||
397 | kCLOCK_CONNECTIVITY_Enet0 = LPCG_TUPLE(SC_R_ENET_0, CONNECTIVITY__LPCG_ENET0_BASE), | ||
398 | kCLOCK_CONNECTIVITY_Enet1 = LPCG_TUPLE(SC_R_ENET_1, CONNECTIVITY__LPCG_ENET1_BASE), | ||
399 | kCLOCK_CONNECTIVITY_Usdhc0 = LPCG_TUPLE(SC_R_SDHC_0, CONNECTIVITY__LPCG_USDHC0_BASE), | ||
400 | kCLOCK_CONNECTIVITY_Usdhc1 = LPCG_TUPLE(SC_R_SDHC_1, CONNECTIVITY__LPCG_USDHC1_BASE), | ||
401 | kCLOCK_AUDIO_Pll0 = LPCG_TUPLE(SC_R_AUDIO_PLL_0, NV), | ||
402 | kCLOCK_AUDIO_Pll1 = LPCG_TUPLE(SC_R_AUDIO_PLL_1, NV), | ||
403 | kCLOCK_CAAM_JR1 = LPCG_TUPLE(SC_R_CAAM_JR1, NV), | ||
404 | kCLOCK_CAAM_JR2 = LPCG_TUPLE(SC_R_CAAM_JR2, NV), | ||
405 | kCLOCK_CAAM_JR3 = LPCG_TUPLE(SC_R_CAAM_JR3, NV), | ||
406 | kCLOCK_CiPi0 = LPCG_TUPLE(SC_R_PI_0, NV), | ||
407 | kCLOCK_Isi0 = LPCG_TUPLE(SC_R_ISI_CH0, NV), | ||
408 | kCLOCK_Isi1 = LPCG_TUPLE(SC_R_ISI_CH1, NV), | ||
409 | kCLOCK_Isi2 = LPCG_TUPLE(SC_R_ISI_CH2, NV), | ||
410 | kCLOCK_Isi3 = LPCG_TUPLE(SC_R_ISI_CH3, NV), | ||
411 | kCLOCK_Isi4 = LPCG_TUPLE(SC_R_ISI_CH4, NV), | ||
412 | kCLOCK_Isi5 = LPCG_TUPLE(SC_R_ISI_CH5, NV), | ||
413 | kCLOCK_Isi6 = LPCG_TUPLE(SC_R_ISI_CH6, NV), | ||
414 | kCLOCK_Isi7 = LPCG_TUPLE(SC_R_ISI_CH7, NV), | ||
415 | kCLOCK_IpInvalid = LPCG_TUPLE(SC_R_LAST, NV) /* The selected IP does not support clock control. */ | ||
416 | } clock_ip_name_t; | ||
417 | |||
418 | #if defined(__cplusplus) | ||
419 | extern "C" { | ||
420 | #endif /* _cplusplus */ | ||
421 | |||
422 | /*! | ||
423 | * @brief Initialize Clock module. | ||
424 | * | ||
425 | * @param ipc IPC handle for communication with SCU. | ||
426 | */ | ||
427 | void CLOCK_Init(sc_ipc_t ipc); | ||
428 | |||
429 | /*! | ||
430 | * @brief Deinitialize Clock module. | ||
431 | */ | ||
432 | void CLOCK_Deinit(void); | ||
433 | |||
434 | /*! | ||
435 | * @brief Enable the clock for specific IP, with gate setting. | ||
436 | * | ||
437 | * @param name Which clock to enable, see \ref clock_ip_name_t. | ||
438 | * @param gate 0: clock always on, 1: HW auto clock gating. | ||
439 | * @return true if success, false if failure. | ||
440 | */ | ||
441 | bool CLOCK_EnableClockExt(clock_ip_name_t name, uint32_t gate); | ||
442 | |||
443 | /*! | ||
444 | * @brief Enable the clock for specific IP. | ||
445 | * | ||
446 | * @param name Which clock to enable, see \ref clock_ip_name_t. | ||
447 | * @return true for success, false for failure. | ||
448 | */ | ||
449 | static inline bool CLOCK_EnableClock(clock_ip_name_t name) | ||
450 | { | ||
451 | return CLOCK_EnableClockExt(name, 0); | ||
452 | } | ||
453 | |||
454 | /*! | ||
455 | * @brief Disable the clock for specific IP. | ||
456 | * | ||
457 | * @param name Which clock to disable, see \ref clock_ip_name_t. | ||
458 | * @return true for success, false for failure. | ||
459 | */ | ||
460 | bool CLOCK_DisableClock(clock_ip_name_t name); | ||
461 | |||
462 | /*! | ||
463 | * @brief Set the clock frequency for specific IP module. | ||
464 | * | ||
465 | * This function sets the IP module clock frequency. | ||
466 | * | ||
467 | * @param name Which peripheral to check, see \ref clock_ip_name_t. | ||
468 | * @param freq Target clock frequency value in hertz. | ||
469 | * @return the Real clock frequency value in hertz, or 0 if failed | ||
470 | */ | ||
471 | uint32_t CLOCK_SetIpFreq(clock_ip_name_t name, uint32_t freq); | ||
472 | |||
473 | /*! | ||
474 | * @brief Get the clock frequency for a specific IP module. | ||
475 | * | ||
476 | * This function gets the IP module clock frequency. | ||
477 | * | ||
478 | * @param name Which peripheral to get, see \ref clock_ip_name_t. | ||
479 | * @return Clock frequency value in hertz, or 0 if failed | ||
480 | */ | ||
481 | uint32_t CLOCK_GetIpFreq(clock_ip_name_t name); | ||
482 | |||
483 | /*! | ||
484 | * @brief Gets the clock frequency for a specific clock name. | ||
485 | * | ||
486 | * This function checks the current clock configurations and then calculates | ||
487 | * the clock frequency for a specific clock name defined in clock_name_t. | ||
488 | * | ||
489 | * @param name Clock names defined in clock_name_t | ||
490 | * @return Clock frequency value in hertz | ||
491 | */ | ||
492 | uint32_t CLOCK_GetFreq(clock_name_t name); | ||
493 | |||
494 | /*! | ||
495 | * @brief Get the core clock or system clock frequency. | ||
496 | * | ||
497 | * @return Clock frequency in Hz. | ||
498 | */ | ||
499 | uint32_t CLOCK_GetCoreSysClkFreq(void); | ||
500 | |||
501 | /*! | ||
502 | * @brief Config the LPCG cell for specific IP. | ||
503 | * | ||
504 | * @param name Which clock to enable, see \ref clock_ip_name_t. | ||
505 | * @param swGate Software clock gating. 0: clock is gated; 1: clock is enabled | ||
506 | * @param hwGate Hardware auto gating. 0: disable the HW clock gate control; 1: HW clock gating is enabled | ||
507 | */ | ||
508 | void CLOCK_ConfigLPCG(clock_ip_name_t name, bool swGate, bool hwGate); | ||
509 | |||
510 | /*! | ||
511 | * @brief Set LPCG gate for specific LPCG. | ||
512 | * | ||
513 | * @param regBase LPCG register base address. | ||
514 | * @param swGate Software clock gating. 0: clock is gated; 1: clock is enabled | ||
515 | * @param hwGate Hardware auto gating. 0: disable the HW clock gate control; 1: HW clock gating is enabled | ||
516 | * @param bitsMask The available bits in LPCG register. Each bit indicate the corresponding bit is available or not. | ||
517 | */ | ||
518 | void CLOCK_SetLpcgGate(volatile uint32_t *regBase, bool swGate, bool hwGate, uint32_t bitsMask); | ||
519 | |||
520 | #if defined(__cplusplus) | ||
521 | } | ||
522 | #endif /* __cplusplus */ | ||
523 | |||
524 | /*! @} */ | ||
525 | |||
526 | #endif /* _FSL_CLOCK_H_ */ | ||