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