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