Home | History | Annotate | Line # | Download | only in nxp
      1  1.2  thorpej /* $NetBSD: imx7d_ccm.c,v 1.2 2021/01/27 03:10:20 thorpej Exp $ */
      2  1.1    skrll 
      3  1.1    skrll /*-
      4  1.1    skrll  * Copyright (c) 2020 Jared McNeill <jmcneill (at) invisible.ca>
      5  1.1    skrll  * All rights reserved.
      6  1.1    skrll  *
      7  1.1    skrll  * Redistribution and use in source and binary forms, with or without
      8  1.1    skrll  * modification, are permitted provided that the following conditions
      9  1.1    skrll  * are met:
     10  1.1    skrll  * 1. Redistributions of source code must retain the above copyright
     11  1.1    skrll  *    notice, this list of conditions and the following disclaimer.
     12  1.1    skrll  * 2. Redistributions in binary form must reproduce the above copyright
     13  1.1    skrll  *    notice, this list of conditions and the following disclaimer in the
     14  1.1    skrll  *    documentation and/or other materials provided with the distribution.
     15  1.1    skrll  *
     16  1.1    skrll  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     17  1.1    skrll  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     18  1.1    skrll  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     19  1.1    skrll  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     20  1.1    skrll  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     21  1.1    skrll  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     22  1.1    skrll  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     23  1.1    skrll  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     24  1.1    skrll  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     25  1.1    skrll  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26  1.1    skrll  * SUCH DAMAGE.
     27  1.1    skrll  */
     28  1.1    skrll 
     29  1.1    skrll #include <sys/cdefs.h>
     30  1.1    skrll 
     31  1.2  thorpej __KERNEL_RCSID(0, "$NetBSD: imx7d_ccm.c,v 1.2 2021/01/27 03:10:20 thorpej Exp $");
     32  1.1    skrll 
     33  1.1    skrll #include <sys/param.h>
     34  1.1    skrll #include <sys/bus.h>
     35  1.1    skrll #include <sys/device.h>
     36  1.1    skrll #include <sys/systm.h>
     37  1.1    skrll 
     38  1.1    skrll #include <dev/fdt/fdtvar.h>
     39  1.1    skrll 
     40  1.1    skrll #include <arm/nxp/imx_ccm.h>
     41  1.1    skrll #include <arm/nxp/imx7d_ccm.h>
     42  1.1    skrll 
     43  1.1    skrll static int imx7d_ccm_match(device_t, cfdata_t, void *);
     44  1.1    skrll static void imx7d_ccm_attach(device_t, device_t, void *);
     45  1.1    skrll 
     46  1.2  thorpej static const struct device_compatible_entry compat_data[] = {
     47  1.2  thorpej 	{ .compat = "fsl,imx7d-ccm" },
     48  1.2  thorpej 	DEVICE_COMPAT_EOL
     49  1.1    skrll };
     50  1.1    skrll 
     51  1.2  thorpej static const struct device_compatible_entry anatop_compat_data[] = {
     52  1.2  thorpej 	{ .compat = "fsl,imx7d-anatop" },
     53  1.2  thorpej 	DEVICE_COMPAT_EOL
     54  1.1    skrll };
     55  1.1    skrll 
     56  1.1    skrll static const char *pll_bypass_p[] = {
     57  1.1    skrll 	"osc", "dummy"
     58  1.1    skrll };
     59  1.1    skrll static const char *pll_sys_main_bypass_p[] = {
     60  1.1    skrll 	"pll_sys_main", "pll_sys_main_src"
     61  1.1    skrll };
     62  1.1    skrll static const char *pll_enet_main_bypass_p[] = {
     63  1.1    skrll 	"pll_enet_main", "pll_enet_main_src"
     64  1.1    skrll };
     65  1.1    skrll static const char *uart1357_p[] = {
     66  1.1    skrll 	"osc", "pll_sys_main_240m_clk", "pll_enet_40m_clk", "pll_enet_100m_clk", "pll_sys_main_clk", "ext_clk_2", "ext_clk_4", "pll_usb_main_clk"
     67  1.1    skrll };
     68  1.1    skrll static const char *uart246_p[] = {
     69  1.1    skrll 	"osc", "pll_sys_main_240m_clk", "pll_enet_40m_clk", "pll_enet_100m_clk", "pll_sys_main_clk", "ext_clk_2", "ext_clk_4", "pll_usb_main_clk"
     70  1.1    skrll };
     71  1.1    skrll static const char *i2c_p[] = {
     72  1.1    skrll 	"osc", "pll_sys_main_120m_clk", "pll_enet_50m_clk", "pll_dram_533m_clk", "pll_audio_post_div", "pll_video_post_div", "pll_usb_main_clk", "pll_sys_pfd2_135m_clk"
     73  1.1    skrll };
     74  1.1    skrll static const char *enet_axi_p[] = {
     75  1.1    skrll 	"osc", "pll_sys_pfd2_270m_clk", "pll_dram_533m_clk", "pll_enet_250m_clk", "pll_sys_main_240m_clk", "pll_audio_post_div", "pll_video_post_div", "pll_sys_pfd4_clk"
     76  1.1    skrll };
     77  1.1    skrll static const char *enet_time_p[] = {
     78  1.1    skrll 	"osc", "pll_enet_100m_clk", "pll_audio_post_div", "ext_clk_1", "ext_clk_2", "ext_clk_3", "ext_clk_4", "pll_video_post_div"
     79  1.1    skrll };
     80  1.1    skrll static const char *enet_phy_ref_p[] = {
     81  1.1    skrll 	"osc", "pll_enet_25m_clk", "pll_enet_50m_clk", "pll_enet_125m_clk", "pll_dram_533m_clk", "pll_audio_post_div", "pll_video_post_div", "pll_sys_pfd3_clk"
     82  1.1    skrll };
     83  1.1    skrll static const char *ahb_channel_p[] = {
     84  1.1    skrll 	"osc", "pll_sys_pfd2_270m_clk", "pll_dram_533m_clk", "pll_sys_pfd0_392m_clk", "pll_enet_250m_clk", "pll_usb_main_clk", "pll_audio_post_div", "pll_video_post_div"
     85  1.1    skrll };
     86  1.1    skrll static const char *nand_usdhc_p[] = {
     87  1.1    skrll 	"osc", "pll_sys_pfd2_270m_clk", "pll_dram_533m_clk", "pll_sys_main_240m_clk", "pll_sys_pfd2_135m_clk", "pll_sys_pfd6_clk", "pll_enet_250m_clk", "pll_audio_post_div"
     88  1.1    skrll };
     89  1.1    skrll static const char *usdhc_p[] = {
     90  1.1    skrll 	"osc", "pll_sys_pfd0_392m_clk", "pll_dram_533m_clk", "pll_enet_500m_clk", "pll_sys_pfd4_clk", "pll_sys_pfd2_270m_clk", "pll_sys_pfd6_clk", "pll_sys_pfd7_clk"
     91  1.1    skrll };
     92  1.1    skrll 
     93  1.1    skrll CFATTACH_DECL_NEW(imx7d_ccm, sizeof(struct imx_ccm_softc),
     94  1.1    skrll 	imx7d_ccm_match, imx7d_ccm_attach, NULL, NULL);
     95  1.1    skrll 
     96  1.1    skrll enum {
     97  1.1    skrll 	REGIDX_CCM = 0,
     98  1.1    skrll 	REGIDX_ANATOP = 1,
     99  1.1    skrll };
    100  1.1    skrll 
    101  1.1    skrll #define	ANATOP_MUX(_id, _name, _parents, _reg, _mask)			\
    102  1.1    skrll 	IMX_MUX_INDEX(_id, REGIDX_ANATOP, _name, _parents, _reg, _mask)
    103  1.1    skrll #define	ANATOP_GATE(_id, _name, _parent, _reg, _mask)			\
    104  1.1    skrll 	IMX_GATE_INDEX(_id, REGIDX_ANATOP, _name, _parent, _reg, _mask)
    105  1.1    skrll #define	ANATOP_PLL(_id, _name, _parent, _reg, _div_mask, _flags)	\
    106  1.1    skrll 	IMX_PLL_INDEX(_id, REGIDX_ANATOP, _name, _parent, _reg, _div_mask, _flags)
    107  1.1    skrll 
    108  1.1    skrll static struct imx_ccm_clk imx7d_ccm_clks[] = {
    109  1.1    skrll 
    110  1.1    skrll 	IMX_FIXED(CLK_DUMMY, "dummy", 0),
    111  1.1    skrll 	IMX_EXTCLK(CKIL, "ckil"),
    112  1.1    skrll 	IMX_EXTCLK(OSC_24M_CLK, "osc"),
    113  1.1    skrll 
    114  1.1    skrll 	/*
    115  1.1    skrll 	 * CCM_ANALOG
    116  1.1    skrll 	 */
    117  1.1    skrll 	ANATOP_MUX(PLL_SYS_MAIN_SRC, "pll_sys_main_src", pll_bypass_p, 0xb0, __BITS(15,14)),
    118  1.1    skrll 	ANATOP_MUX(PLL_ENET_MAIN_SRC, "pll_enet_main_src", pll_bypass_p, 0xe0, __BITS(15,14)),
    119  1.1    skrll 
    120  1.1    skrll 	ANATOP_PLL(PLL_SYS_MAIN, "pll_sys_main", "osc", 0xb0, __BIT(0), IMX_PLL_480M_528M),
    121  1.1    skrll 	ANATOP_PLL(PLL_ENET_MAIN, "pll_enet_main", "osc", 0xe0, 1000000000, IMX_PLL_ENET),
    122  1.1    skrll 
    123  1.1    skrll 	ANATOP_MUX(PLL_SYS_MAIN_BYPASS, "pll_sys_main_bypass", pll_sys_main_bypass_p, 0xb0, __BIT(16)),
    124  1.1    skrll 	ANATOP_MUX(PLL_ENET_MAIN_BYPASS, "pll_enet_main_bypass", pll_enet_main_bypass_p, 0xe0, __BIT(16)),
    125  1.1    skrll 
    126  1.1    skrll 	ANATOP_GATE(PLL_SYS_MAIN_CLK, "pll_sys_main_clk", "pll_sys_main_bypass", 0xb0, __BIT(13)),
    127  1.1    skrll 
    128  1.1    skrll 	IMX_FIXED_FACTOR(PLL_SYS_MAIN_240M, "pll_sys_main_240m", "pll_sys_main_clk", 1, 2),
    129  1.1    skrll 
    130  1.1    skrll 	ANATOP_GATE(PLL_SYS_MAIN_240M_CLK, "pll_sys_main_240m_clk", "pll_sys_main_240m", 0xb0, __BIT(5)),
    131  1.1    skrll 
    132  1.1    skrll 	IMX_FIXED_FACTOR(PLL_ENET_MAIN_CLK, "pll_enet_main_clk", "pll_enet_main_bypass", 1, 1),
    133  1.1    skrll 	IMX_FIXED_FACTOR(PLL_ENET_MAIN_500M, "pll_enet_500m", "pll_enet_main_clk", 1, 2),
    134  1.1    skrll 	IMX_FIXED_FACTOR(PLL_ENET_MAIN_250M, "pll_enet_250m", "pll_enet_main_clk", 1, 4),
    135  1.1    skrll 	IMX_FIXED_FACTOR(PLL_ENET_MAIN_125M, "pll_enet_125m", "pll_enet_main_clk", 1, 8),
    136  1.1    skrll 	IMX_FIXED_FACTOR(PLL_ENET_MAIN_100M, "pll_enet_100m", "pll_enet_main_clk", 1, 10),
    137  1.1    skrll 	IMX_FIXED_FACTOR(PLL_ENET_MAIN_50M, "pll_enet_50m", "pll_enet_main_clk", 1, 20),
    138  1.1    skrll 	IMX_FIXED_FACTOR(PLL_ENET_MAIN_40M, "pll_enet_40m", "pll_enet_main_clk", 1, 25),
    139  1.1    skrll 	IMX_FIXED_FACTOR(PLL_ENET_MAIN_25M, "pll_enet_25m", "pll_enet_main_clk", 1, 40),
    140  1.1    skrll 
    141  1.1    skrll 	ANATOP_GATE(PLL_ENET_MAIN_500M_CLK, "pll_enet_500m_clk", "pll_enet_500m", 0xe0, __BIT(12)),
    142  1.1    skrll 	ANATOP_GATE(PLL_ENET_MAIN_250M_CLK, "pll_enet_250m_clk", "pll_enet_250m", 0xe0, __BIT(11)),
    143  1.1    skrll 	ANATOP_GATE(PLL_ENET_MAIN_250M_CLK, "pll_enet_250m_clk", "pll_enet_250m", 0xe0, __BIT(11)),
    144  1.1    skrll 	ANATOP_GATE(PLL_ENET_MAIN_125M_CLK, "pll_enet_125m_clk", "pll_enet_125m", 0xe0, __BIT(10)),
    145  1.1    skrll 	ANATOP_GATE(PLL_ENET_MAIN_100M_CLK, "pll_enet_100m_clk", "pll_enet_100m", 0xe0, __BIT(9)),
    146  1.1    skrll 	ANATOP_GATE(PLL_ENET_MAIN_50M_CLK, "pll_enet_50m_clk", "pll_enet_50m", 0xe0, __BIT(8)),
    147  1.1    skrll 	ANATOP_GATE(PLL_ENET_MAIN_40M_CLK, "pll_enet_40m_clk", "pll_enet_40m", 0xe0, __BIT(7)),
    148  1.1    skrll 	ANATOP_GATE(PLL_ENET_MAIN_25M_CLK, "pll_enet_25m_clk", "pll_enet_25m", 0xe0, __BIT(6)),
    149  1.1    skrll 
    150  1.1    skrll 	IMX_FIXED_FACTOR(USB1_MAIN_480M_CLK, "pll_usb1_main_clk", "osc", 20, 1),
    151  1.1    skrll 	IMX_FIXED_FACTOR(USB_MAIN_480M_CLK, "pll_usb_main_clk", "osc", 20, 1),
    152  1.1    skrll 
    153  1.1    skrll 	/*
    154  1.1    skrll 	 * CCM (regidx=0)
    155  1.1    skrll 	 */
    156  1.1    skrll 
    157  1.1    skrll 	IMX_MUX(UART1_ROOT_SRC, "uart1_src", uart1357_p, 0xaf80, __BITS(26,24)),
    158  1.1    skrll 	IMX_MUX(UART2_ROOT_SRC, "uart2_src", uart246_p, 0xb000, __BITS(26,24)),
    159  1.1    skrll 	IMX_MUX(UART3_ROOT_SRC, "uart3_src", uart1357_p, 0xb080, __BITS(26,24)),
    160  1.1    skrll 	IMX_MUX(UART4_ROOT_SRC, "uart4_src", uart246_p, 0xb100, __BITS(26,24)),
    161  1.1    skrll 	IMX_MUX(UART5_ROOT_SRC, "uart5_src", uart1357_p, 0xb180, __BITS(26,24)),
    162  1.1    skrll 	IMX_MUX(UART6_ROOT_SRC, "uart6_src", uart246_p, 0xb200, __BITS(26,24)),
    163  1.1    skrll 	IMX_MUX(UART7_ROOT_SRC, "uart7_src", uart1357_p, 0xb280, __BITS(26,24)),
    164  1.1    skrll 
    165  1.1    skrll 	IMX_GATE(UART1_ROOT_CG, "uart1_cg", "uart1_src", 0xaf80, __BIT(18)),
    166  1.1    skrll 	IMX_GATE(UART2_ROOT_CG, "uart2_cg", "uart2_src", 0xb000, __BIT(18)),
    167  1.1    skrll 	IMX_GATE(UART3_ROOT_CG, "uart3_cg", "uart3_src", 0xb080, __BIT(18)),
    168  1.1    skrll 	IMX_GATE(UART4_ROOT_CG, "uart4_cg", "uart4_src", 0xb100, __BIT(18)),
    169  1.1    skrll 	IMX_GATE(UART5_ROOT_CG, "uart5_cg", "uart5_src", 0xb180, __BIT(18)),
    170  1.1    skrll 	IMX_GATE(UART6_ROOT_CG, "uart6_cg", "uart6_src", 0xb200, __BIT(18)),
    171  1.1    skrll 	IMX_GATE(UART7_ROOT_CG, "uart7_cg", "uart7_src", 0xb280, __BIT(18)),
    172  1.1    skrll 
    173  1.1    skrll 	IMX_DIV(UART1_ROOT_PRE_DIV, "uart1_pre_div", "uart1_cg", 0xaf80, __BITS(18,16), 0),
    174  1.1    skrll 	IMX_DIV(UART2_ROOT_PRE_DIV, "uart2_pre_div", "uart2_cg", 0xb000, __BITS(18,16), 0),
    175  1.1    skrll 	IMX_DIV(UART3_ROOT_PRE_DIV, "uart3_pre_div", "uart3_cg", 0xb080, __BITS(18,16), 0),
    176  1.1    skrll 	IMX_DIV(UART4_ROOT_PRE_DIV, "uart4_pre_div", "uart4_cg", 0xb100, __BITS(18,16), 0),
    177  1.1    skrll 	IMX_DIV(UART5_ROOT_PRE_DIV, "uart5_pre_div", "uart5_cg", 0xb100, __BITS(18,16), 0),
    178  1.1    skrll 	IMX_DIV(UART6_ROOT_PRE_DIV, "uart6_pre_div", "uart6_cg", 0xb200, __BITS(18,16), 0),
    179  1.1    skrll 	IMX_DIV(UART7_ROOT_PRE_DIV, "uart7_pre_div", "uart7_cg", 0xb280, __BITS(18,16), 0),
    180  1.1    skrll 
    181  1.1    skrll 	IMX_DIV(UART1_ROOT_DIV, "uart1_post_div", "uart1_pre_div", 0xaf80, __BITS(5,0), 0),
    182  1.1    skrll 	IMX_DIV(UART2_ROOT_DIV, "uart2_post_div", "uart2_pre_div", 0xb000, __BITS(5,0), 0),
    183  1.1    skrll 	IMX_DIV(UART3_ROOT_DIV, "uart3_post_div", "uart3_pre_div", 0xb080, __BITS(5,0), 0),
    184  1.1    skrll 	IMX_DIV(UART4_ROOT_DIV, "uart4_post_div", "uart4_pre_div", 0xb100, __BITS(5,0), 0),
    185  1.1    skrll 	IMX_DIV(UART5_ROOT_DIV, "uart5_post_div", "uart5_pre_div", 0xb100, __BITS(5,0), 0),
    186  1.1    skrll 	IMX_DIV(UART6_ROOT_DIV, "uart6_post_div", "uart6_pre_div", 0xb200, __BITS(5,0), 0),
    187  1.1    skrll 	IMX_DIV(UART7_ROOT_DIV, "uart7_post_div", "uart7_pre_div", 0xb280, __BITS(5,0), 0),
    188  1.1    skrll 
    189  1.1    skrll 	IMX_GATE(UART1_ROOT_CLK, "uart1_root_clk", "uart1_post_div", 0x4940, __BIT(0)),
    190  1.1    skrll 	IMX_GATE(UART2_ROOT_CLK, "uart2_root_clk", "uart2_post_div", 0x4950, __BIT(0)),
    191  1.1    skrll 	IMX_GATE(UART3_ROOT_CLK, "uart3_root_clk", "uart3_post_div", 0x4960, __BIT(0)),
    192  1.1    skrll 	IMX_GATE(UART4_ROOT_CLK, "uart4_root_clk", "uart4_post_div", 0x4970, __BIT(0)),
    193  1.1    skrll 	IMX_GATE(UART5_ROOT_CLK, "uart5_root_clk", "uart5_post_div", 0x4980, __BIT(0)),
    194  1.1    skrll 	IMX_GATE(UART6_ROOT_CLK, "uart6_root_clk", "uart6_post_div", 0x4990, __BIT(0)),
    195  1.1    skrll 	IMX_GATE(UART7_ROOT_CLK, "uart7_root_clk", "uart7_post_div", 0x49a0, __BIT(0)),
    196  1.1    skrll 
    197  1.1    skrll 	IMX_MUX(I2C1_ROOT_SRC, "i2c1_src", i2c_p, 0xad80, __BITS(26,24)),
    198  1.1    skrll 	IMX_MUX(I2C2_ROOT_SRC, "i2c2_src", i2c_p, 0xae00, __BITS(26,24)),
    199  1.1    skrll 	IMX_MUX(I2C3_ROOT_SRC, "i2c3_src", i2c_p, 0xae80, __BITS(26,24)),
    200  1.1    skrll 	IMX_MUX(I2C4_ROOT_SRC, "i2c4_src", i2c_p, 0xaf00, __BITS(26,24)),
    201  1.1    skrll 
    202  1.1    skrll 	IMX_GATE(I2C1_ROOT_CG, "i2c1_cg", "i2c1_src", 0xad80, __BIT(0)),
    203  1.1    skrll 	IMX_GATE(I2C2_ROOT_CG, "i2c2_cg", "i2c2_src", 0xae00, __BIT(0)),
    204  1.1    skrll 	IMX_GATE(I2C3_ROOT_CG, "i2c3_cg", "i2c3_src", 0xae80, __BIT(0)),
    205  1.1    skrll 	IMX_GATE(I2C4_ROOT_CG, "i2c4_cg", "i2c4_src", 0xaf00, __BIT(0)),
    206  1.1    skrll 
    207  1.1    skrll 	IMX_DIV(I2C1_ROOT_PRE_DIV, "i2c1_pre_div", "i2c1_cg", 0xad80, __BITS(18,16), 0),
    208  1.1    skrll 	IMX_DIV(I2C2_ROOT_PRE_DIV, "i2c2_pre_div", "i2c2_cg", 0xae00, __BITS(18,16), 0),
    209  1.1    skrll 	IMX_DIV(I2C3_ROOT_PRE_DIV, "i2c3_pre_div", "i2c3_cg", 0xae80, __BITS(18,16), 0),
    210  1.1    skrll 	IMX_DIV(I2C4_ROOT_PRE_DIV, "i2c4_pre_div", "i2c4_cg", 0xaf00, __BITS(18,16), 0),
    211  1.1    skrll 
    212  1.1    skrll 	IMX_DIV(I2C1_ROOT_DIV, "i2c1_post_div", "i2c1_pre_div", 0xad80, __BITS(5,0), 0),
    213  1.1    skrll 	IMX_DIV(I2C2_ROOT_DIV, "i2c2_post_div", "i2c2_pre_div", 0xae00, __BITS(5,0), 0),
    214  1.1    skrll 	IMX_DIV(I2C3_ROOT_DIV, "i2c3_post_div", "i2c3_pre_div", 0xae80, __BITS(5,0), 0),
    215  1.1    skrll 	IMX_DIV(I2C4_ROOT_DIV, "i2c4_post_div", "i2c4_pre_div", 0xaf00, __BITS(5,0), 0),
    216  1.1    skrll 
    217  1.1    skrll 	IMX_GATE(I2C1_ROOT_CLK, "i2c1_root_clk", "i2c1_post_div", 0x4880, __BIT(0)),
    218  1.1    skrll 	IMX_GATE(I2C2_ROOT_CLK, "i2c2_root_clk", "i2c2_post_div", 0x4890, __BIT(0)),
    219  1.1    skrll 	IMX_GATE(I2C3_ROOT_CLK, "i2c3_root_clk", "i2c3_post_div", 0x48a0, __BIT(0)),
    220  1.1    skrll 	IMX_GATE(I2C4_ROOT_CLK, "i2c4_root_clk", "i2c4_post_div", 0x48b0, __BIT(0)),
    221  1.1    skrll 
    222  1.1    skrll 	IMX_MUX(ENET_AXI_ROOT_SRC, "enet_axi_src", enet_axi_p, 0x8900, __BITS(26,24)),
    223  1.1    skrll 	IMX_GATE(ENET_AXI_ROOT_CG, "enet_axi_cg", "enet_axi_src", 0x8900, __BIT(28)),
    224  1.1    skrll 	IMX_DIV(ENET_AXI_ROOT_PRE_DIV, "enet_axi_pre_div", "enet_axi_cg", 0x8900, __BITS(18,16), 0),
    225  1.1    skrll 	IMX_DIV(ENET_AXI_ROOT_DIV, "enet_axi_post_div", "enet_axi_pre_div", 0x8900, __BITS(5,0), 0),
    226  1.1    skrll 
    227  1.1    skrll 	IMX_MUX(ENET1_TIME_ROOT_SRC, "enet1_time_src", enet_time_p, 0xa780, __BITS(26,24)),
    228  1.1    skrll 	IMX_MUX(ENET2_TIME_ROOT_SRC, "enet2_time_src", enet_time_p, 0xa880, __BITS(26,24)),
    229  1.1    skrll 	IMX_GATE(ENET1_TIME_ROOT_CG, "enet1_time_cg", "enet1_time_src", 0xa780, __BIT(28)),
    230  1.1    skrll 	IMX_GATE(ENET2_TIME_ROOT_CG, "enet2_time_cg", "enet2_time_src", 0xa880, __BIT(28)),
    231  1.1    skrll 	IMX_DIV(ENET1_TIME_ROOT_PRE_DIV, "enet1_time_pre_div", "enet1_time_cg", 0xa780, __BITS(18,16), 0),
    232  1.1    skrll 	IMX_DIV(ENET2_TIME_ROOT_PRE_DIV, "enet2_time_pre_div", "enet2_time_cg", 0xa880, __BITS(18,16), 0),
    233  1.1    skrll 	IMX_DIV(ENET1_TIME_ROOT_DIV, "enet1_time_post_div", "enet1_time_pre_div", 0xa780, __BITS(5,0), 0),
    234  1.1    skrll 	IMX_DIV(ENET2_TIME_ROOT_DIV, "enet2_time_post_div", "enet2_time_pre_div", 0xa880, __BITS(5,0), 0),
    235  1.1    skrll 	IMX_GATE(ENET1_IPG_ROOT_CLK, "enet1_ipg_root_clk", "enet_axi_post_div", 0x4700, __BIT(0)),
    236  1.1    skrll 	IMX_GATE(ENET2_IPG_ROOT_CLK, "enet2_ipg_root_clk", "enet_axi_post_div", 0x4710, __BIT(0)),
    237  1.1    skrll 	IMX_GATE(ENET1_TIME_ROOT_CLK, "enet1_time_root_clk", "enet1_time_post_div", 0x4700, __BIT(0)),
    238  1.1    skrll 	IMX_GATE(ENET2_TIME_ROOT_CLK, "enet2_time_root_clk", "enet2_time_post_div", 0x4710, __BIT(0)),
    239  1.1    skrll 	IMX_GATE(ENET_AXI_ROOT_CLK, "enet_axi_root_clk", "enet_axi_post_div", 0x4060, __BIT(0)),
    240  1.1    skrll 
    241  1.1    skrll 	IMX_MUX(ENET_PHY_REF_ROOT_SRC, "enet_phy_ref_src", enet_phy_ref_p, 0xa900, __BITS(26,24)),
    242  1.1    skrll 	IMX_GATE(ENET_PHY_REF_ROOT_CG, "enet_phy_ref_cg", "enet_phy_ref_src", 0xa900, __BIT(28)),
    243  1.1    skrll 	IMX_DIV(ENET_PHY_REF_ROOT_PRE_DIV, "enet_phy_ref_pre_div", "enet_phy_ref_cg", 0xa900, __BITS(18,16), 0),
    244  1.1    skrll 	IMX_DIV(ENET_PHY_REF_ROOT_CLK, "enet_phy_ref_root_clk", "enet_phy_ref_pre_div", 0xa900, __BITS(5,0), 0),
    245  1.1    skrll 
    246  1.1    skrll 	IMX_MUX(AHB_CHANNEL_ROOT_SRC, "ahb_src", ahb_channel_p, 0x9000, __BITS(26,24)),
    247  1.1    skrll 	IMX_GATE(AHB_CHANNEL_ROOT_CG, "ahb_cg", "ahb_src", 0x9000, __BIT(28)),
    248  1.1    skrll 	IMX_DIV(AHB_CHANNEL_ROOT_PRE_DIV, "ahb_pre_div", "ahb_cg", 0x9000, __BITS(18,16), 0),
    249  1.1    skrll 	IMX_DIV(AHB_CHANNEL_ROOT_DIV, "ahb_root_clk", "ahb_pre_div", 0x9000, __BITS(5,0), 0),
    250  1.1    skrll 	IMX_DIV(IPG_ROOT_CLK, "ipg_root_clk", "ahb_root_clk", 0x9080, __BITS(1,0), IMX_DIV_SET_RATE_PARENT),
    251  1.1    skrll 
    252  1.1    skrll 	IMX_MUX(NAND_USDHC_BUS_ROOT_SRC, "nand_usdhc_src", nand_usdhc_p, 0x8980, __BITS(26,24)),
    253  1.1    skrll 	IMX_GATE(NAND_USDHC_BUS_ROOT_CG, "nand_usdhc_cg", "nand_usdhc_src", 0x8980, __BIT(28)),
    254  1.1    skrll 	IMX_DIV(NAND_USDHC_BUS_ROOT_PRE_DIV, "nand_usdhc_pre_div", "nand_usdhc_cg", 0x8980, __BITS(18,16), 0),
    255  1.1    skrll 	IMX_DIV(NAND_USDHC_BUS_ROOT_CLK, "nand_usdhc_root_clk", "nand_usdhc_pre_div", 0x8980, __BITS(5,0), 0),
    256  1.1    skrll 
    257  1.1    skrll 	IMX_MUX(USDHC1_ROOT_SRC, "usdhc1_src", usdhc_p, 0xab00, __BITS(26,24)),
    258  1.1    skrll 	IMX_MUX(USDHC2_ROOT_SRC, "usdhc2_src", usdhc_p, 0xab80, __BITS(26,24)),
    259  1.1    skrll 	IMX_MUX(USDHC3_ROOT_SRC, "usdhc3_src", usdhc_p, 0xac00, __BITS(26,24)),
    260  1.1    skrll 	IMX_GATE(USDHC1_ROOT_CG, "usdhc1_cg", "usdhc1_src", 0xab00, __BIT(28)),
    261  1.1    skrll 	IMX_GATE(USDHC2_ROOT_CG, "usdhc2_cg", "usdhc2_src", 0xab80, __BIT(28)),
    262  1.1    skrll 	IMX_GATE(USDHC3_ROOT_CG, "usdhc3_cg", "usdhc3_src", 0xac00, __BIT(28)),
    263  1.1    skrll 	IMX_DIV(USDHC1_ROOT_PRE_DIV, "usdhc1_pre_div", "usdhc1_cg", 0xab00, __BITS(18,16), 0),
    264  1.1    skrll 	IMX_DIV(USDHC1_ROOT_PRE_DIV, "usdhc2_pre_div", "usdhc2_cg", 0xab80, __BITS(18,16), 0),
    265  1.1    skrll 	IMX_DIV(USDHC1_ROOT_PRE_DIV, "usdhc3_pre_div", "usdhc3_cg", 0xac00, __BITS(18,16), 0),
    266  1.1    skrll 	IMX_DIV(USDHC1_ROOT_DIV, "usdhc1_post_div", "usdhc1_pre_div", 0xab00, __BITS(5,0), 0),
    267  1.1    skrll 	IMX_DIV(USDHC2_ROOT_DIV, "usdhc2_post_div", "usdhc2_pre_div", 0xab80, __BITS(5,0), 0),
    268  1.1    skrll 	IMX_DIV(USDHC3_ROOT_DIV, "usdhc3_post_div", "usdhc3_pre_div", 0xac00, __BITS(5,0), 0),
    269  1.1    skrll 	IMX_GATE(USDHC1_ROOT_CLK, "usdhc1_root_clk", "usdhc1_post_div", 0x46c0, __BIT(0)),
    270  1.1    skrll 	IMX_GATE(USDHC2_ROOT_CLK, "usdhc2_root_clk", "usdhc2_post_div", 0x46d0, __BIT(0)),
    271  1.1    skrll 	IMX_GATE(USDHC3_ROOT_CLK, "usdhc3_root_clk", "usdhc3_post_div", 0x46e0, __BIT(0)),
    272  1.1    skrll 
    273  1.1    skrll 	IMX_GATE(USB_CTRL_CLK, "usb_ctrl_clk", "ahb_root_clk", 0x4680, __BIT(0)),
    274  1.1    skrll 	IMX_GATE(USB_PHY1_CLK, "usb_phy1_clk", "pll_usb1_main_clk", 0x46a0, __BIT(0)),
    275  1.1    skrll 	IMX_GATE(USB_PHY2_CLK, "usb_phy2_clk", "pll_usb_main_clk", 0x46b0, __BIT(0)),
    276  1.1    skrll };
    277  1.1    skrll 
    278  1.1    skrll static int
    279  1.1    skrll imx7d_ccm_match(device_t parent, cfdata_t cf, void *aux)
    280  1.1    skrll {
    281  1.1    skrll 	struct fdt_attach_args * const faa = aux;
    282  1.1    skrll 
    283  1.2  thorpej 	return of_compatible_match(faa->faa_phandle, compat_data);
    284  1.1    skrll }
    285  1.1    skrll 
    286  1.1    skrll static void
    287  1.1    skrll imx7d_ccm_attach(device_t parent, device_t self, void *aux)
    288  1.1    skrll {
    289  1.1    skrll 	struct imx_ccm_softc * const sc = device_private(self);
    290  1.1    skrll 	struct fdt_attach_args * const faa = aux;
    291  1.1    skrll 	const int phandle = faa->faa_phandle;
    292  1.1    skrll 	bus_addr_t anatop_addr;
    293  1.1    skrll 	bus_size_t anatop_size;
    294  1.1    skrll 	int anatop = -1, child;
    295  1.1    skrll 
    296  1.1    skrll 	sc->sc_dev = self;
    297  1.1    skrll 	sc->sc_phandle = phandle;
    298  1.1    skrll 	sc->sc_bst = faa->faa_bst;
    299  1.1    skrll 
    300  1.1    skrll 	sc->sc_clks = imx7d_ccm_clks;
    301  1.1    skrll 	sc->sc_nclks = __arraycount(imx7d_ccm_clks);
    302  1.1    skrll 
    303  1.1    skrll 	for (child = OF_child(OF_parent(phandle)); child; child = OF_peer(child)) {
    304  1.2  thorpej 		if (of_compatible_match(child, anatop_compat_data)) {
    305  1.1    skrll 			anatop = child;
    306  1.1    skrll 			break;
    307  1.1    skrll 		}
    308  1.1    skrll 	}
    309  1.1    skrll 	if (anatop == -1) {
    310  1.1    skrll 		aprint_error(": couldn't find anatop node\n");
    311  1.1    skrll 		return;
    312  1.1    skrll 	}
    313  1.1    skrll 	if (fdtbus_get_reg(anatop, 0, &anatop_addr, &anatop_size) != 0) {
    314  1.1    skrll 		aprint_error(": couldn't get anatop registers\n");
    315  1.1    skrll 		return;
    316  1.1    skrll 	}
    317  1.1    skrll 	if (bus_space_map(sc->sc_bst, anatop_addr, anatop_size, 0, &sc->sc_bsh[REGIDX_ANATOP]) != 0) {
    318  1.1    skrll 		aprint_error(": couldn't map anatop registers\n");
    319  1.1    skrll 		return;
    320  1.1    skrll 	}
    321  1.1    skrll 
    322  1.1    skrll 	if (imx_ccm_attach(sc) != 0)
    323  1.1    skrll 		return;
    324  1.1    skrll 
    325  1.1    skrll 	aprint_naive("\n");
    326  1.1    skrll 	aprint_normal(": Clock Control Module\n");
    327  1.1    skrll 
    328  1.1    skrll 	imx_ccm_print(sc);
    329  1.1    skrll }
    330