1 1.4 skrll /* $NetBSD: imx6sx_clk.c,v 1.4 2024/09/01 07:55:27 skrll Exp $ */ 2 1.1 bouyer 3 1.1 bouyer /*- 4 1.1 bouyer * Copyright (c) 2019 Genetec Corporation. All rights reserved. 5 1.1 bouyer * Written by Hashimoto Kenichi for Genetec Corporation. 6 1.1 bouyer * 7 1.1 bouyer * Redistribution and use in source and binary forms, with or without 8 1.1 bouyer * modification, are permitted provided that the following conditions 9 1.1 bouyer * are met: 10 1.1 bouyer * 1. Redistributions of source code must retain the above copyright 11 1.1 bouyer * notice, this list of conditions and the following disclaimer. 12 1.1 bouyer * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 bouyer * notice, this list of conditions and the following disclaimer in the 14 1.1 bouyer * documentation and/or other materials provided with the distribution. 15 1.1 bouyer * 16 1.1 bouyer * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 1.1 bouyer * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 1.1 bouyer * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 1.1 bouyer * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 1.1 bouyer * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21 1.1 bouyer * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 1.1 bouyer * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23 1.1 bouyer * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 1.1 bouyer * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 1.1 bouyer * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 1.1 bouyer * SUCH DAMAGE. 27 1.1 bouyer */ 28 1.1 bouyer 29 1.1 bouyer #include <sys/cdefs.h> 30 1.4 skrll __KERNEL_RCSID(0, "$NetBSD: imx6sx_clk.c,v 1.4 2024/09/01 07:55:27 skrll Exp $"); 31 1.1 bouyer 32 1.1 bouyer #include "opt_fdt.h" 33 1.1 bouyer 34 1.1 bouyer #include <sys/types.h> 35 1.1 bouyer #include <sys/time.h> 36 1.1 bouyer #include <sys/bus.h> 37 1.1 bouyer #include <sys/device.h> 38 1.1 bouyer #include <sys/sysctl.h> 39 1.1 bouyer #include <sys/cpufreq.h> 40 1.1 bouyer #include <sys/kmem.h> 41 1.1 bouyer #include <sys/param.h> 42 1.1 bouyer 43 1.1 bouyer #include <arm/nxp/imx6_ccmreg.h> 44 1.1 bouyer #include <arm/nxp/imx6_ccmvar.h> 45 1.1 bouyer 46 1.1 bouyer #include <dev/clk/clk_backend.h> 47 1.1 bouyer #include <dev/fdt/fdtvar.h> 48 1.1 bouyer 49 1.1 bouyer /* Clock IDs - should match dt-bindings/clock/imx6sx-clock.h */ 50 1.1 bouyer 51 1.1 bouyer #define IMX6SXCLK_DUMMY 0 52 1.1 bouyer #define IMX6SXCLK_CKIL 1 53 1.1 bouyer #define IMX6SXCLK_CKIH 2 54 1.1 bouyer #define IMX6SXCLK_OSC 3 55 1.1 bouyer #define IMX6SXCLK_PLL1_SYS 4 56 1.1 bouyer #define IMX6SXCLK_PLL2_BUS 5 57 1.1 bouyer #define IMX6SXCLK_PLL3_USB_OTG 6 58 1.1 bouyer #define IMX6SXCLK_PLL4_AUDIO 7 59 1.1 bouyer #define IMX6SXCLK_PLL5_VIDEO 8 60 1.1 bouyer #define IMX6SXCLK_PLL6_ENET 9 61 1.1 bouyer #define IMX6SXCLK_PLL7_USB_HOST 10 62 1.1 bouyer #define IMX6SXCLK_USBPHY1 11 63 1.1 bouyer #define IMX6SXCLK_USBPHY2 12 64 1.1 bouyer #define IMX6SXCLK_USBPHY1_GATE 13 65 1.1 bouyer #define IMX6SXCLK_USBPHY2_GATE 14 66 1.1 bouyer #define IMX6SXCLK_PCIE_REF 15 67 1.1 bouyer #define IMX6SXCLK_PCIE_REF_125M 16 68 1.1 bouyer #define IMX6SXCLK_ENET_REF 17 69 1.1 bouyer #define IMX6SXCLK_PLL2_PFD0 18 70 1.1 bouyer #define IMX6SXCLK_PLL2_PFD1 19 71 1.1 bouyer #define IMX6SXCLK_PLL2_PFD2 20 72 1.1 bouyer #define IMX6SXCLK_PLL2_PFD3 21 73 1.1 bouyer #define IMX6SXCLK_PLL3_PFD0 22 74 1.1 bouyer #define IMX6SXCLK_PLL3_PFD1 23 75 1.1 bouyer #define IMX6SXCLK_PLL3_PFD2 24 76 1.1 bouyer #define IMX6SXCLK_PLL3_PFD3 25 77 1.1 bouyer #define IMX6SXCLK_PLL2_198M 26 78 1.1 bouyer #define IMX6SXCLK_PLL3_120M 27 79 1.1 bouyer #define IMX6SXCLK_PLL3_80M 28 80 1.1 bouyer #define IMX6SXCLK_PLL3_60M 29 81 1.1 bouyer #define IMX6SXCLK_TWD 30 82 1.1 bouyer #define IMX6SXCLK_PLL4_POST_DIV 31 83 1.1 bouyer #define IMX6SXCLK_PLL4_AUDIO_DIV 32 84 1.1 bouyer #define IMX6SXCLK_PLL5_POST_DIV 33 85 1.1 bouyer #define IMX6SXCLK_PLL5_VIDEO_DIV 34 86 1.1 bouyer #define IMX6SXCLK_STEP 35 87 1.1 bouyer #define IMX6SXCLK_PLL1_SW 36 88 1.1 bouyer #define IMX6SXCLK_OCRAM_SEL 37 89 1.1 bouyer #define IMX6SXCLK_PERIPH_PRE 38 90 1.1 bouyer #define IMX6SXCLK_PERIPH2_PRE 39 91 1.1 bouyer #define IMX6SXCLK_PERIPH_CLK2_SEL 40 92 1.1 bouyer #define IMX6SXCLK_PERIPH2_CLK2_SEL 41 93 1.1 bouyer #define IMX6SXCLK_PCIE_AXI_SEL 42 94 1.1 bouyer #define IMX6SXCLK_GPU_AXI_SEL 43 95 1.1 bouyer #define IMX6SXCLK_GPU_CORE_SEL 44 96 1.1 bouyer #define IMX6SXCLK_EIM_SLOW_SEL 45 97 1.1 bouyer #define IMX6SXCLK_USDHC1_SEL 46 98 1.1 bouyer #define IMX6SXCLK_USDHC2_SEL 47 99 1.1 bouyer #define IMX6SXCLK_USDHC3_SEL 48 100 1.1 bouyer #define IMX6SXCLK_USDHC4_SEL 49 101 1.1 bouyer #define IMX6SXCLK_SSI1_SEL 50 102 1.1 bouyer #define IMX6SXCLK_SSI2_SEL 51 103 1.1 bouyer #define IMX6SXCLK_SSI3_SEL 52 104 1.1 bouyer #define IMX6SXCLK_QSPI1_SEL 53 105 1.1 bouyer #define IMX6SXCLK_PERCLK_SEL 54 106 1.1 bouyer #define IMX6SXCLK_VID_SEL 55 107 1.1 bouyer #define IMX6SXCLK_ESAI_SEL 56 108 1.1 bouyer #define IMX6SXCLK_LDB_DI0_DIV_SEL 57 109 1.1 bouyer #define IMX6SXCLK_LDB_DI1_DIV_SEL 58 110 1.1 bouyer #define IMX6SXCLK_CAN_SEL 59 111 1.1 bouyer #define IMX6SXCLK_UART_SEL 60 112 1.1 bouyer #define IMX6SXCLK_QSPI2_SEL 61 113 1.1 bouyer #define IMX6SXCLK_LDB_DI1_SEL 62 114 1.1 bouyer #define IMX6SXCLK_LDB_DI0_SEL 63 115 1.1 bouyer #define IMX6SXCLK_SPDIF_SEL 64 116 1.1 bouyer #define IMX6SXCLK_AUDIO_SEL 65 117 1.1 bouyer #define IMX6SXCLK_ENET_PRE_SEL 66 118 1.1 bouyer #define IMX6SXCLK_ENET_SEL 67 119 1.1 bouyer #define IMX6SXCLK_M4_PRE_SEL 68 120 1.1 bouyer #define IMX6SXCLK_M4_SEL 69 121 1.1 bouyer #define IMX6SXCLK_ECSPI_SEL 70 122 1.1 bouyer #define IMX6SXCLK_LCDIF1_PRE_SEL 71 123 1.1 bouyer #define IMX6SXCLK_LCDIF2_PRE_SEL 72 124 1.1 bouyer #define IMX6SXCLK_LCDIF1_SEL 73 125 1.1 bouyer #define IMX6SXCLK_LCDIF2_SEL 74 126 1.1 bouyer #define IMX6SXCLK_DISPLAY_SEL 75 127 1.1 bouyer #define IMX6SXCLK_CSI_SEL 76 128 1.1 bouyer #define IMX6SXCLK_CKO1_SEL 77 129 1.1 bouyer #define IMX6SXCLK_CKO2_SEL 78 130 1.1 bouyer #define IMX6SXCLK_CKO 79 131 1.1 bouyer #define IMX6SXCLK_PERIPH_CLK2 80 132 1.1 bouyer #define IMX6SXCLK_PERIPH2_CLK2 81 133 1.1 bouyer #define IMX6SXCLK_IPG 82 134 1.1 bouyer #define IMX6SXCLK_GPU_CORE_PODF 83 135 1.1 bouyer #define IMX6SXCLK_GPU_AXI_PODF 84 136 1.1 bouyer #define IMX6SXCLK_LCDIF1_PODF 85 137 1.1 bouyer #define IMX6SXCLK_QSPI1_PODF 86 138 1.1 bouyer #define IMX6SXCLK_EIM_SLOW_PODF 87 139 1.1 bouyer #define IMX6SXCLK_LCDIF2_PODF 88 140 1.1 bouyer #define IMX6SXCLK_PERCLK 89 141 1.1 bouyer #define IMX6SXCLK_VID_PODF 90 142 1.1 bouyer #define IMX6SXCLK_CAN_PODF 91 143 1.1 bouyer #define IMX6SXCLK_USDHC1_PODF 92 144 1.1 bouyer #define IMX6SXCLK_USDHC2_PODF 93 145 1.1 bouyer #define IMX6SXCLK_USDHC3_PODF 94 146 1.1 bouyer #define IMX6SXCLK_USDHC4_PODF 95 147 1.1 bouyer #define IMX6SXCLK_UART_PODF 96 148 1.1 bouyer #define IMX6SXCLK_ESAI_PRED 97 149 1.1 bouyer #define IMX6SXCLK_ESAI_PODF 98 150 1.1 bouyer #define IMX6SXCLK_SSI3_PRED 99 151 1.1 bouyer #define IMX6SXCLK_SSI3_PODF 100 152 1.1 bouyer #define IMX6SXCLK_SSI1_PRED 101 153 1.1 bouyer #define IMX6SXCLK_SSI1_PODF 102 154 1.1 bouyer #define IMX6SXCLK_QSPI2_PRED 103 155 1.1 bouyer #define IMX6SXCLK_QSPI2_PODF 104 156 1.1 bouyer #define IMX6SXCLK_SSI2_PRED 105 157 1.1 bouyer #define IMX6SXCLK_SSI2_PODF 106 158 1.1 bouyer #define IMX6SXCLK_SPDIF_PRED 107 159 1.1 bouyer #define IMX6SXCLK_SPDIF_PODF 108 160 1.1 bouyer #define IMX6SXCLK_AUDIO_PRED 109 161 1.1 bouyer #define IMX6SXCLK_AUDIO_PODF 110 162 1.1 bouyer #define IMX6SXCLK_ENET_PODF 111 163 1.1 bouyer #define IMX6SXCLK_M4_PODF 112 164 1.1 bouyer #define IMX6SXCLK_ECSPI_PODF 113 165 1.1 bouyer #define IMX6SXCLK_LCDIF1_PRED 114 166 1.1 bouyer #define IMX6SXCLK_LCDIF2_PRED 115 167 1.1 bouyer #define IMX6SXCLK_DISPLAY_PODF 116 168 1.1 bouyer #define IMX6SXCLK_CSI_PODF 117 169 1.1 bouyer #define IMX6SXCLK_LDB_DI0_DIV_3_5 118 170 1.1 bouyer #define IMX6SXCLK_LDB_DI0_DIV_7 119 171 1.1 bouyer #define IMX6SXCLK_LDB_DI1_DIV_3_5 120 172 1.1 bouyer #define IMX6SXCLK_LDB_DI1_DIV_7 121 173 1.1 bouyer #define IMX6SXCLK_CKO1_PODF 122 174 1.1 bouyer #define IMX6SXCLK_CKO2_PODF 123 175 1.1 bouyer #define IMX6SXCLK_PERIPH 124 176 1.1 bouyer #define IMX6SXCLK_PERIPH2 125 177 1.1 bouyer #define IMX6SXCLK_OCRAM 126 178 1.1 bouyer #define IMX6SXCLK_AHB 127 179 1.1 bouyer #define IMX6SXCLK_MMDC_PODF 128 180 1.1 bouyer #define IMX6SXCLK_ARM 129 181 1.1 bouyer #define IMX6SXCLK_AIPS_TZ1 130 182 1.1 bouyer #define IMX6SXCLK_AIPS_TZ2 131 183 1.1 bouyer #define IMX6SXCLK_APBH_DMA 132 184 1.1 bouyer #define IMX6SXCLK_ASRC_GATE 133 185 1.1 bouyer #define IMX6SXCLK_CAAM_MEM 134 186 1.1 bouyer #define IMX6SXCLK_CAAM_ACLK 135 187 1.1 bouyer #define IMX6SXCLK_CAAM_IPG 136 188 1.1 bouyer #define IMX6SXCLK_CAN1_IPG 137 189 1.1 bouyer #define IMX6SXCLK_CAN1_SERIAL 138 190 1.1 bouyer #define IMX6SXCLK_CAN2_IPG 139 191 1.1 bouyer #define IMX6SXCLK_CAN2_SERIAL 140 192 1.1 bouyer #define IMX6SXCLK_CPU_DEBUG 141 193 1.1 bouyer #define IMX6SXCLK_DCIC1 142 194 1.1 bouyer #define IMX6SXCLK_DCIC2 143 195 1.1 bouyer #define IMX6SXCLK_AIPS_TZ3 144 196 1.1 bouyer #define IMX6SXCLK_ECSPI1 145 197 1.1 bouyer #define IMX6SXCLK_ECSPI2 146 198 1.1 bouyer #define IMX6SXCLK_ECSPI3 147 199 1.1 bouyer #define IMX6SXCLK_ECSPI4 148 200 1.1 bouyer #define IMX6SXCLK_ECSPI5 149 201 1.1 bouyer #define IMX6SXCLK_EPIT1 150 202 1.1 bouyer #define IMX6SXCLK_EPIT2 151 203 1.1 bouyer #define IMX6SXCLK_ESAI_EXTAL 152 204 1.1 bouyer #define IMX6SXCLK_WAKEUP 153 205 1.1 bouyer #define IMX6SXCLK_GPT_BUS 154 206 1.1 bouyer #define IMX6SXCLK_GPT_SERIAL 155 207 1.1 bouyer #define IMX6SXCLK_GPU 156 208 1.1 bouyer #define IMX6SXCLK_OCRAM_S 157 209 1.1 bouyer #define IMX6SXCLK_CANFD 158 210 1.1 bouyer #define IMX6SXCLK_CSI 159 211 1.1 bouyer #define IMX6SXCLK_I2C1 160 212 1.1 bouyer #define IMX6SXCLK_I2C2 161 213 1.1 bouyer #define IMX6SXCLK_I2C3 162 214 1.1 bouyer #define IMX6SXCLK_OCOTP 163 215 1.1 bouyer #define IMX6SXCLK_IOMUXC 164 216 1.1 bouyer #define IMX6SXCLK_IPMUX1 165 217 1.1 bouyer #define IMX6SXCLK_IPMUX2 166 218 1.1 bouyer #define IMX6SXCLK_IPMUX3 167 219 1.1 bouyer #define IMX6SXCLK_TZASC1 168 220 1.1 bouyer #define IMX6SXCLK_LCDIF_APB 169 221 1.1 bouyer #define IMX6SXCLK_PXP_AXI 170 222 1.1 bouyer #define IMX6SXCLK_M4 171 223 1.1 bouyer #define IMX6SXCLK_ENET 172 224 1.1 bouyer #define IMX6SXCLK_DISPLAY_AXI 173 225 1.1 bouyer #define IMX6SXCLK_LCDIF2_PIX 174 226 1.1 bouyer #define IMX6SXCLK_LCDIF1_PIX 175 227 1.1 bouyer #define IMX6SXCLK_LDB_DI0 176 228 1.1 bouyer #define IMX6SXCLK_QSPI1 177 229 1.1 bouyer #define IMX6SXCLK_MLB 178 230 1.1 bouyer #define IMX6SXCLK_MMDC_P0_FAST 179 231 1.1 bouyer #define IMX6SXCLK_MMDC_P0_IPG 180 232 1.1 bouyer #define IMX6SXCLK_AXI 181 233 1.1 bouyer #define IMX6SXCLK_PCIE_AXI 182 234 1.1 bouyer #define IMX6SXCLK_QSPI2 183 235 1.1 bouyer #define IMX6SXCLK_PER1_BCH 184 236 1.1 bouyer #define IMX6SXCLK_PER2_MAIN 185 237 1.1 bouyer #define IMX6SXCLK_PWM1 186 238 1.1 bouyer #define IMX6SXCLK_PWM2 187 239 1.1 bouyer #define IMX6SXCLK_PWM3 188 240 1.1 bouyer #define IMX6SXCLK_PWM4 189 241 1.1 bouyer #define IMX6SXCLK_GPMI_BCH_APB 190 242 1.1 bouyer #define IMX6SXCLK_GPMI_BCH 191 243 1.1 bouyer #define IMX6SXCLK_GPMI_IO 192 244 1.1 bouyer #define IMX6SXCLK_GPMI_APB 193 245 1.1 bouyer #define IMX6SXCLK_ROM 194 246 1.1 bouyer #define IMX6SXCLK_SDMA 195 247 1.1 bouyer #define IMX6SXCLK_SPBA 196 248 1.1 bouyer #define IMX6SXCLK_SPDIF 197 249 1.1 bouyer #define IMX6SXCLK_SSI1_IPG 198 250 1.1 bouyer #define IMX6SXCLK_SSI2_IPG 199 251 1.1 bouyer #define IMX6SXCLK_SSI3_IPG 200 252 1.1 bouyer #define IMX6SXCLK_SSI1 201 253 1.1 bouyer #define IMX6SXCLK_SSI2 202 254 1.1 bouyer #define IMX6SXCLK_SSI3 203 255 1.1 bouyer #define IMX6SXCLK_UART_IPG 204 256 1.1 bouyer #define IMX6SXCLK_UART_SERIAL 205 257 1.1 bouyer #define IMX6SXCLK_SAI1 206 258 1.1 bouyer #define IMX6SXCLK_SAI2 207 259 1.1 bouyer #define IMX6SXCLK_USBOH3 208 260 1.1 bouyer #define IMX6SXCLK_USDHC1 209 261 1.1 bouyer #define IMX6SXCLK_USDHC2 210 262 1.1 bouyer #define IMX6SXCLK_USDHC3 211 263 1.1 bouyer #define IMX6SXCLK_USDHC4 212 264 1.1 bouyer #define IMX6SXCLK_EIM_SLOW 213 265 1.1 bouyer #define IMX6SXCLK_PWM8 214 266 1.1 bouyer #define IMX6SXCLK_VADC 215 267 1.1 bouyer #define IMX6SXCLK_GIS 216 268 1.1 bouyer #define IMX6SXCLK_I2C4 217 269 1.1 bouyer #define IMX6SXCLK_PWM5 218 270 1.1 bouyer #define IMX6SXCLK_PWM6 219 271 1.1 bouyer #define IMX6SXCLK_PWM7 220 272 1.1 bouyer #define IMX6SXCLK_CKO1 221 273 1.1 bouyer #define IMX6SXCLK_CKO2 222 274 1.1 bouyer #define IMX6SXCLK_IPP_DI0 223 275 1.1 bouyer #define IMX6SXCLK_IPP_DI1 224 276 1.1 bouyer #define IMX6SXCLK_ENET_AHB 225 277 1.1 bouyer #define IMX6SXCLK_OCRAM_PODF 226 278 1.1 bouyer #define IMX6SXCLK_GPT_3M 227 279 1.1 bouyer #define IMX6SXCLK_ENET_PTP 228 280 1.1 bouyer #define IMX6SXCLK_ENET_PTP_REF 229 281 1.1 bouyer #define IMX6SXCLK_ENET2_REF 230 282 1.1 bouyer #define IMX6SXCLK_ENET2_REF_125M 231 283 1.1 bouyer #define IMX6SXCLK_AUDIO 232 284 1.1 bouyer #define IMX6SXCLK_LVDS1_SEL 233 285 1.1 bouyer #define IMX6SXCLK_LVDS1_OUT 234 286 1.1 bouyer #define IMX6SXCLK_ASRC_IPG 235 287 1.1 bouyer #define IMX6SXCLK_ASRC_MEM 236 288 1.1 bouyer #define IMX6SXCLK_SAI1_IPG 237 289 1.1 bouyer #define IMX6SXCLK_SAI2_IPG 238 290 1.1 bouyer #define IMX6SXCLK_ESAI_IPG 239 291 1.1 bouyer #define IMX6SXCLK_ESAI_MEM 240 292 1.1 bouyer #define IMX6SXCLK_LVDS1_IN 241 293 1.1 bouyer #define IMX6SXCLK_ANACLK1 242 294 1.1 bouyer #define IMX6SXCLK_PLL1_BYPASS_SRC 243 295 1.1 bouyer #define IMX6SXCLK_PLL2_BYPASS_SRC 244 296 1.1 bouyer #define IMX6SXCLK_PLL3_BYPASS_SRC 245 297 1.1 bouyer #define IMX6SXCLK_PLL4_BYPASS_SRC 246 298 1.1 bouyer #define IMX6SXCLK_PLL5_BYPASS_SRC 247 299 1.1 bouyer #define IMX6SXCLK_PLL6_BYPASS_SRC 248 300 1.1 bouyer #define IMX6SXCLK_PLL7_BYPASS_SRC 249 301 1.1 bouyer #define IMX6SXCLK_PLL1 250 302 1.1 bouyer #define IMX6SXCLK_PLL2 251 303 1.1 bouyer #define IMX6SXCLK_PLL3 252 304 1.1 bouyer #define IMX6SXCLK_PLL4 253 305 1.1 bouyer #define IMX6SXCLK_PLL5 254 306 1.1 bouyer #define IMX6SXCLK_PLL6 255 307 1.1 bouyer #define IMX6SXCLK_PLL7 256 308 1.1 bouyer #define IMX6SXCLK_PLL1_BYPASS 257 309 1.1 bouyer #define IMX6SXCLK_PLL2_BYPASS 258 310 1.1 bouyer #define IMX6SXCLK_PLL3_BYPASS 259 311 1.1 bouyer #define IMX6SXCLK_PLL4_BYPASS 260 312 1.1 bouyer #define IMX6SXCLK_PLL5_BYPASS 261 313 1.1 bouyer #define IMX6SXCLK_PLL6_BYPASS 262 314 1.1 bouyer #define IMX6SXCLK_PLL7_BYPASS 263 315 1.1 bouyer #define IMX6SXCLK_SPDIF_GCLK 264 316 1.1 bouyer #define IMX6SXCLK_LVDS2_SEL 265 317 1.1 bouyer #define IMX6SXCLK_LVDS2_OUT 266 318 1.1 bouyer #define IMX6SXCLK_LVDS2_IN 267 319 1.1 bouyer #define IMX6SXCLK_ANACLK2 268 320 1.1 bouyer #define IMX6SXCLK_MMDC_P1_IPG 269 321 1.1 bouyer #define IMX6SXCLK_END 270 322 1.1 bouyer 323 1.1 bouyer /* Clock Parents Tables */ 324 1.1 bouyer static const char *step_p[] = { 325 1.1 bouyer "osc", 326 1.1 bouyer "pll2_pfd2_396m" 327 1.1 bouyer }; 328 1.1 bouyer 329 1.1 bouyer static const char *pll1_sw_p[] = { 330 1.1 bouyer "pll1_sys", 331 1.1 bouyer "step" 332 1.1 bouyer }; 333 1.1 bouyer 334 1.1 bouyer static const char *periph_pre_p[] = { 335 1.1 bouyer "pll2_bus", 336 1.1 bouyer "pll2_pfd2_396m", 337 1.1 bouyer "pll2_pfd0_352m", 338 1.1 bouyer "pll2_198m" 339 1.1 bouyer }; 340 1.1 bouyer 341 1.1 bouyer static const char *periph2_pre_p[] = { 342 1.1 bouyer "pll2_bus", 343 1.1 bouyer "pll2_pfd2_396m", 344 1.1 bouyer "pll2_pfd0_352m", 345 1.1 bouyer "pll4_audio_div" 346 1.1 bouyer }; 347 1.1 bouyer 348 1.1 bouyer static const char *periph_clk2_p[] = { 349 1.1 bouyer "pll3_usb_otg", 350 1.1 bouyer "osc", 351 1.1 bouyer "osc" 352 1.1 bouyer }; 353 1.1 bouyer 354 1.1 bouyer static const char *periph2_clk2_p[] = { 355 1.1 bouyer "pll3_usb_otg", 356 1.1 bouyer "pll2_bus" 357 1.1 bouyer }; 358 1.1 bouyer 359 1.1 bouyer static const char *audio_p[] = { 360 1.1 bouyer "pll4_audio_div", 361 1.1 bouyer "pll3_pfd2_508m", 362 1.1 bouyer "pll5_video_div", 363 1.1 bouyer "pll3_usb_otg" 364 1.1 bouyer }; 365 1.1 bouyer 366 1.1 bouyer static const char *gpu_axi_p[] = { 367 1.1 bouyer "pll2_pfd2_396m", 368 1.1 bouyer "pll3_pfd0_720m", 369 1.1 bouyer "pll3_pfd1_540m", 370 1.1 bouyer "pll2_bus" 371 1.1 bouyer }; 372 1.1 bouyer 373 1.1 bouyer static const char *gpu_core_p[] = { 374 1.1 bouyer "pll3_pfd1_540m", 375 1.1 bouyer "pll3_pfd0_720m", 376 1.1 bouyer "pll2_bus", 377 1.1 bouyer "pll2_pfd2_396m" 378 1.1 bouyer }; 379 1.1 bouyer 380 1.1 bouyer static const char *ldb_di0_div_p[] = { 381 1.1 bouyer "ldb_di0_div_3_5", 382 1.1 bouyer "ldb_di0_div_7", 383 1.1 bouyer }; 384 1.1 bouyer 385 1.1 bouyer static const char *ldb_di1_div_p[] = { 386 1.1 bouyer "ldb_di1_div_3_5", 387 1.1 bouyer "ldb_di1_div_7", 388 1.1 bouyer }; 389 1.1 bouyer 390 1.1 bouyer static const char *ldb_di0_p[] = { 391 1.1 bouyer "pll5_video_div", 392 1.1 bouyer "pll2_pfd0_352m", 393 1.1 bouyer "pll2_pfd2_396m", 394 1.1 bouyer "pll2_pfd3_594m", 395 1.1 bouyer "pll2_pfd1_594m", 396 1.1 bouyer "pll3_pfd3_454m", 397 1.1 bouyer }; 398 1.1 bouyer 399 1.1 bouyer static const char *ldb_di1_p[] = { 400 1.1 bouyer "pll3_usb_otg", 401 1.1 bouyer "pll2_pfd0_352m", 402 1.1 bouyer "pll2_pfd2_396m", 403 1.1 bouyer "pll2_bus", 404 1.1 bouyer "pll3_pfd3_454m", 405 1.1 bouyer "pll3_pfd2_508m", 406 1.1 bouyer }; 407 1.1 bouyer 408 1.1 bouyer static const char *pll_bypass_src_p[] = { 409 1.1 bouyer "osc", 410 1.1 bouyer "lvds1_in", 411 1.1 bouyer "lvds2_in", 412 1.1 bouyer "dummy" 413 1.1 bouyer }; 414 1.1 bouyer 415 1.1 bouyer static const char *pll1_bypass_p[] = { 416 1.1 bouyer "pll1", 417 1.1 bouyer "pll1_bypass_src" 418 1.1 bouyer }; 419 1.1 bouyer 420 1.1 bouyer static const char *pll2_bypass_p[] = { 421 1.1 bouyer "pll2", 422 1.1 bouyer "pll2_bypass_src" 423 1.1 bouyer }; 424 1.1 bouyer 425 1.1 bouyer static const char *pll3_bypass_p[] = { 426 1.1 bouyer "pll3", 427 1.1 bouyer "pll3_bypass_src" 428 1.1 bouyer }; 429 1.1 bouyer 430 1.1 bouyer static const char *pll4_bypass_p[] = { 431 1.1 bouyer "pll4", 432 1.1 bouyer "pll4_bypass_src" 433 1.1 bouyer }; 434 1.1 bouyer 435 1.1 bouyer static const char *pll5_bypass_p[] = { 436 1.1 bouyer "pll5", 437 1.1 bouyer "pll5_bypass_src" 438 1.1 bouyer }; 439 1.1 bouyer 440 1.1 bouyer static const char *pll6_bypass_p[] = { 441 1.1 bouyer "pll6", 442 1.1 bouyer "pll6_bypass_src" 443 1.1 bouyer }; 444 1.1 bouyer 445 1.1 bouyer static const char *pll7_bypass_p[] = { 446 1.1 bouyer "pll7", 447 1.1 bouyer "pll7_bypass_src" 448 1.1 bouyer }; 449 1.1 bouyer 450 1.1 bouyer static const char *periph_p[] = { 451 1.1 bouyer "periph_pre", 452 1.1 bouyer "periph_clk2" 453 1.1 bouyer }; 454 1.1 bouyer 455 1.1 bouyer static const char *periph2_p[] = { 456 1.1 bouyer "periph2_pre", 457 1.1 bouyer "periph2_clk2" 458 1.1 bouyer }; 459 1.1 bouyer 460 1.1 bouyer static const char *ocram_p[] = { 461 1.1 bouyer "periph", 462 1.1 bouyer "pll2_pfd2_396m", 463 1.1 bouyer "periph", 464 1.1 bouyer "pll3_pfd1_540m", 465 1.1 bouyer }; 466 1.1 bouyer 467 1.1 bouyer static const char *cko1_p[] = { 468 1.1 bouyer "dummy", 469 1.1 bouyer "dummy", 470 1.1 bouyer "dummy", 471 1.1 bouyer "dummy", 472 1.1 bouyer "vadc", 473 1.1 bouyer "ocram", 474 1.1 bouyer "qspi2", 475 1.1 bouyer "m4", 476 1.1 bouyer "enet_ahb", 477 1.1 bouyer "lcdif2_pix", 478 1.1 bouyer "lcdif1_pix", 479 1.1 bouyer "ahb", 480 1.1 bouyer "ipg", 481 1.1 bouyer "perclk", 482 1.1 bouyer "ckil", 483 1.1 bouyer "pll4_audio_div", 484 1.1 bouyer }; 485 1.1 bouyer 486 1.1 bouyer static const char *cko2_p[] = { 487 1.1 bouyer "dummy", 488 1.1 bouyer "mmdc_p0_fast", 489 1.1 bouyer "usdhc4", 490 1.1 bouyer "usdhc1", 491 1.1 bouyer "dummy", 492 1.1 bouyer "wrck", 493 1.1 bouyer "ecspi_root", 494 1.1 bouyer "dummy", 495 1.1 bouyer "usdhc3", 496 1.1 bouyer "pcie", 497 1.1 bouyer "arm", 498 1.1 bouyer "csi_core", 499 1.1 bouyer "display_axi", 500 1.1 bouyer "dummy", 501 1.1 bouyer "osc", 502 1.1 bouyer "dummy", 503 1.1 bouyer "dummy", 504 1.1 bouyer "usdhc2", 505 1.1 bouyer "ssi1", 506 1.1 bouyer "ssi2", 507 1.1 bouyer "ssi3", 508 1.1 bouyer "gpu_axi_podf", 509 1.1 bouyer "dummy", 510 1.1 bouyer "can_podf", 511 1.1 bouyer "lvds1_out", 512 1.1 bouyer "qspi1", 513 1.1 bouyer "esai_extal", 514 1.1 bouyer "eim_slow", 515 1.1 bouyer "uart_serial", 516 1.1 bouyer "spdif", 517 1.1 bouyer "audio", 518 1.1 bouyer "dummy", 519 1.1 bouyer }; 520 1.1 bouyer 521 1.1 bouyer static const char *cko_p[] = { 522 1.1 bouyer "cko1", 523 1.1 bouyer "cko2" 524 1.1 bouyer }; 525 1.1 bouyer 526 1.1 bouyer static const char *pcie_axi_p[] = { 527 1.1 bouyer "ocram", 528 1.1 bouyer "ahb" 529 1.1 bouyer }; 530 1.1 bouyer 531 1.1 bouyer static const char *ssi_p[] = { 532 1.1 bouyer "pll3_pfd2_508m", 533 1.1 bouyer "pll5_video_div", 534 1.1 bouyer "pll4_audio_div" 535 1.1 bouyer }; 536 1.1 bouyer 537 1.1 bouyer static const char *qspi1_p[] = { 538 1.1 bouyer "pll3_usb_otg", 539 1.1 bouyer "pll2_pfd0_352m", 540 1.1 bouyer "pll2_pfd2_396m", 541 1.1 bouyer "pll2_bus", 542 1.1 bouyer "pll3_pfd3_454m", 543 1.1 bouyer "pll3_pfd2_508m", 544 1.1 bouyer }; 545 1.1 bouyer 546 1.1 bouyer static const char *perclk_p[] = { 547 1.1 bouyer "ipg", 548 1.1 bouyer "osc" 549 1.1 bouyer }; 550 1.1 bouyer 551 1.1 bouyer static const char *usdhc_p[] = { 552 1.1 bouyer "pll2_pfd2_396m", 553 1.1 bouyer "pll2_pfd0_352m" 554 1.1 bouyer }; 555 1.1 bouyer 556 1.1 bouyer static const char *vid_p[] = { 557 1.1 bouyer "pll3_pfd1_540m", 558 1.1 bouyer "pll3_usb_otg", 559 1.1 bouyer "pll3_pfd3_454m", 560 1.1 bouyer "pll4_audio_div", 561 1.1 bouyer "pll5_video_div", 562 1.1 bouyer }; 563 1.1 bouyer 564 1.1 bouyer static const char *can_p[] = { 565 1.1 bouyer "pll3_60m", 566 1.1 bouyer "osc", 567 1.1 bouyer "pll3_80m", 568 1.1 bouyer "dummy", 569 1.1 bouyer }; 570 1.1 bouyer 571 1.1 bouyer static const char *uart_p[] = { 572 1.1 bouyer "pll3_80m", 573 1.1 bouyer "osc", 574 1.1 bouyer }; 575 1.1 bouyer 576 1.1 bouyer static const char *qspi2_p[] = { 577 1.1 bouyer "pll2_pfd0_352m", 578 1.1 bouyer "pll2_bus", 579 1.1 bouyer "pll3_usb_otg", 580 1.1 bouyer "pll2_pfd2_396m", 581 1.1 bouyer "pll3_pfd3_454m", 582 1.1 bouyer "dummy", 583 1.1 bouyer "dummy", 584 1.1 bouyer "dummy", 585 1.1 bouyer }; 586 1.1 bouyer 587 1.1 bouyer static const char *enet_pre_p[] = { 588 1.1 bouyer "pll2_bus", 589 1.1 bouyer "pll3_usb_otg", 590 1.1 bouyer "pll5_video_div", 591 1.1 bouyer "pll2_pfd0_352m", 592 1.1 bouyer "pll2_pfd2_396m", 593 1.1 bouyer "pll3_pfd2_508m", 594 1.1 bouyer }; 595 1.1 bouyer 596 1.1 bouyer static const char *enet_p[] = { 597 1.1 bouyer "enet_podf", 598 1.1 bouyer "ipp_di0", 599 1.1 bouyer "ipp_di1", 600 1.1 bouyer "ldb_di0", 601 1.1 bouyer "ldb_di1", 602 1.1 bouyer }; 603 1.1 bouyer 604 1.1 bouyer static const char *m4_pre_p[] = { 605 1.1 bouyer "pll2_bus", 606 1.1 bouyer "pll3_usb_otg", 607 1.1 bouyer "osc", 608 1.1 bouyer "pll2_pfd0_352m", 609 1.1 bouyer "pll2_pfd2_396m", 610 1.1 bouyer "pll3_pfd3_454m", 611 1.1 bouyer }; 612 1.1 bouyer 613 1.1 bouyer static const char *m4_p[] = { 614 1.1 bouyer "m4_pre_sel", 615 1.1 bouyer "ipp_di0", 616 1.1 bouyer "ipp_di1", 617 1.1 bouyer "ldb_di0", 618 1.1 bouyer "ldb_di1", 619 1.1 bouyer }; 620 1.1 bouyer 621 1.1 bouyer static const char *eim_slow_p[] = { 622 1.1 bouyer "ocram", 623 1.1 bouyer "pll3_usb_otg", 624 1.1 bouyer "pll2_pfd2_396m", 625 1.1 bouyer "pll2_pfd0_352m" 626 1.1 bouyer }; 627 1.1 bouyer 628 1.1 bouyer static const char *ecspi_p[] = { 629 1.1 bouyer "pll3_60m", 630 1.1 bouyer "osc", 631 1.1 bouyer }; 632 1.1 bouyer 633 1.1 bouyer static const char *lcdif1_pre_p[] = { 634 1.1 bouyer "pll2_bus", 635 1.1 bouyer "pll3_pfd3_454m", 636 1.1 bouyer "pll5_video_div", 637 1.1 bouyer "pll2_pfd0_352m", 638 1.1 bouyer "pll2_pfd1_594m", 639 1.1 bouyer "pll3_pfd1_540m", 640 1.1 bouyer }; 641 1.1 bouyer 642 1.1 bouyer static const char *lcdif1_p[] = { 643 1.1 bouyer "lcdif1_podf", 644 1.1 bouyer "ipp_di0", 645 1.1 bouyer "ipp_di1", 646 1.1 bouyer "ldb_di0", 647 1.1 bouyer "ldb_di1", 648 1.1 bouyer }; 649 1.1 bouyer 650 1.1 bouyer static const char *lcdif2_pre_p[] = { 651 1.1 bouyer "pll2_bus", 652 1.1 bouyer "pll3_pfd3_454m", 653 1.1 bouyer "pll5_video_div", 654 1.1 bouyer "pll2_pfd0_352m", 655 1.1 bouyer "pll2_pfd3_594m", 656 1.1 bouyer "pll3_pfd1_540m", 657 1.1 bouyer }; 658 1.1 bouyer 659 1.1 bouyer static const char *lcdif2_p[] = { 660 1.1 bouyer "lcdif2_podf", 661 1.1 bouyer "ipp_di0", 662 1.1 bouyer "ipp_di1", 663 1.1 bouyer "ldb_di0", 664 1.1 bouyer "ldb_di1", 665 1.1 bouyer }; 666 1.1 bouyer 667 1.1 bouyer static const char *display_p[] = { 668 1.1 bouyer "pll2_bus", 669 1.1 bouyer "pll2_pfd2_396m", 670 1.1 bouyer "pll3_usb_otg", 671 1.1 bouyer "pll3_pfd1_540m", 672 1.1 bouyer }; 673 1.1 bouyer 674 1.1 bouyer static const char *csi_p[] = { 675 1.1 bouyer "osc", 676 1.1 bouyer "pll2_pfd2_396m", 677 1.1 bouyer "pll3_120m", 678 1.1 bouyer "pll3_pfd1_540m", 679 1.1 bouyer }; 680 1.1 bouyer 681 1.1 bouyer static const char *lvds_p[] = { 682 1.1 bouyer "arm", 683 1.1 bouyer "pll1_sys", 684 1.1 bouyer "dummy", 685 1.1 bouyer "dummy", 686 1.1 bouyer "dummy", 687 1.1 bouyer "dummy", 688 1.1 bouyer "dummy", 689 1.1 bouyer "pll5_video_div", 690 1.1 bouyer "dummy", 691 1.1 bouyer "dummy", 692 1.1 bouyer "pcie_ref_125m", 693 1.1 bouyer "dummy", 694 1.1 bouyer "usbphy1", 695 1.1 bouyer "usbphy2", 696 1.1 bouyer }; 697 1.1 bouyer 698 1.1 bouyer /* DT clock ID to clock name mappings */ 699 1.1 bouyer static struct imx_clock_id { 700 1.1 bouyer u_int id; 701 1.1 bouyer const char *name; 702 1.1 bouyer } imx6sx_clock_ids[] = { 703 1.1 bouyer { IMX6SXCLK_DUMMY, "dummy" }, 704 1.1 bouyer { IMX6SXCLK_CKIL, "ckil" }, 705 1.1 bouyer { IMX6SXCLK_OSC, "osc" }, 706 1.1 bouyer { IMX6SXCLK_PLL1_SYS, "pll1_sys" }, 707 1.1 bouyer { IMX6SXCLK_PLL2_BUS, "pll2_bus" }, 708 1.1 bouyer { IMX6SXCLK_PLL3_USB_OTG, "pll3_usb_otg" }, 709 1.1 bouyer { IMX6SXCLK_PLL4_AUDIO, "pll4_audio" }, 710 1.1 bouyer { IMX6SXCLK_PLL5_VIDEO, "pll5_video" }, 711 1.1 bouyer { IMX6SXCLK_PLL6_ENET, "pll6_enet" }, 712 1.1 bouyer { IMX6SXCLK_PLL7_USB_HOST, "pll7_usb_host" }, 713 1.1 bouyer { IMX6SXCLK_USBPHY1, "usbphy1" }, 714 1.1 bouyer { IMX6SXCLK_USBPHY2, "usbphy2" }, 715 1.1 bouyer { IMX6SXCLK_USBPHY1_GATE, "usbphy1_gate" }, 716 1.1 bouyer { IMX6SXCLK_USBPHY2_GATE, "usbphy2_gate" }, 717 1.1 bouyer { IMX6SXCLK_PCIE_REF, "pcie_ref" }, 718 1.1 bouyer { IMX6SXCLK_PCIE_REF_125M, "pcie_ref_125m" }, 719 1.1 bouyer { IMX6SXCLK_PLL2_PFD0, "pll2_pfd0_352m" }, 720 1.1 bouyer { IMX6SXCLK_PLL2_PFD1, "pll2_pfd1_594m" }, 721 1.1 bouyer { IMX6SXCLK_PLL2_PFD2, "pll2_pfd2_396m" }, 722 1.1 bouyer { IMX6SXCLK_PLL2_PFD3, "pll2_pfd3_594m" }, 723 1.1 bouyer { IMX6SXCLK_PLL3_PFD0, "pll3_pfd0_720m" }, 724 1.1 bouyer { IMX6SXCLK_PLL3_PFD1, "pll3_pfd1_540m" }, 725 1.1 bouyer { IMX6SXCLK_PLL3_PFD2, "pll3_pfd2_508m" }, 726 1.1 bouyer { IMX6SXCLK_PLL3_PFD3, "pll3_pfd3_454m" }, 727 1.1 bouyer { IMX6SXCLK_PLL2_198M, "pll2_198m" }, 728 1.1 bouyer { IMX6SXCLK_PLL3_120M, "pll3_120m" }, 729 1.1 bouyer { IMX6SXCLK_PLL3_80M, "pll3_80m" }, 730 1.1 bouyer { IMX6SXCLK_PLL3_60M, "pll3_60m" }, 731 1.1 bouyer { IMX6SXCLK_TWD, "twd" }, 732 1.1 bouyer { IMX6SXCLK_PLL4_POST_DIV, "pll4_post_div" }, 733 1.1 bouyer { IMX6SXCLK_PLL4_AUDIO_DIV, "pll4_audio_div" }, 734 1.1 bouyer { IMX6SXCLK_PLL5_POST_DIV, "pll5_post_div" }, 735 1.1 bouyer { IMX6SXCLK_PLL5_VIDEO_DIV, "pll5_video_div" }, 736 1.1 bouyer { IMX6SXCLK_STEP, "step" }, 737 1.1 bouyer { IMX6SXCLK_PLL1_SW, "pll1_sw" }, 738 1.1 bouyer { IMX6SXCLK_OCRAM_SEL, "ocram_sel" }, 739 1.1 bouyer { IMX6SXCLK_PERIPH_PRE, "periph_pre" }, 740 1.1 bouyer { IMX6SXCLK_PERIPH2_PRE, "periph2_pre" }, 741 1.1 bouyer { IMX6SXCLK_PERIPH_CLK2_SEL, "periph_clk2_sel" }, 742 1.1 bouyer { IMX6SXCLK_PERIPH2_CLK2_SEL, "periph2_clk2_sel" }, 743 1.1 bouyer { IMX6SXCLK_PCIE_AXI_SEL, "pcie_axi_sel" }, 744 1.1 bouyer { IMX6SXCLK_GPU_AXI_SEL, "gpu_axi_sel" }, 745 1.1 bouyer { IMX6SXCLK_GPU_CORE_SEL, "gpu_core_sel" }, 746 1.1 bouyer { IMX6SXCLK_EIM_SLOW_SEL, "eim_slow_sel" }, 747 1.1 bouyer { IMX6SXCLK_USDHC1_SEL, "usdhc1_sel" }, 748 1.1 bouyer { IMX6SXCLK_USDHC2_SEL, "usdhc2_sel" }, 749 1.1 bouyer { IMX6SXCLK_USDHC3_SEL, "usdhc3_sel" }, 750 1.1 bouyer { IMX6SXCLK_USDHC4_SEL, "usdhc4_sel" }, 751 1.1 bouyer { IMX6SXCLK_SSI1_SEL, "ssi1_sel" }, 752 1.1 bouyer { IMX6SXCLK_SSI2_SEL, "ssi2_sel" }, 753 1.1 bouyer { IMX6SXCLK_SSI3_SEL, "ssi3_sel" }, 754 1.1 bouyer { IMX6SXCLK_QSPI1_SEL, "qspi1_sel" }, 755 1.1 bouyer { IMX6SXCLK_PERCLK_SEL, "perclk_sel" }, 756 1.1 bouyer { IMX6SXCLK_VID_SEL, "vid_sel" }, 757 1.1 bouyer { IMX6SXCLK_ESAI_SEL, "esai_sel" }, 758 1.1 bouyer { IMX6SXCLK_LDB_DI0_DIV_SEL, "ldb_di0_div_sel" }, 759 1.1 bouyer { IMX6SXCLK_LDB_DI1_DIV_SEL, "ldb_di1_div_sel" }, 760 1.1 bouyer { IMX6SXCLK_CAN_SEL, "can_sel" }, 761 1.1 bouyer { IMX6SXCLK_UART_SEL, "uart_sel" }, 762 1.1 bouyer { IMX6SXCLK_QSPI2_SEL, "qspi2_sel" }, 763 1.1 bouyer { IMX6SXCLK_LDB_DI0_SEL, "ldb_di0_sel" }, 764 1.1 bouyer { IMX6SXCLK_LDB_DI1_SEL, "ldb_di1_sel" }, 765 1.1 bouyer { IMX6SXCLK_SPDIF_SEL, "spdif_sel" }, 766 1.1 bouyer { IMX6SXCLK_AUDIO_SEL, "audio_sel" }, 767 1.1 bouyer { IMX6SXCLK_ENET_PRE_SEL, "enet_pre_sel" }, 768 1.1 bouyer { IMX6SXCLK_ENET_SEL, "enet_sel" }, 769 1.1 bouyer { IMX6SXCLK_M4_PRE_SEL, "m4_pre_sel" }, 770 1.1 bouyer { IMX6SXCLK_M4_SEL, "m4_sel" }, 771 1.1 bouyer { IMX6SXCLK_ECSPI_SEL, "ecspi_sel" }, 772 1.1 bouyer { IMX6SXCLK_LCDIF1_PRE_SEL, "lcdif1_pre_sel" }, 773 1.1 bouyer { IMX6SXCLK_LCDIF2_PRE_SEL, "lcdif2_pre_sel" }, 774 1.1 bouyer { IMX6SXCLK_LCDIF1_SEL, "lcdif1_sel" }, 775 1.1 bouyer { IMX6SXCLK_LCDIF2_SEL, "lcdif2_sel" }, 776 1.1 bouyer { IMX6SXCLK_DISPLAY_SEL, "display_sel" }, 777 1.1 bouyer { IMX6SXCLK_CSI_SEL, "csi_sel" }, 778 1.1 bouyer { IMX6SXCLK_CKO1_SEL, "cko1_sel" }, 779 1.1 bouyer { IMX6SXCLK_CKO2_SEL, "cko2_sel" }, 780 1.1 bouyer { IMX6SXCLK_CKO, "cko" }, 781 1.1 bouyer { IMX6SXCLK_PERIPH_CLK2, "periph_clk2" }, 782 1.1 bouyer { IMX6SXCLK_PERIPH2_CLK2, "periph2_clk2" }, 783 1.1 bouyer { IMX6SXCLK_IPG, "ipg" }, 784 1.1 bouyer { IMX6SXCLK_GPU_CORE_PODF, "gpu_core_podf" }, 785 1.1 bouyer { IMX6SXCLK_GPU_AXI_PODF, "gpu_axi_podf" }, 786 1.1 bouyer { IMX6SXCLK_LCDIF1_PODF, "lcdif1_podf" }, 787 1.1 bouyer { IMX6SXCLK_QSPI1_PODF, "qspi1_podf" }, 788 1.1 bouyer { IMX6SXCLK_EIM_SLOW_PODF, "eim_slow_podf" }, 789 1.1 bouyer { IMX6SXCLK_LCDIF2_PODF, "lcdif2_podf" }, 790 1.1 bouyer { IMX6SXCLK_PERCLK, "perclk" }, 791 1.1 bouyer { IMX6SXCLK_VID_PODF, "vid_podf" }, 792 1.1 bouyer { IMX6SXCLK_CAN_PODF, "can_podf" }, 793 1.1 bouyer { IMX6SXCLK_USDHC1_PODF, "usdhc1_podf" }, 794 1.1 bouyer { IMX6SXCLK_USDHC2_PODF, "usdhc2_podf" }, 795 1.1 bouyer { IMX6SXCLK_USDHC3_PODF, "usdhc3_podf" }, 796 1.1 bouyer { IMX6SXCLK_USDHC4_PODF, "usdhc4_podf" }, 797 1.1 bouyer { IMX6SXCLK_UART_PODF, "uart_podf" }, 798 1.1 bouyer { IMX6SXCLK_ESAI_PRED, "esai_pred" }, 799 1.1 bouyer { IMX6SXCLK_ESAI_PODF, "esai_podf" }, 800 1.1 bouyer { IMX6SXCLK_SSI3_PRED, "ssi3_pred" }, 801 1.1 bouyer { IMX6SXCLK_SSI3_PODF, "ssi3_podf" }, 802 1.1 bouyer { IMX6SXCLK_SSI1_PRED, "ssi1_pred" }, 803 1.1 bouyer { IMX6SXCLK_SSI1_PODF, "ssi1_podf" }, 804 1.1 bouyer { IMX6SXCLK_QSPI2_PRED, "qspi2_pred" }, 805 1.1 bouyer { IMX6SXCLK_QSPI2_PODF, "qspi2_podf" }, 806 1.1 bouyer { IMX6SXCLK_SSI2_PRED, "ssi2_pred" }, 807 1.1 bouyer { IMX6SXCLK_SSI2_PODF, "ssi2_podf" }, 808 1.1 bouyer { IMX6SXCLK_SPDIF_PRED, "spdif_pred" }, 809 1.1 bouyer { IMX6SXCLK_SPDIF_PODF, "spdif_podf" }, 810 1.1 bouyer { IMX6SXCLK_AUDIO_PRED, "audio_pred" }, 811 1.1 bouyer { IMX6SXCLK_AUDIO_PODF, "audio_podf" }, 812 1.1 bouyer { IMX6SXCLK_ENET_PODF, "enet_podf" }, 813 1.1 bouyer { IMX6SXCLK_M4_PODF, "m4_podf" }, 814 1.1 bouyer { IMX6SXCLK_ECSPI_PODF, "ecspi_podf" }, 815 1.1 bouyer { IMX6SXCLK_LCDIF1_PRED, "lcdif1_pred" }, 816 1.1 bouyer { IMX6SXCLK_LCDIF2_PRED, "lcdif2_pred" }, 817 1.1 bouyer { IMX6SXCLK_DISPLAY_PODF, "display_podf" }, 818 1.1 bouyer { IMX6SXCLK_CSI_PODF, "csi_podf" }, 819 1.1 bouyer { IMX6SXCLK_LDB_DI0_DIV_3_5, "ldb_di0_div_3_5" }, 820 1.1 bouyer { IMX6SXCLK_LDB_DI0_DIV_7, "ldb_di0_div_7" }, 821 1.1 bouyer { IMX6SXCLK_LDB_DI1_DIV_3_5, "ldb_di1_div_3_5" }, 822 1.1 bouyer { IMX6SXCLK_LDB_DI1_DIV_7, "ldb_di1_div_7" }, 823 1.1 bouyer { IMX6SXCLK_CKO1_PODF, "cko1_podf" }, 824 1.1 bouyer { IMX6SXCLK_CKO2_PODF, "cko2_podf" }, 825 1.1 bouyer { IMX6SXCLK_PERIPH, "periph" }, 826 1.1 bouyer { IMX6SXCLK_PERIPH2, "periph2" }, 827 1.1 bouyer { IMX6SXCLK_OCRAM, "ocram" }, 828 1.1 bouyer { IMX6SXCLK_AHB, "ahb" }, 829 1.1 bouyer { IMX6SXCLK_MMDC_PODF, "mmdc_podf" }, 830 1.1 bouyer { IMX6SXCLK_ARM, "arm" }, 831 1.1 bouyer { IMX6SXCLK_AIPS_TZ1, "aips_tz1" }, 832 1.1 bouyer { IMX6SXCLK_AIPS_TZ2, "aips_tz2" }, 833 1.1 bouyer { IMX6SXCLK_APBH_DMA, "apbh_dma" }, 834 1.1 bouyer { IMX6SXCLK_CAAM_MEM, "caam_mem" }, 835 1.1 bouyer { IMX6SXCLK_CAAM_ACLK, "caam_aclk" }, 836 1.1 bouyer { IMX6SXCLK_CAAM_IPG, "caam_ipg" }, 837 1.1 bouyer { IMX6SXCLK_CAN1_IPG, "can1_ipg" }, 838 1.1 bouyer { IMX6SXCLK_CAN1_SERIAL, "can1_serial" }, 839 1.1 bouyer { IMX6SXCLK_CAN2_IPG, "can2_ipg" }, 840 1.1 bouyer { IMX6SXCLK_CAN2_SERIAL, "can2_serial" }, 841 1.1 bouyer { IMX6SXCLK_DCIC1, "dcic1" }, 842 1.1 bouyer { IMX6SXCLK_DCIC2, "dcic2" }, 843 1.1 bouyer { IMX6SXCLK_AIPS_TZ3, "aips_tz3" }, 844 1.1 bouyer { IMX6SXCLK_ECSPI1, "ecspi1" }, 845 1.1 bouyer { IMX6SXCLK_ECSPI2, "ecspi2" }, 846 1.1 bouyer { IMX6SXCLK_ECSPI3, "ecspi3" }, 847 1.1 bouyer { IMX6SXCLK_ECSPI4, "ecspi4" }, 848 1.1 bouyer { IMX6SXCLK_ECSPI5, "ecspi5" }, 849 1.1 bouyer { IMX6SXCLK_EPIT1, "epit1" }, 850 1.1 bouyer { IMX6SXCLK_EPIT2, "epit2" }, 851 1.1 bouyer { IMX6SXCLK_ESAI_EXTAL, "esai_extal" }, 852 1.1 bouyer { IMX6SXCLK_WAKEUP, "wakeup" }, 853 1.1 bouyer { IMX6SXCLK_GPT_BUS, "gpt_bus" }, 854 1.1 bouyer { IMX6SXCLK_GPT_SERIAL, "gpt_serial" }, 855 1.1 bouyer { IMX6SXCLK_GPU, "gpu" }, 856 1.1 bouyer { IMX6SXCLK_OCRAM_S, "ocram_s" }, 857 1.1 bouyer { IMX6SXCLK_CANFD, "canfd" }, 858 1.1 bouyer { IMX6SXCLK_CSI, "csi" }, 859 1.1 bouyer { IMX6SXCLK_I2C1, "i2c1" }, 860 1.1 bouyer { IMX6SXCLK_I2C2, "i2c2" }, 861 1.1 bouyer { IMX6SXCLK_I2C3, "i2c3" }, 862 1.1 bouyer { IMX6SXCLK_OCOTP, "ocotp" }, 863 1.1 bouyer { IMX6SXCLK_IOMUXC, "iomuxc" }, 864 1.1 bouyer { IMX6SXCLK_IPMUX1, "ipmux1" }, 865 1.1 bouyer { IMX6SXCLK_IPMUX2, "ipmux2" }, 866 1.1 bouyer { IMX6SXCLK_IPMUX3, "ipmux3" }, 867 1.1 bouyer { IMX6SXCLK_TZASC1, "tzasc1" }, 868 1.1 bouyer { IMX6SXCLK_LCDIF_APB, "lcdif_apb" }, 869 1.1 bouyer { IMX6SXCLK_PXP_AXI, "pxp_axi" }, 870 1.1 bouyer { IMX6SXCLK_M4, "m4" }, 871 1.1 bouyer { IMX6SXCLK_ENET, "enet" }, 872 1.1 bouyer { IMX6SXCLK_DISPLAY_AXI, "display_axi" }, 873 1.1 bouyer { IMX6SXCLK_LCDIF2_PIX, "lcdif2_pix" }, 874 1.1 bouyer { IMX6SXCLK_LCDIF1_PIX, "lcdif1_pix" }, 875 1.1 bouyer { IMX6SXCLK_LDB_DI0, "ldb_di0" }, 876 1.1 bouyer { IMX6SXCLK_QSPI1, "qspi1" }, 877 1.1 bouyer { IMX6SXCLK_MLB, "mlb" }, 878 1.1 bouyer { IMX6SXCLK_MMDC_P0_FAST, "mmdc_p0_fast" }, 879 1.1 bouyer { IMX6SXCLK_MMDC_P0_IPG, "mmdc_p0_ipg" }, 880 1.1 bouyer { IMX6SXCLK_PCIE_AXI, "pcie_axi" }, 881 1.1 bouyer { IMX6SXCLK_QSPI2, "qspi2" }, 882 1.1 bouyer { IMX6SXCLK_PER1_BCH, "per1_bch" }, 883 1.1 bouyer { IMX6SXCLK_PER2_MAIN, "per2_main" }, 884 1.1 bouyer { IMX6SXCLK_PWM1, "pwm1" }, 885 1.1 bouyer { IMX6SXCLK_PWM2, "pwm2" }, 886 1.1 bouyer { IMX6SXCLK_PWM3, "pwm3" }, 887 1.1 bouyer { IMX6SXCLK_PWM4, "pwm4" }, 888 1.1 bouyer { IMX6SXCLK_GPMI_BCH_APB, "gpmi_bch_apb" }, 889 1.1 bouyer { IMX6SXCLK_GPMI_BCH, "gpmi_bch" }, 890 1.1 bouyer { IMX6SXCLK_GPMI_IO, "gpmi_io" }, 891 1.1 bouyer { IMX6SXCLK_GPMI_APB, "gpmi_apb" }, 892 1.1 bouyer { IMX6SXCLK_ROM, "rom" }, 893 1.1 bouyer { IMX6SXCLK_SDMA, "sdma" }, 894 1.1 bouyer { IMX6SXCLK_SPBA, "spba" }, 895 1.1 bouyer { IMX6SXCLK_SPDIF, "spdif" }, 896 1.1 bouyer { IMX6SXCLK_SSI1_IPG, "ssi1_ipg" }, 897 1.1 bouyer { IMX6SXCLK_SSI2_IPG, "ssi2_ipg" }, 898 1.1 bouyer { IMX6SXCLK_SSI3_IPG, "ssi3_ipg" }, 899 1.1 bouyer { IMX6SXCLK_SSI1, "ssi1" }, 900 1.1 bouyer { IMX6SXCLK_SSI2, "ssi2" }, 901 1.1 bouyer { IMX6SXCLK_SSI3, "ssi3" }, 902 1.1 bouyer { IMX6SXCLK_UART_IPG, "uart_ipg" }, 903 1.1 bouyer { IMX6SXCLK_UART_SERIAL, "uart_serial" }, 904 1.1 bouyer { IMX6SXCLK_SAI1, "sai1" }, 905 1.1 bouyer { IMX6SXCLK_SAI2, "sai2" }, 906 1.1 bouyer { IMX6SXCLK_USBOH3, "usboh3" }, 907 1.1 bouyer { IMX6SXCLK_USDHC1, "usdhc1" }, 908 1.1 bouyer { IMX6SXCLK_USDHC2, "usdhc2" }, 909 1.1 bouyer { IMX6SXCLK_USDHC3, "usdhc3" }, 910 1.1 bouyer { IMX6SXCLK_USDHC4, "usdhc4" }, 911 1.1 bouyer { IMX6SXCLK_EIM_SLOW, "eim_slow" }, 912 1.1 bouyer { IMX6SXCLK_PWM8, "pwm8" }, 913 1.1 bouyer { IMX6SXCLK_VADC, "vadc" }, 914 1.1 bouyer { IMX6SXCLK_GIS, "gis" }, 915 1.1 bouyer { IMX6SXCLK_I2C4, "i2c4" }, 916 1.1 bouyer { IMX6SXCLK_PWM5, "pwm5" }, 917 1.1 bouyer { IMX6SXCLK_PWM6, "pwm6" }, 918 1.1 bouyer { IMX6SXCLK_PWM7, "pwm7" }, 919 1.1 bouyer { IMX6SXCLK_CKO1, "cko1" }, 920 1.1 bouyer { IMX6SXCLK_CKO2, "cko2" }, 921 1.1 bouyer { IMX6SXCLK_IPP_DI0, "ipp_di0" }, 922 1.1 bouyer { IMX6SXCLK_IPP_DI1, "ipp_di1" }, 923 1.1 bouyer { IMX6SXCLK_ENET_AHB, "enet_ahb" }, 924 1.1 bouyer { IMX6SXCLK_OCRAM_PODF, "ocram_podf" }, 925 1.1 bouyer { IMX6SXCLK_GPT_3M, "gpt_3m" }, 926 1.1 bouyer { IMX6SXCLK_ENET_PTP, "enet_ptp_25m" }, 927 1.1 bouyer { IMX6SXCLK_ENET_PTP_REF, "enet_ptp_ref" }, 928 1.1 bouyer { IMX6SXCLK_ENET2_REF, "enet2_ref" }, 929 1.1 bouyer { IMX6SXCLK_ENET2_REF_125M, "enet2_ref_125m" }, 930 1.1 bouyer { IMX6SXCLK_AUDIO, "audio" }, 931 1.1 bouyer { IMX6SXCLK_LVDS1_SEL, "lvds1_sel" }, 932 1.1 bouyer { IMX6SXCLK_LVDS1_OUT, "lvds1_out" }, 933 1.1 bouyer { IMX6SXCLK_ASRC_IPG, "asrc_ipg" }, 934 1.1 bouyer { IMX6SXCLK_ASRC_MEM, "asrc_mem" }, 935 1.1 bouyer { IMX6SXCLK_SAI1_IPG, "sai1_ipg" }, 936 1.1 bouyer { IMX6SXCLK_SAI2_IPG, "sai2_ipg" }, 937 1.1 bouyer { IMX6SXCLK_ESAI_IPG, "esai_ipg" }, 938 1.1 bouyer { IMX6SXCLK_ESAI_MEM, "esai_mem" }, 939 1.1 bouyer { IMX6SXCLK_LVDS1_IN, "lvds1_in" }, 940 1.1 bouyer { IMX6SXCLK_ANACLK1, "anaclk1" }, 941 1.1 bouyer { IMX6SXCLK_PLL1_BYPASS_SRC, "pll1_bypass_src" }, 942 1.1 bouyer { IMX6SXCLK_PLL2_BYPASS_SRC, "pll2_bypass_src" }, 943 1.1 bouyer { IMX6SXCLK_PLL3_BYPASS_SRC, "pll3_bypass_src" }, 944 1.1 bouyer { IMX6SXCLK_PLL4_BYPASS_SRC, "pll4_bypass_src" }, 945 1.1 bouyer { IMX6SXCLK_PLL5_BYPASS_SRC, "pll5_bypass_src" }, 946 1.1 bouyer { IMX6SXCLK_PLL6_BYPASS_SRC, "pll6_bypass_src" }, 947 1.1 bouyer { IMX6SXCLK_PLL7_BYPASS_SRC, "pll7_bypass_src" }, 948 1.1 bouyer { IMX6SXCLK_PLL1, "pll1" }, 949 1.1 bouyer { IMX6SXCLK_PLL2, "pll2" }, 950 1.1 bouyer { IMX6SXCLK_PLL3, "pll3" }, 951 1.1 bouyer { IMX6SXCLK_PLL4, "pll4" }, 952 1.1 bouyer { IMX6SXCLK_PLL5, "pll5" }, 953 1.1 bouyer { IMX6SXCLK_PLL6, "pll6" }, 954 1.1 bouyer { IMX6SXCLK_PLL7, "pll7" }, 955 1.1 bouyer { IMX6SXCLK_PLL1_BYPASS, "pll1_bypass" }, 956 1.1 bouyer { IMX6SXCLK_PLL2_BYPASS, "pll2_bypass" }, 957 1.1 bouyer { IMX6SXCLK_PLL3_BYPASS, "pll3_bypass" }, 958 1.1 bouyer { IMX6SXCLK_PLL4_BYPASS, "pll4_bypass" }, 959 1.1 bouyer { IMX6SXCLK_PLL5_BYPASS, "pll5_bypass" }, 960 1.1 bouyer { IMX6SXCLK_PLL6_BYPASS, "pll6_bypass" }, 961 1.1 bouyer { IMX6SXCLK_PLL7_BYPASS, "pll7_bypass" }, 962 1.1 bouyer { IMX6SXCLK_SPDIF_GCLK, "spdif_gclk" }, 963 1.1 bouyer { IMX6SXCLK_LVDS2_SEL, "lvds2_sel" }, 964 1.1 bouyer { IMX6SXCLK_LVDS2_OUT, "lvds2_out" }, 965 1.1 bouyer { IMX6SXCLK_LVDS2_IN, "lvds2_in" }, 966 1.1 bouyer { IMX6SXCLK_ANACLK2, "anaclk2" }, 967 1.1 bouyer { IMX6SXCLK_MMDC_P1_IPG, "mmdc_p1_ipg" }, 968 1.1 bouyer { IMX6SXCLK_END, "end" }, 969 1.1 bouyer }; 970 1.1 bouyer 971 1.1 bouyer /* Clock Divider Tables */ 972 1.1 bouyer static const int enet_ref_tbl[] = { 20, 10, 5, 4, 0 }; 973 1.1 bouyer static const int post_div_tbl[] = { 4, 2, 1, 0 }; 974 1.1 bouyer static const int audiovideo_div_tbl[] = { 1, 2, 1, 4, 0 }; 975 1.1 bouyer 976 1.1 bouyer static struct imx6_clk imx6sx_clks[] = { 977 1.1 bouyer CLK_FIXED("dummy", 0), 978 1.1 bouyer CLK_FIXED("ckil", IMX6_CKIL_FREQ), 979 1.1 bouyer CLK_FIXED("osc", IMX6_OSC_FREQ), 980 1.4 skrll CLK_FIXED("ipp_di0", IMX6_OSC_FREQ), 981 1.4 skrll CLK_FIXED("ipp_di1", IMX6_OSC_FREQ), 982 1.1 bouyer CLK_FIXED("anaclk1", IMX6_ANACLK1_FREQ), 983 1.1 bouyer CLK_FIXED("anaclk2", IMX6_ANACLK2_FREQ), 984 1.3 bouyer 985 1.1 bouyer CLK_FIXED_FACTOR("pcie_ref", "pll6_enet", 5, 1), 986 1.1 bouyer CLK_FIXED_FACTOR("pll2_198m", "pll2_pfd2_396m", 2, 1), 987 1.1 bouyer CLK_FIXED_FACTOR("pll3_120m", "pll3_usb_otg", 4, 1), 988 1.1 bouyer CLK_FIXED_FACTOR("pll3_80m", "pll3_usb_otg", 6, 1), 989 1.1 bouyer CLK_FIXED_FACTOR("pll3_60m", "pll3_usb_otg", 8, 1), 990 1.1 bouyer CLK_FIXED_FACTOR("twd", "arm", 2, 1), 991 1.1 bouyer CLK_FIXED_FACTOR("gpt_3m", "osc", 8, 1), 992 1.1 bouyer CLK_FIXED_FACTOR("ldb_di0_div_3_5", "ldb_di0_sel", 7, 2), 993 1.1 bouyer CLK_FIXED_FACTOR("ldb_di0_div_7", "ldb_di0_sel", 7, 1), 994 1.1 bouyer CLK_FIXED_FACTOR("ldb_di1_div_3_5", "ldb_di1_sel", 7, 2), 995 1.1 bouyer CLK_FIXED_FACTOR("ldb_di1_div_7", "ldb_di1_sel", 7, 1), 996 1.1 bouyer CLK_FIXED_FACTOR("enet_ptp_ref", "pll6_enet", 20, 1), 997 1.3 bouyer 998 1.1 bouyer CLK_PFD("pll2_pfd0_352m", "pll2_bus", PFD_528, 0), 999 1.1 bouyer CLK_PFD("pll2_pfd1_594m", "pll2_bus", PFD_528, 1), 1000 1.1 bouyer CLK_PFD("pll2_pfd2_396m", "pll2_bus", PFD_528, 2), 1001 1.1 bouyer CLK_PFD("pll2_pfd3_594m", "pll2_bus", PFD_528, 3), 1002 1.1 bouyer CLK_PFD("pll3_pfd0_720m", "pll3_usb_otg", PFD_480, 0), 1003 1.1 bouyer CLK_PFD("pll3_pfd1_540m", "pll3_usb_otg", PFD_480, 1), 1004 1.1 bouyer CLK_PFD("pll3_pfd2_508m", "pll3_usb_otg", PFD_480, 2), 1005 1.1 bouyer CLK_PFD("pll3_pfd3_454m", "pll3_usb_otg", PFD_480, 3), 1006 1.3 bouyer 1007 1.1 bouyer CLK_PLL("pll1", "osc", SYS, PLL_ARM, DIV_SELECT, POWERDOWN, 0), 1008 1.1 bouyer CLK_PLL("pll2", "osc", GENERIC, PLL_SYS, DIV_SELECT, POWERDOWN, 0), 1009 1.1 bouyer CLK_PLL("pll3", "osc", USB, PLL_USB1, DIV_SELECT, POWER, 0), 1010 1.1 bouyer CLK_PLL("pll4", "osc", AUDIO_VIDEO, PLL_AUDIO, DIV_SELECT, POWERDOWN, 0), 1011 1.1 bouyer CLK_PLL("pll5", "osc", AUDIO_VIDEO, PLL_VIDEO, DIV_SELECT, POWERDOWN, 0), 1012 1.1 bouyer CLK_PLL("pll6", "osc", ENET, PLL_ENET, DIV_SELECT, POWERDOWN, 500000000), 1013 1.1 bouyer CLK_PLL("pll7", "osc", USB, PLL_USB2, DIV_SELECT, POWER, 0), 1014 1.3 bouyer 1015 1.1 bouyer CLK_DIV("periph_clk2", "periph_clk2_sel", CBCDR, PERIPH_CLK2_PODF), 1016 1.1 bouyer CLK_DIV("periph2_clk2", "periph2_clk2_sel", CBCDR, PERIPH2_CLK2_PODF), 1017 1.1 bouyer CLK_DIV_BUSY("ocram_podf", "ocram_sel", CBCDR, AXI_PODF, CDHIPR, AXI_PODF_BUSY), 1018 1.1 bouyer CLK_DIV("ipg", "ahb", CBCDR, IPG_PODF), 1019 1.1 bouyer CLK_DIV("gpu_core_podf", "gpu_core_sel", CBCMR, GPU3D_SHADER_PODF), 1020 1.1 bouyer CLK_DIV("gpu_axi_podf", "gpu_axi_sel", CBCMR, GPU3D_CORE_PODF), 1021 1.1 bouyer CLK_DIV("lcdif1_podf", "lcdif1_pred", CBCMR, GPU2D_CORE_CLK_PODF), 1022 1.1 bouyer CLK_DIV("esai_pred", "esai_sel", CS1CDR, ESAI_CLK_PRED), 1023 1.1 bouyer CLK_DIV("esai_podf", "esai_pred", CS1CDR, ESAI_CLK_PODF), 1024 1.1 bouyer CLK_DIV("spdif_pred", "spdif_sel", CDCDR, SPDIF0_CLK_PRED), 1025 1.1 bouyer CLK_DIV("spdif_podf", "spdif_pred", CDCDR, SPDIF0_CLK_PODF), 1026 1.1 bouyer CLK_DIV("audio_pred", "audio_sel", CDCDR, SPDIF1_CLK_PRED), 1027 1.1 bouyer CLK_DIV("audio_podf", "audio_pred", CDCDR, SPDIF1_CLK_PODF), 1028 1.1 bouyer CLK_DIV("vid_podf", "vid_sel", CSCMR2, VID_CLK_PODF), 1029 1.1 bouyer CLK_DIV("can_podf", "can_sel", CSCMR2, CAN_CLK_PODF), 1030 1.1 bouyer CLK_DIV("display_podf", "display_sel", CSCDR3, IPU2_HSP_PODF), 1031 1.1 bouyer CLK_DIV("csi_podf", "csi_sel", CSCDR3, IPU1_HSP_PODF), 1032 1.1 bouyer CLK_DIV("enet_podf", "enet_pre_sel", CHSCCDR, IPU1_DI1_PODF), 1033 1.1 bouyer CLK_DIV("m4_podf", "m4_sel", CHSCCDR, IPU1_DI0_PODF), 1034 1.1 bouyer CLK_DIV("ecspi_podf", "ecspi_sel", CSCDR2, ECSPI_CLK_PODF), 1035 1.1 bouyer CLK_DIV("lcdif1_pred", "lcdif1_pre_sel", CSCDR2, IPU2_DI1_PODF), 1036 1.1 bouyer CLK_DIV("lcdif2_pred", "lcdif2_pre_sel", CSCDR2, IPU2_DI0_PODF), 1037 1.1 bouyer CLK_DIV("ssi1_pred", "ssi1_sel", CS1CDR, SSI1_CLK_PRED), 1038 1.1 bouyer CLK_DIV("ssi1_podf", "ssi1_pred", CS1CDR, SSI1_CLK_PODF), 1039 1.1 bouyer CLK_DIV("ssi2_pred", "ssi2_sel", CS2CDR, SSI2_CLK_PRED), 1040 1.1 bouyer CLK_DIV("ssi2_podf", "ssi2_pred", CS2CDR, SSI2_CLK_PODF), 1041 1.1 bouyer CLK_DIV("ssi3_pred", "ssi3_sel", CS1CDR, SSI3_CLK_PRED), 1042 1.1 bouyer CLK_DIV("ssi3_podf", "ssi3_pred", CS1CDR, SSI3_CLK_PODF), 1043 1.1 bouyer CLK_DIV("usdhc1_podf", "usdhc1_sel", CSCDR1, USDHC1_PODF), 1044 1.1 bouyer CLK_DIV("usdhc2_podf", "usdhc2_sel", CSCDR1, USDHC2_PODF), 1045 1.1 bouyer CLK_DIV("usdhc3_podf", "usdhc3_sel", CSCDR1, USDHC3_PODF), 1046 1.1 bouyer CLK_DIV("usdhc4_podf", "usdhc4_sel", CSCDR1, USDHC4_PODF), 1047 1.1 bouyer CLK_DIV("uart_podf", "uart_sel", CSCDR1, UART_CLK_PODF), 1048 1.1 bouyer CLK_DIV("qspi2_pred", "qspi2_sel", CS2CDR, ENFC_CLK_PRED), 1049 1.1 bouyer CLK_DIV("qspi2_podf", "qspi2_pred", CS2CDR, ENFC_CLK_PODF), 1050 1.1 bouyer CLK_DIV("cko1_podf", "cko1_sel", CCOSR, CLKO1_DIV), 1051 1.1 bouyer CLK_DIV("cko2_podf", "cko2_sel", CCOSR, CLKO2_DIV), 1052 1.1 bouyer CLK_DIV("qspi1_podf", "qspi1_sel", CSCMR1, QSPI1_PODF), 1053 1.1 bouyer CLK_DIV("eim_slow_podf", "eim_slow_sel", CSCMR1, ACLK_EIM_SLOW_PODF), 1054 1.1 bouyer CLK_DIV("lcdif2_podf", "lcdif2_pred", CSCMR1, ACLK_PODF), 1055 1.1 bouyer CLK_DIV("perclk", "perclk_sel", CSCMR1, PERCLK_PODF), 1056 1.3 bouyer 1057 1.1 bouyer CLK_DIV_BUSY("arm", "pll1_sw", CACRR, ARM_PODF, CDHIPR, ARM_PODF_BUSY), 1058 1.1 bouyer CLK_DIV_BUSY("ahb", "periph", CBCDR, AHB_PODF, CDHIPR, AHB_PODF_BUSY), 1059 1.1 bouyer CLK_DIV_BUSY("mmdc_podf", "periph2", CBCDR, MMDC_CH1_AXI_PODF, CDHIPR, MMDC_CH1_PODF_BUSY), 1060 1.3 bouyer 1061 1.1 bouyer CLK_DIV_TABLE("pll4_post_div", "pll4_audio", PLL_AUDIO, POST_DIV_SELECT, post_div_tbl), 1062 1.1 bouyer CLK_DIV_TABLE("pll4_audio_div", "pll4_post_div", MISC2, AUDIO_DIV_LSB, audiovideo_div_tbl), 1063 1.1 bouyer CLK_DIV_TABLE("pll5_post_div", "pll5_video", PLL_VIDEO, POST_DIV_SELECT, post_div_tbl), 1064 1.1 bouyer CLK_DIV_TABLE("pll5_video_div", "pll5_post_div", MISC2, VIDEO_DIV, audiovideo_div_tbl), 1065 1.1 bouyer CLK_DIV_TABLE("enet_ref", "pll6_enet", PLL_ENET, DIV_SELECT, enet_ref_tbl), 1066 1.1 bouyer CLK_DIV_TABLE("enet2_ref", "pll6_enet", PLL_ENET, DIV2_SELECT, enet_ref_tbl), 1067 1.3 bouyer 1068 1.1 bouyer CLK_MUX("step", step_p, CCM, CCSR, STEP_SEL), 1069 1.1 bouyer CLK_MUX("pll1_sw", pll1_sw_p, CCM, CCSR, PLL1_SW_CLK_SEL), 1070 1.1 bouyer CLK_MUX("ocram_sel", ocram_p, CCM, CBCDR, AXI_SEL), 1071 1.1 bouyer CLK_MUX("periph_pre", periph_pre_p, CCM, CBCMR, PRE_PERIPH_CLK_SEL), 1072 1.1 bouyer CLK_MUX("periph2_pre", periph2_pre_p, CCM, CBCMR, PRE_PERIPH2_CLK_SEL), 1073 1.1 bouyer CLK_MUX("periph_clk2_sel", periph_clk2_p, CCM,CBCMR, PERIPH_CLK2_SEL), 1074 1.1 bouyer CLK_MUX("periph2_clk2_sel", periph2_clk2_p, CCM,CBCMR, PERIPH2_CLK2_SEL), 1075 1.1 bouyer CLK_MUX("spdif_sel", audio_p, CCM, CDCDR, SPDIF0_CLK_SEL), 1076 1.1 bouyer CLK_MUX("audio_sel", audio_p, CCM, CDCDR, SPDIF1_CLK_SEL), 1077 1.1 bouyer CLK_MUX("vid_sel", vid_p, CCM, CSCMR2, VID_CLK_SEL), 1078 1.1 bouyer CLK_MUX("esai_sel", audio_p, CCM, CSCMR2, ESAI_CLK_SEL), 1079 1.1 bouyer CLK_MUX("ldb_di0_div_sel", ldb_di0_div_p, CCM, CSCMR2, LDB_DI0_IPU_DIV), 1080 1.1 bouyer CLK_MUX("ldb_di1_div_sel", ldb_di1_div_p, CCM, CSCMR2, LDB_DI1_IPU_DIV), 1081 1.1 bouyer CLK_MUX("can_sel", can_p, CCM, CSCMR2, CAN_CLK_SEL), 1082 1.1 bouyer CLK_MUX("uart_sel", uart_p, CCM, CSCDR1, UART_CLK_SEL), 1083 1.1 bouyer CLK_MUX("enet_pre_sel", enet_pre_p, CCM, CHSCCDR, ENET_PRE_CLK_SEL), 1084 1.1 bouyer CLK_MUX("enet_sel", enet_p, CCM, CHSCCDR, ENET_CLK_SEL), 1085 1.1 bouyer CLK_MUX("m4_pre_sel", m4_pre_p, CCM, CHSCCDR, M4_PRE_CLK_SEL), 1086 1.1 bouyer CLK_MUX("m4_sel", m4_p, CCM, CHSCCDR, M4_CLK_SEL), 1087 1.1 bouyer CLK_MUX("ecspi_sel", ecspi_p, CCM, CSCDR2, ECSPI_SEL), 1088 1.1 bouyer CLK_MUX("lcdif1_sel", lcdif1_p, CCM, CSCDR2, IPU2_DI1_CLK_SEL), 1089 1.1 bouyer CLK_MUX("lcdif1_pre_sel", lcdif1_pre_p, CCM, CSCDR2, IPU2_DI1_PRE_CLK_SEL), 1090 1.1 bouyer CLK_MUX("lcdif1_sel", lcdif1_p, CCM, CSCDR2, IPU2_DI1_CLK_SEL), 1091 1.1 bouyer CLK_MUX("lcdif2_pre_sel", lcdif2_pre_p, CCM, CSCDR2, IPU2_DI0_PRE_CLK_SEL), 1092 1.1 bouyer CLK_MUX("lcdif2_sel", lcdif2_p, CCM, CSCDR2, IPU2_DI0_CLK_SEL), 1093 1.1 bouyer CLK_MUX("display_sel", display_p, CCM, CSCDR3, IPU2_HSP_CLK_SEL), 1094 1.1 bouyer CLK_MUX("csi_sel", csi_p, CCM, CSCDR3, IPU1_HSP_CLK_SEL), 1095 1.1 bouyer CLK_MUX("qspi2_sel", qspi2_p, CCM, CS2CDR, QSPI2_CLK_SEL), 1096 1.1 bouyer CLK_MUX("ldb_di0_sel", ldb_di0_p, CCM, CS2CDR, LDB_DI0_CLK_SEL), 1097 1.1 bouyer CLK_MUX("ldb_di1_sel", ldb_di1_p, CCM, CS2CDR, LDB_DI1_CLK_SEL), 1098 1.1 bouyer CLK_MUX("cko1_sel", cko1_p, CCM, CCOSR, CLKO1_SEL), 1099 1.1 bouyer CLK_MUX("cko2_sel", cko2_p, CCM, CCOSR, CLKO2_SEL), 1100 1.1 bouyer CLK_MUX("cko", cko_p, CCM, CCOSR, CLK_OUT_SEL), 1101 1.1 bouyer CLK_MUX("pcie_axi_sel", pcie_axi_p, CCM, CBCMR, PCIE_AXI_CLK_SEL), 1102 1.1 bouyer CLK_MUX("gpu_axi_sel", gpu_axi_p, CCM, CBCMR, GPU3D_SHADER_CLK_SEL), 1103 1.1 bouyer CLK_MUX("gpu_core_sel", gpu_core_p, CCM, CBCMR, GPU3D_CORE_CLK_SEL), 1104 1.1 bouyer CLK_MUX("ssi1_sel", ssi_p, CCM, CSCMR1, SSI1_CLK_SEL), 1105 1.1 bouyer CLK_MUX("ssi2_sel", ssi_p, CCM, CSCMR1, SSI2_CLK_SEL), 1106 1.1 bouyer CLK_MUX("ssi3_sel", ssi_p, CCM, CSCMR1, SSI3_CLK_SEL), 1107 1.1 bouyer CLK_MUX("usdhc1_sel", usdhc_p, CCM, CSCMR1, USDHC1_CLK_SEL), 1108 1.1 bouyer CLK_MUX("usdhc2_sel", usdhc_p, CCM, CSCMR1, USDHC2_CLK_SEL), 1109 1.1 bouyer CLK_MUX("usdhc3_sel", usdhc_p, CCM, CSCMR1, USDHC3_CLK_SEL), 1110 1.1 bouyer CLK_MUX("usdhc4_sel", usdhc_p, CCM, CSCMR1, USDHC4_CLK_SEL), 1111 1.1 bouyer CLK_MUX("qspi1_sel", qspi1_p, CCM, CSCMR1, QSOI1_SEL), 1112 1.1 bouyer CLK_MUX("perclk_sel", perclk_p, CCM, CSCMR1, PERCLK_SEL), 1113 1.1 bouyer CLK_MUX("eim_slow_sel", eim_slow_p, CCM, CSCMR1, ACLK_EIM_SLOW_SEL), 1114 1.1 bouyer CLK_MUX("pll1_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_ARM, BYPASS_CLK_SRC_6SX), 1115 1.1 bouyer CLK_MUX("pll2_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_SYS, BYPASS_CLK_SRC_6SX), 1116 1.1 bouyer CLK_MUX("pll3_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_USB1, BYPASS_CLK_SRC_6SX), 1117 1.1 bouyer CLK_MUX("pll4_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_AUDIO, BYPASS_CLK_SRC_6SX), 1118 1.1 bouyer CLK_MUX("pll5_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_VIDEO, BYPASS_CLK_SRC_6SX), 1119 1.1 bouyer CLK_MUX("pll6_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_ENET, BYPASS_CLK_SRC_6SX), 1120 1.1 bouyer CLK_MUX("pll7_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_USB2, BYPASS_CLK_SRC_6SX), 1121 1.1 bouyer CLK_MUX("pll1_bypass", pll1_bypass_p, CCM_ANALOG, PLL_ARM, BYPASS), 1122 1.1 bouyer CLK_MUX("pll2_bypass", pll2_bypass_p, CCM_ANALOG, PLL_SYS, BYPASS), 1123 1.1 bouyer CLK_MUX("pll3_bypass", pll3_bypass_p, CCM_ANALOG, PLL_USB1, BYPASS), 1124 1.1 bouyer CLK_MUX("pll4_bypass", pll4_bypass_p, CCM_ANALOG, PLL_AUDIO, BYPASS), 1125 1.1 bouyer CLK_MUX("pll5_bypass", pll5_bypass_p, CCM_ANALOG, PLL_VIDEO, BYPASS), 1126 1.1 bouyer CLK_MUX("pll6_bypass", pll6_bypass_p, CCM_ANALOG, PLL_ENET, BYPASS), 1127 1.1 bouyer CLK_MUX("pll7_bypass", pll7_bypass_p, CCM_ANALOG, PLL_USB2, BYPASS), 1128 1.1 bouyer 1129 1.1 bouyer CLK_MUX("lvds1_sel", lvds_p, CCM_ANALOG, MISC1, LVDS_CLK1_SRC), 1130 1.1 bouyer CLK_MUX("lvds2_sel", lvds_p, CCM_ANALOG, MISC1, LVDS_CLK2_SRC), 1131 1.3 bouyer 1132 1.1 bouyer CLK_MUX_BUSY("periph", periph_p, CBCDR, PERIPH_CLK_SEL, CDHIPR, PERIPH_CLK_SEL_BUSY), 1133 1.1 bouyer CLK_MUX_BUSY("periph2", periph2_p, CBCDR, PERIPH2_CLK_SEL, CDHIPR, PERIPH2_CLK_SEL_BUSY), 1134 1.3 bouyer 1135 1.1 bouyer CLK_GATE("aips_tz1", "ahb", CCM, CCGR0, AIPS_TZ1_CLK_ENABLE), 1136 1.1 bouyer CLK_GATE("aips_tz2", "ahb", CCM, CCGR0, AIPS_TZ2_CLK_ENABLE), 1137 1.1 bouyer CLK_GATE("apbh_dma", "usdhc3", CCM, CCGR0, APBHDMA_HCLK_ENABLE), 1138 1.1 bouyer CLK_GATE("asrc_ipg", "ahb", CCM, CCGR0, ASRC_CLK_ENABLE), 1139 1.1 bouyer CLK_GATE("asrc_mem", "ahb", CCM, CCGR0, ASRC_CLK_ENABLE), 1140 1.1 bouyer CLK_GATE("caam_mem", "ahb", CCM, CCGR0, CAAM_SECURE_MEM_CLK_ENABLE), 1141 1.1 bouyer CLK_GATE("caam_aclk", "ahb", CCM, CCGR0, CAAM_WRAPPER_ACLK_ENABLE), 1142 1.1 bouyer CLK_GATE("caam_ipg", "ipg", CCM, CCGR0, CAAM_WRAPPER_IPG_ENABLE), 1143 1.1 bouyer CLK_GATE("can1_ipg", "ipg", CCM, CCGR0, CAN1_CLK_ENABLE), 1144 1.1 bouyer CLK_GATE("can1_serial", "can_podf", CCM, CCGR0, CAN1_SERIAL_CLK_ENABLE), 1145 1.1 bouyer CLK_GATE("can2_ipg", "ipg", CCM, CCGR0, CAN2_CLK_ENABLE), 1146 1.1 bouyer CLK_GATE("can2_serial", "can_podf", CCM, CCGR0, CAN2_SERIAL_CLK_ENABLE), 1147 1.1 bouyer CLK_GATE("dcic1", "display_podf", CCM, CCGR0, DCIC1_CLK_ENABLE), 1148 1.1 bouyer CLK_GATE("dcic2", "display_podf", CCM, CCGR0, DCIC2_CLK_ENABLE), 1149 1.1 bouyer CLK_GATE("aips_tz3", "ahb", CCM, CCGR0, TZ3_CLK_ENABLE), 1150 1.1 bouyer CLK_GATE("ecspi1", "ecspi_podf", CCM, CCGR1, ECSPI1_CLK_ENABLE), 1151 1.1 bouyer CLK_GATE("ecspi2", "ecspi_podf", CCM, CCGR1, ECSPI2_CLK_ENABLE), 1152 1.1 bouyer CLK_GATE("ecspi3", "ecspi_podf", CCM, CCGR1, ECSPI3_CLK_ENABLE), 1153 1.1 bouyer CLK_GATE("ecspi4", "ecspi_podf", CCM, CCGR1, ECSPI4_CLK_ENABLE), 1154 1.1 bouyer CLK_GATE("ecspi5", "ecspi_podf", CCM, CCGR1, ECSPI5_CLK_ENABLE), 1155 1.1 bouyer CLK_GATE("epit1", "perclk", CCM, CCGR1, EPIT1_CLK_ENABLE), 1156 1.1 bouyer CLK_GATE("epit2", "perclk", CCM, CCGR1, EPIT2_CLK_ENABLE), 1157 1.1 bouyer CLK_GATE("esai_extal", "esai_podf", CCM, CCGR1, ESAI_CLK_ENABLE), 1158 1.1 bouyer CLK_GATE("esai_ipg", "ahb", CCM, CCGR1, ESAI_CLK_ENABLE), 1159 1.1 bouyer CLK_GATE("esai_mem", "ahb", CCM, CCGR1, ESAI_CLK_ENABLE), 1160 1.1 bouyer CLK_GATE("wakeup", "ipg", CCM, CCGR1, WAKEUP_CLK_ENABLE), 1161 1.1 bouyer CLK_GATE("gpt_bus", "perclk", CCM, CCGR1, GPT_CLK_ENABLE), 1162 1.1 bouyer CLK_GATE("gpt_serial", "perclk", CCM, CCGR1, GPT_SERIAL_CLK_ENABLE), 1163 1.1 bouyer CLK_GATE("gpu", "gpu_core_podf", CCM, CCGR1, GPU3D_CLK_ENABLE), 1164 1.1 bouyer CLK_GATE("ocram_s", "ahb", CCM, CCGR1, OCRAM_CLK_ENABLE), 1165 1.1 bouyer CLK_GATE("canfd", "can_podf", CCM, CCGR1, CANFD_CLK_ENABLE), 1166 1.1 bouyer CLK_GATE("csi", "csi_podf", CCM, CCGR2, CSI_CLK_ENABLE), 1167 1.1 bouyer CLK_GATE("i2c1", "perclk", CCM, CCGR2, I2C1_SERIAL_CLK_ENABLE), 1168 1.1 bouyer CLK_GATE("i2c2", "perclk", CCM, CCGR2, I2C2_SERIAL_CLK_ENABLE), 1169 1.1 bouyer CLK_GATE("i2c3", "perclk", CCM, CCGR2, I2C3_SERIAL_CLK_ENABLE), 1170 1.1 bouyer CLK_GATE("ocotp", "ipg", CCM, CCGR2, IIM_CLK_ENABLE), 1171 1.1 bouyer CLK_GATE("iomuxc", "lcdif1_podf", CCM, CCGR2, IOMUX_IPT_CLK_IO_CLK_ENABLE), 1172 1.1 bouyer CLK_GATE("ipmux1", "ahb", CCM, CCGR2, IPMUX1_CLK_ENABLE), 1173 1.1 bouyer CLK_GATE("ipmux2", "ahb", CCM, CCGR2, IPMUX2_CLK_ENABLE), 1174 1.1 bouyer CLK_GATE("ipmux3", "ahb", CCM, CCGR2, IPMUX3_CLK_ENABLE), 1175 1.1 bouyer CLK_GATE("tzasc1", "mmdc_podf", CCM, CCGR2, IPSYNC_IP2APB_TZASC1_IPG_CLK_ENABLE), 1176 1.1 bouyer CLK_GATE("lcdif_apb", "display_podf", CCM, CCGR2, LCDIF_APB_CLK_ENABLE), 1177 1.1 bouyer CLK_GATE("pxp_axi", "display_podf", CCM, CCGR2, PXP_AXI_CLK_ENABLE), 1178 1.1 bouyer CLK_GATE("enet", "ipg", CCM, CCGR3, IPU1_IPU_DI1_CLK_ENABLE), 1179 1.1 bouyer CLK_GATE("enet_ahb", "enet_sel", CCM, CCGR3, IPU1_IPU_DI1_CLK_ENABLE), 1180 1.1 bouyer CLK_GATE("m4", "m4_podf", CCM, CCGR3, IPU1_IPU_DI0_CLK_ENABLE), 1181 1.1 bouyer CLK_GATE("display_axi", "display_podf", CCM, CCGR3, IPU2_IPU_CLK_ENABLE), 1182 1.1 bouyer CLK_GATE("lcdif2_pix", "lcdif2_sel", CCM, CCGR3, IPU2_IPU_DI0_CLK_ENABLE), 1183 1.1 bouyer CLK_GATE("lcdif1_pix", "lcdif1_sel", CCM, CCGR3, IPU2_IPU_DI1_CLK_ENABLE), 1184 1.1 bouyer CLK_GATE("ldb_di0", "ldb_di0_div_sel", CCM, CCGR3, LDB_DI0_CLK_ENABLE), 1185 1.1 bouyer CLK_GATE("qspi1", "qspi1_podf", CCM, CCGR3, LDB_DI1_CLK_ENABLE), 1186 1.1 bouyer CLK_GATE("mlb", "ahb", CCM, CCGR3, MLB_CLK_ENABLE), 1187 1.1 bouyer CLK_GATE("mmdc_p0_fast", "mmdc_podf", CCM, CCGR3, MMDC_CORE_ACLK_FAST_CORE_P0_ENABLE), 1188 1.1 bouyer CLK_GATE("mmdc_p0_ipg", "ipg", CCM, CCGR3, MMDC_CORE_IPG_CLK_P0_ENABLE), 1189 1.1 bouyer CLK_GATE("mmdc_p1_ipg", "ipg", CCM, CCGR3, MMDC_P1_IPG_CLK_ENABLE), 1190 1.1 bouyer CLK_GATE("ocram", "ahb", CCM, CCGR3, OCRAM_CLK_ENABLE), 1191 1.1 bouyer CLK_GATE("pcie_axi", "display_podf", CCM, CCGR4, PCIE_ROOT_ENABLE), 1192 1.1 bouyer CLK_GATE("qspi2", "qspi2_podf", CCM, CCGR4, QSPI2_ENABLE), 1193 1.1 bouyer CLK_GATE("per1_bch", "usdhc3", CCM, CCGR4, PL301_MX6QPER1_BCHCLK_ENABLE), 1194 1.1 bouyer CLK_GATE("per2_main", "ahb", CCM, CCGR4, PL301_MX6QPER2_MAINCLK_ENABLE), 1195 1.1 bouyer CLK_GATE("pwm1", "perclk", CCM, CCGR4, PWM1_CLK_ENABLE), 1196 1.1 bouyer CLK_GATE("pwm2", "perclk", CCM, CCGR4, PWM2_CLK_ENABLE), 1197 1.1 bouyer CLK_GATE("pwm3", "perclk", CCM, CCGR4, PWM3_CLK_ENABLE), 1198 1.1 bouyer CLK_GATE("pwm4", "perclk", CCM, CCGR4, PWM4_CLK_ENABLE), 1199 1.1 bouyer CLK_GATE("gpmi_bch_apb", "usdhc3", CCM, CCGR4, RAWNAND_U_BCH_INPUT_APB_CLK_ENABLE), 1200 1.1 bouyer CLK_GATE("gpmi_bch", "usdhc4", CCM, CCGR4, RAWNAND_U_GPMI_BCH_INPUT_BCH_CLK_ENABLE), 1201 1.1 bouyer CLK_GATE("gpmi_io", "qspi2_podf", CCM, CCGR4, RAWNAND_U_GPMI_BCH_INPUT_GPMI_IO_CLK_ENABLE), 1202 1.1 bouyer CLK_GATE("gpmi_apb", "usdhc3", CCM, CCGR4, RAWNAND_U_GPMI_INPUT_APB_CLK_ENABLE), 1203 1.1 bouyer CLK_GATE("rom", "ahb", CCM, CCGR5, ROM_CLK_ENABLE), 1204 1.1 bouyer CLK_GATE("sdma", "ahb", CCM, CCGR5, SDMA_CLK_ENABLE), 1205 1.1 bouyer CLK_GATE("spba", "ipg", CCM, CCGR5, SPBA_CLK_ENABLE), 1206 1.1 bouyer CLK_GATE("audio", "audio_podf", CCM, CCGR5, SPDIF_CLK_ENABLE), 1207 1.1 bouyer CLK_GATE("spdif", "spdif_podf", CCM, CCGR5, SPDIF_CLK_ENABLE), 1208 1.1 bouyer CLK_GATE("spdif_gclk", "ipg", CCM, CCGR5, SPDIF_CLK_ENABLE), 1209 1.1 bouyer CLK_GATE("ssi1_ipg", "ipg", CCM, CCGR5, SSI1_CLK_ENABLE), 1210 1.1 bouyer CLK_GATE("ssi2_ipg", "ipg", CCM, CCGR5, SSI2_CLK_ENABLE), 1211 1.1 bouyer CLK_GATE("ssi3_ipg", "ipg", CCM, CCGR5, SSI3_CLK_ENABLE), 1212 1.1 bouyer CLK_GATE("ssi1", "ssi1_podf", CCM, CCGR5, SSI1_CLK_ENABLE), 1213 1.1 bouyer CLK_GATE("ssi2", "ssi2_podf", CCM, CCGR5, SSI2_CLK_ENABLE), 1214 1.1 bouyer CLK_GATE("ssi3", "ssi3_podf", CCM, CCGR5, SSI3_CLK_ENABLE), 1215 1.1 bouyer CLK_GATE("uart_ipg", "ipg", CCM, CCGR5, UART_CLK_ENABLE), 1216 1.1 bouyer CLK_GATE("uart_serial", "uart_podf", CCM, CCGR5, UART_SERIAL_CLK_ENABLE), 1217 1.1 bouyer CLK_GATE("sai1", "ssi1_podf", CCM, CCGR5, SAI1_ENABLE), 1218 1.1 bouyer CLK_GATE("sai2", "ssi2_podf", CCM, CCGR5, SAI2_ENABLE), 1219 1.1 bouyer CLK_GATE("sai1_ipg", "ipg", CCM, CCGR5, SAI1_ENABLE), 1220 1.1 bouyer CLK_GATE("sai2_ipg", "ipg", CCM, CCGR5, SAI2_ENABLE), 1221 1.1 bouyer CLK_GATE("usboh3", "ipg", CCM, CCGR6, USBOH3_CLK_ENABLE), 1222 1.1 bouyer CLK_GATE("usdhc1", "usdhc1_podf", CCM, CCGR6, USDHC1_CLK_ENABLE), 1223 1.1 bouyer CLK_GATE("usdhc2", "usdhc2_podf", CCM, CCGR6, USDHC2_CLK_ENABLE), 1224 1.1 bouyer CLK_GATE("usdhc3", "usdhc3_podf", CCM, CCGR6, USDHC3_CLK_ENABLE), 1225 1.1 bouyer CLK_GATE("usdhc4", "usdhc4_podf", CCM, CCGR6, USDHC4_CLK_ENABLE), 1226 1.1 bouyer CLK_GATE("eim_slow", "eim_slow_podf", CCM, CCGR6, EIM_SLOW_CLK_ENABLE), 1227 1.1 bouyer CLK_GATE("pwm8", "perclk", CCM, CCGR6, PWM8_CLK_ENABLE), 1228 1.1 bouyer CLK_GATE("vadc", "vid_podf", CCM, CCGR6, VADC_CLK_ENABLE), 1229 1.1 bouyer CLK_GATE("gis", "display_podf", CCM, CCGR6, GIS_CLK_ENABLE), 1230 1.2 bouyer CLK_GATE("i2c4", "perclk", CCM, CCGR6, I2CS4_CLK_ENABLE), 1231 1.1 bouyer CLK_GATE("pwm5", "perclk", CCM, CCGR6, PWM5_CLK_ENABLE), 1232 1.1 bouyer CLK_GATE("pwm6", "perclk", CCM, CCGR6, PWM6_CLK_ENABLE), 1233 1.1 bouyer CLK_GATE("pwm7", "perclk", CCM, CCGR6, PWM7_CLK_ENABLE), 1234 1.1 bouyer CLK_GATE("cko1", "cko1_podf", CCM, CCOSR, CLKO1_EN), 1235 1.1 bouyer CLK_GATE("cko2", "cko2_podf", CCM, CCOSR, CLKO2_EN), 1236 1.1 bouyer CLK_GATE("enet_ptp_25m", "enet_ptp_ref", CCM_ANALOG, PLL_ENET, ENET_25M_REF_EN), 1237 1.1 bouyer CLK_GATE("enet2_ref_125m", "enet2_ref", CCM_ANALOG, PLL_ENET, ENABLE_100M), 1238 1.1 bouyer CLK_GATE("pcie_ref_125m", "pcie_ref", CCM_ANALOG, PLL_ENET, ENABLE_125M), 1239 1.1 bouyer CLK_GATE("pll1_sys", "pll1_bypass", CCM_ANALOG, PLL_ARM, ENABLE), 1240 1.1 bouyer CLK_GATE("pll2_bus", "pll2_bypass", CCM_ANALOG, PLL_SYS, ENABLE), 1241 1.1 bouyer CLK_GATE("pll3_usb_otg", "pll3_bypass", CCM_ANALOG, PLL_USB1, ENABLE), 1242 1.1 bouyer CLK_GATE("pll4_audio", "pll4_bypass", CCM_ANALOG, PLL_AUDIO, ENABLE), 1243 1.1 bouyer CLK_GATE("pll5_video", "pll5_bypass", CCM_ANALOG, PLL_VIDEO, ENABLE), 1244 1.1 bouyer CLK_GATE("pll6_enet", "pll6_bypass", CCM_ANALOG, PLL_ENET, ENABLE), 1245 1.1 bouyer CLK_GATE("pll7_usb_host", "pll7_bypass", CCM_ANALOG, PLL_USB2, ENABLE), 1246 1.1 bouyer 1247 1.1 bouyer CLK_GATE("usbphy1", "pll3_usb_otg", CCM_ANALOG, PLL_USB1, RESERVED), 1248 1.1 bouyer CLK_GATE("usbphy2", "pll7_usb_host", CCM_ANALOG, PLL_USB2, RESERVED), 1249 1.1 bouyer CLK_GATE("usbphy1_gate", "dummy", CCM_ANALOG, PLL_USB2, EN_USB_CLK), 1250 1.1 bouyer CLK_GATE("usbphy2_gate", "dummy", CCM_ANALOG, PLL_USB2, EN_USB_CLK), 1251 1.3 bouyer 1252 1.1 bouyer CLK_GATE_EXCLUSIVE("lvds2_out", "lvds2_sel", CCM_ANALOG, MISC1, LVDS_CLK2_OBEN, LVDS_CLK2_IBEN), 1253 1.1 bouyer CLK_GATE_EXCLUSIVE("lvds2_in", "anaclk2", CCM_ANALOG, MISC1, LVDS_CLK2_IBEN, LVDS_CLK2_OBEN), 1254 1.1 bouyer CLK_GATE_EXCLUSIVE("lvds1_in", "anaclk1", CCM_ANALOG, MISC1, LVDS_CLK1_IBEN, LVDS_CLK1_OBEN), 1255 1.1 bouyer }; 1256 1.1 bouyer 1257 1.1 bouyer struct imxccm_init_parent imx6sxccm_init_parents[] = { 1258 1.1 bouyer { "pll1_bypass", "pll1" }, 1259 1.1 bouyer { "pll2_bypass", "pll2" }, 1260 1.1 bouyer { "pll3_bypass", "pll3" }, 1261 1.1 bouyer { "pll4_bypass", "pll4" }, 1262 1.1 bouyer { "pll5_bypass", "pll5" }, 1263 1.1 bouyer { "pll6_bypass", "pll6" }, 1264 1.1 bouyer { "pll7_bypass", "pll7" }, 1265 1.1 bouyer { "lvds1_sel", "pcie_ref_125m" }, 1266 1.1 bouyer { 0 }, 1267 1.1 bouyer }; 1268 1.1 bouyer 1269 1.1 bouyer static struct imx6_clk * 1270 1.1 bouyer imx6sx_clk_find_by_id(struct imx6ccm_softc *sc, u_int clock_id) 1271 1.1 bouyer { 1272 1.1 bouyer for (int n = 0; n < __arraycount(imx6sx_clock_ids); n++) { 1273 1.1 bouyer if (imx6sx_clock_ids[n].id == clock_id) { 1274 1.1 bouyer const char *name = imx6sx_clock_ids[n].name; 1275 1.1 bouyer return imx6_clk_find(sc, name); 1276 1.1 bouyer } 1277 1.1 bouyer } 1278 1.1 bouyer 1279 1.1 bouyer return NULL; 1280 1.1 bouyer } 1281 1.1 bouyer 1282 1.1 bouyer static struct clk * 1283 1.1 bouyer imx6sx_get_clock_by_id(struct imx6ccm_softc *sc, u_int clock_id) 1284 1.1 bouyer { 1285 1.1 bouyer struct imx6_clk *iclk; 1286 1.1 bouyer iclk = imx6sx_clk_find_by_id(sc, clock_id); 1287 1.1 bouyer 1288 1.1 bouyer if (iclk == NULL) 1289 1.1 bouyer return NULL; 1290 1.1 bouyer 1291 1.1 bouyer return &iclk->base; 1292 1.1 bouyer } 1293 1.1 bouyer 1294 1.1 bouyer static struct clk *imx6sx_clk_decode(device_t, int, const void *, size_t); 1295 1.1 bouyer 1296 1.1 bouyer static const struct fdtbus_clock_controller_func imx6sx_ccm_fdtclock_funcs = { 1297 1.1 bouyer .decode = imx6sx_clk_decode 1298 1.1 bouyer }; 1299 1.1 bouyer 1300 1.1 bouyer static struct clk * 1301 1.1 bouyer imx6sx_clk_decode(device_t dev, int cc_phandle, const void *data, size_t len) 1302 1.1 bouyer { 1303 1.1 bouyer struct clk *clk; 1304 1.1 bouyer struct imx6ccm_softc *sc = device_private(dev); 1305 1.1 bouyer 1306 1.1 bouyer /* #clock-cells should be 1 */ 1307 1.1 bouyer if (len != 4) 1308 1.1 bouyer return NULL; 1309 1.1 bouyer 1310 1.1 bouyer const u_int clock_id = be32dec(data); 1311 1.1 bouyer 1312 1.1 bouyer clk = imx6sx_get_clock_by_id(sc, clock_id); 1313 1.1 bouyer if (clk) 1314 1.1 bouyer return clk; 1315 1.1 bouyer 1316 1.1 bouyer return NULL; 1317 1.1 bouyer } 1318 1.1 bouyer 1319 1.1 bouyer static void 1320 1.1 bouyer imx6sx_clk_fixed_from_fdt(struct imx6ccm_softc *sc, const char *name) 1321 1.1 bouyer { 1322 1.1 bouyer struct imx6_clk *iclk = (struct imx6_clk *)imx6_get_clock(sc, name); 1323 1.1 bouyer 1324 1.1 bouyer KASSERTMSG((iclk != NULL), "failed to find clock %s", name); 1325 1.1 bouyer 1326 1.1 bouyer char *path = kmem_asprintf("/clock-%s", name); 1327 1.1 bouyer /* in device tree path, '_' are remplaced by '-' */ 1328 1.1 bouyer for (char *p = path; *p != '\0'; p++) { 1329 1.1 bouyer if (*p == '_') 1330 1.1 bouyer *p = '-'; 1331 1.1 bouyer } 1332 1.1 bouyer int phandle = OF_finddevice(path); 1333 1.1 bouyer KASSERTMSG((phandle >= 0), "failed to find device %s", path); 1334 1.1 bouyer kmem_free(path, strlen(path) + 1); 1335 1.1 bouyer 1336 1.1 bouyer if (of_getprop_uint32(phandle, "clock-frequency", &iclk->clk.fixed.rate) != 0) 1337 1.1 bouyer iclk->clk.fixed.rate = 0; 1338 1.1 bouyer } 1339 1.1 bouyer 1340 1.1 bouyer static int imx6sxccm_match(device_t, cfdata_t, void *); 1341 1.1 bouyer static void imx6sxccm_attach(device_t, device_t, void *); 1342 1.1 bouyer 1343 1.1 bouyer CFATTACH_DECL_NEW(imx6sxccm, sizeof(struct imx6ccm_softc), 1344 1.1 bouyer imx6sxccm_match, imx6sxccm_attach, NULL, NULL); 1345 1.1 bouyer 1346 1.1 bouyer static const struct device_compatible_entry compat_data[] = { 1347 1.1 bouyer { .compat = "fsl,imx6sx-ccm" }, 1348 1.1 bouyer DEVICE_COMPAT_EOL 1349 1.1 bouyer }; 1350 1.1 bouyer 1351 1.1 bouyer static int 1352 1.1 bouyer imx6sxccm_match(device_t parent, cfdata_t cfdata, void *aux) 1353 1.1 bouyer { 1354 1.1 bouyer struct fdt_attach_args * const faa = aux; 1355 1.1 bouyer 1356 1.1 bouyer return of_compatible_match(faa->faa_phandle, compat_data); 1357 1.1 bouyer } 1358 1.1 bouyer 1359 1.1 bouyer static void 1360 1.1 bouyer imx6sxccm_attach(device_t parent, device_t self, void *aux) 1361 1.1 bouyer { 1362 1.1 bouyer struct imx6ccm_softc * const sc = device_private(self); 1363 1.1 bouyer struct fdt_attach_args * const faa = aux; 1364 1.1 bouyer bus_addr_t addr; 1365 1.1 bouyer bus_size_t size; 1366 1.1 bouyer 1367 1.1 bouyer if (fdtbus_get_reg(faa->faa_phandle, 0, &addr, &size) != 0) { 1368 1.1 bouyer aprint_error(": couldn't get registers\n"); 1369 1.1 bouyer return; 1370 1.1 bouyer } 1371 1.1 bouyer 1372 1.1 bouyer sc->sc_dev = self; 1373 1.1 bouyer sc->sc_iot = faa->faa_bst; 1374 1.1 bouyer 1375 1.1 bouyer if (bus_space_map(sc->sc_iot, addr, size, 0, &sc->sc_ioh)) { 1376 1.1 bouyer aprint_error(": can't map ccm registers\n"); 1377 1.1 bouyer return; 1378 1.1 bouyer } 1379 1.1 bouyer 1380 1.1 bouyer int phandle = of_find_bycompat(OF_finddevice("/"), "fsl,imx6sx-anatop"); 1381 1.1 bouyer 1382 1.1 bouyer if (phandle == -1) { 1383 1.1 bouyer aprint_error(": can't find anatop device\n"); 1384 1.1 bouyer return; 1385 1.1 bouyer } 1386 1.1 bouyer 1387 1.1 bouyer if (fdtbus_get_reg(phandle, 0, &addr, &size) != 0) { 1388 1.1 bouyer aprint_error(": can't get anatop registers\n"); 1389 1.1 bouyer return; 1390 1.1 bouyer } 1391 1.4 skrll 1392 1.4 skrll 1393 1.1 bouyer if (bus_space_map(sc->sc_iot, addr, size, 0, &sc->sc_ioh_analog)) { 1394 1.1 bouyer aprint_error(": can't map anatop registers\n"); 1395 1.1 bouyer return; 1396 1.1 bouyer } 1397 1.1 bouyer 1398 1.1 bouyer aprint_naive("\n"); 1399 1.1 bouyer aprint_normal(": Clock Control Module\n"); 1400 1.1 bouyer 1401 1.1 bouyer imx6ccm_attach_common(self, &imx6sx_clks[0], __arraycount(imx6sx_clks), 1402 1.1 bouyer imx6sxccm_init_parents); 1403 1.1 bouyer 1404 1.1 bouyer imx6sx_clk_fixed_from_fdt(sc, "ckil"); 1405 1.1 bouyer imx6sx_clk_fixed_from_fdt(sc, "osc"); 1406 1.1 bouyer imx6sx_clk_fixed_from_fdt(sc, "ipp_di0"); 1407 1.1 bouyer imx6sx_clk_fixed_from_fdt(sc, "ipp_di1"); 1408 1.1 bouyer imx6sx_clk_fixed_from_fdt(sc, "anaclk1"); 1409 1.1 bouyer imx6sx_clk_fixed_from_fdt(sc, "anaclk2"); 1410 1.1 bouyer 1411 1.1 bouyer fdtbus_register_clock_controller(self, faa->faa_phandle, 1412 1.1 bouyer &imx6sx_ccm_fdtclock_funcs); 1413 1.1 bouyer } 1414