1*27063f0bSjmcneill /* $NetBSD: sun50i_a64_ccu.c,v 1.24 2021/11/07 17:13:26 jmcneill Exp $ */
20c019004Sjmcneill
30c019004Sjmcneill /*-
40c019004Sjmcneill * Copyright (c) 2017 Jared McNeill <jmcneill@invisible.ca>
50c019004Sjmcneill * All rights reserved.
60c019004Sjmcneill *
70c019004Sjmcneill * Redistribution and use in source and binary forms, with or without
80c019004Sjmcneill * modification, are permitted provided that the following conditions
90c019004Sjmcneill * are met:
100c019004Sjmcneill * 1. Redistributions of source code must retain the above copyright
110c019004Sjmcneill * notice, this list of conditions and the following disclaimer.
120c019004Sjmcneill * 2. Redistributions in binary form must reproduce the above copyright
130c019004Sjmcneill * notice, this list of conditions and the following disclaimer in the
140c019004Sjmcneill * documentation and/or other materials provided with the distribution.
150c019004Sjmcneill *
160c019004Sjmcneill * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
170c019004Sjmcneill * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
180c019004Sjmcneill * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
190c019004Sjmcneill * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
200c019004Sjmcneill * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
210c019004Sjmcneill * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
220c019004Sjmcneill * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
230c019004Sjmcneill * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
240c019004Sjmcneill * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
250c019004Sjmcneill * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
260c019004Sjmcneill * SUCH DAMAGE.
270c019004Sjmcneill */
280c019004Sjmcneill
290c019004Sjmcneill #include <sys/cdefs.h>
300c019004Sjmcneill
31*27063f0bSjmcneill __KERNEL_RCSID(1, "$NetBSD: sun50i_a64_ccu.c,v 1.24 2021/11/07 17:13:26 jmcneill Exp $");
320c019004Sjmcneill
330c019004Sjmcneill #include <sys/param.h>
340c019004Sjmcneill #include <sys/bus.h>
350c019004Sjmcneill #include <sys/device.h>
360c019004Sjmcneill #include <sys/systm.h>
370c019004Sjmcneill
380c019004Sjmcneill #include <dev/fdt/fdtvar.h>
390c019004Sjmcneill
400c019004Sjmcneill #include <arm/sunxi/sunxi_ccu.h>
410c019004Sjmcneill #include <arm/sunxi/sun50i_a64_ccu.h>
420c019004Sjmcneill
430c019004Sjmcneill #define PLL_CPUX_CTRL_REG 0x000
440c019004Sjmcneill #define PLL_AUDIO_CTRL_REG 0x008
45a9d03646Sjmcneill #define PLL_VIDEO0_CTRL_REG 0x010
460c019004Sjmcneill #define PLL_PERIPH0_CTRL_REG 0x028
470c019004Sjmcneill #define PLL_PERIPH1_CTRL_REG 0x02c
48a9d03646Sjmcneill #define PLL_VIDEO1_CTRL_REG 0x030
49488fbedfSjmcneill #define PLL_GPU_CTRL_REG 0x038
50cf80abdeSjmcneill #define PLL_DE_CTRL_REG 0x048
51*27063f0bSjmcneill #define CPUX_AXI_CFG_REG 0x050
520c019004Sjmcneill #define AHB1_APB1_CFG_REG 0x054
530c019004Sjmcneill #define APB2_CFG_REG 0x058
540c019004Sjmcneill #define AHB2_CFG_REG 0x05c
550c019004Sjmcneill #define BUS_CLK_GATING_REG0 0x060
560c019004Sjmcneill #define BUS_CLK_GATING_REG1 0x064
570c019004Sjmcneill #define BUS_CLK_GATING_REG2 0x068
580c019004Sjmcneill #define BUS_CLK_GATING_REG3 0x06c
590c019004Sjmcneill #define BUS_CLK_GATING_REG4 0x070
605b844f97Sjmcneill #define THS_CLK_REG 0x074
610c019004Sjmcneill #define SDMMC0_CLK_REG 0x088
620c019004Sjmcneill #define SDMMC1_CLK_REG 0x08c
630c019004Sjmcneill #define SDMMC2_CLK_REG 0x090
641cc7b00cSjmcneill #define CE_CLK_REG 0x09c
65d4f5d184Sjmcneill #define SPI0_CLK_REG 0x0a0
66d4f5d184Sjmcneill #define SPI1_CLK_REG 0x0a4
672f465beaSjmcneill #define I2SPCM0_CLK_REG 0x0b0
682f465beaSjmcneill #define I2SPCM1_CLK_REG 0x0b4
692f465beaSjmcneill #define I2SPCM2_CLK_REG 0x0b8
700c019004Sjmcneill #define USBPHY_CFG_REG 0x0cc
710c019004Sjmcneill #define DRAM_CFG_REG 0x0f4
720c019004Sjmcneill #define MBUS_RST_REG 0x0fc
73cf80abdeSjmcneill #define DE_CLK_REG 0x104
745f932b1aSjmcneill #define TCON0_CLK_REG 0x118
75a9d03646Sjmcneill #define TCON1_CLK_REG 0x11c
760c019004Sjmcneill #define AC_DIG_CLK_REG 0x140
77a9d03646Sjmcneill #define HDMI_CLK_REG 0x150
78a9d03646Sjmcneill #define HDMI_SLOW_CLK_REG 0x154
79488fbedfSjmcneill #define GPU_CLK_REG 0x1a0
800c019004Sjmcneill #define BUS_SOFT_RST_REG0 0x2c0
810c019004Sjmcneill #define BUS_SOFT_RST_REG1 0x2c4
820c019004Sjmcneill #define BUS_SOFT_RST_REG2 0x2c8
830c019004Sjmcneill #define BUS_SOFT_RST_REG3 0x2d0
840c019004Sjmcneill #define BUS_SOFT_RST_REG4 0x2d8
850c019004Sjmcneill
860c019004Sjmcneill static int sun50i_a64_ccu_match(device_t, cfdata_t, void *);
870c019004Sjmcneill static void sun50i_a64_ccu_attach(device_t, device_t, void *);
880c019004Sjmcneill
896e54367aSthorpej static const struct device_compatible_entry compat_data[] = {
906e54367aSthorpej { .compat = "allwinner,sun50i-a64-ccu" },
916e54367aSthorpej DEVICE_COMPAT_EOL
920c019004Sjmcneill };
930c019004Sjmcneill
940c019004Sjmcneill CFATTACH_DECL_NEW(sunxi_a64_ccu, sizeof(struct sunxi_ccu_softc),
950c019004Sjmcneill sun50i_a64_ccu_match, sun50i_a64_ccu_attach, NULL, NULL);
960c019004Sjmcneill
970c019004Sjmcneill static struct sunxi_ccu_reset sun50i_a64_ccu_resets[] = {
980c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_USB_PHY0, USBPHY_CFG_REG, 0),
990c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_USB_PHY1, USBPHY_CFG_REG, 1),
1000c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_USB_HSIC, USBPHY_CFG_REG, 2),
1010c019004Sjmcneill
1020c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_DRAM, DRAM_CFG_REG, 31),
1030c019004Sjmcneill
1040c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_MBUS, MBUS_RST_REG, 31),
1050c019004Sjmcneill
1060c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_MIPI_DSI, BUS_SOFT_RST_REG0, 1),
1070c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_CE, BUS_SOFT_RST_REG0, 5),
1080c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_DMA, BUS_SOFT_RST_REG0, 6),
1090c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_MMC0, BUS_SOFT_RST_REG0, 8),
1100c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_MMC1, BUS_SOFT_RST_REG0, 9),
1110c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_MMC2, BUS_SOFT_RST_REG0, 10),
1120c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_NAND, BUS_SOFT_RST_REG0, 13),
1130c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_DRAM, BUS_SOFT_RST_REG0, 14),
1140c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_EMAC, BUS_SOFT_RST_REG0, 17),
1150c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_TS, BUS_SOFT_RST_REG0, 18),
1160c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_HSTIMER, BUS_SOFT_RST_REG0, 19),
1170c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_SPI0, BUS_SOFT_RST_REG0, 20),
1180c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_SPI1, BUS_SOFT_RST_REG0, 21),
1190c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_OTG, BUS_SOFT_RST_REG0, 23),
1200c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_EHCI0, BUS_SOFT_RST_REG0, 24),
1210c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_EHCI1, BUS_SOFT_RST_REG0, 25),
1220f90b2a8Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_OHCI0, BUS_SOFT_RST_REG0, 28),
1230f90b2a8Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_OHCI1, BUS_SOFT_RST_REG0, 29),
1240c019004Sjmcneill
1250c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_VE, BUS_SOFT_RST_REG1, 0),
1260c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_TCON0, BUS_SOFT_RST_REG1, 3),
1270c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_TCON1, BUS_SOFT_RST_REG1, 4),
1280c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_DEINTERLACE, BUS_SOFT_RST_REG1, 5),
1290c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_CSI, BUS_SOFT_RST_REG1, 8),
1300c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_HDMI0, BUS_SOFT_RST_REG1, 10),
1310c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_HDMI1, BUS_SOFT_RST_REG1, 11),
1320c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_DE, BUS_SOFT_RST_REG1, 12),
1330c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_GPU, BUS_SOFT_RST_REG1, 20),
1340c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_MSGBOX, BUS_SOFT_RST_REG1, 21),
1350c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_SPINLOCK, BUS_SOFT_RST_REG1, 22),
1360c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_DBG, BUS_SOFT_RST_REG1, 31),
1370c019004Sjmcneill
1380c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_LVDS, BUS_SOFT_RST_REG2, 0),
1390c019004Sjmcneill
1400c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_CODEC, BUS_SOFT_RST_REG3, 0),
1410c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_SPDIF, BUS_SOFT_RST_REG3, 1),
1420c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_THS, BUS_SOFT_RST_REG3, 8),
1430c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_I2S0, BUS_SOFT_RST_REG3, 12),
1440c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_I2S1, BUS_SOFT_RST_REG3, 13),
1450c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_I2S2, BUS_SOFT_RST_REG3, 14),
1460c019004Sjmcneill
1470c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_I2C0, BUS_SOFT_RST_REG4, 0),
1480c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_I2C1, BUS_SOFT_RST_REG4, 1),
1490c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_I2C2, BUS_SOFT_RST_REG4, 2),
1500c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_SCR, BUS_SOFT_RST_REG4, 5),
1510c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_UART0, BUS_SOFT_RST_REG4, 16),
1520c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_UART1, BUS_SOFT_RST_REG4, 17),
1530c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_UART2, BUS_SOFT_RST_REG4, 18),
1540c019004Sjmcneill SUNXI_CCU_RESET(A64_RST_BUS_UART3, BUS_SOFT_RST_REG4, 19),
1550c019004Sjmcneill };
1560c019004Sjmcneill
157*27063f0bSjmcneill static const char *cpux_parents[] = { "losc", "hosc", "pll_cpux", "pll_cpux" };
1580c019004Sjmcneill static const char *ahb1_parents[] = { "losc", "hosc", "axi", "pll_periph0" };
1590c019004Sjmcneill static const char *ahb2_parents[] = { "ahb1", "pll_periph0" };
1600c019004Sjmcneill static const char *apb1_parents[] = { "ahb1" };
1610c019004Sjmcneill static const char *apb2_parents[] = { "losc", "hosc", "pll_periph0" };
16224516a12Sjmcneill static const char *ce_parents[] = { "hosc", "pll_periph0_2x", "pll_periph1_2x" };
163480fd0a8Sjmcneill static const char *mmc_parents[] = { "hosc", "pll_periph0_2x", "pll_periph1_2x" };
1645b844f97Sjmcneill static const char *ths_parents[] = { "hosc", NULL, NULL, NULL };
165cf80abdeSjmcneill static const char *de_parents[] = { "pll_periph0_2x", "pll_de" };
166a9d03646Sjmcneill static const char *hdmi_parents[] = { "pll_video0", "pll_video1" };
1672f465beaSjmcneill static const char *i2s_parents[] = { "pll_audio_8x", "pll_audio_4x", "pll_audio_2x", "pll_audio" };
168d4f5d184Sjmcneill static const char *spi_parents[] = { "hosc", "pll_periph0", "pll_periph1", NULL };
1695f932b1aSjmcneill static const char *tcon0_parents[] = { "pll_mipi", NULL, "pll_video0_2x", NULL };
170a9d03646Sjmcneill static const char *tcon1_parents[] = { "pll_video0", NULL, "pll_video1", NULL };
1715e1f754bSjmcneill static const char *gpu_parents[] = { "pll_gpu" };
1720c019004Sjmcneill
173fe5e2bcaSjmcneill static const struct sunxi_ccu_nkmp_tbl sun50i_a64_cpux_table[] = {
174fe5e2bcaSjmcneill { 60000000, 9, 0, 0, 2 },
175fe5e2bcaSjmcneill { 66000000, 10, 0, 0, 2 },
176fe5e2bcaSjmcneill { 72000000, 11, 0, 0, 2 },
177fe5e2bcaSjmcneill { 78000000, 12, 0, 0, 2 },
178fe5e2bcaSjmcneill { 84000000, 13, 0, 0, 2 },
179fe5e2bcaSjmcneill { 90000000, 14, 0, 0, 2 },
180fe5e2bcaSjmcneill { 96000000, 15, 0, 0, 2 },
181fe5e2bcaSjmcneill { 102000000, 16, 0, 0, 2 },
182fe5e2bcaSjmcneill { 108000000, 17, 0, 0, 2 },
183fe5e2bcaSjmcneill { 114000000, 18, 0, 0, 2 },
184fe5e2bcaSjmcneill { 120000000, 9, 0, 0, 1 },
185fe5e2bcaSjmcneill { 132000000, 10, 0, 0, 1 },
186fe5e2bcaSjmcneill { 144000000, 11, 0, 0, 1 },
187fe5e2bcaSjmcneill { 156000000, 12, 0, 0, 1 },
188fe5e2bcaSjmcneill { 168000000, 13, 0, 0, 1 },
189fe5e2bcaSjmcneill { 180000000, 14, 0, 0, 1 },
190fe5e2bcaSjmcneill { 192000000, 15, 0, 0, 1 },
191fe5e2bcaSjmcneill { 204000000, 16, 0, 0, 1 },
192fe5e2bcaSjmcneill { 216000000, 17, 0, 0, 1 },
193fe5e2bcaSjmcneill { 228000000, 18, 0, 0, 1 },
194fe5e2bcaSjmcneill { 240000000, 9, 0, 0, 0 },
195fe5e2bcaSjmcneill { 264000000, 10, 0, 0, 0 },
196fe5e2bcaSjmcneill { 288000000, 11, 0, 0, 0 },
197fe5e2bcaSjmcneill { 312000000, 12, 0, 0, 0 },
198fe5e2bcaSjmcneill { 336000000, 13, 0, 0, 0 },
199fe5e2bcaSjmcneill { 360000000, 14, 0, 0, 0 },
200fe5e2bcaSjmcneill { 384000000, 15, 0, 0, 0 },
201fe5e2bcaSjmcneill { 408000000, 16, 0, 0, 0 },
202fe5e2bcaSjmcneill { 432000000, 17, 0, 0, 0 },
203fe5e2bcaSjmcneill { 456000000, 18, 0, 0, 0 },
204fe5e2bcaSjmcneill { 480000000, 19, 0, 0, 0 },
205fe5e2bcaSjmcneill { 504000000, 20, 0, 0, 0 },
206fe5e2bcaSjmcneill { 528000000, 21, 0, 0, 0 },
207fe5e2bcaSjmcneill { 552000000, 22, 0, 0, 0 },
208fe5e2bcaSjmcneill { 576000000, 23, 0, 0, 0 },
209fe5e2bcaSjmcneill { 600000000, 24, 0, 0, 0 },
210fe5e2bcaSjmcneill { 624000000, 25, 0, 0, 0 },
211fe5e2bcaSjmcneill { 648000000, 26, 0, 0, 0 },
212fe5e2bcaSjmcneill { 672000000, 27, 0, 0, 0 },
213fe5e2bcaSjmcneill { 696000000, 28, 0, 0, 0 },
214fe5e2bcaSjmcneill { 720000000, 29, 0, 0, 0 },
215fe5e2bcaSjmcneill { 768000000, 15, 1, 0, 0 },
216fe5e2bcaSjmcneill { 792000000, 10, 2, 0, 0 },
217fe5e2bcaSjmcneill { 816000000, 16, 1, 0, 0 },
218fe5e2bcaSjmcneill { 864000000, 17, 1, 0, 0 },
219fe5e2bcaSjmcneill { 912000000, 18, 1, 0, 0 },
220fe5e2bcaSjmcneill { 936000000, 12, 2, 0, 0 },
221fe5e2bcaSjmcneill { 960000000, 19, 1, 0, 0 },
222fe5e2bcaSjmcneill { 1008000000, 20, 1, 0, 0 },
223fe5e2bcaSjmcneill { 1056000000, 21, 1, 0, 0 },
224fe5e2bcaSjmcneill { 1080000000, 14, 2, 0, 0 },
225fe5e2bcaSjmcneill { 1104000000, 22, 1, 0, 0 },
226fe5e2bcaSjmcneill { 1152000000, 23, 1, 0, 0 },
227fe5e2bcaSjmcneill { 1200000000, 24, 1, 0, 0 },
228fe5e2bcaSjmcneill { 1224000000, 16, 2, 0, 0 },
229fe5e2bcaSjmcneill { 1248000000, 25, 1, 0, 0 },
230fe5e2bcaSjmcneill { 1296000000, 26, 1, 0, 0 },
231fe5e2bcaSjmcneill { 1344000000, 27, 1, 0, 0 },
232fe5e2bcaSjmcneill { 1368000000, 18, 2, 0, 0 },
233fe5e2bcaSjmcneill { 1440000000, 19, 2, 0, 0 },
234fe5e2bcaSjmcneill { 1512000000, 20, 2, 0, 0 },
235fe5e2bcaSjmcneill { 1536000000, 15, 3, 0, 0 },
236fe5e2bcaSjmcneill { 1584000000, 21, 2, 0, 0 },
237fe5e2bcaSjmcneill { 1632000000, 16, 3, 0, 0 },
238fe5e2bcaSjmcneill { 1656000000, 22, 2, 0, 0 },
239fe5e2bcaSjmcneill { 1728000000, 23, 2, 0, 0 },
240fe5e2bcaSjmcneill { 1800000000, 24, 2, 0, 0 },
241fe5e2bcaSjmcneill { 1872000000, 25, 2, 0, 0 },
242fe5e2bcaSjmcneill { 0 }
243fe5e2bcaSjmcneill };
244fe5e2bcaSjmcneill
24501b5a99cSjmcneill static const struct sunxi_ccu_nkmp_tbl sun50i_a64_ac_dig_table[] = {
24601b5a99cSjmcneill { 24576000, 0x55, 0, 0x14, 0x3 },
24701b5a99cSjmcneill { 0 }
24801b5a99cSjmcneill };
24901b5a99cSjmcneill
2500c019004Sjmcneill static struct sunxi_ccu_clk sun50i_a64_ccu_clks[] = {
251fe5e2bcaSjmcneill SUNXI_CCU_NKMP_TABLE(A64_CLK_PLL_CPUX, "pll_cpux", "hosc",
252fe5e2bcaSjmcneill PLL_CPUX_CTRL_REG, /* reg */
253fe5e2bcaSjmcneill __BITS(12,8), /* n */
254fe5e2bcaSjmcneill __BITS(5,4), /* k */
255fe5e2bcaSjmcneill __BITS(1,0), /* m */
256fe5e2bcaSjmcneill __BITS(17,16), /* p */
257fe5e2bcaSjmcneill __BIT(31), /* enable */
258fe5e2bcaSjmcneill __BIT(28), /* lock */
259fe5e2bcaSjmcneill sun50i_a64_cpux_table, /* table */
260fe5e2bcaSjmcneill SUNXI_CCU_NKMP_SCALE_CLOCK | SUNXI_CCU_NKMP_FACTOR_P_POW2),
261fe5e2bcaSjmcneill
2620c019004Sjmcneill SUNXI_CCU_NKMP(A64_CLK_PLL_PERIPH0, "pll_periph0", "hosc",
2630c019004Sjmcneill PLL_PERIPH0_CTRL_REG, /* reg */
2640c019004Sjmcneill __BITS(12,8), /* n */
2650c019004Sjmcneill __BITS(5,4), /* k */
2660c019004Sjmcneill 0, /* m */
2670c019004Sjmcneill __BITS(17,16), /* p */
2680c019004Sjmcneill __BIT(31), /* enable */
2690c019004Sjmcneill SUNXI_CCU_NKMP_DIVIDE_BY_TWO),
270480fd0a8Sjmcneill SUNXI_CCU_FIXED_FACTOR(A64_CLK_PLL_PERIPH0_2X, "pll_periph0_2x", "pll_periph0", 1, 2),
2710c019004Sjmcneill
272d4f5d184Sjmcneill SUNXI_CCU_NKMP(A64_CLK_PLL_PERIPH1, "pll_periph1", "hosc",
273d4f5d184Sjmcneill PLL_PERIPH1_CTRL_REG, /* reg */
274d4f5d184Sjmcneill __BITS(12,8), /* n */
275d4f5d184Sjmcneill __BITS(5,4), /* k */
276d4f5d184Sjmcneill 0, /* m */
277d4f5d184Sjmcneill __BITS(17,16), /* p */
278d4f5d184Sjmcneill __BIT(31), /* enable */
279d4f5d184Sjmcneill SUNXI_CCU_NKMP_DIVIDE_BY_TWO),
280d4f5d184Sjmcneill SUNXI_CCU_FIXED_FACTOR(A64_CLK_PLL_PERIPH1_2X, "pll_periph1_2x", "pll_periph1", 1, 2),
281d4f5d184Sjmcneill
28201b5a99cSjmcneill SUNXI_CCU_NKMP_TABLE(A64_CLK_PLL_AUDIO_BASE, "pll_audio_base", "hosc",
28301b5a99cSjmcneill PLL_AUDIO_CTRL_REG, /* reg */
28401b5a99cSjmcneill __BITS(14,8), /* n */
28501b5a99cSjmcneill 0, /* k */
28601b5a99cSjmcneill __BITS(4,0), /* m */
28701b5a99cSjmcneill __BITS(19,16), /* p */
28801b5a99cSjmcneill __BIT(31), /* enable */
28901b5a99cSjmcneill __BIT(28), /* lock */
29001b5a99cSjmcneill sun50i_a64_ac_dig_table, /* table */
29101b5a99cSjmcneill 0),
29201b5a99cSjmcneill
29301b5a99cSjmcneill SUNXI_CCU_FIXED_FACTOR(A64_CLK_PLL_AUDIO, "pll_audio", "pll_audio_base", 1, 1),
29401b5a99cSjmcneill SUNXI_CCU_FIXED_FACTOR(A64_CLK_PLL_AUDIO_2X, "pll_audio_2x", "pll_audio_base", 1, 2),
29501b5a99cSjmcneill SUNXI_CCU_FIXED_FACTOR(A64_CLK_PLL_AUDIO_4X, "pll_audio_4x", "pll_audio_base", 1, 4),
29601b5a99cSjmcneill SUNXI_CCU_FIXED_FACTOR(A64_CLK_PLL_AUDIO_8X, "pll_audio_8x", "pll_audio_base", 1, 8),
29701b5a99cSjmcneill
298a9d03646Sjmcneill SUNXI_CCU_FRACTIONAL(A64_CLK_PLL_VIDEO0, "pll_video0", "hosc",
299a9d03646Sjmcneill PLL_VIDEO0_CTRL_REG, /* reg */
300a9d03646Sjmcneill __BITS(14,8), /* m */
301a9d03646Sjmcneill 16, /* m_min */
302a9d03646Sjmcneill 50, /* m_max */
303a9d03646Sjmcneill __BIT(24), /* div_en */
304a9d03646Sjmcneill __BIT(25), /* frac_sel */
305a9d03646Sjmcneill 270000000, 297000000, /* frac values */
306a9d03646Sjmcneill __BITS(3,0), /* prediv */
307a9d03646Sjmcneill 4, /* prediv_val */
308a9d03646Sjmcneill __BIT(31), /* enable */
309a9d03646Sjmcneill SUNXI_CCU_FRACTIONAL_PLUSONE | SUNXI_CCU_FRACTIONAL_SET_ENABLE),
310a9d03646Sjmcneill
311a9d03646Sjmcneill SUNXI_CCU_FIXED_FACTOR(A64_CLK_PLL_VIDEO0_2X, "pll_video0_2x", "pll_video0", 1, 2),
312a9d03646Sjmcneill
313a9d03646Sjmcneill SUNXI_CCU_FRACTIONAL(A64_CLK_PLL_VIDEO1, "pll_video1", "hosc",
314a9d03646Sjmcneill PLL_VIDEO1_CTRL_REG, /* reg */
315a9d03646Sjmcneill __BITS(14,8), /* m */
316a9d03646Sjmcneill 16, /* m_min */
317a9d03646Sjmcneill 50, /* m_max */
318a9d03646Sjmcneill __BIT(24), /* div_en */
319a9d03646Sjmcneill __BIT(25), /* frac_sel */
320a9d03646Sjmcneill 270000000, 297000000, /* frac values */
321a9d03646Sjmcneill __BITS(3,0), /* prediv */
322a9d03646Sjmcneill 4, /* prediv_val */
323a9d03646Sjmcneill __BIT(31), /* enable */
324a9d03646Sjmcneill SUNXI_CCU_FRACTIONAL_PLUSONE | SUNXI_CCU_FRACTIONAL_SET_ENABLE),
325a9d03646Sjmcneill
326cf80abdeSjmcneill SUNXI_CCU_FRACTIONAL(A64_CLK_PLL_DE, "pll_de", "hosc",
327a9d03646Sjmcneill PLL_DE_CTRL_REG, /* reg */
328cf80abdeSjmcneill __BITS(14,8), /* m */
329cf80abdeSjmcneill 16, /* m_min */
330cf80abdeSjmcneill 50, /* m_max */
331cf80abdeSjmcneill __BIT(24), /* div_en */
332cf80abdeSjmcneill __BIT(25), /* frac_sel */
333cf80abdeSjmcneill 270000000, 297000000, /* frac values */
334cf80abdeSjmcneill __BITS(3,0), /* prediv */
335cf80abdeSjmcneill 2, /* prediv_val */
336cf80abdeSjmcneill __BIT(31), /* enable */
337a9d03646Sjmcneill SUNXI_CCU_FRACTIONAL_PLUSONE | SUNXI_CCU_FRACTIONAL_SET_ENABLE),
338cf80abdeSjmcneill
339488fbedfSjmcneill SUNXI_CCU_FRACTIONAL(A64_CLK_PLL_GPU, "pll_gpu", "hosc",
340488fbedfSjmcneill PLL_GPU_CTRL_REG, /* reg */
341488fbedfSjmcneill __BITS(14,8), /* m */
342488fbedfSjmcneill 1, /* m_min */
343488fbedfSjmcneill 128, /* m_max */
344488fbedfSjmcneill __BIT(24), /* div_en */
345488fbedfSjmcneill __BIT(25), /* frac_sel */
346488fbedfSjmcneill 270000000, 297000000, /* frac values */
347488fbedfSjmcneill __BITS(3,0), /* prediv */
348488fbedfSjmcneill 4, /* prediv_val */
349488fbedfSjmcneill __BIT(31), /* enable */
350488fbedfSjmcneill SUNXI_CCU_FRACTIONAL_PLUSONE | SUNXI_CCU_FRACTIONAL_SET_ENABLE),
351488fbedfSjmcneill
352*27063f0bSjmcneill SUNXI_CCU_MUX(A64_CLK_CPUX, "cpux", cpux_parents,
353*27063f0bSjmcneill CPUX_AXI_CFG_REG, /* reg */
354*27063f0bSjmcneill __BITS(17,16), /* sel */
355*27063f0bSjmcneill 0),
356*27063f0bSjmcneill
3570c019004Sjmcneill SUNXI_CCU_PREDIV(A64_CLK_AHB1, "ahb1", ahb1_parents,
3580c019004Sjmcneill AHB1_APB1_CFG_REG, /* reg */
3590c019004Sjmcneill __BITS(7,6), /* prediv */
3600c019004Sjmcneill __BIT(3), /* prediv_sel */
3610c019004Sjmcneill __BITS(5,4), /* div */
3620c019004Sjmcneill __BITS(13,12), /* sel */
3630c019004Sjmcneill SUNXI_CCU_PREDIV_POWER_OF_TWO),
3640c019004Sjmcneill
3650c019004Sjmcneill SUNXI_CCU_PREDIV(A64_CLK_AHB2, "ahb2", ahb2_parents,
3660c019004Sjmcneill AHB2_CFG_REG, /* reg */
3670c019004Sjmcneill 0, /* prediv */
3680c019004Sjmcneill __BIT(1), /* prediv_sel */
3690c019004Sjmcneill 0, /* div */
3700c019004Sjmcneill __BITS(1,0), /* sel */
3710c019004Sjmcneill SUNXI_CCU_PREDIV_DIVIDE_BY_TWO),
3720c019004Sjmcneill
3730c019004Sjmcneill SUNXI_CCU_DIV(A64_CLK_APB1, "apb1", apb1_parents,
3740c019004Sjmcneill AHB1_APB1_CFG_REG, /* reg */
3750c019004Sjmcneill __BITS(9,8), /* div */
3760c019004Sjmcneill 0, /* sel */
3770c019004Sjmcneill SUNXI_CCU_DIV_POWER_OF_TWO|SUNXI_CCU_DIV_ZERO_IS_ONE),
3780c019004Sjmcneill
3790c019004Sjmcneill SUNXI_CCU_NM(A64_CLK_APB2, "apb2", apb2_parents,
3800c019004Sjmcneill APB2_CFG_REG, /* reg */
3810c019004Sjmcneill __BITS(17,16), /* n */
3820c019004Sjmcneill __BITS(4,0), /* m */
3830c019004Sjmcneill __BITS(25,24), /* sel */
3840c019004Sjmcneill 0, /* enable */
3850c019004Sjmcneill SUNXI_CCU_NM_POWER_OF_TWO),
3860c019004Sjmcneill
387480fd0a8Sjmcneill SUNXI_CCU_NM(A64_CLK_MMC0, "mmc0", mmc_parents,
388480fd0a8Sjmcneill SDMMC0_CLK_REG, /* reg */
389480fd0a8Sjmcneill __BITS(17,16), /* n */
390480fd0a8Sjmcneill __BITS(3,0), /* m */
391480fd0a8Sjmcneill __BITS(25,24), /* sel */
392480fd0a8Sjmcneill __BIT(31), /* enable */
3936ee8a758Sjmcneill SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN|SUNXI_CCU_NM_DIVIDE_BY_TWO),
394480fd0a8Sjmcneill SUNXI_CCU_NM(A64_CLK_MMC1, "mmc1", mmc_parents,
395480fd0a8Sjmcneill SDMMC1_CLK_REG, /* reg */
396480fd0a8Sjmcneill __BITS(17,16), /* n */
397480fd0a8Sjmcneill __BITS(3,0), /* m */
398480fd0a8Sjmcneill __BITS(25,24), /* sel */
399480fd0a8Sjmcneill __BIT(31), /* enable */
4006ee8a758Sjmcneill SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN|SUNXI_CCU_NM_DIVIDE_BY_TWO),
401480fd0a8Sjmcneill SUNXI_CCU_NM(A64_CLK_MMC2, "mmc2", mmc_parents,
402480fd0a8Sjmcneill SDMMC2_CLK_REG, /* reg */
403480fd0a8Sjmcneill __BITS(17,16), /* n */
404480fd0a8Sjmcneill __BITS(3,0), /* m */
405480fd0a8Sjmcneill __BITS(25,24), /* sel */
406480fd0a8Sjmcneill __BIT(31), /* enable */
4076ee8a758Sjmcneill SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN|SUNXI_CCU_NM_DIVIDE_BY_TWO),
4080c019004Sjmcneill
4091cc7b00cSjmcneill SUNXI_CCU_NM(A64_CLK_CE, "ce", ce_parents,
4101cc7b00cSjmcneill CE_CLK_REG, /* reg */
4111cc7b00cSjmcneill __BITS(17,16), /* n */
4121cc7b00cSjmcneill __BITS(3,0), /* m */
4131cc7b00cSjmcneill __BITS(25,24), /* sel */
4141cc7b00cSjmcneill __BIT(31), /* enable */
41524516a12Sjmcneill SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN),
4161cc7b00cSjmcneill
4175b844f97Sjmcneill SUNXI_CCU_DIV_GATE(A64_CLK_THS, "ths", ths_parents,
4185b844f97Sjmcneill THS_CLK_REG, /* reg */
4195b844f97Sjmcneill __BITS(1,0), /* div */
4205b844f97Sjmcneill __BITS(25,24), /* sel */
4215b844f97Sjmcneill __BIT(31), /* enable */
4225b844f97Sjmcneill SUNXI_CCU_DIV_TIMES_TWO),
4235b844f97Sjmcneill
424cf80abdeSjmcneill SUNXI_CCU_DIV_GATE(A64_CLK_DE, "de", de_parents,
425cf80abdeSjmcneill DE_CLK_REG, /* reg */
426cf80abdeSjmcneill __BITS(3,0), /* div */
427cf80abdeSjmcneill __BITS(26,24), /* sel */
428cf80abdeSjmcneill __BIT(31), /* enable */
429cf80abdeSjmcneill 0),
430cf80abdeSjmcneill
43101b5a99cSjmcneill SUNXI_CCU_GATE(A64_CLK_AC_DIG, "ac-dig", "pll_audio",
43201b5a99cSjmcneill AC_DIG_CLK_REG, 31),
43301b5a99cSjmcneill SUNXI_CCU_GATE(A64_CLK_AC_DIG_4X, "ac-dig-4x", "pll_audio_4x",
43401b5a99cSjmcneill AC_DIG_CLK_REG, 30),
43501b5a99cSjmcneill
436a9d03646Sjmcneill SUNXI_CCU_DIV_GATE(A64_CLK_HDMI, "hdmi", hdmi_parents,
437a9d03646Sjmcneill HDMI_CLK_REG, /* reg */
438a9d03646Sjmcneill __BITS(3,0), /* div */
439a9d03646Sjmcneill __BITS(25,24), /* sel */
440a9d03646Sjmcneill __BIT(31), /* enable */
441a9d03646Sjmcneill 0),
442a9d03646Sjmcneill
443a9d03646Sjmcneill SUNXI_CCU_GATE(A64_CLK_HDMI_DDC, "hdmi-ddc", "hosc",
444a9d03646Sjmcneill HDMI_SLOW_CLK_REG, 31),
445a9d03646Sjmcneill
4462f465beaSjmcneill SUNXI_CCU_DIV_GATE(A64_CLK_I2S0, "i2s0", i2s_parents,
4472f465beaSjmcneill I2SPCM0_CLK_REG, /* reg */
4482f465beaSjmcneill 0, /* div */
4492f465beaSjmcneill __BITS(17,16), /* sel */
4502f465beaSjmcneill __BIT(31), /* enable */
4512f465beaSjmcneill 0),
4522f465beaSjmcneill SUNXI_CCU_DIV_GATE(A64_CLK_I2S1, "i2s1", i2s_parents,
4532f465beaSjmcneill I2SPCM1_CLK_REG, /* reg */
4542f465beaSjmcneill 0, /* div */
4552f465beaSjmcneill __BITS(17,16), /* sel */
4562f465beaSjmcneill __BIT(31), /* enable */
4572f465beaSjmcneill 0),
4582f465beaSjmcneill SUNXI_CCU_DIV_GATE(A64_CLK_I2S2, "i2s2", i2s_parents,
4592f465beaSjmcneill I2SPCM2_CLK_REG, /* reg */
4602f465beaSjmcneill 0, /* div */
4612f465beaSjmcneill __BITS(17,16), /* sel */
4622f465beaSjmcneill __BIT(31), /* enable */
4632f465beaSjmcneill 0),
4642f465beaSjmcneill
465d4f5d184Sjmcneill SUNXI_CCU_NM(A64_CLK_SPI0, "spi0", spi_parents,
466d4f5d184Sjmcneill SPI0_CLK_REG, /* reg */
467d4f5d184Sjmcneill __BITS(17,16), /* n */
468d4f5d184Sjmcneill __BITS(3,0), /* m */
469d4f5d184Sjmcneill __BITS(25,24), /* sel */
470d4f5d184Sjmcneill __BIT(31), /* enable */
471d4f5d184Sjmcneill SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN),
472d4f5d184Sjmcneill
473d4f5d184Sjmcneill SUNXI_CCU_NM(A64_CLK_SPI1, "spi1", spi_parents,
474d4f5d184Sjmcneill SPI1_CLK_REG, /* reg */
475d4f5d184Sjmcneill __BITS(17,16), /* n */
476d4f5d184Sjmcneill __BITS(3,0), /* m */
477d4f5d184Sjmcneill __BITS(25,24), /* sel */
478d4f5d184Sjmcneill __BIT(31), /* enable */
479d4f5d184Sjmcneill SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN),
4802f465beaSjmcneill
4815f932b1aSjmcneill SUNXI_CCU_DIV_GATE(A64_CLK_TCON0, "tcon0", tcon0_parents,
4825f932b1aSjmcneill TCON0_CLK_REG, /* reg */
4835f932b1aSjmcneill 0, /* div */
4845f932b1aSjmcneill __BITS(26,24), /* sel */
4855f932b1aSjmcneill __BIT(31), /* enable */
4865f932b1aSjmcneill 0),
4875f932b1aSjmcneill
488a9d03646Sjmcneill SUNXI_CCU_DIV_GATE(A64_CLK_TCON1, "tcon1", tcon1_parents,
489a9d03646Sjmcneill TCON1_CLK_REG, /* reg */
490a9d03646Sjmcneill __BITS(3,0), /* div */
491a9d03646Sjmcneill __BITS(25,24), /* sel */
492a9d03646Sjmcneill __BIT(31), /* enable */
493a9d03646Sjmcneill 0),
494a9d03646Sjmcneill
495488fbedfSjmcneill SUNXI_CCU_DIV_GATE(A64_CLK_GPU, "gpu", gpu_parents,
496488fbedfSjmcneill GPU_CLK_REG, /* reg */
497488fbedfSjmcneill __BITS(2,0), /* div */
498488fbedfSjmcneill 0, /* sel */
499488fbedfSjmcneill __BIT(31), /* enable */
500488fbedfSjmcneill 0),
501488fbedfSjmcneill
5020c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_MIPI_DSI, "bus-mipi-dsi", "ahb1",
5030c019004Sjmcneill BUS_CLK_GATING_REG0, 1),
5040c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_CE, "bus-ce", "ahb1",
5050c019004Sjmcneill BUS_CLK_GATING_REG0, 5),
5060c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_DMA, "bus-dma", "ahb1",
5070c019004Sjmcneill BUS_CLK_GATING_REG0, 6),
5080c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_MMC0, "bus-mmc0", "ahb1",
5090c019004Sjmcneill BUS_CLK_GATING_REG0, 8),
5100c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_MMC1, "bus-mmc1", "ahb1",
5110c019004Sjmcneill BUS_CLK_GATING_REG0, 9),
5120c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_MMC2, "bus-mmc2", "ahb1",
5130c019004Sjmcneill BUS_CLK_GATING_REG0, 10),
5140c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_NAND, "bus-nand", "ahb1",
5150c019004Sjmcneill BUS_CLK_GATING_REG0, 13),
5160c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_DRAM, "bus-dram", "ahb1",
5170c019004Sjmcneill BUS_CLK_GATING_REG0, 14),
5180c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_EMAC, "bus-emac", "ahb2",
5190c019004Sjmcneill BUS_CLK_GATING_REG0, 17),
5200c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_TS, "bus-ts", "ahb1",
5210c019004Sjmcneill BUS_CLK_GATING_REG0, 18),
5220c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_HSTIMER, "bus-hstimer", "ahb1",
5230c019004Sjmcneill BUS_CLK_GATING_REG0, 19),
5240c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_SPI0, "bus-spi0", "ahb1",
5250c019004Sjmcneill BUS_CLK_GATING_REG0, 20),
5260c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_SPI1, "bus-spi1", "ahb1",
5270c019004Sjmcneill BUS_CLK_GATING_REG0, 21),
5280c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_OTG, "bus-otg", "ahb1",
5290c019004Sjmcneill BUS_CLK_GATING_REG0, 23),
5300c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_EHCI0, "bus-ehci0", "ahb1",
5310c019004Sjmcneill BUS_CLK_GATING_REG0, 24),
5320c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_EHCI1, "bus-ehci1", "ahb2",
5330c019004Sjmcneill BUS_CLK_GATING_REG0, 25),
5340c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_OHCI0, "bus-ohci0", "ahb1",
5350f90b2a8Sjmcneill BUS_CLK_GATING_REG0, 28),
5360c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_OHCI1, "bus-ohci1", "ahb2",
5370f90b2a8Sjmcneill BUS_CLK_GATING_REG0, 29),
5380c019004Sjmcneill
5390c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_VE, "bus-ve", "ahb1",
5400c019004Sjmcneill BUS_CLK_GATING_REG1, 0),
5410c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_TCON0, "bus-tcon0", "ahb1",
5420c019004Sjmcneill BUS_CLK_GATING_REG1, 3),
5430c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_TCON1, "bus-tcon1", "ahb1",
5440c019004Sjmcneill BUS_CLK_GATING_REG1, 4),
5450c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_DEINTERLACE, "bus-deinterlace", "ahb1",
5460c019004Sjmcneill BUS_CLK_GATING_REG1, 5),
5470c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_CSI, "bus-csi", "ahb1",
5480c019004Sjmcneill BUS_CLK_GATING_REG1, 8),
5490c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_HDMI, "bus-hdmi", "ahb1",
5505782d46fSjmcneill BUS_CLK_GATING_REG1, 11),
5510c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_DE, "bus-de", "ahb1",
5520c019004Sjmcneill BUS_CLK_GATING_REG1, 12),
5530c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_GPU, "bus-gpu", "ahb1",
5540c019004Sjmcneill BUS_CLK_GATING_REG1, 20),
5550c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_MSGBOX, "bus-msgbox", "ahb1",
5560c019004Sjmcneill BUS_CLK_GATING_REG1, 21),
5570c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_SPINLOCK, "bus-spinlock", "ahb1",
5580c019004Sjmcneill BUS_CLK_GATING_REG1, 22),
5590c019004Sjmcneill
560b7a7ee85Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_CODEC, "bus-codec", "apb1",
561b7a7ee85Sjmcneill BUS_CLK_GATING_REG2, 0),
562b7a7ee85Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_SPDIF, "bus-spdif", "apb1",
563b7a7ee85Sjmcneill BUS_CLK_GATING_REG2, 1),
564b7a7ee85Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_PIO, "bus-pio", "apb1",
565b7a7ee85Sjmcneill BUS_CLK_GATING_REG2, 5),
5665b844f97Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_THS, "bus-ths", "apb1",
5675b844f97Sjmcneill BUS_CLK_GATING_REG2, 8),
5680c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_I2S0, "bus-i2s0", "apb1",
569b7a7ee85Sjmcneill BUS_CLK_GATING_REG2, 12),
5700c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_I2S1, "bus-i2s1", "apb1",
571b7a7ee85Sjmcneill BUS_CLK_GATING_REG2, 13),
5720c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_I2S2, "bus-i2s2", "apb1",
573b7a7ee85Sjmcneill BUS_CLK_GATING_REG2, 14),
5740c019004Sjmcneill
5750c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_I2C0, "bus-i2c0", "apb2",
576b7a7ee85Sjmcneill BUS_CLK_GATING_REG3, 0),
5770c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_I2C1, "bus-i2c1", "apb2",
578b7a7ee85Sjmcneill BUS_CLK_GATING_REG3, 1),
5790c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_I2C2, "bus-i2c2", "apb2",
580b7a7ee85Sjmcneill BUS_CLK_GATING_REG3, 2),
5810c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_SCR, "bus-scr", "apb2",
582b7a7ee85Sjmcneill BUS_CLK_GATING_REG3, 5),
5830c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_UART0, "bus-uart0", "apb2",
584b7a7ee85Sjmcneill BUS_CLK_GATING_REG3, 16),
5850c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_UART1, "bus-uart1", "apb2",
586b7a7ee85Sjmcneill BUS_CLK_GATING_REG3, 17),
5870c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_UART2, "bus-uart2", "apb2",
588b7a7ee85Sjmcneill BUS_CLK_GATING_REG3, 18),
5890c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_UART3, "bus-uart3", "apb2",
590b7a7ee85Sjmcneill BUS_CLK_GATING_REG3, 19),
5910c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_BUS_UART4, "bus-uart4", "apb2",
592b7a7ee85Sjmcneill BUS_CLK_GATING_REG3, 20),
5930c019004Sjmcneill
5940c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_USB_PHY0, "usb-phy0", "hosc",
5950c019004Sjmcneill USBPHY_CFG_REG, 8),
5960c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_USB_PHY1, "usb-phy1", "hosc",
5970c019004Sjmcneill USBPHY_CFG_REG, 9),
5980c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_USB_HSIC, "usb-hsic", "hosc",
5990c019004Sjmcneill USBPHY_CFG_REG, 10),
6000c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_USB_HSIC_12M, "usb-hsic-12m", "hosc",
6010c019004Sjmcneill USBPHY_CFG_REG, 11),
6020c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_USB_OHCI0, "usb-ohci0", "hosc",
6030c019004Sjmcneill USBPHY_CFG_REG, 16),
6040c019004Sjmcneill SUNXI_CCU_GATE(A64_CLK_USB_OHCI1, "usb-ohci1", "usb-ohci0",
6050c019004Sjmcneill USBPHY_CFG_REG, 17),
6060c019004Sjmcneill };
6070c019004Sjmcneill
6080c019004Sjmcneill static int
sun50i_a64_ccu_match(device_t parent,cfdata_t cf,void * aux)6090c019004Sjmcneill sun50i_a64_ccu_match(device_t parent, cfdata_t cf, void *aux)
6100c019004Sjmcneill {
6110c019004Sjmcneill struct fdt_attach_args * const faa = aux;
6120c019004Sjmcneill
6136e54367aSthorpej return of_compatible_match(faa->faa_phandle, compat_data);
6140c019004Sjmcneill }
6150c019004Sjmcneill
6160c019004Sjmcneill static void
sun50i_a64_ccu_attach(device_t parent,device_t self,void * aux)6170c019004Sjmcneill sun50i_a64_ccu_attach(device_t parent, device_t self, void *aux)
6180c019004Sjmcneill {
6190c019004Sjmcneill struct sunxi_ccu_softc * const sc = device_private(self);
6200c019004Sjmcneill struct fdt_attach_args * const faa = aux;
6213f206565Sjmcneill prop_dictionary_t prop = device_properties(self);
6223f206565Sjmcneill bool nomodeset;
6230c019004Sjmcneill
6240c019004Sjmcneill sc->sc_dev = self;
6250c019004Sjmcneill sc->sc_phandle = faa->faa_phandle;
6260c019004Sjmcneill sc->sc_bst = faa->faa_bst;
6270c019004Sjmcneill
6280c019004Sjmcneill sc->sc_resets = sun50i_a64_ccu_resets;
6290c019004Sjmcneill sc->sc_nresets = __arraycount(sun50i_a64_ccu_resets);
6300c019004Sjmcneill
6310c019004Sjmcneill sc->sc_clks = sun50i_a64_ccu_clks;
6320c019004Sjmcneill sc->sc_nclks = __arraycount(sun50i_a64_ccu_clks);
6330c019004Sjmcneill
6340c019004Sjmcneill if (sunxi_ccu_attach(sc) != 0)
6350c019004Sjmcneill return;
6360c019004Sjmcneill
6370c019004Sjmcneill aprint_naive("\n");
6380c019004Sjmcneill aprint_normal(": A64 CCU\n");
6390c019004Sjmcneill
6403f206565Sjmcneill nomodeset = false;
6413f206565Sjmcneill prop_dictionary_get_bool(prop, "nomodeset", &nomodeset);
6423f206565Sjmcneill if (!nomodeset) {
643a9d03646Sjmcneill /* Set DE parent to PLL_DE */
644a9d03646Sjmcneill clk_set_parent(&sc->sc_clks[A64_CLK_DE].base, &sc->sc_clks[A64_CLK_PLL_DE].base);
645a9d03646Sjmcneill clk_set_rate(&sc->sc_clks[A64_CLK_PLL_DE].base, 420000000);
646a9d03646Sjmcneill
6473153dc2cSjmcneill /* Set video PLLs to 297 MHz */
6483153dc2cSjmcneill clk_set_rate(&sc->sc_clks[A64_CLK_PLL_VIDEO0].base, 297000000);
6493153dc2cSjmcneill clk_set_rate(&sc->sc_clks[A64_CLK_PLL_VIDEO1].base, 297000000);
6503153dc2cSjmcneill
651a4407249Sjmcneill /* Set TCON1 parent to PLL_VIDEO1(1X) */
652a4407249Sjmcneill clk_set_parent(&sc->sc_clks[A64_CLK_TCON1].base, &sc->sc_clks[A64_CLK_PLL_VIDEO1].base);
6533153dc2cSjmcneill
6543153dc2cSjmcneill /* Set HDMI parent to PLL_VIDEO1(1X) */
6553153dc2cSjmcneill clk_set_parent(&sc->sc_clks[A64_CLK_HDMI].base, &sc->sc_clks[A64_CLK_PLL_VIDEO1].base);
6563f206565Sjmcneill }
657a4407249Sjmcneill
6580c019004Sjmcneill sunxi_ccu_print(sc);
6590c019004Sjmcneill }
660