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