1 /*
2  * Copyright (C) 2017-2019 Alibaba Group Holding Limited
3  */
4 
5 /******************************************************************************
6  * @file     drv_clk.h
7  * @brief    header file for clk driver
8  * @version  V1.0
9  * @date     02. June 2017
10  * @model    clk
11  ******************************************************************************/
12 
13 #ifndef _CSI_CLK_H_
14 #define _CSI_CLK_H_
15 
16 
17 #include <drv/common.h>
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 typedef enum {
23     CK_TIMER0_PCLK = 0,
24     CK_TIMER1_PCLK,
25     CK_TIMER0_WCLK,
26     CK_TIMER1_WCLK,
27     AP_WDT_PCLK,
28     AP_WDT_WCLK,
29     UART0_PCLK,
30     UART1_PCLK,
31     UART2_PCLK,
32     LP_UART_PCLK,
33     UART0_WCLK_L1,
34     UART0_WCLK_L2,
35     UART1_WCLK,
36     UART2_WCLK,
37     LP_UART_WCLK,
38     I2C0_PCLK,
39     I2C1_PCLK,
40     I2C0_WCLK,
41     I2C1_WCLK,
42     SSP0_PCLK,
43     SSP1_PCLK,
44     SSP2_PCLK,
45     SSP0_WCLK,
46     SSP1_WCLK,
47     SSP2_WCLK,
48     GPIO_PD_PCLK,
49     ADC_PCLK,
50     ADC_WCLK,
51     DAC_PCLK,
52     DAC_WCLK,
53     AD_TIMER0_PCLK,
54     AD_TIMER1_PCLK,
55     AD_TIMER0_WCLK,
56     AD_TIMER1_WCLK,
57     AP_DMA_PCLK,
58     LP_TIMER_PCLK,
59     LP_TIMER_WCLK,
60     I2S0_PCLK,
61     I2S0_WCLK,
62     PD_LOGIC_MATRIX_CLK,
63     PD_PINMUX_CLK,
64     ICP_CLK,
65     SPINOR_PCLK,
66     SPINOR_WCLK,
67     IRAM_CLK,
68     GPIO_PCLK,
69     AO_PINMUX_PCLK,
70     AO_PCU_PCLK,
71     RTC_PCLK,
72     EFLASH2_CLK,
73     EFLASH1_CTRL_CLK,
74     EFLASH1_CFG_CLK,
75     LSP_61M44_WCLK,
76     AON_76M8_CLK,
77     RTC_32K_WCLK,
78     IWDT_PCLK,
79     IWDT_WCLK,
80 }
81 clk_name;
82 
83 
84 /*
85 *  bits domain definition  for clock frequency
86 *  base clock name   same clock number  reserved       clock selection   frequency division
87 *  31...28 27...24            23...20            19...16        15...12 11...8         7...4 3...0
88 *  invalid value:
89 *          0xff                  0xf or 0x0       0x0 or ignore         0xff                    0xff
90 */
91 typedef enum {
92     FIXED_FREQ = 0xffffffff,
93 
94     /*ck timer0&1/rm timer0&1/ceva timer0&1*/
95     WCLK_TIMER_32K  = (CK_TIMER0_WCLK << 24) | 0x00600000,
96     WCLK_TIMER_19M2 = (CK_TIMER0_WCLK << 24) | 0x06000100,    /* 1 div*/
97     WCLK_TIMER_9M6  = (CK_TIMER0_WCLK << 24) | 0x00600101,     /* 2 div*/
98 
99     /*ap wdt/cp wdt*/
100     WCLK_WDT_32K      = (AP_WDT_WCLK << 24) | 0x00200000,
101     WCLK_WDT_19M2     = (AP_WDT_WCLK << 24) | 0x00200100,
102     WCLK_WDT_9M6      = (AP_WDT_WCLK << 24) | 0x00200101,
103 
104     /*i2c0&1*/
105     WCLK_I2C_76M8    = (I2C0_WCLK << 24) | 0x00200100,
106     WCLK_I2C_19M2    = (I2C0_WCLK << 24) | 0x00200000,
107 
108     /*uart0&1&2&lp uart*/
109     WCLK_UART_19M2     = (UART0_WCLK_L1 << 24) | 0x00400000,
110     WCLK_UART_76M8     = (UART0_WCLK_L1 << 24) | 0x00400100,
111     /*only for uart0& lp uart*/
112     WCLK_UART_32K      = (UART0_WCLK_L1 << 24) | 0x00400200,
113 
114     /*ssp0&1&2*/
115     WCLK_SSP_19M2      = (SSP0_WCLK << 24) | 0x00300000,
116     WCLK_SSP_76M8      = (SSP0_WCLK << 24) | 0x00300100,
117     WCLK_SSP_61m44     = (SSP0_WCLK << 24) | 0x00300200,
118 
119     /*adc*/
120     WCLK_ADC_19M2     = (ADC_WCLK << 24) | 0x00100000,
121     WCLK_ADC_38M4     = (ADC_WCLK << 24) | 0x00100100,
122     WCLK_ADC_61M44    = (ADC_WCLK << 24) | 0x00100200,
123     WCLK_ADC_32K      = (ADC_WCLK << 24) | 0x00100300,
124 
125     /*dac*/
126     WCLK_DAC_19M2     = (DAC_WCLK << 24) | 0x001001000,
127     WCLK_DAC_32K      = (DAC_WCLK << 24) | 0x00100200,
128 
129     /*ad timer0&1*/
130     WCLK_AD_TIMER_32K      = (AD_TIMER0_WCLK << 24) | 0x002000000,
131     WCLK_AD_TIMER_76M8     = (AD_TIMER0_WCLK << 24) | 0x00200100,
132     WCLK_AD_TIMER_19M2     = (AD_TIMER0_WCLK << 24) | 0x00200200,
133 
134     /*lp timer*/
135     WCLK_LP_TIMER_32K      = (LP_TIMER_WCLK << 24) | 0x001000000,
136     WCLK_LP_TIMER_76M8     = (LP_TIMER_WCLK << 24) | 0x001000100,
137     WCLK_LP_TIMER_19M2     = (LP_TIMER_WCLK << 24) | 0x001000200,
138 
139     /*I2S0*/
140     WCLK_I2S_19M2         = (I2S0_WCLK << 24) | 0x00100000,
141     WCLK_I2S_76M8         = (I2S0_WCLK << 24) | 0x00100100,
142     WCLK_I2S_61M44        = (I2S0_WCLK << 24) | 0x00100200,
143     /*spi nor*/
144     WCLK_SPINOR_19M2      = (SPINOR_WCLK << 24) | 0x00100000,
145     WCLK_SPINOR_76M8      = (SPINOR_WCLK << 24) | 0x00100100,
146     WCLK_SPINOR_61M44     = (SPINOR_WCLK << 24) | 0x00100200,
147 
148     /*iwdt*/
149     WCLK_IWDT_RC32K       = (IWDT_WCLK << 24) | 0x00100000,
150     WCLK_IWDT_XTAL32K     = (IWDT_WCLK << 24) | 0x00100100,
151 
152 } clk_freq_sel;
153 
154 /**
155   \brief       set software clock gate.
156   \param[in]   name  the clock name to set.
157   \param[in]   ctrl 0 enable; 1 disable
158   \return      error code
159  */
160 int csi_clk_sw_gate_ctrl(clk_name name, uint32_t ctrl);
161 
162 /**
163   \brief       set clock autogate.
164   \param[in]   name  the clock name to set.
165   \param[in]   ctrl 0 enable; 1 disable
166   \return      error code
167  */
168 int csi_clk_hw_gate_ctrl(clk_name name, uint32_t ctrl);
169 
170 /**
171   \brief       config clock reset ctrl.
172   \param[in]   name  the clock name to set.
173   \param[in]   ctrl 0 enable; 1 disable
174   \return      error code
175  */
176 int csi_clk_reset(clk_name name, uint32_t ctrl);
177 
178 /**
179   \brief       set clock freq.
180   \param[in]   name  the clock name to set.
181   \param[in]   freq  teh corresponding freq to set
182   \return      error code
183  */
184 int csi_clk_set_freq(clk_name name, clk_freq_sel freq);
185 
186 
187 #ifdef __cplusplus
188 }
189 #endif
190 
191 #endif /* _CSI_CLK_H_ */
192