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