1 /* Copyright (c) 2023, Canaan Bright Sight Co., Ltd
2  *
3  * Redistribution and use in source and binary forms, with or without
4  * modification, are permitted provided that the following conditions are met:
5  * 1. Redistributions of source code must retain the above copyright
6  * notice, this list of conditions and the following disclaimer.
7  * 2. Redistributions in binary form must reproduce the above copyright
8  * notice, this list of conditions and the following disclaimer in the
9  * documentation and/or other materials provided with the distribution.
10  *
11  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
12  * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
13  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
14  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
15  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
16  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
17  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
18  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
21  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
22  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 
26 #ifndef __SYSCTL_CLK_H__
27 #define __SYSCTL_CLK_H__
28 
29 #include <stdint.h>
30 #include <stdbool.h>
31 
32 /* See TRM 2.2.4 Table 2-2-9 */
33 typedef struct sysctl_clk {
34     volatile uint32_t cpu0_clk_cfg;             /* 0x00 */
35     volatile uint32_t reserved_0;               /* 0x04 */
36     volatile uint32_t reserved_1;               /* 0x08 */
37     volatile uint32_t reserved_2;               /* 0x0c */
38     volatile uint32_t pmu_clk_cfg;              /* 0x10 */
39     volatile uint32_t reserved0[1];             /* 0x14 */
40     volatile uint32_t hs_clken_cfg;             /* 0x18 */
41     volatile uint32_t hs_sdclk_cfg;             /* 0x1c */
42     volatile uint32_t hs_spi_cfg;               /* 0x20 */
43     volatile uint32_t ls_clken_cfg0;            /* 0x24 */
44     volatile uint32_t ls_clken_cfg1;            /* 0x28 */
45     volatile uint32_t uart_i2c_clkdiv_cfg;      /* 0x2c */
46     volatile uint32_t ls_clkdiv_cfg;            /* 0x30 */
47     volatile uint32_t reserved_3;               /* 0x34 */
48     volatile uint32_t reserved_4;               /* 0x38 */
49     volatile uint32_t reserved_5;               /* 0x3c */
50     volatile uint32_t reserved_6;               /* 0x40 */
51     volatile uint32_t reserved_7;               /* 0x44 */
52     volatile uint32_t reserved1[2];             /* 0x48 0x4c */
53     volatile uint32_t sysctl_clken_cfg;         /* 0x50 */
54     volatile uint32_t timer_clk_cfg;            /* 0x54 */
55     volatile uint32_t sysctl_clk_div_cfg;       /* 0x58 */
56     volatile uint32_t shrm_clk_cfg;             /* 0x5c */
57     volatile uint32_t ddr_clk_cfg;              /* 0x60 */
58     volatile uint32_t reserved_8;               /* 0x64 */
59     volatile uint32_t reserved_9;               /* 0x68 */
60     volatile uint32_t reserved_10;              /* 0x6c */
61     volatile uint32_t reserved_11;              /* 0x70 */
62     volatile uint32_t reserved_12;              /* 0x74 */
63     volatile uint32_t reserved_13;              /* 0x78 */
64     volatile uint32_t reserved2[1];             /* 0x7c */
65     volatile uint32_t sec_clk_div;              /* 0x80 */
66     volatile uint32_t reserved3[31];            /* 0x84 0x88 0x8c 0x90 0x94 0x98 0x9c 0xa0-0xac 0xb0-0xbc 0xc0-0xcc 0xd0-0xdc 0xe0-0xec 0xf0-0xfc*/
67     volatile uint32_t usb_test_clk_div;         /* 0x100 */
68     volatile uint32_t dphy_test_clk_div;        /* 0x104 */
69     volatile uint32_t spi2axi_clk_div;          /* 0x108 */
70 } sysctl_clk_t;
71 
72 /*
73  * Clock Tree and clock node table
74  *
75  * Abbreviations:
76  * - D: DIV
77  * - G: GATE
78  * - M: MUX
79  * - fD: fraDIV
80  */
81 typedef enum {
82     /*
83      * First level is sysctl_boot / sysctrl_root module, which
84      * is composed of osc24m, pll[0|1|2|3], pll[0|1|2|3]_[div2|div3|div4] (pllx
85      * outputs 4 signals, namely pllx, div2, div3, and div4).
86      * Plus timerx_pulse_in, which is an external pulse input through the soc
87      * pin (pinmux) as a source of timer clock.
88      *
89      * - osc24m: fixed-clock
90      * - pll[0|1|2|3]: clock generated by PLL
91      * - pll[0|1|2|3]_[div2|div3|div4]: fixed-clock
92      * - timerx_pulse_in: fixed-clock, maxsize is 1MHz
93      *
94      * osc24m ---+--> pll0 ---+--------> pll0 ------->+
95      *           |            +--(D2)--> pll0_div2 -->|
96      *           |            +--(D3)--> pll0_div3 -->|
97      *           |            +--(D4)--> pll0_div4 -->|
98      *           |                                    |
99      *           +--> pll1 ---+--------> pll1 ------->|
100      *           |            +--(D2)--> pll1_div2 -->|
101      *           |            +--(D3)--> pll1_div3 -->|
102      *           |            +--(D4)--> pll1_div4 -->|
103      *           |                                    +--> sysctl_clock
104      *           +--> pll2 ---+--------> pll2 ------->|
105      *           |            +--(D2)--> pll2_div2 -->|
106      *           |            +--(D3)--> pll2_div3 -->|
107      *           |            +--(D4)--> pll2_div4 -->|
108      *           |                                    |
109      *           +--> pll3 ---+--------> pll3 ------->|
110      *           |            +--(D2)--> pll3_div2 -->|
111      *           |            +--(D3)--> pll3_div3 -->|
112      *           |            +--(D4)--> pll3_div4 -->|
113      *           |                                    |
114      *           +----------------------------------->+
115      *                                                |
116      * timerx_pulse_in ------------------------------>+
117      */
118     SYSCTL_CLK_ROOT_OSC_IN = 0,       /* 24M */
119     SYSCTL_CLK_ROOT_TIMERX_PULSE_IN,  /* 50M */
120     SYSCTL_CLK_ROOT_PLL0,             /* 1.6G */
121     SYSCTL_CLK_ROOT_PLL0_DIV_2,       /* 800M */
122     SYSCTL_CLK_ROOT_PLL0_DIV_3,       /* 533M */
123     SYSCTL_CLK_ROOT_PLL0_DIV_4,       /* 400M */
124     SYSCTL_CLK_ROOT_PLL1,             /* 2.376G */
125     SYSCTL_CLK_ROOT_PLL1_DIV_2,       /* 1.188G */
126     SYSCTL_CLK_ROOT_PLL1_DIV_3,       /* 792M */
127     SYSCTL_CLK_ROOT_PLL1_DIV_4,       /* 594M */
128     SYSCTL_CLK_ROOT_PLL2,             /* 2.667G */
129     SYSCTL_CLK_ROOT_PLL2_DIV_2,       /* 1.3335G */
130     SYSCTL_CLK_ROOT_PLL2_DIV_3,       /* 889M */
131     SYSCTL_CLK_ROOT_PLL2_DIV_4,       /* 666.75M */
132     SYSCTL_CLK_ROOT_PLL3,             /* 1.6G */
133     SYSCTL_CLK_ROOT_PLL3_DIV_2,       /* 800M */
134     SYSCTL_CLK_ROOT_PLL3_DIV_3,       /* 533M */
135     SYSCTL_CLK_ROOT_PLL3_DIV_4,       /* 400M */
136     SYSCTL_CLK_ROOT_MAX,
137 
138     /*
139      * Second level is sysctl_clock module, which is composed of several clock sub-trees
140      * - CPU0: aclk/pliclk/pclk
141      * - pmu system: pclk
142      * - HS (High Speed) system: hs/sdx/ssix/usbx
143      * - LS (Low Speed) system : ls/uartx/i2cx/gpio/pwm/jamlinkx/audio/adc/codec
144      * - System Control (such as wdt, timer, iomux, mailbox): sysctl/wdtx/timer/iomux/mailbox/hdi/stc/ts
145      * - Timer: timerx
146      * - shrm (share memory) system: shrm/decompress/gsdma/nonai2d/pdma
147      * - sec (security) system: aclk/fixclk/pclk
148      * - usb test mode: clk480/clk100
149      * - dphy dft mode clock: dphy_test_clk
150      * - spi2axi clock: aclk
151      */
152 
153     /*
154      * cpu0 clock tree:
155      *
156      * pll0_div2 --(DG)--> cpu0_src --+--(DG)--> cpu0_plic
157      *                                |--(D)---> cpu0_aclk
158      *                                +--(G)---> cpu0_noc_ddrcp4
159      * pll0_div4 --(DG)--> cpu0_pclk
160      */
161 
162     /* root node: pll0_div2 */
163     SYSCTL_CLK_CPU0_SRC,        /* cpu0 core,defualt 800MHz ---> select pll0_div_2 */
164     SYSCTL_CLK_CPU0_PLIC,       /* cpu0 plic clk,400MHz */
165     SYSCTL_CLK_CPU0_ACLK,       /* cpu0 axi clk,400MHz */
166     SYSCTL_CLK_CPU0_NOC_DDRCP4, /* ddrc axi4clk & noc AXI clock,400MHz */
167     /* root node: pll0_div4 */
168     SYSCTL_CLK_CPU0_PCLK,       /* cpu0 apb pclk,200MHz */
169 
170     /*
171      * pmu system clock tree:
172      *
173      * osc24m -->(G)--> pmu_pclk
174      *
175      * - pmu_pclk: pmu apb clk gate
176      */
177     SYSCTL_CLK_PMU_PCLK,
178 
179     /*
180      * High-Speed system clock tree
181      *
182      * pll0_div4 --+--(D)--> hs_hclk_high_src --+--(G)----> hs_hclk_high_gate
183      *             |                            |
184      *             |                            +--(DG)--> hs_hclk_src --+--(G)--> sd0_ahb_gate
185      *             |                                                     |--(G)--> sd1_ahb_gate
186      *             |                                                     |--(G)--> ssi1_ahb_gate
187      *             |                                                     |--(G)--> ssi2_ahb_gate
188      *             |                                                     |--(G)--> usb0_ahb_gate
189      *             |                                                     +--(G)--> usb1_ahb_gate
190      *             |
191      *             +--(DG)--> ssi0_axi
192      *             |--(DG)--> ssi1
193      *             |--(DG)--> ssi2
194      *             +--(DG)--> qspi_axi_src --+--(G)--> ssi1_aclk_gate
195      *             |                         |
196      *             |                         +--(G)--> ssi2_aclk_gate
197      *             |
198      *             +--(DG)--> sd_card_src --+--(G)--> sd0_card_gate
199      *                                      |
200      *                                      +--(G)--> sd1_card_gate
201      *
202      * pll0_div2 --\
203      *             (M)--(G)--> ssi0
204      * pll2_div4 --/
205      *
206      *
207      * pll2_div4 --(DG)--> sd_axi_src --+--(G)--> sd0_axi_gate
208      *                                  |--(G)--> sd1_axi_gate
209      *                                  |--(G)--> sd0_base_gate
210      *                                  +--(G)--> sd1_base_gate
211      *
212      *
213      *
214      * osc24m -----------------------------------------\
215      *                                                (M)--+--(G)--> usb0_ref_gate
216      * pll0 --(D)--> pll0_div16 --(D)--> usb_ref_50m --/   |
217      *                                                     +--(G)--> usb1_ref_gate
218      *
219      *
220      * osc24m --(DG)--> sd_timer_src --+--(G)--> sd0_timer_gate
221      *                                 |
222      *                                 +--(G)--> sd1_timer_gate
223      */
224 
225     /* root node: pll0_div4, through hs_hclk_high_src */
226     SYSCTL_CLK_HS_HCLK_HIGH_SRC,
227     SYSCTL_CLK_HS_HCLK_HIGH_GATE,
228     SYSCTL_CLK_HS_HCLK_SRC,
229     SYSCTL_CLK_SD0_AHB_GATE,
230     SYSCTL_CLK_SD1_AHB_GATE,
231     SYSCTL_CLK_USB0_AHB_GATE,
232     SYSCTL_CLK_USB1_AHB_GATE,
233     SYSCTL_CLK_SSI1_AHB_GATE,
234     SYSCTL_CLK_SSI2_AHB_GATE,
235 
236     /* root node: pll0_div4 */
237     SYSCTL_CLK_SSI0_AXI,
238     SYSCTL_CLK_SSI1,
239     SYSCTL_CLK_SSI2,
240     SYSCTL_CLK_QSPI_AXI_SRC,
241     SYSCTL_CLK_SSI1_ACLK_GATE,
242     SYSCTL_CLK_SSI2_ACLK_GATE,
243 
244     /*root node: pll0_div4, through sd_card_src */
245     SYSCTL_CLK_SD_CARD_SRC,
246     SYSCTL_CLK_SD0_CARD_GATE,
247     SYSCTL_CLK_SD1_CARD_GATE,
248 
249     /* root node: pll0_div2 MUX pll2_div4 */
250     SYSCTL_CLK_SSI0, /* ospi core clk */
251 
252     /* root node: pll2_div4 */
253     SYSCTL_CLK_SD_AXI_SRC,
254     SYSCTL_CLK_SD0_AXI_GATE,
255     SYSCTL_CLK_SD1_AXI_GATE,
256     SYSCTL_CLK_SD0_BASE_GATE,
257     SYSCTL_CLK_SD1_BASE_GATE,
258 
259     /* root node: pll0_div16 */
260     SYSCTL_CLK_PLL0_DIV16,
261     SYSCTL_CLK_USB_REF_50M, /* usbx reference clk */
262     SYSCTL_CLK_USB0_REF_GATE,
263     SYSCTL_CLK_USB1_REF_GATE,
264 
265     /* root node: osc24m */
266     SYSCTL_CLK_SD_TIMER_SRC,
267     SYSCTL_CLK_SD0_TIMER_GATE,
268     SYSCTL_CLK_SD1_TIMER_GATE,
269 
270     /* Low-Speed system clock tree
271      *
272      *  pll0_div4 --(DG)--+--> ls_apb_src --+--(G) --> uart0_apb_gate
273      *                    |                 +--(G) --> uart1_apb_gate
274      *                    |                 +--(G) --> uart2_apb_gate
275      *                    |                 +--(G) --> uart3_apb_gate
276      *                    |                 +--(G) --> uart4_apb_gate
277      *                    |                 +--(G) --> i2c0_apb_gate
278      *                    |                 +--(G) --> i2c1_apb_gate
279      *                    |                 +--(G) --> i2c2_apb_gate
280      *                    |                 +--(G) --> i2c3_apb_gate
281      *                    |                 +--(G) --> i2c4_apb_gate
282      *                    |                 +--(G) --> gpio_apb_gate
283      *                    |                 +--(G) --> pwm_apb_gate
284      *                    |                 +--(G) --> jamlink0_apb_gate
285      *                    |                 +--(G) --> jamlink1_apb_gate
286      *                    |                 +--(G) --> jamlink2_apb_gate
287      *                    |                 +--(G) --> jamlink3_apb_gate
288      *                    |                 +--(G) --> audio_apb_gate
289      *                    |                 +--(G) --> adc_apb_gate
290      *                    |                 +--(G) --> codec_apb_gate
291      *                    |
292      *                    +--(DG)--> i2c0_core
293      *                    +--(DG)--> i2c1_core
294      *                    +--(DG)--> i2c2_core
295      *                    +--(DG)--> i2c3_core
296      *                    +--(DG)--> i2c4_core
297      *                    +--(DG)--> codec_adc
298      *                    +--(DG)--> codec_dac
299      *                    +--(DG)--> audio_dev
300      *                    +--(DG)--> pdm
301      *                    +--(DG)--> adc
302      *
303      * pll0 --(D)--> pll0_div16 --+--(DG)--> uart0_core
304      *                            +--(DG)--> uart1_core
305      *                            +--(DG)--> uart2_core
306      *                            +--(DG)--> uart3_core
307      *                            +--(DG)--> uart4_core
308      *
309      * pll0 --(D)--> pll0_div16 --(D)--> jamlink_CO_div --+--(G)--> jamlink0_CO_gate
310      *                                                    +--(G)--> jamlink1_CO_gate
311      *                                                    +--(G)--> jamlink2_CO_gate
312      *                                                    +--(G)--> jamlink3_CO_gate
313      *
314      * osc24m --(DG)--> gpio_debounce
315      */
316 
317     /* root node: pll0_div4, through ls_apb_src */
318     SYSCTL_CLK_LS_APB_SRC,
319     SYSCTL_CLK_UART0_APB_GATE,
320     SYSCTL_CLK_UART1_APB_GATE,
321     SYSCTL_CLK_UART2_APB_GATE,
322     SYSCTL_CLK_UART3_APB_GATE,
323     SYSCTL_CLK_UART4_APB_GATE,
324     SYSCTL_CLK_I2C0_APB_GATE,
325     SYSCTL_CLK_I2C1_APB_GATE,
326     SYSCTL_CLK_I2C2_APB_GATE,
327     SYSCTL_CLK_I2C3_APB_GATE,
328     SYSCTL_CLK_I2C4_APB_GATE,
329     SYSCTL_CLK_GPIO_APB_GATE,
330     SYSCTL_CLK_PWM_APB_GATE,
331     SYSCTL_CLK_JAMLINK0_APB_GATE,
332     SYSCTL_CLK_JAMLINK1_APB_GATE,
333     SYSCTL_CLK_JAMLINK2_APB_GATE,
334     SYSCTL_CLK_JAMLINK3_APB_GATE,
335     SYSCTL_CLK_AUDIO_APB_GATE,
336     SYSCTL_CLK_ADC_APB_GATE,
337     SYSCTL_CLK_CODEC_APB_GATE,
338 
339     /* root node: pll0_div4 */
340     SYSCTL_CLK_I2C0_CORE,
341     SYSCTL_CLK_I2C1_CORE,
342     SYSCTL_CLK_I2C2_CORE,
343     SYSCTL_CLK_I2C3_CORE,
344     SYSCTL_CLK_I2C4_CORE,
345     SYSCTL_CLK_CODEC_ADC,
346     SYSCTL_CLK_CODEC_DAC,
347     SYSCTL_CLK_AUDIO_DEV,
348     SYSCTL_CLK_PDM,
349     SYSCTL_CLK_ADC,
350 
351     /* root node: pll0_div16 */
352     SYSCTL_CLK_UART0_CORE,
353     SYSCTL_CLK_UART1_CORE,
354     SYSCTL_CLK_UART2_CORE,
355     SYSCTL_CLK_UART3_CORE,
356     SYSCTL_CLK_UART4_CORE,
357 
358     /* root node: pll0_div16, through jamlink_CO_div */
359     SYSCTL_CLK_JAMLINK_CO_DIV,
360     SYSCTL_CLK_JAMLINK0_CO_GATE,
361     SYSCTL_CLK_JAMLINK1_CO_GATE,
362     SYSCTL_CLK_JAMLINK2_CO_GATE,
363     SYSCTL_CLK_JAMLINK3_CO_GATE,
364 
365     /* root node: osc24m */
366     SYSCTL_CLK_GOIP_DEBOUNCE,
367 
368     /*
369      * System Control clock tree
370      *
371      * pll0_div16 --> sysctl_apb_src --+--(G)--> wdt0_apb_gate
372      *                                 +--(G)--> wdt1_apb_gate
373      *                                 +--(G)--> timer_apb_gate
374      *                                 +--(G)--> iomux_apb_gate
375      *                                 +--(G)--> mailbox_apb_gate
376      *
377      * pll0_div4 --(DG)--> hdi_core
378      *
379      * pll1_div4 --(DG)--> timestamp
380      *
381      * osc24m --(D)--> temp_sensor
382      *
383      * osc24m --+--(DG)--> wdt0
384      *          |
385      *          +--(DG)--> wdt1
386      */
387 
388      /* root node: pll0_div16, through sysctl_apb_src */
389     SYSCTL_CLK_SYSCTRL_APB_SRC,
390     SYSCTL_CLK_WDT0_APB_GATE,
391     SYSCTL_CLK_WDT1_APB_GATE,
392     SYSCTL_CLK_TIMER_APB_GATE,
393     SYSCTL_CLK_IOMUX_APB_GATE,
394     SYSCTL_CLK_MAILBOX_APB_GATE,
395 
396     /* root node: pll0_div4 */
397     SYSCTL_CLK_HDI_CORE,
398 
399     /* root node: pll1_div4 */
400     SYSCTL_CLK_TIMESTAMP,
401 
402     /* root node: osc24m */
403     SYSCTL_CLK_TEMP_SENSOR,
404 
405     /* root node: osc24m */
406     SYSCTL_CLK_WDT0,
407     SYSCTL_CLK_WDT1,
408 
409     /*
410      * timer clock tree
411      *
412      * pll0_div16 --(D)--> timer0_src --\
413      *                                  (M)--(G)-->timer0
414      * timerx_pulse_in -----------------/
415      *
416      * pll0_div16 --(D)--> timer1_src --\
417      *                                  (M)--(G)-->timer1
418      * timerx_pulse_in -----------------/
419      *
420      * pll0_div16 --(D)--> timer2_src --\
421      *                                  (M)--(G)-->timer2
422      * timerx_pulse_in -----------------/
423      *
424      * pll0_div16 --(D)--> timer3_src --\
425      *                                  (M)--(G)-->timer3
426      * timerx_pulse_in -----------------/
427      *
428      * pll0_div16 --(D)--> timer4_src --\
429      *                                  (M)--(G)-->timer4
430      * timerx_pulse_in -----------------/
431      *
432      * pll0_div16 --(D)--> timer5_src --\
433      *                                  (M)--(G)-->timer5
434      * timerx_pulse_in -----------------/
435      */
436 
437     /* root node: pll0_div16 & timerx_pulse_in */
438     SYSCTL_CLK_TIMERX_PULSE_IN,
439     SYSCTL_CLK_TIMER0_SRC,
440     SYSCTL_CLK_TIMER0,
441     SYSCTL_CLK_TIMER1_SRC,
442     SYSCTL_CLK_TIMER1,
443     SYSCTL_CLK_TIMER2_SRC,
444     SYSCTL_CLK_TIMER2,
445     SYSCTL_CLK_TIMER3_SRC,
446     SYSCTL_CLK_TIMER3,
447     SYSCTL_CLK_TIMER4_SRC,
448     SYSCTL_CLK_TIMER4,
449     SYSCTL_CLK_TIMER5_SRC,
450     SYSCTL_CLK_TIMER5,
451 
452     /*
453      * shrm system clock tree
454      *
455      * pll0_div2 --\
456      *             (M)--(G)--> shrm_src --+--(D)--> shrm_div2 --(G)--> shrm_axi_slave
457      * pll3_div2 --/                      |
458      *                                    +--(G)--> decompress_axi
459      *
460      * pll0_div4 -->(DG)--> shrm_apb
461      *
462      * pll0_div4 -->(G)--> shrm_axi_src --+--(G)--> gsdma_axi_gate
463      *                                    +--(G)--> nonai2d_axi_gate
464      *                                    +--(G)--> peri_dma_axi_gate
465      */
466 
467     /* root node: pll0_div2 & pll3_div2 */
468     SYSCTL_CLK_SHRM_SRC,
469     SYSCTL_CLK_SHRM_DIV2,
470     SYSCTL_CLK_SHRM_AXIS_SLAVE,
471     SYSCTL_CLK_DECOMPRESS_AXI,
472 
473     /* root node: pll0_div4 */
474     SYSCTL_CLK_SHRM_APB,
475 
476     /* root node: pll0_div4, through shrm_axi_src */
477     SYSCTL_CLK_SHRM_AXI_SRC,
478     SYSCTL_CLK_GSDMA_AXI_GATE,
479     SYSCTL_CLK_NONAI2D_AXI_GATE,
480     SYSCTL_CLK_PERI_DMA_AXI_GATE,
481 
482     /*
483      * Security system clock tree
484      *
485      * pll0_div4 --(DG)--> sec_apb
486      *
487      * pll1_div4 --+--(DG)--> sec_fix
488      *             |
489      *             +--(DG)--> sec_axi
490      */
491 
492     /* root node: pll0_div4 */
493     SYSCTL_CLK_SEC_APB,
494 
495     /* root node: pll1_div4 */
496     SYSCTL_CLK_SEC_FIX,
497     SYSCTL_CLK_SEC_AXI,
498 
499     /*
500      * usb test mode clock tree
501      *
502      * pll1 --(DG)--> usb_480m
503      *
504      * pll0_div4 --(DG)--> usb_100m
505      */
506 
507     /* root node: pll1 */
508     SYSCTL_CLK_USB_480M,
509 
510     /* root node: pll0_div4 */
511     SYSCTL_CLK_USB_100M,
512 
513     /*
514      * dphy dft mode clock tree
515      *
516      * pll0 --(DG)--> dphy_dft_mode
517      */
518 
519     /* root node: pll0 */
520     SYSCTL_CLK_DPHY_DFT_MODE,
521 
522     /*
523      * spi2axi clock tree
524      *
525      * pll0_div4 --(DG)--> spi2axi_axi
526      */
527 
528     /* root node: pll0_div4 */
529     SYSCTL_CLK_SPI2AXI_AXI,
530 
531     SYSCTL_CLK_NODE_MAX,
532 } sysctl_clk_node_e;
533 
534 #define SYSCTL_READ_ENABLE    (1 << 0)
535 #define SYSCTL_READ_DISABLE   (0 << 0)
536 #define SYSCTL_WRITE_ENABLE   (1 << 1)
537 #define SYSCTL_WRITE_DISABLE  (0 << 1)
538 
539 /*
540  * API for root clock. 24M, PLL0-3, these 5 clocks are root clocks
541  * It is assumed here that the big core has read and write permissions to the
542  * root clock, so the properties of clk are not judged in these APIs,
543  * because these APIs are only for the root clock.
544  */
545 
546 /*
547  * Get the bypass status of the PLL.
548  * If it is bypas, the PLL output is 24M OSC clock.
549  */
550 bool sysctl_boot_get_root_clk_bypass(sysctl_clk_node_e clk);
551 void sysctl_boot_set_root_clk_bypass(sysctl_clk_node_e clk, bool enable);
552 
553 /* Enable pll, enable 24M clock&pll */
554 bool sysctl_boot_get_root_clk_en(sysctl_clk_node_e clk);
555 void sysctl_boot_set_root_clk_en(sysctl_clk_node_e clk, bool enable);
556 
557 /* Get the phase-locked loop lock status */
558 bool sysctl_boot_get_root_clk_lock(sysctl_clk_node_e clk);
559 
560 /* Get the root clock frequency */
561 uint32_t sysctl_boot_get_root_clk_freq(sysctl_clk_node_e clk);
562 
563 /*
564  * Set the PLL clock frequency
565  * The formula for setting the PLL clock frequency is:
566  * pll_out_freq = (double)OSC_CLOCK_FREQ_24M * (double)(fbdiv+1) / (double)(refdiv+1) / (double)(outdiv+1)
567  */
568 bool sysctl_boot_set_root_clk_freq(sysctl_clk_node_e clk, uint32_t fbdiv, uint32_t refdiv, uint32_t outdiv, uint32_t bwadj);
569 
570 /*
571  * API for trunk and leaf nodes in the clock tree, i.e. clocks other than the five root clocks.
572  */
573 
574 /*
575  * Set the leaf node clock source on the clock tree.
576  * Please set it according to the clock tree.
577  * Many clock nodes have only one clock source, so the setting will return false.
578  */
579 bool sysctl_clk_set_leaf_parent(sysctl_clk_node_e leaf, sysctl_clk_node_e parent);
580 
581 /* Get the clock source of the leaf node in the clock tree */
582 sysctl_clk_node_e sysctl_clk_get_leaf_parent(sysctl_clk_node_e leaf);
583 
584 /*
585  * Set the clock node enable.
586  * Note: only set the enable of this clock node, and do not set the enable of
587  * the upstream clock.
588  * Difference from Linux kernel: Linux kernel clock framework will automatically
589  * set the enable of the upstream clock. The test code does not have kernel
590  * framework, so only the enable of the clock of this node is set.
591  */
592 void sysctl_clk_set_leaf_en(sysctl_clk_node_e leaf, bool enable);
593 
594 /* Get the enable status of this clock node */
595 bool sysctl_clk_get_leaf_en(sysctl_clk_node_e leaf);
596 
597 /* Set the frequency division factor of this clock node */
598 bool sysctl_clk_set_leaf_div(sysctl_clk_node_e leaf, uint32_t numerator, uint32_t denominator);
599 
600 /* Get the frequency division coefficient of this clock node */
601 double sysctl_clk_get_leaf_div(sysctl_clk_node_e leaf);
602 
603 /*
604  * Calculate clock freqency.
605  * This API searches the entire clock path, calculates the frequency division
606  * at each level starting from the clock source, and finally obtains the
607  * current clock frequency.
608  */
609 uint32_t sysctl_clk_get_leaf_freq(sysctl_clk_node_e leaf);
610 
611 #endif /* __SYSCTL_CLK_H__ */