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