xref: /netbsd-src/sys/arch/arm/nxp/imx6_clk.c (revision 97835a6fdf98e4a2b9440d7883cdfef1de5b608c)
1*97835a6fSskrll /*	$NetBSD: imx6_clk.c,v 1.8 2024/09/01 08:08:24 skrll Exp $	*/
28644267aSskrll 
38644267aSskrll /*-
48644267aSskrll  * Copyright (c) 2019 Genetec Corporation.  All rights reserved.
58644267aSskrll  * Written by Hashimoto Kenichi for Genetec Corporation.
68644267aSskrll  *
78644267aSskrll  * Redistribution and use in source and binary forms, with or without
88644267aSskrll  * modification, are permitted provided that the following conditions
98644267aSskrll  * are met:
108644267aSskrll  * 1. Redistributions of source code must retain the above copyright
118644267aSskrll  *    notice, this list of conditions and the following disclaimer.
128644267aSskrll  * 2. Redistributions in binary form must reproduce the above copyright
138644267aSskrll  *    notice, this list of conditions and the following disclaimer in the
148644267aSskrll  *    documentation and/or other materials provided with the distribution.
158644267aSskrll  *
168644267aSskrll  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
178644267aSskrll  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
188644267aSskrll  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
198644267aSskrll  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
208644267aSskrll  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
218644267aSskrll  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
228644267aSskrll  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
238644267aSskrll  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
248644267aSskrll  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
258644267aSskrll  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
268644267aSskrll  * SUCH DAMAGE.
278644267aSskrll  */
288644267aSskrll 
298644267aSskrll #include <sys/cdefs.h>
30*97835a6fSskrll __KERNEL_RCSID(0, "$NetBSD: imx6_clk.c,v 1.8 2024/09/01 08:08:24 skrll Exp $");
318644267aSskrll 
328644267aSskrll #include "opt_fdt.h"
338644267aSskrll 
348644267aSskrll #include <sys/types.h>
358644267aSskrll #include <sys/time.h>
368644267aSskrll #include <sys/bus.h>
378644267aSskrll #include <sys/device.h>
388644267aSskrll #include <sys/sysctl.h>
398644267aSskrll #include <sys/cpufreq.h>
408644267aSskrll #include <sys/kmem.h>
418644267aSskrll #include <sys/param.h>
428644267aSskrll 
433e5af17bSbouyer #include <arm/nxp/imx6_ccmreg.h>
448644267aSskrll #include <arm/nxp/imx6_ccmvar.h>
458644267aSskrll 
468644267aSskrll #include <dev/clk/clk_backend.h>
478644267aSskrll #include <dev/fdt/fdtvar.h>
488644267aSskrll 
493e5af17bSbouyer /* Clock IDs - should match dt-bindings/clock/imx6qdl-clock.h */
503e5af17bSbouyer #define IMX6QCLK_DUMMY			0
513e5af17bSbouyer #define IMX6QCLK_CKIL			1
523e5af17bSbouyer #define IMX6QCLK_CKIH			2
533e5af17bSbouyer #define IMX6QCLK_OSC			3
543e5af17bSbouyer #define IMX6QCLK_PLL2_PFD0_352M		4
553e5af17bSbouyer #define IMX6QCLK_PLL2_PFD1_594M		5
563e5af17bSbouyer #define IMX6QCLK_PLL2_PFD2_396M		6
573e5af17bSbouyer #define IMX6QCLK_PLL3_PFD0_720M		7
583e5af17bSbouyer #define IMX6QCLK_PLL3_PFD1_540M		8
593e5af17bSbouyer #define IMX6QCLK_PLL3_PFD2_508M		9
603e5af17bSbouyer #define IMX6QCLK_PLL3_PFD3_454M		10
613e5af17bSbouyer #define IMX6QCLK_PLL2_198M		11
623e5af17bSbouyer #define IMX6QCLK_PLL3_120M		12
633e5af17bSbouyer #define IMX6QCLK_PLL3_80M		13
643e5af17bSbouyer #define IMX6QCLK_PLL3_60M		14
653e5af17bSbouyer #define IMX6QCLK_TWD			15
663e5af17bSbouyer #define IMX6QCLK_STEP			16
673e5af17bSbouyer #define IMX6QCLK_PLL1_SW		17
683e5af17bSbouyer #define IMX6QCLK_PERIPH_PRE		18
693e5af17bSbouyer #define IMX6QCLK_PERIPH2_PRE		19
703e5af17bSbouyer #define IMX6QCLK_PERIPH_CLK2_SEL	20
713e5af17bSbouyer #define IMX6QCLK_PERIPH2_CLK2_SEL	21
723e5af17bSbouyer #define IMX6QCLK_AXI_SEL		22
733e5af17bSbouyer #define IMX6QCLK_ESAI_SEL		23
743e5af17bSbouyer #define IMX6QCLK_ASRC_SEL		24
753e5af17bSbouyer #define IMX6QCLK_SPDIF_SEL		25
763e5af17bSbouyer #define IMX6QCLK_GPU2D_AXI		26
773e5af17bSbouyer #define IMX6QCLK_GPU3D_AXI		27
783e5af17bSbouyer #define IMX6QCLK_GPU2D_CORE_SEL		28
793e5af17bSbouyer #define IMX6QCLK_GPU3D_CORE_SEL		29
803e5af17bSbouyer #define IMX6QCLK_GPU3D_SHADER_SEL	30
813e5af17bSbouyer #define IMX6QCLK_IPU1_SEL		31
823e5af17bSbouyer #define IMX6QCLK_IPU2_SEL		32
833e5af17bSbouyer #define IMX6QCLK_LDB_DI0_SEL		33
843e5af17bSbouyer #define IMX6QCLK_LDB_DI1_SEL		34
853e5af17bSbouyer #define IMX6QCLK_IPU1_DI0_PRE_SEL	35
863e5af17bSbouyer #define IMX6QCLK_IPU1_DI1_PRE_SEL	36
873e5af17bSbouyer #define IMX6QCLK_IPU2_DI0_PRE_SEL	37
883e5af17bSbouyer #define IMX6QCLK_IPU2_DI1_PRE_SEL	38
893e5af17bSbouyer #define IMX6QCLK_IPU1_DI0_SEL		39
903e5af17bSbouyer #define IMX6QCLK_IPU1_DI1_SEL		40
913e5af17bSbouyer #define IMX6QCLK_IPU2_DI0_SEL		41
923e5af17bSbouyer #define IMX6QCLK_IPU2_DI1_SEL		42
933e5af17bSbouyer #define IMX6QCLK_HSI_TX_SEL		43
943e5af17bSbouyer #define IMX6QCLK_PCIE_AXI_SEL		44
953e5af17bSbouyer #define IMX6QCLK_SSI1_SEL		45
963e5af17bSbouyer #define IMX6QCLK_SSI2_SEL		46
973e5af17bSbouyer #define IMX6QCLK_SSI3_SEL		47
983e5af17bSbouyer #define IMX6QCLK_USDHC1_SEL		48
993e5af17bSbouyer #define IMX6QCLK_USDHC2_SEL		49
1003e5af17bSbouyer #define IMX6QCLK_USDHC3_SEL		50
1013e5af17bSbouyer #define IMX6QCLK_USDHC4_SEL		51
1023e5af17bSbouyer #define IMX6QCLK_ENFC_SEL		52
1033e5af17bSbouyer #define IMX6QCLK_EIM_SEL		53
1043e5af17bSbouyer #define IMX6QCLK_EIM_SLOW_SEL		54
1053e5af17bSbouyer #define IMX6QCLK_VDO_AXI_SEL		55
1063e5af17bSbouyer #define IMX6QCLK_VPU_AXI_SEL		56
1073e5af17bSbouyer #define IMX6QCLK_CKO1_SEL		57
1083e5af17bSbouyer #define IMX6QCLK_PERIPH			58
1093e5af17bSbouyer #define IMX6QCLK_PERIPH2		59
1103e5af17bSbouyer #define IMX6QCLK_PERIPH_CLK2		60
1113e5af17bSbouyer #define IMX6QCLK_PERIPH2_CLK2		61
1123e5af17bSbouyer #define IMX6QCLK_IPG			62
1133e5af17bSbouyer #define IMX6QCLK_IPG_PER		63
1143e5af17bSbouyer #define IMX6QCLK_ESAI_PRED		64
1153e5af17bSbouyer #define IMX6QCLK_ESAI_PODF		65
1163e5af17bSbouyer #define IMX6QCLK_ASRC_PRED		66
1173e5af17bSbouyer #define IMX6QCLK_ASRC_PODF		67
1183e5af17bSbouyer #define IMX6QCLK_SPDIF_PRED		68
1193e5af17bSbouyer #define IMX6QCLK_SPDIF_PODF		69
1203e5af17bSbouyer #define IMX6QCLK_CAN_ROOT		70
1213e5af17bSbouyer #define IMX6QCLK_ECSPI_ROOT		71
1223e5af17bSbouyer #define IMX6QCLK_GPU2D_CORE_PODF	72
1233e5af17bSbouyer #define IMX6QCLK_GPU3D_CORE_PODF	73
1243e5af17bSbouyer #define IMX6QCLK_GPU3D_SHADER		74
1253e5af17bSbouyer #define IMX6QCLK_IPU1_PODF		75
1263e5af17bSbouyer #define IMX6QCLK_IPU2_PODF		76
1273e5af17bSbouyer #define IMX6QCLK_LDB_DI0_PODF		77
1283e5af17bSbouyer #define IMX6QCLK_LDB_DI1_PODF		78
1293e5af17bSbouyer #define IMX6QCLK_IPU1_DI0_PRE		79
1303e5af17bSbouyer #define IMX6QCLK_IPU1_DI1_PRE		80
1313e5af17bSbouyer #define IMX6QCLK_IPU2_DI0_PRE		81
1323e5af17bSbouyer #define IMX6QCLK_IPU2_DI1_PRE		82
1333e5af17bSbouyer #define IMX6QCLK_HSI_TX_PODF		83
1343e5af17bSbouyer #define IMX6QCLK_SSI1_PRED		84
1353e5af17bSbouyer #define IMX6QCLK_SSI1_PODF		85
1363e5af17bSbouyer #define IMX6QCLK_SSI2_PRED		86
1373e5af17bSbouyer #define IMX6QCLK_SSI2_PODF		87
1383e5af17bSbouyer #define IMX6QCLK_SSI3_PRED		88
1393e5af17bSbouyer #define IMX6QCLK_SSI3_PODF		89
1403e5af17bSbouyer #define IMX6QCLK_UART_SERIAL_PODF	90
1413e5af17bSbouyer #define IMX6QCLK_USDHC1_PODF		91
1423e5af17bSbouyer #define IMX6QCLK_USDHC2_PODF		92
1433e5af17bSbouyer #define IMX6QCLK_USDHC3_PODF		93
1443e5af17bSbouyer #define IMX6QCLK_USDHC4_PODF		94
1453e5af17bSbouyer #define IMX6QCLK_ENFC_PRED		95
1463e5af17bSbouyer #define IMX6QCLK_ENFC_PODF		96
1473e5af17bSbouyer #define IMX6QCLK_EIM_PODF		97
1483e5af17bSbouyer #define IMX6QCLK_EIM_SLOW_PODF		98
1493e5af17bSbouyer #define IMX6QCLK_VPU_AXI_PODF		99
1503e5af17bSbouyer #define IMX6QCLK_CKO1_PODF		100
1513e5af17bSbouyer #define IMX6QCLK_AXI			101
1523e5af17bSbouyer #define IMX6QCLK_MMDC_CH0_AXI_PODF	102
1533e5af17bSbouyer #define IMX6QCLK_MMDC_CH1_AXI_PODF	103
1543e5af17bSbouyer #define IMX6QCLK_ARM			104
1553e5af17bSbouyer #define IMX6QCLK_AHB			105
1563e5af17bSbouyer #define IMX6QCLK_APBH_DMA		106
1573e5af17bSbouyer #define IMX6QCLK_ASRC			107
1583e5af17bSbouyer #define IMX6QCLK_CAN1_IPG		108
1593e5af17bSbouyer #define IMX6QCLK_CAN1_SERIAL		109
1603e5af17bSbouyer #define IMX6QCLK_CAN2_IPG		110
1613e5af17bSbouyer #define IMX6QCLK_CAN2_SERIAL		111
1623e5af17bSbouyer #define IMX6QCLK_ECSPI1			112
1633e5af17bSbouyer #define IMX6QCLK_ECSPI2			113
1643e5af17bSbouyer #define IMX6QCLK_ECSPI3			114
1653e5af17bSbouyer #define IMX6QCLK_ECSPI4			115
1663e5af17bSbouyer #define IMX6QCLK_ECSPI5			116	/* i.MX6Q */
1673e5af17bSbouyer #define IMX6QCLK_I2C4			116	/* i.MX6DL */
1683e5af17bSbouyer #define IMX6QCLK_ENET			117
1693e5af17bSbouyer #define IMX6QCLK_ESAI_EXTAL		118
1703e5af17bSbouyer #define IMX6QCLK_GPT_IPG		119
1713e5af17bSbouyer #define IMX6QCLK_GPT_IPG_PER		120
1723e5af17bSbouyer #define IMX6QCLK_GPU2D_CORE		121
1733e5af17bSbouyer #define IMX6QCLK_GPU3D_CORE		122
1743e5af17bSbouyer #define IMX6QCLK_HDMI_IAHB		123
1753e5af17bSbouyer #define IMX6QCLK_HDMI_ISFR		124
1763e5af17bSbouyer #define IMX6QCLK_I2C1			125
1773e5af17bSbouyer #define IMX6QCLK_I2C2			126
1783e5af17bSbouyer #define IMX6QCLK_I2C3			127
1793e5af17bSbouyer #define IMX6QCLK_IIM			128
1803e5af17bSbouyer #define IMX6QCLK_ENFC			129
1813e5af17bSbouyer #define IMX6QCLK_IPU1			130
1823e5af17bSbouyer #define IMX6QCLK_IPU1_DI0		131
1833e5af17bSbouyer #define IMX6QCLK_IPU1_DI1		132
1843e5af17bSbouyer #define IMX6QCLK_IPU2			133
1853e5af17bSbouyer #define IMX6QCLK_IPU2_DI0		134
1863e5af17bSbouyer #define IMX6QCLK_LDB_DI0		135
1873e5af17bSbouyer #define IMX6QCLK_LDB_DI1		136
1883e5af17bSbouyer #define IMX6QCLK_IPU2_DI1		137
1893e5af17bSbouyer #define IMX6QCLK_HSI_TX			138
1903e5af17bSbouyer #define IMX6QCLK_MLB			139
1913e5af17bSbouyer #define IMX6QCLK_MMDC_CH0_AXI		140
1923e5af17bSbouyer #define IMX6QCLK_MMDC_CH1_AXI		141
1933e5af17bSbouyer #define IMX6QCLK_OCRAM			142
1943e5af17bSbouyer #define IMX6QCLK_OPENVG_AXI		143
1953e5af17bSbouyer #define IMX6QCLK_PCIE_AXI		144
1963e5af17bSbouyer #define IMX6QCLK_PWM1			145
1973e5af17bSbouyer #define IMX6QCLK_PWM2			146
1983e5af17bSbouyer #define IMX6QCLK_PWM3			147
1993e5af17bSbouyer #define IMX6QCLK_PWM4			148
2003e5af17bSbouyer #define IMX6QCLK_PER1_BCH		149
2013e5af17bSbouyer #define IMX6QCLK_GPMI_BCH_APB		150
2023e5af17bSbouyer #define IMX6QCLK_GPMI_BCH		151
2033e5af17bSbouyer #define IMX6QCLK_GPMI_IO		152
2043e5af17bSbouyer #define IMX6QCLK_GPMI_APB		153
2053e5af17bSbouyer #define IMX6QCLK_SATA			154
2063e5af17bSbouyer #define IMX6QCLK_SDMA			155
2073e5af17bSbouyer #define IMX6QCLK_SPBA			156
2083e5af17bSbouyer #define IMX6QCLK_SSI1			157
2093e5af17bSbouyer #define IMX6QCLK_SSI2			158
2103e5af17bSbouyer #define IMX6QCLK_SSI3			159
2113e5af17bSbouyer #define IMX6QCLK_UART_IPG		160
2123e5af17bSbouyer #define IMX6QCLK_UART_SERIAL		161
2133e5af17bSbouyer #define IMX6QCLK_USBOH3			162
2143e5af17bSbouyer #define IMX6QCLK_USDHC1			163
2153e5af17bSbouyer #define IMX6QCLK_USDHC2			164
2163e5af17bSbouyer #define IMX6QCLK_USDHC3			165
2173e5af17bSbouyer #define IMX6QCLK_USDHC4			166
2183e5af17bSbouyer #define IMX6QCLK_VDO_AXI		167
2193e5af17bSbouyer #define IMX6QCLK_VPU_AXI		168
2203e5af17bSbouyer #define IMX6QCLK_CKO1			169
2213e5af17bSbouyer #define IMX6QCLK_PLL1_SYS		170
2223e5af17bSbouyer #define IMX6QCLK_PLL2_BUS		171
2233e5af17bSbouyer #define IMX6QCLK_PLL3_USB_OTG		172
2243e5af17bSbouyer #define IMX6QCLK_PLL4_AUDIO		173
2253e5af17bSbouyer #define IMX6QCLK_PLL5_VIDEO		174
2263e5af17bSbouyer #define IMX6QCLK_PLL8_MLB		175
2273e5af17bSbouyer #define IMX6QCLK_PLL7_USB_HOST		176
2283e5af17bSbouyer #define IMX6QCLK_PLL6_ENET		177
2293e5af17bSbouyer #define IMX6QCLK_SSI1_IPG		178
2303e5af17bSbouyer #define IMX6QCLK_SSI2_IPG		179
2313e5af17bSbouyer #define IMX6QCLK_SSI3_IPG		180
2323e5af17bSbouyer #define IMX6QCLK_ROM			181
2333e5af17bSbouyer #define IMX6QCLK_USBPHY1		182
2343e5af17bSbouyer #define IMX6QCLK_USBPHY2		183
2353e5af17bSbouyer #define IMX6QCLK_LDB_DI0_DIV_3_5	184
2363e5af17bSbouyer #define IMX6QCLK_LDB_DI1_DIV_3_5	185
2373e5af17bSbouyer #define IMX6QCLK_SATA_REF		186
2383e5af17bSbouyer #define IMX6QCLK_SATA_REF_100M		187
2393e5af17bSbouyer #define IMX6QCLK_PCIE_REF		188
2403e5af17bSbouyer #define IMX6QCLK_PCIE_REF_125M		189
2413e5af17bSbouyer #define IMX6QCLK_ENET_REF		190
2423e5af17bSbouyer #define IMX6QCLK_USBPHY1_GATE		191
2433e5af17bSbouyer #define IMX6QCLK_USBPHY2_GATE		192
2443e5af17bSbouyer #define IMX6QCLK_PLL4_POST_DIV		193
2453e5af17bSbouyer #define IMX6QCLK_PLL5_POST_DIV		194
2463e5af17bSbouyer #define IMX6QCLK_PLL5_VIDEO_DIV		195
2473e5af17bSbouyer #define IMX6QCLK_EIM_SLOW		196
2483e5af17bSbouyer #define IMX6QCLK_SPDIF			197
2493e5af17bSbouyer #define IMX6QCLK_CKO2_SEL		198
2503e5af17bSbouyer #define IMX6QCLK_CKO2_PODF		199
2513e5af17bSbouyer #define IMX6QCLK_CKO2			200
2523e5af17bSbouyer #define IMX6QCLK_CKO			201
2533e5af17bSbouyer #define IMX6QCLK_VDOA			202
2543e5af17bSbouyer #define IMX6QCLK_PLL4_AUDIO_DIV		203
2553e5af17bSbouyer #define IMX6QCLK_LVDS1_SEL		204
2563e5af17bSbouyer #define IMX6QCLK_LVDS2_SEL		205
2573e5af17bSbouyer #define IMX6QCLK_LVDS1_GATE		206
2583e5af17bSbouyer #define IMX6QCLK_LVDS2_GATE		207
2593e5af17bSbouyer #define IMX6QCLK_ESAI_IPG		208
2603e5af17bSbouyer #define IMX6QCLK_ESAI_MEM		209
2613e5af17bSbouyer #define IMX6QCLK_ASRC_IPG		210
2623e5af17bSbouyer #define IMX6QCLK_ASRC_MEM		211
2633e5af17bSbouyer #define IMX6QCLK_LVDS1_IN		212
2643e5af17bSbouyer #define IMX6QCLK_LVDS2_IN		213
2653e5af17bSbouyer #define IMX6QCLK_ANACLK1		214
2663e5af17bSbouyer #define IMX6QCLK_ANACLK2		215
2673e5af17bSbouyer #define IMX6QCLK_PLL1_BYPASS_SRC	216
2683e5af17bSbouyer #define IMX6QCLK_PLL2_BYPASS_SRC	217
2693e5af17bSbouyer #define IMX6QCLK_PLL3_BYPASS_SRC	218
2703e5af17bSbouyer #define IMX6QCLK_PLL4_BYPASS_SRC	219
2713e5af17bSbouyer #define IMX6QCLK_PLL5_BYPASS_SRC	220
2723e5af17bSbouyer #define IMX6QCLK_PLL6_BYPASS_SRC	221
2733e5af17bSbouyer #define IMX6QCLK_PLL7_BYPASS_SRC	222
2743e5af17bSbouyer #define IMX6QCLK_PLL1			223
2753e5af17bSbouyer #define IMX6QCLK_PLL2			224
2763e5af17bSbouyer #define IMX6QCLK_PLL3			225
2773e5af17bSbouyer #define IMX6QCLK_PLL4			226
2783e5af17bSbouyer #define IMX6QCLK_PLL5			227
2793e5af17bSbouyer #define IMX6QCLK_PLL6			228
2803e5af17bSbouyer #define IMX6QCLK_PLL7			229
2813e5af17bSbouyer #define IMX6QCLK_PLL1_BYPASS		230
2823e5af17bSbouyer #define IMX6QCLK_PLL2_BYPASS		231
2833e5af17bSbouyer #define IMX6QCLK_PLL3_BYPASS		232
2843e5af17bSbouyer #define IMX6QCLK_PLL4_BYPASS		233
2853e5af17bSbouyer #define IMX6QCLK_PLL5_BYPASS		234
2863e5af17bSbouyer #define IMX6QCLK_PLL6_BYPASS		235
2873e5af17bSbouyer #define IMX6QCLK_PLL7_BYPASS		236
2883e5af17bSbouyer #define IMX6QCLK_GPT_3M			237
2893e5af17bSbouyer #define IMX6QCLK_VIDEO_27M		238
2903e5af17bSbouyer #define IMX6QCLK_MIPI_CORE_CFG		239
2913e5af17bSbouyer #define IMX6QCLK_MIPI_IPG		240
2923e5af17bSbouyer #define IMX6QCLK_CAAM_MEM		241
2933e5af17bSbouyer #define IMX6QCLK_CAAM_ACLK		242
2943e5af17bSbouyer #define IMX6QCLK_CAAM_IPG		243
2953e5af17bSbouyer #define IMX6QCLK_SPDIF_GCLK		244
2963e5af17bSbouyer #define IMX6QCLK_UART_SEL		245
2973e5af17bSbouyer #define IMX6QCLK_IPG_PER_SEL		246
2983e5af17bSbouyer #define IMX6QCLK_ECSPI_SEL		247
2993e5af17bSbouyer #define IMX6QCLK_CAN_SEL		248
3003e5af17bSbouyer #define IMX6QCLK_MMDC_CH1_AXI_CG	249
3013e5af17bSbouyer #define IMX6QCLK_PRE0			250
3023e5af17bSbouyer #define IMX6QCLK_PRE1			251
3033e5af17bSbouyer #define IMX6QCLK_PRE2			252
3043e5af17bSbouyer #define IMX6QCLK_PRE3			253
3053e5af17bSbouyer #define IMX6QCLK_PRG0_AXI		254
3063e5af17bSbouyer #define IMX6QCLK_PRG1_AXI		255
3073e5af17bSbouyer #define IMX6QCLK_PRG0_APB		256
3083e5af17bSbouyer #define IMX6QCLK_PRG1_APB		257
3093e5af17bSbouyer #define IMX6QCLK_PRE_AXI		258
3103e5af17bSbouyer #define IMX6QCLK_MLB_SEL		259
3113e5af17bSbouyer #define IMX6QCLK_MLB_PODF		260
3123e5af17bSbouyer #define IMX6QCLK_END			261
3133e5af17bSbouyer /* Clock Parents Tables */
3143e5af17bSbouyer static const char *step_p[] = {
3153e5af17bSbouyer 	"osc",
3163e5af17bSbouyer 	"pll2_pfd2_396m"
3173e5af17bSbouyer };
3188644267aSskrll 
3193e5af17bSbouyer static const char *pll1_sw_p[] = {
3203e5af17bSbouyer 	"pll1_sys",
3213e5af17bSbouyer 	"step"
3223e5af17bSbouyer };
3233e5af17bSbouyer 
3243e5af17bSbouyer static const char *periph_pre_p[] = {
3253e5af17bSbouyer 	"pll2_bus",
3263e5af17bSbouyer 	"pll2_pfd2_396m",
3273e5af17bSbouyer 	"pll2_pfd0_352m",
3283e5af17bSbouyer 	"pll2_198m"
3293e5af17bSbouyer };
3303e5af17bSbouyer 
3313e5af17bSbouyer static const char *periph_clk2_p[] = {
3323e5af17bSbouyer 	"pll3_usb_otg",
3333e5af17bSbouyer 	"osc",
3343e5af17bSbouyer 	"osc",
3353e5af17bSbouyer 	"dummy"
3363e5af17bSbouyer };
3373e5af17bSbouyer 
3383e5af17bSbouyer static const char *periph2_clk2_p[] = {
3393e5af17bSbouyer 	"pll3_usb_otg",
3403e5af17bSbouyer 	"pll2_bus"
3413e5af17bSbouyer };
3423e5af17bSbouyer 
3433e5af17bSbouyer static const char *axi_p[] = {
3443e5af17bSbouyer 	"periph",
3453e5af17bSbouyer 	"pll2_pfd2_396m",
3463e5af17bSbouyer 	"periph",
3473e5af17bSbouyer 	"pll3_pfd1_540m"
3483e5af17bSbouyer };
3493e5af17bSbouyer 
3503e5af17bSbouyer static const char *audio_p[] = {
3513e5af17bSbouyer 	"pll4_audio_div",
3523e5af17bSbouyer 	"pll3_pfd2_508m",
3533e5af17bSbouyer 	"pll3_pfd3_454m",
3543e5af17bSbouyer 	"pll3_usb_otg"
3553e5af17bSbouyer };
3563e5af17bSbouyer 
3573e5af17bSbouyer static const char *gpu2d_core_p[] = {
3583e5af17bSbouyer 	"axi",
3593e5af17bSbouyer 	"pll3_usb_otg",
3603e5af17bSbouyer 	"pll2_pfd0_352m",
3613e5af17bSbouyer 	"pll2_pfd2_396m"
3623e5af17bSbouyer };
3633e5af17bSbouyer 
3643e5af17bSbouyer static const char *gpu3d_core_p[] = {
3653e5af17bSbouyer 	"mmdc_ch0_axi",
3663e5af17bSbouyer 	"pll3_usb_otg",
3673e5af17bSbouyer 	"pll2_pfd1_594m",
3683e5af17bSbouyer 	"pll2_pfd2_396m"
3693e5af17bSbouyer };
3703e5af17bSbouyer 
3713e5af17bSbouyer static const char *gpu3d_shader_p[] = {
3723e5af17bSbouyer 	"mmdc_ch0_axi",
3733e5af17bSbouyer 	"pll3_usb_otg",
3743e5af17bSbouyer 	"pll2_pfd1_594m",
3753e5af17bSbouyer 	"pll3_pfd0_720m"
3763e5af17bSbouyer };
3773e5af17bSbouyer 
3783e5af17bSbouyer static const char *ipu_p[] = {
3793e5af17bSbouyer 	"mmdc_ch0_axi",
3803e5af17bSbouyer 	"pll2_pfd2_396m",
3813e5af17bSbouyer 	"pll3_120m",
3823e5af17bSbouyer 	"pll3_pfd1_540m"
3833e5af17bSbouyer };
3843e5af17bSbouyer 
3853e5af17bSbouyer static const char *pll_bypass_src_p[] = {
3863e5af17bSbouyer 	"osc",
3873e5af17bSbouyer 	"lvds1_in",
3883e5af17bSbouyer 	"lvds2_in",
3893e5af17bSbouyer 	"dummy"
3903e5af17bSbouyer };
3913e5af17bSbouyer 
3923e5af17bSbouyer static const char *pll1_bypass_p[] = {
3933e5af17bSbouyer 	"pll1",
3943e5af17bSbouyer 	"pll1_bypass_src"
3953e5af17bSbouyer };
3963e5af17bSbouyer 
3973e5af17bSbouyer static const char *pll2_bypass_p[] = {
3983e5af17bSbouyer 	"pll2",
3993e5af17bSbouyer 	"pll2_bypass_src"
4003e5af17bSbouyer };
4013e5af17bSbouyer 
4023e5af17bSbouyer static const char *pll3_bypass_p[] = {
4033e5af17bSbouyer 	"pll3",
4043e5af17bSbouyer 	"pll3_bypass_src"
4053e5af17bSbouyer };
4063e5af17bSbouyer 
4073e5af17bSbouyer static const char *pll4_bypass_p[] = {
4083e5af17bSbouyer 	"pll4",
4093e5af17bSbouyer 	"pll4_bypass_src"
4103e5af17bSbouyer };
4113e5af17bSbouyer 
4123e5af17bSbouyer static const char *pll5_bypass_p[] = {
4133e5af17bSbouyer 	"pll5",
4143e5af17bSbouyer 	"pll5_bypass_src"
4153e5af17bSbouyer };
4163e5af17bSbouyer 
4173e5af17bSbouyer static const char *pll6_bypass_p[] = {
4183e5af17bSbouyer 	"pll6",
4193e5af17bSbouyer 	"pll6_bypass_src"
4203e5af17bSbouyer };
4213e5af17bSbouyer 
4223e5af17bSbouyer static const char *pll7_bypass_p[] = {
4233e5af17bSbouyer 	"pll7",
4243e5af17bSbouyer 	"pll7_bypass_src"
4253e5af17bSbouyer };
4263e5af17bSbouyer 
4273e5af17bSbouyer static const char *ipu_di_pre_p[] = {
4283e5af17bSbouyer 	"mmdc_ch0_axi",
4293e5af17bSbouyer 	"pll3_usb_otg",
4303e5af17bSbouyer 	"pll5_video_div",
4313e5af17bSbouyer 	"pll2_pfd0_352m",
4323e5af17bSbouyer 	"pll2_pfd2_396m",
4333e5af17bSbouyer 	"pll3_pfd1_540m"
4343e5af17bSbouyer };
4353e5af17bSbouyer 
4363e5af17bSbouyer static const char *ipu1_di0_p[] = {
4373e5af17bSbouyer 	"ipu1_di0_pre",
4383e5af17bSbouyer 	"dummy",
4393e5af17bSbouyer 	"dummy",
4403e5af17bSbouyer 	"ldb_di0",
4413e5af17bSbouyer 	"ldb_di1"
4423e5af17bSbouyer };
4433e5af17bSbouyer 
4443e5af17bSbouyer static const char *ipu1_di1_p[] = {
4453e5af17bSbouyer 	"ipu1_di1_pre",
4463e5af17bSbouyer 	"dummy",
4473e5af17bSbouyer 	"dummy",
4483e5af17bSbouyer 	"ldb_di0",
4493e5af17bSbouyer 	"ldb_di1"
4503e5af17bSbouyer };
4513e5af17bSbouyer 
4523e5af17bSbouyer static const char *ipu2_di0_p[] = {
4533e5af17bSbouyer 	"ipu2_di0_pre",
4543e5af17bSbouyer 	"dummy",
4553e5af17bSbouyer 	"dummy",
4563e5af17bSbouyer 	"ldb_di0",
4573e5af17bSbouyer 	"ldb_di1"
4583e5af17bSbouyer };
4593e5af17bSbouyer 
4603e5af17bSbouyer static const char *ipu2_di1_p[] = {
4613e5af17bSbouyer 	"ipu2_di1_pre",
4623e5af17bSbouyer 	"dummy",
4633e5af17bSbouyer 	"dummy",
4643e5af17bSbouyer 	"ldb_di0",
4653e5af17bSbouyer 	"ldb_di1"
4663e5af17bSbouyer };
4673e5af17bSbouyer 
4683e5af17bSbouyer static const char *ldb_di_p[] = {
4693e5af17bSbouyer 	"pll5_video_div",
4703e5af17bSbouyer 	"pll2_pfd0_352m",
4713e5af17bSbouyer 	"pll2_pfd2_396m",
4723e5af17bSbouyer 	"mmdc_ch1_axi",
4733e5af17bSbouyer 	"pll3_usb_otg"
4743e5af17bSbouyer };
4753e5af17bSbouyer 
4763e5af17bSbouyer static const char *periph_p[] = {
4773e5af17bSbouyer 	"periph_pre",
4783e5af17bSbouyer 	"periph_clk2"
4793e5af17bSbouyer };
4803e5af17bSbouyer 
4813e5af17bSbouyer static const char *periph2_p[] = {
4823e5af17bSbouyer 	"periph2_pre",
4833e5af17bSbouyer 	"periph2_clk2"
4843e5af17bSbouyer };
4853e5af17bSbouyer 
4863e5af17bSbouyer static const char *vdo_axi_p[] = {
4873e5af17bSbouyer 	"axi",
4883e5af17bSbouyer 	"ahb"
4893e5af17bSbouyer };
4903e5af17bSbouyer 
4913e5af17bSbouyer static const char *vpu_axi_p[] = {
4923e5af17bSbouyer 	"axi",
4933e5af17bSbouyer 	"pll2_pfd2_396m",
4943e5af17bSbouyer 	"pll2_pfd0_352m"
4953e5af17bSbouyer };
4963e5af17bSbouyer 
4973e5af17bSbouyer static const char *cko1_p[] = {
4983e5af17bSbouyer 	"pll3_usb_otg",
4993e5af17bSbouyer 	"pll2_bus",
5003e5af17bSbouyer 	"pll1_sys",
5013e5af17bSbouyer 	"pll5_video_div",
5023e5af17bSbouyer 	"dummy",
5033e5af17bSbouyer 	"axi",
5043e5af17bSbouyer 	"enfc",
5053e5af17bSbouyer 	"ipu1_di0",
5063e5af17bSbouyer 	"ipu1_di1",
5073e5af17bSbouyer 	"ipu2_di0",
5083e5af17bSbouyer 	"ipu2_di1",
5093e5af17bSbouyer 	"ahb",
5103e5af17bSbouyer 	"ipg",
5113e5af17bSbouyer 	"ipg_per",
5123e5af17bSbouyer 	"ckil",
5133e5af17bSbouyer 	"pll4_audio_div"
5143e5af17bSbouyer };
5153e5af17bSbouyer 
5163e5af17bSbouyer static const char *cko2_p[] = {
5173e5af17bSbouyer 	"mmdc_ch0_axi",
5183e5af17bSbouyer 	"mmdc_ch1_axi",
5193e5af17bSbouyer 	"usdhc4",
5203e5af17bSbouyer 	"usdhc1",
5213e5af17bSbouyer 	"gpu2d_axi",
5223e5af17bSbouyer 	"dummy",
5233e5af17bSbouyer 	"ecspi_root",
5243e5af17bSbouyer 	"gpu3d_axi",
5253e5af17bSbouyer 	"usdhc3",
5263e5af17bSbouyer 	"dummy",
5273e5af17bSbouyer 	"arm",
5283e5af17bSbouyer 	"ipu1",
5293e5af17bSbouyer 	"ipu2",
5303e5af17bSbouyer 	"vdo_axi",
5313e5af17bSbouyer 	"osc",
5323e5af17bSbouyer 	"gpu2d_core",
5333e5af17bSbouyer 	"gpu3d_core",
5343e5af17bSbouyer 	"usdhc2",
5353e5af17bSbouyer 	"ssi1",
5363e5af17bSbouyer 	"ssi2",
5373e5af17bSbouyer 	"ssi3",
5383e5af17bSbouyer 	"gpu3d_shader",
5393e5af17bSbouyer 	"vpu_axi",
5403e5af17bSbouyer 	"can_root",
5413e5af17bSbouyer 	"ldb_di0",
5423e5af17bSbouyer 	"ldb_di1",
5433e5af17bSbouyer 	"esai_extal",
5443e5af17bSbouyer 	"eim_slow",
5453e5af17bSbouyer 	"uart_serial",
5463e5af17bSbouyer 	"spdif",
5473e5af17bSbouyer 	"asrc",
5483e5af17bSbouyer 	"hsi_tx"
5493e5af17bSbouyer };
5503e5af17bSbouyer 
5513e5af17bSbouyer static const char *cko_p[] = {
5523e5af17bSbouyer 	"cko1",
5533e5af17bSbouyer 	"cko2"
5543e5af17bSbouyer };
5553e5af17bSbouyer 
5563e5af17bSbouyer static const char *hsi_tx_p[] = {
5573e5af17bSbouyer 	"pll3_120m",
5583e5af17bSbouyer 	"pll2_pfd2_396m"
5593e5af17bSbouyer };
5603e5af17bSbouyer 
5613e5af17bSbouyer static const char *pcie_axi_p[] = {
5623e5af17bSbouyer 	"axi",
5633e5af17bSbouyer 	"ahb"
5643e5af17bSbouyer };
5653e5af17bSbouyer 
5663e5af17bSbouyer static const char *ssi_p[] = {
5673e5af17bSbouyer 	"pll3_pfd2_508m",
5683e5af17bSbouyer 	"pll3_pfd3_454m",
5693e5af17bSbouyer 	"pll4_audio_div"
5703e5af17bSbouyer };
5713e5af17bSbouyer 
5723e5af17bSbouyer static const char *usdhc_p[] = {
5733e5af17bSbouyer 	"pll2_pfd2_396m",
5743e5af17bSbouyer 	"pll2_pfd0_352m"
5753e5af17bSbouyer };
5763e5af17bSbouyer 
5773e5af17bSbouyer static const char *eim_p[] = {
5783e5af17bSbouyer 	"pll2_pfd2_396m",
5793e5af17bSbouyer 	"pll3_usb_otg",
5803e5af17bSbouyer 	"axi",
5813e5af17bSbouyer 	"pll2_pfd0_352m"
5823e5af17bSbouyer };
5833e5af17bSbouyer 
5843e5af17bSbouyer static const char *eim_slow_p[] = {
5853e5af17bSbouyer 	"axi",
5863e5af17bSbouyer 	"pll3_usb_otg",
5873e5af17bSbouyer 	"pll2_pfd2_396m",
5883e5af17bSbouyer 	"pll2_pfd0_352m"
5893e5af17bSbouyer };
5903e5af17bSbouyer 
5913e5af17bSbouyer static const char *enfc_p[] = {
5923e5af17bSbouyer 	"pll2_pfd0_352m",
5933e5af17bSbouyer 	"pll2_bus",
5943e5af17bSbouyer 	"pll3_usb_otg",
5953e5af17bSbouyer 	"pll2_pfd2_396m"
5963e5af17bSbouyer };
5973e5af17bSbouyer 
5983e5af17bSbouyer static const char *lvds_p[] = {
5993e5af17bSbouyer 	"dummy",
6003e5af17bSbouyer 	"dummy",
6013e5af17bSbouyer 	"dummy",
6023e5af17bSbouyer 	"dummy",
6033e5af17bSbouyer 	"dummy",
6043e5af17bSbouyer 	"dummy",
6053e5af17bSbouyer 	"pll4_audio",
6063e5af17bSbouyer 	"pll5_video",
6073e5af17bSbouyer 	"pll8_mlb",
6083e5af17bSbouyer 	"enet_ref",
6093e5af17bSbouyer 	"pcie_ref_125m",
6103e5af17bSbouyer 	"sata_ref_100m"
6113e5af17bSbouyer };
6123e5af17bSbouyer 
6133e5af17bSbouyer /* DT clock ID to clock name mappings */
6143e5af17bSbouyer static struct imx_clock_id {
6153e5af17bSbouyer 	u_int		id;
6163e5af17bSbouyer 	const char	*name;
6173e5af17bSbouyer } imx6q_clock_ids[] = {
6183e5af17bSbouyer 	{ IMX6QCLK_DUMMY,		"dummy" },
6193e5af17bSbouyer 	{ IMX6QCLK_CKIL,		"ckil" },
620*97835a6fSskrll 	{ IMX6QCLK_CKIH,		"ckih1" },
6213e5af17bSbouyer 	{ IMX6QCLK_OSC,			"osc" },
6223e5af17bSbouyer 	{ IMX6QCLK_PLL2_PFD0_352M,	"pll2_pfd0_352m" },
6233e5af17bSbouyer 	{ IMX6QCLK_PLL2_PFD1_594M,	"pll2_pfd1_594m" },
6243e5af17bSbouyer 	{ IMX6QCLK_PLL2_PFD2_396M,	"pll2_pfd2_396m" },
6253e5af17bSbouyer 	{ IMX6QCLK_PLL3_PFD0_720M,	"pll3_pfd0_720m" },
6263e5af17bSbouyer 	{ IMX6QCLK_PLL3_PFD1_540M,	"pll3_pfd1_540m" },
6273e5af17bSbouyer 	{ IMX6QCLK_PLL3_PFD2_508M,	"pll3_pfd2_508m" },
6283e5af17bSbouyer 	{ IMX6QCLK_PLL3_PFD3_454M,	"pll3_pfd3_454m" },
6293e5af17bSbouyer 	{ IMX6QCLK_PLL2_198M,		"pll2_198m" },
6303e5af17bSbouyer 	{ IMX6QCLK_PLL3_120M,		"pll3_120m" },
6313e5af17bSbouyer 	{ IMX6QCLK_PLL3_80M,		"pll3_80m" },
6323e5af17bSbouyer 	{ IMX6QCLK_PLL3_60M,		"pll3_60m" },
6333e5af17bSbouyer 	{ IMX6QCLK_TWD,			"twd" },
6343e5af17bSbouyer 	{ IMX6QCLK_STEP,		"step" },
6353e5af17bSbouyer 	{ IMX6QCLK_PLL1_SW,		"pll1_sw" },
6363e5af17bSbouyer 	{ IMX6QCLK_PERIPH_PRE,		"periph_pre" },
6373e5af17bSbouyer 	{ IMX6QCLK_PERIPH2_PRE,		"periph2_pre" },
6383e5af17bSbouyer 	{ IMX6QCLK_PERIPH_CLK2_SEL,	"periph_clk2_sel" },
6393e5af17bSbouyer 	{ IMX6QCLK_PERIPH2_CLK2_SEL,	"periph2_clk2_sel" },
6403e5af17bSbouyer 	{ IMX6QCLK_AXI_SEL,		"axi_sel" },
6413e5af17bSbouyer 	{ IMX6QCLK_ESAI_SEL,		"esai_sel" },
6423e5af17bSbouyer 	{ IMX6QCLK_ASRC_SEL,		"asrc_sel" },
6433e5af17bSbouyer 	{ IMX6QCLK_SPDIF_SEL,		"spdif_sel" },
6443e5af17bSbouyer 	{ IMX6QCLK_GPU2D_AXI,		"gpu2d_axi" },
6453e5af17bSbouyer 	{ IMX6QCLK_GPU3D_AXI,		"gpu3d_axi" },
6463e5af17bSbouyer 	{ IMX6QCLK_GPU2D_CORE_SEL,	"gpu2d_core_sel" },
6473e5af17bSbouyer 	{ IMX6QCLK_GPU3D_CORE_SEL,	"gpu3d_core_sel" },
6483e5af17bSbouyer 	{ IMX6QCLK_GPU3D_SHADER_SEL,	"gpu3d_shader_sel" },
6493e5af17bSbouyer 	{ IMX6QCLK_IPU1_SEL,		"ipu1_sel" },
6503e5af17bSbouyer 	{ IMX6QCLK_IPU2_SEL,		"ipu2_sel" },
6513e5af17bSbouyer 	{ IMX6QCLK_LDB_DI0_SEL,		"ldb_di0_sel" },
6523e5af17bSbouyer 	{ IMX6QCLK_LDB_DI1_SEL,		"ldb_di1_sel" },
6533e5af17bSbouyer 	{ IMX6QCLK_IPU1_DI0_PRE_SEL,	"ipu1_di0_pre_sel" },
6543e5af17bSbouyer 	{ IMX6QCLK_IPU1_DI1_PRE_SEL,	"ipu1_di1_pre_sel" },
6553e5af17bSbouyer 	{ IMX6QCLK_IPU2_DI0_PRE_SEL,	"ipu2_di0_pre_sel" },
6563e5af17bSbouyer 	{ IMX6QCLK_IPU2_DI1_PRE_SEL,	"ipu2_di1_pre_sel" },
6573e5af17bSbouyer 	{ IMX6QCLK_IPU1_DI0_SEL,	"ipu1_di0_sel" },
6583e5af17bSbouyer 	{ IMX6QCLK_IPU1_DI1_SEL,	"ipu1_di1_sel" },
6593e5af17bSbouyer 	{ IMX6QCLK_IPU2_DI0_SEL,	"ipu2_di0_sel" },
6603e5af17bSbouyer 	{ IMX6QCLK_IPU2_DI1_SEL,	"ipu2_di1_sel" },
6613e5af17bSbouyer 	{ IMX6QCLK_HSI_TX_SEL,		"hsi_tx_sel" },
6623e5af17bSbouyer 	{ IMX6QCLK_PCIE_AXI_SEL,	"pcie_axi_sel" },
6633e5af17bSbouyer 	{ IMX6QCLK_SSI1_SEL,		"ssi1_sel" },
6643e5af17bSbouyer 	{ IMX6QCLK_SSI2_SEL,		"ssi2_sel" },
6653e5af17bSbouyer 	{ IMX6QCLK_SSI3_SEL,		"ssi3_sel" },
6663e5af17bSbouyer 	{ IMX6QCLK_USDHC1_SEL,		"usdhc1_sel" },
6673e5af17bSbouyer 	{ IMX6QCLK_USDHC2_SEL,		"usdhc2_sel" },
6683e5af17bSbouyer 	{ IMX6QCLK_USDHC3_SEL,		"usdhc3_sel" },
6693e5af17bSbouyer 	{ IMX6QCLK_USDHC4_SEL,		"usdhc4_sel" },
6703e5af17bSbouyer 	{ IMX6QCLK_ENFC_SEL,		"enfc_sel" },
6713e5af17bSbouyer 	{ IMX6QCLK_EIM_SEL,		"eim_sel" },
6723e5af17bSbouyer 	{ IMX6QCLK_EIM_SLOW_SEL,	"eim_slow_sel" },
6733e5af17bSbouyer 	{ IMX6QCLK_VDO_AXI_SEL,		"vdo_axi_sel" },
6743e5af17bSbouyer 	{ IMX6QCLK_VPU_AXI_SEL,		"vpu_axi_sel" },
6753e5af17bSbouyer 	{ IMX6QCLK_CKO1_SEL,		"cko1_sel" },
6763e5af17bSbouyer 	{ IMX6QCLK_PERIPH,		"periph" },
6773e5af17bSbouyer 	{ IMX6QCLK_PERIPH2,		"periph2" },
6783e5af17bSbouyer 	{ IMX6QCLK_PERIPH_CLK2,		"periph_clk2" },
6793e5af17bSbouyer 	{ IMX6QCLK_PERIPH2_CLK2,	"periph2_clk2" },
6803e5af17bSbouyer 	{ IMX6QCLK_IPG,			"ipg" },
6813e5af17bSbouyer 	{ IMX6QCLK_IPG_PER,		"ipg_per" },
6823e5af17bSbouyer 	{ IMX6QCLK_ESAI_PRED,		"esai_pred" },
6833e5af17bSbouyer 	{ IMX6QCLK_ESAI_PODF,		"esai_podf" },
6843e5af17bSbouyer 	{ IMX6QCLK_ASRC_PRED,		"asrc_pred" },
6853e5af17bSbouyer 	{ IMX6QCLK_ASRC_PODF,		"asrc_podf" },
6863e5af17bSbouyer 	{ IMX6QCLK_SPDIF_PRED,		"spdif_pred" },
6873e5af17bSbouyer 	{ IMX6QCLK_SPDIF_PODF,		"spdif_podf" },
6883e5af17bSbouyer 	{ IMX6QCLK_CAN_ROOT,		"can_root" },
6893e5af17bSbouyer 	{ IMX6QCLK_ECSPI_ROOT,		"ecspi_root" },
6903e5af17bSbouyer 	{ IMX6QCLK_GPU2D_CORE_PODF,	"gpu2d_core_podf" },
6913e5af17bSbouyer 	{ IMX6QCLK_GPU3D_CORE_PODF,	"gpu3d_core_podf" },
6923e5af17bSbouyer 	{ IMX6QCLK_GPU3D_SHADER,	"gpu3d_shader" },
6933e5af17bSbouyer 	{ IMX6QCLK_IPU1_PODF,		"ipu1_podf" },
6943e5af17bSbouyer 	{ IMX6QCLK_IPU2_PODF,		"ipu2_podf" },
6953e5af17bSbouyer 	{ IMX6QCLK_LDB_DI0_PODF,	"ldb_di0_podf" },
6963e5af17bSbouyer 	{ IMX6QCLK_LDB_DI1_PODF,	"ldb_di1_podf" },
6973e5af17bSbouyer 	{ IMX6QCLK_IPU1_DI0_PRE,	"ipu1_di0_pre" },
6983e5af17bSbouyer 	{ IMX6QCLK_IPU1_DI1_PRE,	"ipu1_di1_pre" },
6993e5af17bSbouyer 	{ IMX6QCLK_IPU2_DI0_PRE,	"ipu2_di0_pre" },
7003e5af17bSbouyer 	{ IMX6QCLK_IPU2_DI1_PRE,	"ipu2_di1_pre" },
7013e5af17bSbouyer 	{ IMX6QCLK_HSI_TX_PODF,		"hsi_tx_podf" },
7023e5af17bSbouyer 	{ IMX6QCLK_SSI1_PRED,		"ssi1_pred" },
7033e5af17bSbouyer 	{ IMX6QCLK_SSI1_PODF,		"ssi1_podf" },
7043e5af17bSbouyer 	{ IMX6QCLK_SSI2_PRED,		"ssi2_pred" },
7053e5af17bSbouyer 	{ IMX6QCLK_SSI2_PODF,		"ssi2_podf" },
7063e5af17bSbouyer 	{ IMX6QCLK_SSI3_PRED,		"ssi3_pred" },
7073e5af17bSbouyer 	{ IMX6QCLK_SSI3_PODF,		"ssi3_podf" },
7083e5af17bSbouyer 	{ IMX6QCLK_UART_SERIAL_PODF,	"uart_serial_podf" },
7093e5af17bSbouyer 	{ IMX6QCLK_USDHC1_PODF,		"usdhc1_podf" },
7103e5af17bSbouyer 	{ IMX6QCLK_USDHC2_PODF,		"usdhc2_podf" },
7113e5af17bSbouyer 	{ IMX6QCLK_USDHC3_PODF,		"usdhc3_podf" },
7123e5af17bSbouyer 	{ IMX6QCLK_USDHC4_PODF,		"usdhc4_podf" },
7133e5af17bSbouyer 	{ IMX6QCLK_ENFC_PRED,		"enfc_pred" },
7143e5af17bSbouyer 	{ IMX6QCLK_ENFC_PODF,		"enfc_podf" },
7153e5af17bSbouyer 	{ IMX6QCLK_EIM_PODF,		"eim_podf" },
7163e5af17bSbouyer 	{ IMX6QCLK_EIM_SLOW_PODF,	"eim_slow_podf" },
7173e5af17bSbouyer 	{ IMX6QCLK_VPU_AXI_PODF,	"vpu_axi_podf" },
7183e5af17bSbouyer 	{ IMX6QCLK_CKO1_PODF,		"cko1_podf" },
7193e5af17bSbouyer 	{ IMX6QCLK_AXI,			"axi" },
7203e5af17bSbouyer 	{ IMX6QCLK_MMDC_CH0_AXI_PODF,	"mmdc_ch0_axi_podf" },
7213e5af17bSbouyer 	{ IMX6QCLK_MMDC_CH1_AXI_PODF,	"mmdc_ch1_axi_podf" },
7223e5af17bSbouyer 	{ IMX6QCLK_ARM,			"arm" },
7233e5af17bSbouyer 	{ IMX6QCLK_AHB,			"ahb" },
7243e5af17bSbouyer 	{ IMX6QCLK_APBH_DMA,		"apbh_dma" },
7253e5af17bSbouyer 	{ IMX6QCLK_ASRC,		"asrc" },
7263e5af17bSbouyer 	{ IMX6QCLK_CAN1_IPG,		"can1_ipg" },
7273e5af17bSbouyer 	{ IMX6QCLK_CAN1_SERIAL,		"can1_serial" },
7283e5af17bSbouyer 	{ IMX6QCLK_CAN2_IPG,		"can2_ipg" },
7293e5af17bSbouyer 	{ IMX6QCLK_CAN2_SERIAL,		"can2_serial" },
7303e5af17bSbouyer 	{ IMX6QCLK_ECSPI1,		"ecspi1" },
7313e5af17bSbouyer 	{ IMX6QCLK_ECSPI2,		"ecspi2" },
7323e5af17bSbouyer 	{ IMX6QCLK_ECSPI3,		"ecspi3" },
7333e5af17bSbouyer 	{ IMX6QCLK_ECSPI4,		"ecspi4" },
7343e5af17bSbouyer 	{ IMX6QCLK_ECSPI5,		"ecspi5" },
7353e5af17bSbouyer 	{ IMX6QCLK_ENET,		"enet" },
7363e5af17bSbouyer 	{ IMX6QCLK_ESAI_EXTAL,		"esai_extal" },
7373e5af17bSbouyer 	{ IMX6QCLK_GPT_IPG,		"gpt_ipg" },
7383e5af17bSbouyer 	{ IMX6QCLK_GPT_IPG_PER,		"gpt_ipg_per" },
7393e5af17bSbouyer 	{ IMX6QCLK_GPU2D_CORE,		"gpu2d_core" },
7403e5af17bSbouyer 	{ IMX6QCLK_GPU3D_CORE,		"gpu3d_core" },
7413e5af17bSbouyer 	{ IMX6QCLK_HDMI_IAHB,		"hdmi_iahb" },
7423e5af17bSbouyer 	{ IMX6QCLK_HDMI_ISFR,		"hdmi_isfr" },
7433e5af17bSbouyer 	{ IMX6QCLK_I2C1,		"i2c1" },
7443e5af17bSbouyer 	{ IMX6QCLK_I2C2,		"i2c2" },
7453e5af17bSbouyer 	{ IMX6QCLK_I2C3,		"i2c3" },
7463e5af17bSbouyer 	{ IMX6QCLK_IIM,			"iim" },
7473e5af17bSbouyer 	{ IMX6QCLK_ENFC,		"enfc" },
7483e5af17bSbouyer 	{ IMX6QCLK_IPU1,		"ipu1" },
7493e5af17bSbouyer 	{ IMX6QCLK_IPU1_DI0,		"ipu1_di0" },
7503e5af17bSbouyer 	{ IMX6QCLK_IPU1_DI1,		"ipu1_di1" },
7513e5af17bSbouyer 	{ IMX6QCLK_IPU2,		"ipu2" },
7523e5af17bSbouyer 	{ IMX6QCLK_IPU2_DI0,		"ipu2_di0" },
7533e5af17bSbouyer 	{ IMX6QCLK_LDB_DI0,		"ldb_di0" },
7543e5af17bSbouyer 	{ IMX6QCLK_LDB_DI1,		"ldb_di1" },
7553e5af17bSbouyer 	{ IMX6QCLK_IPU2_DI1,		"ipu2_di1" },
7563e5af17bSbouyer 	{ IMX6QCLK_HSI_TX,		"hsi_tx" },
7573e5af17bSbouyer 	{ IMX6QCLK_MLB,			"mlb" },
7583e5af17bSbouyer 	{ IMX6QCLK_MMDC_CH0_AXI,	"mmdc_ch0_axi" },
7593e5af17bSbouyer 	{ IMX6QCLK_MMDC_CH1_AXI,	"mmdc_ch1_axi" },
7603e5af17bSbouyer 	{ IMX6QCLK_OCRAM,		"ocram" },
7613e5af17bSbouyer 	{ IMX6QCLK_OPENVG_AXI,		"openvg_axi" },
7623e5af17bSbouyer 	{ IMX6QCLK_PCIE_AXI,		"pcie_axi" },
7633e5af17bSbouyer 	{ IMX6QCLK_PWM1,		"pwm1" },
7643e5af17bSbouyer 	{ IMX6QCLK_PWM2,		"pwm2" },
7653e5af17bSbouyer 	{ IMX6QCLK_PWM3,		"pwm3" },
7663e5af17bSbouyer 	{ IMX6QCLK_PWM4,		"pwm4" },
7673e5af17bSbouyer 	{ IMX6QCLK_PER1_BCH,		"per1_bch" },
7683e5af17bSbouyer 	{ IMX6QCLK_GPMI_BCH_APB,	"gpmi_bch_apb" },
7693e5af17bSbouyer 	{ IMX6QCLK_GPMI_BCH,		"gpmi_bch" },
7703e5af17bSbouyer 	{ IMX6QCLK_GPMI_IO,		"gpmi_io" },
7713e5af17bSbouyer 	{ IMX6QCLK_GPMI_APB,		"gpmi_apb" },
7723e5af17bSbouyer 	{ IMX6QCLK_SATA,		"sata" },
7733e5af17bSbouyer 	{ IMX6QCLK_SDMA,		"sdma" },
7743e5af17bSbouyer 	{ IMX6QCLK_SPBA,		"spba" },
7753e5af17bSbouyer 	{ IMX6QCLK_SSI1,		"ssi1" },
7763e5af17bSbouyer 	{ IMX6QCLK_SSI2,		"ssi2" },
7773e5af17bSbouyer 	{ IMX6QCLK_SSI3,		"ssi3" },
7783e5af17bSbouyer 	{ IMX6QCLK_UART_IPG,		"uart_ipg" },
7793e5af17bSbouyer 	{ IMX6QCLK_UART_SERIAL,		"uart_serial" },
7803e5af17bSbouyer 	{ IMX6QCLK_USBOH3,		"usboh3" },
7813e5af17bSbouyer 	{ IMX6QCLK_USDHC1,		"usdhc1" },
7823e5af17bSbouyer 	{ IMX6QCLK_USDHC2,		"usdhc2" },
7833e5af17bSbouyer 	{ IMX6QCLK_USDHC3,		"usdhc3" },
7843e5af17bSbouyer 	{ IMX6QCLK_USDHC4,		"usdhc4" },
7853e5af17bSbouyer 	{ IMX6QCLK_VDO_AXI,		"vdo_axi" },
7863e5af17bSbouyer 	{ IMX6QCLK_VPU_AXI,		"vpu_axi" },
7873e5af17bSbouyer 	{ IMX6QCLK_CKO1,		"cko1" },
7883e5af17bSbouyer 	{ IMX6QCLK_PLL1_SYS,		"pll1_sys" },
7893e5af17bSbouyer 	{ IMX6QCLK_PLL2_BUS,		"pll2_bus" },
7903e5af17bSbouyer 	{ IMX6QCLK_PLL3_USB_OTG,	"pll3_usb_otg" },
7913e5af17bSbouyer 	{ IMX6QCLK_PLL4_AUDIO,		"pll4_audio" },
7923e5af17bSbouyer 	{ IMX6QCLK_PLL5_VIDEO,		"pll5_video" },
7933e5af17bSbouyer 	{ IMX6QCLK_PLL8_MLB,		"pll8_mlb" },
7943e5af17bSbouyer 	{ IMX6QCLK_PLL7_USB_HOST,	"pll7_usb_host" },
7953e5af17bSbouyer 	{ IMX6QCLK_PLL6_ENET,		"pll6_enet" },
7963e5af17bSbouyer 	{ IMX6QCLK_SSI1_IPG,		"ssi1_ipg" },
7973e5af17bSbouyer 	{ IMX6QCLK_SSI2_IPG,		"ssi2_ipg" },
7983e5af17bSbouyer 	{ IMX6QCLK_SSI3_IPG,		"ssi3_ipg" },
7993e5af17bSbouyer 	{ IMX6QCLK_ROM,			"rom" },
8003e5af17bSbouyer 	{ IMX6QCLK_USBPHY1,		"usbphy1" },
8013e5af17bSbouyer 	{ IMX6QCLK_USBPHY2,		"usbphy2" },
8023e5af17bSbouyer 	{ IMX6QCLK_LDB_DI0_DIV_3_5,	"ldb_di0_div_3_5" },
8033e5af17bSbouyer 	{ IMX6QCLK_LDB_DI1_DIV_3_5,	"ldb_di1_div_3_5" },
8043e5af17bSbouyer 	{ IMX6QCLK_SATA_REF,		"sata_ref" },
8053e5af17bSbouyer 	{ IMX6QCLK_SATA_REF_100M,	"sata_ref_100m" },
8063e5af17bSbouyer 	{ IMX6QCLK_PCIE_REF,		"pcie_ref" },
8073e5af17bSbouyer 	{ IMX6QCLK_PCIE_REF_125M,	"pcie_ref_125m" },
8083e5af17bSbouyer 	{ IMX6QCLK_ENET_REF,		"enet_ref" },
8093e5af17bSbouyer 	{ IMX6QCLK_USBPHY1_GATE,	"usbphy1_gate" },
8103e5af17bSbouyer 	{ IMX6QCLK_USBPHY2_GATE,	"usbphy2_gate" },
8113e5af17bSbouyer 	{ IMX6QCLK_PLL4_POST_DIV,	"pll4_post_div" },
8123e5af17bSbouyer 	{ IMX6QCLK_PLL5_POST_DIV,	"pll5_post_div" },
8133e5af17bSbouyer 	{ IMX6QCLK_PLL5_VIDEO_DIV,	"pll5_video_div" },
8143e5af17bSbouyer 	{ IMX6QCLK_EIM_SLOW,		"eim_slow" },
8153e5af17bSbouyer 	{ IMX6QCLK_SPDIF,		"spdif" },
8163e5af17bSbouyer 	{ IMX6QCLK_CKO2_SEL,		"cko2_sel" },
8173e5af17bSbouyer 	{ IMX6QCLK_CKO2_PODF,		"cko2_podf" },
8183e5af17bSbouyer 	{ IMX6QCLK_CKO2,		"cko2" },
8193e5af17bSbouyer 	{ IMX6QCLK_CKO,			"cko" },
8203e5af17bSbouyer 	{ IMX6QCLK_VDOA,		"vdoa" },
8213e5af17bSbouyer 	{ IMX6QCLK_PLL4_AUDIO_DIV,	"pll4_audio_div" },
8223e5af17bSbouyer 	{ IMX6QCLK_LVDS1_SEL,		"lvds1_sel" },
8233e5af17bSbouyer 	{ IMX6QCLK_LVDS2_SEL,		"lvds2_sel" },
8243e5af17bSbouyer 	{ IMX6QCLK_LVDS1_GATE,		"lvds1_gate" },
8253e5af17bSbouyer 	{ IMX6QCLK_LVDS2_GATE,		"lvds2_gate" },
8263e5af17bSbouyer 	{ IMX6QCLK_ESAI_IPG,		"esai_ipg" },
8273e5af17bSbouyer 	{ IMX6QCLK_ESAI_MEM,		"esai_mem" },
8283e5af17bSbouyer 	{ IMX6QCLK_ASRC_IPG,		"asrc_ipg" },
8293e5af17bSbouyer 	{ IMX6QCLK_ASRC_MEM,		"asrc_mem" },
8303e5af17bSbouyer 	{ IMX6QCLK_LVDS1_IN,		"lvds1_in" },
8313e5af17bSbouyer 	{ IMX6QCLK_LVDS2_IN,		"lvds2_in" },
8323e5af17bSbouyer 	{ IMX6QCLK_ANACLK1,		"anaclk1" },
8333e5af17bSbouyer 	{ IMX6QCLK_ANACLK2,		"anaclk2" },
8343e5af17bSbouyer 	{ IMX6QCLK_PLL1_BYPASS_SRC,	"pll1_bypass_src" },
8353e5af17bSbouyer 	{ IMX6QCLK_PLL2_BYPASS_SRC,	"pll2_bypass_src" },
8363e5af17bSbouyer 	{ IMX6QCLK_PLL3_BYPASS_SRC,	"pll3_bypass_src" },
8373e5af17bSbouyer 	{ IMX6QCLK_PLL4_BYPASS_SRC,	"pll4_bypass_src" },
8383e5af17bSbouyer 	{ IMX6QCLK_PLL5_BYPASS_SRC,	"pll5_bypass_src" },
8393e5af17bSbouyer 	{ IMX6QCLK_PLL6_BYPASS_SRC,	"pll6_bypass_src" },
8403e5af17bSbouyer 	{ IMX6QCLK_PLL7_BYPASS_SRC,	"pll7_bypass_src" },
8413e5af17bSbouyer 	{ IMX6QCLK_PLL1,		"pll1" },
8423e5af17bSbouyer 	{ IMX6QCLK_PLL2,		"pll2" },
8433e5af17bSbouyer 	{ IMX6QCLK_PLL3,		"pll3" },
8443e5af17bSbouyer 	{ IMX6QCLK_PLL4,		"pll4" },
8453e5af17bSbouyer 	{ IMX6QCLK_PLL5,		"pll5" },
8463e5af17bSbouyer 	{ IMX6QCLK_PLL6,		"pll6" },
8473e5af17bSbouyer 	{ IMX6QCLK_PLL7,		"pll7" },
8483e5af17bSbouyer 	{ IMX6QCLK_PLL1_BYPASS,		"pll1_bypass" },
8493e5af17bSbouyer 	{ IMX6QCLK_PLL2_BYPASS,		"pll2_bypass" },
8503e5af17bSbouyer 	{ IMX6QCLK_PLL3_BYPASS,		"pll3_bypass" },
8513e5af17bSbouyer 	{ IMX6QCLK_PLL4_BYPASS,		"pll4_bypass" },
8523e5af17bSbouyer 	{ IMX6QCLK_PLL5_BYPASS,		"pll5_bypass" },
8533e5af17bSbouyer 	{ IMX6QCLK_PLL6_BYPASS,		"pll6_bypass" },
8543e5af17bSbouyer 	{ IMX6QCLK_PLL7_BYPASS,		"pll7_bypass" },
8553e5af17bSbouyer 	{ IMX6QCLK_GPT_3M,		"gpt_3m" },
8563e5af17bSbouyer 	{ IMX6QCLK_VIDEO_27M,		"video_27m" },
8573e5af17bSbouyer 	{ IMX6QCLK_MIPI_CORE_CFG,	"mipi_core_cfg" },
8583e5af17bSbouyer 	{ IMX6QCLK_MIPI_IPG,		"mipi_ipg" },
8593e5af17bSbouyer 	{ IMX6QCLK_CAAM_MEM,		"caam_mem" },
8603e5af17bSbouyer 	{ IMX6QCLK_CAAM_ACLK,		"caam_aclk" },
8613e5af17bSbouyer 	{ IMX6QCLK_CAAM_IPG,		"caam_ipg" },
8623e5af17bSbouyer 	{ IMX6QCLK_SPDIF_GCLK,		"spdif_gclk" },
8633e5af17bSbouyer 	{ IMX6QCLK_UART_SEL,		"uart_sel" },
8643e5af17bSbouyer 	{ IMX6QCLK_IPG_PER_SEL,		"ipg_per_sel" },
8653e5af17bSbouyer 	{ IMX6QCLK_ECSPI_SEL,		"ecspi_sel" },
8663e5af17bSbouyer 	{ IMX6QCLK_CAN_SEL,		"can_sel" },
8673e5af17bSbouyer 	{ IMX6QCLK_MMDC_CH1_AXI_CG,	"mmdc_ch1_axi_cg" },
8683e5af17bSbouyer 	{ IMX6QCLK_PRE0,		"pre0" },
8693e5af17bSbouyer 	{ IMX6QCLK_PRE1,		"pre1" },
8703e5af17bSbouyer 	{ IMX6QCLK_PRE2,		"pre2" },
8713e5af17bSbouyer 	{ IMX6QCLK_PRE3,		"pre3" },
8723e5af17bSbouyer 	{ IMX6QCLK_PRG0_AXI,		"prg0_axi" },
8733e5af17bSbouyer 	{ IMX6QCLK_PRG1_AXI,		"prg1_axi" },
8743e5af17bSbouyer 	{ IMX6QCLK_PRG0_APB,		"prg0_apb" },
8753e5af17bSbouyer 	{ IMX6QCLK_PRG1_APB,		"prg1_apb" },
8763e5af17bSbouyer 	{ IMX6QCLK_PRE_AXI,		"pre_axi" },
8773e5af17bSbouyer 	{ IMX6QCLK_MLB_SEL,		"mlb_sel" },
8783e5af17bSbouyer 	{ IMX6QCLK_MLB_PODF,		"mlb_podf" },
8793e5af17bSbouyer 	{ IMX6QCLK_END,			"end" },
8803e5af17bSbouyer };
8813e5af17bSbouyer 
8823e5af17bSbouyer /* Clock Divider Tables */
8833e5af17bSbouyer static const int enet_ref_tbl[] = { 20, 10, 5, 4, 0 };
8843e5af17bSbouyer static const int post_div_tbl[] = { 4, 2, 1, 0 };
8853e5af17bSbouyer static const int audiovideo_div_tbl[] = { 1, 2, 1, 4, 0 };
8863e5af17bSbouyer 
8873e5af17bSbouyer static struct imx6_clk imx6q_clks[] = {
8883e5af17bSbouyer 	CLK_FIXED("dummy", 0),
8893e5af17bSbouyer 
8903e5af17bSbouyer 	CLK_FIXED("ckil", IMX6_CKIL_FREQ),
891*97835a6fSskrll 	CLK_FIXED("ckih1", IMX6_CKIH_FREQ),
8923e5af17bSbouyer 	CLK_FIXED("osc", IMX6_OSC_FREQ),
8933e5af17bSbouyer 	CLK_FIXED("anaclk1", IMX6_ANACLK1_FREQ),
8943e5af17bSbouyer 	CLK_FIXED("anaclk2", IMX6_ANACLK2_FREQ),
8953e5af17bSbouyer 
8963e5af17bSbouyer 	CLK_FIXED_FACTOR("sata_ref", "pll6_enet", 5, 1),
8973e5af17bSbouyer 	CLK_FIXED_FACTOR("pcie_ref", "pll6_enet", 4, 1),
8983e5af17bSbouyer 	CLK_FIXED_FACTOR("pll2_198m", "pll2_pfd2_396m", 2, 1),
8993e5af17bSbouyer 	CLK_FIXED_FACTOR("pll3_120m", "pll3_usb_otg", 4, 1),
9003e5af17bSbouyer 	CLK_FIXED_FACTOR("pll3_80m", "pll3_usb_otg", 6, 1),
9013e5af17bSbouyer 	CLK_FIXED_FACTOR("pll3_60m", "pll3_usb_otg", 8, 1),
9023e5af17bSbouyer 	CLK_FIXED_FACTOR("twd", "arm", 2, 1),
9033e5af17bSbouyer 	CLK_FIXED_FACTOR("gpt_3m", "osc", 8, 1),
9043e5af17bSbouyer 	CLK_FIXED_FACTOR("video_27m", "pll3_pfd1_540m", 20, 1),
9053e5af17bSbouyer 	CLK_FIXED_FACTOR("gpu2d_axi", "mmdc_ch0_axi_podf", 1, 1),
9063e5af17bSbouyer 	CLK_FIXED_FACTOR("gpu3d_axi", "mmdc_ch0_axi_podf", 1, 1),
9073e5af17bSbouyer 	CLK_FIXED_FACTOR("ldb_di0_div_3_5", "ldb_di0_sel", 7, 2),
9083e5af17bSbouyer 	CLK_FIXED_FACTOR("ldb_di1_div_3_5", "ldb_di1_sel", 7, 2),
9093e5af17bSbouyer 
9103e5af17bSbouyer 	CLK_PFD("pll2_pfd0_352m", "pll2_bus", PFD_528, 0),
9113e5af17bSbouyer 	CLK_PFD("pll2_pfd1_594m", "pll2_bus", PFD_528, 1),
9123e5af17bSbouyer 	CLK_PFD("pll2_pfd2_396m", "pll2_bus", PFD_528, 2),
9133e5af17bSbouyer 	CLK_PFD("pll3_pfd0_720m", "pll3_usb_otg", PFD_480, 0),
9143e5af17bSbouyer 	CLK_PFD("pll3_pfd1_540m", "pll3_usb_otg", PFD_480, 1),
9153e5af17bSbouyer 	CLK_PFD("pll3_pfd2_508m", "pll3_usb_otg", PFD_480, 2),
9163e5af17bSbouyer 	CLK_PFD("pll3_pfd3_454m", "pll3_usb_otg", PFD_480, 3),
9173e5af17bSbouyer 
9183e5af17bSbouyer 	CLK_PLL("pll1", "osc", SYS, PLL_ARM, DIV_SELECT, POWERDOWN, 0),
9193e5af17bSbouyer 	CLK_PLL("pll2", "osc", GENERIC, PLL_SYS, DIV_SELECT, POWERDOWN, 0),
9203e5af17bSbouyer 	CLK_PLL("pll3", "osc", USB, PLL_USB1, DIV_SELECT, POWER, 0),
9213e5af17bSbouyer 	CLK_PLL("pll4", "osc", AUDIO_VIDEO, PLL_AUDIO, DIV_SELECT, POWERDOWN, 0),
9223e5af17bSbouyer 	CLK_PLL("pll5", "osc", AUDIO_VIDEO, PLL_VIDEO, DIV_SELECT, POWERDOWN, 0),
9233e5af17bSbouyer 	CLK_PLL("pll6", "osc", ENET, PLL_ENET, DIV_SELECT, POWERDOWN, 500000000),
9243e5af17bSbouyer 	CLK_PLL("pll7", "osc", USB, PLL_USB2, DIV_SELECT, POWER, 0),
9253e5af17bSbouyer 
9263e5af17bSbouyer 	CLK_DIV("periph_clk2", "periph_clk2_sel", CBCDR, PERIPH_CLK2_PODF),
9273e5af17bSbouyer 	CLK_DIV("periph2_clk2", "periph2_clk2_sel", CBCDR, PERIPH2_CLK2_PODF),
9283e5af17bSbouyer 	CLK_DIV("ipg", "ahb", CBCDR, IPG_PODF),
9293e5af17bSbouyer 	CLK_DIV("esai_pred", "esai_sel", CS1CDR, ESAI_CLK_PRED),
9303e5af17bSbouyer 	CLK_DIV("esai_podf", "esai_pred", CS1CDR, ESAI_CLK_PODF),
9313e5af17bSbouyer 	CLK_DIV("asrc_pred", "asrc_sel", CDCDR, SPDIF1_CLK_PRED),
9323e5af17bSbouyer 	CLK_DIV("asrc_podf", "asrc_pred", CDCDR, SPDIF1_CLK_PODF),
9333e5af17bSbouyer 	CLK_DIV("spdif_pred", "spdif_sel", CDCDR, SPDIF0_CLK_PRED),
9343e5af17bSbouyer 	CLK_DIV("spdif_podf", "spdif_pred", CDCDR, SPDIF0_CLK_PODF),
9353e5af17bSbouyer 	CLK_DIV("ecspi_root", "pll3_60m", CSCDR2, ECSPI_CLK_PODF),
9363e5af17bSbouyer 	CLK_DIV("can_root", "pll3_60m", CSCMR2, CAN_CLK_PODF),
9373e5af17bSbouyer 	CLK_DIV("uart_serial_podf", "pll3_80m", CSCDR1, UART_CLK_PODF),
9383e5af17bSbouyer 	CLK_DIV("gpu2d_core_podf", "gpu2d_core_sel", CBCMR, GPU2D_CORE_CLK_PODF),
9393e5af17bSbouyer 	CLK_DIV("gpu3d_core_podf", "gpu3d_core_sel", CBCMR, GPU3D_CORE_PODF),
9403e5af17bSbouyer 	CLK_DIV("gpu3d_shader", "gpu3d_shader_sel", CBCMR, GPU3D_SHADER_PODF),
9413e5af17bSbouyer 	CLK_DIV("ipu1_podf", "ipu1_sel", CSCDR3, IPU1_HSP_PODF),
9423e5af17bSbouyer 	CLK_DIV("ipu2_podf", "ipu2_sel", CSCDR3, IPU2_HSP_PODF),
9433e5af17bSbouyer 	CLK_DIV("ldb_di0_podf", "ldb_di0_div_3_5", CSCMR2, LDB_DI0_IPU_DIV),
9443e5af17bSbouyer 	CLK_DIV("ldb_di1_podf", "ldb_di1_div_3_5", CSCMR2, LDB_DI1_IPU_DIV),
9453e5af17bSbouyer 	CLK_DIV("ipu1_di0_pre", "ipu1_di0_pre_sel", CHSCCDR, IPU1_DI0_PODF),
9463e5af17bSbouyer 	CLK_DIV("ipu1_di1_pre", "ipu1_di1_pre_sel", CHSCCDR, IPU1_DI1_PODF),
9473e5af17bSbouyer 	CLK_DIV("ipu2_di0_pre", "ipu2_di0_pre_sel", CSCDR2, IPU2_DI0_PODF),
9483e5af17bSbouyer 	CLK_DIV("ipu2_di1_pre", "ipu2_di1_pre_sel", CSCDR2, IPU2_DI1_PODF),
9493e5af17bSbouyer 	CLK_DIV("hsi_tx_podf", "hsi_tx_sel", CDCDR, HSI_TX_PODF),
9503e5af17bSbouyer 	CLK_DIV("ssi1_pred", "ssi1_sel", CS1CDR, SSI1_CLK_PRED),
9513e5af17bSbouyer 	CLK_DIV("ssi1_podf", "ssi1_pred", CS1CDR, SSI1_CLK_PODF),
9523e5af17bSbouyer 	CLK_DIV("ssi2_pred", "ssi2_sel", CS2CDR, SSI2_CLK_PRED),
9533e5af17bSbouyer 	CLK_DIV("ssi2_podf", "ssi2_pred", CS2CDR, SSI2_CLK_PODF),
9543e5af17bSbouyer 	CLK_DIV("ssi3_pred", "ssi3_sel", CS1CDR, SSI3_CLK_PRED),
9553e5af17bSbouyer 	CLK_DIV("ssi3_podf", "ssi3_pred", CS1CDR, SSI3_CLK_PODF),
9563e5af17bSbouyer 	CLK_DIV("usdhc1_podf", "usdhc1_sel", CSCDR1, USDHC1_PODF),
9573e5af17bSbouyer 	CLK_DIV("usdhc2_podf", "usdhc2_sel", CSCDR1, USDHC2_PODF),
9583e5af17bSbouyer 	CLK_DIV("usdhc3_podf", "usdhc3_sel", CSCDR1, USDHC3_PODF),
9593e5af17bSbouyer 	CLK_DIV("usdhc4_podf", "usdhc4_sel", CSCDR1, USDHC4_PODF),
9603e5af17bSbouyer 	CLK_DIV("enfc_pred", "enfc_sel", CS2CDR, ENFC_CLK_PRED),
9613e5af17bSbouyer 	CLK_DIV("enfc_podf", "enfc_pred", CS2CDR, ENFC_CLK_PODF),
9623e5af17bSbouyer 	CLK_DIV("vpu_axi_podf", "vpu_axi_sel", CSCDR1, VPU_AXI_PODF),
9633e5af17bSbouyer 	CLK_DIV("cko1_podf", "cko1_sel", CCOSR, CLKO1_DIV),
9643e5af17bSbouyer 	CLK_DIV("cko2_podf", "cko2_sel", CCOSR, CLKO2_DIV),
9653e5af17bSbouyer 	CLK_DIV("ipg_per", "ipg", CSCMR1, PERCLK_PODF),
9663e5af17bSbouyer 	CLK_DIV("eim_podf", "eim_sel", CSCMR1, ACLK_PODF),
9673e5af17bSbouyer 	CLK_DIV("eim_slow_podf", "eim_slow_sel", CSCMR1, ACLK_EIM_SLOW_PODF),
9683e5af17bSbouyer 
9693e5af17bSbouyer 	CLK_DIV_BUSY("axi", "axi_sel", CBCDR, AXI_PODF, CDHIPR, AXI_PODF_BUSY),
9703e5af17bSbouyer 	CLK_DIV_BUSY("mmdc_ch0_axi_podf", "periph", CBCDR, MMDC_CH0_AXI_PODF, CDHIPR, MMDC_CH0_PODF_BUSY),
9713e5af17bSbouyer 	CLK_DIV_BUSY("mmdc_ch1_axi_podf", "periph2", CBCDR, MMDC_CH1_AXI_PODF, CDHIPR, MMDC_CH1_PODF_BUSY),
9723e5af17bSbouyer 	CLK_DIV_BUSY("arm", "pll1_sw", CACRR, ARM_PODF, CDHIPR, ARM_PODF_BUSY),
9733e5af17bSbouyer 	CLK_DIV_BUSY("ahb", "periph", CBCDR, AHB_PODF, CDHIPR, AHB_PODF_BUSY),
9743e5af17bSbouyer 
9753e5af17bSbouyer 	CLK_DIV_TABLE("pll4_post_div", "pll4_audio", PLL_AUDIO, POST_DIV_SELECT, post_div_tbl),
9763e5af17bSbouyer 	CLK_DIV_TABLE("pll4_audio_div", "pll4_post_div", MISC2, AUDIO_DIV_LSB, audiovideo_div_tbl),
9773e5af17bSbouyer 	CLK_DIV_TABLE("pll5_post_div", "pll5_video", PLL_VIDEO, POST_DIV_SELECT, post_div_tbl),
9783e5af17bSbouyer 	CLK_DIV_TABLE("pll5_video_div", "pll5_post_div", MISC2, VIDEO_DIV, audiovideo_div_tbl),
9793e5af17bSbouyer 	CLK_DIV_TABLE("enet_ref", "pll6_enet", PLL_ENET, DIV_SELECT, enet_ref_tbl),
9803e5af17bSbouyer 
9813e5af17bSbouyer 	CLK_MUX("step", step_p, CCM, CCSR, STEP_SEL),
9823e5af17bSbouyer 	CLK_MUX("pll1_sw", pll1_sw_p, CCM, CCSR, PLL1_SW_CLK_SEL),
9833e5af17bSbouyer 	CLK_MUX("periph_pre", periph_pre_p, CCM, CBCMR, PRE_PERIPH_CLK_SEL),
9843e5af17bSbouyer 	CLK_MUX("periph2_pre", periph_pre_p, CCM, CBCMR, PRE_PERIPH2_CLK_SEL),
9853e5af17bSbouyer 	CLK_MUX("periph_clk2_sel", periph_clk2_p, CCM,CBCMR, PERIPH_CLK2_SEL),
9863e5af17bSbouyer 	CLK_MUX("periph2_clk2_sel", periph2_clk2_p, CCM,CBCMR, PERIPH2_CLK2_SEL),
9873e5af17bSbouyer 	CLK_MUX("axi_sel", axi_p, CCM, CBCDR, AXI_SEL),
9883e5af17bSbouyer 	CLK_MUX("asrc_sel", audio_p, CCM, CDCDR, SPDIF1_CLK_SEL),
9893e5af17bSbouyer 	CLK_MUX("spdif_sel", audio_p, CCM, CDCDR, SPDIF0_CLK_SEL),
9903e5af17bSbouyer 	CLK_MUX("gpu2d_core_sel", gpu2d_core_p, CCM, CBCMR, GPU2D_CLK_SEL),
9913e5af17bSbouyer 	CLK_MUX("gpu3d_core_sel", gpu3d_core_p, CCM, CBCMR, GPU3D_CORE_CLK_SEL),
9923e5af17bSbouyer 	CLK_MUX("gpu3d_shader_sel", gpu3d_shader_p, CCM,CBCMR, GPU3D_SHADER_CLK_SEL),
9933e5af17bSbouyer 	CLK_MUX("esai_sel", audio_p, CCM, CSCMR2, ESAI_CLK_SEL),
9943e5af17bSbouyer 	CLK_MUX("ipu1_sel", ipu_p, CCM, CSCDR3, IPU1_HSP_CLK_SEL),
9953e5af17bSbouyer 	CLK_MUX("ipu2_sel", ipu_p, CCM, CSCDR3, IPU2_HSP_CLK_SEL),
9963e5af17bSbouyer 	CLK_MUX("ipu1_di0_pre_sel", ipu_di_pre_p, CCM, CHSCCDR, IPU1_DI0_PRE_CLK_SEL),
9973e5af17bSbouyer 	CLK_MUX("ipu1_di1_pre_sel", ipu_di_pre_p, CCM, CHSCCDR, IPU1_DI1_PRE_CLK_SEL),
9983e5af17bSbouyer 	CLK_MUX("ipu2_di0_pre_sel", ipu_di_pre_p, CCM, CSCDR2, IPU2_DI0_PRE_CLK_SEL),
9993e5af17bSbouyer 	CLK_MUX("ipu2_di1_pre_sel", ipu_di_pre_p, CCM, CSCDR2, IPU2_DI1_PRE_CLK_SEL),
10003e5af17bSbouyer 	CLK_MUX("ipu1_di0_sel", ipu1_di0_p, CCM, CHSCCDR, IPU1_DI0_CLK_SEL),
10013e5af17bSbouyer 	CLK_MUX("ipu1_di1_sel", ipu1_di1_p, CCM, CHSCCDR, IPU1_DI1_CLK_SEL),
10023e5af17bSbouyer 	CLK_MUX("ipu2_di0_sel", ipu2_di0_p, CCM, CSCDR2, IPU2_DI0_CLK_SEL),
10033e5af17bSbouyer 	CLK_MUX("ipu2_di1_sel", ipu2_di1_p, CCM, CSCDR2, IPU2_DI1_CLK_SEL),
10043e5af17bSbouyer 	CLK_MUX("ldb_di0_sel", ldb_di_p, CCM, CS2CDR, LDB_DI0_CLK_SEL),
10053e5af17bSbouyer 	CLK_MUX("ldb_di1_sel", ldb_di_p, CCM, CS2CDR, LDB_DI1_CLK_SEL),
10063e5af17bSbouyer 	CLK_MUX("vdo_axi_sel", vdo_axi_p, CCM, CBCMR, VDOAXI_CLK_SEL),
10073e5af17bSbouyer 	CLK_MUX("vpu_axi_sel", vpu_axi_p, CCM, CBCMR, VPU_AXI_CLK_SEL),
10083e5af17bSbouyer 	CLK_MUX("cko1_sel", cko1_p, CCM, CCOSR, CLKO1_SEL),
10093e5af17bSbouyer 	CLK_MUX("cko2_sel", cko2_p, CCM, CCOSR, CLKO2_SEL),
10103e5af17bSbouyer 	CLK_MUX("cko", cko_p, CCM, CCOSR, CLK_OUT_SEL),
10113e5af17bSbouyer 	CLK_MUX("hsi_tx_sel", hsi_tx_p, CCM, CDCDR, HSI_TX_CLK_SEL),
10123e5af17bSbouyer 	CLK_MUX("pcie_axi_sel", pcie_axi_p, CCM, CBCMR, PCIE_AXI_CLK_SEL),
10133e5af17bSbouyer 	CLK_MUX("ssi1_sel", ssi_p, CCM, CSCMR1, SSI1_CLK_SEL),
10143e5af17bSbouyer 	CLK_MUX("ssi2_sel", ssi_p, CCM, CSCMR1, SSI2_CLK_SEL),
10153e5af17bSbouyer 	CLK_MUX("ssi3_sel", ssi_p, CCM, CSCMR1, SSI3_CLK_SEL),
10163e5af17bSbouyer 	CLK_MUX("usdhc1_sel", usdhc_p, CCM, CSCMR1, USDHC1_CLK_SEL),
10173e5af17bSbouyer 	CLK_MUX("usdhc2_sel", usdhc_p, CCM, CSCMR1, USDHC2_CLK_SEL),
10183e5af17bSbouyer 	CLK_MUX("usdhc3_sel", usdhc_p, CCM, CSCMR1, USDHC3_CLK_SEL),
10193e5af17bSbouyer 	CLK_MUX("usdhc4_sel", usdhc_p, CCM, CSCMR1, USDHC4_CLK_SEL),
10203e5af17bSbouyer 	CLK_MUX("eim_sel", eim_p, CCM, CSCMR1, ACLK_SEL),
10213e5af17bSbouyer 	CLK_MUX("eim_slow_sel", eim_slow_p, CCM, CSCMR1, ACLK_EIM_SLOW_SEL),
10223e5af17bSbouyer 	CLK_MUX("enfc_sel", enfc_p, CCM, CS2CDR, ENFC_CLK_SEL),
10233e5af17bSbouyer 
10243e5af17bSbouyer 	CLK_MUX("pll1_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_ARM, BYPASS_CLK_SRC),
10253e5af17bSbouyer 	CLK_MUX("pll2_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_SYS, BYPASS_CLK_SRC),
10263e5af17bSbouyer 	CLK_MUX("pll3_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_USB1, BYPASS_CLK_SRC),
10273e5af17bSbouyer 	CLK_MUX("pll4_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_AUDIO, BYPASS_CLK_SRC),
10283e5af17bSbouyer 	CLK_MUX("pll5_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_VIDEO, BYPASS_CLK_SRC),
10293e5af17bSbouyer 	CLK_MUX("pll6_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_ENET, BYPASS_CLK_SRC),
10303e5af17bSbouyer 	CLK_MUX("pll7_bypass_src", pll_bypass_src_p, CCM_ANALOG, PLL_USB2, BYPASS_CLK_SRC),
10313e5af17bSbouyer 	CLK_MUX("pll1_bypass", pll1_bypass_p, CCM_ANALOG, PLL_ARM, BYPASS),
10323e5af17bSbouyer 	CLK_MUX("pll2_bypass", pll2_bypass_p, CCM_ANALOG, PLL_SYS, BYPASS),
10333e5af17bSbouyer 	CLK_MUX("pll3_bypass", pll3_bypass_p, CCM_ANALOG, PLL_USB1, BYPASS),
10343e5af17bSbouyer 	CLK_MUX("pll4_bypass", pll4_bypass_p, CCM_ANALOG, PLL_AUDIO, BYPASS),
10353e5af17bSbouyer 	CLK_MUX("pll5_bypass", pll5_bypass_p, CCM_ANALOG, PLL_VIDEO, BYPASS),
10363e5af17bSbouyer 	CLK_MUX("pll6_bypass", pll6_bypass_p, CCM_ANALOG, PLL_ENET, BYPASS),
10373e5af17bSbouyer 	CLK_MUX("pll7_bypass", pll7_bypass_p, CCM_ANALOG, PLL_USB2, BYPASS),
10383e5af17bSbouyer 
10393e5af17bSbouyer 	CLK_MUX("lvds1_sel", lvds_p, CCM_ANALOG, MISC1, LVDS_CLK1_SRC),
10403e5af17bSbouyer 	CLK_MUX("lvds2_sel", lvds_p, CCM_ANALOG, MISC1, LVDS_CLK2_SRC),
10413e5af17bSbouyer 
10423e5af17bSbouyer 	CLK_MUX_BUSY("periph", periph_p, CBCDR, PERIPH_CLK_SEL, CDHIPR, PERIPH_CLK_SEL_BUSY),
10433e5af17bSbouyer 	CLK_MUX_BUSY("periph2", periph2_p, CBCDR, PERIPH2_CLK_SEL, CDHIPR, PERIPH2_CLK_SEL_BUSY),
10443e5af17bSbouyer 
10453e5af17bSbouyer 	CLK_GATE("apbh_dma", "usdhc3", CCM, CCGR0, APBHDMA_HCLK_ENABLE),
10463e5af17bSbouyer 	CLK_GATE("asrc", "asrc_podf", CCM, CCGR0, ASRC_CLK_ENABLE),
10473e5af17bSbouyer 	CLK_GATE("asrc_ipg", "ahb", CCM, CCGR0, ASRC_CLK_ENABLE),
10483e5af17bSbouyer 	CLK_GATE("asrc_mem", "ahb", CCM, CCGR0, ASRC_CLK_ENABLE),
10493e5af17bSbouyer 	CLK_GATE("caam_mem", "ahb", CCM, CCGR0, CAAM_SECURE_MEM_CLK_ENABLE),
10503e5af17bSbouyer 	CLK_GATE("caam_aclk", "ahb", CCM, CCGR0, CAAM_WRAPPER_ACLK_ENABLE),
10513e5af17bSbouyer 	CLK_GATE("caam_ipg", "ipg", CCM, CCGR0, CAAM_WRAPPER_IPG_ENABLE),
10523e5af17bSbouyer 	CLK_GATE("can1_ipg", "ipg", CCM, CCGR0, CAN1_CLK_ENABLE),
10533e5af17bSbouyer 	CLK_GATE("can1_serial", "can_root", CCM, CCGR0, CAN1_SERIAL_CLK_ENABLE),
10543e5af17bSbouyer 	CLK_GATE("can2_ipg", "ipg", CCM, CCGR0, CAN2_CLK_ENABLE),
10553e5af17bSbouyer 	CLK_GATE("can2_serial", "can_root", CCM, CCGR0, CAN2_SERIAL_CLK_ENABLE),
10563e5af17bSbouyer 	CLK_GATE("ecspi1", "ecspi_root", CCM, CCGR1, ECSPI1_CLK_ENABLE),
10573e5af17bSbouyer 	CLK_GATE("ecspi2", "ecspi_root", CCM, CCGR1, ECSPI2_CLK_ENABLE),
10583e5af17bSbouyer 	CLK_GATE("ecspi3", "ecspi_root", CCM, CCGR1, ECSPI3_CLK_ENABLE),
10593e5af17bSbouyer 	CLK_GATE("ecspi4", "ecspi_root", CCM, CCGR1, ECSPI4_CLK_ENABLE),
10603e5af17bSbouyer 	CLK_GATE("ecspi5", "ecspi_root", CCM, CCGR1, ECSPI5_CLK_ENABLE),
10613e5af17bSbouyer 	CLK_GATE("enet", "ipg", CCM, CCGR1, ENET_CLK_ENABLE),
10623e5af17bSbouyer 	CLK_GATE("esai_extal", "esai_podf", CCM, CCGR1, ESAI_CLK_ENABLE),
10633e5af17bSbouyer 	CLK_GATE("esai_ipg", "ahb", CCM, CCGR1, ESAI_CLK_ENABLE),
10643e5af17bSbouyer 	CLK_GATE("esai_mem", "ahb", CCM, CCGR1, ESAI_CLK_ENABLE),
10653e5af17bSbouyer 	CLK_GATE("gpt_ipg", "ipg", CCM, CCGR1, GPT_CLK_ENABLE),
10663e5af17bSbouyer 	CLK_GATE("gpt_ipg_per", "ipg_per", CCM, CCGR1, GPT_SERIAL_CLK_ENABLE),
10673e5af17bSbouyer 	CLK_GATE("gpu2d_core", "gpu2d_core_podf", CCM, CCGR1, GPU2D_CLK_ENABLE),
10683e5af17bSbouyer 	CLK_GATE("gpu3d_core", "gpu3d_core_podf", CCM, CCGR1, GPU3D_CLK_ENABLE),
10693e5af17bSbouyer 	CLK_GATE("hdmi_iahb", "ahb", CCM, CCGR2, HDMI_TX_IAHBCLK_ENABLE),
10703e5af17bSbouyer 	CLK_GATE("hdmi_isfr", "video_27m", CCM, CCGR2, HDMI_TX_ISFRCLK_ENABLE),
10713e5af17bSbouyer 	CLK_GATE("i2c1", "ipg_per", CCM, CCGR2, I2C1_SERIAL_CLK_ENABLE),
10723e5af17bSbouyer 	CLK_GATE("i2c2", "ipg_per", CCM, CCGR2, I2C2_SERIAL_CLK_ENABLE),
10733e5af17bSbouyer 	CLK_GATE("i2c3", "ipg_per", CCM, CCGR2, I2C3_SERIAL_CLK_ENABLE),
10743e5af17bSbouyer 	CLK_GATE("iim", "ipg", CCM, CCGR2, IIM_CLK_ENABLE),
10753e5af17bSbouyer 	CLK_GATE("enfc", "enfc_podf", CCM, CCGR2, IOMUX_IPT_CLK_IO_CLK_ENABLE),
10763e5af17bSbouyer 	CLK_GATE("vdoa", "vdo_axi", CCM, CCGR2, IPSYNC_VDOA_IPG_CLK_ENABLE),
10773e5af17bSbouyer 	CLK_GATE("ipu1", "ipu1_podf", CCM, CCGR3, IPU1_IPU_CLK_ENABLE),
10783e5af17bSbouyer 	CLK_GATE("ipu1_di0", "ipu1_di0_sel", CCM, CCGR3, IPU1_IPU_DI0_CLK_ENABLE),
10793e5af17bSbouyer 	CLK_GATE("ipu1_di1", "ipu1_di1_sel", CCM, CCGR3, IPU1_IPU_DI1_CLK_ENABLE),
10803e5af17bSbouyer 	CLK_GATE("ipu2", "ipu2_podf", CCM, CCGR3, IPU2_IPU_CLK_ENABLE),
10813e5af17bSbouyer 	CLK_GATE("ipu2_di0", "ipu2_di0_sel", CCM, CCGR3, IPU2_IPU_DI0_CLK_ENABLE),
10823e5af17bSbouyer 	CLK_GATE("ldb_di0", "ldb_di0_podf", CCM, CCGR3, LDB_DI0_CLK_ENABLE),
10833e5af17bSbouyer 	CLK_GATE("ldb_di1", "ldb_di1_podf", CCM, CCGR3, LDB_DI1_CLK_ENABLE),
10843e5af17bSbouyer 	CLK_GATE("ipu2_di1", "ipu2_di1_sel", CCM, CCGR3, IPU2_IPU_DI1_CLK_ENABLE),
10853e5af17bSbouyer 	CLK_GATE("hsi_tx", "hsi_tx_podf", CCM, CCGR3, MIPI_CORE_CFG_CLK_ENABLE),
10863e5af17bSbouyer 	CLK_GATE("mipi_core_cfg", "video_27m", CCM, CCGR3, MIPI_CORE_CFG_CLK_ENABLE),
10873e5af17bSbouyer 	CLK_GATE("mipi_ipg", "ipg", CCM, CCGR3, MIPI_CORE_CFG_CLK_ENABLE),
10883e5af17bSbouyer 	CLK_GATE("mlb", "axi", CCM, CCGR3, MLB_CLK_ENABLE),
10893e5af17bSbouyer 	CLK_GATE("mmdc_ch0_axi", "mmdc_ch0_axi_podf", CCM, CCGR3, MMDC_CORE_ACLK_FAST_CORE_P0_ENABLE),
10903e5af17bSbouyer 	CLK_GATE("mmdc_ch1_axi", "mmdc_ch1_axi_podf", CCM, CCGR3, MMDC_CORE_ACLK_FAST_CORE_P1_ENABLE),
10913e5af17bSbouyer 	CLK_GATE("ocram", "ahb", CCM, CCGR3, OCRAM_CLK_ENABLE),
10923e5af17bSbouyer 	CLK_GATE("openvg_axi", "axi", CCM, CCGR3, OPENVGAXICLK_CLK_ROOT_ENABLE),
10933e5af17bSbouyer 	CLK_GATE("pcie_axi", "pcie_axi_sel", CCM, CCGR4, PCIE_ROOT_ENABLE),
10943e5af17bSbouyer 	CLK_GATE("per1_bch", "usdhc3", CCM, CCGR4, PL301_MX6QPER1_BCHCLK_ENABLE),
10953e5af17bSbouyer 	CLK_GATE("pwm1", "ipg_per", CCM, CCGR4, PWM1_CLK_ENABLE),
10963e5af17bSbouyer 	CLK_GATE("pwm2", "ipg_per", CCM, CCGR4, PWM2_CLK_ENABLE),
10973e5af17bSbouyer 	CLK_GATE("pwm3", "ipg_per", CCM, CCGR4, PWM3_CLK_ENABLE),
10983e5af17bSbouyer 	CLK_GATE("pwm4", "ipg_per", CCM, CCGR4, PWM4_CLK_ENABLE),
10993e5af17bSbouyer 	CLK_GATE("gpmi_bch_apb", "usdhc3", CCM, CCGR4, RAWNAND_U_BCH_INPUT_APB_CLK_ENABLE),
11003e5af17bSbouyer 	CLK_GATE("gpmi_bch", "usdhc4", CCM, CCGR4, RAWNAND_U_GPMI_BCH_INPUT_BCH_CLK_ENABLE),
11013e5af17bSbouyer 	CLK_GATE("gpmi_io", "enfc", CCM, CCGR4, RAWNAND_U_GPMI_BCH_INPUT_GPMI_IO_CLK_ENABLE),
11023e5af17bSbouyer 	CLK_GATE("gpmi_apb", "usdhc3", CCM, CCGR4, RAWNAND_U_GPMI_INPUT_APB_CLK_ENABLE),
11033e5af17bSbouyer 	CLK_GATE("rom", "ahb", CCM, CCGR5, ROM_CLK_ENABLE),
11043e5af17bSbouyer 	CLK_GATE("sata", "ahb", CCM, CCGR5, SATA_CLK_ENABLE),
11053e5af17bSbouyer 	CLK_GATE("sdma", "ahb", CCM, CCGR5, SDMA_CLK_ENABLE),
11063e5af17bSbouyer 	CLK_GATE("spba", "ipg", CCM, CCGR5, SPBA_CLK_ENABLE),
11073e5af17bSbouyer 	CLK_GATE("spdif", "spdif_podf", CCM, CCGR5, SPDIF_CLK_ENABLE),
11083e5af17bSbouyer 	CLK_GATE("spdif_gclk", "ipg", CCM, CCGR5, SPDIF_CLK_ENABLE),
11093e5af17bSbouyer 	CLK_GATE("ssi1_ipg", "ipg", CCM, CCGR5, SSI1_CLK_ENABLE),
11103e5af17bSbouyer 	CLK_GATE("ssi2_ipg", "ipg", CCM, CCGR5, SSI2_CLK_ENABLE),
11113e5af17bSbouyer 	CLK_GATE("ssi3_ipg", "ipg", CCM, CCGR5, SSI3_CLK_ENABLE),
11123e5af17bSbouyer 	CLK_GATE("ssi1", "ssi1_podf", CCM, CCGR5, SSI1_CLK_ENABLE),
11133e5af17bSbouyer 	CLK_GATE("ssi2", "ssi2_podf", CCM, CCGR5, SSI2_CLK_ENABLE),
11143e5af17bSbouyer 	CLK_GATE("ssi3", "ssi3_podf", CCM, CCGR5, SSI3_CLK_ENABLE),
11153e5af17bSbouyer 	CLK_GATE("uart_ipg", "ipg", CCM, CCGR5, UART_CLK_ENABLE),
11163e5af17bSbouyer 	CLK_GATE("uart_serial", "uart_serial_podf", CCM, CCGR5, UART_SERIAL_CLK_ENABLE),
11173e5af17bSbouyer 	CLK_GATE("usboh3", "ipg", CCM, CCGR6, USBOH3_CLK_ENABLE),
11183e5af17bSbouyer 	CLK_GATE("usdhc1", "usdhc1_podf", CCM, CCGR6, USDHC1_CLK_ENABLE),
11193e5af17bSbouyer 	CLK_GATE("usdhc2", "usdhc2_podf", CCM, CCGR6, USDHC2_CLK_ENABLE),
11203e5af17bSbouyer 	CLK_GATE("usdhc3", "usdhc3_podf", CCM, CCGR6, USDHC3_CLK_ENABLE),
11213e5af17bSbouyer 	CLK_GATE("usdhc4", "usdhc4_podf", CCM, CCGR6, USDHC4_CLK_ENABLE),
11223e5af17bSbouyer 	CLK_GATE("eim_slow", "eim_slow_podf", CCM, CCGR6, EIM_SLOW_CLK_ENABLE),
11233e5af17bSbouyer 	CLK_GATE("vdo_axi", "vdo_axi_sel", CCM, CCGR6, VDOAXICLK_CLK_ENABLE),
11243e5af17bSbouyer 	CLK_GATE("vpu_axi", "vpu_axi_podf", CCM, CCGR6, VPU_CLK_ENABLE),
11253e5af17bSbouyer 	CLK_GATE("cko1", "cko1_podf", CCM, CCOSR, CLKO1_EN),
11263e5af17bSbouyer 	CLK_GATE("cko2", "cko2_podf", CCM, CCOSR, CLKO2_EN),
11273e5af17bSbouyer 
11283e5af17bSbouyer 	CLK_GATE("sata_ref_100m", "sata_ref", CCM_ANALOG, PLL_ENET, ENABLE_100M),
11293e5af17bSbouyer 	CLK_GATE("pcie_ref_125m", "pcie_ref", CCM_ANALOG, PLL_ENET, ENABLE_125M),
11303e5af17bSbouyer 
11313e5af17bSbouyer 	CLK_GATE("pll1_sys", "pll1_bypass", CCM_ANALOG, PLL_ARM, ENABLE),
11323e5af17bSbouyer 	CLK_GATE("pll2_bus", "pll2_bypass", CCM_ANALOG, PLL_SYS, ENABLE),
11333e5af17bSbouyer 	CLK_GATE("pll3_usb_otg", "pll3_bypass", CCM_ANALOG, PLL_USB1, ENABLE),
11343e5af17bSbouyer 	CLK_GATE("pll4_audio", "pll4_bypass", CCM_ANALOG, PLL_AUDIO, ENABLE),
11353e5af17bSbouyer 	CLK_GATE("pll5_video", "pll5_bypass", CCM_ANALOG, PLL_VIDEO, ENABLE),
11363e5af17bSbouyer 	CLK_GATE("pll6_enet", "pll6_bypass", CCM_ANALOG, PLL_ENET, ENABLE),
11373e5af17bSbouyer 	CLK_GATE("pll7_usb_host", "pll7_bypass", CCM_ANALOG, PLL_USB2, ENABLE),
11383e5af17bSbouyer 
11393e5af17bSbouyer 	CLK_GATE("usbphy1", "pll3_usb_otg", CCM_ANALOG, PLL_USB1, RESERVED),
11403e5af17bSbouyer 	CLK_GATE("usbphy2", "pll7_usb_host", CCM_ANALOG, PLL_USB2, RESERVED),
11413e5af17bSbouyer 
11423e5af17bSbouyer 	CLK_GATE_EXCLUSIVE("lvds1_gate", "lvds1_sel", CCM_ANALOG, MISC1, LVDS_CLK1_OBEN, LVDS_CLK1_IBEN),
11433e5af17bSbouyer 	CLK_GATE_EXCLUSIVE("lvds2_gate", "lvds2_sel", CCM_ANALOG, MISC1, LVDS_CLK2_OBEN, LVDS_CLK2_IBEN),
11443e5af17bSbouyer 	CLK_GATE_EXCLUSIVE("lvds1_in", "anaclk1", CCM_ANALOG, MISC1, LVDS_CLK1_IBEN, LVDS_CLK1_OBEN),
11453e5af17bSbouyer 	CLK_GATE_EXCLUSIVE("lvds2_in", "anaclk2", CCM_ANALOG, MISC1, LVDS_CLK2_IBEN, LVDS_CLK2_OBEN),
11463e5af17bSbouyer };
11473e5af17bSbouyer 
11485fd4005dSbouyer struct imxccm_init_parent imxccm6q_init_parents[] = {
11495fd4005dSbouyer 	{ "pll1_bypass",        "pll1" },
11505fd4005dSbouyer 	{ "pll2_bypass",        "pll2" },
11515fd4005dSbouyer 	{ "pll3_bypass",        "pll3" },
11525fd4005dSbouyer 	{ "pll4_bypass",        "pll4" },
11535fd4005dSbouyer 	{ "pll5_bypass",        "pll5" },
11545fd4005dSbouyer 	{ "pll6_bypass",        "pll6" },
11555fd4005dSbouyer 	{ "pll7_bypass",        "pll7" },
11565fd4005dSbouyer 	{ "lvds1_sel",          "sata_ref_100m" },
11575fd4005dSbouyer 	{ 0 },
11585fd4005dSbouyer };
11595fd4005dSbouyer 
11605fd4005dSbouyer 
11613e5af17bSbouyer static struct imx6_clk *
11623e5af17bSbouyer imx6q_clk_find_by_id(struct imx6ccm_softc *sc, u_int clock_id)
11633e5af17bSbouyer {
11643e5af17bSbouyer 	for (int n = 0; n < __arraycount(imx6q_clock_ids); n++) {
11653e5af17bSbouyer 		if (imx6q_clock_ids[n].id == clock_id) {
11663e5af17bSbouyer 			const char *name = imx6q_clock_ids[n].name;
11673e5af17bSbouyer 			return imx6_clk_find(sc, name);
11683e5af17bSbouyer 		}
11693e5af17bSbouyer 	}
11703e5af17bSbouyer 
11713e5af17bSbouyer 	return NULL;
11723e5af17bSbouyer }
11733e5af17bSbouyer 
11743e5af17bSbouyer static struct clk *
11753e5af17bSbouyer imx6q_get_clock_by_id(struct imx6ccm_softc *sc, u_int clock_id)
11763e5af17bSbouyer {
11773e5af17bSbouyer 	struct imx6_clk *iclk;
11783e5af17bSbouyer 	iclk = imx6q_clk_find_by_id(sc, clock_id);
11793e5af17bSbouyer 
11803e5af17bSbouyer 	if (iclk == NULL)
11813e5af17bSbouyer 		return NULL;
11823e5af17bSbouyer 
11833e5af17bSbouyer 	return &iclk->base;
11843e5af17bSbouyer }
11853e5af17bSbouyer 
11863e5af17bSbouyer static struct clk *imx6q_clk_decode(device_t, int, const void *, size_t);
11873e5af17bSbouyer 
11883e5af17bSbouyer static const struct fdtbus_clock_controller_func imx6q_ccm_fdtclock_funcs = {
11893e5af17bSbouyer 	.decode = imx6q_clk_decode
11908644267aSskrll };
11918644267aSskrll 
11928644267aSskrll static struct clk *
11933e5af17bSbouyer imx6q_clk_decode(device_t dev, int cc_phandle, const void *data, size_t len)
11948644267aSskrll {
11958644267aSskrll 	struct clk *clk;
11963e5af17bSbouyer 	struct imx6ccm_softc *sc = device_private(dev);
11978644267aSskrll 
11988644267aSskrll 	/* #clock-cells should be 1 */
11998644267aSskrll 	if (len != 4)
12008644267aSskrll 		return NULL;
12018644267aSskrll 
12028644267aSskrll 	const u_int clock_id = be32dec(data);
12038644267aSskrll 
12043e5af17bSbouyer 	clk = imx6q_get_clock_by_id(sc, clock_id);
12058644267aSskrll 	if (clk)
12068644267aSskrll 		return clk;
12078644267aSskrll 
12088644267aSskrll 	return NULL;
12098644267aSskrll }
12108644267aSskrll 
12118644267aSskrll static void
12123e5af17bSbouyer imx6q_clk_fixed_from_fdt(struct imx6ccm_softc *sc, const char *name)
12138644267aSskrll {
12143e5af17bSbouyer 	struct imx6_clk *iclk = (struct imx6_clk *)imx6_get_clock(sc, name);
12158644267aSskrll 
12163e5af17bSbouyer 	KASSERTMSG((iclk != NULL), "failed to find clock %s", name);
12178644267aSskrll 
12188644267aSskrll 	char *path = kmem_asprintf("/clocks/%s", name);
12198644267aSskrll 	int phandle = OF_finddevice(path);
12203e5af17bSbouyer 	KASSERTMSG((phandle >= 0), "failed to find device %s", path);
12218644267aSskrll 	kmem_free(path, strlen(path) + 1);
12228644267aSskrll 
12238644267aSskrll 	if (of_getprop_uint32(phandle, "clock-frequency", &iclk->clk.fixed.rate) != 0)
12248644267aSskrll 		iclk->clk.fixed.rate = 0;
12258644267aSskrll }
12268644267aSskrll 
12273e5af17bSbouyer static int imx6qccm_match(device_t, cfdata_t, void *);
12283e5af17bSbouyer static void imx6qccm_attach(device_t, device_t, void *);
12298644267aSskrll 
12308644267aSskrll CFATTACH_DECL_NEW(imx6ccm, sizeof(struct imx6ccm_softc),
12313e5af17bSbouyer     imx6qccm_match, imx6qccm_attach, NULL, NULL);
12328644267aSskrll 
12336e54367aSthorpej static const struct device_compatible_entry compat_data[] = {
12346e54367aSthorpej 	{ .compat = "fsl,imx6q-ccm" },
12356e54367aSthorpej 	DEVICE_COMPAT_EOL
12366e54367aSthorpej };
12376e54367aSthorpej 
12388644267aSskrll static int
12393e5af17bSbouyer imx6qccm_match(device_t parent, cfdata_t cfdata, void *aux)
12408644267aSskrll {
12418644267aSskrll 	struct fdt_attach_args * const faa = aux;
12428644267aSskrll 
12436e54367aSthorpej 	return of_compatible_match(faa->faa_phandle, compat_data);
12448644267aSskrll }
12458644267aSskrll 
12468644267aSskrll static void
12473e5af17bSbouyer imx6qccm_attach(device_t parent, device_t self, void *aux)
12488644267aSskrll {
12498644267aSskrll 	struct imx6ccm_softc * const sc = device_private(self);
12508644267aSskrll 	struct fdt_attach_args * const faa = aux;
12518644267aSskrll 	bus_addr_t addr;
12528644267aSskrll 	bus_size_t size;
12538644267aSskrll 
12548644267aSskrll 	if (fdtbus_get_reg(faa->faa_phandle, 0, &addr, &size) != 0) {
12558644267aSskrll 		aprint_error(": couldn't get registers\n");
12568644267aSskrll 		return;
12578644267aSskrll 	}
12588644267aSskrll 
12598644267aSskrll 	sc->sc_dev = self;
12608644267aSskrll 	sc->sc_iot = faa->faa_bst;
12618644267aSskrll 
12628644267aSskrll 	if (bus_space_map(sc->sc_iot, addr, size, 0, &sc->sc_ioh)) {
12638644267aSskrll 		aprint_error(": can't map ccm registers\n");
12648644267aSskrll 		return;
12658644267aSskrll 	}
12668644267aSskrll 
1267*97835a6fSskrll 	int phandle = OF_finddevice("/soc/bus/anatop");
12683e5af17bSbouyer 
12693e5af17bSbouyer 	if (phandle == -1) {
12703e5af17bSbouyer 		aprint_error(": can't find anatop device\n");
12713e5af17bSbouyer 		return;
12723e5af17bSbouyer 	}
12733e5af17bSbouyer 
12743e5af17bSbouyer 	if (fdtbus_get_reg(phandle, 0, &addr, &size) != 0) {
12753e5af17bSbouyer 		aprint_error(": can't get anatop registers\n");
12763e5af17bSbouyer 		return;
12773e5af17bSbouyer 	}
12783e5af17bSbouyer 
12798644267aSskrll 
12808644267aSskrll 	if (bus_space_map(sc->sc_iot, addr, size, 0, &sc->sc_ioh_analog)) {
12818644267aSskrll 		aprint_error(": can't map anatop registers\n");
12828644267aSskrll 		return;
12838644267aSskrll 	}
12848644267aSskrll 
12858644267aSskrll 	aprint_naive("\n");
12868644267aSskrll 	aprint_normal(": Clock Control Module\n");
12878644267aSskrll 
12885fd4005dSbouyer 	imx6ccm_attach_common(self, &imx6q_clks[0], __arraycount(imx6q_clks),
12895fd4005dSbouyer 	    imxccm6q_init_parents);
1290035957a9Sskrll 
12913e5af17bSbouyer 	imx6q_clk_fixed_from_fdt(sc, "ckil");
1292*97835a6fSskrll 	imx6q_clk_fixed_from_fdt(sc, "ckih1");
12933e5af17bSbouyer 	imx6q_clk_fixed_from_fdt(sc, "osc");
12948644267aSskrll 
12958644267aSskrll 	fdtbus_register_clock_controller(self, faa->faa_phandle,
12963e5af17bSbouyer 	    &imx6q_ccm_fdtclock_funcs);
12978644267aSskrll }
1298