xref: /netbsd-src/sys/arch/arm/sunxi/sun50i_h6_ccu.c (revision 6e54367a22fbc89a1139d033e95bec0c0cf0975b)
1*6e54367aSthorpej /* $NetBSD: sun50i_h6_ccu.c,v 1.4 2021/01/27 03:10:20 thorpej Exp $ */
286f4652dSjmcneill 
386f4652dSjmcneill /*-
486f4652dSjmcneill  * Copyright (c) 2018 Jared McNeill <jmcneill@invisible.ca>
586f4652dSjmcneill  * All rights reserved.
686f4652dSjmcneill  *
786f4652dSjmcneill  * Redistribution and use in source and binary forms, with or without
886f4652dSjmcneill  * modification, are permitted provided that the following conditions
986f4652dSjmcneill  * are met:
1086f4652dSjmcneill  * 1. Redistributions of source code must retain the above copyright
1186f4652dSjmcneill  *    notice, this list of conditions and the following disclaimer.
1286f4652dSjmcneill  * 2. Redistributions in binary form must reproduce the above copyright
1386f4652dSjmcneill  *    notice, this list of conditions and the following disclaimer in the
1486f4652dSjmcneill  *    documentation and/or other materials provided with the distribution.
1586f4652dSjmcneill  *
1686f4652dSjmcneill  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1786f4652dSjmcneill  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1886f4652dSjmcneill  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1986f4652dSjmcneill  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2086f4652dSjmcneill  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
2186f4652dSjmcneill  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
2286f4652dSjmcneill  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
2386f4652dSjmcneill  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
2486f4652dSjmcneill  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2586f4652dSjmcneill  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2686f4652dSjmcneill  * SUCH DAMAGE.
2786f4652dSjmcneill  */
2886f4652dSjmcneill 
2986f4652dSjmcneill #include <sys/cdefs.h>
3086f4652dSjmcneill 
31*6e54367aSthorpej __KERNEL_RCSID(1, "$NetBSD: sun50i_h6_ccu.c,v 1.4 2021/01/27 03:10:20 thorpej Exp $");
3286f4652dSjmcneill 
3386f4652dSjmcneill #include <sys/param.h>
3486f4652dSjmcneill #include <sys/bus.h>
3586f4652dSjmcneill #include <sys/device.h>
3686f4652dSjmcneill #include <sys/systm.h>
3786f4652dSjmcneill 
3886f4652dSjmcneill #include <dev/fdt/fdtvar.h>
3986f4652dSjmcneill 
4086f4652dSjmcneill #include <arm/sunxi/sunxi_ccu.h>
4186f4652dSjmcneill #include <arm/sunxi/sun50i_h6_ccu.h>
4286f4652dSjmcneill 
436376e18fSjakllsch #define	PLL_CPUX_CTRL_REG	0x000
4486f4652dSjmcneill #define	PLL_PERI0_CTRL_REG	0x020
45661f966eSjakllsch #define	PSI_AHB1_AHB2_CFG_REG	0x510
4686f4652dSjmcneill #define	AHB3_CFG_REG		0x51c
4786f4652dSjmcneill #define	APB2_CFG_REG		0x524
4886f4652dSjmcneill #define	MBUS_CFG_REG		0x540
4986f4652dSjmcneill #define	DE_BGR_REG		0x60c
5086f4652dSjmcneill #define	DI_BGR_REG		0x62c
5186f4652dSjmcneill #define	GPU_BGR_REG		0x67c
5286f4652dSjmcneill #define	CE_BGR_REG		0x68c
5386f4652dSjmcneill #define	VE_BGR_REG		0x69c
5486f4652dSjmcneill #define	EMCE_BGR_REG		0x6bc
5586f4652dSjmcneill #define	VP9_BGR_REG		0x6cc
5686f4652dSjmcneill #define	DMA_BGR_REG		0x70c
5786f4652dSjmcneill #define	MSGBOX_BGR_REG		0x71c
5886f4652dSjmcneill #define	SPINLOCK_BGR_REG	0x72c
5986f4652dSjmcneill #define	HSTIMER_BGR_REG		0x73c
6086f4652dSjmcneill #define	DBGSYS_BGR_REG		0x78c
6186f4652dSjmcneill #define	PSI_BGR_REG		0x79c
6286f4652dSjmcneill #define	PWM_BGR_REG		0x7ac
6386f4652dSjmcneill #define	DRAM_CLK_REG		0x800
6486f4652dSjmcneill #define	NAND_BGR_REG		0x82c
6586f4652dSjmcneill #define	SMHC0_CLK_REG		0x830
6686f4652dSjmcneill #define	SMHC1_CLK_REG		0x834
6786f4652dSjmcneill #define	SMHC2_CLK_REG		0x838
6886f4652dSjmcneill #define	SMHC_BGR_REG		0x84c
6986f4652dSjmcneill #define	UART_BGR_REG		0x90c
7086f4652dSjmcneill #define	TWI_BGR_REG		0x91c
7186f4652dSjmcneill #define	SCR_BGR_REG		0x93c
7286f4652dSjmcneill #define	SPI_BGR_REG		0x96c
7386f4652dSjmcneill #define	EMAC_BGR_REG		0x97c
7486f4652dSjmcneill #define	TS_BGR_REG		0x9bc
7586f4652dSjmcneill #define	CIRTX_BGR_REG		0x9cc
7686f4652dSjmcneill #define	THS_BGR_REG		0x9fc
7786f4652dSjmcneill #define	I2S_PCM_BGR_REG		0xa1c
7886f4652dSjmcneill #define	OWA_BGR_REG		0xa2c
7986f4652dSjmcneill #define	DMIC_BGR_REG		0xa4c
8086f4652dSjmcneill #define	AUDIO_HUB_BGR_REG	0xa6c
8186f4652dSjmcneill #define	USB0_CLK_REG		0xa70
8286f4652dSjmcneill #define	USB1_CLK_REG		0xa74
8386f4652dSjmcneill #define	USB3_CLK_REG		0xa7c
8486f4652dSjmcneill #define	USB_BGR_REG		0xa8c
85661f966eSjakllsch #define	PCIE_REF_CLK_REG	0xab0
86661f966eSjakllsch #define	PCIE_AXI_CLK_REG	0xab4
87661f966eSjakllsch #define	PCIE_AUX_CLK_REG	0xab8
8886f4652dSjmcneill #define	PCIE_BGR_REG		0xabc
8986f4652dSjmcneill #define	HDMI_BGR_REG		0xb1c
9086f4652dSjmcneill #define	DISPLAY_IF_TOP_BGR_REG	0xb5c
9186f4652dSjmcneill #define	TCON_LCD_BGR_REG	0xb7c
9286f4652dSjmcneill #define	TCON_TV_BGR_REG		0xb9c
9386f4652dSjmcneill #define	CSI_BGR_REG		0xc2c
9486f4652dSjmcneill #define	HDMI_HDCP_BGR_REG	0xc4c
9586f4652dSjmcneill 
9686f4652dSjmcneill static int sun50i_h6_ccu_match(device_t, cfdata_t, void *);
9786f4652dSjmcneill static void sun50i_h6_ccu_attach(device_t, device_t, void *);
9886f4652dSjmcneill 
99*6e54367aSthorpej static const struct device_compatible_entry compat_data[] = {
100*6e54367aSthorpej 	{ .compat = "allwinner,sun50i-h6-ccu" },
101*6e54367aSthorpej 	DEVICE_COMPAT_EOL
10286f4652dSjmcneill };
10386f4652dSjmcneill 
10486f4652dSjmcneill CFATTACH_DECL_NEW(sunxi_h6_ccu, sizeof(struct sunxi_ccu_softc),
10586f4652dSjmcneill 	sun50i_h6_ccu_match, sun50i_h6_ccu_attach, NULL, NULL);
10686f4652dSjmcneill 
10786f4652dSjmcneill static struct sunxi_ccu_reset sun50i_h6_ccu_resets[] = {
10886f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_MBUS, MBUS_CFG_REG, 30),
10986f4652dSjmcneill 
11086f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_DE, DE_BGR_REG, 16),
11186f4652dSjmcneill 
11286f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_DEINTERLACE, DI_BGR_REG, 16),
11386f4652dSjmcneill 
11486f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_GPU, GPU_BGR_REG, 16),
11586f4652dSjmcneill 
11686f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_CE, CE_BGR_REG, 16),
11786f4652dSjmcneill 
11886f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_VE, VE_BGR_REG, 16),
11986f4652dSjmcneill 
12086f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_EMCE, EMCE_BGR_REG, 16),
12186f4652dSjmcneill 
12286f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_VP9, VP9_BGR_REG, 16),
12386f4652dSjmcneill 
12486f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_DMA, DMA_BGR_REG, 16),
12586f4652dSjmcneill 
12686f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_MSGBOX, MSGBOX_BGR_REG, 16),
12786f4652dSjmcneill 
12886f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_SPINLOCK, SPINLOCK_BGR_REG, 16),
12986f4652dSjmcneill 
13086f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_HSTIMER, HSTIMER_BGR_REG, 16),
13186f4652dSjmcneill 
13286f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_DBG, DBGSYS_BGR_REG, 16),
13386f4652dSjmcneill 
13486f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_PSI, PSI_BGR_REG, 16),
13586f4652dSjmcneill 
13686f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_PWM, PWM_BGR_REG, 16),
13786f4652dSjmcneill 
13886f4652dSjmcneill 	/* H6_RST_BUS_IOMMU: No bit defined in user manual */
13986f4652dSjmcneill 
14086f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_DRAM, DRAM_CLK_REG, 30),
14186f4652dSjmcneill 
14286f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_NAND, NAND_BGR_REG, 16),
14386f4652dSjmcneill 
14486f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_MMC0, SMHC_BGR_REG, 16),
14586f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_MMC1, SMHC_BGR_REG, 17),
14686f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_MMC2, SMHC_BGR_REG, 18),
14786f4652dSjmcneill 
14886f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_UART0, UART_BGR_REG, 16),
14986f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_UART1, UART_BGR_REG, 17),
15086f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_UART2, UART_BGR_REG, 18),
15186f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_UART3, UART_BGR_REG, 19),
15286f4652dSjmcneill 
15386f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_I2C0, TWI_BGR_REG, 16),
15486f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_I2C1, TWI_BGR_REG, 17),
15586f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_I2C2, TWI_BGR_REG, 18),
15686f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_I2C3, TWI_BGR_REG, 19),
15786f4652dSjmcneill 
15886f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_SCR0, SCR_BGR_REG, 16),
15986f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_SCR1, SCR_BGR_REG, 17),
16086f4652dSjmcneill 
16186f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_SPI0, SPI_BGR_REG, 16),
16286f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_SPI1, SPI_BGR_REG, 17),
16386f4652dSjmcneill 
16486f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_EMAC, EMAC_BGR_REG, 16),
16586f4652dSjmcneill 
16686f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_TS, TS_BGR_REG, 16),
16786f4652dSjmcneill 
16886f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_IR_TX, CIRTX_BGR_REG, 16),
16986f4652dSjmcneill 
17086f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_THS, THS_BGR_REG, 16),
17186f4652dSjmcneill 
17286f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_I2S0, I2S_PCM_BGR_REG, 16),
17386f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_I2S1, I2S_PCM_BGR_REG, 17),
17486f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_I2S2, I2S_PCM_BGR_REG, 18),
17586f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_I2S3, I2S_PCM_BGR_REG, 19),
17686f4652dSjmcneill 
17786f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_SPDIF, OWA_BGR_REG, 16),
17886f4652dSjmcneill 
17986f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_DMIC, DMIC_BGR_REG, 16),
18086f4652dSjmcneill 
18186f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_AUDIO_HUB, AUDIO_HUB_BGR_REG, 16),
18286f4652dSjmcneill 
18386f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_USB_PHY0, USB0_CLK_REG, 30),
18486f4652dSjmcneill 
18586f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_USB_PHY1, USB1_CLK_REG, 30),
18686f4652dSjmcneill 
18786f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_USB_PHY3, USB3_CLK_REG, 30),
18886f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_USB_HSIC, USB3_CLK_REG, 28),
18986f4652dSjmcneill 
19086f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_OHCI0, USB_BGR_REG, 16),
19186f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_OHCI3, USB_BGR_REG, 19),
19286f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_EHCI0, USB_BGR_REG, 20),
19386f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_XHCI, USB_BGR_REG, 21),
19486f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_EHCI3, USB_BGR_REG, 23),
19586f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_OTG, USB_BGR_REG, 24),
19686f4652dSjmcneill 
19786f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_PCIE, PCIE_BGR_REG, 16),
19886f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_PCIE_POWERUP, PCIE_BGR_REG, 17),
19986f4652dSjmcneill 
20086f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_HDMI, HDMI_BGR_REG, 16),
20186f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_HDMI_SUB, HDMI_BGR_REG, 17),
20286f4652dSjmcneill 
20386f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_TCON_TOP, DISPLAY_IF_TOP_BGR_REG, 16),
20486f4652dSjmcneill 
20586f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_TCON_LCD0, TCON_LCD_BGR_REG, 16),
20686f4652dSjmcneill 
20786f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_TCON_TV0, TCON_TV_BGR_REG, 16),
20886f4652dSjmcneill 
20986f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_CSI, CSI_BGR_REG, 16),
21086f4652dSjmcneill 
21186f4652dSjmcneill 	SUNXI_CCU_RESET(H6_RST_BUS_HDCP, HDMI_HDCP_BGR_REG, 16),
21286f4652dSjmcneill };
21386f4652dSjmcneill 
21486f4652dSjmcneill static const char *ahb3_parents[] = { "hosc", "losc", "psi", "pll_periph0" };
21586f4652dSjmcneill static const char *apb2_parents[] = { "hosc", "losc", "psi", "pll_periph0" };
21686f4652dSjmcneill static const char *mod_parents[] = { "hosc", "pll_periph0_2x", "pll_periph1_2x" };
217661f966eSjakllsch static const char *hosc_parent[] = { "hosc" };
218661f966eSjakllsch static const char *pll_periph0_parent[] = { "pll_periph0" };
219661f966eSjakllsch static const char *psi_ahb1_ahb2_parents[] = { "hosc", "losc", "iosc", "pll_periph0" };
22086f4652dSjmcneill 
22186f4652dSjmcneill static struct sunxi_ccu_clk sun50i_h6_ccu_clks[] = {
22286f4652dSjmcneill 	SUNXI_CCU_FIXED_FACTOR(H6_CLK_OSC12M, "osc12m", "hosc", 2, 1),
22386f4652dSjmcneill 
2246376e18fSjakllsch 	SUNXI_CCU_NKMP_TABLE(H6_CLK_PLL_CPUX, "pll_cpux", "hosc",
2256376e18fSjakllsch 	    PLL_CPUX_CTRL_REG,		/* reg */
2266376e18fSjakllsch 	    __BITS(15,8),		/* n */
2276376e18fSjakllsch 	    0,				/* k */
2286376e18fSjakllsch 	    __BITS(1,0),		/* m */
2296376e18fSjakllsch 	    __BITS(17,16),		/* p */
2306376e18fSjakllsch 	    __BIT(31),			/* enable */
2316376e18fSjakllsch 	    __BIT(28),			/* lock */
2326376e18fSjakllsch 	    NULL,			/* table */
2336376e18fSjakllsch 	    SUNXI_CCU_NKMP_SCALE_CLOCK | SUNXI_CCU_NKMP_FACTOR_P_POW2),
2346376e18fSjakllsch 
23586f4652dSjmcneill 	SUNXI_CCU_NKMP(H6_CLK_PLL_PERIPH0_4X, "pll_periph0_4x", "hosc",
23686f4652dSjmcneill 	    PLL_PERI0_CTRL_REG,		/* reg */
23786f4652dSjmcneill 	    __BITS(15,8),		/* n */
23886f4652dSjmcneill 	    0,		 		/* k */
23986f4652dSjmcneill 	    __BIT(1),			/* m */
24086f4652dSjmcneill 	    __BIT(0),			/* p */
24186f4652dSjmcneill 	    __BIT(31),			/* enable */
24286f4652dSjmcneill 	    0),
24386f4652dSjmcneill 	SUNXI_CCU_FIXED_FACTOR(H6_CLK_PLL_PERIPH0_2X, "pll_periph0_2x", "pll_periph0_4x", 2, 1),
24486f4652dSjmcneill 	SUNXI_CCU_FIXED_FACTOR(H6_CLK_PLL_PERIPH0, "pll_periph0", "pll_periph0_4x", 4, 1),
24586f4652dSjmcneill 
24686f4652dSjmcneill 	SUNXI_CCU_NM(H6_CLK_AHB3, "ahb3", ahb3_parents,
24786f4652dSjmcneill 	    AHB3_CFG_REG,	/* reg */
24886f4652dSjmcneill 	    __BITS(9,8),	/* n */
24986f4652dSjmcneill 	    __BITS(1,0),	/* m */
25086f4652dSjmcneill 	    __BITS(25,24),	/* sel */
25186f4652dSjmcneill 	    0,			/* enable */
25286f4652dSjmcneill 	    SUNXI_CCU_NM_POWER_OF_TWO),
25386f4652dSjmcneill 
25486f4652dSjmcneill 	SUNXI_CCU_NM(H6_CLK_APB2, "apb2", apb2_parents,
25586f4652dSjmcneill 	    APB2_CFG_REG,	/* reg */
25686f4652dSjmcneill 	    __BITS(9,8),	/* n */
25786f4652dSjmcneill 	    __BITS(1,0),	/* m */
25886f4652dSjmcneill 	    __BITS(25,24),	/* sel */
25986f4652dSjmcneill 	    0,			/* enable */
26086f4652dSjmcneill 	    SUNXI_CCU_NM_POWER_OF_TWO),
26186f4652dSjmcneill 
26286f4652dSjmcneill 	SUNXI_CCU_NM(H6_CLK_MMC0, "mmc0", mod_parents,
26386f4652dSjmcneill 	    SMHC0_CLK_REG,	/* reg */
26486f4652dSjmcneill 	    __BITS(9,8),	/* n */
26586f4652dSjmcneill 	    __BITS(3,0),	/* m */
26686f4652dSjmcneill 	    __BITS(25,24),	/* sel */
26786f4652dSjmcneill 	    __BIT(31),		/* enable */
26886f4652dSjmcneill 	    SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN),
26986f4652dSjmcneill 	SUNXI_CCU_NM(H6_CLK_MMC1, "mmc1", mod_parents,
27086f4652dSjmcneill 	    SMHC1_CLK_REG,	/* reg */
27186f4652dSjmcneill 	    __BITS(9,8),	/* n */
27286f4652dSjmcneill 	    __BITS(3,0),	/* m */
27386f4652dSjmcneill 	    __BITS(25,24),	/* sel */
27486f4652dSjmcneill 	    __BIT(31),		/* enable */
27586f4652dSjmcneill 	    SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN),
27686f4652dSjmcneill 	SUNXI_CCU_NM(H6_CLK_MMC2, "mmc2", mod_parents,
27786f4652dSjmcneill 	    SMHC2_CLK_REG,	/* reg */
27886f4652dSjmcneill 	    __BITS(9,8),	/* n */
27986f4652dSjmcneill 	    __BITS(3,0),	/* m */
28086f4652dSjmcneill 	    __BITS(25,24),	/* sel */
28186f4652dSjmcneill 	    __BIT(31),		/* enable */
28286f4652dSjmcneill 	    SUNXI_CCU_NM_POWER_OF_TWO|SUNXI_CCU_NM_ROUND_DOWN),
28386f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_BUS_MMC0, "bus-mmc0", "mmc0",
28486f4652dSjmcneill 	    SMHC_BGR_REG, 0),
28586f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_BUS_MMC1, "bus-mmc1", "mmc1",
28686f4652dSjmcneill 	    SMHC_BGR_REG, 1),
28786f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_BUS_MMC2, "bus-mmc2", "mmc2",
28886f4652dSjmcneill 	    SMHC_BGR_REG, 2),
28986f4652dSjmcneill 
29086f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_BUS_UART0, "bus-uart0", "apb2",
29186f4652dSjmcneill 	    UART_BGR_REG, 0),
29286f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_BUS_UART1, "bus-uart1", "apb2",
29386f4652dSjmcneill 	    UART_BGR_REG, 1),
29486f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_BUS_UART2, "bus-uart2", "apb2",
29586f4652dSjmcneill 	    UART_BGR_REG, 2),
29686f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_BUS_UART3, "bus-uart3", "apb2",
29786f4652dSjmcneill 	    UART_BGR_REG, 3),
29886f4652dSjmcneill 
29986f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_BUS_I2C0, "bus-i2c0", "apb2",
30086f4652dSjmcneill 	    TWI_BGR_REG, 0),
30186f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_BUS_I2C1, "bus-i2c1", "apb2",
30286f4652dSjmcneill 	    TWI_BGR_REG, 1),
30386f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_BUS_I2C2, "bus-i2c2", "apb2",
30486f4652dSjmcneill 	    TWI_BGR_REG, 2),
30586f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_BUS_I2C3, "bus-i2c3", "apb2",
30686f4652dSjmcneill 	    TWI_BGR_REG, 3),
30786f4652dSjmcneill 
30886f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_USB_OHCI0, "usb-ohci0", "ahb3",
30986f4652dSjmcneill 	    USB0_CLK_REG, 31),
31086f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_USB_PHY0, "usb-phy0", "ahb3",
31186f4652dSjmcneill 	    USB0_CLK_REG, 29),
31286f4652dSjmcneill 
31386f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_USB_PHY1, "usb-phy1", "ahb3",
31486f4652dSjmcneill 	    USB1_CLK_REG, 29),
31586f4652dSjmcneill 
31686f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_USB_OHCI3, "usb-ohci3", "ahb3",
31786f4652dSjmcneill 	    USB3_CLK_REG, 31),
31886f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_USB_PHY3, "usb-phy3", "ahb3",
31986f4652dSjmcneill 	    USB3_CLK_REG, 29),
32086f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_USB_HSIC_12M, "usb-hsic-12m", "osc12m",
32186f4652dSjmcneill 	    USB3_CLK_REG, 27),
32286f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_USB_HSIC, "usb-hsic", "ahb3",
32386f4652dSjmcneill 	    USB3_CLK_REG, 26),
32486f4652dSjmcneill 
32586f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_BUS_OHCI0, "bus-ohci0", "ahb3",
32686f4652dSjmcneill 	    USB_BGR_REG, 0),
32786f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_BUS_OHCI3, "bus-ohci3", "ahb3",
32886f4652dSjmcneill 	    USB_BGR_REG, 3),
32986f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_BUS_EHCI0, "bus-ehci0", "ahb3",
33086f4652dSjmcneill 	    USB_BGR_REG, 4),
33186f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_BUS_XHCI, "bus-xhci", "ahb3",
33286f4652dSjmcneill 	    USB_BGR_REG, 5),
33386f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_BUS_EHCI3, "bus-ehci3", "ahb3",
33486f4652dSjmcneill 	    USB_BGR_REG, 7),
33586f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_BUS_OTG, "bus-otg", "ahb3",
33686f4652dSjmcneill 	    USB_BGR_REG, 8),
33786f4652dSjmcneill 
33886f4652dSjmcneill 	SUNXI_CCU_GATE(H6_CLK_BUS_EMAC, "bus-emac", "ahb3",
33986f4652dSjmcneill 	    EMAC_BGR_REG, 0),
340661f966eSjakllsch 
341661f966eSjakllsch 	SUNXI_CCU_FIXED_FACTOR(H6_CLK_PCIE_REF_100M, "pcie_ref_100M",
342661f966eSjakllsch 	    "pll_periph0_4x", 24, 1),
343661f966eSjakllsch 	SUNXI_CCU_GATE(H6_CLK_PCIE_REF, "pcie_ref", "pcie_ref_100M",
344661f966eSjakllsch 	    PCIE_REF_CLK_REG, 31),
345661f966eSjakllsch 	SUNXI_CCU_GATE(H6_CLK_PCIE_REF_OUT, "pcie_ref_out", "pcie_ref",
346661f966eSjakllsch 	    PCIE_REF_CLK_REG, 30),
347661f966eSjakllsch 
348661f966eSjakllsch 	SUNXI_CCU_NM(H6_CLK_PSI_AHB1_AHB2, "psi_ahb1_ahb2",
349661f966eSjakllsch 	    psi_ahb1_ahb2_parents,
350661f966eSjakllsch 	    PSI_AHB1_AHB2_CFG_REG,	/* reg */
351661f966eSjakllsch 	    __BITS(9,8),	/* n */
352661f966eSjakllsch 	    __BITS(1,0),	/* m */
353661f966eSjakllsch 	    __BITS(25,24),	/* sel */
354661f966eSjakllsch 	    0,			/* enable */
355661f966eSjakllsch 	    SUNXI_CCU_NM_POWER_OF_TWO),
356661f966eSjakllsch 	SUNXI_CCU_DIV_GATE(H6_CLK_PCIE_MAXI, "pcie_maxi", pll_periph0_parent,
357661f966eSjakllsch 	    PCIE_AXI_CLK_REG,	/* reg */
358661f966eSjakllsch 	    __BITS(3,0),	/* div */
359661f966eSjakllsch 	    0,			/* sel */
360661f966eSjakllsch 	    __BIT(31),		/* enable */
361661f966eSjakllsch 	    SUNXI_CCU_DIV_ZERO_IS_ONE),
362661f966eSjakllsch 	SUNXI_CCU_DIV_GATE(H6_CLK_PCIE_AUX, "pcie_aux", hosc_parent,
363661f966eSjakllsch 	    PCIE_AUX_CLK_REG,	/* reg */
364661f966eSjakllsch 	    __BITS(4,0),	/* div */
365661f966eSjakllsch 	    0,			/* sel */
366661f966eSjakllsch 	    __BIT(31),		/* enable */
367661f966eSjakllsch 	    SUNXI_CCU_DIV_ZERO_IS_ONE),
368661f966eSjakllsch 
369661f966eSjakllsch 	SUNXI_CCU_GATE(H6_CLK_BUS_PCIE, "bus_pcie", "psi_ahb1_ahb2",
370661f966eSjakllsch 	    PCIE_BGR_REG, 0),
37186f4652dSjmcneill };
37286f4652dSjmcneill 
37386f4652dSjmcneill static int
sun50i_h6_ccu_match(device_t parent,cfdata_t cf,void * aux)37486f4652dSjmcneill sun50i_h6_ccu_match(device_t parent, cfdata_t cf, void *aux)
37586f4652dSjmcneill {
37686f4652dSjmcneill 	struct fdt_attach_args * const faa = aux;
37786f4652dSjmcneill 
378*6e54367aSthorpej 	return of_compatible_match(faa->faa_phandle, compat_data);
37986f4652dSjmcneill }
38086f4652dSjmcneill 
38186f4652dSjmcneill static void
sun50i_h6_ccu_attach(device_t parent,device_t self,void * aux)38286f4652dSjmcneill sun50i_h6_ccu_attach(device_t parent, device_t self, void *aux)
38386f4652dSjmcneill {
38486f4652dSjmcneill 	struct sunxi_ccu_softc * const sc = device_private(self);
38586f4652dSjmcneill 	struct fdt_attach_args * const faa = aux;
38686f4652dSjmcneill 
38786f4652dSjmcneill 	sc->sc_dev = self;
38886f4652dSjmcneill 	sc->sc_phandle = faa->faa_phandle;
38986f4652dSjmcneill 	sc->sc_bst = faa->faa_bst;
39086f4652dSjmcneill 
39186f4652dSjmcneill 	sc->sc_resets = sun50i_h6_ccu_resets;
39286f4652dSjmcneill 	sc->sc_nresets = __arraycount(sun50i_h6_ccu_resets);
39386f4652dSjmcneill 
39486f4652dSjmcneill 	sc->sc_clks = sun50i_h6_ccu_clks;
39586f4652dSjmcneill 	sc->sc_nclks = __arraycount(sun50i_h6_ccu_clks);
39686f4652dSjmcneill 
39786f4652dSjmcneill 	if (sunxi_ccu_attach(sc) != 0)
39886f4652dSjmcneill 		return;
39986f4652dSjmcneill 
40086f4652dSjmcneill 	aprint_naive("\n");
40186f4652dSjmcneill 	aprint_normal(": H6 CCU\n");
40286f4652dSjmcneill 
40386f4652dSjmcneill 	sunxi_ccu_print(sc);
40486f4652dSjmcneill }
405