1*1d53811aSriastradh /* $NetBSD: sun8i_h3_ccu.c,v 1.18 2021/04/24 13:01:35 riastradh Exp $ */
2a07e90f3Sjmcneill
3a07e90f3Sjmcneill /*-
4a07e90f3Sjmcneill * Copyright (c) 2017 Jared McNeill <jmcneill@invisible.ca>
5a07e90f3Sjmcneill * Copyright (c) 2017 Emmanuel Vadot <manu@freebsd.org>
6a07e90f3Sjmcneill * All rights reserved.
7a07e90f3Sjmcneill *
8a07e90f3Sjmcneill * Redistribution and use in source and binary forms, with or without
9a07e90f3Sjmcneill * modification, are permitted provided that the following conditions
10a07e90f3Sjmcneill * are met:
11a07e90f3Sjmcneill * 1. Redistributions of source code must retain the above copyright
12a07e90f3Sjmcneill * notice, this list of conditions and the following disclaimer.
13a07e90f3Sjmcneill * 2. Redistributions in binary form must reproduce the above copyright
14a07e90f3Sjmcneill * notice, this list of conditions and the following disclaimer in the
15a07e90f3Sjmcneill * documentation and/or other materials provided with the distribution.
16a07e90f3Sjmcneill *
17a07e90f3Sjmcneill * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18a07e90f3Sjmcneill * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19a07e90f3Sjmcneill * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20a07e90f3Sjmcneill * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21a07e90f3Sjmcneill * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
22a07e90f3Sjmcneill * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23a07e90f3Sjmcneill * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24a07e90f3Sjmcneill * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25a07e90f3Sjmcneill * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26a07e90f3Sjmcneill * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27a07e90f3Sjmcneill * SUCH DAMAGE.
28a07e90f3Sjmcneill */
29a07e90f3Sjmcneill
30a07e90f3Sjmcneill #include <sys/cdefs.h>
31a07e90f3Sjmcneill
32*1d53811aSriastradh __KERNEL_RCSID(1, "$NetBSD: sun8i_h3_ccu.c,v 1.18 2021/04/24 13:01:35 riastradh Exp $");
33a07e90f3Sjmcneill
34a07e90f3Sjmcneill #include <sys/param.h>
35a07e90f3Sjmcneill #include <sys/bus.h>
36a07e90f3Sjmcneill #include <sys/device.h>
37a07e90f3Sjmcneill #include <sys/systm.h>
38a07e90f3Sjmcneill
39a07e90f3Sjmcneill #include <dev/fdt/fdtvar.h>
40a07e90f3Sjmcneill
41a07e90f3Sjmcneill #include <arm/sunxi/sunxi_ccu.h>
42a07e90f3Sjmcneill #include <arm/sunxi/sun8i_h3_ccu.h>
43a07e90f3Sjmcneill
44b3e175fcSjmcneill #define PLL_CPUX_CTRL_REG 0x000
45ecf61253Sjmcneill #define PLL_AUDIO_CTRL_REG 0x008
465d520f5aSjmcneill #define PLL_VIDEO_CTRL_REG 0x010
4711d415cdSjmcneill #define PLL_PERIPH0_CTRL_REG 0x028
485d520f5aSjmcneill #define PLL_DE_CTRL_REG 0x048
4911d415cdSjmcneill #define AHB1_APB1_CFG_REG 0x054
50a07e90f3Sjmcneill #define APB2_CFG_REG 0x058
511750a07eSjmcneill #define AHB2_CFG_REG 0x05c
521750a07eSjmcneill #define AHB2_CLK_CFG __BITS(1,0)
531750a07eSjmcneill #define AHB2_CLK_CFG_PLL_PERIPH0_2 1
5411d415cdSjmcneill #define BUS_CLK_GATING_REG0 0x060
555d520f5aSjmcneill #define BUS_CLK_GATING_REG1 0x064
5649f361a5Sjmcneill #define BUS_CLK_GATING_REG2 0x068
57a07e90f3Sjmcneill #define BUS_CLK_GATING_REG3 0x06c
58c7ac1819Sjmcneill #define BUS_CLK_GATING_REG4 0x070
59e2cc70dcSjmcneill #define THS_CLK_REG 0x074
6011d415cdSjmcneill #define SDMMC0_CLK_REG 0x088
6111d415cdSjmcneill #define SDMMC1_CLK_REG 0x08c
6211d415cdSjmcneill #define SDMMC2_CLK_REG 0x090
63*1d53811aSriastradh #define CE_CLK_REG 0x09c
6483dc325dSjakllsch #define SPI0_CLK_REG 0x0a0
6583dc325dSjakllsch #define SPI1_CLK_REG 0x0a4
661e6185e4Sjmcneill #define USBPHY_CFG_REG 0x0cc
671e6185e4Sjmcneill #define MBUS_RST_REG 0x0fc
685d520f5aSjmcneill #define DE_CLK_REG 0x104
695d520f5aSjmcneill #define TCON0_CLK_REG 0x118
70ecf61253Sjmcneill #define AC_DIG_CLK_REG 0x140
715d520f5aSjmcneill #define HDMI_CLK_REG 0x150
725d520f5aSjmcneill #define HDMI_SLOW_CLK_REG 0x154
731e6185e4Sjmcneill #define BUS_SOFT_RST_REG0 0x2c0
741e6185e4Sjmcneill #define BUS_SOFT_RST_REG1 0x2c4
751e6185e4Sjmcneill #define BUS_SOFT_RST_REG2 0x2c8
761e6185e4Sjmcneill #define BUS_SOFT_RST_REG3 0x2d0
771e6185e4Sjmcneill #define BUS_SOFT_RST_REG4 0x2d8
78a07e90f3Sjmcneill
79a07e90f3Sjmcneill static int sun8i_h3_ccu_match(device_t, cfdata_t, void *);
80a07e90f3Sjmcneill static void sun8i_h3_ccu_attach(device_t, device_t, void *);
81a07e90f3Sjmcneill
826e54367aSthorpej static const struct device_compatible_entry compat_data[] = {
836e54367aSthorpej { .compat = "allwinner,sun8i-h3-ccu" },
846e54367aSthorpej { .compat = "allwinner,sun50i-h5-ccu" },
856e54367aSthorpej DEVICE_COMPAT_EOL
86a07e90f3Sjmcneill };
87a07e90f3Sjmcneill
88a07e90f3Sjmcneill CFATTACH_DECL_NEW(sunxi_h3_ccu, sizeof(struct sunxi_ccu_softc),
89a07e90f3Sjmcneill sun8i_h3_ccu_match, sun8i_h3_ccu_attach, NULL, NULL);
90a07e90f3Sjmcneill
91a07e90f3Sjmcneill static struct sunxi_ccu_reset sun8i_h3_ccu_resets[] = {
92a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_USB_PHY0, USBPHY_CFG_REG, 0),
93a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_USB_PHY1, USBPHY_CFG_REG, 1),
94a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_USB_PHY2, USBPHY_CFG_REG, 2),
95a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_USB_PHY3, USBPHY_CFG_REG, 3),
96a07e90f3Sjmcneill
97a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_MBUS, MBUS_RST_REG, 31),
98a07e90f3Sjmcneill
99a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_CE, BUS_SOFT_RST_REG0, 5),
100a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_DMA, BUS_SOFT_RST_REG0, 6),
101a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_MMC0, BUS_SOFT_RST_REG0, 8),
102a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_MMC1, BUS_SOFT_RST_REG0, 9),
103a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_MMC2, BUS_SOFT_RST_REG0, 10),
104a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_NAND, BUS_SOFT_RST_REG0, 13),
105a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_DRAM, BUS_SOFT_RST_REG0, 14),
106a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_EMAC, BUS_SOFT_RST_REG0, 17),
107a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_TS, BUS_SOFT_RST_REG0, 18),
108a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_HSTIMER, BUS_SOFT_RST_REG0, 19),
109a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_SPI0, BUS_SOFT_RST_REG0, 20),
110a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_SPI1, BUS_SOFT_RST_REG0, 21),
111a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_OTG, BUS_SOFT_RST_REG0, 23),
112a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_EHCI0, BUS_SOFT_RST_REG0, 24),
113a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_EHCI1, BUS_SOFT_RST_REG0, 25),
114a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_EHCI2, BUS_SOFT_RST_REG0, 26),
115a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_EHCI3, BUS_SOFT_RST_REG0, 27),
116a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_OHCI0, BUS_SOFT_RST_REG0, 28),
117a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_OHCI1, BUS_SOFT_RST_REG0, 29),
118a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_OHCI2, BUS_SOFT_RST_REG0, 30),
119a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_OHCI3, BUS_SOFT_RST_REG0, 31),
120a07e90f3Sjmcneill
121a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_VE, BUS_SOFT_RST_REG1, 0),
122a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_TCON0, BUS_SOFT_RST_REG1, 3),
123a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_TCON1, BUS_SOFT_RST_REG1, 4),
124a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_DEINTERLACE, BUS_SOFT_RST_REG1, 5),
125a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_CSI, BUS_SOFT_RST_REG1, 8),
126a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_TVE, BUS_SOFT_RST_REG1, 9),
127a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_HDMI0, BUS_SOFT_RST_REG1, 10),
128a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_HDMI1, BUS_SOFT_RST_REG1, 11),
129a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_DE, BUS_SOFT_RST_REG1, 12),
130a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_GPU, BUS_SOFT_RST_REG1, 20),
131a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_MSGBOX, BUS_SOFT_RST_REG1, 21),
132a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_SPINLOCK, BUS_SOFT_RST_REG1, 22),
133a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_DBG, BUS_SOFT_RST_REG1, 31),
134a07e90f3Sjmcneill
135a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_EPHY, BUS_SOFT_RST_REG2, 2),
136a07e90f3Sjmcneill
137a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_CODEC, BUS_SOFT_RST_REG3, 0),
138a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_SPDIF, BUS_SOFT_RST_REG3, 1),
139a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_THS, BUS_SOFT_RST_REG3, 8),
140a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_I2S0, BUS_SOFT_RST_REG3, 12),
141a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_I2S1, BUS_SOFT_RST_REG3, 13),
142a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_I2S2, BUS_SOFT_RST_REG3, 14),
143a07e90f3Sjmcneill
144a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_I2C0, BUS_SOFT_RST_REG4, 0),
145a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_I2C1, BUS_SOFT_RST_REG4, 1),
146a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_I2C2, BUS_SOFT_RST_REG4, 2),
147a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_UART0, BUS_SOFT_RST_REG4, 16),
148a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_UART1, BUS_SOFT_RST_REG4, 17),
149a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_UART2, BUS_SOFT_RST_REG4, 18),
150a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_UART3, BUS_SOFT_RST_REG4, 19),
151a07e90f3Sjmcneill SUNXI_CCU_RESET(H3_RST_BUS_SCR, BUS_SOFT_RST_REG4, 20),
152a07e90f3Sjmcneill };
153a07e90f3Sjmcneill
15411d415cdSjmcneill static const char *ahb1_parents[] = { "losc", "hosc", "axi", "pll_periph0" };
1551e6185e4Sjmcneill static const char *ahb2_parents[] = { "ahb1", "pll_periph0" };
15649f361a5Sjmcneill static const char *apb1_parents[] = { "ahb1" };
157a07e90f3Sjmcneill static const char *apb2_parents[] = { "losc", "hosc", "pll_periph0" };
158*1d53811aSriastradh static const char *ce_parents[] = { "hosc", "pll_periph0_2x", "pll_periph1_2x" };
15911d415cdSjmcneill static const char *mod_parents[] = { "hosc", "pll_periph0", "pll_periph1" };
160e2cc70dcSjmcneill static const char *ths_parents[] = { "hosc" };
1615d520f5aSjmcneill static const char *de_parents[] = { "pll_periph0_2x", "pll_de" };
1625d520f5aSjmcneill static const char *hdmi_parents[] = { "pll_video" };
1635d520f5aSjmcneill static const char *tcon0_parents[] = { "pll_video" };
164a07e90f3Sjmcneill
165b3e175fcSjmcneill static const struct sunxi_ccu_nkmp_tbl sun8i_h3_cpux_table[] = {
166b3e175fcSjmcneill { 60000000, 9, 0, 0, 2 },
167b3e175fcSjmcneill { 66000000, 10, 0, 0, 2 },
168b3e175fcSjmcneill { 72000000, 11, 0, 0, 2 },
169b3e175fcSjmcneill { 78000000, 12, 0, 0, 2 },
170b3e175fcSjmcneill { 84000000, 13, 0, 0, 2 },
171b3e175fcSjmcneill { 90000000, 14, 0, 0, 2 },
172b3e175fcSjmcneill { 96000000, 15, 0, 0, 2 },
173b3e175fcSjmcneill { 102000000, 16, 0, 0, 2 },
174b3e175fcSjmcneill { 108000000, 17, 0, 0, 2 },
175b3e175fcSjmcneill { 114000000, 18, 0, 0, 2 },
176b3e175fcSjmcneill { 120000000, 9, 0, 0, 1 },
177b3e175fcSjmcneill { 132000000, 10, 0, 0, 1 },
178b3e175fcSjmcneill { 144000000, 11, 0, 0, 1 },
179b3e175fcSjmcneill { 156000000, 12, 0, 0, 1 },
180b3e175fcSjmcneill { 168000000, 13, 0, 0, 1 },
181b3e175fcSjmcneill { 180000000, 14, 0, 0, 1 },
182b3e175fcSjmcneill { 192000000, 15, 0, 0, 1 },
183b3e175fcSjmcneill { 204000000, 16, 0, 0, 1 },
184b3e175fcSjmcneill { 216000000, 17, 0, 0, 1 },
185b3e175fcSjmcneill { 228000000, 18, 0, 0, 1 },
186b3e175fcSjmcneill { 240000000, 9, 0, 0, 0 },
187b3e175fcSjmcneill { 264000000, 10, 0, 0, 0 },
188b3e175fcSjmcneill { 288000000, 11, 0, 0, 0 },
189b3e175fcSjmcneill { 312000000, 12, 0, 0, 0 },
190b3e175fcSjmcneill { 336000000, 13, 0, 0, 0 },
191b3e175fcSjmcneill { 360000000, 14, 0, 0, 0 },
192b3e175fcSjmcneill { 384000000, 15, 0, 0, 0 },
193b3e175fcSjmcneill { 408000000, 16, 0, 0, 0 },
194b3e175fcSjmcneill { 432000000, 17, 0, 0, 0 },
195b3e175fcSjmcneill { 456000000, 18, 0, 0, 0 },
196b3e175fcSjmcneill { 480000000, 19, 0, 0, 0 },
197b3e175fcSjmcneill { 504000000, 20, 0, 0, 0 },
198b3e175fcSjmcneill { 528000000, 21, 0, 0, 0 },
199b3e175fcSjmcneill { 552000000, 22, 0, 0, 0 },
200b3e175fcSjmcneill { 576000000, 23, 0, 0, 0 },
201b3e175fcSjmcneill { 600000000, 24, 0, 0, 0 },
202b3e175fcSjmcneill { 624000000, 25, 0, 0, 0 },
203b3e175fcSjmcneill { 648000000, 26, 0, 0, 0 },
204b3e175fcSjmcneill { 672000000, 27, 0, 0, 0 },
205b3e175fcSjmcneill { 696000000, 28, 0, 0, 0 },
206b3e175fcSjmcneill { 720000000, 29, 0, 0, 0 },
207b3e175fcSjmcneill { 768000000, 15, 1, 0, 0 },
208b3e175fcSjmcneill { 792000000, 10, 2, 0, 0 },
209b3e175fcSjmcneill { 816000000, 16, 1, 0, 0 },
210b3e175fcSjmcneill { 864000000, 17, 1, 0, 0 },
211b3e175fcSjmcneill { 912000000, 18, 1, 0, 0 },
212b3e175fcSjmcneill { 936000000, 12, 2, 0, 0 },
213b3e175fcSjmcneill { 960000000, 19, 1, 0, 0 },
214b3e175fcSjmcneill { 1008000000, 20, 1, 0, 0 },
215b3e175fcSjmcneill { 1056000000, 21, 1, 0, 0 },
216b3e175fcSjmcneill { 1080000000, 14, 2, 0, 0 },
217b3e175fcSjmcneill { 1104000000, 22, 1, 0, 0 },
218b3e175fcSjmcneill { 1152000000, 23, 1, 0, 0 },
219b3e175fcSjmcneill { 1200000000, 24, 1, 0, 0 },
220b3e175fcSjmcneill { 1224000000, 16, 2, 0, 0 },
221b3e175fcSjmcneill { 1248000000, 25, 1, 0, 0 },
222b3e175fcSjmcneill { 1296000000, 26, 1, 0, 0 },
223b3e175fcSjmcneill { 1344000000, 27, 1, 0, 0 },
224b3e175fcSjmcneill { 1368000000, 18, 2, 0, 0 },
225b3e175fcSjmcneill { 1392000000, 28, 1, 0, 0 },
226b3e175fcSjmcneill { 1440000000, 29, 1, 0, 0 },
227b3e175fcSjmcneill { 1512000000, 20, 2, 0, 0 },
228b3e175fcSjmcneill { 1536000000, 15, 3, 0, 0 },
229b3e175fcSjmcneill { 1584000000, 21, 2, 0, 0 },
230b3e175fcSjmcneill { 1632000000, 16, 3, 0, 0 },
231b3e175fcSjmcneill { 1656000000, 22, 2, 0, 0 },
232b3e175fcSjmcneill { 1728000000, 23, 2, 0, 0 },
233b3e175fcSjmcneill { 1800000000, 24, 2, 0, 0 },
234b3e175fcSjmcneill { 1824000000, 18, 3, 0, 0 },
235b3e175fcSjmcneill { 1872000000, 25, 2, 0, 0 },
236b3e175fcSjmcneill { 0 }
237b3e175fcSjmcneill };
238b3e175fcSjmcneill
239b3e175fcSjmcneill static const struct sunxi_ccu_nkmp_tbl sun8i_h3_ac_dig_table[] = {
240ecf61253Sjmcneill { 24576000, 13, 0, 0, 13 },
241ecf61253Sjmcneill { 0 }
242ecf61253Sjmcneill };
243ecf61253Sjmcneill
244a07e90f3Sjmcneill static struct sunxi_ccu_clk sun8i_h3_ccu_clks[] = {
245b3e175fcSjmcneill SUNXI_CCU_NKMP_TABLE(H3_CLK_CPUX, "pll_cpux", "hosc",
246b3e175fcSjmcneill PLL_CPUX_CTRL_REG, /* reg */
247b3e175fcSjmcneill __BITS(12,8), /* n */
248b3e175fcSjmcneill __BITS(5,4), /* k */
249b3e175fcSjmcneill __BITS(1,0), /* m */
250b3e175fcSjmcneill __BITS(17,16), /* p */
251b3e175fcSjmcneill __BIT(31), /* enable */
252b3e175fcSjmcneill __BIT(28), /* lock */
253b3e175fcSjmcneill sun8i_h3_cpux_table, /* table */
254b3e175fcSjmcneill SUNXI_CCU_NKMP_SCALE_CLOCK | SUNXI_CCU_NKMP_FACTOR_P_POW2),
255b3e175fcSjmcneill
25611d415cdSjmcneill SUNXI_CCU_NKMP(H3_CLK_PLL_PERIPH0, "pll_periph0", "hosc",
25768166010Sjmcneill PLL_PERIPH0_CTRL_REG, /* reg */
25868166010Sjmcneill __BITS(12,8), /* n */
25968166010Sjmcneill __BITS(5,4), /* k */
26068166010Sjmcneill 0, /* m */
26168166010Sjmcneill __BITS(17,16), /* p */
26268166010Sjmcneill __BIT(31), /* enable */
26368166010Sjmcneill SUNXI_CCU_NKMP_DIVIDE_BY_TWO),
26411d415cdSjmcneill
2655d520f5aSjmcneill SUNXI_CCU_FIXED_FACTOR(H3_CLK_PLL_PERIPH0_2X, "pll_periph0_2x", "pll_periph0", 1, 2),
2665d520f5aSjmcneill
2675d520f5aSjmcneill SUNXI_CCU_FRACTIONAL(H3_CLK_PLL_VIDEO, "pll_video", "hosc",
2685d520f5aSjmcneill PLL_VIDEO_CTRL_REG, /* reg */
2695d520f5aSjmcneill __BITS(14,8), /* m */
2705d520f5aSjmcneill 16, /* m_min */
2715d520f5aSjmcneill 50, /* m_max */
2725d520f5aSjmcneill __BIT(24), /* div_en */
2735d520f5aSjmcneill __BIT(25), /* frac_sel */
2745d520f5aSjmcneill 270000000, 297000000, /* frac values */
2755d520f5aSjmcneill __BITS(3,0), /* prediv */
2765d520f5aSjmcneill 4, /* prediv_val */
2775d520f5aSjmcneill __BIT(31), /* enable */
2785d520f5aSjmcneill SUNXI_CCU_FRACTIONAL_PLUSONE | SUNXI_CCU_FRACTIONAL_SET_ENABLE),
2795d520f5aSjmcneill
280ecf61253Sjmcneill SUNXI_CCU_NKMP_TABLE(H3_CLK_PLL_AUDIO_BASE, "pll_audio", "hosc",
281ecf61253Sjmcneill PLL_AUDIO_CTRL_REG, /* reg */
282ecf61253Sjmcneill __BITS(14,8), /* n */
283ecf61253Sjmcneill 0, /* k */
284ecf61253Sjmcneill __BITS(4,0), /* m */
285ecf61253Sjmcneill __BITS(19,16), /* p */
286ecf61253Sjmcneill __BIT(31), /* enable */
287ecf61253Sjmcneill __BIT(28), /* lock */
288b3e175fcSjmcneill sun8i_h3_ac_dig_table, /* table */
289ecf61253Sjmcneill 0),
290ecf61253Sjmcneill
2915d520f5aSjmcneill SUNXI_CCU_FRACTIONAL(H3_CLK_PLL_DE, "pll_de", "hosc",
2925d520f5aSjmcneill PLL_DE_CTRL_REG, /* reg */
2935d520f5aSjmcneill __BITS(14,8), /* m */
2945d520f5aSjmcneill 16, /* m_min */
2955d520f5aSjmcneill 50, /* m_max */
2965d520f5aSjmcneill __BIT(24), /* div_en */
2975d520f5aSjmcneill __BIT(25), /* frac_sel */
2985d520f5aSjmcneill 270000000, 297000000, /* frac values */
2995d520f5aSjmcneill __BITS(3,0), /* prediv */
3005d520f5aSjmcneill 2, /* prediv_val */
3015d520f5aSjmcneill __BIT(31), /* enable */
3025d520f5aSjmcneill SUNXI_CCU_FRACTIONAL_PLUSONE | SUNXI_CCU_FRACTIONAL_SET_ENABLE),
3035d520f5aSjmcneill
30411d415cdSjmcneill SUNXI_CCU_PREDIV(H3_CLK_AHB1, "ahb1", ahb1_parents,
30511d415cdSjmcneill AHB1_APB1_CFG_REG, /* reg */
30611d415cdSjmcneill __BITS(7,6), /* prediv */
30711d415cdSjmcneill __BIT(3), /* prediv_sel */
30811d415cdSjmcneill __BITS(5,4), /* div */
30911d415cdSjmcneill __BITS(13,12), /* sel */
31011d415cdSjmcneill SUNXI_CCU_PREDIV_POWER_OF_TWO),
31149f361a5Sjmcneill
3121e6185e4Sjmcneill SUNXI_CCU_PREDIV(H3_CLK_AHB2, "ahb2", ahb2_parents,
3131750a07eSjmcneill AHB2_CFG_REG, /* reg */
3141e6185e4Sjmcneill 0, /* prediv */
3151e6185e4Sjmcneill __BIT(1), /* prediv_sel */
3161e6185e4Sjmcneill 0, /* div */
3171e6185e4Sjmcneill __BITS(1,0), /* sel */
3181e6185e4Sjmcneill SUNXI_CCU_PREDIV_DIVIDE_BY_TWO),
31911d415cdSjmcneill
32049f361a5Sjmcneill SUNXI_CCU_DIV(H3_CLK_APB1, "apb1", apb1_parents,
32149f361a5Sjmcneill AHB1_APB1_CFG_REG, /* reg */
32249f361a5Sjmcneill __BITS(9,8), /* div */
32349f361a5Sjmcneill 0, /* sel */
32449f361a5Sjmcneill SUNXI_CCU_DIV_POWER_OF_TWO|SUNXI_CCU_DIV_ZERO_IS_ONE),
32549f361a5Sjmcneill
326a07e90f3Sjmcneill SUNXI_CCU_NM(H3_CLK_APB2, "apb2", apb2_parents,
32711d415cdSjmcneill APB2_CFG_REG, /* reg */
32811d415cdSjmcneill __BITS(17,16), /* n */
32911d415cdSjmcneill __BITS(4,0), /* m */
33011d415cdSjmcneill __BITS(25,24), /* sel */
33111d415cdSjmcneill 0, /* enable */
332a07e90f3Sjmcneill SUNXI_CCU_NM_POWER_OF_TWO),
333a07e90f3Sjmcneill
334*1d53811aSriastradh SUNXI_CCU_NM(H3_CLK_CE, "ce", ce_parents,
335*1d53811aSriastradh CE_CLK_REG, /* reg */
336*1d53811aSriastradh __BITS(17,16), /* n */
337*1d53811aSriastradh __BITS(3,0), /* m */
338*1d53811aSriastradh __BITS(25,24), /* sel */
339*1d53811aSriastradh __BIT(31), /* enable */
340*1d53811aSriastradh SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN),
341*1d53811aSriastradh
342e2cc70dcSjmcneill SUNXI_CCU_DIV_GATE(H3_CLK_THS, "ths", ths_parents,
343e2cc70dcSjmcneill THS_CLK_REG, /* reg */
344e2cc70dcSjmcneill __BITS(1,0), /* div */
345e2cc70dcSjmcneill __BITS(25,24), /* sel */
346e2cc70dcSjmcneill __BIT(31), /* enable */
347e2cc70dcSjmcneill SUNXI_CCU_DIV_TIMES_TWO),
348e2cc70dcSjmcneill
3495d520f5aSjmcneill SUNXI_CCU_DIV_GATE(H3_CLK_DE, "de", de_parents,
3505d520f5aSjmcneill DE_CLK_REG, /* reg */
3515d520f5aSjmcneill __BITS(3,0), /* div */
3525d520f5aSjmcneill __BITS(26,24), /* sel */
3535d520f5aSjmcneill __BIT(31), /* enable */
3545d520f5aSjmcneill 0),
3555d520f5aSjmcneill
35611d415cdSjmcneill SUNXI_CCU_NM(H3_CLK_MMC0, "mmc0", mod_parents,
35711d415cdSjmcneill SDMMC0_CLK_REG, __BITS(17, 16), __BITS(3,0), __BITS(25, 24), __BIT(31),
35811d415cdSjmcneill SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN),
359deeed1ddSjmcneill SUNXI_CCU_PHASE(H3_CLK_MMC0_SAMPLE, "mmc0_sample", "mmc0",
360deeed1ddSjmcneill SDMMC0_CLK_REG, __BITS(22,20)),
361deeed1ddSjmcneill SUNXI_CCU_PHASE(H3_CLK_MMC0_OUTPUT, "mmc0_output", "mmc0",
362deeed1ddSjmcneill SDMMC0_CLK_REG, __BITS(10,8)),
36311d415cdSjmcneill SUNXI_CCU_NM(H3_CLK_MMC1, "mmc1", mod_parents,
36411d415cdSjmcneill SDMMC1_CLK_REG, __BITS(17, 16), __BITS(3,0), __BITS(25, 24), __BIT(31),
36511d415cdSjmcneill SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN),
366deeed1ddSjmcneill SUNXI_CCU_PHASE(H3_CLK_MMC1_SAMPLE, "mmc1_sample", "mmc1",
367deeed1ddSjmcneill SDMMC1_CLK_REG, __BITS(22,20)),
368deeed1ddSjmcneill SUNXI_CCU_PHASE(H3_CLK_MMC1_OUTPUT, "mmc1_output", "mmc1",
369deeed1ddSjmcneill SDMMC1_CLK_REG, __BITS(10,8)),
37011d415cdSjmcneill SUNXI_CCU_NM(H3_CLK_MMC2, "mmc2", mod_parents,
37111d415cdSjmcneill SDMMC2_CLK_REG, __BITS(17, 16), __BITS(3,0), __BITS(25, 24), __BIT(31),
37211d415cdSjmcneill SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN),
373deeed1ddSjmcneill SUNXI_CCU_PHASE(H3_CLK_MMC2_SAMPLE, "mmc2_sample", "mmc2",
374deeed1ddSjmcneill SDMMC2_CLK_REG, __BITS(22,20)),
375deeed1ddSjmcneill SUNXI_CCU_PHASE(H3_CLK_MMC2_OUTPUT, "mmc2_output", "mmc2",
376deeed1ddSjmcneill SDMMC2_CLK_REG, __BITS(10,8)),
37711d415cdSjmcneill
37883dc325dSjakllsch SUNXI_CCU_NM(H3_CLK_SPI0, "spi0", mod_parents,
37983dc325dSjakllsch SPI0_CLK_REG, /* reg */
38083dc325dSjakllsch __BITS(17,16), /* n */
38183dc325dSjakllsch __BITS(3,0), /* m */
38283dc325dSjakllsch __BITS(25,24), /* sel */
38383dc325dSjakllsch __BIT(31), /* enable */
38483dc325dSjakllsch SUNXI_CCU_NM_ROUND_DOWN),
38583dc325dSjakllsch SUNXI_CCU_NM(H3_CLK_SPI1, "spi1", mod_parents,
38683dc325dSjakllsch SPI1_CLK_REG, /* reg */
38783dc325dSjakllsch __BITS(17,16), /* n */
38883dc325dSjakllsch __BITS(3,0), /* m */
38983dc325dSjakllsch __BITS(25,24), /* sel */
39083dc325dSjakllsch __BIT(31), /* enable */
39183dc325dSjakllsch SUNXI_CCU_NM_ROUND_DOWN),
39283dc325dSjakllsch
393ecf61253Sjmcneill SUNXI_CCU_GATE(H3_CLK_AC_DIG, "ac_dig", "pll_audio",
394ecf61253Sjmcneill AC_DIG_CLK_REG, 31),
395ecf61253Sjmcneill
3965d520f5aSjmcneill SUNXI_CCU_DIV_GATE(H3_CLK_HDMI, "hdmi", hdmi_parents,
3975d520f5aSjmcneill HDMI_CLK_REG, /* reg */
3985d520f5aSjmcneill __BITS(3,0), /* div */
3995d520f5aSjmcneill __BITS(25,24), /* sel */
4005d520f5aSjmcneill __BIT(31), /* enable */
4015d520f5aSjmcneill 0),
4025d520f5aSjmcneill
4035d520f5aSjmcneill SUNXI_CCU_GATE(H3_CLK_HDMI_DDC, "hdmi-ddc", "hosc",
4045d520f5aSjmcneill HDMI_SLOW_CLK_REG, 31),
4055d520f5aSjmcneill
4065d520f5aSjmcneill SUNXI_CCU_DIV_GATE(H3_CLK_TCON0, "tcon0", tcon0_parents,
4075d520f5aSjmcneill TCON0_CLK_REG, /* reg */
4085d520f5aSjmcneill __BITS(3,0), /* div */
4095d520f5aSjmcneill __BITS(26,24), /* sel */
4105d520f5aSjmcneill __BIT(31), /* enable */
4115d520f5aSjmcneill 0),
4125d520f5aSjmcneill
413*1d53811aSriastradh SUNXI_CCU_GATE(H3_CLK_BUS_CE, "bus-ce", "ahb1",
414*1d53811aSriastradh BUS_CLK_GATING_REG0, 5),
4155370d678Sjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_DMA, "bus-dma", "ahb1",
4165370d678Sjmcneill BUS_CLK_GATING_REG0, 6),
41711d415cdSjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_MMC0, "bus-mmc0", "ahb1",
41811d415cdSjmcneill BUS_CLK_GATING_REG0, 8),
41911d415cdSjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_MMC1, "bus-mmc1", "ahb1",
42011d415cdSjmcneill BUS_CLK_GATING_REG0, 9),
42111d415cdSjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_MMC2, "bus-mmc2", "ahb1",
42211d415cdSjmcneill BUS_CLK_GATING_REG0, 10),
4239432a99aSjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_EMAC, "bus-emac", "ahb2",
4249432a99aSjmcneill BUS_CLK_GATING_REG0, 17),
42583dc325dSjakllsch SUNXI_CCU_GATE(H3_CLK_BUS_SPI0, "bus-spi0", "ahb1",
42683dc325dSjakllsch BUS_CLK_GATING_REG0, 20),
42783dc325dSjakllsch SUNXI_CCU_GATE(H3_CLK_BUS_SPI1, "bus-spi1", "ahb1",
42883dc325dSjakllsch BUS_CLK_GATING_REG0, 21),
4291e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_OTG, "bus-otg", "ahb1",
4301e6185e4Sjmcneill BUS_CLK_GATING_REG0, 23),
4311e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_EHCI0, "bus-ehci0", "ahb1",
4321e6185e4Sjmcneill BUS_CLK_GATING_REG0, 24),
4331e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_EHCI1, "bus-ehci1", "ahb2",
4341e6185e4Sjmcneill BUS_CLK_GATING_REG0, 25),
4351e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_EHCI2, "bus-ehci2", "ahb2",
4361e6185e4Sjmcneill BUS_CLK_GATING_REG0, 26),
4371e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_EHCI3, "bus-ehci3", "ahb2",
4381e6185e4Sjmcneill BUS_CLK_GATING_REG0, 27),
4391e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_OHCI0, "bus-ohci0", "ahb1",
4401e6185e4Sjmcneill BUS_CLK_GATING_REG0, 28),
4411e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_OHCI1, "bus-ohci1", "ahb2",
4421e6185e4Sjmcneill BUS_CLK_GATING_REG0, 29),
4431e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_OHCI2, "bus-ohci2", "ahb2",
4441e6185e4Sjmcneill BUS_CLK_GATING_REG0, 30),
4451e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_OHCI3, "bus-ohci3", "ahb2",
4461e6185e4Sjmcneill BUS_CLK_GATING_REG0, 31),
44711d415cdSjmcneill
4485d520f5aSjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_GPU, "bus-gpu", "ahb1",
4495d520f5aSjmcneill BUS_CLK_GATING_REG1, 20),
4505d520f5aSjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_DE, "bus-de", "ahb1",
4515d520f5aSjmcneill BUS_CLK_GATING_REG1, 12),
4525d520f5aSjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_HDMI, "bus-hdmi", "ahb1",
4535d520f5aSjmcneill BUS_CLK_GATING_REG1, 11),
4545d520f5aSjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_TVE, "bus-tve", "ahb1",
4555d520f5aSjmcneill BUS_CLK_GATING_REG1, 9),
4565d520f5aSjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_DEINTERLACE, "bus-deinterlace", "ahb1",
4575d520f5aSjmcneill BUS_CLK_GATING_REG1, 5),
4585d520f5aSjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_TCON1, "bus-tcon1", "ahb1",
4595d520f5aSjmcneill BUS_CLK_GATING_REG1, 4),
4605d520f5aSjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_TCON0, "bus-tcon0", "ahb1",
4615d520f5aSjmcneill BUS_CLK_GATING_REG1, 3),
4625d520f5aSjmcneill
463ecf61253Sjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_CODEC, "bus-codec", "apb1",
464ecf61253Sjmcneill BUS_CLK_GATING_REG2, 0),
46549f361a5Sjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_PIO, "bus-pio", "apb1",
46649f361a5Sjmcneill BUS_CLK_GATING_REG2, 5),
467e2cc70dcSjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_THS, "bus-ths", "apb2",
468e2cc70dcSjmcneill BUS_CLK_GATING_REG2, 8),
46949f361a5Sjmcneill
4701e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_I2C0, "bus-i2c0", "apb2",
4711e6185e4Sjmcneill BUS_CLK_GATING_REG3, 0),
4721e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_I2C1, "bus-i2c1", "apb2",
4731e6185e4Sjmcneill BUS_CLK_GATING_REG3, 1),
4741e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_I2C2, "bus-i2c2", "apb2",
4751e6185e4Sjmcneill BUS_CLK_GATING_REG3, 2),
476a07e90f3Sjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_UART0, "bus-uart0", "apb2",
4771e6185e4Sjmcneill BUS_CLK_GATING_REG3, 16),
4781e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_UART1, "bus-uart1", "apb2",
4791e6185e4Sjmcneill BUS_CLK_GATING_REG3, 17),
4801e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_UART2, "bus-uart2", "apb2",
4811e6185e4Sjmcneill BUS_CLK_GATING_REG3, 18),
4821e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_UART3, "bus-uart3", "apb2",
483a07e90f3Sjmcneill BUS_CLK_GATING_REG3, 19),
4841e6185e4Sjmcneill
485c7ac1819Sjmcneill SUNXI_CCU_GATE(H3_CLK_BUS_EPHY, "bus-ephy", "ahb1",
486c7ac1819Sjmcneill BUS_CLK_GATING_REG4, 0),
487c7ac1819Sjmcneill
4881e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_USBPHY0, "usb-phy0", "hosc",
4891e6185e4Sjmcneill USBPHY_CFG_REG, 8),
4901e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_USBPHY1, "usb-phy1", "hosc",
4911e6185e4Sjmcneill USBPHY_CFG_REG, 9),
4921e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_USBPHY2, "usb-phy2", "hosc",
4931e6185e4Sjmcneill USBPHY_CFG_REG, 10),
4941e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_USBPHY3, "usb-phy3", "hosc",
4951e6185e4Sjmcneill USBPHY_CFG_REG, 11),
4961e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_USBOHCI0, "usb-ohci0", "hosc",
4971e6185e4Sjmcneill USBPHY_CFG_REG, 16),
4981e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_USBOHCI1, "usb-ohci1", "hosc",
4991e6185e4Sjmcneill USBPHY_CFG_REG, 17),
5001e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_USBOHCI2, "usb-ohci2", "hosc",
5011e6185e4Sjmcneill USBPHY_CFG_REG, 18),
5021e6185e4Sjmcneill SUNXI_CCU_GATE(H3_CLK_USBOHCI3, "usb-ohci3", "hosc",
5031e6185e4Sjmcneill USBPHY_CFG_REG, 19),
504a07e90f3Sjmcneill };
505a07e90f3Sjmcneill
5061750a07eSjmcneill static void
sun8i_h3_ccu_init(struct sunxi_ccu_softc * sc)5071750a07eSjmcneill sun8i_h3_ccu_init(struct sunxi_ccu_softc *sc)
5081750a07eSjmcneill {
5091750a07eSjmcneill uint32_t val;
5101750a07eSjmcneill
5111750a07eSjmcneill /* Set AHB2 source to PLL_PERIPH/2 */
5121750a07eSjmcneill val = CCU_READ(sc, AHB2_CFG_REG);
5131750a07eSjmcneill val &= ~AHB2_CLK_CFG;
5141750a07eSjmcneill val |= __SHIFTIN(AHB2_CLK_CFG_PLL_PERIPH0_2, AHB2_CLK_CFG);
5151750a07eSjmcneill CCU_WRITE(sc, AHB2_CFG_REG, val);
5161750a07eSjmcneill }
5171750a07eSjmcneill
518a07e90f3Sjmcneill static int
sun8i_h3_ccu_match(device_t parent,cfdata_t cf,void * aux)519a07e90f3Sjmcneill sun8i_h3_ccu_match(device_t parent, cfdata_t cf, void *aux)
520a07e90f3Sjmcneill {
521a07e90f3Sjmcneill struct fdt_attach_args * const faa = aux;
522a07e90f3Sjmcneill
5236e54367aSthorpej return of_compatible_match(faa->faa_phandle, compat_data);
524a07e90f3Sjmcneill }
525a07e90f3Sjmcneill
526a07e90f3Sjmcneill static void
sun8i_h3_ccu_attach(device_t parent,device_t self,void * aux)527a07e90f3Sjmcneill sun8i_h3_ccu_attach(device_t parent, device_t self, void *aux)
528a07e90f3Sjmcneill {
529a07e90f3Sjmcneill struct sunxi_ccu_softc * const sc = device_private(self);
530a07e90f3Sjmcneill struct fdt_attach_args * const faa = aux;
531a07e90f3Sjmcneill
532a07e90f3Sjmcneill sc->sc_dev = self;
533a07e90f3Sjmcneill sc->sc_phandle = faa->faa_phandle;
534a07e90f3Sjmcneill sc->sc_bst = faa->faa_bst;
535a07e90f3Sjmcneill
536a07e90f3Sjmcneill sc->sc_resets = sun8i_h3_ccu_resets;
537a07e90f3Sjmcneill sc->sc_nresets = __arraycount(sun8i_h3_ccu_resets);
538a07e90f3Sjmcneill
539a07e90f3Sjmcneill sc->sc_clks = sun8i_h3_ccu_clks;
540a07e90f3Sjmcneill sc->sc_nclks = __arraycount(sun8i_h3_ccu_clks);
541a07e90f3Sjmcneill
542a07e90f3Sjmcneill if (sunxi_ccu_attach(sc) != 0)
543a07e90f3Sjmcneill return;
544a07e90f3Sjmcneill
545a07e90f3Sjmcneill aprint_naive("\n");
546a07e90f3Sjmcneill aprint_normal(": H3 CCU\n");
547a07e90f3Sjmcneill
5481750a07eSjmcneill sun8i_h3_ccu_init(sc);
5491750a07eSjmcneill
550a07e90f3Sjmcneill sunxi_ccu_print(sc);
551a07e90f3Sjmcneill }
552