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