1 1.8 skrll /* $NetBSD: imx6_clk.c,v 1.8 2024/09/01 08:08:24 skrll Exp $ */ 2 1.1 skrll 3 1.1 skrll /*- 4 1.1 skrll * Copyright (c) 2019 Genetec Corporation. All rights reserved. 5 1.1 skrll * Written by Hashimoto Kenichi for Genetec Corporation. 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.8 skrll __KERNEL_RCSID(0, "$NetBSD: imx6_clk.c,v 1.8 2024/09/01 08:08:24 skrll Exp $"); 31 1.1 skrll 32 1.1 skrll #include "opt_fdt.h" 33 1.1 skrll 34 1.1 skrll #include <sys/types.h> 35 1.1 skrll #include <sys/time.h> 36 1.1 skrll #include <sys/bus.h> 37 1.1 skrll #include <sys/device.h> 38 1.1 skrll #include <sys/sysctl.h> 39 1.1 skrll #include <sys/cpufreq.h> 40 1.1 skrll #include <sys/kmem.h> 41 1.1 skrll #include <sys/param.h> 42 1.1 skrll 43 1.5 bouyer #include <arm/nxp/imx6_ccmreg.h> 44 1.1 skrll #include <arm/nxp/imx6_ccmvar.h> 45 1.1 skrll 46 1.1 skrll #include <dev/clk/clk_backend.h> 47 1.1 skrll #include <dev/fdt/fdtvar.h> 48 1.1 skrll 49 1.5 bouyer /* Clock IDs - should match dt-bindings/clock/imx6qdl-clock.h */ 50 1.5 bouyer #define IMX6QCLK_DUMMY 0 51 1.5 bouyer #define IMX6QCLK_CKIL 1 52 1.5 bouyer #define IMX6QCLK_CKIH 2 53 1.5 bouyer #define IMX6QCLK_OSC 3 54 1.5 bouyer #define IMX6QCLK_PLL2_PFD0_352M 4 55 1.5 bouyer #define IMX6QCLK_PLL2_PFD1_594M 5 56 1.5 bouyer #define IMX6QCLK_PLL2_PFD2_396M 6 57 1.5 bouyer #define IMX6QCLK_PLL3_PFD0_720M 7 58 1.5 bouyer #define IMX6QCLK_PLL3_PFD1_540M 8 59 1.5 bouyer #define IMX6QCLK_PLL3_PFD2_508M 9 60 1.5 bouyer #define IMX6QCLK_PLL3_PFD3_454M 10 61 1.5 bouyer #define IMX6QCLK_PLL2_198M 11 62 1.5 bouyer #define IMX6QCLK_PLL3_120M 12 63 1.5 bouyer #define IMX6QCLK_PLL3_80M 13 64 1.5 bouyer #define IMX6QCLK_PLL3_60M 14 65 1.5 bouyer #define IMX6QCLK_TWD 15 66 1.5 bouyer #define IMX6QCLK_STEP 16 67 1.5 bouyer #define IMX6QCLK_PLL1_SW 17 68 1.5 bouyer #define IMX6QCLK_PERIPH_PRE 18 69 1.5 bouyer #define IMX6QCLK_PERIPH2_PRE 19 70 1.5 bouyer #define IMX6QCLK_PERIPH_CLK2_SEL 20 71 1.5 bouyer #define IMX6QCLK_PERIPH2_CLK2_SEL 21 72 1.5 bouyer #define IMX6QCLK_AXI_SEL 22 73 1.5 bouyer #define IMX6QCLK_ESAI_SEL 23 74 1.5 bouyer #define IMX6QCLK_ASRC_SEL 24 75 1.5 bouyer #define IMX6QCLK_SPDIF_SEL 25 76 1.5 bouyer #define IMX6QCLK_GPU2D_AXI 26 77 1.5 bouyer #define IMX6QCLK_GPU3D_AXI 27 78 1.5 bouyer #define IMX6QCLK_GPU2D_CORE_SEL 28 79 1.5 bouyer #define IMX6QCLK_GPU3D_CORE_SEL 29 80 1.5 bouyer #define IMX6QCLK_GPU3D_SHADER_SEL 30 81 1.5 bouyer #define IMX6QCLK_IPU1_SEL 31 82 1.5 bouyer #define IMX6QCLK_IPU2_SEL 32 83 1.5 bouyer #define IMX6QCLK_LDB_DI0_SEL 33 84 1.5 bouyer #define IMX6QCLK_LDB_DI1_SEL 34 85 1.5 bouyer #define IMX6QCLK_IPU1_DI0_PRE_SEL 35 86 1.5 bouyer #define IMX6QCLK_IPU1_DI1_PRE_SEL 36 87 1.5 bouyer #define IMX6QCLK_IPU2_DI0_PRE_SEL 37 88 1.5 bouyer #define IMX6QCLK_IPU2_DI1_PRE_SEL 38 89 1.5 bouyer #define IMX6QCLK_IPU1_DI0_SEL 39 90 1.5 bouyer #define IMX6QCLK_IPU1_DI1_SEL 40 91 1.5 bouyer #define IMX6QCLK_IPU2_DI0_SEL 41 92 1.5 bouyer #define IMX6QCLK_IPU2_DI1_SEL 42 93 1.5 bouyer #define IMX6QCLK_HSI_TX_SEL 43 94 1.5 bouyer #define IMX6QCLK_PCIE_AXI_SEL 44 95 1.5 bouyer #define IMX6QCLK_SSI1_SEL 45 96 1.5 bouyer #define IMX6QCLK_SSI2_SEL 46 97 1.5 bouyer #define IMX6QCLK_SSI3_SEL 47 98 1.5 bouyer #define IMX6QCLK_USDHC1_SEL 48 99 1.5 bouyer #define IMX6QCLK_USDHC2_SEL 49 100 1.5 bouyer #define IMX6QCLK_USDHC3_SEL 50 101 1.5 bouyer #define IMX6QCLK_USDHC4_SEL 51 102 1.5 bouyer #define IMX6QCLK_ENFC_SEL 52 103 1.5 bouyer #define IMX6QCLK_EIM_SEL 53 104 1.5 bouyer #define IMX6QCLK_EIM_SLOW_SEL 54 105 1.5 bouyer #define IMX6QCLK_VDO_AXI_SEL 55 106 1.5 bouyer #define IMX6QCLK_VPU_AXI_SEL 56 107 1.5 bouyer #define IMX6QCLK_CKO1_SEL 57 108 1.5 bouyer #define IMX6QCLK_PERIPH 58 109 1.5 bouyer #define IMX6QCLK_PERIPH2 59 110 1.5 bouyer #define IMX6QCLK_PERIPH_CLK2 60 111 1.5 bouyer #define IMX6QCLK_PERIPH2_CLK2 61 112 1.5 bouyer #define IMX6QCLK_IPG 62 113 1.5 bouyer #define IMX6QCLK_IPG_PER 63 114 1.5 bouyer #define IMX6QCLK_ESAI_PRED 64 115 1.5 bouyer #define IMX6QCLK_ESAI_PODF 65 116 1.5 bouyer #define IMX6QCLK_ASRC_PRED 66 117 1.5 bouyer #define IMX6QCLK_ASRC_PODF 67 118 1.5 bouyer #define IMX6QCLK_SPDIF_PRED 68 119 1.5 bouyer #define IMX6QCLK_SPDIF_PODF 69 120 1.5 bouyer #define IMX6QCLK_CAN_ROOT 70 121 1.5 bouyer #define IMX6QCLK_ECSPI_ROOT 71 122 1.5 bouyer #define IMX6QCLK_GPU2D_CORE_PODF 72 123 1.5 bouyer #define IMX6QCLK_GPU3D_CORE_PODF 73 124 1.5 bouyer #define IMX6QCLK_GPU3D_SHADER 74 125 1.5 bouyer #define IMX6QCLK_IPU1_PODF 75 126 1.5 bouyer #define IMX6QCLK_IPU2_PODF 76 127 1.5 bouyer #define IMX6QCLK_LDB_DI0_PODF 77 128 1.5 bouyer #define IMX6QCLK_LDB_DI1_PODF 78 129 1.5 bouyer #define IMX6QCLK_IPU1_DI0_PRE 79 130 1.5 bouyer #define IMX6QCLK_IPU1_DI1_PRE 80 131 1.5 bouyer #define IMX6QCLK_IPU2_DI0_PRE 81 132 1.5 bouyer #define IMX6QCLK_IPU2_DI1_PRE 82 133 1.5 bouyer #define IMX6QCLK_HSI_TX_PODF 83 134 1.5 bouyer #define IMX6QCLK_SSI1_PRED 84 135 1.5 bouyer #define IMX6QCLK_SSI1_PODF 85 136 1.5 bouyer #define IMX6QCLK_SSI2_PRED 86 137 1.5 bouyer #define IMX6QCLK_SSI2_PODF 87 138 1.5 bouyer #define IMX6QCLK_SSI3_PRED 88 139 1.5 bouyer #define IMX6QCLK_SSI3_PODF 89 140 1.5 bouyer #define IMX6QCLK_UART_SERIAL_PODF 90 141 1.5 bouyer #define IMX6QCLK_USDHC1_PODF 91 142 1.5 bouyer #define IMX6QCLK_USDHC2_PODF 92 143 1.5 bouyer #define IMX6QCLK_USDHC3_PODF 93 144 1.5 bouyer #define IMX6QCLK_USDHC4_PODF 94 145 1.5 bouyer #define IMX6QCLK_ENFC_PRED 95 146 1.5 bouyer #define IMX6QCLK_ENFC_PODF 96 147 1.5 bouyer #define IMX6QCLK_EIM_PODF 97 148 1.5 bouyer #define IMX6QCLK_EIM_SLOW_PODF 98 149 1.5 bouyer #define IMX6QCLK_VPU_AXI_PODF 99 150 1.5 bouyer #define IMX6QCLK_CKO1_PODF 100 151 1.5 bouyer #define IMX6QCLK_AXI 101 152 1.5 bouyer #define IMX6QCLK_MMDC_CH0_AXI_PODF 102 153 1.5 bouyer #define IMX6QCLK_MMDC_CH1_AXI_PODF 103 154 1.5 bouyer #define IMX6QCLK_ARM 104 155 1.5 bouyer #define IMX6QCLK_AHB 105 156 1.5 bouyer #define IMX6QCLK_APBH_DMA 106 157 1.5 bouyer #define IMX6QCLK_ASRC 107 158 1.5 bouyer #define IMX6QCLK_CAN1_IPG 108 159 1.5 bouyer #define IMX6QCLK_CAN1_SERIAL 109 160 1.5 bouyer #define IMX6QCLK_CAN2_IPG 110 161 1.5 bouyer #define IMX6QCLK_CAN2_SERIAL 111 162 1.5 bouyer #define IMX6QCLK_ECSPI1 112 163 1.5 bouyer #define IMX6QCLK_ECSPI2 113 164 1.5 bouyer #define IMX6QCLK_ECSPI3 114 165 1.5 bouyer #define IMX6QCLK_ECSPI4 115 166 1.5 bouyer #define IMX6QCLK_ECSPI5 116 /* i.MX6Q */ 167 1.5 bouyer #define IMX6QCLK_I2C4 116 /* i.MX6DL */ 168 1.5 bouyer #define IMX6QCLK_ENET 117 169 1.5 bouyer #define IMX6QCLK_ESAI_EXTAL 118 170 1.5 bouyer #define IMX6QCLK_GPT_IPG 119 171 1.5 bouyer #define IMX6QCLK_GPT_IPG_PER 120 172 1.5 bouyer #define IMX6QCLK_GPU2D_CORE 121 173 1.5 bouyer #define IMX6QCLK_GPU3D_CORE 122 174 1.5 bouyer #define IMX6QCLK_HDMI_IAHB 123 175 1.5 bouyer #define IMX6QCLK_HDMI_ISFR 124 176 1.5 bouyer #define IMX6QCLK_I2C1 125 177 1.5 bouyer #define IMX6QCLK_I2C2 126 178 1.5 bouyer #define IMX6QCLK_I2C3 127 179 1.5 bouyer #define IMX6QCLK_IIM 128 180 1.5 bouyer #define IMX6QCLK_ENFC 129 181 1.5 bouyer #define IMX6QCLK_IPU1 130 182 1.5 bouyer #define IMX6QCLK_IPU1_DI0 131 183 1.5 bouyer #define IMX6QCLK_IPU1_DI1 132 184 1.5 bouyer #define IMX6QCLK_IPU2 133 185 1.5 bouyer #define IMX6QCLK_IPU2_DI0 134 186 1.5 bouyer #define IMX6QCLK_LDB_DI0 135 187 1.5 bouyer #define IMX6QCLK_LDB_DI1 136 188 1.5 bouyer #define IMX6QCLK_IPU2_DI1 137 189 1.5 bouyer #define IMX6QCLK_HSI_TX 138 190 1.5 bouyer #define IMX6QCLK_MLB 139 191 1.5 bouyer #define IMX6QCLK_MMDC_CH0_AXI 140 192 1.5 bouyer #define IMX6QCLK_MMDC_CH1_AXI 141 193 1.5 bouyer #define IMX6QCLK_OCRAM 142 194 1.5 bouyer #define IMX6QCLK_OPENVG_AXI 143 195 1.5 bouyer #define IMX6QCLK_PCIE_AXI 144 196 1.5 bouyer #define IMX6QCLK_PWM1 145 197 1.5 bouyer #define IMX6QCLK_PWM2 146 198 1.5 bouyer #define IMX6QCLK_PWM3 147 199 1.5 bouyer #define IMX6QCLK_PWM4 148 200 1.5 bouyer #define IMX6QCLK_PER1_BCH 149 201 1.5 bouyer #define IMX6QCLK_GPMI_BCH_APB 150 202 1.5 bouyer #define IMX6QCLK_GPMI_BCH 151 203 1.5 bouyer #define IMX6QCLK_GPMI_IO 152 204 1.5 bouyer #define IMX6QCLK_GPMI_APB 153 205 1.5 bouyer #define IMX6QCLK_SATA 154 206 1.5 bouyer #define IMX6QCLK_SDMA 155 207 1.5 bouyer #define IMX6QCLK_SPBA 156 208 1.5 bouyer #define IMX6QCLK_SSI1 157 209 1.5 bouyer #define IMX6QCLK_SSI2 158 210 1.5 bouyer #define IMX6QCLK_SSI3 159 211 1.5 bouyer #define IMX6QCLK_UART_IPG 160 212 1.5 bouyer #define IMX6QCLK_UART_SERIAL 161 213 1.5 bouyer #define IMX6QCLK_USBOH3 162 214 1.5 bouyer #define IMX6QCLK_USDHC1 163 215 1.5 bouyer #define IMX6QCLK_USDHC2 164 216 1.5 bouyer #define IMX6QCLK_USDHC3 165 217 1.5 bouyer #define IMX6QCLK_USDHC4 166 218 1.5 bouyer #define IMX6QCLK_VDO_AXI 167 219 1.5 bouyer #define IMX6QCLK_VPU_AXI 168 220 1.5 bouyer #define IMX6QCLK_CKO1 169 221 1.5 bouyer #define IMX6QCLK_PLL1_SYS 170 222 1.5 bouyer #define IMX6QCLK_PLL2_BUS 171 223 1.5 bouyer #define IMX6QCLK_PLL3_USB_OTG 172 224 1.5 bouyer #define IMX6QCLK_PLL4_AUDIO 173 225 1.5 bouyer #define IMX6QCLK_PLL5_VIDEO 174 226 1.5 bouyer #define IMX6QCLK_PLL8_MLB 175 227 1.5 bouyer #define IMX6QCLK_PLL7_USB_HOST 176 228 1.5 bouyer #define IMX6QCLK_PLL6_ENET 177 229 1.5 bouyer #define IMX6QCLK_SSI1_IPG 178 230 1.5 bouyer #define IMX6QCLK_SSI2_IPG 179 231 1.5 bouyer #define IMX6QCLK_SSI3_IPG 180 232 1.5 bouyer #define IMX6QCLK_ROM 181 233 1.5 bouyer #define IMX6QCLK_USBPHY1 182 234 1.5 bouyer #define IMX6QCLK_USBPHY2 183 235 1.5 bouyer #define IMX6QCLK_LDB_DI0_DIV_3_5 184 236 1.5 bouyer #define IMX6QCLK_LDB_DI1_DIV_3_5 185 237 1.5 bouyer #define IMX6QCLK_SATA_REF 186 238 1.5 bouyer #define IMX6QCLK_SATA_REF_100M 187 239 1.5 bouyer #define IMX6QCLK_PCIE_REF 188 240 1.5 bouyer #define IMX6QCLK_PCIE_REF_125M 189 241 1.5 bouyer #define IMX6QCLK_ENET_REF 190 242 1.5 bouyer #define IMX6QCLK_USBPHY1_GATE 191 243 1.5 bouyer #define IMX6QCLK_USBPHY2_GATE 192 244 1.5 bouyer #define IMX6QCLK_PLL4_POST_DIV 193 245 1.5 bouyer #define IMX6QCLK_PLL5_POST_DIV 194 246 1.5 bouyer #define IMX6QCLK_PLL5_VIDEO_DIV 195 247 1.5 bouyer #define IMX6QCLK_EIM_SLOW 196 248 1.5 bouyer #define IMX6QCLK_SPDIF 197 249 1.5 bouyer #define IMX6QCLK_CKO2_SEL 198 250 1.5 bouyer #define IMX6QCLK_CKO2_PODF 199 251 1.5 bouyer #define IMX6QCLK_CKO2 200 252 1.5 bouyer #define IMX6QCLK_CKO 201 253 1.5 bouyer #define IMX6QCLK_VDOA 202 254 1.5 bouyer #define IMX6QCLK_PLL4_AUDIO_DIV 203 255 1.5 bouyer #define IMX6QCLK_LVDS1_SEL 204 256 1.5 bouyer #define IMX6QCLK_LVDS2_SEL 205 257 1.5 bouyer #define IMX6QCLK_LVDS1_GATE 206 258 1.5 bouyer #define IMX6QCLK_LVDS2_GATE 207 259 1.5 bouyer #define IMX6QCLK_ESAI_IPG 208 260 1.5 bouyer #define IMX6QCLK_ESAI_MEM 209 261 1.5 bouyer #define IMX6QCLK_ASRC_IPG 210 262 1.5 bouyer #define IMX6QCLK_ASRC_MEM 211 263 1.5 bouyer #define IMX6QCLK_LVDS1_IN 212 264 1.5 bouyer #define IMX6QCLK_LVDS2_IN 213 265 1.5 bouyer #define IMX6QCLK_ANACLK1 214 266 1.5 bouyer #define IMX6QCLK_ANACLK2 215 267 1.5 bouyer #define IMX6QCLK_PLL1_BYPASS_SRC 216 268 1.5 bouyer #define IMX6QCLK_PLL2_BYPASS_SRC 217 269 1.5 bouyer #define IMX6QCLK_PLL3_BYPASS_SRC 218 270 1.5 bouyer #define IMX6QCLK_PLL4_BYPASS_SRC 219 271 1.5 bouyer #define IMX6QCLK_PLL5_BYPASS_SRC 220 272 1.5 bouyer #define IMX6QCLK_PLL6_BYPASS_SRC 221 273 1.5 bouyer #define IMX6QCLK_PLL7_BYPASS_SRC 222 274 1.5 bouyer #define IMX6QCLK_PLL1 223 275 1.5 bouyer #define IMX6QCLK_PLL2 224 276 1.5 bouyer #define IMX6QCLK_PLL3 225 277 1.5 bouyer #define IMX6QCLK_PLL4 226 278 1.5 bouyer #define IMX6QCLK_PLL5 227 279 1.5 bouyer #define IMX6QCLK_PLL6 228 280 1.5 bouyer #define IMX6QCLK_PLL7 229 281 1.5 bouyer #define IMX6QCLK_PLL1_BYPASS 230 282 1.5 bouyer #define IMX6QCLK_PLL2_BYPASS 231 283 1.5 bouyer #define IMX6QCLK_PLL3_BYPASS 232 284 1.5 bouyer #define IMX6QCLK_PLL4_BYPASS 233 285 1.5 bouyer #define IMX6QCLK_PLL5_BYPASS 234 286 1.5 bouyer #define IMX6QCLK_PLL6_BYPASS 235 287 1.5 bouyer #define IMX6QCLK_PLL7_BYPASS 236 288 1.5 bouyer #define IMX6QCLK_GPT_3M 237 289 1.5 bouyer #define IMX6QCLK_VIDEO_27M 238 290 1.5 bouyer #define IMX6QCLK_MIPI_CORE_CFG 239 291 1.5 bouyer #define IMX6QCLK_MIPI_IPG 240 292 1.5 bouyer #define IMX6QCLK_CAAM_MEM 241 293 1.5 bouyer #define IMX6QCLK_CAAM_ACLK 242 294 1.5 bouyer #define IMX6QCLK_CAAM_IPG 243 295 1.5 bouyer #define IMX6QCLK_SPDIF_GCLK 244 296 1.5 bouyer #define IMX6QCLK_UART_SEL 245 297 1.5 bouyer #define IMX6QCLK_IPG_PER_SEL 246 298 1.5 bouyer #define IMX6QCLK_ECSPI_SEL 247 299 1.5 bouyer #define IMX6QCLK_CAN_SEL 248 300 1.5 bouyer #define IMX6QCLK_MMDC_CH1_AXI_CG 249 301 1.5 bouyer #define IMX6QCLK_PRE0 250 302 1.5 bouyer #define IMX6QCLK_PRE1 251 303 1.5 bouyer #define IMX6QCLK_PRE2 252 304 1.5 bouyer #define IMX6QCLK_PRE3 253 305 1.5 bouyer #define IMX6QCLK_PRG0_AXI 254 306 1.5 bouyer #define IMX6QCLK_PRG1_AXI 255 307 1.5 bouyer #define IMX6QCLK_PRG0_APB 256 308 1.5 bouyer #define IMX6QCLK_PRG1_APB 257 309 1.5 bouyer #define IMX6QCLK_PRE_AXI 258 310 1.5 bouyer #define IMX6QCLK_MLB_SEL 259 311 1.5 bouyer #define IMX6QCLK_MLB_PODF 260 312 1.5 bouyer #define IMX6QCLK_END 261 313 1.5 bouyer /* Clock Parents Tables */ 314 1.5 bouyer static const char *step_p[] = { 315 1.5 bouyer "osc", 316 1.5 bouyer "pll2_pfd2_396m" 317 1.5 bouyer }; 318 1.5 bouyer 319 1.5 bouyer static const char *pll1_sw_p[] = { 320 1.5 bouyer "pll1_sys", 321 1.5 bouyer "step" 322 1.5 bouyer }; 323 1.5 bouyer 324 1.5 bouyer static const char *periph_pre_p[] = { 325 1.5 bouyer "pll2_bus", 326 1.5 bouyer "pll2_pfd2_396m", 327 1.5 bouyer "pll2_pfd0_352m", 328 1.5 bouyer "pll2_198m" 329 1.5 bouyer }; 330 1.5 bouyer 331 1.5 bouyer static const char *periph_clk2_p[] = { 332 1.5 bouyer "pll3_usb_otg", 333 1.5 bouyer "osc", 334 1.5 bouyer "osc", 335 1.5 bouyer "dummy" 336 1.5 bouyer }; 337 1.5 bouyer 338 1.5 bouyer static const char *periph2_clk2_p[] = { 339 1.5 bouyer "pll3_usb_otg", 340 1.5 bouyer "pll2_bus" 341 1.5 bouyer }; 342 1.5 bouyer 343 1.5 bouyer static const char *axi_p[] = { 344 1.5 bouyer "periph", 345 1.5 bouyer "pll2_pfd2_396m", 346 1.5 bouyer "periph", 347 1.5 bouyer "pll3_pfd1_540m" 348 1.5 bouyer }; 349 1.5 bouyer 350 1.5 bouyer static const char *audio_p[] = { 351 1.5 bouyer "pll4_audio_div", 352 1.5 bouyer "pll3_pfd2_508m", 353 1.5 bouyer "pll3_pfd3_454m", 354 1.5 bouyer "pll3_usb_otg" 355 1.5 bouyer }; 356 1.5 bouyer 357 1.5 bouyer static const char *gpu2d_core_p[] = { 358 1.5 bouyer "axi", 359 1.5 bouyer "pll3_usb_otg", 360 1.5 bouyer "pll2_pfd0_352m", 361 1.5 bouyer "pll2_pfd2_396m" 362 1.5 bouyer }; 363 1.5 bouyer 364 1.5 bouyer static const char *gpu3d_core_p[] = { 365 1.5 bouyer "mmdc_ch0_axi", 366 1.5 bouyer "pll3_usb_otg", 367 1.5 bouyer "pll2_pfd1_594m", 368 1.5 bouyer "pll2_pfd2_396m" 369 1.5 bouyer }; 370 1.5 bouyer 371 1.5 bouyer static const char *gpu3d_shader_p[] = { 372 1.5 bouyer "mmdc_ch0_axi", 373 1.5 bouyer "pll3_usb_otg", 374 1.5 bouyer "pll2_pfd1_594m", 375 1.5 bouyer "pll3_pfd0_720m" 376 1.5 bouyer }; 377 1.5 bouyer 378 1.5 bouyer static const char *ipu_p[] = { 379 1.5 bouyer "mmdc_ch0_axi", 380 1.5 bouyer "pll2_pfd2_396m", 381 1.5 bouyer "pll3_120m", 382 1.5 bouyer "pll3_pfd1_540m" 383 1.5 bouyer }; 384 1.5 bouyer 385 1.5 bouyer static const char *pll_bypass_src_p[] = { 386 1.5 bouyer "osc", 387 1.5 bouyer "lvds1_in", 388 1.5 bouyer "lvds2_in", 389 1.5 bouyer "dummy" 390 1.5 bouyer }; 391 1.5 bouyer 392 1.5 bouyer static const char *pll1_bypass_p[] = { 393 1.5 bouyer "pll1", 394 1.5 bouyer "pll1_bypass_src" 395 1.5 bouyer }; 396 1.5 bouyer 397 1.5 bouyer static const char *pll2_bypass_p[] = { 398 1.5 bouyer "pll2", 399 1.5 bouyer "pll2_bypass_src" 400 1.5 bouyer }; 401 1.5 bouyer 402 1.5 bouyer static const char *pll3_bypass_p[] = { 403 1.5 bouyer "pll3", 404 1.5 bouyer "pll3_bypass_src" 405 1.5 bouyer }; 406 1.5 bouyer 407 1.5 bouyer static const char *pll4_bypass_p[] = { 408 1.5 bouyer "pll4", 409 1.5 bouyer "pll4_bypass_src" 410 1.5 bouyer }; 411 1.5 bouyer 412 1.5 bouyer static const char *pll5_bypass_p[] = { 413 1.5 bouyer "pll5", 414 1.5 bouyer "pll5_bypass_src" 415 1.5 bouyer }; 416 1.5 bouyer 417 1.5 bouyer static const char *pll6_bypass_p[] = { 418 1.5 bouyer "pll6", 419 1.5 bouyer "pll6_bypass_src" 420 1.5 bouyer }; 421 1.5 bouyer 422 1.5 bouyer static const char *pll7_bypass_p[] = { 423 1.5 bouyer "pll7", 424 1.5 bouyer "pll7_bypass_src" 425 1.5 bouyer }; 426 1.5 bouyer 427 1.5 bouyer static const char *ipu_di_pre_p[] = { 428 1.5 bouyer "mmdc_ch0_axi", 429 1.5 bouyer "pll3_usb_otg", 430 1.5 bouyer "pll5_video_div", 431 1.5 bouyer "pll2_pfd0_352m", 432 1.5 bouyer "pll2_pfd2_396m", 433 1.5 bouyer "pll3_pfd1_540m" 434 1.5 bouyer }; 435 1.1 skrll 436 1.5 bouyer static const char *ipu1_di0_p[] = { 437 1.5 bouyer "ipu1_di0_pre", 438 1.5 bouyer "dummy", 439 1.5 bouyer "dummy", 440 1.5 bouyer "ldb_di0", 441 1.5 bouyer "ldb_di1" 442 1.1 skrll }; 443 1.1 skrll 444 1.5 bouyer static const char *ipu1_di1_p[] = { 445 1.5 bouyer "ipu1_di1_pre", 446 1.5 bouyer "dummy", 447 1.5 bouyer "dummy", 448 1.5 bouyer "ldb_di0", 449 1.5 bouyer "ldb_di1" 450 1.5 bouyer }; 451 1.5 bouyer 452 1.5 bouyer static const char *ipu2_di0_p[] = { 453 1.5 bouyer "ipu2_di0_pre", 454 1.5 bouyer "dummy", 455 1.5 bouyer "dummy", 456 1.5 bouyer "ldb_di0", 457 1.5 bouyer "ldb_di1" 458 1.5 bouyer }; 459 1.5 bouyer 460 1.5 bouyer static const char *ipu2_di1_p[] = { 461 1.5 bouyer "ipu2_di1_pre", 462 1.5 bouyer "dummy", 463 1.5 bouyer "dummy", 464 1.5 bouyer "ldb_di0", 465 1.5 bouyer "ldb_di1" 466 1.5 bouyer }; 467 1.5 bouyer 468 1.5 bouyer static const char *ldb_di_p[] = { 469 1.5 bouyer "pll5_video_div", 470 1.5 bouyer "pll2_pfd0_352m", 471 1.5 bouyer "pll2_pfd2_396m", 472 1.5 bouyer "mmdc_ch1_axi", 473 1.5 bouyer "pll3_usb_otg" 474 1.5 bouyer }; 475 1.5 bouyer 476 1.5 bouyer static const char *periph_p[] = { 477 1.5 bouyer "periph_pre", 478 1.5 bouyer "periph_clk2" 479 1.5 bouyer }; 480 1.5 bouyer 481 1.5 bouyer static const char *periph2_p[] = { 482 1.5 bouyer "periph2_pre", 483 1.5 bouyer "periph2_clk2" 484 1.5 bouyer }; 485 1.5 bouyer 486 1.5 bouyer static const char *vdo_axi_p[] = { 487 1.5 bouyer "axi", 488 1.5 bouyer "ahb" 489 1.5 bouyer }; 490 1.5 bouyer 491 1.5 bouyer static const char *vpu_axi_p[] = { 492 1.5 bouyer "axi", 493 1.5 bouyer "pll2_pfd2_396m", 494 1.5 bouyer "pll2_pfd0_352m" 495 1.5 bouyer }; 496 1.5 bouyer 497 1.5 bouyer static const char *cko1_p[] = { 498 1.5 bouyer "pll3_usb_otg", 499 1.5 bouyer "pll2_bus", 500 1.5 bouyer "pll1_sys", 501 1.5 bouyer "pll5_video_div", 502 1.5 bouyer "dummy", 503 1.5 bouyer "axi", 504 1.5 bouyer "enfc", 505 1.5 bouyer "ipu1_di0", 506 1.5 bouyer "ipu1_di1", 507 1.5 bouyer "ipu2_di0", 508 1.5 bouyer "ipu2_di1", 509 1.5 bouyer "ahb", 510 1.5 bouyer "ipg", 511 1.5 bouyer "ipg_per", 512 1.5 bouyer "ckil", 513 1.5 bouyer "pll4_audio_div" 514 1.5 bouyer }; 515 1.5 bouyer 516 1.5 bouyer static const char *cko2_p[] = { 517 1.5 bouyer "mmdc_ch0_axi", 518 1.5 bouyer "mmdc_ch1_axi", 519 1.5 bouyer "usdhc4", 520 1.5 bouyer "usdhc1", 521 1.5 bouyer "gpu2d_axi", 522 1.5 bouyer "dummy", 523 1.5 bouyer "ecspi_root", 524 1.5 bouyer "gpu3d_axi", 525 1.5 bouyer "usdhc3", 526 1.5 bouyer "dummy", 527 1.5 bouyer "arm", 528 1.5 bouyer "ipu1", 529 1.5 bouyer "ipu2", 530 1.5 bouyer "vdo_axi", 531 1.5 bouyer "osc", 532 1.5 bouyer "gpu2d_core", 533 1.5 bouyer "gpu3d_core", 534 1.5 bouyer "usdhc2", 535 1.5 bouyer "ssi1", 536 1.5 bouyer "ssi2", 537 1.5 bouyer "ssi3", 538 1.5 bouyer "gpu3d_shader", 539 1.5 bouyer "vpu_axi", 540 1.5 bouyer "can_root", 541 1.5 bouyer "ldb_di0", 542 1.5 bouyer "ldb_di1", 543 1.5 bouyer "esai_extal", 544 1.5 bouyer "eim_slow", 545 1.5 bouyer "uart_serial", 546 1.5 bouyer "spdif", 547 1.5 bouyer "asrc", 548 1.5 bouyer "hsi_tx" 549 1.5 bouyer }; 550 1.5 bouyer 551 1.5 bouyer static const char *cko_p[] = { 552 1.5 bouyer "cko1", 553 1.5 bouyer "cko2" 554 1.5 bouyer }; 555 1.5 bouyer 556 1.5 bouyer static const char *hsi_tx_p[] = { 557 1.5 bouyer "pll3_120m", 558 1.5 bouyer "pll2_pfd2_396m" 559 1.5 bouyer }; 560 1.5 bouyer 561 1.5 bouyer static const char *pcie_axi_p[] = { 562 1.5 bouyer "axi", 563 1.5 bouyer "ahb" 564 1.5 bouyer }; 565 1.5 bouyer 566 1.5 bouyer static const char *ssi_p[] = { 567 1.5 bouyer "pll3_pfd2_508m", 568 1.5 bouyer "pll3_pfd3_454m", 569 1.5 bouyer "pll4_audio_div" 570 1.5 bouyer }; 571 1.5 bouyer 572 1.5 bouyer static const char *usdhc_p[] = { 573 1.5 bouyer "pll2_pfd2_396m", 574 1.5 bouyer "pll2_pfd0_352m" 575 1.5 bouyer }; 576 1.5 bouyer 577 1.5 bouyer static const char *eim_p[] = { 578 1.5 bouyer "pll2_pfd2_396m", 579 1.5 bouyer "pll3_usb_otg", 580 1.5 bouyer "axi", 581 1.5 bouyer "pll2_pfd0_352m" 582 1.5 bouyer }; 583 1.5 bouyer 584 1.5 bouyer static const char *eim_slow_p[] = { 585 1.5 bouyer "axi", 586 1.5 bouyer "pll3_usb_otg", 587 1.5 bouyer "pll2_pfd2_396m", 588 1.5 bouyer "pll2_pfd0_352m" 589 1.5 bouyer }; 590 1.5 bouyer 591 1.5 bouyer static const char *enfc_p[] = { 592 1.5 bouyer "pll2_pfd0_352m", 593 1.5 bouyer "pll2_bus", 594 1.5 bouyer "pll3_usb_otg", 595 1.5 bouyer "pll2_pfd2_396m" 596 1.5 bouyer }; 597 1.5 bouyer 598 1.5 bouyer static const char *lvds_p[] = { 599 1.5 bouyer "dummy", 600 1.5 bouyer "dummy", 601 1.5 bouyer "dummy", 602 1.5 bouyer "dummy", 603 1.5 bouyer "dummy", 604 1.5 bouyer "dummy", 605 1.5 bouyer "pll4_audio", 606 1.5 bouyer "pll5_video", 607 1.5 bouyer "pll8_mlb", 608 1.5 bouyer "enet_ref", 609 1.5 bouyer "pcie_ref_125m", 610 1.5 bouyer "sata_ref_100m" 611 1.5 bouyer }; 612 1.5 bouyer 613 1.5 bouyer /* DT clock ID to clock name mappings */ 614 1.5 bouyer static struct imx_clock_id { 615 1.5 bouyer u_int id; 616 1.5 bouyer const char *name; 617 1.5 bouyer } imx6q_clock_ids[] = { 618 1.5 bouyer { IMX6QCLK_DUMMY, "dummy" }, 619 1.5 bouyer { IMX6QCLK_CKIL, "ckil" }, 620 1.8 skrll { IMX6QCLK_CKIH, "ckih1" }, 621 1.5 bouyer { IMX6QCLK_OSC, "osc" }, 622 1.5 bouyer { IMX6QCLK_PLL2_PFD0_352M, "pll2_pfd0_352m" }, 623 1.5 bouyer { IMX6QCLK_PLL2_PFD1_594M, "pll2_pfd1_594m" }, 624 1.5 bouyer { IMX6QCLK_PLL2_PFD2_396M, "pll2_pfd2_396m" }, 625 1.5 bouyer { IMX6QCLK_PLL3_PFD0_720M, "pll3_pfd0_720m" }, 626 1.5 bouyer { IMX6QCLK_PLL3_PFD1_540M, "pll3_pfd1_540m" }, 627 1.5 bouyer { IMX6QCLK_PLL3_PFD2_508M, "pll3_pfd2_508m" }, 628 1.5 bouyer { IMX6QCLK_PLL3_PFD3_454M, "pll3_pfd3_454m" }, 629 1.5 bouyer { IMX6QCLK_PLL2_198M, "pll2_198m" }, 630 1.5 bouyer { IMX6QCLK_PLL3_120M, "pll3_120m" }, 631 1.5 bouyer { IMX6QCLK_PLL3_80M, "pll3_80m" }, 632 1.5 bouyer { IMX6QCLK_PLL3_60M, "pll3_60m" }, 633 1.5 bouyer { IMX6QCLK_TWD, "twd" }, 634 1.5 bouyer { IMX6QCLK_STEP, "step" }, 635 1.5 bouyer { IMX6QCLK_PLL1_SW, "pll1_sw" }, 636 1.5 bouyer { IMX6QCLK_PERIPH_PRE, "periph_pre" }, 637 1.5 bouyer { IMX6QCLK_PERIPH2_PRE, "periph2_pre" }, 638 1.5 bouyer { IMX6QCLK_PERIPH_CLK2_SEL, "periph_clk2_sel" }, 639 1.5 bouyer { IMX6QCLK_PERIPH2_CLK2_SEL, "periph2_clk2_sel" }, 640 1.5 bouyer { IMX6QCLK_AXI_SEL, "axi_sel" }, 641 1.5 bouyer { IMX6QCLK_ESAI_SEL, "esai_sel" }, 642 1.5 bouyer { IMX6QCLK_ASRC_SEL, "asrc_sel" }, 643 1.5 bouyer { IMX6QCLK_SPDIF_SEL, "spdif_sel" }, 644 1.5 bouyer { IMX6QCLK_GPU2D_AXI, "gpu2d_axi" }, 645 1.5 bouyer { IMX6QCLK_GPU3D_AXI, "gpu3d_axi" }, 646 1.5 bouyer { IMX6QCLK_GPU2D_CORE_SEL, "gpu2d_core_sel" }, 647 1.5 bouyer { IMX6QCLK_GPU3D_CORE_SEL, "gpu3d_core_sel" }, 648 1.5 bouyer { IMX6QCLK_GPU3D_SHADER_SEL, "gpu3d_shader_sel" }, 649 1.5 bouyer { IMX6QCLK_IPU1_SEL, "ipu1_sel" }, 650 1.5 bouyer { IMX6QCLK_IPU2_SEL, "ipu2_sel" }, 651 1.5 bouyer { IMX6QCLK_LDB_DI0_SEL, "ldb_di0_sel" }, 652 1.5 bouyer { IMX6QCLK_LDB_DI1_SEL, "ldb_di1_sel" }, 653 1.5 bouyer { IMX6QCLK_IPU1_DI0_PRE_SEL, "ipu1_di0_pre_sel" }, 654 1.5 bouyer { IMX6QCLK_IPU1_DI1_PRE_SEL, "ipu1_di1_pre_sel" }, 655 1.5 bouyer { IMX6QCLK_IPU2_DI0_PRE_SEL, "ipu2_di0_pre_sel" }, 656 1.5 bouyer { IMX6QCLK_IPU2_DI1_PRE_SEL, "ipu2_di1_pre_sel" }, 657 1.5 bouyer { IMX6QCLK_IPU1_DI0_SEL, "ipu1_di0_sel" }, 658 1.5 bouyer { IMX6QCLK_IPU1_DI1_SEL, "ipu1_di1_sel" }, 659 1.5 bouyer { IMX6QCLK_IPU2_DI0_SEL, "ipu2_di0_sel" }, 660 1.5 bouyer { IMX6QCLK_IPU2_DI1_SEL, "ipu2_di1_sel" }, 661 1.5 bouyer { IMX6QCLK_HSI_TX_SEL, "hsi_tx_sel" }, 662 1.5 bouyer { IMX6QCLK_PCIE_AXI_SEL, "pcie_axi_sel" }, 663 1.5 bouyer { IMX6QCLK_SSI1_SEL, "ssi1_sel" }, 664 1.5 bouyer { IMX6QCLK_SSI2_SEL, "ssi2_sel" }, 665 1.5 bouyer { IMX6QCLK_SSI3_SEL, "ssi3_sel" }, 666 1.5 bouyer { IMX6QCLK_USDHC1_SEL, "usdhc1_sel" }, 667 1.5 bouyer { IMX6QCLK_USDHC2_SEL, "usdhc2_sel" }, 668 1.5 bouyer { IMX6QCLK_USDHC3_SEL, "usdhc3_sel" }, 669 1.5 bouyer { IMX6QCLK_USDHC4_SEL, "usdhc4_sel" }, 670 1.5 bouyer { IMX6QCLK_ENFC_SEL, "enfc_sel" }, 671 1.5 bouyer { IMX6QCLK_EIM_SEL, "eim_sel" }, 672 1.5 bouyer { IMX6QCLK_EIM_SLOW_SEL, "eim_slow_sel" }, 673 1.5 bouyer { IMX6QCLK_VDO_AXI_SEL, "vdo_axi_sel" }, 674 1.5 bouyer { IMX6QCLK_VPU_AXI_SEL, "vpu_axi_sel" }, 675 1.5 bouyer { IMX6QCLK_CKO1_SEL, "cko1_sel" }, 676 1.5 bouyer { IMX6QCLK_PERIPH, "periph" }, 677 1.5 bouyer { IMX6QCLK_PERIPH2, "periph2" }, 678 1.5 bouyer { IMX6QCLK_PERIPH_CLK2, "periph_clk2" }, 679 1.5 bouyer { IMX6QCLK_PERIPH2_CLK2, "periph2_clk2" }, 680 1.5 bouyer { IMX6QCLK_IPG, "ipg" }, 681 1.5 bouyer { IMX6QCLK_IPG_PER, "ipg_per" }, 682 1.5 bouyer { IMX6QCLK_ESAI_PRED, "esai_pred" }, 683 1.5 bouyer { IMX6QCLK_ESAI_PODF, "esai_podf" }, 684 1.5 bouyer { IMX6QCLK_ASRC_PRED, "asrc_pred" }, 685 1.5 bouyer { IMX6QCLK_ASRC_PODF, "asrc_podf" }, 686 1.5 bouyer { IMX6QCLK_SPDIF_PRED, "spdif_pred" }, 687 1.5 bouyer { IMX6QCLK_SPDIF_PODF, "spdif_podf" }, 688 1.5 bouyer { IMX6QCLK_CAN_ROOT, "can_root" }, 689 1.5 bouyer { IMX6QCLK_ECSPI_ROOT, "ecspi_root" }, 690 1.5 bouyer { IMX6QCLK_GPU2D_CORE_PODF, "gpu2d_core_podf" }, 691 1.5 bouyer { IMX6QCLK_GPU3D_CORE_PODF, "gpu3d_core_podf" }, 692 1.5 bouyer { IMX6QCLK_GPU3D_SHADER, "gpu3d_shader" }, 693 1.5 bouyer { IMX6QCLK_IPU1_PODF, "ipu1_podf" }, 694 1.5 bouyer { IMX6QCLK_IPU2_PODF, "ipu2_podf" }, 695 1.5 bouyer { IMX6QCLK_LDB_DI0_PODF, "ldb_di0_podf" }, 696 1.5 bouyer { IMX6QCLK_LDB_DI1_PODF, "ldb_di1_podf" }, 697 1.5 bouyer { IMX6QCLK_IPU1_DI0_PRE, "ipu1_di0_pre" }, 698 1.5 bouyer { IMX6QCLK_IPU1_DI1_PRE, "ipu1_di1_pre" }, 699 1.5 bouyer { IMX6QCLK_IPU2_DI0_PRE, "ipu2_di0_pre" }, 700 1.5 bouyer { IMX6QCLK_IPU2_DI1_PRE, "ipu2_di1_pre" }, 701 1.5 bouyer { IMX6QCLK_HSI_TX_PODF, "hsi_tx_podf" }, 702 1.5 bouyer { IMX6QCLK_SSI1_PRED, "ssi1_pred" }, 703 1.5 bouyer { IMX6QCLK_SSI1_PODF, "ssi1_podf" }, 704 1.5 bouyer { IMX6QCLK_SSI2_PRED, "ssi2_pred" }, 705 1.5 bouyer { IMX6QCLK_SSI2_PODF, "ssi2_podf" }, 706 1.5 bouyer { IMX6QCLK_SSI3_PRED, "ssi3_pred" }, 707 1.5 bouyer { IMX6QCLK_SSI3_PODF, "ssi3_podf" }, 708 1.5 bouyer { IMX6QCLK_UART_SERIAL_PODF, "uart_serial_podf" }, 709 1.5 bouyer { IMX6QCLK_USDHC1_PODF, "usdhc1_podf" }, 710 1.5 bouyer { IMX6QCLK_USDHC2_PODF, "usdhc2_podf" }, 711 1.5 bouyer { IMX6QCLK_USDHC3_PODF, "usdhc3_podf" }, 712 1.5 bouyer { IMX6QCLK_USDHC4_PODF, "usdhc4_podf" }, 713 1.5 bouyer { IMX6QCLK_ENFC_PRED, "enfc_pred" }, 714 1.5 bouyer { IMX6QCLK_ENFC_PODF, "enfc_podf" }, 715 1.5 bouyer { IMX6QCLK_EIM_PODF, "eim_podf" }, 716 1.5 bouyer { IMX6QCLK_EIM_SLOW_PODF, "eim_slow_podf" }, 717 1.5 bouyer { IMX6QCLK_VPU_AXI_PODF, "vpu_axi_podf" }, 718 1.5 bouyer { IMX6QCLK_CKO1_PODF, "cko1_podf" }, 719 1.5 bouyer { IMX6QCLK_AXI, "axi" }, 720 1.5 bouyer { IMX6QCLK_MMDC_CH0_AXI_PODF, "mmdc_ch0_axi_podf" }, 721 1.5 bouyer { IMX6QCLK_MMDC_CH1_AXI_PODF, "mmdc_ch1_axi_podf" }, 722 1.5 bouyer { IMX6QCLK_ARM, "arm" }, 723 1.5 bouyer { IMX6QCLK_AHB, "ahb" }, 724 1.5 bouyer { IMX6QCLK_APBH_DMA, "apbh_dma" }, 725 1.5 bouyer { IMX6QCLK_ASRC, "asrc" }, 726 1.5 bouyer { IMX6QCLK_CAN1_IPG, "can1_ipg" }, 727 1.5 bouyer { IMX6QCLK_CAN1_SERIAL, "can1_serial" }, 728 1.5 bouyer { IMX6QCLK_CAN2_IPG, "can2_ipg" }, 729 1.5 bouyer { IMX6QCLK_CAN2_SERIAL, "can2_serial" }, 730 1.5 bouyer { IMX6QCLK_ECSPI1, "ecspi1" }, 731 1.5 bouyer { IMX6QCLK_ECSPI2, "ecspi2" }, 732 1.5 bouyer { IMX6QCLK_ECSPI3, "ecspi3" }, 733 1.5 bouyer { IMX6QCLK_ECSPI4, "ecspi4" }, 734 1.5 bouyer { IMX6QCLK_ECSPI5, "ecspi5" }, 735 1.5 bouyer { IMX6QCLK_ENET, "enet" }, 736 1.5 bouyer { IMX6QCLK_ESAI_EXTAL, "esai_extal" }, 737 1.5 bouyer { IMX6QCLK_GPT_IPG, "gpt_ipg" }, 738 1.5 bouyer { IMX6QCLK_GPT_IPG_PER, "gpt_ipg_per" }, 739 1.5 bouyer { IMX6QCLK_GPU2D_CORE, "gpu2d_core" }, 740 1.5 bouyer { IMX6QCLK_GPU3D_CORE, "gpu3d_core" }, 741 1.5 bouyer { IMX6QCLK_HDMI_IAHB, "hdmi_iahb" }, 742 1.5 bouyer { IMX6QCLK_HDMI_ISFR, "hdmi_isfr" }, 743 1.5 bouyer { IMX6QCLK_I2C1, "i2c1" }, 744 1.5 bouyer { IMX6QCLK_I2C2, "i2c2" }, 745 1.5 bouyer { IMX6QCLK_I2C3, "i2c3" }, 746 1.5 bouyer { IMX6QCLK_IIM, "iim" }, 747 1.5 bouyer { IMX6QCLK_ENFC, "enfc" }, 748 1.5 bouyer { IMX6QCLK_IPU1, "ipu1" }, 749 1.5 bouyer { IMX6QCLK_IPU1_DI0, "ipu1_di0" }, 750 1.5 bouyer { IMX6QCLK_IPU1_DI1, "ipu1_di1" }, 751 1.5 bouyer { IMX6QCLK_IPU2, "ipu2" }, 752 1.5 bouyer { IMX6QCLK_IPU2_DI0, "ipu2_di0" }, 753 1.5 bouyer { IMX6QCLK_LDB_DI0, "ldb_di0" }, 754 1.5 bouyer { IMX6QCLK_LDB_DI1, "ldb_di1" }, 755 1.5 bouyer { IMX6QCLK_IPU2_DI1, "ipu2_di1" }, 756 1.5 bouyer { IMX6QCLK_HSI_TX, "hsi_tx" }, 757 1.5 bouyer { IMX6QCLK_MLB, "mlb" }, 758 1.5 bouyer { IMX6QCLK_MMDC_CH0_AXI, "mmdc_ch0_axi" }, 759 1.5 bouyer { IMX6QCLK_MMDC_CH1_AXI, "mmdc_ch1_axi" }, 760 1.5 bouyer { IMX6QCLK_OCRAM, "ocram" }, 761 1.5 bouyer { IMX6QCLK_OPENVG_AXI, "openvg_axi" }, 762 1.5 bouyer { IMX6QCLK_PCIE_AXI, "pcie_axi" }, 763 1.5 bouyer { IMX6QCLK_PWM1, "pwm1" }, 764 1.5 bouyer { IMX6QCLK_PWM2, "pwm2" }, 765 1.5 bouyer { IMX6QCLK_PWM3, "pwm3" }, 766 1.5 bouyer { IMX6QCLK_PWM4, "pwm4" }, 767 1.5 bouyer { IMX6QCLK_PER1_BCH, "per1_bch" }, 768 1.5 bouyer { IMX6QCLK_GPMI_BCH_APB, "gpmi_bch_apb" }, 769 1.5 bouyer { IMX6QCLK_GPMI_BCH, "gpmi_bch" }, 770 1.5 bouyer { IMX6QCLK_GPMI_IO, "gpmi_io" }, 771 1.5 bouyer { IMX6QCLK_GPMI_APB, "gpmi_apb" }, 772 1.5 bouyer { IMX6QCLK_SATA, "sata" }, 773 1.5 bouyer { IMX6QCLK_SDMA, "sdma" }, 774 1.5 bouyer { IMX6QCLK_SPBA, "spba" }, 775 1.5 bouyer { IMX6QCLK_SSI1, "ssi1" }, 776 1.5 bouyer { IMX6QCLK_SSI2, "ssi2" }, 777 1.5 bouyer { IMX6QCLK_SSI3, "ssi3" }, 778 1.5 bouyer { IMX6QCLK_UART_IPG, "uart_ipg" }, 779 1.5 bouyer { IMX6QCLK_UART_SERIAL, "uart_serial" }, 780 1.5 bouyer { IMX6QCLK_USBOH3, "usboh3" }, 781 1.5 bouyer { IMX6QCLK_USDHC1, "usdhc1" }, 782 1.5 bouyer { IMX6QCLK_USDHC2, "usdhc2" }, 783 1.5 bouyer { IMX6QCLK_USDHC3, "usdhc3" }, 784 1.5 bouyer { IMX6QCLK_USDHC4, "usdhc4" }, 785 1.5 bouyer { IMX6QCLK_VDO_AXI, "vdo_axi" }, 786 1.5 bouyer { IMX6QCLK_VPU_AXI, "vpu_axi" }, 787 1.5 bouyer { IMX6QCLK_CKO1, "cko1" }, 788 1.5 bouyer { IMX6QCLK_PLL1_SYS, "pll1_sys" }, 789 1.5 bouyer { IMX6QCLK_PLL2_BUS, "pll2_bus" }, 790 1.5 bouyer { IMX6QCLK_PLL3_USB_OTG, "pll3_usb_otg" }, 791 1.5 bouyer { IMX6QCLK_PLL4_AUDIO, "pll4_audio" }, 792 1.5 bouyer { IMX6QCLK_PLL5_VIDEO, "pll5_video" }, 793 1.5 bouyer { IMX6QCLK_PLL8_MLB, "pll8_mlb" }, 794 1.5 bouyer { IMX6QCLK_PLL7_USB_HOST, "pll7_usb_host" }, 795 1.5 bouyer { IMX6QCLK_PLL6_ENET, "pll6_enet" }, 796 1.5 bouyer { IMX6QCLK_SSI1_IPG, "ssi1_ipg" }, 797 1.5 bouyer { IMX6QCLK_SSI2_IPG, "ssi2_ipg" }, 798 1.5 bouyer { IMX6QCLK_SSI3_IPG, "ssi3_ipg" }, 799 1.5 bouyer { IMX6QCLK_ROM, "rom" }, 800 1.5 bouyer { IMX6QCLK_USBPHY1, "usbphy1" }, 801 1.5 bouyer { IMX6QCLK_USBPHY2, "usbphy2" }, 802 1.5 bouyer { IMX6QCLK_LDB_DI0_DIV_3_5, "ldb_di0_div_3_5" }, 803 1.5 bouyer { IMX6QCLK_LDB_DI1_DIV_3_5, "ldb_di1_div_3_5" }, 804 1.5 bouyer { IMX6QCLK_SATA_REF, "sata_ref" }, 805 1.5 bouyer { IMX6QCLK_SATA_REF_100M, "sata_ref_100m" }, 806 1.5 bouyer { IMX6QCLK_PCIE_REF, "pcie_ref" }, 807 1.5 bouyer { IMX6QCLK_PCIE_REF_125M, "pcie_ref_125m" }, 808 1.5 bouyer { IMX6QCLK_ENET_REF, "enet_ref" }, 809 1.5 bouyer { IMX6QCLK_USBPHY1_GATE, "usbphy1_gate" }, 810 1.5 bouyer { IMX6QCLK_USBPHY2_GATE, "usbphy2_gate" }, 811 1.5 bouyer { IMX6QCLK_PLL4_POST_DIV, "pll4_post_div" }, 812 1.5 bouyer { IMX6QCLK_PLL5_POST_DIV, "pll5_post_div" }, 813 1.5 bouyer { IMX6QCLK_PLL5_VIDEO_DIV, "pll5_video_div" }, 814 1.5 bouyer { IMX6QCLK_EIM_SLOW, "eim_slow" }, 815 1.5 bouyer { IMX6QCLK_SPDIF, "spdif" }, 816 1.5 bouyer { IMX6QCLK_CKO2_SEL, "cko2_sel" }, 817 1.5 bouyer { IMX6QCLK_CKO2_PODF, "cko2_podf" }, 818 1.5 bouyer { IMX6QCLK_CKO2, "cko2" }, 819 1.5 bouyer { IMX6QCLK_CKO, "cko" }, 820 1.5 bouyer { IMX6QCLK_VDOA, "vdoa" }, 821 1.5 bouyer { IMX6QCLK_PLL4_AUDIO_DIV, "pll4_audio_div" }, 822 1.5 bouyer { IMX6QCLK_LVDS1_SEL, "lvds1_sel" }, 823 1.5 bouyer { IMX6QCLK_LVDS2_SEL, "lvds2_sel" }, 824 1.5 bouyer { IMX6QCLK_LVDS1_GATE, "lvds1_gate" }, 825 1.5 bouyer { IMX6QCLK_LVDS2_GATE, "lvds2_gate" }, 826 1.5 bouyer { IMX6QCLK_ESAI_IPG, "esai_ipg" }, 827 1.5 bouyer { IMX6QCLK_ESAI_MEM, "esai_mem" }, 828 1.5 bouyer { IMX6QCLK_ASRC_IPG, "asrc_ipg" }, 829 1.5 bouyer { IMX6QCLK_ASRC_MEM, "asrc_mem" }, 830 1.5 bouyer { IMX6QCLK_LVDS1_IN, "lvds1_in" }, 831 1.5 bouyer { IMX6QCLK_LVDS2_IN, "lvds2_in" }, 832 1.5 bouyer { IMX6QCLK_ANACLK1, "anaclk1" }, 833 1.5 bouyer { IMX6QCLK_ANACLK2, "anaclk2" }, 834 1.5 bouyer { IMX6QCLK_PLL1_BYPASS_SRC, "pll1_bypass_src" }, 835 1.5 bouyer { IMX6QCLK_PLL2_BYPASS_SRC, "pll2_bypass_src" }, 836 1.5 bouyer { IMX6QCLK_PLL3_BYPASS_SRC, "pll3_bypass_src" }, 837 1.5 bouyer { IMX6QCLK_PLL4_BYPASS_SRC, "pll4_bypass_src" }, 838 1.5 bouyer { IMX6QCLK_PLL5_BYPASS_SRC, "pll5_bypass_src" }, 839 1.5 bouyer { IMX6QCLK_PLL6_BYPASS_SRC, "pll6_bypass_src" }, 840 1.5 bouyer { IMX6QCLK_PLL7_BYPASS_SRC, "pll7_bypass_src" }, 841 1.5 bouyer { IMX6QCLK_PLL1, "pll1" }, 842 1.5 bouyer { IMX6QCLK_PLL2, "pll2" }, 843 1.5 bouyer { IMX6QCLK_PLL3, "pll3" }, 844 1.5 bouyer { IMX6QCLK_PLL4, "pll4" }, 845 1.5 bouyer { IMX6QCLK_PLL5, "pll5" }, 846 1.5 bouyer { IMX6QCLK_PLL6, "pll6" }, 847 1.5 bouyer { IMX6QCLK_PLL7, "pll7" }, 848 1.5 bouyer { IMX6QCLK_PLL1_BYPASS, "pll1_bypass" }, 849 1.5 bouyer { IMX6QCLK_PLL2_BYPASS, "pll2_bypass" }, 850 1.5 bouyer { IMX6QCLK_PLL3_BYPASS, "pll3_bypass" }, 851 1.5 bouyer { IMX6QCLK_PLL4_BYPASS, "pll4_bypass" }, 852 1.5 bouyer { IMX6QCLK_PLL5_BYPASS, "pll5_bypass" }, 853 1.5 bouyer { IMX6QCLK_PLL6_BYPASS, "pll6_bypass" }, 854 1.5 bouyer { IMX6QCLK_PLL7_BYPASS, "pll7_bypass" }, 855 1.5 bouyer { IMX6QCLK_GPT_3M, "gpt_3m" }, 856 1.5 bouyer { IMX6QCLK_VIDEO_27M, "video_27m" }, 857 1.5 bouyer { IMX6QCLK_MIPI_CORE_CFG, "mipi_core_cfg" }, 858 1.5 bouyer { IMX6QCLK_MIPI_IPG, "mipi_ipg" }, 859 1.5 bouyer { IMX6QCLK_CAAM_MEM, "caam_mem" }, 860 1.5 bouyer { IMX6QCLK_CAAM_ACLK, "caam_aclk" }, 861 1.5 bouyer { IMX6QCLK_CAAM_IPG, "caam_ipg" }, 862 1.5 bouyer { IMX6QCLK_SPDIF_GCLK, "spdif_gclk" }, 863 1.5 bouyer { IMX6QCLK_UART_SEL, "uart_sel" }, 864 1.5 bouyer { IMX6QCLK_IPG_PER_SEL, "ipg_per_sel" }, 865 1.5 bouyer { IMX6QCLK_ECSPI_SEL, "ecspi_sel" }, 866 1.5 bouyer { IMX6QCLK_CAN_SEL, "can_sel" }, 867 1.5 bouyer { IMX6QCLK_MMDC_CH1_AXI_CG, "mmdc_ch1_axi_cg" }, 868 1.5 bouyer { IMX6QCLK_PRE0, "pre0" }, 869 1.5 bouyer { IMX6QCLK_PRE1, "pre1" }, 870 1.5 bouyer { IMX6QCLK_PRE2, "pre2" }, 871 1.5 bouyer { IMX6QCLK_PRE3, "pre3" }, 872 1.5 bouyer { IMX6QCLK_PRG0_AXI, "prg0_axi" }, 873 1.5 bouyer { IMX6QCLK_PRG1_AXI, "prg1_axi" }, 874 1.5 bouyer { IMX6QCLK_PRG0_APB, "prg0_apb" }, 875 1.5 bouyer { IMX6QCLK_PRG1_APB, "prg1_apb" }, 876 1.5 bouyer { IMX6QCLK_PRE_AXI, "pre_axi" }, 877 1.5 bouyer { IMX6QCLK_MLB_SEL, "mlb_sel" }, 878 1.5 bouyer { IMX6QCLK_MLB_PODF, "mlb_podf" }, 879 1.5 bouyer { IMX6QCLK_END, "end" }, 880 1.5 bouyer }; 881 1.5 bouyer 882 1.5 bouyer /* Clock Divider Tables */ 883 1.5 bouyer static const int enet_ref_tbl[] = { 20, 10, 5, 4, 0 }; 884 1.5 bouyer static const int post_div_tbl[] = { 4, 2, 1, 0 }; 885 1.5 bouyer static const int audiovideo_div_tbl[] = { 1, 2, 1, 4, 0 }; 886 1.5 bouyer 887 1.5 bouyer static struct imx6_clk imx6q_clks[] = { 888 1.5 bouyer CLK_FIXED("dummy", 0), 889 1.5 bouyer 890 1.5 bouyer CLK_FIXED("ckil", IMX6_CKIL_FREQ), 891 1.8 skrll CLK_FIXED("ckih1", IMX6_CKIH_FREQ), 892 1.5 bouyer CLK_FIXED("osc", IMX6_OSC_FREQ), 893 1.5 bouyer CLK_FIXED("anaclk1", IMX6_ANACLK1_FREQ), 894 1.5 bouyer CLK_FIXED("anaclk2", IMX6_ANACLK2_FREQ), 895 1.5 bouyer 896 1.5 bouyer CLK_FIXED_FACTOR("sata_ref", "pll6_enet", 5, 1), 897 1.5 bouyer CLK_FIXED_FACTOR("pcie_ref", "pll6_enet", 4, 1), 898 1.5 bouyer CLK_FIXED_FACTOR("pll2_198m", "pll2_pfd2_396m", 2, 1), 899 1.5 bouyer CLK_FIXED_FACTOR("pll3_120m", "pll3_usb_otg", 4, 1), 900 1.5 bouyer CLK_FIXED_FACTOR("pll3_80m", "pll3_usb_otg", 6, 1), 901 1.5 bouyer CLK_FIXED_FACTOR("pll3_60m", "pll3_usb_otg", 8, 1), 902 1.5 bouyer CLK_FIXED_FACTOR("twd", "arm", 2, 1), 903 1.5 bouyer CLK_FIXED_FACTOR("gpt_3m", "osc", 8, 1), 904 1.5 bouyer CLK_FIXED_FACTOR("video_27m", "pll3_pfd1_540m", 20, 1), 905 1.5 bouyer CLK_FIXED_FACTOR("gpu2d_axi", "mmdc_ch0_axi_podf", 1, 1), 906 1.5 bouyer CLK_FIXED_FACTOR("gpu3d_axi", "mmdc_ch0_axi_podf", 1, 1), 907 1.5 bouyer CLK_FIXED_FACTOR("ldb_di0_div_3_5", "ldb_di0_sel", 7, 2), 908 1.5 bouyer CLK_FIXED_FACTOR("ldb_di1_div_3_5", "ldb_di1_sel", 7, 2), 909 1.5 bouyer 910 1.5 bouyer CLK_PFD("pll2_pfd0_352m", "pll2_bus", PFD_528, 0), 911 1.5 bouyer CLK_PFD("pll2_pfd1_594m", "pll2_bus", PFD_528, 1), 912 1.5 bouyer CLK_PFD("pll2_pfd2_396m", "pll2_bus", PFD_528, 2), 913 1.5 bouyer CLK_PFD("pll3_pfd0_720m", "pll3_usb_otg", PFD_480, 0), 914 1.5 bouyer CLK_PFD("pll3_pfd1_540m", "pll3_usb_otg", PFD_480, 1), 915 1.5 bouyer CLK_PFD("pll3_pfd2_508m", "pll3_usb_otg", PFD_480, 2), 916 1.5 bouyer CLK_PFD("pll3_pfd3_454m", "pll3_usb_otg", PFD_480, 3), 917 1.5 bouyer 918 1.5 bouyer CLK_PLL("pll1", "osc", SYS, PLL_ARM, DIV_SELECT, POWERDOWN, 0), 919 1.5 bouyer CLK_PLL("pll2", "osc", GENERIC, PLL_SYS, DIV_SELECT, POWERDOWN, 0), 920 1.5 bouyer CLK_PLL("pll3", "osc", USB, PLL_USB1, DIV_SELECT, POWER, 0), 921 1.5 bouyer CLK_PLL("pll4", "osc", AUDIO_VIDEO, PLL_AUDIO, DIV_SELECT, POWERDOWN, 0), 922 1.5 bouyer CLK_PLL("pll5", "osc", AUDIO_VIDEO, PLL_VIDEO, DIV_SELECT, POWERDOWN, 0), 923 1.5 bouyer CLK_PLL("pll6", "osc", ENET, PLL_ENET, DIV_SELECT, POWERDOWN, 500000000), 924 1.5 bouyer CLK_PLL("pll7", "osc", USB, PLL_USB2, DIV_SELECT, POWER, 0), 925 1.5 bouyer 926 1.5 bouyer CLK_DIV("periph_clk2", "periph_clk2_sel", CBCDR, PERIPH_CLK2_PODF), 927 1.5 bouyer CLK_DIV("periph2_clk2", "periph2_clk2_sel", CBCDR, PERIPH2_CLK2_PODF), 928 1.5 bouyer CLK_DIV("ipg", "ahb", CBCDR, IPG_PODF), 929 1.5 bouyer CLK_DIV("esai_pred", "esai_sel", CS1CDR, ESAI_CLK_PRED), 930 1.5 bouyer CLK_DIV("esai_podf", "esai_pred", CS1CDR, ESAI_CLK_PODF), 931 1.5 bouyer CLK_DIV("asrc_pred", "asrc_sel", CDCDR, SPDIF1_CLK_PRED), 932 1.5 bouyer CLK_DIV("asrc_podf", "asrc_pred", CDCDR, SPDIF1_CLK_PODF), 933 1.5 bouyer CLK_DIV("spdif_pred", "spdif_sel", CDCDR, SPDIF0_CLK_PRED), 934 1.5 bouyer CLK_DIV("spdif_podf", "spdif_pred", CDCDR, SPDIF0_CLK_PODF), 935 1.5 bouyer CLK_DIV("ecspi_root", "pll3_60m", CSCDR2, ECSPI_CLK_PODF), 936 1.5 bouyer CLK_DIV("can_root", "pll3_60m", CSCMR2, CAN_CLK_PODF), 937 1.5 bouyer CLK_DIV("uart_serial_podf", "pll3_80m", CSCDR1, UART_CLK_PODF), 938 1.5 bouyer CLK_DIV("gpu2d_core_podf", "gpu2d_core_sel", CBCMR, GPU2D_CORE_CLK_PODF), 939 1.5 bouyer CLK_DIV("gpu3d_core_podf", "gpu3d_core_sel", CBCMR, GPU3D_CORE_PODF), 940 1.5 bouyer CLK_DIV("gpu3d_shader", "gpu3d_shader_sel", CBCMR, GPU3D_SHADER_PODF), 941 1.5 bouyer CLK_DIV("ipu1_podf", "ipu1_sel", CSCDR3, IPU1_HSP_PODF), 942 1.5 bouyer CLK_DIV("ipu2_podf", "ipu2_sel", CSCDR3, IPU2_HSP_PODF), 943 1.5 bouyer CLK_DIV("ldb_di0_podf", "ldb_di0_div_3_5", CSCMR2, LDB_DI0_IPU_DIV), 944 1.5 bouyer CLK_DIV("ldb_di1_podf", "ldb_di1_div_3_5", CSCMR2, LDB_DI1_IPU_DIV), 945 1.5 bouyer CLK_DIV("ipu1_di0_pre", "ipu1_di0_pre_sel", CHSCCDR, IPU1_DI0_PODF), 946 1.5 bouyer CLK_DIV("ipu1_di1_pre", "ipu1_di1_pre_sel", CHSCCDR, IPU1_DI1_PODF), 947 1.5 bouyer CLK_DIV("ipu2_di0_pre", "ipu2_di0_pre_sel", CSCDR2, IPU2_DI0_PODF), 948 1.5 bouyer CLK_DIV("ipu2_di1_pre", "ipu2_di1_pre_sel", CSCDR2, IPU2_DI1_PODF), 949 1.5 bouyer CLK_DIV("hsi_tx_podf", "hsi_tx_sel", CDCDR, HSI_TX_PODF), 950 1.5 bouyer CLK_DIV("ssi1_pred", "ssi1_sel", CS1CDR, SSI1_CLK_PRED), 951 1.5 bouyer CLK_DIV("ssi1_podf", "ssi1_pred", CS1CDR, SSI1_CLK_PODF), 952 1.5 bouyer CLK_DIV("ssi2_pred", "ssi2_sel", CS2CDR, SSI2_CLK_PRED), 953 1.5 bouyer CLK_DIV("ssi2_podf", "ssi2_pred", CS2CDR, SSI2_CLK_PODF), 954 1.5 bouyer CLK_DIV("ssi3_pred", "ssi3_sel", CS1CDR, SSI3_CLK_PRED), 955 1.5 bouyer CLK_DIV("ssi3_podf", "ssi3_pred", CS1CDR, SSI3_CLK_PODF), 956 1.5 bouyer CLK_DIV("usdhc1_podf", "usdhc1_sel", CSCDR1, USDHC1_PODF), 957 1.5 bouyer CLK_DIV("usdhc2_podf", "usdhc2_sel", CSCDR1, USDHC2_PODF), 958 1.5 bouyer CLK_DIV("usdhc3_podf", "usdhc3_sel", CSCDR1, USDHC3_PODF), 959 1.5 bouyer CLK_DIV("usdhc4_podf", "usdhc4_sel", CSCDR1, USDHC4_PODF), 960 1.5 bouyer CLK_DIV("enfc_pred", "enfc_sel", CS2CDR, ENFC_CLK_PRED), 961 1.5 bouyer CLK_DIV("enfc_podf", "enfc_pred", CS2CDR, ENFC_CLK_PODF), 962 1.5 bouyer CLK_DIV("vpu_axi_podf", "vpu_axi_sel", CSCDR1, VPU_AXI_PODF), 963 1.5 bouyer CLK_DIV("cko1_podf", "cko1_sel", CCOSR, CLKO1_DIV), 964 1.5 bouyer CLK_DIV("cko2_podf", "cko2_sel", CCOSR, CLKO2_DIV), 965 1.5 bouyer CLK_DIV("ipg_per", "ipg", CSCMR1, PERCLK_PODF), 966 1.5 bouyer CLK_DIV("eim_podf", "eim_sel", CSCMR1, ACLK_PODF), 967 1.5 bouyer CLK_DIV("eim_slow_podf", "eim_slow_sel", CSCMR1, ACLK_EIM_SLOW_PODF), 968 1.5 bouyer 969 1.5 bouyer CLK_DIV_BUSY("axi", "axi_sel", CBCDR, AXI_PODF, CDHIPR, AXI_PODF_BUSY), 970 1.5 bouyer CLK_DIV_BUSY("mmdc_ch0_axi_podf", "periph", CBCDR, MMDC_CH0_AXI_PODF, CDHIPR, MMDC_CH0_PODF_BUSY), 971 1.5 bouyer CLK_DIV_BUSY("mmdc_ch1_axi_podf", "periph2", CBCDR, MMDC_CH1_AXI_PODF, CDHIPR, MMDC_CH1_PODF_BUSY), 972 1.5 bouyer CLK_DIV_BUSY("arm", "pll1_sw", CACRR, ARM_PODF, CDHIPR, ARM_PODF_BUSY), 973 1.5 bouyer CLK_DIV_BUSY("ahb", "periph", CBCDR, AHB_PODF, CDHIPR, AHB_PODF_BUSY), 974 1.5 bouyer 975 1.5 bouyer CLK_DIV_TABLE("pll4_post_div", "pll4_audio", PLL_AUDIO, POST_DIV_SELECT, post_div_tbl), 976 1.5 bouyer CLK_DIV_TABLE("pll4_audio_div", "pll4_post_div", MISC2, AUDIO_DIV_LSB, audiovideo_div_tbl), 977 1.5 bouyer CLK_DIV_TABLE("pll5_post_div", "pll5_video", PLL_VIDEO, POST_DIV_SELECT, post_div_tbl), 978 1.5 bouyer CLK_DIV_TABLE("pll5_video_div", "pll5_post_div", MISC2, VIDEO_DIV, audiovideo_div_tbl), 979 1.5 bouyer CLK_DIV_TABLE("enet_ref", "pll6_enet", PLL_ENET, DIV_SELECT, enet_ref_tbl), 980 1.5 bouyer 981 1.5 bouyer CLK_MUX("step", step_p, CCM, CCSR, STEP_SEL), 982 1.5 bouyer CLK_MUX("pll1_sw", pll1_sw_p, CCM, CCSR, PLL1_SW_CLK_SEL), 983 1.5 bouyer CLK_MUX("periph_pre", periph_pre_p, CCM, CBCMR, PRE_PERIPH_CLK_SEL), 984 1.5 bouyer CLK_MUX("periph2_pre", periph_pre_p, CCM, CBCMR, PRE_PERIPH2_CLK_SEL), 985 1.5 bouyer CLK_MUX("periph_clk2_sel", periph_clk2_p, CCM,CBCMR, PERIPH_CLK2_SEL), 986 1.5 bouyer CLK_MUX("periph2_clk2_sel", periph2_clk2_p, CCM,CBCMR, PERIPH2_CLK2_SEL), 987 1.5 bouyer CLK_MUX("axi_sel", axi_p, CCM, CBCDR, AXI_SEL), 988 1.5 bouyer CLK_MUX("asrc_sel", audio_p, CCM, CDCDR, SPDIF1_CLK_SEL), 989 1.5 bouyer CLK_MUX("spdif_sel", audio_p, CCM, CDCDR, SPDIF0_CLK_SEL), 990 1.5 bouyer CLK_MUX("gpu2d_core_sel", gpu2d_core_p, CCM, CBCMR, GPU2D_CLK_SEL), 991 1.5 bouyer CLK_MUX("gpu3d_core_sel", gpu3d_core_p, CCM, CBCMR, GPU3D_CORE_CLK_SEL), 992 1.5 bouyer CLK_MUX("gpu3d_shader_sel", gpu3d_shader_p, CCM,CBCMR, GPU3D_SHADER_CLK_SEL), 993 1.5 bouyer CLK_MUX("esai_sel", audio_p, CCM, CSCMR2, ESAI_CLK_SEL), 994 1.5 bouyer CLK_MUX("ipu1_sel", ipu_p, CCM, CSCDR3, IPU1_HSP_CLK_SEL), 995 1.5 bouyer CLK_MUX("ipu2_sel", ipu_p, CCM, CSCDR3, IPU2_HSP_CLK_SEL), 996 1.5 bouyer CLK_MUX("ipu1_di0_pre_sel", ipu_di_pre_p, CCM, CHSCCDR, IPU1_DI0_PRE_CLK_SEL), 997 1.5 bouyer CLK_MUX("ipu1_di1_pre_sel", ipu_di_pre_p, CCM, CHSCCDR, IPU1_DI1_PRE_CLK_SEL), 998 1.5 bouyer CLK_MUX("ipu2_di0_pre_sel", ipu_di_pre_p, CCM, CSCDR2, IPU2_DI0_PRE_CLK_SEL), 999 1.5 bouyer CLK_MUX("ipu2_di1_pre_sel", ipu_di_pre_p, CCM, CSCDR2, IPU2_DI1_PRE_CLK_SEL), 1000 1.5 bouyer CLK_MUX("ipu1_di0_sel", ipu1_di0_p, CCM, CHSCCDR, IPU1_DI0_CLK_SEL), 1001 1.5 bouyer CLK_MUX("ipu1_di1_sel", ipu1_di1_p, CCM, CHSCCDR, IPU1_DI1_CLK_SEL), 1002 1.5 bouyer CLK_MUX("ipu2_di0_sel", ipu2_di0_p, CCM, CSCDR2, IPU2_DI0_CLK_SEL), 1003 1.5 bouyer CLK_MUX("ipu2_di1_sel", ipu2_di1_p, CCM, CSCDR2, IPU2_DI1_CLK_SEL), 1004 1.5 bouyer CLK_MUX("ldb_di0_sel", ldb_di_p, CCM, CS2CDR, LDB_DI0_CLK_SEL), 1005 1.5 bouyer CLK_MUX("ldb_di1_sel", ldb_di_p, CCM, CS2CDR, LDB_DI1_CLK_SEL), 1006 1.5 bouyer CLK_MUX("vdo_axi_sel", vdo_axi_p, CCM, CBCMR, VDOAXI_CLK_SEL), 1007 1.5 bouyer CLK_MUX("vpu_axi_sel", vpu_axi_p, CCM, CBCMR, VPU_AXI_CLK_SEL), 1008 1.5 bouyer CLK_MUX("cko1_sel", cko1_p, CCM, CCOSR, CLKO1_SEL), 1009 1.5 bouyer CLK_MUX("cko2_sel", cko2_p, CCM, CCOSR, CLKO2_SEL), 1010 1.5 bouyer CLK_MUX("cko", cko_p, CCM, CCOSR, CLK_OUT_SEL), 1011 1.5 bouyer CLK_MUX("hsi_tx_sel", hsi_tx_p, CCM, CDCDR, HSI_TX_CLK_SEL), 1012 1.5 bouyer CLK_MUX("pcie_axi_sel", pcie_axi_p, CCM, CBCMR, PCIE_AXI_CLK_SEL), 1013 1.5 bouyer CLK_MUX("ssi1_sel", ssi_p, CCM, CSCMR1, SSI1_CLK_SEL), 1014 1.5 bouyer CLK_MUX("ssi2_sel", ssi_p, CCM, CSCMR1, SSI2_CLK_SEL), 1015 1.5 bouyer CLK_MUX("ssi3_sel", ssi_p, CCM, CSCMR1, SSI3_CLK_SEL), 1016 1.5 bouyer CLK_MUX("usdhc1_sel", usdhc_p, CCM, CSCMR1, USDHC1_CLK_SEL), 1017 1.5 bouyer CLK_MUX("usdhc2_sel", usdhc_p, CCM, CSCMR1, USDHC2_CLK_SEL), 1018 1.5 bouyer CLK_MUX("usdhc3_sel", usdhc_p, CCM, CSCMR1, USDHC3_CLK_SEL), 1019 1.5 bouyer CLK_MUX("usdhc4_sel", usdhc_p, CCM, CSCMR1, USDHC4_CLK_SEL), 1020 1.5 bouyer CLK_MUX("eim_sel", eim_p, CCM, CSCMR1, ACLK_SEL), 1021 1.5 bouyer CLK_MUX("eim_slow_sel", eim_slow_p, CCM, CSCMR1, ACLK_EIM_SLOW_SEL), 1022 1.5 bouyer CLK_MUX("enfc_sel", enfc_p, CCM, CS2CDR, ENFC_CLK_SEL), 1023 1.5 bouyer 1024 1.5 bouyer CLK_MUX("pll1_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_ARM, BYPASS_CLK_SRC), 1025 1.5 bouyer CLK_MUX("pll2_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_SYS, BYPASS_CLK_SRC), 1026 1.5 bouyer CLK_MUX("pll3_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_USB1, BYPASS_CLK_SRC), 1027 1.5 bouyer CLK_MUX("pll4_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_AUDIO, BYPASS_CLK_SRC), 1028 1.5 bouyer CLK_MUX("pll5_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_VIDEO, BYPASS_CLK_SRC), 1029 1.5 bouyer CLK_MUX("pll6_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_ENET, BYPASS_CLK_SRC), 1030 1.5 bouyer CLK_MUX("pll7_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_USB2, BYPASS_CLK_SRC), 1031 1.5 bouyer CLK_MUX("pll1_bypass", pll1_bypass_p, CCM_ANALOG, PLL_ARM, BYPASS), 1032 1.5 bouyer CLK_MUX("pll2_bypass", pll2_bypass_p, CCM_ANALOG, PLL_SYS, BYPASS), 1033 1.5 bouyer CLK_MUX("pll3_bypass", pll3_bypass_p, CCM_ANALOG, PLL_USB1, BYPASS), 1034 1.5 bouyer CLK_MUX("pll4_bypass", pll4_bypass_p, CCM_ANALOG, PLL_AUDIO, BYPASS), 1035 1.5 bouyer CLK_MUX("pll5_bypass", pll5_bypass_p, CCM_ANALOG, PLL_VIDEO, BYPASS), 1036 1.5 bouyer CLK_MUX("pll6_bypass", pll6_bypass_p, CCM_ANALOG, PLL_ENET, BYPASS), 1037 1.5 bouyer CLK_MUX("pll7_bypass", pll7_bypass_p, CCM_ANALOG, PLL_USB2, BYPASS), 1038 1.5 bouyer 1039 1.5 bouyer CLK_MUX("lvds1_sel", lvds_p, CCM_ANALOG, MISC1, LVDS_CLK1_SRC), 1040 1.5 bouyer CLK_MUX("lvds2_sel", lvds_p, CCM_ANALOG, MISC1, LVDS_CLK2_SRC), 1041 1.5 bouyer 1042 1.5 bouyer CLK_MUX_BUSY("periph", periph_p, CBCDR, PERIPH_CLK_SEL, CDHIPR, PERIPH_CLK_SEL_BUSY), 1043 1.5 bouyer CLK_MUX_BUSY("periph2", periph2_p, CBCDR, PERIPH2_CLK_SEL, CDHIPR, PERIPH2_CLK_SEL_BUSY), 1044 1.5 bouyer 1045 1.5 bouyer CLK_GATE("apbh_dma", "usdhc3", CCM, CCGR0, APBHDMA_HCLK_ENABLE), 1046 1.5 bouyer CLK_GATE("asrc", "asrc_podf", CCM, CCGR0, ASRC_CLK_ENABLE), 1047 1.5 bouyer CLK_GATE("asrc_ipg", "ahb", CCM, CCGR0, ASRC_CLK_ENABLE), 1048 1.5 bouyer CLK_GATE("asrc_mem", "ahb", CCM, CCGR0, ASRC_CLK_ENABLE), 1049 1.5 bouyer CLK_GATE("caam_mem", "ahb", CCM, CCGR0, CAAM_SECURE_MEM_CLK_ENABLE), 1050 1.5 bouyer CLK_GATE("caam_aclk", "ahb", CCM, CCGR0, CAAM_WRAPPER_ACLK_ENABLE), 1051 1.5 bouyer CLK_GATE("caam_ipg", "ipg", CCM, CCGR0, CAAM_WRAPPER_IPG_ENABLE), 1052 1.5 bouyer CLK_GATE("can1_ipg", "ipg", CCM, CCGR0, CAN1_CLK_ENABLE), 1053 1.5 bouyer CLK_GATE("can1_serial", "can_root", CCM, CCGR0, CAN1_SERIAL_CLK_ENABLE), 1054 1.5 bouyer CLK_GATE("can2_ipg", "ipg", CCM, CCGR0, CAN2_CLK_ENABLE), 1055 1.5 bouyer CLK_GATE("can2_serial", "can_root", CCM, CCGR0, CAN2_SERIAL_CLK_ENABLE), 1056 1.5 bouyer CLK_GATE("ecspi1", "ecspi_root", CCM, CCGR1, ECSPI1_CLK_ENABLE), 1057 1.5 bouyer CLK_GATE("ecspi2", "ecspi_root", CCM, CCGR1, ECSPI2_CLK_ENABLE), 1058 1.5 bouyer CLK_GATE("ecspi3", "ecspi_root", CCM, CCGR1, ECSPI3_CLK_ENABLE), 1059 1.5 bouyer CLK_GATE("ecspi4", "ecspi_root", CCM, CCGR1, ECSPI4_CLK_ENABLE), 1060 1.5 bouyer CLK_GATE("ecspi5", "ecspi_root", CCM, CCGR1, ECSPI5_CLK_ENABLE), 1061 1.5 bouyer CLK_GATE("enet", "ipg", CCM, CCGR1, ENET_CLK_ENABLE), 1062 1.5 bouyer CLK_GATE("esai_extal", "esai_podf", CCM, CCGR1, ESAI_CLK_ENABLE), 1063 1.5 bouyer CLK_GATE("esai_ipg", "ahb", CCM, CCGR1, ESAI_CLK_ENABLE), 1064 1.5 bouyer CLK_GATE("esai_mem", "ahb", CCM, CCGR1, ESAI_CLK_ENABLE), 1065 1.5 bouyer CLK_GATE("gpt_ipg", "ipg", CCM, CCGR1, GPT_CLK_ENABLE), 1066 1.5 bouyer CLK_GATE("gpt_ipg_per", "ipg_per", CCM, CCGR1, GPT_SERIAL_CLK_ENABLE), 1067 1.5 bouyer CLK_GATE("gpu2d_core", "gpu2d_core_podf", CCM, CCGR1, GPU2D_CLK_ENABLE), 1068 1.5 bouyer CLK_GATE("gpu3d_core", "gpu3d_core_podf", CCM, CCGR1, GPU3D_CLK_ENABLE), 1069 1.5 bouyer CLK_GATE("hdmi_iahb", "ahb", CCM, CCGR2, HDMI_TX_IAHBCLK_ENABLE), 1070 1.5 bouyer CLK_GATE("hdmi_isfr", "video_27m", CCM, CCGR2, HDMI_TX_ISFRCLK_ENABLE), 1071 1.5 bouyer CLK_GATE("i2c1", "ipg_per", CCM, CCGR2, I2C1_SERIAL_CLK_ENABLE), 1072 1.5 bouyer CLK_GATE("i2c2", "ipg_per", CCM, CCGR2, I2C2_SERIAL_CLK_ENABLE), 1073 1.5 bouyer CLK_GATE("i2c3", "ipg_per", CCM, CCGR2, I2C3_SERIAL_CLK_ENABLE), 1074 1.5 bouyer CLK_GATE("iim", "ipg", CCM, CCGR2, IIM_CLK_ENABLE), 1075 1.5 bouyer CLK_GATE("enfc", "enfc_podf", CCM, CCGR2, IOMUX_IPT_CLK_IO_CLK_ENABLE), 1076 1.5 bouyer CLK_GATE("vdoa", "vdo_axi", CCM, CCGR2, IPSYNC_VDOA_IPG_CLK_ENABLE), 1077 1.5 bouyer CLK_GATE("ipu1", "ipu1_podf", CCM, CCGR3, IPU1_IPU_CLK_ENABLE), 1078 1.5 bouyer CLK_GATE("ipu1_di0", "ipu1_di0_sel", CCM, CCGR3, IPU1_IPU_DI0_CLK_ENABLE), 1079 1.5 bouyer CLK_GATE("ipu1_di1", "ipu1_di1_sel", CCM, CCGR3, IPU1_IPU_DI1_CLK_ENABLE), 1080 1.5 bouyer CLK_GATE("ipu2", "ipu2_podf", CCM, CCGR3, IPU2_IPU_CLK_ENABLE), 1081 1.5 bouyer CLK_GATE("ipu2_di0", "ipu2_di0_sel", CCM, CCGR3, IPU2_IPU_DI0_CLK_ENABLE), 1082 1.5 bouyer CLK_GATE("ldb_di0", "ldb_di0_podf", CCM, CCGR3, LDB_DI0_CLK_ENABLE), 1083 1.5 bouyer CLK_GATE("ldb_di1", "ldb_di1_podf", CCM, CCGR3, LDB_DI1_CLK_ENABLE), 1084 1.5 bouyer CLK_GATE("ipu2_di1", "ipu2_di1_sel", CCM, CCGR3, IPU2_IPU_DI1_CLK_ENABLE), 1085 1.5 bouyer CLK_GATE("hsi_tx", "hsi_tx_podf", CCM, CCGR3, MIPI_CORE_CFG_CLK_ENABLE), 1086 1.5 bouyer CLK_GATE("mipi_core_cfg", "video_27m", CCM, CCGR3, MIPI_CORE_CFG_CLK_ENABLE), 1087 1.5 bouyer CLK_GATE("mipi_ipg", "ipg", CCM, CCGR3, MIPI_CORE_CFG_CLK_ENABLE), 1088 1.5 bouyer CLK_GATE("mlb", "axi", CCM, CCGR3, MLB_CLK_ENABLE), 1089 1.5 bouyer CLK_GATE("mmdc_ch0_axi", "mmdc_ch0_axi_podf", CCM, CCGR3, MMDC_CORE_ACLK_FAST_CORE_P0_ENABLE), 1090 1.5 bouyer CLK_GATE("mmdc_ch1_axi", "mmdc_ch1_axi_podf", CCM, CCGR3, MMDC_CORE_ACLK_FAST_CORE_P1_ENABLE), 1091 1.5 bouyer CLK_GATE("ocram", "ahb", CCM, CCGR3, OCRAM_CLK_ENABLE), 1092 1.5 bouyer CLK_GATE("openvg_axi", "axi", CCM, CCGR3, OPENVGAXICLK_CLK_ROOT_ENABLE), 1093 1.5 bouyer CLK_GATE("pcie_axi", "pcie_axi_sel", CCM, CCGR4, PCIE_ROOT_ENABLE), 1094 1.5 bouyer CLK_GATE("per1_bch", "usdhc3", CCM, CCGR4, PL301_MX6QPER1_BCHCLK_ENABLE), 1095 1.5 bouyer CLK_GATE("pwm1", "ipg_per", CCM, CCGR4, PWM1_CLK_ENABLE), 1096 1.5 bouyer CLK_GATE("pwm2", "ipg_per", CCM, CCGR4, PWM2_CLK_ENABLE), 1097 1.5 bouyer CLK_GATE("pwm3", "ipg_per", CCM, CCGR4, PWM3_CLK_ENABLE), 1098 1.5 bouyer CLK_GATE("pwm4", "ipg_per", CCM, CCGR4, PWM4_CLK_ENABLE), 1099 1.5 bouyer CLK_GATE("gpmi_bch_apb", "usdhc3", CCM, CCGR4, RAWNAND_U_BCH_INPUT_APB_CLK_ENABLE), 1100 1.5 bouyer CLK_GATE("gpmi_bch", "usdhc4", CCM, CCGR4, RAWNAND_U_GPMI_BCH_INPUT_BCH_CLK_ENABLE), 1101 1.5 bouyer CLK_GATE("gpmi_io", "enfc", CCM, CCGR4, RAWNAND_U_GPMI_BCH_INPUT_GPMI_IO_CLK_ENABLE), 1102 1.5 bouyer CLK_GATE("gpmi_apb", "usdhc3", CCM, CCGR4, RAWNAND_U_GPMI_INPUT_APB_CLK_ENABLE), 1103 1.5 bouyer CLK_GATE("rom", "ahb", CCM, CCGR5, ROM_CLK_ENABLE), 1104 1.5 bouyer CLK_GATE("sata", "ahb", CCM, CCGR5, SATA_CLK_ENABLE), 1105 1.5 bouyer CLK_GATE("sdma", "ahb", CCM, CCGR5, SDMA_CLK_ENABLE), 1106 1.5 bouyer CLK_GATE("spba", "ipg", CCM, CCGR5, SPBA_CLK_ENABLE), 1107 1.5 bouyer CLK_GATE("spdif", "spdif_podf", CCM, CCGR5, SPDIF_CLK_ENABLE), 1108 1.5 bouyer CLK_GATE("spdif_gclk", "ipg", CCM, CCGR5, SPDIF_CLK_ENABLE), 1109 1.5 bouyer CLK_GATE("ssi1_ipg", "ipg", CCM, CCGR5, SSI1_CLK_ENABLE), 1110 1.5 bouyer CLK_GATE("ssi2_ipg", "ipg", CCM, CCGR5, SSI2_CLK_ENABLE), 1111 1.5 bouyer CLK_GATE("ssi3_ipg", "ipg", CCM, CCGR5, SSI3_CLK_ENABLE), 1112 1.5 bouyer CLK_GATE("ssi1", "ssi1_podf", CCM, CCGR5, SSI1_CLK_ENABLE), 1113 1.5 bouyer CLK_GATE("ssi2", "ssi2_podf", CCM, CCGR5, SSI2_CLK_ENABLE), 1114 1.5 bouyer CLK_GATE("ssi3", "ssi3_podf", CCM, CCGR5, SSI3_CLK_ENABLE), 1115 1.5 bouyer CLK_GATE("uart_ipg", "ipg", CCM, CCGR5, UART_CLK_ENABLE), 1116 1.5 bouyer CLK_GATE("uart_serial", "uart_serial_podf", CCM, CCGR5, UART_SERIAL_CLK_ENABLE), 1117 1.5 bouyer CLK_GATE("usboh3", "ipg", CCM, CCGR6, USBOH3_CLK_ENABLE), 1118 1.5 bouyer CLK_GATE("usdhc1", "usdhc1_podf", CCM, CCGR6, USDHC1_CLK_ENABLE), 1119 1.5 bouyer CLK_GATE("usdhc2", "usdhc2_podf", CCM, CCGR6, USDHC2_CLK_ENABLE), 1120 1.5 bouyer CLK_GATE("usdhc3", "usdhc3_podf", CCM, CCGR6, USDHC3_CLK_ENABLE), 1121 1.5 bouyer CLK_GATE("usdhc4", "usdhc4_podf", CCM, CCGR6, USDHC4_CLK_ENABLE), 1122 1.5 bouyer CLK_GATE("eim_slow", "eim_slow_podf", CCM, CCGR6, EIM_SLOW_CLK_ENABLE), 1123 1.5 bouyer CLK_GATE("vdo_axi", "vdo_axi_sel", CCM, CCGR6, VDOAXICLK_CLK_ENABLE), 1124 1.5 bouyer CLK_GATE("vpu_axi", "vpu_axi_podf", CCM, CCGR6, VPU_CLK_ENABLE), 1125 1.5 bouyer CLK_GATE("cko1", "cko1_podf", CCM, CCOSR, CLKO1_EN), 1126 1.5 bouyer CLK_GATE("cko2", "cko2_podf", CCM, CCOSR, CLKO2_EN), 1127 1.5 bouyer 1128 1.5 bouyer CLK_GATE("sata_ref_100m", "sata_ref", CCM_ANALOG, PLL_ENET, ENABLE_100M), 1129 1.5 bouyer CLK_GATE("pcie_ref_125m", "pcie_ref", CCM_ANALOG, PLL_ENET, ENABLE_125M), 1130 1.5 bouyer 1131 1.5 bouyer CLK_GATE("pll1_sys", "pll1_bypass", CCM_ANALOG, PLL_ARM, ENABLE), 1132 1.5 bouyer CLK_GATE("pll2_bus", "pll2_bypass", CCM_ANALOG, PLL_SYS, ENABLE), 1133 1.5 bouyer CLK_GATE("pll3_usb_otg", "pll3_bypass", CCM_ANALOG, PLL_USB1, ENABLE), 1134 1.5 bouyer CLK_GATE("pll4_audio", "pll4_bypass", CCM_ANALOG, PLL_AUDIO, ENABLE), 1135 1.5 bouyer CLK_GATE("pll5_video", "pll5_bypass", CCM_ANALOG, PLL_VIDEO, ENABLE), 1136 1.5 bouyer CLK_GATE("pll6_enet", "pll6_bypass", CCM_ANALOG, PLL_ENET, ENABLE), 1137 1.5 bouyer CLK_GATE("pll7_usb_host", "pll7_bypass", CCM_ANALOG, PLL_USB2, ENABLE), 1138 1.5 bouyer 1139 1.5 bouyer CLK_GATE("usbphy1", "pll3_usb_otg", CCM_ANALOG, PLL_USB1, RESERVED), 1140 1.5 bouyer CLK_GATE("usbphy2", "pll7_usb_host", CCM_ANALOG, PLL_USB2, RESERVED), 1141 1.5 bouyer 1142 1.5 bouyer CLK_GATE_EXCLUSIVE("lvds1_gate", "lvds1_sel", CCM_ANALOG, MISC1, LVDS_CLK1_OBEN, LVDS_CLK1_IBEN), 1143 1.5 bouyer CLK_GATE_EXCLUSIVE("lvds2_gate", "lvds2_sel", CCM_ANALOG, MISC1, LVDS_CLK2_OBEN, LVDS_CLK2_IBEN), 1144 1.5 bouyer CLK_GATE_EXCLUSIVE("lvds1_in", "anaclk1", CCM_ANALOG, MISC1, LVDS_CLK1_IBEN, LVDS_CLK1_OBEN), 1145 1.5 bouyer CLK_GATE_EXCLUSIVE("lvds2_in", "anaclk2", CCM_ANALOG, MISC1, LVDS_CLK2_IBEN, LVDS_CLK2_OBEN), 1146 1.5 bouyer }; 1147 1.5 bouyer 1148 1.6 bouyer struct imxccm_init_parent imxccm6q_init_parents[] = { 1149 1.6 bouyer { "pll1_bypass", "pll1" }, 1150 1.6 bouyer { "pll2_bypass", "pll2" }, 1151 1.6 bouyer { "pll3_bypass", "pll3" }, 1152 1.6 bouyer { "pll4_bypass", "pll4" }, 1153 1.6 bouyer { "pll5_bypass", "pll5" }, 1154 1.6 bouyer { "pll6_bypass", "pll6" }, 1155 1.6 bouyer { "pll7_bypass", "pll7" }, 1156 1.6 bouyer { "lvds1_sel", "sata_ref_100m" }, 1157 1.6 bouyer { 0 }, 1158 1.6 bouyer }; 1159 1.6 bouyer 1160 1.6 bouyer 1161 1.5 bouyer static struct imx6_clk * 1162 1.5 bouyer imx6q_clk_find_by_id(struct imx6ccm_softc *sc, u_int clock_id) 1163 1.5 bouyer { 1164 1.5 bouyer for (int n = 0; n < __arraycount(imx6q_clock_ids); n++) { 1165 1.5 bouyer if (imx6q_clock_ids[n].id == clock_id) { 1166 1.5 bouyer const char *name = imx6q_clock_ids[n].name; 1167 1.5 bouyer return imx6_clk_find(sc, name); 1168 1.5 bouyer } 1169 1.5 bouyer } 1170 1.5 bouyer 1171 1.5 bouyer return NULL; 1172 1.5 bouyer } 1173 1.5 bouyer 1174 1.1 skrll static struct clk * 1175 1.5 bouyer imx6q_get_clock_by_id(struct imx6ccm_softc *sc, u_int clock_id) 1176 1.5 bouyer { 1177 1.5 bouyer struct imx6_clk *iclk; 1178 1.5 bouyer iclk = imx6q_clk_find_by_id(sc, clock_id); 1179 1.5 bouyer 1180 1.5 bouyer if (iclk == NULL) 1181 1.5 bouyer return NULL; 1182 1.5 bouyer 1183 1.5 bouyer return &iclk->base; 1184 1.5 bouyer } 1185 1.5 bouyer 1186 1.5 bouyer static struct clk *imx6q_clk_decode(device_t, int, const void *, size_t); 1187 1.5 bouyer 1188 1.5 bouyer static const struct fdtbus_clock_controller_func imx6q_ccm_fdtclock_funcs = { 1189 1.5 bouyer .decode = imx6q_clk_decode 1190 1.5 bouyer }; 1191 1.5 bouyer 1192 1.5 bouyer static struct clk * 1193 1.5 bouyer imx6q_clk_decode(device_t dev, int cc_phandle, const void *data, size_t len) 1194 1.1 skrll { 1195 1.1 skrll struct clk *clk; 1196 1.5 bouyer struct imx6ccm_softc *sc = device_private(dev); 1197 1.1 skrll 1198 1.1 skrll /* #clock-cells should be 1 */ 1199 1.1 skrll if (len != 4) 1200 1.1 skrll return NULL; 1201 1.1 skrll 1202 1.1 skrll const u_int clock_id = be32dec(data); 1203 1.1 skrll 1204 1.5 bouyer clk = imx6q_get_clock_by_id(sc, clock_id); 1205 1.1 skrll if (clk) 1206 1.1 skrll return clk; 1207 1.1 skrll 1208 1.1 skrll return NULL; 1209 1.1 skrll } 1210 1.1 skrll 1211 1.1 skrll static void 1212 1.5 bouyer imx6q_clk_fixed_from_fdt(struct imx6ccm_softc *sc, const char *name) 1213 1.1 skrll { 1214 1.5 bouyer struct imx6_clk *iclk = (struct imx6_clk *)imx6_get_clock(sc, name); 1215 1.1 skrll 1216 1.5 bouyer KASSERTMSG((iclk != NULL), "failed to find clock %s", name); 1217 1.1 skrll 1218 1.1 skrll char *path = kmem_asprintf("/clocks/%s", name); 1219 1.1 skrll int phandle = OF_finddevice(path); 1220 1.5 bouyer KASSERTMSG((phandle >= 0), "failed to find device %s", path); 1221 1.1 skrll kmem_free(path, strlen(path) + 1); 1222 1.1 skrll 1223 1.1 skrll if (of_getprop_uint32(phandle, "clock-frequency", &iclk->clk.fixed.rate) != 0) 1224 1.1 skrll iclk->clk.fixed.rate = 0; 1225 1.1 skrll } 1226 1.1 skrll 1227 1.5 bouyer static int imx6qccm_match(device_t, cfdata_t, void *); 1228 1.5 bouyer static void imx6qccm_attach(device_t, device_t, void *); 1229 1.1 skrll 1230 1.1 skrll CFATTACH_DECL_NEW(imx6ccm, sizeof(struct imx6ccm_softc), 1231 1.5 bouyer imx6qccm_match, imx6qccm_attach, NULL, NULL); 1232 1.1 skrll 1233 1.2 thorpej static const struct device_compatible_entry compat_data[] = { 1234 1.2 thorpej { .compat = "fsl,imx6q-ccm" }, 1235 1.2 thorpej DEVICE_COMPAT_EOL 1236 1.2 thorpej }; 1237 1.2 thorpej 1238 1.1 skrll static int 1239 1.5 bouyer imx6qccm_match(device_t parent, cfdata_t cfdata, void *aux) 1240 1.1 skrll { 1241 1.1 skrll struct fdt_attach_args * const faa = aux; 1242 1.1 skrll 1243 1.2 thorpej return of_compatible_match(faa->faa_phandle, compat_data); 1244 1.1 skrll } 1245 1.1 skrll 1246 1.1 skrll static void 1247 1.5 bouyer imx6qccm_attach(device_t parent, device_t self, void *aux) 1248 1.1 skrll { 1249 1.1 skrll struct imx6ccm_softc * const sc = device_private(self); 1250 1.1 skrll struct fdt_attach_args * const faa = aux; 1251 1.1 skrll bus_addr_t addr; 1252 1.1 skrll bus_size_t size; 1253 1.1 skrll 1254 1.1 skrll if (fdtbus_get_reg(faa->faa_phandle, 0, &addr, &size) != 0) { 1255 1.1 skrll aprint_error(": couldn't get registers\n"); 1256 1.1 skrll return; 1257 1.1 skrll } 1258 1.1 skrll 1259 1.1 skrll sc->sc_dev = self; 1260 1.1 skrll sc->sc_iot = faa->faa_bst; 1261 1.1 skrll 1262 1.1 skrll if (bus_space_map(sc->sc_iot, addr, size, 0, &sc->sc_ioh)) { 1263 1.1 skrll aprint_error(": can't map ccm registers\n"); 1264 1.1 skrll return; 1265 1.1 skrll } 1266 1.1 skrll 1267 1.8 skrll int phandle = OF_finddevice("/soc/bus/anatop"); 1268 1.1 skrll 1269 1.5 bouyer if (phandle == -1) { 1270 1.5 bouyer aprint_error(": can't find anatop device\n"); 1271 1.5 bouyer return; 1272 1.5 bouyer } 1273 1.5 bouyer 1274 1.5 bouyer if (fdtbus_get_reg(phandle, 0, &addr, &size) != 0) { 1275 1.5 bouyer aprint_error(": can't get anatop registers\n"); 1276 1.5 bouyer return; 1277 1.5 bouyer } 1278 1.7 skrll 1279 1.7 skrll 1280 1.1 skrll if (bus_space_map(sc->sc_iot, addr, size, 0, &sc->sc_ioh_analog)) { 1281 1.1 skrll aprint_error(": can't map anatop registers\n"); 1282 1.1 skrll return; 1283 1.1 skrll } 1284 1.1 skrll 1285 1.1 skrll aprint_naive("\n"); 1286 1.1 skrll aprint_normal(": Clock Control Module\n"); 1287 1.1 skrll 1288 1.7 skrll imx6ccm_attach_common(self, &imx6q_clks[0], __arraycount(imx6q_clks), 1289 1.6 bouyer imxccm6q_init_parents); 1290 1.3 skrll 1291 1.5 bouyer imx6q_clk_fixed_from_fdt(sc, "ckil"); 1292 1.8 skrll imx6q_clk_fixed_from_fdt(sc, "ckih1"); 1293 1.5 bouyer imx6q_clk_fixed_from_fdt(sc, "osc"); 1294 1.1 skrll 1295 1.1 skrll fdtbus_register_clock_controller(self, faa->faa_phandle, 1296 1.5 bouyer &imx6q_ccm_fdtclock_funcs); 1297 1.1 skrll } 1298