1 /*
2  * Copyright (c) 2024 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 #ifndef HPM_CLOCK_DRV_H
8 #define HPM_CLOCK_DRV_H
9 
10 #include "hpm_common.h"
11 #include "hpm_sysctl_drv.h"
12 
13 
14 /**
15  * @brief Error codes for clock driver
16  */
17 enum {
18     status_clk_div_invalid = MAKE_STATUS(status_group_clk, 0),
19     status_clk_src_invalid = MAKE_STATUS(status_group_clk, 1),
20     status_clk_invalid = MAKE_STATUS(status_group_clk, 2),
21     status_clk_operation_unsupported = MAKE_STATUS(status_group_clk, 3),
22     status_clk_shared_ahb = MAKE_STATUS(status_group_clk, 4),
23     status_clk_shared_axif = MAKE_STATUS(status_group_clk, 5),
24     status_clk_shared_axis = MAKE_STATUS(status_group_clk, 6),
25     status_clk_shared_axic = MAKE_STATUS(status_group_clk, 7),
26     status_clk_shared_axin = MAKE_STATUS(status_group_clk, 8),
27     status_clk_shared_cpu0 = MAKE_STATUS(status_group_clk, 9),
28     status_clk_shared_cpu1 = MAKE_STATUS(status_group_clk, 10),
29     status_clk_fixed = MAKE_STATUS(status_group_clk, 11),
30 };
31 
32 /**
33  * @brief Clock source group definitions
34  */
35 #define CLK_SRC_GROUP_COMMON  (0U)
36 #define CLK_SRC_GROUP_ADC     (1U)
37 #define CLK_SRC_GROUP_I2S     (2U)
38 #define CLK_SRC_GROUP_EWDG    (3U)
39 #define CLK_SRC_GROUP_AHB     (4U)
40 #define CLK_SRC_GROUP_AXIF    (5U)
41 #define CLK_SRC_GROUP_AXIS    (6U)
42 #define CLK_SRC_GROUP_AXIC    (7U)
43 #define CLK_SRC_GROUP_AXIN    (8U)
44 #define CLK_SRC_GROUP_PMIC    (9U)
45 #define CLK_SRC_GROUP_PEWDG   (10U)
46 #define CLK_SRC_GROUP_CPU0    (11U)
47 #define CLK_SRC_GROUP_CPU1    (12U)
48 #define CLK_SRC_GROUP_SRC     (13U)
49 #define CLK_SRC_GROUP_INVALID (14U)
50 
51 #define MAKE_CLK_SRC(src_grp, index) (((uint8_t)(src_grp)<<4) | (index))
52 #define GET_CLK_SRC_GROUP(src) (((uint8_t)(src)>>4) & 0x0FU)
53 #define GET_CLK_SRC_INDEX(src) ((uint8_t)(src) & 0x0FU)
54 
55 #define GET_CLOCK_SOURCE_FROM_CLK_SRC(clk_src) (clock_source_t)((uint32_t)(clk_src) & 0xFU)
56 
57 /**
58  * @brief Clock source definitions
59  */
60 typedef enum _clock_sources {
61     clk_src_osc24m = MAKE_CLK_SRC(CLK_SRC_GROUP_COMMON, 0),
62     clk_src_pll0_clk0 = MAKE_CLK_SRC(CLK_SRC_GROUP_COMMON, 1),
63     clk_src_pll0_clk1 = MAKE_CLK_SRC(CLK_SRC_GROUP_COMMON, 2),
64     clk_src_pll1_clk0 = MAKE_CLK_SRC(CLK_SRC_GROUP_COMMON, 3),
65     clk_src_pll1_clk1 = MAKE_CLK_SRC(CLK_SRC_GROUP_COMMON, 4),
66     clk_src_pll1_clk2 = MAKE_CLK_SRC(CLK_SRC_GROUP_COMMON, 5),
67     clk_src_pll2_clk0 = MAKE_CLK_SRC(CLK_SRC_GROUP_COMMON, 6),
68     clk_src_pll2_clk1 = MAKE_CLK_SRC(CLK_SRC_GROUP_COMMON, 7),
69     clk_src_osc32k = MAKE_CLK_SRC(CLK_SRC_GROUP_COMMON, 8),
70 
71     clk_adc_src_ana0 = MAKE_CLK_SRC(CLK_SRC_GROUP_ADC, 0),
72     clk_adc_src_ana1 = MAKE_CLK_SRC(CLK_SRC_GROUP_ADC, 0),
73     clk_adc_src_ana2 = MAKE_CLK_SRC(CLK_SRC_GROUP_ADC, 0),
74     clk_adc_src_ana3 = MAKE_CLK_SRC(CLK_SRC_GROUP_ADC, 0),
75     clk_adc_src_ahb0 = MAKE_CLK_SRC(CLK_SRC_GROUP_ADC, 1),
76 
77     clk_i2s_src_aud0 = MAKE_CLK_SRC(CLK_SRC_GROUP_I2S, 0),
78     clk_i2s_src_aud1 = MAKE_CLK_SRC(CLK_SRC_GROUP_I2S, 0),
79     clk_i2s_src_audx = MAKE_CLK_SRC(CLK_SRC_GROUP_I2S, 1),
80 
81     clk_wdg_src_ahb0 = MAKE_CLK_SRC(CLK_SRC_GROUP_EWDG, 0),
82     clk_wdg_src_osc32k = MAKE_CLK_SRC(CLK_SRC_GROUP_EWDG, 1),
83 
84     clk_pwdg_src_osc24m = MAKE_CLK_SRC(CLK_SRC_GROUP_PEWDG, 0),
85     clk_pwdg_src_osc32k = MAKE_CLK_SRC(CLK_SRC_GROUP_PEWDG, 1),
86 
87     clk_src_invalid = MAKE_CLK_SRC(CLK_SRC_GROUP_INVALID, 15),
88 } clk_src_t;
89 
90 #define RESOURCE_INVALID (0xFFFFU)
91 
92 #define GET_CLOCK_SOURCE_FROM_CLK_SRC(clk_src) (clock_source_t)((uint32_t)(clk_src) & 0xFU)
93 
94 /* Clock NAME related Macros */
95 #define MAKE_CLOCK_NAME(resource, src_type, node) (((uint32_t)(resource) << 16) | ((uint32_t)(src_type) << 8) | ((uint32_t)node))
96 #define GET_CLK_SRC_GROUP_FROM_NAME(name)  (((uint32_t)(name) >> 8) & 0xFFUL)
97 #define GET_CLK_NODE_FROM_NAME(name) ((uint32_t)(name) & 0xFFUL)
98 #define GET_CLK_RESOURCE_FROM_NAME(name) ((uint32_t)(name) >> 16)
99 
100 /**
101  * @brief Peripheral Clock Type Description
102  */
103 typedef enum _clock_name {
104     clock_cpu0 = MAKE_CLOCK_NAME(sysctl_resource_cpu0, CLK_SRC_GROUP_COMMON, clock_node_cpu0),
105     clock_mchtmr0 = MAKE_CLOCK_NAME(sysctl_resource_mchtmr0, CLK_SRC_GROUP_COMMON, clock_node_mchtmr0),
106     clock_cpu1 = MAKE_CLOCK_NAME(sysctl_resource_cpu1, CLK_SRC_GROUP_COMMON, clock_node_cpu1),
107     clock_mchtmr1 = MAKE_CLOCK_NAME(sysctl_resource_mchtmr1, CLK_SRC_GROUP_COMMON, clock_node_mchtmr1),
108     clock_ahb0 = MAKE_CLOCK_NAME(sysctl_resource_ahbp, CLK_SRC_GROUP_COMMON, clock_node_ahb0),
109     clock_axif = MAKE_CLOCK_NAME(RESOURCE_INVALID, CLK_SRC_GROUP_COMMON, clock_node_axif),
110     clock_axis = MAKE_CLOCK_NAME(sysctl_resource_axis, CLK_SRC_GROUP_COMMON, clock_node_axis),
111     clock_axic = MAKE_CLOCK_NAME(sysctl_resource_axic, CLK_SRC_GROUP_COMMON, clock_node_axic),
112     clock_axin = MAKE_CLOCK_NAME(sysctl_resource_axin, CLK_SRC_GROUP_COMMON, clock_node_axin),
113     clock_gptmr0 = MAKE_CLOCK_NAME(sysctl_resource_gptmr0, CLK_SRC_GROUP_COMMON, clock_node_gptmr0),
114     clock_gptmr1 = MAKE_CLOCK_NAME(sysctl_resource_gptmr1, CLK_SRC_GROUP_COMMON, clock_node_gptmr1),
115     clock_gptmr2 = MAKE_CLOCK_NAME(sysctl_resource_gptmr2, CLK_SRC_GROUP_COMMON, clock_node_gptmr2),
116     clock_gptmr3 = MAKE_CLOCK_NAME(sysctl_resource_gptmr3, CLK_SRC_GROUP_COMMON, clock_node_gptmr3),
117     clock_gptmr4 = MAKE_CLOCK_NAME(sysctl_resource_gptmr4, CLK_SRC_GROUP_COMMON, clock_node_gptmr4),
118     clock_gptmr5 = MAKE_CLOCK_NAME(sysctl_resource_gptmr5, CLK_SRC_GROUP_COMMON, clock_node_gptmr5),
119     clock_gptmr6 = MAKE_CLOCK_NAME(sysctl_resource_gptmr6, CLK_SRC_GROUP_COMMON, clock_node_gptmr6),
120     clock_gptmr7 = MAKE_CLOCK_NAME(sysctl_resource_gptmr7, CLK_SRC_GROUP_COMMON, clock_node_gptmr7),
121     clock_i2c0 = MAKE_CLOCK_NAME(sysctl_resource_i2c0, CLK_SRC_GROUP_COMMON, clock_node_i2c0),
122     clock_i2c1 = MAKE_CLOCK_NAME(sysctl_resource_i2c1, CLK_SRC_GROUP_COMMON, clock_node_i2c1),
123     clock_i2c2 = MAKE_CLOCK_NAME(sysctl_resource_i2c2, CLK_SRC_GROUP_COMMON, clock_node_i2c2),
124     clock_i2c3 = MAKE_CLOCK_NAME(sysctl_resource_i2c3, CLK_SRC_GROUP_COMMON, clock_node_i2c3),
125     clock_i2c4 = MAKE_CLOCK_NAME(sysctl_resource_i2c4, CLK_SRC_GROUP_COMMON, clock_node_i2c4),
126     clock_i2c5 = MAKE_CLOCK_NAME(sysctl_resource_i2c5, CLK_SRC_GROUP_COMMON, clock_node_i2c5),
127     clock_i2c6 = MAKE_CLOCK_NAME(sysctl_resource_i2c6, CLK_SRC_GROUP_COMMON, clock_node_i2c6),
128     clock_i2c7 = MAKE_CLOCK_NAME(sysctl_resource_i2c7, CLK_SRC_GROUP_COMMON, clock_node_i2c7),
129     clock_spi0 = MAKE_CLOCK_NAME(sysctl_resource_spi0, CLK_SRC_GROUP_COMMON, clock_node_spi0),
130     clock_spi1 = MAKE_CLOCK_NAME(sysctl_resource_spi1, CLK_SRC_GROUP_COMMON, clock_node_spi1),
131     clock_spi2 = MAKE_CLOCK_NAME(sysctl_resource_spi2, CLK_SRC_GROUP_COMMON, clock_node_spi2),
132     clock_spi3 = MAKE_CLOCK_NAME(sysctl_resource_spi3, CLK_SRC_GROUP_COMMON, clock_node_spi3),
133     clock_spi4 = MAKE_CLOCK_NAME(sysctl_resource_spi4, CLK_SRC_GROUP_COMMON, clock_node_spi4),
134     clock_spi5 = MAKE_CLOCK_NAME(sysctl_resource_spi5, CLK_SRC_GROUP_COMMON, clock_node_spi5),
135     clock_spi6 = MAKE_CLOCK_NAME(sysctl_resource_spi6, CLK_SRC_GROUP_COMMON, clock_node_spi6),
136     clock_spi7 = MAKE_CLOCK_NAME(sysctl_resource_spi7, CLK_SRC_GROUP_COMMON, clock_node_spi7),
137     clock_uart0 = MAKE_CLOCK_NAME(sysctl_resource_uart0, CLK_SRC_GROUP_COMMON, clock_node_uart0),
138     clock_uart1 = MAKE_CLOCK_NAME(sysctl_resource_uart1, CLK_SRC_GROUP_COMMON, clock_node_uart1),
139     clock_uart2 = MAKE_CLOCK_NAME(sysctl_resource_uart2, CLK_SRC_GROUP_COMMON, clock_node_uart2),
140     clock_uart3 = MAKE_CLOCK_NAME(sysctl_resource_uart3, CLK_SRC_GROUP_COMMON, clock_node_uart3),
141     clock_uart4 = MAKE_CLOCK_NAME(sysctl_resource_uart4, CLK_SRC_GROUP_COMMON, clock_node_uart4),
142     clock_uart5 = MAKE_CLOCK_NAME(sysctl_resource_uart5, CLK_SRC_GROUP_COMMON, clock_node_uart5),
143     clock_uart6 = MAKE_CLOCK_NAME(sysctl_resource_uart6, CLK_SRC_GROUP_COMMON, clock_node_uart6),
144     clock_uart7 = MAKE_CLOCK_NAME(sysctl_resource_uart7, CLK_SRC_GROUP_COMMON, clock_node_uart7),
145     clock_uart8 = MAKE_CLOCK_NAME(sysctl_resource_uart8, CLK_SRC_GROUP_COMMON, clock_node_uart8),
146     clock_uart9 = MAKE_CLOCK_NAME(sysctl_resource_uart9, CLK_SRC_GROUP_COMMON, clock_node_uart9),
147     clock_uart10 = MAKE_CLOCK_NAME(sysctl_resource_uart10, CLK_SRC_GROUP_COMMON, clock_node_uart10),
148     clock_uart11 = MAKE_CLOCK_NAME(sysctl_resource_uart11, CLK_SRC_GROUP_COMMON, clock_node_uart11),
149     clock_uart12 = MAKE_CLOCK_NAME(sysctl_resource_uart12, CLK_SRC_GROUP_COMMON, clock_node_uart12),
150     clock_uart13 = MAKE_CLOCK_NAME(sysctl_resource_uart13, CLK_SRC_GROUP_COMMON, clock_node_uart13),
151     clock_uart14 = MAKE_CLOCK_NAME(sysctl_resource_uart14, CLK_SRC_GROUP_COMMON, clock_node_uart14),
152     clock_uart15 = MAKE_CLOCK_NAME(sysctl_resource_uart15, CLK_SRC_GROUP_COMMON, clock_node_uart15),
153     clock_can0 = MAKE_CLOCK_NAME(sysctl_resource_can0, CLK_SRC_GROUP_COMMON, clock_node_can0),
154     clock_can1 = MAKE_CLOCK_NAME(sysctl_resource_can1, CLK_SRC_GROUP_COMMON, clock_node_can1),
155     clock_can2 = MAKE_CLOCK_NAME(sysctl_resource_can2, CLK_SRC_GROUP_COMMON, clock_node_can2),
156     clock_can3 = MAKE_CLOCK_NAME(sysctl_resource_can3, CLK_SRC_GROUP_COMMON, clock_node_can3),
157     clock_can4 = MAKE_CLOCK_NAME(sysctl_resource_can4, CLK_SRC_GROUP_COMMON, clock_node_can4),
158     clock_can5 = MAKE_CLOCK_NAME(sysctl_resource_can5, CLK_SRC_GROUP_COMMON, clock_node_can5),
159     clock_can6 = MAKE_CLOCK_NAME(sysctl_resource_can6, CLK_SRC_GROUP_COMMON, clock_node_can6),
160     clock_can7 = MAKE_CLOCK_NAME(sysctl_resource_can7, CLK_SRC_GROUP_COMMON, clock_node_can7),
161     clock_xpi0 = MAKE_CLOCK_NAME(sysctl_resource_xpi0, CLK_SRC_GROUP_COMMON, clock_node_xpi0),
162     clock_femc = MAKE_CLOCK_NAME(sysctl_resource_femc, CLK_SRC_GROUP_COMMON, clock_node_femc),
163     clock_eth0 = MAKE_CLOCK_NAME(sysctl_resource_eth0, CLK_SRC_GROUP_COMMON, clock_node_eth0),
164     clock_ptp0 = MAKE_CLOCK_NAME(sysctl_resource_eth0, CLK_SRC_GROUP_COMMON, clock_node_ptp0),
165     clock_ntmr0 = MAKE_CLOCK_NAME(sysctl_resource_ntmr0, CLK_SRC_GROUP_COMMON, clock_node_ntmr0),
166     clock_ref0 = MAKE_CLOCK_NAME(sysctl_resource_ref0, CLK_SRC_GROUP_COMMON, clock_node_ref0),
167     clock_ref1 = MAKE_CLOCK_NAME(sysctl_resource_ref1, CLK_SRC_GROUP_COMMON, clock_node_ref1),
168     clock_tsn1 = MAKE_CLOCK_NAME(sysctl_resource_tsn0, CLK_SRC_GROUP_COMMON, clock_node_tsn1),
169     clock_tsn2 = MAKE_CLOCK_NAME(sysctl_resource_tsn0, CLK_SRC_GROUP_COMMON, clock_node_tsn2),
170     clock_tsn3 = MAKE_CLOCK_NAME(sysctl_resource_tsn0, CLK_SRC_GROUP_COMMON, clock_node_tsn3),
171 
172     clock_crc0 = MAKE_CLOCK_NAME(sysctl_resource_crc0, CLK_SRC_GROUP_AHB, 0),
173     clock_tsns = MAKE_CLOCK_NAME(sysctl_resource_tsns, CLK_SRC_GROUP_AHB, 0),
174     clock_mbx0 = MAKE_CLOCK_NAME(sysctl_resource_mbx0, CLK_SRC_GROUP_AHB, 0),
175     clock_mbx1 = MAKE_CLOCK_NAME(sysctl_resource_mbx1, CLK_SRC_GROUP_AHB, 0),
176     clock_gpio = MAKE_CLOCK_NAME(sysctl_resource_gpio, CLK_SRC_GROUP_AHB, 0),
177     clock_ppi0 = MAKE_CLOCK_NAME(sysctl_resource_ppi0, CLK_SRC_GROUP_AHB, 0),
178     clock_hdma = MAKE_CLOCK_NAME(sysctl_resource_hdma, CLK_SRC_GROUP_AHB, 0),
179     clock_lobs = MAKE_CLOCK_NAME(sysctl_resource_lobs, CLK_SRC_GROUP_AHB, 0),
180     clock_cmp0 = MAKE_CLOCK_NAME(sysctl_resource_cmp0, CLK_SRC_GROUP_AHB, 0),
181     clock_cmp1 = MAKE_CLOCK_NAME(sysctl_resource_cmp1, CLK_SRC_GROUP_AHB, 0),
182     clock_cmp2 = MAKE_CLOCK_NAME(sysctl_resource_cmp2, CLK_SRC_GROUP_AHB, 0),
183     clock_cmp3 = MAKE_CLOCK_NAME(sysctl_resource_cmp3, CLK_SRC_GROUP_AHB, 0),
184     clock_ptpc = MAKE_CLOCK_NAME(sysctl_resource_ptpc, CLK_SRC_GROUP_AHB, 0),
185     clock_mot0 = MAKE_CLOCK_NAME(RESOURCE_INVALID, CLK_SRC_GROUP_AHB, 0),
186     clock_qei0 = MAKE_CLOCK_NAME(sysctl_resource_qei0, CLK_SRC_GROUP_AHB, 0),
187     clock_qei1 = MAKE_CLOCK_NAME(sysctl_resource_qei1, CLK_SRC_GROUP_AHB, 0),
188     clock_qei2 = MAKE_CLOCK_NAME(sysctl_resource_qei2, CLK_SRC_GROUP_AHB, 0),
189     clock_qei3 = MAKE_CLOCK_NAME(sysctl_resource_qei3, CLK_SRC_GROUP_AHB, 0),
190     clock_qeo0 = MAKE_CLOCK_NAME(sysctl_resource_qeo0, CLK_SRC_GROUP_AHB, 0),
191     clock_qeo1 = MAKE_CLOCK_NAME(sysctl_resource_qeo1, CLK_SRC_GROUP_AHB, 0),
192     clock_qeo2 = MAKE_CLOCK_NAME(sysctl_resource_qeo2, CLK_SRC_GROUP_AHB, 0),
193     clock_qeo3 = MAKE_CLOCK_NAME(sysctl_resource_qeo3, CLK_SRC_GROUP_AHB, 0),
194     clock_pwm0 = MAKE_CLOCK_NAME(sysctl_resource_pwm0, CLK_SRC_GROUP_AHB, 0),
195     clock_pwm1 = MAKE_CLOCK_NAME(sysctl_resource_pwm1, CLK_SRC_GROUP_AHB, 0),
196     clock_pwm2 = MAKE_CLOCK_NAME(sysctl_resource_pwm2, CLK_SRC_GROUP_AHB, 0),
197     clock_pwm3 = MAKE_CLOCK_NAME(sysctl_resource_pwm3, CLK_SRC_GROUP_AHB, 0),
198     clock_rdc0 = MAKE_CLOCK_NAME(sysctl_resource_rdc0, CLK_SRC_GROUP_AHB, 0),
199     clock_rdc1 = MAKE_CLOCK_NAME(sysctl_resource_rdc1, CLK_SRC_GROUP_AHB, 0),
200     clock_sdm0 = MAKE_CLOCK_NAME(sysctl_resource_sdm0, CLK_SRC_GROUP_AHB, 0),
201     clock_sdm1 = MAKE_CLOCK_NAME(sysctl_resource_sdm1, CLK_SRC_GROUP_AHB, 0),
202     clock_plb0 = MAKE_CLOCK_NAME(sysctl_resource_plb0, CLK_SRC_GROUP_AHB, 0),
203     clock_sei0 = MAKE_CLOCK_NAME(sysctl_resource_sei0, CLK_SRC_GROUP_AHB, 0),
204     clock_mtg0 = MAKE_CLOCK_NAME(sysctl_resource_mtg0, CLK_SRC_GROUP_AHB, 0),
205     clock_mtg1 = MAKE_CLOCK_NAME(sysctl_resource_mtg1, CLK_SRC_GROUP_AHB, 0),
206     clock_vsc0 = MAKE_CLOCK_NAME(sysctl_resource_vsc0, CLK_SRC_GROUP_AHB, 0),
207     clock_vsc1 = MAKE_CLOCK_NAME(sysctl_resource_vsc1, CLK_SRC_GROUP_AHB, 0),
208     clock_clc0 = MAKE_CLOCK_NAME(sysctl_resource_clc0, CLK_SRC_GROUP_AHB, 0),
209     clock_clc1 = MAKE_CLOCK_NAME(sysctl_resource_clc1, CLK_SRC_GROUP_AHB, 0),
210     clock_emds = MAKE_CLOCK_NAME(sysctl_resource_emds, CLK_SRC_GROUP_AHB, 0),
211 
212     clock_watchdog0 = MAKE_CLOCK_NAME(sysctl_resource_wdg0, CLK_SRC_GROUP_EWDG, 0),
213     clock_watchdog1 = MAKE_CLOCK_NAME(sysctl_resource_wdg1, CLK_SRC_GROUP_EWDG, 1),
214     clock_watchdog2 = MAKE_CLOCK_NAME(sysctl_resource_wdg2, CLK_SRC_GROUP_EWDG, 2),
215     clock_watchdog3 = MAKE_CLOCK_NAME(sysctl_resource_wdg3, CLK_SRC_GROUP_EWDG, 3),
216 
217     clock_rng = MAKE_CLOCK_NAME(sysctl_resource_rng0, CLK_SRC_GROUP_AXIS, 0),
218     clock_sdp = MAKE_CLOCK_NAME(sysctl_resource_sdp0, CLK_SRC_GROUP_AXIS, 1),
219     clock_pka = MAKE_CLOCK_NAME(sysctl_resource_pka0, CLK_SRC_GROUP_AXIS, 2),
220     clock_kman = MAKE_CLOCK_NAME(sysctl_resource_kman, CLK_SRC_GROUP_AXIS, 3),
221     clock_xdma = MAKE_CLOCK_NAME(sysctl_resource_xdma, CLK_SRC_GROUP_AXIS, 4),
222     clock_ffa0 = MAKE_CLOCK_NAME(sysctl_resource_ffa0, CLK_SRC_GROUP_AXIS, 5),
223     clock_rom0 = MAKE_CLOCK_NAME(sysctl_resource_rom0, CLK_SRC_GROUP_AXIS, 6),
224 
225     clock_ram0 = MAKE_CLOCK_NAME(sysctl_resource_ram0, CLK_SRC_GROUP_AXIF, 0),
226     clock_ram1 = MAKE_CLOCK_NAME(sysctl_resource_ram1, CLK_SRC_GROUP_AXIF, 1),
227 
228     clock_usb0 = MAKE_CLOCK_NAME(sysctl_resource_usb0, CLK_SRC_GROUP_AXIC, 0),
229 
230     clock_esc0 = MAKE_CLOCK_NAME(sysctl_resource_esc0, CLK_SRC_GROUP_AXIN, 0),
231 
232     clock_lmm0 = MAKE_CLOCK_NAME(sysctl_resource_lmm0, CLK_SRC_GROUP_CPU0, 0),
233     clock_lmm1 = MAKE_CLOCK_NAME(sysctl_resource_lmm0, CLK_SRC_GROUP_CPU1, 0),
234 
235     clock_puart = MAKE_CLOCK_NAME(RESOURCE_INVALID, CLK_SRC_GROUP_PMIC, 0),
236     clock_ptmr = MAKE_CLOCK_NAME(RESOURCE_INVALID, CLK_SRC_GROUP_PMIC, 1),
237 
238     clock_pwdg = MAKE_CLOCK_NAME(RESOURCE_INVALID, CLK_SRC_GROUP_PEWDG, 0),
239 
240     /* For ADC, there are 2-stage clock source and divider configurations */
241     clock_ana0 = MAKE_CLOCK_NAME(RESOURCE_INVALID, CLK_SRC_GROUP_COMMON, clock_node_ana0),
242     clock_ana1 = MAKE_CLOCK_NAME(RESOURCE_INVALID, CLK_SRC_GROUP_COMMON, clock_node_ana1),
243     clock_ana2 = MAKE_CLOCK_NAME(RESOURCE_INVALID, CLK_SRC_GROUP_COMMON, clock_node_ana2),
244     clock_ana3 = MAKE_CLOCK_NAME(RESOURCE_INVALID, CLK_SRC_GROUP_COMMON, clock_node_ana3),
245     clock_adc0 = MAKE_CLOCK_NAME(sysctl_resource_adc0, CLK_SRC_GROUP_ADC, 0),
246     clock_adc1 = MAKE_CLOCK_NAME(sysctl_resource_adc1, CLK_SRC_GROUP_ADC, 1),
247     clock_adc2 = MAKE_CLOCK_NAME(sysctl_resource_adc2, CLK_SRC_GROUP_ADC, 2),
248     clock_adc3 = MAKE_CLOCK_NAME(sysctl_resource_adc3, CLK_SRC_GROUP_ADC, 3),
249 
250     /* For I2S, there are 2-stage clock source and divider configurations */
251     clock_aud0 = MAKE_CLOCK_NAME(RESOURCE_INVALID, CLK_SRC_GROUP_COMMON, clock_node_aud0),
252     clock_aud1 = MAKE_CLOCK_NAME(RESOURCE_INVALID, CLK_SRC_GROUP_COMMON, clock_node_aud1),
253     clock_i2s0 = MAKE_CLOCK_NAME(sysctl_resource_i2s0, CLK_SRC_GROUP_I2S, 0),
254     clock_i2s1 = MAKE_CLOCK_NAME(sysctl_resource_i2s1, CLK_SRC_GROUP_I2S, 1),
255     clock_pdm = MAKE_CLOCK_NAME(sysctl_resource_i2spdm0, CLK_SRC_GROUP_I2S, 0),
256     clock_dao = MAKE_CLOCK_NAME(sysctl_resource_i2sdao, CLK_SRC_GROUP_I2S, 1),
257 
258     /* Clock sources */
259     clk_osc0clk0 = MAKE_CLOCK_NAME(sysctl_resource_xtal, CLK_SRC_GROUP_SRC, 0),
260     clk_pll0clk0 = MAKE_CLOCK_NAME(sysctl_resource_clk0_pll0, CLK_SRC_GROUP_SRC, 1),
261     clk_pll0clk1 = MAKE_CLOCK_NAME(sysctl_resource_clk1_pll0, CLK_SRC_GROUP_SRC, 2),
262     clk_pll1clk0 = MAKE_CLOCK_NAME(sysctl_resource_clk0_pll1, CLK_SRC_GROUP_SRC, 3),
263     clk_pll1clk1 = MAKE_CLOCK_NAME(sysctl_resource_clk1_pll1, CLK_SRC_GROUP_SRC, 4),
264     clk_pll1clk2 = MAKE_CLOCK_NAME(sysctl_resource_clk2_pll1, CLK_SRC_GROUP_SRC, 5),
265     clk_pll2clk0 = MAKE_CLOCK_NAME(sysctl_resource_clk0_pll2, CLK_SRC_GROUP_SRC, 6),
266     clk_pll2clk1 = MAKE_CLOCK_NAME(sysctl_resource_clk1_pll2, CLK_SRC_GROUP_SRC, 7),
267 } clock_name_t;
268 
269 #ifdef __cplusplus
270 extern "C" {
271 #endif
272 
273 /**
274  * @brief Get specified IP frequency
275  * @param[in] clock_name IP clock name
276  *
277  * @return IP clock frequency in Hz
278  */
279 uint32_t clock_get_frequency(clock_name_t clock_name);
280 
281 
282 /**
283  * @brief Get Clock frequency for selected clock source
284  * @param [in] source clock source
285  * @return clock frequency for selected clock source
286  */
287 uint32_t get_frequency_for_source(clock_source_t source);
288 
289 /**
290  * @brief Get the IP clock source
291  *        Note: This API return the direct clock source
292  * @param [in] clock_name clock name
293  * @return IP clock source
294  */
295 clk_src_t clock_get_source(clock_name_t clock_name);
296 
297 /**
298  * @brief Set ADC clock source
299  * @param[in] clock_name ADC clock name
300  * @param[in] src ADC clock source
301  *
302  * @return #status_success Setting ADC clock source is successful
303  *         #status_clk_invalid Invalid ADC clock
304  *         #status_clk_src_invalid Invalid ADC clock source
305  */
306 hpm_stat_t clock_set_adc_source(clock_name_t clock_name, clk_src_t src);
307 
308 /**
309  * @brief Set DAC clock source
310  * @param[in] clock_name DAC clock name
311  * @param[in] src DAC clock source
312  *
313  * @return #status_success Setting DAC clock source is successful
314  *         #status_clk_invalid Invalid DAC clock
315  *         #status_clk_src_invalid Invalid DAC clock source
316  */
317 hpm_stat_t clock_set_dac_source(clock_name_t clock_name, clk_src_t src);
318 
319 /**
320  * @brief Set I2S clock source
321  * @param[in] clock_name I2S clock name
322  * @param[in] src I2S clock source
323  *
324  * @return #status_success Setting I2S clock source is successful
325  *         #status_clk_invalid Invalid I2S clock
326  *         #status_clk_src_invalid Invalid I2S clock source
327  */
328 hpm_stat_t clock_set_i2s_source(clock_name_t clock_name, clk_src_t src);
329 
330 /**
331  * @brief Set the WDG clock source
332  * @param [in] clock_name WDG clock name
333  * @param [in] src WDG clock source
334  *
335  * @retval status_success Setting WDG clock source is successful
336  * @retval status_invalid_argument Invalid WDG or invalid clock source
337  */
338 hpm_stat_t clock_set_wdg_source(clock_name_t clock_name, clk_src_t src);
339 
340 /**
341  * @brief Set the IP clock source and divider
342  * @param[in] clock_name clock name
343  * @param[in] src clock source
344  * @param[in] div clock divider, valid range (1 - 256)
345  *
346  * @return #status_success Setting Clock source and divider is successful.
347  *         #status_clk_src_invalid clock source is invalid.
348  *         #status_clk_fixed clock source and divider is a fixed value
349  *         #status_clk_shared_ahb Clock is shared with the AHB clock
350  *         #status_clk_shared_axi0 Clock is shared with the AXI0 clock
351  *         #status_clk_shared_axi1 CLock is shared with the AXI1 clock
352  *         #status_clk_shared_axi2 Clock is shared with the AXI2 clock
353  *         #status_clk_shared_cpu0 Clock is shared with the CPU0 clock
354  *         #status_clk_shared_cpu1 Clock is shared with the CPU1 clock
355  */
356 hpm_stat_t clock_set_source_divider(clock_name_t clock_name, clk_src_t src, uint32_t div);
357 
358 /**
359  * @brief Enable IP clock
360  * @param[in] clock_name IP clock name
361  */
362 void clock_enable(clock_name_t clock_name);
363 
364 /**
365  * @brief Disable IP clock
366  * @param[in] clock_name IP clock name
367  */
368 void clock_disable(clock_name_t clock_name);
369 
370 /**
371  * @brief Add IP to specified group
372  * @param[in] clock_name IP clock name
373  * @param[in] group resource group index, valid value: 0/1/2/3
374  */
375 void clock_add_to_group(clock_name_t clock_name, uint32_t group);
376 
377 /**
378  * @brief Remove IP from specified group
379  * @param[in] clock_name IP clock name
380  * @param[in] group resource group index, valid value: 0/1/2/3
381  */
382 void clock_remove_from_group(clock_name_t clock_name, uint32_t group);
383 
384 /**
385  * @brief Check IP in specified group
386  * @param[in] clock_name IP clock name
387  * @return true if in group, false if not in group
388  */
389 bool clock_check_in_group(clock_name_t clock_name, uint32_t group);
390 
391 /**
392  * @brief Disconnect the clock group from specified CPU
393  * @param[in] group clock group index, value value is 0/1/2/3
394  * @param[in] cpu CPU index, valid value is 0/1
395  */
396 void clock_connect_group_to_cpu(uint32_t group, uint32_t cpu);
397 
398 /**
399  * @brief Disconnect the clock group from specified CPU
400  * @param[in] group clock group index, value value is 0/1/2/3
401  * @param[in] cpu CPU index, valid value is 0/1
402  */
403 void clock_disconnect_group_from_cpu(uint32_t group, uint32_t cpu);
404 
405 /**
406  * @brief Delay specified microseconds
407  *
408  * @param [in] us expected delay interval in microseconds
409  */
410 void clock_cpu_delay_us(uint32_t us);
411 
412 /**
413  * @brief Delay specified milliseconds
414  *
415  * @param [in] ms expected delay interval in milliseconds
416  */
417 void clock_cpu_delay_ms(uint32_t ms);
418 
419 /**
420  * @brief Update the Core clock frequency
421  */
422 void clock_update_core_clock(void);
423 
424 /**
425  * @brief HPM Core clock variable
426  */
427 extern uint32_t hpm_core_clock;
428 
429 #ifdef __cplusplus
430 }
431 #endif
432 
433 #endif /* HPM_CLOCK_DRV_H */
434