xref: /netbsd-src/sys/arch/arm/nxp/imx6_ccmvar.h (revision 82d56013d7b633d116a93943de88e08335357a7c)
1 /*	$NetBSD: imx6_ccmvar.h,v 1.1 2020/12/23 14:42:38 skrll Exp $	*/
2 /*
3  * Copyright (c) 2012,2019  Genetec Corporation.  All rights reserved.
4  * Written by Hashimoto Kenichi for Genetec Corporation.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GENETEC CORPORATION
19  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25  * POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #ifndef	_ARM_NXP_IMX6_CCMVAR_H_
29 #define	_ARM_NXP_IMX6_CCMVAR_H_
30 
31 #include <dev/clk/clk.h>
32 #include <dev/clk/clk_backend.h>
33 
34 struct imx6ccm_softc {
35 	device_t sc_dev;
36 	bus_space_tag_t sc_iot;
37 	bus_space_handle_t sc_ioh;
38 	bus_space_handle_t sc_ioh_analog;
39 
40 	struct clk_domain sc_clkdom;
41 };
42 
43 void imx6ccm_attach_common(device_t);
44 
45 struct clk *imx6_get_clock(const char *);
46 struct clk *imx6_get_clock_by_id(u_int);
47 
48 /* Clock IDs */
49 #define IMX6CLK_DUMMY			0
50 #define IMX6CLK_CKIL			1
51 #define IMX6CLK_CKIH			2
52 #define IMX6CLK_OSC			3
53 #define IMX6CLK_PLL2_PFD0_352M		4
54 #define IMX6CLK_PLL2_PFD1_594M		5
55 #define IMX6CLK_PLL2_PFD2_396M		6
56 #define IMX6CLK_PLL3_PFD0_720M		7
57 #define IMX6CLK_PLL3_PFD1_540M		8
58 #define IMX6CLK_PLL3_PFD2_508M		9
59 #define IMX6CLK_PLL3_PFD3_454M		10
60 #define IMX6CLK_PLL2_198M		11
61 #define IMX6CLK_PLL3_120M		12
62 #define IMX6CLK_PLL3_80M		13
63 #define IMX6CLK_PLL3_60M		14
64 #define IMX6CLK_TWD			15
65 #define IMX6CLK_STEP			16
66 #define IMX6CLK_PLL1_SW			17
67 #define IMX6CLK_PERIPH_PRE		18
68 #define IMX6CLK_PERIPH2_PRE		19
69 #define IMX6CLK_PERIPH_CLK2_SEL		20
70 #define IMX6CLK_PERIPH2_CLK2_SEL	21
71 #define IMX6CLK_AXI_SEL			22
72 #define IMX6CLK_ESAI_SEL		23
73 #define IMX6CLK_ASRC_SEL		24
74 #define IMX6CLK_SPDIF_SEL		25
75 #define IMX6CLK_GPU2D_AXI		26
76 #define IMX6CLK_GPU3D_AXI		27
77 #define IMX6CLK_GPU2D_CORE_SEL		28
78 #define IMX6CLK_GPU3D_CORE_SEL		29
79 #define IMX6CLK_GPU3D_SHADER_SEL	30
80 #define IMX6CLK_IPU1_SEL		31
81 #define IMX6CLK_IPU2_SEL		32
82 #define IMX6CLK_LDB_DI0_SEL		33
83 #define IMX6CLK_LDB_DI1_SEL		34
84 #define IMX6CLK_IPU1_DI0_PRE_SEL	35
85 #define IMX6CLK_IPU1_DI1_PRE_SEL	36
86 #define IMX6CLK_IPU2_DI0_PRE_SEL	37
87 #define IMX6CLK_IPU2_DI1_PRE_SEL	38
88 #define IMX6CLK_IPU1_DI0_SEL		39
89 #define IMX6CLK_IPU1_DI1_SEL		40
90 #define IMX6CLK_IPU2_DI0_SEL		41
91 #define IMX6CLK_IPU2_DI1_SEL		42
92 #define IMX6CLK_HSI_TX_SEL		43
93 #define IMX6CLK_PCIE_AXI_SEL		44
94 #define IMX6CLK_SSI1_SEL		45
95 #define IMX6CLK_SSI2_SEL		46
96 #define IMX6CLK_SSI3_SEL		47
97 #define IMX6CLK_USDHC1_SEL		48
98 #define IMX6CLK_USDHC2_SEL		49
99 #define IMX6CLK_USDHC3_SEL		50
100 #define IMX6CLK_USDHC4_SEL		51
101 #define IMX6CLK_ENFC_SEL		52
102 #define IMX6CLK_EIM_SEL			53
103 #define IMX6CLK_EIM_SLOW_SEL		54
104 #define IMX6CLK_VDO_AXI_SEL		55
105 #define IMX6CLK_VPU_AXI_SEL		56
106 #define IMX6CLK_CKO1_SEL		57
107 #define IMX6CLK_PERIPH			58
108 #define IMX6CLK_PERIPH2			59
109 #define IMX6CLK_PERIPH_CLK2		60
110 #define IMX6CLK_PERIPH2_CLK2		61
111 #define IMX6CLK_IPG			62
112 #define IMX6CLK_IPG_PER			63
113 #define IMX6CLK_ESAI_PRED		64
114 #define IMX6CLK_ESAI_PODF		65
115 #define IMX6CLK_ASRC_PRED		66
116 #define IMX6CLK_ASRC_PODF		67
117 #define IMX6CLK_SPDIF_PRED		68
118 #define IMX6CLK_SPDIF_PODF		69
119 #define IMX6CLK_CAN_ROOT		70
120 #define IMX6CLK_ECSPI_ROOT		71
121 #define IMX6CLK_GPU2D_CORE_PODF		72
122 #define IMX6CLK_GPU3D_CORE_PODF		73
123 #define IMX6CLK_GPU3D_SHADER		74
124 #define IMX6CLK_IPU1_PODF		75
125 #define IMX6CLK_IPU2_PODF		76
126 #define IMX6CLK_LDB_DI0_PODF		77
127 #define IMX6CLK_LDB_DI1_PODF		78
128 #define IMX6CLK_IPU1_DI0_PRE		79
129 #define IMX6CLK_IPU1_DI1_PRE		80
130 #define IMX6CLK_IPU2_DI0_PRE		81
131 #define IMX6CLK_IPU2_DI1_PRE		82
132 #define IMX6CLK_HSI_TX_PODF		83
133 #define IMX6CLK_SSI1_PRED		84
134 #define IMX6CLK_SSI1_PODF		85
135 #define IMX6CLK_SSI2_PRED		86
136 #define IMX6CLK_SSI2_PODF		87
137 #define IMX6CLK_SSI3_PRED		88
138 #define IMX6CLK_SSI3_PODF		89
139 #define IMX6CLK_UART_SERIAL_PODF	90
140 #define IMX6CLK_USDHC1_PODF		91
141 #define IMX6CLK_USDHC2_PODF		92
142 #define IMX6CLK_USDHC3_PODF		93
143 #define IMX6CLK_USDHC4_PODF		94
144 #define IMX6CLK_ENFC_PRED		95
145 #define IMX6CLK_ENFC_PODF		96
146 #define IMX6CLK_EIM_PODF		97
147 #define IMX6CLK_EIM_SLOW_PODF		98
148 #define IMX6CLK_VPU_AXI_PODF		99
149 #define IMX6CLK_CKO1_PODF		100
150 #define IMX6CLK_AXI			101
151 #define IMX6CLK_MMDC_CH0_AXI_PODF	102
152 #define IMX6CLK_MMDC_CH1_AXI_PODF	103
153 #define IMX6CLK_ARM			104
154 #define IMX6CLK_AHB			105
155 #define IMX6CLK_APBH_DMA		106
156 #define IMX6CLK_ASRC			107
157 #define IMX6CLK_CAN1_IPG		108
158 #define IMX6CLK_CAN1_SERIAL		109
159 #define IMX6CLK_CAN2_IPG		110
160 #define IMX6CLK_CAN2_SERIAL		111
161 #define IMX6CLK_ECSPI1			112
162 #define IMX6CLK_ECSPI2			113
163 #define IMX6CLK_ECSPI3			114
164 #define IMX6CLK_ECSPI4			115
165 #define IMX6CLK_ECSPI5			116	/* i.MX6Q */
166 #define IMX6CLK_I2C4			116	/* i.MX6DL */
167 #define IMX6CLK_ENET			117
168 #define IMX6CLK_ESAI_EXTAL		118
169 #define IMX6CLK_GPT_IPG			119
170 #define IMX6CLK_GPT_IPG_PER		120
171 #define IMX6CLK_GPU2D_CORE		121
172 #define IMX6CLK_GPU3D_CORE		122
173 #define IMX6CLK_HDMI_IAHB		123
174 #define IMX6CLK_HDMI_ISFR		124
175 #define IMX6CLK_I2C1			125
176 #define IMX6CLK_I2C2			126
177 #define IMX6CLK_I2C3			127
178 #define IMX6CLK_IIM			128
179 #define IMX6CLK_ENFC			129
180 #define IMX6CLK_IPU1			130
181 #define IMX6CLK_IPU1_DI0		131
182 #define IMX6CLK_IPU1_DI1		132
183 #define IMX6CLK_IPU2			133
184 #define IMX6CLK_IPU2_DI0		134
185 #define IMX6CLK_LDB_DI0			135
186 #define IMX6CLK_LDB_DI1			136
187 #define IMX6CLK_IPU2_DI1		137
188 #define IMX6CLK_HSI_TX			138
189 #define IMX6CLK_MLB			139
190 #define IMX6CLK_MMDC_CH0_AXI		140
191 #define IMX6CLK_MMDC_CH1_AXI		141
192 #define IMX6CLK_OCRAM			142
193 #define IMX6CLK_OPENVG_AXI		143
194 #define IMX6CLK_PCIE_AXI		144
195 #define IMX6CLK_PWM1			145
196 #define IMX6CLK_PWM2			146
197 #define IMX6CLK_PWM3			147
198 #define IMX6CLK_PWM4			148
199 #define IMX6CLK_PER1_BCH		149
200 #define IMX6CLK_GPMI_BCH_APB		150
201 #define IMX6CLK_GPMI_BCH		151
202 #define IMX6CLK_GPMI_IO			152
203 #define IMX6CLK_GPMI_APB		153
204 #define IMX6CLK_SATA			154
205 #define IMX6CLK_SDMA			155
206 #define IMX6CLK_SPBA			156
207 #define IMX6CLK_SSI1			157
208 #define IMX6CLK_SSI2			158
209 #define IMX6CLK_SSI3			159
210 #define IMX6CLK_UART_IPG		160
211 #define IMX6CLK_UART_SERIAL		161
212 #define IMX6CLK_USBOH3			162
213 #define IMX6CLK_USDHC1			163
214 #define IMX6CLK_USDHC2			164
215 #define IMX6CLK_USDHC3			165
216 #define IMX6CLK_USDHC4			166
217 #define IMX6CLK_VDO_AXI			167
218 #define IMX6CLK_VPU_AXI			168
219 #define IMX6CLK_CKO1			169
220 #define IMX6CLK_PLL1_SYS		170
221 #define IMX6CLK_PLL2_BUS		171
222 #define IMX6CLK_PLL3_USB_OTG		172
223 #define IMX6CLK_PLL4_AUDIO		173
224 #define IMX6CLK_PLL5_VIDEO		174
225 #define IMX6CLK_PLL8_MLB		175
226 #define IMX6CLK_PLL7_USB_HOST		176
227 #define IMX6CLK_PLL6_ENET		177
228 #define IMX6CLK_SSI1_IPG		178
229 #define IMX6CLK_SSI2_IPG		179
230 #define IMX6CLK_SSI3_IPG		180
231 #define IMX6CLK_ROM			181
232 #define IMX6CLK_USBPHY1			182
233 #define IMX6CLK_USBPHY2			183
234 #define IMX6CLK_LDB_DI0_DIV_3_5		184
235 #define IMX6CLK_LDB_DI1_DIV_3_5		185
236 #define IMX6CLK_SATA_REF		186
237 #define IMX6CLK_SATA_REF_100M		187
238 #define IMX6CLK_PCIE_REF		188
239 #define IMX6CLK_PCIE_REF_125M		189
240 #define IMX6CLK_ENET_REF		190
241 #define IMX6CLK_USBPHY1_GATE		191
242 #define IMX6CLK_USBPHY2_GATE		192
243 #define IMX6CLK_PLL4_POST_DIV		193
244 #define IMX6CLK_PLL5_POST_DIV		194
245 #define IMX6CLK_PLL5_VIDEO_DIV		195
246 #define IMX6CLK_EIM_SLOW		196
247 #define IMX6CLK_SPDIF			197
248 #define IMX6CLK_CKO2_SEL		198
249 #define IMX6CLK_CKO2_PODF		199
250 #define IMX6CLK_CKO2			200
251 #define IMX6CLK_CKO			201
252 #define IMX6CLK_VDOA			202
253 #define IMX6CLK_PLL4_AUDIO_DIV		203
254 #define IMX6CLK_LVDS1_SEL		204
255 #define IMX6CLK_LVDS2_SEL		205
256 #define IMX6CLK_LVDS1_GATE		206
257 #define IMX6CLK_LVDS2_GATE		207
258 #define IMX6CLK_ESAI_IPG		208
259 #define IMX6CLK_ESAI_MEM		209
260 #define IMX6CLK_ASRC_IPG		210
261 #define IMX6CLK_ASRC_MEM		211
262 #define IMX6CLK_LVDS1_IN		212
263 #define IMX6CLK_LVDS2_IN		213
264 #define IMX6CLK_ANACLK1			214
265 #define IMX6CLK_ANACLK2			215
266 #define IMX6CLK_PLL1_BYPASS_SRC		216
267 #define IMX6CLK_PLL2_BYPASS_SRC		217
268 #define IMX6CLK_PLL3_BYPASS_SRC		218
269 #define IMX6CLK_PLL4_BYPASS_SRC		219
270 #define IMX6CLK_PLL5_BYPASS_SRC		220
271 #define IMX6CLK_PLL6_BYPASS_SRC		221
272 #define IMX6CLK_PLL7_BYPASS_SRC		222
273 #define IMX6CLK_PLL1			223
274 #define IMX6CLK_PLL2			224
275 #define IMX6CLK_PLL3			225
276 #define IMX6CLK_PLL4			226
277 #define IMX6CLK_PLL5			227
278 #define IMX6CLK_PLL6			228
279 #define IMX6CLK_PLL7			229
280 #define IMX6CLK_PLL1_BYPASS		230
281 #define IMX6CLK_PLL2_BYPASS		231
282 #define IMX6CLK_PLL3_BYPASS		232
283 #define IMX6CLK_PLL4_BYPASS		233
284 #define IMX6CLK_PLL5_BYPASS		234
285 #define IMX6CLK_PLL6_BYPASS		235
286 #define IMX6CLK_PLL7_BYPASS		236
287 #define IMX6CLK_GPT_3M			237
288 #define IMX6CLK_VIDEO_27M		238
289 #define IMX6CLK_MIPI_CORE_CFG		239
290 #define IMX6CLK_MIPI_IPG		240
291 #define IMX6CLK_CAAM_MEM		241
292 #define IMX6CLK_CAAM_ACLK		242
293 #define IMX6CLK_CAAM_IPG		243
294 #define IMX6CLK_SPDIF_GCLK		244
295 #define IMX6CLK_UART_SEL		245
296 #define IMX6CLK_IPG_PER_SEL		246
297 #define IMX6CLK_ECSPI_SEL		247
298 #define IMX6CLK_CAN_SEL			248
299 #define IMX6CLK_MMDC_CH1_AXI_CG		249
300 #define IMX6CLK_PRE0			250
301 #define IMX6CLK_PRE1			251
302 #define IMX6CLK_PRE2			252
303 #define IMX6CLK_PRE3			253
304 #define IMX6CLK_PRG0_AXI		254
305 #define IMX6CLK_PRG1_AXI		255
306 #define IMX6CLK_PRG0_APB		256
307 #define IMX6CLK_PRG1_APB		257
308 #define IMX6CLK_PRE_AXI			258
309 #define IMX6CLK_MLB_SEL			259
310 #define IMX6CLK_MLB_PODF		260
311 #define IMX6CLK_END			261
312 
313 enum imx6_clk_type {
314 	IMX6_CLK_FIXED,
315 	IMX6_CLK_FIXED_FACTOR,
316 	IMX6_CLK_PLL,
317 	IMX6_CLK_MUX,
318 	IMX6_CLK_GATE,
319 	IMX6_CLK_PFD,
320 	IMX6_CLK_DIV,
321 };
322 
323 enum imx6_clk_reg {
324 	IMX6_CLK_REG_CCM,
325 	IMX6_CLK_REG_CCM_ANALOG,
326 };
327 
328 enum imx6_clk_pll_type {
329 	IMX6_CLK_PLL_GENERIC,
330 	IMX6_CLK_PLL_SYS,
331 	IMX6_CLK_PLL_USB,
332 	IMX6_CLK_PLL_AUDIO_VIDEO,
333 	IMX6_CLK_PLL_ENET,
334 };
335 
336 enum imx6_clk_div_type {
337 	IMX6_CLK_DIV_NORMAL,
338 	IMX6_CLK_DIV_BUSY,
339 	IMX6_CLK_DIV_TABLE,
340 };
341 
342 enum imx6_clk_mux_type {
343 	IMX6_CLK_MUX_NORMAL,
344 	IMX6_CLK_MUX_BUSY,
345 };
346 
347 struct imx6_clk_fixed {
348 	u_int rate;
349 };
350 
351 struct imx6_clk_fixed_factor {
352 	u_int div;
353 	u_int mult;
354 };
355 
356 struct imx6_clk_pfd {
357 	uint32_t reg;
358 	int index;
359 };
360 
361 struct imx6_clk_pll {
362 	enum imx6_clk_pll_type type;
363 	uint32_t reg;
364 	uint32_t mask;
365 	uint32_t powerdown;
366 	unsigned long ref;
367 };
368 
369 struct imx6_clk_div {
370 	enum imx6_clk_div_type type;
371 	enum imx6_clk_reg base;
372 	uint32_t reg;
373 	uint32_t mask;
374 	uint32_t busy_reg;
375 	uint32_t busy_mask;
376 	const int *tbl;
377 };
378 
379 struct imx6_clk_mux {
380 	enum imx6_clk_mux_type type;
381 	enum imx6_clk_reg base;
382 	uint32_t reg;
383 	uint32_t mask;
384 	const char **parents;
385 	u_int nparents;
386 	uint32_t busy_reg;
387 	uint32_t busy_mask;
388 };
389 
390 struct imx6_clk_gate {
391 	enum imx6_clk_reg base;
392 	uint32_t reg;
393 	uint32_t mask;
394 	uint32_t exclusive_mask;
395 };
396 
397 struct imx6_clk {
398 	struct clk base;		/* must be first */
399 
400 	const char *parent;
401 	u_int refcnt;
402 
403 	enum imx6_clk_type type;
404 	union {
405 		struct imx6_clk_fixed fixed;
406 		struct imx6_clk_fixed_factor fixed_factor;
407 		struct imx6_clk_pfd pfd;
408 		struct imx6_clk_pll pll;
409 		struct imx6_clk_div div;
410 		struct imx6_clk_mux mux;
411 		struct imx6_clk_gate gate;
412 	} clk;
413 };
414 
415 #define CLK_FIXED(_name, _rate) {				\
416 	.base = { .name = (_name) },				\
417 	.type = IMX6_CLK_FIXED,					\
418 	.clk = {						\
419 		.fixed = {					\
420 			.rate = (_rate),			\
421 		}						\
422 	}							\
423 }
424 
425 #define CLK_FIXED_FACTOR(_name, _parent, _div, _mult) {		\
426 	.base = { .name = (_name) },				\
427 	.type = IMX6_CLK_FIXED_FACTOR,				\
428 	.parent = (_parent),					\
429 	.clk = {						\
430 		.fixed_factor = {				\
431 			.div = (_div),				\
432 			.mult = (_mult),			\
433 		}						\
434 	}							\
435 }
436 
437 #define CLK_PFD(_name, _parent, _reg, _index) {			\
438 	.base = { .name = (_name) },				\
439 	.type = IMX6_CLK_PFD,					\
440 	.parent = (_parent),					\
441 	.clk = {						\
442 		.pfd = {					\
443 			.reg = (CCM_ANALOG_##_reg),		\
444 			.index = (_index),			\
445 		}						\
446 	}							\
447 }
448 
449 #define CLK_PLL(_name, _parent, _type, _reg, _mask, _powerdown, _ref) { \
450 	.base = { .name = (_name) },				\
451 	.type = IMX6_CLK_PLL,					\
452 	.parent = (_parent),					\
453 	.clk = {						\
454 		.pll = {					\
455 			.type = (IMX6_CLK_PLL_##_type),		\
456 			.reg = (CCM_ANALOG_##_reg),		\
457 			.mask = (CCM_ANALOG_##_reg##_##_mask),	\
458 			.powerdown = (CCM_ANALOG_##_reg##_##_powerdown), \
459 			.ref = (_ref),				\
460 		}						\
461 	}							\
462 }
463 
464 #define CLK_DIV(_name, _parent, _reg, _mask) {			\
465 	.base = { .name = (_name) },				\
466 	.type = IMX6_CLK_DIV,					\
467 	.parent = (_parent),					\
468 	.clk = {						\
469 		.div = {					\
470 			.type = (IMX6_CLK_DIV_NORMAL),		\
471 			.base = (IMX6_CLK_REG_CCM),		\
472 			.reg = (CCM_##_reg),			\
473 			.mask = (CCM_##_reg##_##_mask),		\
474 		}						\
475 	}							\
476 }
477 
478 #define CLK_DIV_BUSY(_name, _parent, _reg, _mask, _busy_reg, _busy_mask) { \
479 	.base = { .name = (_name) },				\
480 	.type = IMX6_CLK_DIV,					\
481 	.parent = (_parent),					\
482 	.clk = {						\
483 		.div = {					\
484 			.type = (IMX6_CLK_DIV_BUSY),		\
485 			.base = (IMX6_CLK_REG_CCM),		\
486 			.reg = (CCM_##_reg),			\
487 			.mask = (CCM_##_reg##_##_mask),	\
488 			.busy_reg = (CCM_##_busy_reg),		\
489 			.busy_mask = (CCM_##_busy_reg##_##_busy_mask) \
490 		}						\
491 	}							\
492 }
493 
494 #define CLK_DIV_TABLE(_name, _parent, _reg, _mask, _tbl) {	\
495 	.base = { .name = (_name) },				\
496 	.type = IMX6_CLK_DIV,					\
497 	.parent = (_parent),					\
498 	.clk = {						\
499 		.div = {					\
500 			.type = (IMX6_CLK_DIV_TABLE),		\
501 			.base = (IMX6_CLK_REG_CCM_ANALOG),	\
502 			.reg = (CCM_ANALOG_##_reg),		\
503 			.mask = (CCM_ANALOG_##_reg##_##_mask),	\
504 			.tbl = (_tbl)				\
505 		}						\
506 	}							\
507 }
508 
509 #define CLK_MUX(_name, _parents, _base, _reg, _mask) {		\
510 	.base = { .name = (_name), .flags = CLK_SET_RATE_PARENT }, \
511 	.type = IMX6_CLK_MUX,					\
512 	.clk = {						\
513 		.mux = {					\
514 			.type = (IMX6_CLK_MUX_NORMAL),		\
515 			.base = (IMX6_CLK_REG_##_base),		\
516 			.reg = (_base##_##_reg),		\
517 			.mask = (_base##_##_reg##_##_mask),	\
518 			.parents = (_parents),			\
519 			.nparents = __arraycount(_parents)	\
520 		}						\
521 	}							\
522 }
523 
524 #define CLK_MUX_BUSY(_name, _parents, _reg, _mask, _busy_reg, _busy_mask) { \
525 	.base = { .name = (_name), .flags = CLK_SET_RATE_PARENT }, \
526 	.type = IMX6_CLK_MUX,					\
527 	.clk = {						\
528 		.mux = {					\
529 			.type = (IMX6_CLK_MUX_BUSY),		\
530 			.base = (IMX6_CLK_REG_CCM),		\
531 			.reg = (CCM_##_reg),			\
532 			.mask = (CCM_##_reg##_##_mask),		\
533 			.parents = (_parents),			\
534 			.nparents = __arraycount(_parents),	\
535 			.busy_reg = (CCM_##_busy_reg),		\
536 			.busy_mask = (CCM_##_busy_reg##_##_busy_mask) \
537 		}						\
538 	}							\
539 }
540 
541 #define CLK_GATE(_name, _parent, _base, _reg, _mask) {		\
542 	.base = { .name = (_name), .flags = CLK_SET_RATE_PARENT }, \
543 	.type = IMX6_CLK_GATE,					\
544 	.parent = (_parent),					\
545 	.clk = {						\
546 		.gate = {					\
547 			.base = (IMX6_CLK_REG_##_base),		\
548 			.reg = (_base##_##_reg),		\
549 			.mask = (_base##_##_reg##_##_mask),	\
550 			.exclusive_mask = 0			\
551 		}						\
552 	}							\
553 }
554 
555 #define CLK_GATE_EXCLUSIVE(_name, _parent, _base, _reg, _mask, _exclusive_mask) {  \
556 	.base = { .name = (_name), .flags = CLK_SET_RATE_PARENT }, \
557 	.type = IMX6_CLK_GATE,					\
558 	.parent = (_parent),					\
559 	.clk = {						\
560 		.gate = {					\
561 			.base = (IMX6_CLK_REG_##_base),		\
562 			.reg = (_base##_##_reg),		\
563 			.mask = (_base##_##_reg##_##_mask),     \
564 			.exclusive_mask = (_base##_##_reg##_##_exclusive_mask) \
565 		}						\
566 	}							\
567 }
568 
569 #endif	/* _ARM_NXP_IMX6_CCMVAR_H_ */
570