xref: /freebsd-12.1/sys/arm/allwinner/clkng/ccu_a31.c (revision 8c86cbf0)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2017,2018 Emmanuel Vadot <[email protected]>
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
20  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
22  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  *
27  * $FreeBSD$
28  */
29 
30 #include <sys/cdefs.h>
31 __FBSDID("$FreeBSD$");
32 
33 #include <sys/param.h>
34 #include <sys/systm.h>
35 #include <sys/bus.h>
36 #include <sys/rman.h>
37 #include <sys/kernel.h>
38 #include <sys/module.h>
39 #include <machine/bus.h>
40 
41 #include <dev/fdt/simplebus.h>
42 
43 #include <dev/ofw/ofw_bus.h>
44 #include <dev/ofw/ofw_bus_subr.h>
45 
46 #include <dev/extres/clk/clk_div.h>
47 #include <dev/extres/clk/clk_fixed.h>
48 #include <dev/extres/clk/clk_mux.h>
49 
50 #include <arm/allwinner/clkng/aw_ccung.h>
51 
52 #include <dt-bindings/clock/sun6i-a31-ccu.h>
53 #include <dt-bindings/reset/sun6i-a31-ccu.h>
54 
55 /* Non-exported clocks */
56 #define	CLK_PLL_CPU			0
57 #define	CLK_PLL_AUDIO_BASE		1
58 #define	CLK_PLL_AUDIO			2
59 #define	CLK_PLL_AUDIO_2X		3
60 #define	CLK_PLL_AUDIO_4X		4
61 #define	CLK_PLL_AUDIO_8X		5
62 #define	CLK_PLL_VIDEO0			6
63 #define	CLK_PLL_VIDEO0_2X		7
64 #define	CLK_PLL_VE			8
65 #define	CLK_PLL_DDR			9
66 
67 #define	CLK_PLL_PERIPH_2X		11
68 #define	CLK_PLL_VIDEO1			12
69 #define	CLK_PLL_VIDEO1_2X		13
70 #define	CLK_PLL_GPU			14
71 #define	CLK_PLL_MIPI			15
72 #define	CLK_PLL9			16
73 #define	CLK_PLL10			17
74 
75 #define	CLK_AXI				19
76 #define	CLK_AHB1			20
77 #define	CLK_APB1			21
78 #define	CLK_APB2			22
79 
80 #define	CLK_MDFS			107
81 #define	CLK_SDRAM0			108
82 #define	CLK_SDRAM1			109
83 
84 #define	CLK_MBUS0			141
85 #define	CLK_MBUS1			142
86 
87 static struct aw_ccung_reset a31_ccu_resets[] = {
88 	CCU_RESET(RST_USB_PHY0, 0xcc, 0)
89 	CCU_RESET(RST_USB_PHY1, 0xcc, 1)
90 	CCU_RESET(RST_USB_PHY2, 0xcc, 2)
91 
92 	CCU_RESET(RST_AHB1_MIPI_DSI, 0x2c0, 1)
93 	CCU_RESET(RST_AHB1_SS, 0x2c0, 5)
94 	CCU_RESET(RST_AHB1_DMA, 0x2c0, 6)
95 	CCU_RESET(RST_AHB1_MMC0, 0x2c0, 8)
96 	CCU_RESET(RST_AHB1_MMC1, 0x2c0, 9)
97 	CCU_RESET(RST_AHB1_MMC2, 0x2c0, 10)
98 	CCU_RESET(RST_AHB1_MMC3, 0x2c0, 11)
99 	CCU_RESET(RST_AHB1_NAND1, 0x2c0, 12)
100 	CCU_RESET(RST_AHB1_NAND0, 0x2c0, 13)
101 	CCU_RESET(RST_AHB1_SDRAM, 0x2c0, 14)
102 	CCU_RESET(RST_AHB1_EMAC, 0x2c0, 17)
103 	CCU_RESET(RST_AHB1_TS, 0x2c0, 18)
104 	CCU_RESET(RST_AHB1_HSTIMER, 0x2c0, 19)
105 	CCU_RESET(RST_AHB1_SPI0, 0x2c0, 20)
106 	CCU_RESET(RST_AHB1_SPI1, 0x2c0, 21)
107 	CCU_RESET(RST_AHB1_SPI2, 0x2c0, 22)
108 	CCU_RESET(RST_AHB1_SPI3, 0x2c0, 23)
109 	CCU_RESET(RST_AHB1_OTG, 0x2c0, 24)
110 	CCU_RESET(RST_AHB1_EHCI0, 0x2c0, 26)
111 	CCU_RESET(RST_AHB1_EHCI1, 0x2c0, 27)
112 	CCU_RESET(RST_AHB1_OHCI0, 0x2c0, 29)
113 	CCU_RESET(RST_AHB1_OHCI1, 0x2c0, 30)
114 	CCU_RESET(RST_AHB1_OHCI2, 0x2c0, 31)
115 
116 	CCU_RESET(RST_AHB1_VE, 0x2c4, 0)
117 	CCU_RESET(RST_AHB1_LCD0, 0x2c4, 4)
118 	CCU_RESET(RST_AHB1_LCD1, 0x2c4, 5)
119 	CCU_RESET(RST_AHB1_CSI, 0x2c4, 8)
120 	CCU_RESET(RST_AHB1_HDMI, 0x2c4, 11)
121 	CCU_RESET(RST_AHB1_BE0, 0x2c4, 12)
122 	CCU_RESET(RST_AHB1_BE1, 0x2c4, 13)
123 	CCU_RESET(RST_AHB1_FE0, 0x2c4, 14)
124 	CCU_RESET(RST_AHB1_FE1, 0x2c4, 15)
125 	CCU_RESET(RST_AHB1_MP, 0x2c4, 18)
126 	CCU_RESET(RST_AHB1_GPU, 0x2c4, 20)
127 	CCU_RESET(RST_AHB1_DEU0, 0x2c4, 23)
128 	CCU_RESET(RST_AHB1_DEU1, 0x2c4, 24)
129 	CCU_RESET(RST_AHB1_DRC0, 0x2c4, 25)
130 	CCU_RESET(RST_AHB1_DRC1, 0x2c4, 26)
131 
132 	CCU_RESET(RST_AHB1_LVDS, 0x2c8, 0)
133 
134 	CCU_RESET(RST_APB1_CODEC, 0x2d0, 0)
135 	CCU_RESET(RST_APB1_SPDIF, 0x2d0, 1)
136 	CCU_RESET(RST_APB1_DIGITAL_MIC, 0x2d0, 4)
137 	CCU_RESET(RST_APB1_DAUDIO0, 0x2d0, 12)
138 	CCU_RESET(RST_APB1_DAUDIO1, 0x2d0, 13)
139 
140 	CCU_RESET(RST_APB2_I2C0, 0x2d8, 0)
141 	CCU_RESET(RST_APB2_I2C1, 0x2d8, 1)
142 	CCU_RESET(RST_APB2_I2C2, 0x2d8, 2)
143 	CCU_RESET(RST_APB2_I2C3, 0x2d8, 3)
144 	CCU_RESET(RST_APB2_UART0, 0x2d8, 16)
145 	CCU_RESET(RST_APB2_UART1, 0x2d8, 17)
146 	CCU_RESET(RST_APB2_UART2, 0x2d8, 18)
147 	CCU_RESET(RST_APB2_UART3, 0x2d8, 19)
148 	CCU_RESET(RST_APB2_UART4, 0x2d8, 20)
149 	CCU_RESET(RST_APB2_UART5, 0x2d8, 21)
150 };
151 
152 static struct aw_ccung_gate a31_ccu_gates[] = {
153 	CCU_GATE(CLK_AHB1_MIPIDSI, "ahb1-mipidsi", "ahb1", 0x60, 1)
154 	CCU_GATE(CLK_AHB1_SS, "ahb1-ss", "ahb1", 0x60, 5)
155 	CCU_GATE(CLK_AHB1_DMA, "ahb1-dma", "ahb1", 0x60, 6)
156 	CCU_GATE(CLK_AHB1_MMC0, "ahb1-mmc0", "ahb1", 0x60, 8)
157 	CCU_GATE(CLK_AHB1_MMC1, "ahb1-mmc1", "ahb1", 0x60, 9)
158 	CCU_GATE(CLK_AHB1_MMC2, "ahb1-mmc2", "ahb1", 0x60, 10)
159 	CCU_GATE(CLK_AHB1_MMC3, "ahb1-mmc3", "ahb1", 0x60, 11)
160 	CCU_GATE(CLK_AHB1_NAND1, "ahb1-nand1", "ahb1", 0x60, 12)
161 	CCU_GATE(CLK_AHB1_NAND0, "ahb1-nand0", "ahb1", 0x60, 13)
162 	CCU_GATE(CLK_AHB1_SDRAM, "ahb1-sdram", "ahb1", 0x60, 14)
163 	CCU_GATE(CLK_AHB1_EMAC, "ahb1-emac", "ahb1", 0x60, 17)
164 	CCU_GATE(CLK_AHB1_TS, "ahb1-ts", "ahb1", 0x60, 18)
165 	CCU_GATE(CLK_AHB1_HSTIMER, "ahb1-hstimer", "ahb1", 0x60, 19)
166 	CCU_GATE(CLK_AHB1_SPI0, "ahb1-spi0", "ahb1", 0x60, 20)
167 	CCU_GATE(CLK_AHB1_SPI1, "ahb1-spi1", "ahb1", 0x60, 21)
168 	CCU_GATE(CLK_AHB1_SPI2, "ahb1-spi2", "ahb1", 0x60, 22)
169 	CCU_GATE(CLK_AHB1_SPI3, "ahb1-spi3", "ahb1", 0x60, 23)
170 	CCU_GATE(CLK_AHB1_OTG, "ahb1-otg", "ahb1", 0x60, 24)
171 	CCU_GATE(CLK_AHB1_EHCI0, "ahb1-ehci0", "ahb1", 0x60, 26)
172 	CCU_GATE(CLK_AHB1_EHCI1, "ahb1-ehci1", "ahb1", 0x60, 27)
173 	CCU_GATE(CLK_AHB1_OHCI0, "ahb1-ohci0", "ahb1", 0x60, 29)
174 	CCU_GATE(CLK_AHB1_OHCI1, "ahb1-ohci1", "ahb1", 0x60, 30)
175 	CCU_GATE(CLK_AHB1_OHCI2, "ahb1-ohci2", "ahb1", 0x60, 31)
176 	CCU_GATE(CLK_AHB1_VE, "ahb1-ve", "ahb1", 0x64, 0)
177 	CCU_GATE(CLK_AHB1_LCD0, "ahb1-lcd0", "ahb1", 0x64, 4)
178 	CCU_GATE(CLK_AHB1_LCD1, "ahb1-lcd1", "ahb1", 0x64, 5)
179 	CCU_GATE(CLK_AHB1_CSI, "ahb1-csi", "ahb1", 0x64, 8)
180 	CCU_GATE(CLK_AHB1_HDMI, "ahb1-hdmi", "ahb1", 0x64, 11)
181 	CCU_GATE(CLK_AHB1_BE0, "ahb1-be0", "ahb1", 0x64, 12)
182 	CCU_GATE(CLK_AHB1_BE1, "ahb1-be1", "ahb1", 0x64, 13)
183 	CCU_GATE(CLK_AHB1_FE0, "ahb1-fe0", "ahb1", 0x64, 14)
184 	CCU_GATE(CLK_AHB1_FE1, "ahb1-fe1", "ahb1", 0x64, 15)
185 	CCU_GATE(CLK_AHB1_MP, "ahb1-mp", "ahb1", 0x64, 18)
186 	CCU_GATE(CLK_AHB1_GPU, "ahb1-gpu", "ahb1", 0x64, 20)
187 	CCU_GATE(CLK_AHB1_DEU0, "ahb1-deu0", "ahb1", 0x64, 23)
188 	CCU_GATE(CLK_AHB1_DEU1, "ahb1-deu1", "ahb1", 0x64, 24)
189 	CCU_GATE(CLK_AHB1_DRC0, "ahb1-drc0", "ahb1", 0x64, 25)
190 	CCU_GATE(CLK_AHB1_DRC1, "ahb1-drc1", "ahb1", 0x64, 26)
191 
192 	CCU_GATE(CLK_APB1_CODEC, "apb1-codec", "apb1", 0x68, 0)
193 	CCU_GATE(CLK_APB1_SPDIF, "apb1-spdif", "apb1", 0x68, 1)
194 	CCU_GATE(CLK_APB1_DIGITAL_MIC, "apb1-digital-mic", "apb1", 0x68, 4)
195 	CCU_GATE(CLK_APB1_PIO, "apb1-pio", "apb1", 0x68, 5)
196 	CCU_GATE(CLK_APB1_DAUDIO0, "apb1-daudio0", "apb1", 0x68, 12)
197 	CCU_GATE(CLK_APB1_DAUDIO1, "apb1-daudio1", "apb1", 0x68, 13)
198 
199 	CCU_GATE(CLK_APB2_I2C0, "apb2-i2c0", "apb2", 0x6c, 0)
200 	CCU_GATE(CLK_APB2_I2C1, "apb2-i2c1", "apb2", 0x6c, 1)
201 	CCU_GATE(CLK_APB2_I2C2, "apb2-i2c2", "apb2", 0x6c, 2)
202 	CCU_GATE(CLK_APB2_I2C3, "apb2-i2c3", "apb2", 0x6c, 3)
203 	CCU_GATE(CLK_APB2_UART0, "apb2-uart0", "apb2", 0x6c, 16)
204 	CCU_GATE(CLK_APB2_UART1, "apb2-uart1", "apb2", 0x6c, 17)
205 	CCU_GATE(CLK_APB2_UART2, "apb2-uart2", "apb2", 0x6c, 18)
206 	CCU_GATE(CLK_APB2_UART3, "apb2-uart3", "apb2", 0x6c, 19)
207 	CCU_GATE(CLK_APB2_UART4, "apb2-uart4", "apb2", 0x6c, 20)
208 	CCU_GATE(CLK_APB2_UART5, "apb2-uart5", "apb2", 0x6c, 21)
209 
210 	CCU_GATE(CLK_DAUDIO0, "daudio0", "daudio0mux", 0xb0, 31)
211 	CCU_GATE(CLK_DAUDIO1, "daudio1", "daudio1mux", 0xb4, 31)
212 
213 	CCU_GATE(CLK_USB_PHY0, "usb-phy0", "osc24M", 0xcc, 8)
214 	CCU_GATE(CLK_USB_PHY1, "usb-phy1", "osc24M", 0xcc, 9)
215 	CCU_GATE(CLK_USB_PHY2, "usb-phy2", "osc24M", 0xcc, 10)
216 	CCU_GATE(CLK_USB_OHCI0, "usb-ohci0", "osc24M", 0xcc, 16)
217 	CCU_GATE(CLK_USB_OHCI1, "usb-ohci1", "osc24M", 0xcc, 17)
218 	CCU_GATE(CLK_USB_OHCI2, "usb-ohci2", "osc24M", 0xcc, 18)
219 
220 	CCU_GATE(CLK_DRAM_VE, "dram-ve", "mdfs", 0x100, 0)
221 	CCU_GATE(CLK_DRAM_CSI_ISP, "dram-csi_isp", "mdfs", 0x100, 1)
222 	CCU_GATE(CLK_DRAM_TS, "dram-ts", "mdfs", 0x100, 3)
223 	CCU_GATE(CLK_DRAM_DRC0, "dram-drc0", "mdfs", 0x100, 16)
224 	CCU_GATE(CLK_DRAM_DRC1, "dram-drc1", "mdfs", 0x100, 17)
225 	CCU_GATE(CLK_DRAM_DEU0, "dram-deu0", "mdfs", 0x100, 18)
226 	CCU_GATE(CLK_DRAM_DEU1, "dram-deu1", "mdfs", 0x100, 19)
227 	CCU_GATE(CLK_DRAM_FE0, "dram-fe0", "mdfs", 0x100, 24)
228 	CCU_GATE(CLK_DRAM_FE1, "dram-fe1", "mdfs", 0x100, 25)
229 	CCU_GATE(CLK_DRAM_BE0, "dram-be0", "mdfs", 0x100, 26)
230 	CCU_GATE(CLK_DRAM_BE1, "dram-be1", "mdfs", 0x100, 27)
231 	CCU_GATE(CLK_DRAM_MP, "dram-mp", "mdfs", 0x100, 28)
232 
233 	CCU_GATE(CLK_CODEC, "codec", "pll_audio", 0x140, 31)
234 
235 	CCU_GATE(CLK_AVS, "avs", "pll_audio", 0x144, 31)
236 
237 	CCU_GATE(CLK_DIGITAL_MIC, "digital-mic", "pll_audio", 0x148, 31)
238 
239 	CCU_GATE(CLK_HDMI_DDC, "hdmi-ddc", "osc24M", 0x150, 30)
240 
241 	CCU_GATE(CLK_PS, "ps", "lcd1_ch1", 0x154, 31)
242 };
243 
244 static const char *pll_parents[] = {"osc24M"};
245 
246 NKMP_CLK(pll_cpu_clk,
247     CLK_PLL_CPU,			/* id */
248     "pll_cpu", pll_parents,			/* name, parents */
249     0x00,					/* offset */
250     8, 5, 0, 0,					/* n factor */
251     4, 2, 0, 0,					/* k factor */
252     0, 2, 0, 0,					/* m factor */
253     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* p factor (fake) */
254     31,						/* gate */
255     28, 1000,					/* lock */
256     AW_CLK_HAS_GATE | AW_CLK_HAS_LOCK | AW_CLK_SCALE_CHANGE);		/* flags */
257 
258 NKMP_CLK(pll_audio_clk,
259     CLK_PLL_AUDIO,			/* id */
260     "pll_audio", pll_parents,		/* name, parents */
261     0x08,					/* offset */
262     8, 7, 0, 0,					/* n factor */
263     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* k factor (fake) */
264     0, 4, 1, 0,					/* m factor */
265     16, 3, 1, 0,				/* p factor */
266     31,						/* gate */
267     28, 1000,					/* lock */
268     AW_CLK_HAS_GATE | AW_CLK_HAS_LOCK);		/* flags */
269 
270 static const char *pll_audio_mult_parents[] = {"pll_audio"};
271 FIXED_CLK(pll_audio_2x_clk,
272     CLK_PLL_AUDIO_2X,		/* id */
273     "pll_audio-2x",			/* name */
274     pll_audio_mult_parents,		/* parent */
275     0,					/* freq */
276     2,					/* mult */
277     1,					/* div */
278     0);					/* flags */
279 FIXED_CLK(pll_audio_4x_clk,
280     CLK_PLL_AUDIO_4X,		/* id */
281     "pll_audio-4x",			/* name */
282     pll_audio_mult_parents,		/* parent */
283     0,					/* freq */
284     4,					/* mult */
285     1,					/* div */
286     0);					/* flags */
287 FIXED_CLK(pll_audio_8x_clk,
288     CLK_PLL_AUDIO_8X,		/* id */
289     "pll_audio-8x",			/* name */
290     pll_audio_mult_parents,		/* parent */
291     0,					/* freq */
292     8,					/* mult */
293     1,					/* div */
294     0);					/* flags */
295 
296 FRAC_CLK(pll_video0_clk,
297     CLK_PLL_VIDEO0,				/* id */
298     "pll_video0", pll_parents,		/* name, parents */
299     0x10,					/* offset */
300     8, 7, 0, 0,					/* n factor */
301     0, 4, 0, 0,					/* m factor */
302     31, 28, 1000,				/* gate, lock, lock retries */
303     AW_CLK_HAS_LOCK,				/* flags */
304     270000000, 297000000,			/* freq0, freq1 */
305     24, 25);					/* mode sel, freq sel */
306 
307 static const char *pll_video0_2x_parents[] = {"pll_video0"};
308 FIXED_CLK(pll_video0_2x_clk,
309     CLK_PLL_VIDEO0_2X,		/* id */
310     "pll_video0-2x",			/* name */
311     pll_video0_2x_parents,		/* parent */
312     0,					/* freq */
313     2,					/* mult */
314     1,					/* div */
315     0);					/* flags */
316 
317 FRAC_CLK(pll_ve_clk,
318     CLK_PLL_VE,				/* id */
319     "pll_ve", pll_parents,			/* name, parents */
320     0x18,					/* offset */
321     8, 7, 0, 0,					/* n factor */
322     0, 4, 0, 0,					/* m factor */
323     31, 28, 1000,				/* gate, lock, lock retries */
324     AW_CLK_HAS_LOCK,				/* flags */
325     270000000, 297000000,			/* freq0, freq1 */
326     24, 25);					/* mode sel, freq sel */
327 
328 NKMP_CLK_WITH_UPDATE(pll_ddr_clk,
329     CLK_PLL_DDR,				/* id */
330     "pll_ddr", pll_parents,			/* name, parents */
331     0x20,					/* offset */
332     8, 5, 0, 0,					/* n factor */
333     4, 2, 0, 0,					/* k factor */
334     0, 2, 0, 0,					/* m factor */
335     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* p factor (fake) */
336     31,						/* gate */
337     28, 1000,					/* lock */
338     20,						/* update */
339     AW_CLK_HAS_GATE | AW_CLK_HAS_LOCK);		/* flags */
340 
341 NKMP_CLK(pll_periph_clk,
342     CLK_PLL_PERIPH,			/* id */
343     "pll_periph", pll_parents,		/* name, parents */
344     0x28,					/* offset */
345     8, 4, 0, 0,					/* n factor */
346     5, 2, 1, 0,					/* k factor */
347     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* m factor (fake) */
348     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* p factor (fake) */
349     31,						/* gate */
350     28, 1000,					/* lock */
351     AW_CLK_HAS_GATE | AW_CLK_HAS_LOCK);		/* flags */
352 
353 static const char *pll_periph_2x_parents[] = {"pll_periph"};
354 FIXED_CLK(pll_periph_2x_clk,
355     CLK_PLL_PERIPH_2X,	/* id */
356     "pll_periph-2x",			/* name */
357     pll_periph_2x_parents,		/* parent */
358     0,					/* freq */
359     2,					/* mult */
360     1,					/* div */
361     0);					/* flags */
362 
363 FRAC_CLK(pll_video1_clk,
364     CLK_PLL_VIDEO1,				/* id */
365     "pll_video1", pll_parents,		/* name, parents */
366     0x30,					/* offset */
367     8, 7, 0, 0,					/* n factor */
368     0, 4, 0, 0,					/* m factor */
369     31, 28, 1000,				/* gate, lock, lock retries */
370     AW_CLK_HAS_LOCK,				/* flags */
371     270000000, 297000000,			/* freq0, freq1 */
372     24, 25);					/* mode sel, freq sel */
373 
374 static const char *pll_video1_2x_parents[] = {"pll_video1"};
375 FIXED_CLK(pll_video1_2x_clk,
376     CLK_PLL_VIDEO1_2X,		/* id */
377     "pll_video1-2x",			/* name */
378     pll_video1_2x_parents,		/* parent */
379     0,					/* freq */
380     2,					/* mult */
381     1,					/* div */
382     0);					/* flags */
383 
384 FRAC_CLK(pll_gpu_clk,
385     CLK_PLL_GPU,				/* id */
386     "pll_gpu", pll_parents,		/* name, parents */
387     0x38,					/* offset */
388     8, 7, 0, 0,					/* n factor */
389     0, 4, 0, 0,					/* m factor */
390     31, 28, 1000,				/* gate, lock, lock retries */
391     AW_CLK_HAS_LOCK,				/* flags */
392     270000000, 297000000,			/* freq0, freq1 */
393     24, 25);					/* mode sel, freq sel */
394 
395 static const char *pll_mipi_parents[] = {"pll_video0", "pll_video1"};
396 NKMP_CLK(pll_mipi_clk,
397     CLK_PLL_MIPI,			/* id */
398     "pll_mipi", pll_mipi_parents,		/* name, parents */
399     0x40,					/* offset */
400     8, 4, 0, 0,					/* n factor */
401     4, 2, 1, 0,					/* k factor */
402     0, 2, 0, 0,					/* m factor (fake) */
403     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* p factor (fake) */
404     31,						/* gate */
405     28, 1000,					/* lock */
406     AW_CLK_HAS_GATE | AW_CLK_HAS_LOCK);		/* flags */
407 
408 FRAC_CLK(pll9_clk,
409     CLK_PLL9,				/* id */
410     "pll9", pll_parents,		/* name, parents */
411     0x44,					/* offset */
412     8, 7, 0, 0,					/* n factor */
413     0, 4, 0, 0,					/* m factor */
414     31, 28, 1000,				/* gate, lock, lock retries */
415     AW_CLK_HAS_LOCK,				/* flags */
416     270000000, 297000000,			/* freq0, freq1 */
417     24, 25);					/* mode sel, freq sel */
418 
419 FRAC_CLK(pll10_clk,
420     CLK_PLL10,				/* id */
421     "pll10", pll_parents,		/* name, parents */
422     0x48,					/* offset */
423     8, 7, 0, 0,					/* n factor */
424     0, 4, 0, 0,					/* m factor */
425     31, 28, 1000,				/* gate, lock, lock retries */
426     AW_CLK_HAS_LOCK,				/* flags */
427     270000000, 297000000,			/* freq0, freq1 */
428     24, 25);					/* mode sel, freq sel */
429 
430 static struct clk_div_table axi_div_table[] = {
431 	{ .value = 0, .divider = 1, },
432 	{ .value = 1, .divider = 2, },
433 	{ .value = 2, .divider = 3, },
434 	{ .value = 3, .divider = 4, },
435 	{ .value = 4, .divider = 4, },
436 	{ .value = 5, .divider = 4, },
437 	{ .value = 6, .divider = 4, },
438 	{ .value = 7, .divider = 4, },
439 	{ },
440 };
441 static const char *axi_parents[] = {"cpu"};
442 DIV_CLK(axi_clk,
443     CLK_AXI,		/* id */
444     "axi", axi_parents,		/* name, parents */
445     0x50,			/* offset */
446     0, 2,			/* shift, mask */
447     0, axi_div_table);		/* flags, div table */
448 
449 static const char *cpu_parents[] = {"osc32k", "osc24M", "pll_cpu", "pll_cpu"};
450 MUX_CLK(cpu_clk,
451     CLK_CPU,		/* id */
452     "cpu", cpu_parents,		/* name, parents */
453     0x50, 16, 2);		/* offset, shift, width */
454 
455 static const char *ahb1_parents[] = {"osc32k", "osc24M", "axi", "pll_periph"};
456 PREDIV_CLK(ahb1_clk,
457     CLK_AHB1,					/* id */
458     "ahb1", ahb1_parents,					/* name, parents */
459     0x54,							/* offset */
460     12, 2,							/* mux */
461     4, 2, 0, AW_CLK_FACTOR_POWER_OF_TWO,			/* div */
462     6, 2, 0, AW_CLK_FACTOR_HAS_COND,				/* prediv */
463     12, 2, 3);							/* prediv condition */
464 
465 static const char *apb1_parents[] = {"ahb1"};
466 static struct clk_div_table apb1_div_table[] = {
467 	{ .value = 0, .divider = 2, },
468 	{ .value = 1, .divider = 2, },
469 	{ .value = 2, .divider = 4, },
470 	{ .value = 3, .divider = 8, },
471 	{ },
472 };
473 DIV_CLK(apb1_clk,
474     CLK_APB1,		/* id */
475     "apb1", apb1_parents,	/* name, parents */
476     0x54,			/* offset */
477     8, 2,			/* shift, mask */
478     CLK_DIV_WITH_TABLE,		/* flags */
479     apb1_div_table);		/* div table */
480 
481 static const char *apb2_parents[] = {"osc32k", "osc24M", "pll_periph", "pll_periph"};
482 NM_CLK(apb2_clk,
483     CLK_APB2,				/* id */
484     "apb2", apb2_parents,			/* name, parents */
485     0x58,					/* offset */
486     16, 2, 0, AW_CLK_FACTOR_POWER_OF_TWO,	/* n factor */
487     0, 5, 0, 0,					/* m factor */
488     24, 2,					/* mux */
489     0,						/* gate */
490     AW_CLK_HAS_MUX);
491 
492 static const char *mod_parents[] = {"osc24M", "pll_periph"};
493 NM_CLK(nand0_clk,
494     CLK_NAND0, "nand0", mod_parents,	/* id, name, parents */
495     0x80,					/* offset */
496     16, 3, 0, AW_CLK_FACTOR_POWER_OF_TWO,	/* n factor */
497     0, 4, 0, 0,					/* m factor */
498     24, 2,					/* mux */
499     31,						/* gate */
500     AW_CLK_HAS_GATE | AW_CLK_HAS_MUX);		/* flags */
501 
502 NM_CLK(nand1_clk,
503     CLK_NAND1, "nand1", mod_parents,	/* id, name, parents */
504     0x80,					/* offset */
505     16, 3, 0, AW_CLK_FACTOR_POWER_OF_TWO,	/* n factor */
506     0, 4, 0, 0,					/* m factor */
507     24, 2,					/* mux */
508     31,						/* gate */
509     AW_CLK_HAS_GATE | AW_CLK_HAS_MUX);		/* flags */
510 
511 NM_CLK(mmc0_clk,
512     CLK_MMC0, "mmc0", mod_parents,	/* id, name, parents */
513     0x88,					/* offset */
514     16, 2, 0, AW_CLK_FACTOR_POWER_OF_TWO,	/* n factor */
515     0, 4, 0, 0,					/* m factor */
516     24, 2,					/* mux */
517     31,						/* gate */
518     AW_CLK_HAS_GATE | AW_CLK_HAS_MUX |
519     AW_CLK_REPARENT);				/* flags */
520 
521 NM_CLK(mmc1_clk,
522     CLK_MMC1, "mmc1", mod_parents,	/* id, name, parents */
523     0x8c,					/* offset */
524     16, 2, 0, AW_CLK_FACTOR_POWER_OF_TWO,	/* n factor */
525     0, 4, 0, 0,					/* m factor */
526     24, 2,					/* mux */
527     31,						/* gate */
528     AW_CLK_HAS_GATE | AW_CLK_HAS_MUX |
529     AW_CLK_REPARENT);				/* flags */
530 
531 NM_CLK(mmc2_clk,
532     CLK_MMC2, "mmc2", mod_parents,	/* id, name, parents */
533     0x90,					/* offset */
534     16, 2, 0, AW_CLK_FACTOR_POWER_OF_TWO,	/* n factor */
535     0, 4, 0, 0,					/* m factor */
536     24, 2,					/* mux */
537     31,						/* gate */
538     AW_CLK_HAS_GATE | AW_CLK_HAS_MUX |
539     AW_CLK_REPARENT);				/* flags */
540 
541 NM_CLK(mmc3_clk,
542     CLK_MMC2, "mmc3", mod_parents,	/* id, name, parents */
543     0x94,					/* offset */
544     16, 2, 0, AW_CLK_FACTOR_POWER_OF_TWO,	/* n factor */
545     0, 4, 0, 0,					/* m factor */
546     24, 2,					/* mux */
547     31,						/* gate */
548     AW_CLK_HAS_GATE | AW_CLK_HAS_MUX |
549     AW_CLK_REPARENT);				/* flags */
550 
551 static const char *ts_parents[] = {"osc24M", "pll_periph"};
552 NM_CLK(ts_clk,
553     CLK_TS, "ts", ts_parents,		/* id, name, parents */
554     0x98,					/* offset */
555     16, 2, 0, AW_CLK_FACTOR_POWER_OF_TWO,	/* n factor */
556     0, 4, 0, 0,					/* m factor */
557     24, 4,					/* mux */
558     31,						/* gate */
559     AW_CLK_HAS_GATE | AW_CLK_HAS_MUX);		/* flags */
560 
561 NM_CLK(ss_clk,
562     CLK_SS, "ss", mod_parents,		/* id, name, parents */
563     0x9C,					/* offset */
564     16, 2, 0, AW_CLK_FACTOR_POWER_OF_TWO,	/* n factor */
565     0, 4, 0, 0,					/* m factor */
566     24, 4,					/* mux */
567     31,						/* gate */
568     AW_CLK_HAS_GATE | AW_CLK_HAS_MUX);		/* flags */
569 
570 NM_CLK(spi0_clk,
571     CLK_SPI0, "spi0", mod_parents,	/* id, name, parents */
572     0xA0,					/* offset */
573     16, 2, 0, AW_CLK_FACTOR_POWER_OF_TWO,	/* n factor */
574     0, 4, 0, 0,					/* m factor */
575     24, 4,					/* mux */
576     31,						/* gate */
577     AW_CLK_HAS_GATE | AW_CLK_HAS_MUX);		/* flags */
578 
579 NM_CLK(spi1_clk,
580     CLK_SPI1, "spi1", mod_parents,	/* id, name, parents */
581     0xA4,					/* offset */
582     16, 2, 0, AW_CLK_FACTOR_POWER_OF_TWO,	/* n factor */
583     0, 4, 0, 0,					/* m factor */
584     24, 4,					/* mux */
585     31,						/* gate */
586     AW_CLK_HAS_GATE | AW_CLK_HAS_MUX);		/* flags */
587 
588 NM_CLK(spi2_clk,
589     CLK_SPI2, "spi2", mod_parents,	/* id, name, parents */
590     0xA8,					/* offset */
591     16, 2, 0, AW_CLK_FACTOR_POWER_OF_TWO,	/* n factor */
592     0, 4, 0, 0,					/* m factor */
593     24, 4,					/* mux */
594     31,						/* gate */
595     AW_CLK_HAS_GATE | AW_CLK_HAS_MUX);		/* flags */
596 
597 NM_CLK(spi3_clk,
598     CLK_SPI3, "spi3", mod_parents,	/* id, name, parents */
599     0xAC,					/* offset */
600     16, 2, 0, AW_CLK_FACTOR_POWER_OF_TWO,	/* n factor */
601     0, 4, 0, 0,					/* m factor */
602     24, 4,					/* mux */
603     31,						/* gate */
604     AW_CLK_HAS_GATE | AW_CLK_HAS_MUX);		/* flags */
605 
606 
607 static const char *daudio_parents[] = {"pll_audio-8x", "pll_audio-4x", "pll_audio-2x", "pll_audio"};
608 MUX_CLK(daudio0mux_clk,
609     0,
610     "daudio0mux", daudio_parents,
611     0xb0, 16, 2);
612 MUX_CLK(daudio1mux_clk,
613     0,
614     "daudio1mux", daudio_parents,
615     0xb4, 16, 2);
616 
617 static const char *mdfs_parents[] = {"pll_ddr", "pll_periph"};
618 NM_CLK(mdfs_clk,
619     CLK_MDFS, "mdfs", mdfs_parents,	/* id, name, parents */
620     0xF0,					/* offset */
621     16, 2, 0, AW_CLK_FACTOR_POWER_OF_TWO,	/* n factor */
622     0, 4, 0, 0,					/* m factor */
623     24, 4,					/* mux */
624     31,						/* gate */
625     AW_CLK_HAS_GATE | AW_CLK_HAS_MUX);		/* flags */
626 
627 static const char *dram_parents[] = {"pll_ddr", "pll_periph"};
628 NM_CLK(sdram0_clk,
629     CLK_SDRAM0, "sdram0", dram_parents,	/* id, name, parents */
630     0xF4,					/* offset */
631     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* n factor (fake) */
632     0, 4, 0, 0,					/* m factor */
633     4, 1,					/* mux */
634     0,						/* gate */
635     AW_CLK_HAS_MUX);				/* flags */
636 NM_CLK(sdram1_clk,
637     CLK_SDRAM1, "sdram1", dram_parents,	/* id, name, parents */
638     0xF4,					/* offset */
639     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* n factor (fake) */
640     8, 4, 0, 0,					/* m factor */
641     12, 1,					/* mux */
642     0,						/* gate */
643     AW_CLK_HAS_MUX);				/* flags */
644 
645 static const char *befe_parents[] = {"pll_video0", "pll_video1", "pll_periph-2x", "pll_gpu", "pll9", "pll10"};
646 NM_CLK(be0_clk,
647     CLK_BE0, "be0", befe_parents,	/* id, name, parents */
648     0x104,					/* offset */
649     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* n factor (fake) */
650     0, 4, 0, 0,					/* m factor */
651     24, 3,					/* mux */
652     31,						/* gate */
653     AW_CLK_HAS_MUX | AW_CLK_HAS_GATE);		/* flags */
654 
655 NM_CLK(be1_clk,
656     CLK_BE1, "be1", befe_parents,	/* id, name, parents */
657     0x108,					/* offset */
658     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* n factor (fake) */
659     0, 4, 0, 0,					/* m factor */
660     24, 3,					/* mux */
661     31,						/* gate */
662     AW_CLK_HAS_MUX | AW_CLK_HAS_GATE);		/* flags */
663 
664 NM_CLK(fe0_clk,
665     CLK_FE0, "fe0", befe_parents,	/* id, name, parents */
666     0x104,					/* offset */
667     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* n factor (fake) */
668     0, 4, 0, 0,					/* m factor */
669     24, 3,					/* mux */
670     31,						/* gate */
671     AW_CLK_HAS_MUX | AW_CLK_HAS_GATE);		/* flags */
672 NM_CLK(fe1_clk,
673     CLK_FE1, "fe1", befe_parents,	/* id, name, parents */
674     0x108,					/* offset */
675     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* n factor (fake) */
676     0, 4, 0, 0,					/* m factor */
677     24, 3,					/* mux */
678     31,						/* gate */
679     AW_CLK_HAS_MUX | AW_CLK_HAS_GATE);		/* flags */
680 
681 static const char *mp_parents[] = {"pll_video0", "pll_video1", "pll9", "pll10"};
682 NM_CLK(mp_clk,
683     CLK_MP, "mp", mp_parents,	/* id, name, parents */
684     0x108,					/* offset */
685     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* n factor (fake) */
686     0, 4, 0, 0,					/* m factor */
687     24, 3,					/* mux */
688     31,						/* gate */
689     AW_CLK_HAS_MUX | AW_CLK_HAS_GATE);		/* flags */
690 
691 static const char *lcd_ch0_parents[] = {"pll_video0", "pll_video1", "pll_video0-2x", "pll_video1-2x", "pll_mipi"};
692 NM_CLK(lcd0_ch0_clk,
693     CLK_LCD0_CH0, "lcd0_ch0", lcd_ch0_parents,	/* id, name, parents */
694     0x118,					/* offset */
695     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* n factor (fake) */
696     0, 0, 1, AW_CLK_FACTOR_FIXED,					/* m factor (fake )*/
697     24, 3,					/* mux */
698     31,						/* gate */
699     AW_CLK_HAS_MUX | AW_CLK_HAS_GATE);		/* flags */
700 
701 NM_CLK(lcd1_ch0_clk,
702     CLK_LCD1_CH0, "lcd1_ch0", lcd_ch0_parents,	/* id, name, parents */
703     0x11C,					/* offset */
704     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* n factor (fake) */
705     0, 0, 1, AW_CLK_FACTOR_FIXED,					/* m factor (fake )*/
706     24, 3,					/* mux */
707     31,						/* gate */
708     AW_CLK_HAS_MUX | AW_CLK_HAS_GATE);		/* flags */
709 
710 static const char *lcd_ch1_parents[] = {"pll_video0", "pll_video1", "pll_video0-2x", "pll_video1-2x"};
711 NM_CLK(lcd0_ch1_clk,
712     CLK_LCD0_CH1, "lcd0_ch1", lcd_ch1_parents,	/* id, name, parents */
713     0x12C,					/* offset */
714     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* n factor (fake) */
715     0, 4, 0, 0,					/* m factor */
716     24, 3,					/* mux */
717     31,						/* gate */
718     AW_CLK_HAS_MUX | AW_CLK_HAS_GATE);		/* flags */
719 
720 NM_CLK(lcd1_ch1_clk,
721     CLK_LCD1_CH1, "lcd1_ch1", lcd_ch1_parents,	/* id, name, parents */
722     0x130,					/* offset */
723     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* n factor (fake) */
724     0, 4, 0, 0,					/* m factor */
725     24, 3,					/* mux */
726     31,						/* gate */
727     AW_CLK_HAS_MUX | AW_CLK_HAS_GATE);		/* flags */
728 
729 /* CSI0 0x134 Need Mux table */
730 /* CSI1 0x138 Need Mux table */
731 
732 static const char *ve_parents[] = {"pll_ve"};
733 NM_CLK(ve_clk,
734     CLK_VE, "ve", ve_parents,		/* id, name, parents */
735     0x13C,					/* offset */
736     16, 3, 0, 0,				/* n factor */
737     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* m factor (fake) */
738     0, 0,					/* mux */
739     31,						/* gate */
740     AW_CLK_HAS_GATE);				/* flags */
741 
742 NM_CLK(hdmi_clk,
743     CLK_HDMI, "hdmi", lcd_ch1_parents,	/* id, name, parents */
744     0x150,					/* offset */
745     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* n factor (fake) */
746     0, 4, 0, 0,					/* m factor */
747     0, 0,					/* mux */
748     31,						/* gate */
749     AW_CLK_HAS_GATE);				/* flags */
750 
751 static const char *mbus_parents[] = {"osc24M", "pll_periph", "pll_ddr"};
752 NM_CLK(mbus0_clk,
753     CLK_MBUS0, "mbus0", mbus_parents,	/* id, name, parents */
754     0x15C,					/* offset */
755     16, 2, 0, 0,				/* n factor */
756     0, 4, 0, 0,					/* m factor */
757     24, 2,					/* mux */
758     31,						/* gate */
759     AW_CLK_HAS_MUX | AW_CLK_HAS_GATE);		/* flags */
760 
761 NM_CLK(mbus1_clk,
762     CLK_MBUS1, "mbus1", mbus_parents,	/* id, name, parents */
763     0x160,					/* offset */
764     16, 2, 0, 0,				/* n factor */
765     0, 4, 0, 0,					/* m factor */
766     24, 2,					/* mux */
767     31,						/* gate */
768     AW_CLK_HAS_MUX | AW_CLK_HAS_GATE);		/* flags */
769 
770 static const char *mipi_parents[] = {"pll_video0", "pll_video1", "pll_video0-2x", "pll_video1-2x"};
771 NM_CLK(mipi_dsi_clk,
772     CLK_MIPI_DSI, "mipi_dsi", mipi_parents,	/* id, name, parents */
773     0x168,					/* offset */
774     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* n factor (fake) */
775     16, 4, 0, 0,				/* m factor */
776     24, 2,					/* mux */
777     31,						/* gate */
778     AW_CLK_HAS_MUX | AW_CLK_HAS_GATE);		/* flags */
779 
780 NM_CLK(mipi_dsi_dphy_clk,
781     CLK_MIPI_DSI_DPHY, "mipi_dsi_dphy", mipi_parents,	/* id, name, parents */
782     0x168,					/* offset */
783     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* n factor (fake) */
784     0, 4, 0, 0,					/* m factor */
785     8, 2,					/* mux */
786     15,						/* gate */
787     AW_CLK_HAS_MUX | AW_CLK_HAS_GATE);		/* flags */
788 
789 NM_CLK(mipi_csi_dphy_clk,
790     CLK_MIPI_CSI_DPHY, "mipi_csi_dphy", mipi_parents,	/* id, name, parents */
791     0x16C,					/* offset */
792     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* n factor (fake) */
793     0, 4, 0, 0,					/* m factor */
794     8, 2,					/* mux */
795     15,						/* gate */
796     AW_CLK_HAS_MUX | AW_CLK_HAS_GATE);		/* flags */
797 
798 static const char *iep_parents[] = {"pll_video0", "pll_video1", "pll_periph-2x", "pll_gpu", "pll9", "pll10"};
799 
800 NM_CLK(iep_drc0_clk,
801     CLK_IEP_DRC0, "iep_drc0", iep_parents,	/* id, name, parents */
802     0x180,					/* offset */
803     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* n factor (fake) */
804     0, 4, 0, 0,					/* m factor */
805     24, 2,					/* mux */
806     31,						/* gate */
807     AW_CLK_HAS_MUX | AW_CLK_HAS_GATE);		/* flags */
808 
809 NM_CLK(iep_drc1_clk,
810     CLK_IEP_DRC1, "iep_drc1", iep_parents,	/* id, name, parents */
811     0x184,					/* offset */
812     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* n factor (fake) */
813     0, 4, 0, 0,					/* m factor */
814     24, 2,					/* mux */
815     31,						/* gate */
816     AW_CLK_HAS_MUX | AW_CLK_HAS_GATE);		/* flags */
817 
818 NM_CLK(iep_deu0_clk,
819     CLK_IEP_DEU0, "iep_deu0", iep_parents,	/* id, name, parents */
820     0x188,					/* offset */
821     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* n factor (fake) */
822     0, 4, 0, 0,					/* m factor */
823     24, 2,					/* mux */
824     31,						/* gate */
825     AW_CLK_HAS_MUX | AW_CLK_HAS_GATE);		/* flags */
826 
827 NM_CLK(iep_deu1_clk,
828     CLK_IEP_DEU1, "iep_deu1", iep_parents,	/* id, name, parents */
829     0x18C,					/* offset */
830     0, 0, 1, AW_CLK_FACTOR_FIXED,		/* n factor (fake) */
831     0, 4, 0, 0,					/* m factor */
832     24, 2,					/* mux */
833     31,						/* gate */
834     AW_CLK_HAS_MUX | AW_CLK_HAS_GATE);		/* flags */
835 
836 static const char *gpu_parents[] = {"pll_gpu", "pll_periph-2x", "pll_video0", "pll_video1", "pll9", "pll10"};
837 PREDIV_CLK(gpu_core_clk,
838     CLK_GPU_CORE,				/* id */
839     "gpu_core", gpu_parents,		/* name, parents */
840     0x1A0,					/* offset */
841     24, 3,					/* mux */
842     0, 3, 0, 0,					/* div */
843     0, 0, 3, AW_CLK_FACTOR_HAS_COND | AW_CLK_FACTOR_FIXED,	/* prediv */
844     24, 2, 1);					/* prediv condition */
845 
846 PREDIV_CLK(gpu_memory_clk,
847     CLK_GPU_MEMORY,				/* id */
848     "gpu_memory", gpu_parents,			/* name, parents */
849     0x1A4,					/* offset */
850     24, 3,					/* mux */
851     0, 3, 0, 0,					/* div */
852     0, 0, 3, AW_CLK_FACTOR_HAS_COND | AW_CLK_FACTOR_FIXED,	/* prediv */
853     24, 2, 1);					/* prediv condition */
854 
855 PREDIV_CLK(gpu_hyd_clk,
856     CLK_GPU_HYD,				/* id */
857     "gpu_hyd", gpu_parents,			/* name, parents */
858     0x1A8,					/* offset */
859     24, 3,					/* mux */
860     0, 3, 0, 0,					/* div */
861     0, 0, 3, AW_CLK_FACTOR_HAS_COND | AW_CLK_FACTOR_FIXED,	/* prediv */
862     24, 2, 1);					/* prediv condition */
863 
864 /* ATS 0x1B0 */
865 /* Trace 0x1B4 */
866 static struct aw_ccung_clk a31_ccu_clks[] = {
867 	{ .type = AW_CLK_NKMP, .clk.nkmp = &pll_cpu_clk},
868 	{ .type = AW_CLK_NKMP, .clk.nkmp = &pll_audio_clk},
869 	{ .type = AW_CLK_NKMP, .clk.nkmp = &pll_periph_clk},
870 	{ .type = AW_CLK_NKMP, .clk.nkmp = &pll_ddr_clk},
871 	{ .type = AW_CLK_NKMP, .clk.nkmp = &pll_mipi_clk},
872 	{ .type = AW_CLK_FRAC, .clk.frac = &pll_video0_clk},
873 	{ .type = AW_CLK_FRAC, .clk.frac = &pll_ve_clk},
874 	{ .type = AW_CLK_FRAC, .clk.frac = &pll_video1_clk},
875 	{ .type = AW_CLK_FRAC, .clk.frac = &pll_gpu_clk},
876 	{ .type = AW_CLK_FRAC, .clk.frac = &pll9_clk},
877 	{ .type = AW_CLK_FRAC, .clk.frac = &pll10_clk},
878 	{ .type = AW_CLK_NM, .clk.nm = &apb2_clk},
879 	{ .type = AW_CLK_NM, .clk.nm = &nand0_clk},
880 	{ .type = AW_CLK_NM, .clk.nm = &nand1_clk},
881 	{ .type = AW_CLK_NM, .clk.nm = &mmc0_clk},
882 	{ .type = AW_CLK_NM, .clk.nm = &mmc1_clk},
883 	{ .type = AW_CLK_NM, .clk.nm = &mmc2_clk},
884 	{ .type = AW_CLK_NM, .clk.nm = &mmc3_clk},
885 	{ .type = AW_CLK_NM, .clk.nm = &ts_clk},
886 	{ .type = AW_CLK_NM, .clk.nm = &ss_clk},
887 	{ .type = AW_CLK_NM, .clk.nm = &spi0_clk},
888 	{ .type = AW_CLK_NM, .clk.nm = &spi1_clk},
889 	{ .type = AW_CLK_NM, .clk.nm = &spi2_clk},
890 	{ .type = AW_CLK_NM, .clk.nm = &spi3_clk},
891 	{ .type = AW_CLK_NM, .clk.nm = &mdfs_clk},
892 	{ .type = AW_CLK_NM, .clk.nm = &sdram0_clk},
893 	{ .type = AW_CLK_NM, .clk.nm = &sdram1_clk},
894 	{ .type = AW_CLK_NM, .clk.nm = &be0_clk},
895 	{ .type = AW_CLK_NM, .clk.nm = &be1_clk},
896 	{ .type = AW_CLK_NM, .clk.nm = &fe0_clk},
897 	{ .type = AW_CLK_NM, .clk.nm = &fe1_clk},
898 	{ .type = AW_CLK_NM, .clk.nm = &mp_clk},
899 	{ .type = AW_CLK_NM, .clk.nm = &lcd0_ch0_clk},
900 	{ .type = AW_CLK_NM, .clk.nm = &lcd1_ch0_clk},
901 	{ .type = AW_CLK_NM, .clk.nm = &lcd0_ch1_clk},
902 	{ .type = AW_CLK_NM, .clk.nm = &lcd1_ch1_clk},
903 	{ .type = AW_CLK_NM, .clk.nm = &ve_clk},
904 	{ .type = AW_CLK_NM, .clk.nm = &hdmi_clk},
905 	{ .type = AW_CLK_NM, .clk.nm = &mbus0_clk},
906 	{ .type = AW_CLK_NM, .clk.nm = &mbus1_clk},
907 	{ .type = AW_CLK_NM, .clk.nm = &mipi_dsi_clk},
908 	{ .type = AW_CLK_NM, .clk.nm = &mipi_dsi_dphy_clk},
909 	{ .type = AW_CLK_NM, .clk.nm = &mipi_csi_dphy_clk},
910 	{ .type = AW_CLK_NM, .clk.nm = &iep_drc0_clk},
911 	{ .type = AW_CLK_NM, .clk.nm = &iep_drc1_clk},
912 	{ .type = AW_CLK_NM, .clk.nm = &iep_deu0_clk},
913 	{ .type = AW_CLK_NM, .clk.nm = &iep_deu1_clk},
914 	{ .type = AW_CLK_PREDIV_MUX, .clk.prediv_mux = &ahb1_clk},
915 	{ .type = AW_CLK_PREDIV_MUX, .clk.prediv_mux = &gpu_core_clk},
916 	{ .type = AW_CLK_PREDIV_MUX, .clk.prediv_mux = &gpu_memory_clk},
917 	{ .type = AW_CLK_PREDIV_MUX, .clk.prediv_mux = &gpu_hyd_clk},
918 	{ .type = AW_CLK_DIV, .clk.div = &axi_clk},
919 	{ .type = AW_CLK_DIV, .clk.div = &apb1_clk},
920 	{ .type = AW_CLK_MUX, .clk.mux = &cpu_clk},
921 	{ .type = AW_CLK_MUX, .clk.mux = &daudio0mux_clk},
922 	{ .type = AW_CLK_MUX, .clk.mux = &daudio1mux_clk},
923 	{ .type = AW_CLK_FIXED, .clk.fixed = &pll_audio_2x_clk},
924 	{ .type = AW_CLK_FIXED, .clk.fixed = &pll_audio_4x_clk},
925 	{ .type = AW_CLK_FIXED, .clk.fixed = &pll_audio_8x_clk},
926 	{ .type = AW_CLK_FIXED, .clk.fixed = &pll_video0_2x_clk},
927 	{ .type = AW_CLK_FIXED, .clk.fixed = &pll_periph_2x_clk},
928 	{ .type = AW_CLK_FIXED, .clk.fixed = &pll_video1_2x_clk},
929 };
930 
931 static int
ccu_a31_probe(device_t dev)932 ccu_a31_probe(device_t dev)
933 {
934 
935 	if (!ofw_bus_status_okay(dev))
936 		return (ENXIO);
937 
938 	if (!ofw_bus_is_compatible(dev, "allwinner,sun6i-a31-ccu"))
939 		return (ENXIO);
940 
941 	device_set_desc(dev, "Allwinner A31 Clock Control Unit NG");
942 	return (BUS_PROBE_DEFAULT);
943 }
944 
945 static int
ccu_a31_attach(device_t dev)946 ccu_a31_attach(device_t dev)
947 {
948 	struct aw_ccung_softc *sc;
949 
950 	sc = device_get_softc(dev);
951 
952 	sc->resets = a31_ccu_resets;
953 	sc->nresets = nitems(a31_ccu_resets);
954 	sc->gates = a31_ccu_gates;
955 	sc->ngates = nitems(a31_ccu_gates);
956 	sc->clks = a31_ccu_clks;
957 	sc->nclks = nitems(a31_ccu_clks);
958 
959 	return (aw_ccung_attach(dev));
960 }
961 
962 static device_method_t ccu_a31ng_methods[] = {
963 	/* Device interface */
964 	DEVMETHOD(device_probe,		ccu_a31_probe),
965 	DEVMETHOD(device_attach,	ccu_a31_attach),
966 
967 	DEVMETHOD_END
968 };
969 
970 static devclass_t ccu_a31ng_devclass;
971 
972 DEFINE_CLASS_1(ccu_a31ng, ccu_a31ng_driver, ccu_a31ng_methods,
973   sizeof(struct aw_ccung_softc), aw_ccung_driver);
974 
975 EARLY_DRIVER_MODULE(ccu_a31ng, simplebus, ccu_a31ng_driver,
976     ccu_a31ng_devclass, 0, 0, BUS_PASS_BUS + BUS_PASS_ORDER_LAST);
977