1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Amlogic Meson-G12A Clock Controller Driver 4 * 5 * Copyright (c) 2016 Baylibre SAS. 6 * Author: Michael Turquette <mturquette@baylibre.com> 7 * 8 * Copyright (c) 2018 Amlogic, inc. 9 * Author: Qiufang Dai <qiufang.dai@amlogic.com> 10 * Author: Jian Hu <jian.hu@amlogic.com> 11 */ 12 13 #include <linux/clk-provider.h> 14 #include <linux/init.h> 15 #include <linux/of.h> 16 #include <linux/platform_device.h> 17 #include <linux/clk.h> 18 #include <linux/module.h> 19 20 #include "clk-mpll.h" 21 #include "clk-pll.h" 22 #include "clk-regmap.h" 23 #include "clk-cpu-dyndiv.h" 24 #include "vid-pll-div.h" 25 #include "vclk.h" 26 #include "meson-eeclk.h" 27 #include "g12a.h" 28 29 #include <dt-bindings/clock/g12a-clkc.h> 30 31 static DEFINE_SPINLOCK(meson_clk_lock); 32 33 static struct clk_regmap g12a_fixed_pll_dco = { 34 .data = &(struct meson_clk_pll_data){ 35 .en = { 36 .reg_off = HHI_FIX_PLL_CNTL0, 37 .shift = 28, 38 .width = 1, 39 }, 40 .m = { 41 .reg_off = HHI_FIX_PLL_CNTL0, 42 .shift = 0, 43 .width = 8, 44 }, 45 .n = { 46 .reg_off = HHI_FIX_PLL_CNTL0, 47 .shift = 10, 48 .width = 5, 49 }, 50 .frac = { 51 .reg_off = HHI_FIX_PLL_CNTL1, 52 .shift = 0, 53 .width = 17, 54 }, 55 .l = { 56 .reg_off = HHI_FIX_PLL_CNTL0, 57 .shift = 31, 58 .width = 1, 59 }, 60 .rst = { 61 .reg_off = HHI_FIX_PLL_CNTL0, 62 .shift = 29, 63 .width = 1, 64 }, 65 }, 66 .hw.init = &(struct clk_init_data){ 67 .name = "fixed_pll_dco", 68 .ops = &meson_clk_pll_ro_ops, 69 .parent_data = &(const struct clk_parent_data) { 70 .fw_name = "xtal", 71 }, 72 .num_parents = 1, 73 }, 74 }; 75 76 static struct clk_regmap g12a_fixed_pll = { 77 .data = &(struct clk_regmap_div_data){ 78 .offset = HHI_FIX_PLL_CNTL0, 79 .shift = 16, 80 .width = 2, 81 .flags = CLK_DIVIDER_POWER_OF_TWO, 82 }, 83 .hw.init = &(struct clk_init_data){ 84 .name = "fixed_pll", 85 .ops = &clk_regmap_divider_ro_ops, 86 .parent_hws = (const struct clk_hw *[]) { 87 &g12a_fixed_pll_dco.hw 88 }, 89 .num_parents = 1, 90 /* 91 * This clock won't ever change at runtime so 92 * CLK_SET_RATE_PARENT is not required 93 */ 94 }, 95 }; 96 97 static const struct pll_mult_range g12a_sys_pll_mult_range = { 98 .min = 128, 99 .max = 250, 100 }; 101 102 static struct clk_regmap g12a_sys_pll_dco = { 103 .data = &(struct meson_clk_pll_data){ 104 .en = { 105 .reg_off = HHI_SYS_PLL_CNTL0, 106 .shift = 28, 107 .width = 1, 108 }, 109 .m = { 110 .reg_off = HHI_SYS_PLL_CNTL0, 111 .shift = 0, 112 .width = 8, 113 }, 114 .n = { 115 .reg_off = HHI_SYS_PLL_CNTL0, 116 .shift = 10, 117 .width = 5, 118 }, 119 .l = { 120 .reg_off = HHI_SYS_PLL_CNTL0, 121 .shift = 31, 122 .width = 1, 123 }, 124 .rst = { 125 .reg_off = HHI_SYS_PLL_CNTL0, 126 .shift = 29, 127 .width = 1, 128 }, 129 .range = &g12a_sys_pll_mult_range, 130 }, 131 .hw.init = &(struct clk_init_data){ 132 .name = "sys_pll_dco", 133 .ops = &meson_clk_pll_ops, 134 .parent_data = &(const struct clk_parent_data) { 135 .fw_name = "xtal", 136 }, 137 .num_parents = 1, 138 /* This clock feeds the CPU, avoid disabling it */ 139 .flags = CLK_IS_CRITICAL, 140 }, 141 }; 142 143 static struct clk_regmap g12a_sys_pll = { 144 .data = &(struct clk_regmap_div_data){ 145 .offset = HHI_SYS_PLL_CNTL0, 146 .shift = 16, 147 .width = 3, 148 .flags = CLK_DIVIDER_POWER_OF_TWO, 149 }, 150 .hw.init = &(struct clk_init_data){ 151 .name = "sys_pll", 152 .ops = &clk_regmap_divider_ops, 153 .parent_hws = (const struct clk_hw *[]) { 154 &g12a_sys_pll_dco.hw 155 }, 156 .num_parents = 1, 157 .flags = CLK_SET_RATE_PARENT, 158 }, 159 }; 160 161 static struct clk_regmap g12b_sys1_pll_dco = { 162 .data = &(struct meson_clk_pll_data){ 163 .en = { 164 .reg_off = HHI_SYS1_PLL_CNTL0, 165 .shift = 28, 166 .width = 1, 167 }, 168 .m = { 169 .reg_off = HHI_SYS1_PLL_CNTL0, 170 .shift = 0, 171 .width = 8, 172 }, 173 .n = { 174 .reg_off = HHI_SYS1_PLL_CNTL0, 175 .shift = 10, 176 .width = 5, 177 }, 178 .l = { 179 .reg_off = HHI_SYS1_PLL_CNTL0, 180 .shift = 31, 181 .width = 1, 182 }, 183 .rst = { 184 .reg_off = HHI_SYS1_PLL_CNTL0, 185 .shift = 29, 186 .width = 1, 187 }, 188 .range = &g12a_sys_pll_mult_range, 189 }, 190 .hw.init = &(struct clk_init_data){ 191 .name = "sys1_pll_dco", 192 .ops = &meson_clk_pll_ops, 193 .parent_data = &(const struct clk_parent_data) { 194 .fw_name = "xtal", 195 }, 196 .num_parents = 1, 197 /* This clock feeds the CPU, avoid disabling it */ 198 .flags = CLK_IS_CRITICAL, 199 }, 200 }; 201 202 static struct clk_regmap g12b_sys1_pll = { 203 .data = &(struct clk_regmap_div_data){ 204 .offset = HHI_SYS1_PLL_CNTL0, 205 .shift = 16, 206 .width = 3, 207 .flags = CLK_DIVIDER_POWER_OF_TWO, 208 }, 209 .hw.init = &(struct clk_init_data){ 210 .name = "sys1_pll", 211 .ops = &clk_regmap_divider_ops, 212 .parent_hws = (const struct clk_hw *[]) { 213 &g12b_sys1_pll_dco.hw 214 }, 215 .num_parents = 1, 216 .flags = CLK_SET_RATE_PARENT, 217 }, 218 }; 219 220 static struct clk_regmap g12a_sys_pll_div16_en = { 221 .data = &(struct clk_regmap_gate_data){ 222 .offset = HHI_SYS_CPU_CLK_CNTL1, 223 .bit_idx = 24, 224 }, 225 .hw.init = &(struct clk_init_data) { 226 .name = "sys_pll_div16_en", 227 .ops = &clk_regmap_gate_ro_ops, 228 .parent_hws = (const struct clk_hw *[]) { &g12a_sys_pll.hw }, 229 .num_parents = 1, 230 /* 231 * This clock is used to debug the sys_pll range 232 * Linux should not change it at runtime 233 */ 234 }, 235 }; 236 237 static struct clk_regmap g12b_sys1_pll_div16_en = { 238 .data = &(struct clk_regmap_gate_data){ 239 .offset = HHI_SYS_CPUB_CLK_CNTL1, 240 .bit_idx = 24, 241 }, 242 .hw.init = &(struct clk_init_data) { 243 .name = "sys1_pll_div16_en", 244 .ops = &clk_regmap_gate_ro_ops, 245 .parent_hws = (const struct clk_hw *[]) { 246 &g12b_sys1_pll.hw 247 }, 248 .num_parents = 1, 249 /* 250 * This clock is used to debug the sys_pll range 251 * Linux should not change it at runtime 252 */ 253 }, 254 }; 255 256 static struct clk_fixed_factor g12a_sys_pll_div16 = { 257 .mult = 1, 258 .div = 16, 259 .hw.init = &(struct clk_init_data){ 260 .name = "sys_pll_div16", 261 .ops = &clk_fixed_factor_ops, 262 .parent_hws = (const struct clk_hw *[]) { 263 &g12a_sys_pll_div16_en.hw 264 }, 265 .num_parents = 1, 266 }, 267 }; 268 269 static struct clk_fixed_factor g12b_sys1_pll_div16 = { 270 .mult = 1, 271 .div = 16, 272 .hw.init = &(struct clk_init_data){ 273 .name = "sys1_pll_div16", 274 .ops = &clk_fixed_factor_ops, 275 .parent_hws = (const struct clk_hw *[]) { 276 &g12b_sys1_pll_div16_en.hw 277 }, 278 .num_parents = 1, 279 }, 280 }; 281 282 static struct clk_fixed_factor g12a_fclk_div2_div = { 283 .mult = 1, 284 .div = 2, 285 .hw.init = &(struct clk_init_data){ 286 .name = "fclk_div2_div", 287 .ops = &clk_fixed_factor_ops, 288 .parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw }, 289 .num_parents = 1, 290 }, 291 }; 292 293 static struct clk_regmap g12a_fclk_div2 = { 294 .data = &(struct clk_regmap_gate_data){ 295 .offset = HHI_FIX_PLL_CNTL1, 296 .bit_idx = 24, 297 }, 298 .hw.init = &(struct clk_init_data){ 299 .name = "fclk_div2", 300 .ops = &clk_regmap_gate_ops, 301 .parent_hws = (const struct clk_hw *[]) { 302 &g12a_fclk_div2_div.hw 303 }, 304 .num_parents = 1, 305 /* 306 * Similar to fclk_div3, it seems that this clock is used by 307 * the resident firmware and is required by the platform to 308 * operate correctly. 309 * Until the following condition are met, we need this clock to 310 * be marked as critical: 311 * a) Mark the clock used by a firmware resource, if possible 312 * b) CCF has a clock hand-off mechanism to make the sure the 313 * clock stays on until the proper driver comes along 314 */ 315 .flags = CLK_IS_CRITICAL, 316 }, 317 }; 318 319 static struct clk_fixed_factor g12a_fclk_div3_div = { 320 .mult = 1, 321 .div = 3, 322 .hw.init = &(struct clk_init_data){ 323 .name = "fclk_div3_div", 324 .ops = &clk_fixed_factor_ops, 325 .parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw }, 326 .num_parents = 1, 327 }, 328 }; 329 330 static struct clk_regmap g12a_fclk_div3 = { 331 .data = &(struct clk_regmap_gate_data){ 332 .offset = HHI_FIX_PLL_CNTL1, 333 .bit_idx = 20, 334 }, 335 .hw.init = &(struct clk_init_data){ 336 .name = "fclk_div3", 337 .ops = &clk_regmap_gate_ops, 338 .parent_hws = (const struct clk_hw *[]) { 339 &g12a_fclk_div3_div.hw 340 }, 341 .num_parents = 1, 342 /* 343 * This clock is used by the resident firmware and is required 344 * by the platform to operate correctly. 345 * Until the following condition are met, we need this clock to 346 * be marked as critical: 347 * a) Mark the clock used by a firmware resource, if possible 348 * b) CCF has a clock hand-off mechanism to make the sure the 349 * clock stays on until the proper driver comes along 350 */ 351 .flags = CLK_IS_CRITICAL, 352 }, 353 }; 354 355 /* Datasheet names this field as "premux0" */ 356 static struct clk_regmap g12a_cpu_clk_premux0 = { 357 .data = &(struct clk_regmap_mux_data){ 358 .offset = HHI_SYS_CPU_CLK_CNTL0, 359 .mask = 0x3, 360 .shift = 0, 361 .flags = CLK_MUX_ROUND_CLOSEST, 362 }, 363 .hw.init = &(struct clk_init_data){ 364 .name = "cpu_clk_dyn0_sel", 365 .ops = &clk_regmap_mux_ops, 366 .parent_data = (const struct clk_parent_data []) { 367 { .fw_name = "xtal", }, 368 { .hw = &g12a_fclk_div2.hw }, 369 { .hw = &g12a_fclk_div3.hw }, 370 }, 371 .num_parents = 3, 372 .flags = CLK_SET_RATE_PARENT, 373 }, 374 }; 375 376 /* Datasheet names this field as "premux1" */ 377 static struct clk_regmap g12a_cpu_clk_premux1 = { 378 .data = &(struct clk_regmap_mux_data){ 379 .offset = HHI_SYS_CPU_CLK_CNTL0, 380 .mask = 0x3, 381 .shift = 16, 382 }, 383 .hw.init = &(struct clk_init_data){ 384 .name = "cpu_clk_dyn1_sel", 385 .ops = &clk_regmap_mux_ops, 386 .parent_data = (const struct clk_parent_data []) { 387 { .fw_name = "xtal", }, 388 { .hw = &g12a_fclk_div2.hw }, 389 { .hw = &g12a_fclk_div3.hw }, 390 }, 391 .num_parents = 3, 392 /* This sub-tree is used a parking clock */ 393 .flags = CLK_SET_RATE_NO_REPARENT 394 }, 395 }; 396 397 /* Datasheet names this field as "mux0_divn_tcnt" */ 398 static struct clk_regmap g12a_cpu_clk_mux0_div = { 399 .data = &(struct meson_clk_cpu_dyndiv_data){ 400 .div = { 401 .reg_off = HHI_SYS_CPU_CLK_CNTL0, 402 .shift = 4, 403 .width = 6, 404 }, 405 .dyn = { 406 .reg_off = HHI_SYS_CPU_CLK_CNTL0, 407 .shift = 26, 408 .width = 1, 409 }, 410 }, 411 .hw.init = &(struct clk_init_data){ 412 .name = "cpu_clk_dyn0_div", 413 .ops = &meson_clk_cpu_dyndiv_ops, 414 .parent_hws = (const struct clk_hw *[]) { 415 &g12a_cpu_clk_premux0.hw 416 }, 417 .num_parents = 1, 418 .flags = CLK_SET_RATE_PARENT, 419 }, 420 }; 421 422 /* Datasheet names this field as "postmux0" */ 423 static struct clk_regmap g12a_cpu_clk_postmux0 = { 424 .data = &(struct clk_regmap_mux_data){ 425 .offset = HHI_SYS_CPU_CLK_CNTL0, 426 .mask = 0x1, 427 .shift = 2, 428 .flags = CLK_MUX_ROUND_CLOSEST, 429 }, 430 .hw.init = &(struct clk_init_data){ 431 .name = "cpu_clk_dyn0", 432 .ops = &clk_regmap_mux_ops, 433 .parent_hws = (const struct clk_hw *[]) { 434 &g12a_cpu_clk_premux0.hw, 435 &g12a_cpu_clk_mux0_div.hw, 436 }, 437 .num_parents = 2, 438 .flags = CLK_SET_RATE_PARENT, 439 }, 440 }; 441 442 /* Datasheet names this field as "Mux1_divn_tcnt" */ 443 static struct clk_regmap g12a_cpu_clk_mux1_div = { 444 .data = &(struct clk_regmap_div_data){ 445 .offset = HHI_SYS_CPU_CLK_CNTL0, 446 .shift = 20, 447 .width = 6, 448 }, 449 .hw.init = &(struct clk_init_data){ 450 .name = "cpu_clk_dyn1_div", 451 .ops = &clk_regmap_divider_ro_ops, 452 .parent_hws = (const struct clk_hw *[]) { 453 &g12a_cpu_clk_premux1.hw 454 }, 455 .num_parents = 1, 456 }, 457 }; 458 459 /* Datasheet names this field as "postmux1" */ 460 static struct clk_regmap g12a_cpu_clk_postmux1 = { 461 .data = &(struct clk_regmap_mux_data){ 462 .offset = HHI_SYS_CPU_CLK_CNTL0, 463 .mask = 0x1, 464 .shift = 18, 465 }, 466 .hw.init = &(struct clk_init_data){ 467 .name = "cpu_clk_dyn1", 468 .ops = &clk_regmap_mux_ops, 469 .parent_hws = (const struct clk_hw *[]) { 470 &g12a_cpu_clk_premux1.hw, 471 &g12a_cpu_clk_mux1_div.hw, 472 }, 473 .num_parents = 2, 474 /* This sub-tree is used a parking clock */ 475 .flags = CLK_SET_RATE_NO_REPARENT, 476 }, 477 }; 478 479 /* Datasheet names this field as "Final_dyn_mux_sel" */ 480 static struct clk_regmap g12a_cpu_clk_dyn = { 481 .data = &(struct clk_regmap_mux_data){ 482 .offset = HHI_SYS_CPU_CLK_CNTL0, 483 .mask = 0x1, 484 .shift = 10, 485 .flags = CLK_MUX_ROUND_CLOSEST, 486 }, 487 .hw.init = &(struct clk_init_data){ 488 .name = "cpu_clk_dyn", 489 .ops = &clk_regmap_mux_ops, 490 .parent_hws = (const struct clk_hw *[]) { 491 &g12a_cpu_clk_postmux0.hw, 492 &g12a_cpu_clk_postmux1.hw, 493 }, 494 .num_parents = 2, 495 .flags = CLK_SET_RATE_PARENT, 496 }, 497 }; 498 499 /* Datasheet names this field as "Final_mux_sel" */ 500 static struct clk_regmap g12a_cpu_clk = { 501 .data = &(struct clk_regmap_mux_data){ 502 .offset = HHI_SYS_CPU_CLK_CNTL0, 503 .mask = 0x1, 504 .shift = 11, 505 .flags = CLK_MUX_ROUND_CLOSEST, 506 }, 507 .hw.init = &(struct clk_init_data){ 508 .name = "cpu_clk", 509 .ops = &clk_regmap_mux_ops, 510 .parent_hws = (const struct clk_hw *[]) { 511 &g12a_cpu_clk_dyn.hw, 512 &g12a_sys_pll.hw, 513 }, 514 .num_parents = 2, 515 .flags = CLK_SET_RATE_PARENT, 516 }, 517 }; 518 519 /* Datasheet names this field as "Final_mux_sel" */ 520 static struct clk_regmap g12b_cpu_clk = { 521 .data = &(struct clk_regmap_mux_data){ 522 .offset = HHI_SYS_CPU_CLK_CNTL0, 523 .mask = 0x1, 524 .shift = 11, 525 .flags = CLK_MUX_ROUND_CLOSEST, 526 }, 527 .hw.init = &(struct clk_init_data){ 528 .name = "cpu_clk", 529 .ops = &clk_regmap_mux_ops, 530 .parent_hws = (const struct clk_hw *[]) { 531 &g12a_cpu_clk_dyn.hw, 532 &g12b_sys1_pll.hw 533 }, 534 .num_parents = 2, 535 .flags = CLK_SET_RATE_PARENT, 536 }, 537 }; 538 539 /* Datasheet names this field as "premux0" */ 540 static struct clk_regmap g12b_cpub_clk_premux0 = { 541 .data = &(struct clk_regmap_mux_data){ 542 .offset = HHI_SYS_CPUB_CLK_CNTL, 543 .mask = 0x3, 544 .shift = 0, 545 .flags = CLK_MUX_ROUND_CLOSEST, 546 }, 547 .hw.init = &(struct clk_init_data){ 548 .name = "cpub_clk_dyn0_sel", 549 .ops = &clk_regmap_mux_ops, 550 .parent_data = (const struct clk_parent_data []) { 551 { .fw_name = "xtal", }, 552 { .hw = &g12a_fclk_div2.hw }, 553 { .hw = &g12a_fclk_div3.hw }, 554 }, 555 .num_parents = 3, 556 .flags = CLK_SET_RATE_PARENT, 557 }, 558 }; 559 560 /* Datasheet names this field as "mux0_divn_tcnt" */ 561 static struct clk_regmap g12b_cpub_clk_mux0_div = { 562 .data = &(struct meson_clk_cpu_dyndiv_data){ 563 .div = { 564 .reg_off = HHI_SYS_CPUB_CLK_CNTL, 565 .shift = 4, 566 .width = 6, 567 }, 568 .dyn = { 569 .reg_off = HHI_SYS_CPUB_CLK_CNTL, 570 .shift = 26, 571 .width = 1, 572 }, 573 }, 574 .hw.init = &(struct clk_init_data){ 575 .name = "cpub_clk_dyn0_div", 576 .ops = &meson_clk_cpu_dyndiv_ops, 577 .parent_hws = (const struct clk_hw *[]) { 578 &g12b_cpub_clk_premux0.hw 579 }, 580 .num_parents = 1, 581 .flags = CLK_SET_RATE_PARENT, 582 }, 583 }; 584 585 /* Datasheet names this field as "postmux0" */ 586 static struct clk_regmap g12b_cpub_clk_postmux0 = { 587 .data = &(struct clk_regmap_mux_data){ 588 .offset = HHI_SYS_CPUB_CLK_CNTL, 589 .mask = 0x1, 590 .shift = 2, 591 .flags = CLK_MUX_ROUND_CLOSEST, 592 }, 593 .hw.init = &(struct clk_init_data){ 594 .name = "cpub_clk_dyn0", 595 .ops = &clk_regmap_mux_ops, 596 .parent_hws = (const struct clk_hw *[]) { 597 &g12b_cpub_clk_premux0.hw, 598 &g12b_cpub_clk_mux0_div.hw 599 }, 600 .num_parents = 2, 601 .flags = CLK_SET_RATE_PARENT, 602 }, 603 }; 604 605 /* Datasheet names this field as "premux1" */ 606 static struct clk_regmap g12b_cpub_clk_premux1 = { 607 .data = &(struct clk_regmap_mux_data){ 608 .offset = HHI_SYS_CPUB_CLK_CNTL, 609 .mask = 0x3, 610 .shift = 16, 611 }, 612 .hw.init = &(struct clk_init_data){ 613 .name = "cpub_clk_dyn1_sel", 614 .ops = &clk_regmap_mux_ops, 615 .parent_data = (const struct clk_parent_data []) { 616 { .fw_name = "xtal", }, 617 { .hw = &g12a_fclk_div2.hw }, 618 { .hw = &g12a_fclk_div3.hw }, 619 }, 620 .num_parents = 3, 621 /* This sub-tree is used a parking clock */ 622 .flags = CLK_SET_RATE_NO_REPARENT, 623 }, 624 }; 625 626 /* Datasheet names this field as "Mux1_divn_tcnt" */ 627 static struct clk_regmap g12b_cpub_clk_mux1_div = { 628 .data = &(struct clk_regmap_div_data){ 629 .offset = HHI_SYS_CPUB_CLK_CNTL, 630 .shift = 20, 631 .width = 6, 632 }, 633 .hw.init = &(struct clk_init_data){ 634 .name = "cpub_clk_dyn1_div", 635 .ops = &clk_regmap_divider_ro_ops, 636 .parent_hws = (const struct clk_hw *[]) { 637 &g12b_cpub_clk_premux1.hw 638 }, 639 .num_parents = 1, 640 }, 641 }; 642 643 /* Datasheet names this field as "postmux1" */ 644 static struct clk_regmap g12b_cpub_clk_postmux1 = { 645 .data = &(struct clk_regmap_mux_data){ 646 .offset = HHI_SYS_CPUB_CLK_CNTL, 647 .mask = 0x1, 648 .shift = 18, 649 }, 650 .hw.init = &(struct clk_init_data){ 651 .name = "cpub_clk_dyn1", 652 .ops = &clk_regmap_mux_ops, 653 .parent_hws = (const struct clk_hw *[]) { 654 &g12b_cpub_clk_premux1.hw, 655 &g12b_cpub_clk_mux1_div.hw 656 }, 657 .num_parents = 2, 658 /* This sub-tree is used a parking clock */ 659 .flags = CLK_SET_RATE_NO_REPARENT, 660 }, 661 }; 662 663 /* Datasheet names this field as "Final_dyn_mux_sel" */ 664 static struct clk_regmap g12b_cpub_clk_dyn = { 665 .data = &(struct clk_regmap_mux_data){ 666 .offset = HHI_SYS_CPUB_CLK_CNTL, 667 .mask = 0x1, 668 .shift = 10, 669 .flags = CLK_MUX_ROUND_CLOSEST, 670 }, 671 .hw.init = &(struct clk_init_data){ 672 .name = "cpub_clk_dyn", 673 .ops = &clk_regmap_mux_ops, 674 .parent_hws = (const struct clk_hw *[]) { 675 &g12b_cpub_clk_postmux0.hw, 676 &g12b_cpub_clk_postmux1.hw 677 }, 678 .num_parents = 2, 679 .flags = CLK_SET_RATE_PARENT, 680 }, 681 }; 682 683 /* Datasheet names this field as "Final_mux_sel" */ 684 static struct clk_regmap g12b_cpub_clk = { 685 .data = &(struct clk_regmap_mux_data){ 686 .offset = HHI_SYS_CPUB_CLK_CNTL, 687 .mask = 0x1, 688 .shift = 11, 689 .flags = CLK_MUX_ROUND_CLOSEST, 690 }, 691 .hw.init = &(struct clk_init_data){ 692 .name = "cpub_clk", 693 .ops = &clk_regmap_mux_ops, 694 .parent_hws = (const struct clk_hw *[]) { 695 &g12b_cpub_clk_dyn.hw, 696 &g12a_sys_pll.hw 697 }, 698 .num_parents = 2, 699 .flags = CLK_SET_RATE_PARENT, 700 }, 701 }; 702 703 static struct clk_regmap sm1_gp1_pll; 704 705 /* Datasheet names this field as "premux0" */ 706 static struct clk_regmap sm1_dsu_clk_premux0 = { 707 .data = &(struct clk_regmap_mux_data){ 708 .offset = HHI_SYS_CPU_CLK_CNTL5, 709 .mask = 0x3, 710 .shift = 0, 711 }, 712 .hw.init = &(struct clk_init_data){ 713 .name = "dsu_clk_dyn0_sel", 714 .ops = &clk_regmap_mux_ro_ops, 715 .parent_data = (const struct clk_parent_data []) { 716 { .fw_name = "xtal", }, 717 { .hw = &g12a_fclk_div2.hw }, 718 { .hw = &g12a_fclk_div3.hw }, 719 { .hw = &sm1_gp1_pll.hw }, 720 }, 721 .num_parents = 4, 722 }, 723 }; 724 725 /* Datasheet names this field as "premux1" */ 726 static struct clk_regmap sm1_dsu_clk_premux1 = { 727 .data = &(struct clk_regmap_mux_data){ 728 .offset = HHI_SYS_CPU_CLK_CNTL5, 729 .mask = 0x3, 730 .shift = 16, 731 }, 732 .hw.init = &(struct clk_init_data){ 733 .name = "dsu_clk_dyn1_sel", 734 .ops = &clk_regmap_mux_ro_ops, 735 .parent_data = (const struct clk_parent_data []) { 736 { .fw_name = "xtal", }, 737 { .hw = &g12a_fclk_div2.hw }, 738 { .hw = &g12a_fclk_div3.hw }, 739 { .hw = &sm1_gp1_pll.hw }, 740 }, 741 .num_parents = 4, 742 }, 743 }; 744 745 /* Datasheet names this field as "Mux0_divn_tcnt" */ 746 static struct clk_regmap sm1_dsu_clk_mux0_div = { 747 .data = &(struct clk_regmap_div_data){ 748 .offset = HHI_SYS_CPU_CLK_CNTL5, 749 .shift = 4, 750 .width = 6, 751 }, 752 .hw.init = &(struct clk_init_data){ 753 .name = "dsu_clk_dyn0_div", 754 .ops = &clk_regmap_divider_ro_ops, 755 .parent_hws = (const struct clk_hw *[]) { 756 &sm1_dsu_clk_premux0.hw 757 }, 758 .num_parents = 1, 759 }, 760 }; 761 762 /* Datasheet names this field as "postmux0" */ 763 static struct clk_regmap sm1_dsu_clk_postmux0 = { 764 .data = &(struct clk_regmap_mux_data){ 765 .offset = HHI_SYS_CPU_CLK_CNTL5, 766 .mask = 0x1, 767 .shift = 2, 768 }, 769 .hw.init = &(struct clk_init_data){ 770 .name = "dsu_clk_dyn0", 771 .ops = &clk_regmap_mux_ro_ops, 772 .parent_hws = (const struct clk_hw *[]) { 773 &sm1_dsu_clk_premux0.hw, 774 &sm1_dsu_clk_mux0_div.hw, 775 }, 776 .num_parents = 2, 777 }, 778 }; 779 780 /* Datasheet names this field as "Mux1_divn_tcnt" */ 781 static struct clk_regmap sm1_dsu_clk_mux1_div = { 782 .data = &(struct clk_regmap_div_data){ 783 .offset = HHI_SYS_CPU_CLK_CNTL5, 784 .shift = 20, 785 .width = 6, 786 }, 787 .hw.init = &(struct clk_init_data){ 788 .name = "dsu_clk_dyn1_div", 789 .ops = &clk_regmap_divider_ro_ops, 790 .parent_hws = (const struct clk_hw *[]) { 791 &sm1_dsu_clk_premux1.hw 792 }, 793 .num_parents = 1, 794 }, 795 }; 796 797 /* Datasheet names this field as "postmux1" */ 798 static struct clk_regmap sm1_dsu_clk_postmux1 = { 799 .data = &(struct clk_regmap_mux_data){ 800 .offset = HHI_SYS_CPU_CLK_CNTL5, 801 .mask = 0x1, 802 .shift = 18, 803 }, 804 .hw.init = &(struct clk_init_data){ 805 .name = "dsu_clk_dyn1", 806 .ops = &clk_regmap_mux_ro_ops, 807 .parent_hws = (const struct clk_hw *[]) { 808 &sm1_dsu_clk_premux1.hw, 809 &sm1_dsu_clk_mux1_div.hw, 810 }, 811 .num_parents = 2, 812 }, 813 }; 814 815 /* Datasheet names this field as "Final_dyn_mux_sel" */ 816 static struct clk_regmap sm1_dsu_clk_dyn = { 817 .data = &(struct clk_regmap_mux_data){ 818 .offset = HHI_SYS_CPU_CLK_CNTL5, 819 .mask = 0x1, 820 .shift = 10, 821 }, 822 .hw.init = &(struct clk_init_data){ 823 .name = "dsu_clk_dyn", 824 .ops = &clk_regmap_mux_ro_ops, 825 .parent_hws = (const struct clk_hw *[]) { 826 &sm1_dsu_clk_postmux0.hw, 827 &sm1_dsu_clk_postmux1.hw, 828 }, 829 .num_parents = 2, 830 }, 831 }; 832 833 /* Datasheet names this field as "Final_mux_sel" */ 834 static struct clk_regmap sm1_dsu_final_clk = { 835 .data = &(struct clk_regmap_mux_data){ 836 .offset = HHI_SYS_CPU_CLK_CNTL5, 837 .mask = 0x1, 838 .shift = 11, 839 }, 840 .hw.init = &(struct clk_init_data){ 841 .name = "dsu_clk_final", 842 .ops = &clk_regmap_mux_ro_ops, 843 .parent_hws = (const struct clk_hw *[]) { 844 &sm1_dsu_clk_dyn.hw, 845 &g12a_sys_pll.hw, 846 }, 847 .num_parents = 2, 848 }, 849 }; 850 851 /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 0 */ 852 static struct clk_regmap sm1_cpu1_clk = { 853 .data = &(struct clk_regmap_mux_data){ 854 .offset = HHI_SYS_CPU_CLK_CNTL6, 855 .mask = 0x1, 856 .shift = 24, 857 }, 858 .hw.init = &(struct clk_init_data){ 859 .name = "cpu1_clk", 860 .ops = &clk_regmap_mux_ro_ops, 861 .parent_hws = (const struct clk_hw *[]) { 862 &g12a_cpu_clk.hw, 863 /* This CPU also have a dedicated clock tree */ 864 }, 865 .num_parents = 1, 866 }, 867 }; 868 869 /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 1 */ 870 static struct clk_regmap sm1_cpu2_clk = { 871 .data = &(struct clk_regmap_mux_data){ 872 .offset = HHI_SYS_CPU_CLK_CNTL6, 873 .mask = 0x1, 874 .shift = 25, 875 }, 876 .hw.init = &(struct clk_init_data){ 877 .name = "cpu2_clk", 878 .ops = &clk_regmap_mux_ro_ops, 879 .parent_hws = (const struct clk_hw *[]) { 880 &g12a_cpu_clk.hw, 881 /* This CPU also have a dedicated clock tree */ 882 }, 883 .num_parents = 1, 884 }, 885 }; 886 887 /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 2 */ 888 static struct clk_regmap sm1_cpu3_clk = { 889 .data = &(struct clk_regmap_mux_data){ 890 .offset = HHI_SYS_CPU_CLK_CNTL6, 891 .mask = 0x1, 892 .shift = 26, 893 }, 894 .hw.init = &(struct clk_init_data){ 895 .name = "cpu3_clk", 896 .ops = &clk_regmap_mux_ro_ops, 897 .parent_hws = (const struct clk_hw *[]) { 898 &g12a_cpu_clk.hw, 899 /* This CPU also have a dedicated clock tree */ 900 }, 901 .num_parents = 1, 902 }, 903 }; 904 905 /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 4 */ 906 static struct clk_regmap sm1_dsu_clk = { 907 .data = &(struct clk_regmap_mux_data){ 908 .offset = HHI_SYS_CPU_CLK_CNTL6, 909 .mask = 0x1, 910 .shift = 27, 911 }, 912 .hw.init = &(struct clk_init_data){ 913 .name = "dsu_clk", 914 .ops = &clk_regmap_mux_ro_ops, 915 .parent_hws = (const struct clk_hw *[]) { 916 &g12a_cpu_clk.hw, 917 &sm1_dsu_final_clk.hw, 918 }, 919 .num_parents = 2, 920 }, 921 }; 922 923 static int g12a_cpu_clk_mux_notifier_cb(struct notifier_block *nb, 924 unsigned long event, void *data) 925 { 926 if (event == POST_RATE_CHANGE || event == PRE_RATE_CHANGE) { 927 /* Wait for clock propagation before/after changing the mux */ 928 udelay(100); 929 return NOTIFY_OK; 930 } 931 932 return NOTIFY_DONE; 933 } 934 935 static struct notifier_block g12a_cpu_clk_mux_nb = { 936 .notifier_call = g12a_cpu_clk_mux_notifier_cb, 937 }; 938 939 struct g12a_cpu_clk_postmux_nb_data { 940 struct notifier_block nb; 941 struct clk_hw *xtal; 942 struct clk_hw *cpu_clk_dyn; 943 struct clk_hw *cpu_clk_postmux0; 944 struct clk_hw *cpu_clk_postmux1; 945 struct clk_hw *cpu_clk_premux1; 946 }; 947 948 static int g12a_cpu_clk_postmux_notifier_cb(struct notifier_block *nb, 949 unsigned long event, void *data) 950 { 951 struct g12a_cpu_clk_postmux_nb_data *nb_data = 952 container_of(nb, struct g12a_cpu_clk_postmux_nb_data, nb); 953 954 switch (event) { 955 case PRE_RATE_CHANGE: 956 /* 957 * This notifier means cpu_clk_postmux0 clock will be changed 958 * to feed cpu_clk, this is the current path : 959 * cpu_clk 960 * \- cpu_clk_dyn 961 * \- cpu_clk_postmux0 962 * \- cpu_clk_muxX_div 963 * \- cpu_clk_premux0 964 * \- fclk_div3 or fclk_div2 965 * OR 966 * \- cpu_clk_premux0 967 * \- fclk_div3 or fclk_div2 968 */ 969 970 /* Setup cpu_clk_premux1 to xtal */ 971 clk_hw_set_parent(nb_data->cpu_clk_premux1, 972 nb_data->xtal); 973 974 /* Setup cpu_clk_postmux1 to bypass divider */ 975 clk_hw_set_parent(nb_data->cpu_clk_postmux1, 976 nb_data->cpu_clk_premux1); 977 978 /* Switch to parking clk on cpu_clk_postmux1 */ 979 clk_hw_set_parent(nb_data->cpu_clk_dyn, 980 nb_data->cpu_clk_postmux1); 981 982 /* 983 * Now, cpu_clk is 24MHz in the current path : 984 * cpu_clk 985 * \- cpu_clk_dyn 986 * \- cpu_clk_postmux1 987 * \- cpu_clk_premux1 988 * \- xtal 989 */ 990 991 udelay(100); 992 993 return NOTIFY_OK; 994 995 case POST_RATE_CHANGE: 996 /* 997 * The cpu_clk_postmux0 has ben updated, now switch back 998 * cpu_clk_dyn to cpu_clk_postmux0 and take the changes 999 * in account. 1000 */ 1001 1002 /* Configure cpu_clk_dyn back to cpu_clk_postmux0 */ 1003 clk_hw_set_parent(nb_data->cpu_clk_dyn, 1004 nb_data->cpu_clk_postmux0); 1005 1006 /* 1007 * new path : 1008 * cpu_clk 1009 * \- cpu_clk_dyn 1010 * \- cpu_clk_postmux0 1011 * \- cpu_clk_muxX_div 1012 * \- cpu_clk_premux0 1013 * \- fclk_div3 or fclk_div2 1014 * OR 1015 * \- cpu_clk_premux0 1016 * \- fclk_div3 or fclk_div2 1017 */ 1018 1019 udelay(100); 1020 1021 return NOTIFY_OK; 1022 1023 default: 1024 return NOTIFY_DONE; 1025 } 1026 } 1027 1028 static struct g12a_cpu_clk_postmux_nb_data g12a_cpu_clk_postmux0_nb_data = { 1029 .cpu_clk_dyn = &g12a_cpu_clk_dyn.hw, 1030 .cpu_clk_postmux0 = &g12a_cpu_clk_postmux0.hw, 1031 .cpu_clk_postmux1 = &g12a_cpu_clk_postmux1.hw, 1032 .cpu_clk_premux1 = &g12a_cpu_clk_premux1.hw, 1033 .nb.notifier_call = g12a_cpu_clk_postmux_notifier_cb, 1034 }; 1035 1036 static struct g12a_cpu_clk_postmux_nb_data g12b_cpub_clk_postmux0_nb_data = { 1037 .cpu_clk_dyn = &g12b_cpub_clk_dyn.hw, 1038 .cpu_clk_postmux0 = &g12b_cpub_clk_postmux0.hw, 1039 .cpu_clk_postmux1 = &g12b_cpub_clk_postmux1.hw, 1040 .cpu_clk_premux1 = &g12b_cpub_clk_premux1.hw, 1041 .nb.notifier_call = g12a_cpu_clk_postmux_notifier_cb, 1042 }; 1043 1044 struct g12a_sys_pll_nb_data { 1045 struct notifier_block nb; 1046 struct clk_hw *sys_pll; 1047 struct clk_hw *cpu_clk; 1048 struct clk_hw *cpu_clk_dyn; 1049 }; 1050 1051 static int g12a_sys_pll_notifier_cb(struct notifier_block *nb, 1052 unsigned long event, void *data) 1053 { 1054 struct g12a_sys_pll_nb_data *nb_data = 1055 container_of(nb, struct g12a_sys_pll_nb_data, nb); 1056 1057 switch (event) { 1058 case PRE_RATE_CHANGE: 1059 /* 1060 * This notifier means sys_pll clock will be changed 1061 * to feed cpu_clk, this the current path : 1062 * cpu_clk 1063 * \- sys_pll 1064 * \- sys_pll_dco 1065 */ 1066 1067 /* Configure cpu_clk to use cpu_clk_dyn */ 1068 clk_hw_set_parent(nb_data->cpu_clk, 1069 nb_data->cpu_clk_dyn); 1070 1071 /* 1072 * Now, cpu_clk uses the dyn path 1073 * cpu_clk 1074 * \- cpu_clk_dyn 1075 * \- cpu_clk_dynX 1076 * \- cpu_clk_dynX_sel 1077 * \- cpu_clk_dynX_div 1078 * \- xtal/fclk_div2/fclk_div3 1079 * \- xtal/fclk_div2/fclk_div3 1080 */ 1081 1082 udelay(100); 1083 1084 return NOTIFY_OK; 1085 1086 case POST_RATE_CHANGE: 1087 /* 1088 * The sys_pll has ben updated, now switch back cpu_clk to 1089 * sys_pll 1090 */ 1091 1092 /* Configure cpu_clk to use sys_pll */ 1093 clk_hw_set_parent(nb_data->cpu_clk, 1094 nb_data->sys_pll); 1095 1096 udelay(100); 1097 1098 /* new path : 1099 * cpu_clk 1100 * \- sys_pll 1101 * \- sys_pll_dco 1102 */ 1103 1104 return NOTIFY_OK; 1105 1106 default: 1107 return NOTIFY_DONE; 1108 } 1109 } 1110 1111 static struct g12a_sys_pll_nb_data g12a_sys_pll_nb_data = { 1112 .sys_pll = &g12a_sys_pll.hw, 1113 .cpu_clk = &g12a_cpu_clk.hw, 1114 .cpu_clk_dyn = &g12a_cpu_clk_dyn.hw, 1115 .nb.notifier_call = g12a_sys_pll_notifier_cb, 1116 }; 1117 1118 /* G12B first CPU cluster uses sys1_pll */ 1119 static struct g12a_sys_pll_nb_data g12b_cpu_clk_sys1_pll_nb_data = { 1120 .sys_pll = &g12b_sys1_pll.hw, 1121 .cpu_clk = &g12b_cpu_clk.hw, 1122 .cpu_clk_dyn = &g12a_cpu_clk_dyn.hw, 1123 .nb.notifier_call = g12a_sys_pll_notifier_cb, 1124 }; 1125 1126 /* G12B second CPU cluster uses sys_pll */ 1127 static struct g12a_sys_pll_nb_data g12b_cpub_clk_sys_pll_nb_data = { 1128 .sys_pll = &g12a_sys_pll.hw, 1129 .cpu_clk = &g12b_cpub_clk.hw, 1130 .cpu_clk_dyn = &g12b_cpub_clk_dyn.hw, 1131 .nb.notifier_call = g12a_sys_pll_notifier_cb, 1132 }; 1133 1134 static struct clk_regmap g12a_cpu_clk_div16_en = { 1135 .data = &(struct clk_regmap_gate_data){ 1136 .offset = HHI_SYS_CPU_CLK_CNTL1, 1137 .bit_idx = 1, 1138 }, 1139 .hw.init = &(struct clk_init_data) { 1140 .name = "cpu_clk_div16_en", 1141 .ops = &clk_regmap_gate_ro_ops, 1142 .parent_hws = (const struct clk_hw *[]) { 1143 &g12a_cpu_clk.hw 1144 }, 1145 .num_parents = 1, 1146 /* 1147 * This clock is used to debug the cpu_clk range 1148 * Linux should not change it at runtime 1149 */ 1150 }, 1151 }; 1152 1153 static struct clk_regmap g12b_cpub_clk_div16_en = { 1154 .data = &(struct clk_regmap_gate_data){ 1155 .offset = HHI_SYS_CPUB_CLK_CNTL1, 1156 .bit_idx = 1, 1157 }, 1158 .hw.init = &(struct clk_init_data) { 1159 .name = "cpub_clk_div16_en", 1160 .ops = &clk_regmap_gate_ro_ops, 1161 .parent_hws = (const struct clk_hw *[]) { 1162 &g12b_cpub_clk.hw 1163 }, 1164 .num_parents = 1, 1165 /* 1166 * This clock is used to debug the cpu_clk range 1167 * Linux should not change it at runtime 1168 */ 1169 }, 1170 }; 1171 1172 static struct clk_fixed_factor g12a_cpu_clk_div16 = { 1173 .mult = 1, 1174 .div = 16, 1175 .hw.init = &(struct clk_init_data){ 1176 .name = "cpu_clk_div16", 1177 .ops = &clk_fixed_factor_ops, 1178 .parent_hws = (const struct clk_hw *[]) { 1179 &g12a_cpu_clk_div16_en.hw 1180 }, 1181 .num_parents = 1, 1182 }, 1183 }; 1184 1185 static struct clk_fixed_factor g12b_cpub_clk_div16 = { 1186 .mult = 1, 1187 .div = 16, 1188 .hw.init = &(struct clk_init_data){ 1189 .name = "cpub_clk_div16", 1190 .ops = &clk_fixed_factor_ops, 1191 .parent_hws = (const struct clk_hw *[]) { 1192 &g12b_cpub_clk_div16_en.hw 1193 }, 1194 .num_parents = 1, 1195 }, 1196 }; 1197 1198 static struct clk_regmap g12a_cpu_clk_apb_div = { 1199 .data = &(struct clk_regmap_div_data){ 1200 .offset = HHI_SYS_CPU_CLK_CNTL1, 1201 .shift = 3, 1202 .width = 3, 1203 .flags = CLK_DIVIDER_POWER_OF_TWO, 1204 }, 1205 .hw.init = &(struct clk_init_data){ 1206 .name = "cpu_clk_apb_div", 1207 .ops = &clk_regmap_divider_ro_ops, 1208 .parent_hws = (const struct clk_hw *[]) { &g12a_cpu_clk.hw }, 1209 .num_parents = 1, 1210 }, 1211 }; 1212 1213 static struct clk_regmap g12a_cpu_clk_apb = { 1214 .data = &(struct clk_regmap_gate_data){ 1215 .offset = HHI_SYS_CPU_CLK_CNTL1, 1216 .bit_idx = 1, 1217 }, 1218 .hw.init = &(struct clk_init_data) { 1219 .name = "cpu_clk_apb", 1220 .ops = &clk_regmap_gate_ro_ops, 1221 .parent_hws = (const struct clk_hw *[]) { 1222 &g12a_cpu_clk_apb_div.hw 1223 }, 1224 .num_parents = 1, 1225 /* 1226 * This clock is set by the ROM monitor code, 1227 * Linux should not change it at runtime 1228 */ 1229 }, 1230 }; 1231 1232 static struct clk_regmap g12a_cpu_clk_atb_div = { 1233 .data = &(struct clk_regmap_div_data){ 1234 .offset = HHI_SYS_CPU_CLK_CNTL1, 1235 .shift = 6, 1236 .width = 3, 1237 .flags = CLK_DIVIDER_POWER_OF_TWO, 1238 }, 1239 .hw.init = &(struct clk_init_data){ 1240 .name = "cpu_clk_atb_div", 1241 .ops = &clk_regmap_divider_ro_ops, 1242 .parent_hws = (const struct clk_hw *[]) { &g12a_cpu_clk.hw }, 1243 .num_parents = 1, 1244 }, 1245 }; 1246 1247 static struct clk_regmap g12a_cpu_clk_atb = { 1248 .data = &(struct clk_regmap_gate_data){ 1249 .offset = HHI_SYS_CPU_CLK_CNTL1, 1250 .bit_idx = 17, 1251 }, 1252 .hw.init = &(struct clk_init_data) { 1253 .name = "cpu_clk_atb", 1254 .ops = &clk_regmap_gate_ro_ops, 1255 .parent_hws = (const struct clk_hw *[]) { 1256 &g12a_cpu_clk_atb_div.hw 1257 }, 1258 .num_parents = 1, 1259 /* 1260 * This clock is set by the ROM monitor code, 1261 * Linux should not change it at runtime 1262 */ 1263 }, 1264 }; 1265 1266 static struct clk_regmap g12a_cpu_clk_axi_div = { 1267 .data = &(struct clk_regmap_div_data){ 1268 .offset = HHI_SYS_CPU_CLK_CNTL1, 1269 .shift = 9, 1270 .width = 3, 1271 .flags = CLK_DIVIDER_POWER_OF_TWO, 1272 }, 1273 .hw.init = &(struct clk_init_data){ 1274 .name = "cpu_clk_axi_div", 1275 .ops = &clk_regmap_divider_ro_ops, 1276 .parent_hws = (const struct clk_hw *[]) { &g12a_cpu_clk.hw }, 1277 .num_parents = 1, 1278 }, 1279 }; 1280 1281 static struct clk_regmap g12a_cpu_clk_axi = { 1282 .data = &(struct clk_regmap_gate_data){ 1283 .offset = HHI_SYS_CPU_CLK_CNTL1, 1284 .bit_idx = 18, 1285 }, 1286 .hw.init = &(struct clk_init_data) { 1287 .name = "cpu_clk_axi", 1288 .ops = &clk_regmap_gate_ro_ops, 1289 .parent_hws = (const struct clk_hw *[]) { 1290 &g12a_cpu_clk_axi_div.hw 1291 }, 1292 .num_parents = 1, 1293 /* 1294 * This clock is set by the ROM monitor code, 1295 * Linux should not change it at runtime 1296 */ 1297 }, 1298 }; 1299 1300 static struct clk_regmap g12a_cpu_clk_trace_div = { 1301 .data = &(struct clk_regmap_div_data){ 1302 .offset = HHI_SYS_CPU_CLK_CNTL1, 1303 .shift = 20, 1304 .width = 3, 1305 .flags = CLK_DIVIDER_POWER_OF_TWO, 1306 }, 1307 .hw.init = &(struct clk_init_data){ 1308 .name = "cpu_clk_trace_div", 1309 .ops = &clk_regmap_divider_ro_ops, 1310 .parent_data = &(const struct clk_parent_data) { 1311 /* 1312 * Note: 1313 * G12A and G12B have different cpu_clks (with 1314 * different struct clk_hw). We fallback to the global 1315 * naming string mechanism so cpu_clk_trace_div picks 1316 * up the appropriate one. 1317 */ 1318 .name = "cpu_clk", 1319 .index = -1, 1320 }, 1321 .num_parents = 1, 1322 }, 1323 }; 1324 1325 static struct clk_regmap g12a_cpu_clk_trace = { 1326 .data = &(struct clk_regmap_gate_data){ 1327 .offset = HHI_SYS_CPU_CLK_CNTL1, 1328 .bit_idx = 23, 1329 }, 1330 .hw.init = &(struct clk_init_data) { 1331 .name = "cpu_clk_trace", 1332 .ops = &clk_regmap_gate_ro_ops, 1333 .parent_hws = (const struct clk_hw *[]) { 1334 &g12a_cpu_clk_trace_div.hw 1335 }, 1336 .num_parents = 1, 1337 /* 1338 * This clock is set by the ROM monitor code, 1339 * Linux should not change it at runtime 1340 */ 1341 }, 1342 }; 1343 1344 static struct clk_fixed_factor g12b_cpub_clk_div2 = { 1345 .mult = 1, 1346 .div = 2, 1347 .hw.init = &(struct clk_init_data){ 1348 .name = "cpub_clk_div2", 1349 .ops = &clk_fixed_factor_ops, 1350 .parent_hws = (const struct clk_hw *[]) { 1351 &g12b_cpub_clk.hw 1352 }, 1353 .num_parents = 1, 1354 }, 1355 }; 1356 1357 static struct clk_fixed_factor g12b_cpub_clk_div3 = { 1358 .mult = 1, 1359 .div = 3, 1360 .hw.init = &(struct clk_init_data){ 1361 .name = "cpub_clk_div3", 1362 .ops = &clk_fixed_factor_ops, 1363 .parent_hws = (const struct clk_hw *[]) { 1364 &g12b_cpub_clk.hw 1365 }, 1366 .num_parents = 1, 1367 }, 1368 }; 1369 1370 static struct clk_fixed_factor g12b_cpub_clk_div4 = { 1371 .mult = 1, 1372 .div = 4, 1373 .hw.init = &(struct clk_init_data){ 1374 .name = "cpub_clk_div4", 1375 .ops = &clk_fixed_factor_ops, 1376 .parent_hws = (const struct clk_hw *[]) { 1377 &g12b_cpub_clk.hw 1378 }, 1379 .num_parents = 1, 1380 }, 1381 }; 1382 1383 static struct clk_fixed_factor g12b_cpub_clk_div5 = { 1384 .mult = 1, 1385 .div = 5, 1386 .hw.init = &(struct clk_init_data){ 1387 .name = "cpub_clk_div5", 1388 .ops = &clk_fixed_factor_ops, 1389 .parent_hws = (const struct clk_hw *[]) { 1390 &g12b_cpub_clk.hw 1391 }, 1392 .num_parents = 1, 1393 }, 1394 }; 1395 1396 static struct clk_fixed_factor g12b_cpub_clk_div6 = { 1397 .mult = 1, 1398 .div = 6, 1399 .hw.init = &(struct clk_init_data){ 1400 .name = "cpub_clk_div6", 1401 .ops = &clk_fixed_factor_ops, 1402 .parent_hws = (const struct clk_hw *[]) { 1403 &g12b_cpub_clk.hw 1404 }, 1405 .num_parents = 1, 1406 }, 1407 }; 1408 1409 static struct clk_fixed_factor g12b_cpub_clk_div7 = { 1410 .mult = 1, 1411 .div = 7, 1412 .hw.init = &(struct clk_init_data){ 1413 .name = "cpub_clk_div7", 1414 .ops = &clk_fixed_factor_ops, 1415 .parent_hws = (const struct clk_hw *[]) { 1416 &g12b_cpub_clk.hw 1417 }, 1418 .num_parents = 1, 1419 }, 1420 }; 1421 1422 static struct clk_fixed_factor g12b_cpub_clk_div8 = { 1423 .mult = 1, 1424 .div = 8, 1425 .hw.init = &(struct clk_init_data){ 1426 .name = "cpub_clk_div8", 1427 .ops = &clk_fixed_factor_ops, 1428 .parent_hws = (const struct clk_hw *[]) { 1429 &g12b_cpub_clk.hw 1430 }, 1431 .num_parents = 1, 1432 }, 1433 }; 1434 1435 static u32 mux_table_cpub[] = { 1, 2, 3, 4, 5, 6, 7 }; 1436 static struct clk_regmap g12b_cpub_clk_apb_sel = { 1437 .data = &(struct clk_regmap_mux_data){ 1438 .offset = HHI_SYS_CPUB_CLK_CNTL1, 1439 .mask = 7, 1440 .shift = 3, 1441 .table = mux_table_cpub, 1442 }, 1443 .hw.init = &(struct clk_init_data){ 1444 .name = "cpub_clk_apb_sel", 1445 .ops = &clk_regmap_mux_ro_ops, 1446 .parent_hws = (const struct clk_hw *[]) { 1447 &g12b_cpub_clk_div2.hw, 1448 &g12b_cpub_clk_div3.hw, 1449 &g12b_cpub_clk_div4.hw, 1450 &g12b_cpub_clk_div5.hw, 1451 &g12b_cpub_clk_div6.hw, 1452 &g12b_cpub_clk_div7.hw, 1453 &g12b_cpub_clk_div8.hw 1454 }, 1455 .num_parents = 7, 1456 }, 1457 }; 1458 1459 static struct clk_regmap g12b_cpub_clk_apb = { 1460 .data = &(struct clk_regmap_gate_data){ 1461 .offset = HHI_SYS_CPUB_CLK_CNTL1, 1462 .bit_idx = 16, 1463 .flags = CLK_GATE_SET_TO_DISABLE, 1464 }, 1465 .hw.init = &(struct clk_init_data) { 1466 .name = "cpub_clk_apb", 1467 .ops = &clk_regmap_gate_ro_ops, 1468 .parent_hws = (const struct clk_hw *[]) { 1469 &g12b_cpub_clk_apb_sel.hw 1470 }, 1471 .num_parents = 1, 1472 /* 1473 * This clock is set by the ROM monitor code, 1474 * Linux should not change it at runtime 1475 */ 1476 }, 1477 }; 1478 1479 static struct clk_regmap g12b_cpub_clk_atb_sel = { 1480 .data = &(struct clk_regmap_mux_data){ 1481 .offset = HHI_SYS_CPUB_CLK_CNTL1, 1482 .mask = 7, 1483 .shift = 6, 1484 .table = mux_table_cpub, 1485 }, 1486 .hw.init = &(struct clk_init_data){ 1487 .name = "cpub_clk_atb_sel", 1488 .ops = &clk_regmap_mux_ro_ops, 1489 .parent_hws = (const struct clk_hw *[]) { 1490 &g12b_cpub_clk_div2.hw, 1491 &g12b_cpub_clk_div3.hw, 1492 &g12b_cpub_clk_div4.hw, 1493 &g12b_cpub_clk_div5.hw, 1494 &g12b_cpub_clk_div6.hw, 1495 &g12b_cpub_clk_div7.hw, 1496 &g12b_cpub_clk_div8.hw 1497 }, 1498 .num_parents = 7, 1499 }, 1500 }; 1501 1502 static struct clk_regmap g12b_cpub_clk_atb = { 1503 .data = &(struct clk_regmap_gate_data){ 1504 .offset = HHI_SYS_CPUB_CLK_CNTL1, 1505 .bit_idx = 17, 1506 .flags = CLK_GATE_SET_TO_DISABLE, 1507 }, 1508 .hw.init = &(struct clk_init_data) { 1509 .name = "cpub_clk_atb", 1510 .ops = &clk_regmap_gate_ro_ops, 1511 .parent_hws = (const struct clk_hw *[]) { 1512 &g12b_cpub_clk_atb_sel.hw 1513 }, 1514 .num_parents = 1, 1515 /* 1516 * This clock is set by the ROM monitor code, 1517 * Linux should not change it at runtime 1518 */ 1519 }, 1520 }; 1521 1522 static struct clk_regmap g12b_cpub_clk_axi_sel = { 1523 .data = &(struct clk_regmap_mux_data){ 1524 .offset = HHI_SYS_CPUB_CLK_CNTL1, 1525 .mask = 7, 1526 .shift = 9, 1527 .table = mux_table_cpub, 1528 }, 1529 .hw.init = &(struct clk_init_data){ 1530 .name = "cpub_clk_axi_sel", 1531 .ops = &clk_regmap_mux_ro_ops, 1532 .parent_hws = (const struct clk_hw *[]) { 1533 &g12b_cpub_clk_div2.hw, 1534 &g12b_cpub_clk_div3.hw, 1535 &g12b_cpub_clk_div4.hw, 1536 &g12b_cpub_clk_div5.hw, 1537 &g12b_cpub_clk_div6.hw, 1538 &g12b_cpub_clk_div7.hw, 1539 &g12b_cpub_clk_div8.hw 1540 }, 1541 .num_parents = 7, 1542 }, 1543 }; 1544 1545 static struct clk_regmap g12b_cpub_clk_axi = { 1546 .data = &(struct clk_regmap_gate_data){ 1547 .offset = HHI_SYS_CPUB_CLK_CNTL1, 1548 .bit_idx = 18, 1549 .flags = CLK_GATE_SET_TO_DISABLE, 1550 }, 1551 .hw.init = &(struct clk_init_data) { 1552 .name = "cpub_clk_axi", 1553 .ops = &clk_regmap_gate_ro_ops, 1554 .parent_hws = (const struct clk_hw *[]) { 1555 &g12b_cpub_clk_axi_sel.hw 1556 }, 1557 .num_parents = 1, 1558 /* 1559 * This clock is set by the ROM monitor code, 1560 * Linux should not change it at runtime 1561 */ 1562 }, 1563 }; 1564 1565 static struct clk_regmap g12b_cpub_clk_trace_sel = { 1566 .data = &(struct clk_regmap_mux_data){ 1567 .offset = HHI_SYS_CPUB_CLK_CNTL1, 1568 .mask = 7, 1569 .shift = 20, 1570 .table = mux_table_cpub, 1571 }, 1572 .hw.init = &(struct clk_init_data){ 1573 .name = "cpub_clk_trace_sel", 1574 .ops = &clk_regmap_mux_ro_ops, 1575 .parent_hws = (const struct clk_hw *[]) { 1576 &g12b_cpub_clk_div2.hw, 1577 &g12b_cpub_clk_div3.hw, 1578 &g12b_cpub_clk_div4.hw, 1579 &g12b_cpub_clk_div5.hw, 1580 &g12b_cpub_clk_div6.hw, 1581 &g12b_cpub_clk_div7.hw, 1582 &g12b_cpub_clk_div8.hw 1583 }, 1584 .num_parents = 7, 1585 }, 1586 }; 1587 1588 static struct clk_regmap g12b_cpub_clk_trace = { 1589 .data = &(struct clk_regmap_gate_data){ 1590 .offset = HHI_SYS_CPUB_CLK_CNTL1, 1591 .bit_idx = 23, 1592 .flags = CLK_GATE_SET_TO_DISABLE, 1593 }, 1594 .hw.init = &(struct clk_init_data) { 1595 .name = "cpub_clk_trace", 1596 .ops = &clk_regmap_gate_ro_ops, 1597 .parent_hws = (const struct clk_hw *[]) { 1598 &g12b_cpub_clk_trace_sel.hw 1599 }, 1600 .num_parents = 1, 1601 /* 1602 * This clock is set by the ROM monitor code, 1603 * Linux should not change it at runtime 1604 */ 1605 }, 1606 }; 1607 1608 static const struct pll_mult_range g12a_gp0_pll_mult_range = { 1609 .min = 125, 1610 .max = 255, 1611 }; 1612 1613 /* 1614 * Internal gp0 pll emulation configuration parameters 1615 */ 1616 static const struct reg_sequence g12a_gp0_init_regs[] = { 1617 { .reg = HHI_GP0_PLL_CNTL1, .def = 0x00000000 }, 1618 { .reg = HHI_GP0_PLL_CNTL2, .def = 0x00000000 }, 1619 { .reg = HHI_GP0_PLL_CNTL3, .def = 0x48681c00 }, 1620 { .reg = HHI_GP0_PLL_CNTL4, .def = 0x33771290 }, 1621 { .reg = HHI_GP0_PLL_CNTL5, .def = 0x39272000 }, 1622 { .reg = HHI_GP0_PLL_CNTL6, .def = 0x56540000 }, 1623 }; 1624 1625 static struct clk_regmap g12a_gp0_pll_dco = { 1626 .data = &(struct meson_clk_pll_data){ 1627 .en = { 1628 .reg_off = HHI_GP0_PLL_CNTL0, 1629 .shift = 28, 1630 .width = 1, 1631 }, 1632 .m = { 1633 .reg_off = HHI_GP0_PLL_CNTL0, 1634 .shift = 0, 1635 .width = 8, 1636 }, 1637 .n = { 1638 .reg_off = HHI_GP0_PLL_CNTL0, 1639 .shift = 10, 1640 .width = 5, 1641 }, 1642 .frac = { 1643 .reg_off = HHI_GP0_PLL_CNTL1, 1644 .shift = 0, 1645 .width = 17, 1646 }, 1647 .l = { 1648 .reg_off = HHI_GP0_PLL_CNTL0, 1649 .shift = 31, 1650 .width = 1, 1651 }, 1652 .rst = { 1653 .reg_off = HHI_GP0_PLL_CNTL0, 1654 .shift = 29, 1655 .width = 1, 1656 }, 1657 .range = &g12a_gp0_pll_mult_range, 1658 .init_regs = g12a_gp0_init_regs, 1659 .init_count = ARRAY_SIZE(g12a_gp0_init_regs), 1660 }, 1661 .hw.init = &(struct clk_init_data){ 1662 .name = "gp0_pll_dco", 1663 .ops = &meson_clk_pll_ops, 1664 .parent_data = &(const struct clk_parent_data) { 1665 .fw_name = "xtal", 1666 }, 1667 .num_parents = 1, 1668 }, 1669 }; 1670 1671 static struct clk_regmap g12a_gp0_pll = { 1672 .data = &(struct clk_regmap_div_data){ 1673 .offset = HHI_GP0_PLL_CNTL0, 1674 .shift = 16, 1675 .width = 3, 1676 .flags = (CLK_DIVIDER_POWER_OF_TWO | 1677 CLK_DIVIDER_ROUND_CLOSEST), 1678 }, 1679 .hw.init = &(struct clk_init_data){ 1680 .name = "gp0_pll", 1681 .ops = &clk_regmap_divider_ops, 1682 .parent_hws = (const struct clk_hw *[]) { 1683 &g12a_gp0_pll_dco.hw 1684 }, 1685 .num_parents = 1, 1686 .flags = CLK_SET_RATE_PARENT, 1687 }, 1688 }; 1689 1690 static struct clk_regmap sm1_gp1_pll_dco = { 1691 .data = &(struct meson_clk_pll_data){ 1692 .en = { 1693 .reg_off = HHI_GP1_PLL_CNTL0, 1694 .shift = 28, 1695 .width = 1, 1696 }, 1697 .m = { 1698 .reg_off = HHI_GP1_PLL_CNTL0, 1699 .shift = 0, 1700 .width = 8, 1701 }, 1702 .n = { 1703 .reg_off = HHI_GP1_PLL_CNTL0, 1704 .shift = 10, 1705 .width = 5, 1706 }, 1707 .frac = { 1708 .reg_off = HHI_GP1_PLL_CNTL1, 1709 .shift = 0, 1710 .width = 17, 1711 }, 1712 .l = { 1713 .reg_off = HHI_GP1_PLL_CNTL0, 1714 .shift = 31, 1715 .width = 1, 1716 }, 1717 .rst = { 1718 .reg_off = HHI_GP1_PLL_CNTL0, 1719 .shift = 29, 1720 .width = 1, 1721 }, 1722 }, 1723 .hw.init = &(struct clk_init_data){ 1724 .name = "gp1_pll_dco", 1725 .ops = &meson_clk_pll_ro_ops, 1726 .parent_data = &(const struct clk_parent_data) { 1727 .fw_name = "xtal", 1728 }, 1729 .num_parents = 1, 1730 /* This clock feeds the DSU, avoid disabling it */ 1731 .flags = CLK_IS_CRITICAL, 1732 }, 1733 }; 1734 1735 static struct clk_regmap sm1_gp1_pll = { 1736 .data = &(struct clk_regmap_div_data){ 1737 .offset = HHI_GP1_PLL_CNTL0, 1738 .shift = 16, 1739 .width = 3, 1740 .flags = (CLK_DIVIDER_POWER_OF_TWO | 1741 CLK_DIVIDER_ROUND_CLOSEST), 1742 }, 1743 .hw.init = &(struct clk_init_data){ 1744 .name = "gp1_pll", 1745 .ops = &clk_regmap_divider_ro_ops, 1746 .parent_hws = (const struct clk_hw *[]) { 1747 &sm1_gp1_pll_dco.hw 1748 }, 1749 .num_parents = 1, 1750 }, 1751 }; 1752 1753 /* 1754 * Internal hifi pll emulation configuration parameters 1755 */ 1756 static const struct reg_sequence g12a_hifi_init_regs[] = { 1757 { .reg = HHI_HIFI_PLL_CNTL1, .def = 0x00000000 }, 1758 { .reg = HHI_HIFI_PLL_CNTL2, .def = 0x00000000 }, 1759 { .reg = HHI_HIFI_PLL_CNTL3, .def = 0x6a285c00 }, 1760 { .reg = HHI_HIFI_PLL_CNTL4, .def = 0x65771290 }, 1761 { .reg = HHI_HIFI_PLL_CNTL5, .def = 0x39272000 }, 1762 { .reg = HHI_HIFI_PLL_CNTL6, .def = 0x56540000 }, 1763 }; 1764 1765 static struct clk_regmap g12a_hifi_pll_dco = { 1766 .data = &(struct meson_clk_pll_data){ 1767 .en = { 1768 .reg_off = HHI_HIFI_PLL_CNTL0, 1769 .shift = 28, 1770 .width = 1, 1771 }, 1772 .m = { 1773 .reg_off = HHI_HIFI_PLL_CNTL0, 1774 .shift = 0, 1775 .width = 8, 1776 }, 1777 .n = { 1778 .reg_off = HHI_HIFI_PLL_CNTL0, 1779 .shift = 10, 1780 .width = 5, 1781 }, 1782 .frac = { 1783 .reg_off = HHI_HIFI_PLL_CNTL1, 1784 .shift = 0, 1785 .width = 17, 1786 }, 1787 .l = { 1788 .reg_off = HHI_HIFI_PLL_CNTL0, 1789 .shift = 31, 1790 .width = 1, 1791 }, 1792 .rst = { 1793 .reg_off = HHI_HIFI_PLL_CNTL0, 1794 .shift = 29, 1795 .width = 1, 1796 }, 1797 .range = &g12a_gp0_pll_mult_range, 1798 .init_regs = g12a_hifi_init_regs, 1799 .init_count = ARRAY_SIZE(g12a_hifi_init_regs), 1800 .flags = CLK_MESON_PLL_ROUND_CLOSEST, 1801 }, 1802 .hw.init = &(struct clk_init_data){ 1803 .name = "hifi_pll_dco", 1804 .ops = &meson_clk_pll_ops, 1805 .parent_data = &(const struct clk_parent_data) { 1806 .fw_name = "xtal", 1807 }, 1808 .num_parents = 1, 1809 }, 1810 }; 1811 1812 static struct clk_regmap g12a_hifi_pll = { 1813 .data = &(struct clk_regmap_div_data){ 1814 .offset = HHI_HIFI_PLL_CNTL0, 1815 .shift = 16, 1816 .width = 2, 1817 .flags = (CLK_DIVIDER_POWER_OF_TWO | 1818 CLK_DIVIDER_ROUND_CLOSEST), 1819 }, 1820 .hw.init = &(struct clk_init_data){ 1821 .name = "hifi_pll", 1822 .ops = &clk_regmap_divider_ops, 1823 .parent_hws = (const struct clk_hw *[]) { 1824 &g12a_hifi_pll_dco.hw 1825 }, 1826 .num_parents = 1, 1827 .flags = CLK_SET_RATE_PARENT, 1828 }, 1829 }; 1830 1831 /* 1832 * The Meson G12A PCIE PLL is fined tuned to deliver a very precise 1833 * 100MHz reference clock for the PCIe Analog PHY, and thus requires 1834 * a strict register sequence to enable the PLL. 1835 */ 1836 static const struct reg_sequence g12a_pcie_pll_init_regs[] = { 1837 { .reg = HHI_PCIE_PLL_CNTL0, .def = 0x20090496 }, 1838 { .reg = HHI_PCIE_PLL_CNTL0, .def = 0x30090496 }, 1839 { .reg = HHI_PCIE_PLL_CNTL1, .def = 0x00000000 }, 1840 { .reg = HHI_PCIE_PLL_CNTL2, .def = 0x00001100 }, 1841 { .reg = HHI_PCIE_PLL_CNTL3, .def = 0x10058e00 }, 1842 { .reg = HHI_PCIE_PLL_CNTL4, .def = 0x000100c0 }, 1843 { .reg = HHI_PCIE_PLL_CNTL5, .def = 0x68000048 }, 1844 { .reg = HHI_PCIE_PLL_CNTL5, .def = 0x68000068, .delay_us = 20 }, 1845 { .reg = HHI_PCIE_PLL_CNTL4, .def = 0x008100c0, .delay_us = 10 }, 1846 { .reg = HHI_PCIE_PLL_CNTL0, .def = 0x34090496 }, 1847 { .reg = HHI_PCIE_PLL_CNTL0, .def = 0x14090496, .delay_us = 10 }, 1848 { .reg = HHI_PCIE_PLL_CNTL2, .def = 0x00001000 }, 1849 }; 1850 1851 /* Keep a single entry table for recalc/round_rate() ops */ 1852 static const struct pll_params_table g12a_pcie_pll_table[] = { 1853 PLL_PARAMS(150, 1), 1854 {0, 0}, 1855 }; 1856 1857 static struct clk_regmap g12a_pcie_pll_dco = { 1858 .data = &(struct meson_clk_pll_data){ 1859 .en = { 1860 .reg_off = HHI_PCIE_PLL_CNTL0, 1861 .shift = 28, 1862 .width = 1, 1863 }, 1864 .m = { 1865 .reg_off = HHI_PCIE_PLL_CNTL0, 1866 .shift = 0, 1867 .width = 8, 1868 }, 1869 .n = { 1870 .reg_off = HHI_PCIE_PLL_CNTL0, 1871 .shift = 10, 1872 .width = 5, 1873 }, 1874 .frac = { 1875 .reg_off = HHI_PCIE_PLL_CNTL1, 1876 .shift = 0, 1877 .width = 12, 1878 }, 1879 .l = { 1880 .reg_off = HHI_PCIE_PLL_CNTL0, 1881 .shift = 31, 1882 .width = 1, 1883 }, 1884 .rst = { 1885 .reg_off = HHI_PCIE_PLL_CNTL0, 1886 .shift = 29, 1887 .width = 1, 1888 }, 1889 .table = g12a_pcie_pll_table, 1890 .init_regs = g12a_pcie_pll_init_regs, 1891 .init_count = ARRAY_SIZE(g12a_pcie_pll_init_regs), 1892 }, 1893 .hw.init = &(struct clk_init_data){ 1894 .name = "pcie_pll_dco", 1895 .ops = &meson_clk_pcie_pll_ops, 1896 .parent_data = &(const struct clk_parent_data) { 1897 .fw_name = "xtal", 1898 }, 1899 .num_parents = 1, 1900 }, 1901 }; 1902 1903 static struct clk_fixed_factor g12a_pcie_pll_dco_div2 = { 1904 .mult = 1, 1905 .div = 2, 1906 .hw.init = &(struct clk_init_data){ 1907 .name = "pcie_pll_dco_div2", 1908 .ops = &clk_fixed_factor_ops, 1909 .parent_hws = (const struct clk_hw *[]) { 1910 &g12a_pcie_pll_dco.hw 1911 }, 1912 .num_parents = 1, 1913 .flags = CLK_SET_RATE_PARENT, 1914 }, 1915 }; 1916 1917 static struct clk_regmap g12a_pcie_pll_od = { 1918 .data = &(struct clk_regmap_div_data){ 1919 .offset = HHI_PCIE_PLL_CNTL0, 1920 .shift = 16, 1921 .width = 5, 1922 .flags = CLK_DIVIDER_ROUND_CLOSEST | 1923 CLK_DIVIDER_ONE_BASED | 1924 CLK_DIVIDER_ALLOW_ZERO, 1925 }, 1926 .hw.init = &(struct clk_init_data){ 1927 .name = "pcie_pll_od", 1928 .ops = &clk_regmap_divider_ops, 1929 .parent_hws = (const struct clk_hw *[]) { 1930 &g12a_pcie_pll_dco_div2.hw 1931 }, 1932 .num_parents = 1, 1933 .flags = CLK_SET_RATE_PARENT, 1934 }, 1935 }; 1936 1937 static struct clk_fixed_factor g12a_pcie_pll = { 1938 .mult = 1, 1939 .div = 2, 1940 .hw.init = &(struct clk_init_data){ 1941 .name = "pcie_pll_pll", 1942 .ops = &clk_fixed_factor_ops, 1943 .parent_hws = (const struct clk_hw *[]) { 1944 &g12a_pcie_pll_od.hw 1945 }, 1946 .num_parents = 1, 1947 .flags = CLK_SET_RATE_PARENT, 1948 }, 1949 }; 1950 1951 static struct clk_regmap g12a_hdmi_pll_dco = { 1952 .data = &(struct meson_clk_pll_data){ 1953 .en = { 1954 .reg_off = HHI_HDMI_PLL_CNTL0, 1955 .shift = 28, 1956 .width = 1, 1957 }, 1958 .m = { 1959 .reg_off = HHI_HDMI_PLL_CNTL0, 1960 .shift = 0, 1961 .width = 8, 1962 }, 1963 .n = { 1964 .reg_off = HHI_HDMI_PLL_CNTL0, 1965 .shift = 10, 1966 .width = 5, 1967 }, 1968 .frac = { 1969 .reg_off = HHI_HDMI_PLL_CNTL1, 1970 .shift = 0, 1971 .width = 16, 1972 }, 1973 .l = { 1974 .reg_off = HHI_HDMI_PLL_CNTL0, 1975 .shift = 30, 1976 .width = 1, 1977 }, 1978 .rst = { 1979 .reg_off = HHI_HDMI_PLL_CNTL0, 1980 .shift = 29, 1981 .width = 1, 1982 }, 1983 }, 1984 .hw.init = &(struct clk_init_data){ 1985 .name = "hdmi_pll_dco", 1986 .ops = &meson_clk_pll_ro_ops, 1987 .parent_data = &(const struct clk_parent_data) { 1988 .fw_name = "xtal", 1989 }, 1990 .num_parents = 1, 1991 /* 1992 * Display directly handle hdmi pll registers ATM, we need 1993 * NOCACHE to keep our view of the clock as accurate as possible 1994 */ 1995 .flags = CLK_GET_RATE_NOCACHE, 1996 }, 1997 }; 1998 1999 static struct clk_regmap g12a_hdmi_pll_od = { 2000 .data = &(struct clk_regmap_div_data){ 2001 .offset = HHI_HDMI_PLL_CNTL0, 2002 .shift = 16, 2003 .width = 2, 2004 .flags = CLK_DIVIDER_POWER_OF_TWO, 2005 }, 2006 .hw.init = &(struct clk_init_data){ 2007 .name = "hdmi_pll_od", 2008 .ops = &clk_regmap_divider_ro_ops, 2009 .parent_hws = (const struct clk_hw *[]) { 2010 &g12a_hdmi_pll_dco.hw 2011 }, 2012 .num_parents = 1, 2013 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT, 2014 }, 2015 }; 2016 2017 static struct clk_regmap g12a_hdmi_pll_od2 = { 2018 .data = &(struct clk_regmap_div_data){ 2019 .offset = HHI_HDMI_PLL_CNTL0, 2020 .shift = 18, 2021 .width = 2, 2022 .flags = CLK_DIVIDER_POWER_OF_TWO, 2023 }, 2024 .hw.init = &(struct clk_init_data){ 2025 .name = "hdmi_pll_od2", 2026 .ops = &clk_regmap_divider_ro_ops, 2027 .parent_hws = (const struct clk_hw *[]) { 2028 &g12a_hdmi_pll_od.hw 2029 }, 2030 .num_parents = 1, 2031 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT, 2032 }, 2033 }; 2034 2035 static struct clk_regmap g12a_hdmi_pll = { 2036 .data = &(struct clk_regmap_div_data){ 2037 .offset = HHI_HDMI_PLL_CNTL0, 2038 .shift = 20, 2039 .width = 2, 2040 .flags = CLK_DIVIDER_POWER_OF_TWO, 2041 }, 2042 .hw.init = &(struct clk_init_data){ 2043 .name = "hdmi_pll", 2044 .ops = &clk_regmap_divider_ro_ops, 2045 .parent_hws = (const struct clk_hw *[]) { 2046 &g12a_hdmi_pll_od2.hw 2047 }, 2048 .num_parents = 1, 2049 .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT, 2050 }, 2051 }; 2052 2053 static struct clk_fixed_factor g12a_fclk_div4_div = { 2054 .mult = 1, 2055 .div = 4, 2056 .hw.init = &(struct clk_init_data){ 2057 .name = "fclk_div4_div", 2058 .ops = &clk_fixed_factor_ops, 2059 .parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw }, 2060 .num_parents = 1, 2061 }, 2062 }; 2063 2064 static struct clk_regmap g12a_fclk_div4 = { 2065 .data = &(struct clk_regmap_gate_data){ 2066 .offset = HHI_FIX_PLL_CNTL1, 2067 .bit_idx = 21, 2068 }, 2069 .hw.init = &(struct clk_init_data){ 2070 .name = "fclk_div4", 2071 .ops = &clk_regmap_gate_ops, 2072 .parent_hws = (const struct clk_hw *[]) { 2073 &g12a_fclk_div4_div.hw 2074 }, 2075 .num_parents = 1, 2076 }, 2077 }; 2078 2079 static struct clk_fixed_factor g12a_fclk_div5_div = { 2080 .mult = 1, 2081 .div = 5, 2082 .hw.init = &(struct clk_init_data){ 2083 .name = "fclk_div5_div", 2084 .ops = &clk_fixed_factor_ops, 2085 .parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw }, 2086 .num_parents = 1, 2087 }, 2088 }; 2089 2090 static struct clk_regmap g12a_fclk_div5 = { 2091 .data = &(struct clk_regmap_gate_data){ 2092 .offset = HHI_FIX_PLL_CNTL1, 2093 .bit_idx = 22, 2094 }, 2095 .hw.init = &(struct clk_init_data){ 2096 .name = "fclk_div5", 2097 .ops = &clk_regmap_gate_ops, 2098 .parent_hws = (const struct clk_hw *[]) { 2099 &g12a_fclk_div5_div.hw 2100 }, 2101 .num_parents = 1, 2102 }, 2103 }; 2104 2105 static struct clk_fixed_factor g12a_fclk_div7_div = { 2106 .mult = 1, 2107 .div = 7, 2108 .hw.init = &(struct clk_init_data){ 2109 .name = "fclk_div7_div", 2110 .ops = &clk_fixed_factor_ops, 2111 .parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw }, 2112 .num_parents = 1, 2113 }, 2114 }; 2115 2116 static struct clk_regmap g12a_fclk_div7 = { 2117 .data = &(struct clk_regmap_gate_data){ 2118 .offset = HHI_FIX_PLL_CNTL1, 2119 .bit_idx = 23, 2120 }, 2121 .hw.init = &(struct clk_init_data){ 2122 .name = "fclk_div7", 2123 .ops = &clk_regmap_gate_ops, 2124 .parent_hws = (const struct clk_hw *[]) { 2125 &g12a_fclk_div7_div.hw 2126 }, 2127 .num_parents = 1, 2128 }, 2129 }; 2130 2131 static struct clk_fixed_factor g12a_fclk_div2p5_div = { 2132 .mult = 1, 2133 .div = 5, 2134 .hw.init = &(struct clk_init_data){ 2135 .name = "fclk_div2p5_div", 2136 .ops = &clk_fixed_factor_ops, 2137 .parent_hws = (const struct clk_hw *[]) { 2138 &g12a_fixed_pll_dco.hw 2139 }, 2140 .num_parents = 1, 2141 }, 2142 }; 2143 2144 static struct clk_regmap g12a_fclk_div2p5 = { 2145 .data = &(struct clk_regmap_gate_data){ 2146 .offset = HHI_FIX_PLL_CNTL1, 2147 .bit_idx = 25, 2148 }, 2149 .hw.init = &(struct clk_init_data){ 2150 .name = "fclk_div2p5", 2151 .ops = &clk_regmap_gate_ops, 2152 .parent_hws = (const struct clk_hw *[]) { 2153 &g12a_fclk_div2p5_div.hw 2154 }, 2155 .num_parents = 1, 2156 }, 2157 }; 2158 2159 static struct clk_fixed_factor g12a_mpll_50m_div = { 2160 .mult = 1, 2161 .div = 80, 2162 .hw.init = &(struct clk_init_data){ 2163 .name = "mpll_50m_div", 2164 .ops = &clk_fixed_factor_ops, 2165 .parent_hws = (const struct clk_hw *[]) { 2166 &g12a_fixed_pll_dco.hw 2167 }, 2168 .num_parents = 1, 2169 }, 2170 }; 2171 2172 static struct clk_regmap g12a_mpll_50m = { 2173 .data = &(struct clk_regmap_mux_data){ 2174 .offset = HHI_FIX_PLL_CNTL3, 2175 .mask = 0x1, 2176 .shift = 5, 2177 }, 2178 .hw.init = &(struct clk_init_data){ 2179 .name = "mpll_50m", 2180 .ops = &clk_regmap_mux_ro_ops, 2181 .parent_data = (const struct clk_parent_data []) { 2182 { .fw_name = "xtal", }, 2183 { .hw = &g12a_mpll_50m_div.hw }, 2184 }, 2185 .num_parents = 2, 2186 }, 2187 }; 2188 2189 static struct clk_fixed_factor g12a_mpll_prediv = { 2190 .mult = 1, 2191 .div = 2, 2192 .hw.init = &(struct clk_init_data){ 2193 .name = "mpll_prediv", 2194 .ops = &clk_fixed_factor_ops, 2195 .parent_hws = (const struct clk_hw *[]) { 2196 &g12a_fixed_pll_dco.hw 2197 }, 2198 .num_parents = 1, 2199 }, 2200 }; 2201 2202 static const struct reg_sequence g12a_mpll0_init_regs[] = { 2203 { .reg = HHI_MPLL_CNTL2, .def = 0x40000033 }, 2204 }; 2205 2206 static struct clk_regmap g12a_mpll0_div = { 2207 .data = &(struct meson_clk_mpll_data){ 2208 .sdm = { 2209 .reg_off = HHI_MPLL_CNTL1, 2210 .shift = 0, 2211 .width = 14, 2212 }, 2213 .sdm_en = { 2214 .reg_off = HHI_MPLL_CNTL1, 2215 .shift = 30, 2216 .width = 1, 2217 }, 2218 .n2 = { 2219 .reg_off = HHI_MPLL_CNTL1, 2220 .shift = 20, 2221 .width = 9, 2222 }, 2223 .ssen = { 2224 .reg_off = HHI_MPLL_CNTL1, 2225 .shift = 29, 2226 .width = 1, 2227 }, 2228 .lock = &meson_clk_lock, 2229 .init_regs = g12a_mpll0_init_regs, 2230 .init_count = ARRAY_SIZE(g12a_mpll0_init_regs), 2231 }, 2232 .hw.init = &(struct clk_init_data){ 2233 .name = "mpll0_div", 2234 .ops = &meson_clk_mpll_ops, 2235 .parent_hws = (const struct clk_hw *[]) { 2236 &g12a_mpll_prediv.hw 2237 }, 2238 .num_parents = 1, 2239 }, 2240 }; 2241 2242 static struct clk_regmap g12a_mpll0 = { 2243 .data = &(struct clk_regmap_gate_data){ 2244 .offset = HHI_MPLL_CNTL1, 2245 .bit_idx = 31, 2246 }, 2247 .hw.init = &(struct clk_init_data){ 2248 .name = "mpll0", 2249 .ops = &clk_regmap_gate_ops, 2250 .parent_hws = (const struct clk_hw *[]) { &g12a_mpll0_div.hw }, 2251 .num_parents = 1, 2252 .flags = CLK_SET_RATE_PARENT, 2253 }, 2254 }; 2255 2256 static const struct reg_sequence g12a_mpll1_init_regs[] = { 2257 { .reg = HHI_MPLL_CNTL4, .def = 0x40000033 }, 2258 }; 2259 2260 static struct clk_regmap g12a_mpll1_div = { 2261 .data = &(struct meson_clk_mpll_data){ 2262 .sdm = { 2263 .reg_off = HHI_MPLL_CNTL3, 2264 .shift = 0, 2265 .width = 14, 2266 }, 2267 .sdm_en = { 2268 .reg_off = HHI_MPLL_CNTL3, 2269 .shift = 30, 2270 .width = 1, 2271 }, 2272 .n2 = { 2273 .reg_off = HHI_MPLL_CNTL3, 2274 .shift = 20, 2275 .width = 9, 2276 }, 2277 .ssen = { 2278 .reg_off = HHI_MPLL_CNTL3, 2279 .shift = 29, 2280 .width = 1, 2281 }, 2282 .lock = &meson_clk_lock, 2283 .init_regs = g12a_mpll1_init_regs, 2284 .init_count = ARRAY_SIZE(g12a_mpll1_init_regs), 2285 }, 2286 .hw.init = &(struct clk_init_data){ 2287 .name = "mpll1_div", 2288 .ops = &meson_clk_mpll_ops, 2289 .parent_hws = (const struct clk_hw *[]) { 2290 &g12a_mpll_prediv.hw 2291 }, 2292 .num_parents = 1, 2293 }, 2294 }; 2295 2296 static struct clk_regmap g12a_mpll1 = { 2297 .data = &(struct clk_regmap_gate_data){ 2298 .offset = HHI_MPLL_CNTL3, 2299 .bit_idx = 31, 2300 }, 2301 .hw.init = &(struct clk_init_data){ 2302 .name = "mpll1", 2303 .ops = &clk_regmap_gate_ops, 2304 .parent_hws = (const struct clk_hw *[]) { &g12a_mpll1_div.hw }, 2305 .num_parents = 1, 2306 .flags = CLK_SET_RATE_PARENT, 2307 }, 2308 }; 2309 2310 static const struct reg_sequence g12a_mpll2_init_regs[] = { 2311 { .reg = HHI_MPLL_CNTL6, .def = 0x40000033 }, 2312 }; 2313 2314 static struct clk_regmap g12a_mpll2_div = { 2315 .data = &(struct meson_clk_mpll_data){ 2316 .sdm = { 2317 .reg_off = HHI_MPLL_CNTL5, 2318 .shift = 0, 2319 .width = 14, 2320 }, 2321 .sdm_en = { 2322 .reg_off = HHI_MPLL_CNTL5, 2323 .shift = 30, 2324 .width = 1, 2325 }, 2326 .n2 = { 2327 .reg_off = HHI_MPLL_CNTL5, 2328 .shift = 20, 2329 .width = 9, 2330 }, 2331 .ssen = { 2332 .reg_off = HHI_MPLL_CNTL5, 2333 .shift = 29, 2334 .width = 1, 2335 }, 2336 .lock = &meson_clk_lock, 2337 .init_regs = g12a_mpll2_init_regs, 2338 .init_count = ARRAY_SIZE(g12a_mpll2_init_regs), 2339 }, 2340 .hw.init = &(struct clk_init_data){ 2341 .name = "mpll2_div", 2342 .ops = &meson_clk_mpll_ops, 2343 .parent_hws = (const struct clk_hw *[]) { 2344 &g12a_mpll_prediv.hw 2345 }, 2346 .num_parents = 1, 2347 }, 2348 }; 2349 2350 static struct clk_regmap g12a_mpll2 = { 2351 .data = &(struct clk_regmap_gate_data){ 2352 .offset = HHI_MPLL_CNTL5, 2353 .bit_idx = 31, 2354 }, 2355 .hw.init = &(struct clk_init_data){ 2356 .name = "mpll2", 2357 .ops = &clk_regmap_gate_ops, 2358 .parent_hws = (const struct clk_hw *[]) { &g12a_mpll2_div.hw }, 2359 .num_parents = 1, 2360 .flags = CLK_SET_RATE_PARENT, 2361 }, 2362 }; 2363 2364 static const struct reg_sequence g12a_mpll3_init_regs[] = { 2365 { .reg = HHI_MPLL_CNTL8, .def = 0x40000033 }, 2366 }; 2367 2368 static struct clk_regmap g12a_mpll3_div = { 2369 .data = &(struct meson_clk_mpll_data){ 2370 .sdm = { 2371 .reg_off = HHI_MPLL_CNTL7, 2372 .shift = 0, 2373 .width = 14, 2374 }, 2375 .sdm_en = { 2376 .reg_off = HHI_MPLL_CNTL7, 2377 .shift = 30, 2378 .width = 1, 2379 }, 2380 .n2 = { 2381 .reg_off = HHI_MPLL_CNTL7, 2382 .shift = 20, 2383 .width = 9, 2384 }, 2385 .ssen = { 2386 .reg_off = HHI_MPLL_CNTL7, 2387 .shift = 29, 2388 .width = 1, 2389 }, 2390 .lock = &meson_clk_lock, 2391 .init_regs = g12a_mpll3_init_regs, 2392 .init_count = ARRAY_SIZE(g12a_mpll3_init_regs), 2393 }, 2394 .hw.init = &(struct clk_init_data){ 2395 .name = "mpll3_div", 2396 .ops = &meson_clk_mpll_ops, 2397 .parent_hws = (const struct clk_hw *[]) { 2398 &g12a_mpll_prediv.hw 2399 }, 2400 .num_parents = 1, 2401 }, 2402 }; 2403 2404 static struct clk_regmap g12a_mpll3 = { 2405 .data = &(struct clk_regmap_gate_data){ 2406 .offset = HHI_MPLL_CNTL7, 2407 .bit_idx = 31, 2408 }, 2409 .hw.init = &(struct clk_init_data){ 2410 .name = "mpll3", 2411 .ops = &clk_regmap_gate_ops, 2412 .parent_hws = (const struct clk_hw *[]) { &g12a_mpll3_div.hw }, 2413 .num_parents = 1, 2414 .flags = CLK_SET_RATE_PARENT, 2415 }, 2416 }; 2417 2418 static u32 mux_table_clk81[] = { 0, 2, 3, 4, 5, 6, 7 }; 2419 static const struct clk_parent_data clk81_parent_data[] = { 2420 { .fw_name = "xtal", }, 2421 { .hw = &g12a_fclk_div7.hw }, 2422 { .hw = &g12a_mpll1.hw }, 2423 { .hw = &g12a_mpll2.hw }, 2424 { .hw = &g12a_fclk_div4.hw }, 2425 { .hw = &g12a_fclk_div3.hw }, 2426 { .hw = &g12a_fclk_div5.hw }, 2427 }; 2428 2429 static struct clk_regmap g12a_mpeg_clk_sel = { 2430 .data = &(struct clk_regmap_mux_data){ 2431 .offset = HHI_MPEG_CLK_CNTL, 2432 .mask = 0x7, 2433 .shift = 12, 2434 .table = mux_table_clk81, 2435 }, 2436 .hw.init = &(struct clk_init_data){ 2437 .name = "mpeg_clk_sel", 2438 .ops = &clk_regmap_mux_ro_ops, 2439 .parent_data = clk81_parent_data, 2440 .num_parents = ARRAY_SIZE(clk81_parent_data), 2441 }, 2442 }; 2443 2444 static struct clk_regmap g12a_mpeg_clk_div = { 2445 .data = &(struct clk_regmap_div_data){ 2446 .offset = HHI_MPEG_CLK_CNTL, 2447 .shift = 0, 2448 .width = 7, 2449 }, 2450 .hw.init = &(struct clk_init_data){ 2451 .name = "mpeg_clk_div", 2452 .ops = &clk_regmap_divider_ops, 2453 .parent_hws = (const struct clk_hw *[]) { 2454 &g12a_mpeg_clk_sel.hw 2455 }, 2456 .num_parents = 1, 2457 .flags = CLK_SET_RATE_PARENT, 2458 }, 2459 }; 2460 2461 static struct clk_regmap g12a_clk81 = { 2462 .data = &(struct clk_regmap_gate_data){ 2463 .offset = HHI_MPEG_CLK_CNTL, 2464 .bit_idx = 7, 2465 }, 2466 .hw.init = &(struct clk_init_data){ 2467 .name = "clk81", 2468 .ops = &clk_regmap_gate_ops, 2469 .parent_hws = (const struct clk_hw *[]) { 2470 &g12a_mpeg_clk_div.hw 2471 }, 2472 .num_parents = 1, 2473 .flags = (CLK_SET_RATE_PARENT | CLK_IS_CRITICAL), 2474 }, 2475 }; 2476 2477 static const struct clk_parent_data g12a_sd_emmc_clk0_parent_data[] = { 2478 { .fw_name = "xtal", }, 2479 { .hw = &g12a_fclk_div2.hw }, 2480 { .hw = &g12a_fclk_div3.hw }, 2481 { .hw = &g12a_fclk_div5.hw }, 2482 { .hw = &g12a_fclk_div7.hw }, 2483 /* 2484 * Following these parent clocks, we should also have had mpll2, mpll3 2485 * and gp0_pll but these clocks are too precious to be used here. All 2486 * the necessary rates for MMC and NAND operation can be acheived using 2487 * g12a_ee_core or fclk_div clocks 2488 */ 2489 }; 2490 2491 /* SDIO clock */ 2492 static struct clk_regmap g12a_sd_emmc_a_clk0_sel = { 2493 .data = &(struct clk_regmap_mux_data){ 2494 .offset = HHI_SD_EMMC_CLK_CNTL, 2495 .mask = 0x7, 2496 .shift = 9, 2497 }, 2498 .hw.init = &(struct clk_init_data) { 2499 .name = "sd_emmc_a_clk0_sel", 2500 .ops = &clk_regmap_mux_ops, 2501 .parent_data = g12a_sd_emmc_clk0_parent_data, 2502 .num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_data), 2503 .flags = CLK_SET_RATE_PARENT, 2504 }, 2505 }; 2506 2507 static struct clk_regmap g12a_sd_emmc_a_clk0_div = { 2508 .data = &(struct clk_regmap_div_data){ 2509 .offset = HHI_SD_EMMC_CLK_CNTL, 2510 .shift = 0, 2511 .width = 7, 2512 }, 2513 .hw.init = &(struct clk_init_data) { 2514 .name = "sd_emmc_a_clk0_div", 2515 .ops = &clk_regmap_divider_ops, 2516 .parent_hws = (const struct clk_hw *[]) { 2517 &g12a_sd_emmc_a_clk0_sel.hw 2518 }, 2519 .num_parents = 1, 2520 .flags = CLK_SET_RATE_PARENT, 2521 }, 2522 }; 2523 2524 static struct clk_regmap g12a_sd_emmc_a_clk0 = { 2525 .data = &(struct clk_regmap_gate_data){ 2526 .offset = HHI_SD_EMMC_CLK_CNTL, 2527 .bit_idx = 7, 2528 }, 2529 .hw.init = &(struct clk_init_data){ 2530 .name = "sd_emmc_a_clk0", 2531 .ops = &clk_regmap_gate_ops, 2532 .parent_hws = (const struct clk_hw *[]) { 2533 &g12a_sd_emmc_a_clk0_div.hw 2534 }, 2535 .num_parents = 1, 2536 .flags = CLK_SET_RATE_PARENT, 2537 }, 2538 }; 2539 2540 /* SDcard clock */ 2541 static struct clk_regmap g12a_sd_emmc_b_clk0_sel = { 2542 .data = &(struct clk_regmap_mux_data){ 2543 .offset = HHI_SD_EMMC_CLK_CNTL, 2544 .mask = 0x7, 2545 .shift = 25, 2546 }, 2547 .hw.init = &(struct clk_init_data) { 2548 .name = "sd_emmc_b_clk0_sel", 2549 .ops = &clk_regmap_mux_ops, 2550 .parent_data = g12a_sd_emmc_clk0_parent_data, 2551 .num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_data), 2552 .flags = CLK_SET_RATE_PARENT, 2553 }, 2554 }; 2555 2556 static struct clk_regmap g12a_sd_emmc_b_clk0_div = { 2557 .data = &(struct clk_regmap_div_data){ 2558 .offset = HHI_SD_EMMC_CLK_CNTL, 2559 .shift = 16, 2560 .width = 7, 2561 }, 2562 .hw.init = &(struct clk_init_data) { 2563 .name = "sd_emmc_b_clk0_div", 2564 .ops = &clk_regmap_divider_ops, 2565 .parent_hws = (const struct clk_hw *[]) { 2566 &g12a_sd_emmc_b_clk0_sel.hw 2567 }, 2568 .num_parents = 1, 2569 .flags = CLK_SET_RATE_PARENT, 2570 }, 2571 }; 2572 2573 static struct clk_regmap g12a_sd_emmc_b_clk0 = { 2574 .data = &(struct clk_regmap_gate_data){ 2575 .offset = HHI_SD_EMMC_CLK_CNTL, 2576 .bit_idx = 23, 2577 }, 2578 .hw.init = &(struct clk_init_data){ 2579 .name = "sd_emmc_b_clk0", 2580 .ops = &clk_regmap_gate_ops, 2581 .parent_hws = (const struct clk_hw *[]) { 2582 &g12a_sd_emmc_b_clk0_div.hw 2583 }, 2584 .num_parents = 1, 2585 .flags = CLK_SET_RATE_PARENT, 2586 }, 2587 }; 2588 2589 /* EMMC/NAND clock */ 2590 static struct clk_regmap g12a_sd_emmc_c_clk0_sel = { 2591 .data = &(struct clk_regmap_mux_data){ 2592 .offset = HHI_NAND_CLK_CNTL, 2593 .mask = 0x7, 2594 .shift = 9, 2595 }, 2596 .hw.init = &(struct clk_init_data) { 2597 .name = "sd_emmc_c_clk0_sel", 2598 .ops = &clk_regmap_mux_ops, 2599 .parent_data = g12a_sd_emmc_clk0_parent_data, 2600 .num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_data), 2601 .flags = CLK_SET_RATE_PARENT, 2602 }, 2603 }; 2604 2605 static struct clk_regmap g12a_sd_emmc_c_clk0_div = { 2606 .data = &(struct clk_regmap_div_data){ 2607 .offset = HHI_NAND_CLK_CNTL, 2608 .shift = 0, 2609 .width = 7, 2610 }, 2611 .hw.init = &(struct clk_init_data) { 2612 .name = "sd_emmc_c_clk0_div", 2613 .ops = &clk_regmap_divider_ops, 2614 .parent_hws = (const struct clk_hw *[]) { 2615 &g12a_sd_emmc_c_clk0_sel.hw 2616 }, 2617 .num_parents = 1, 2618 .flags = CLK_SET_RATE_PARENT, 2619 }, 2620 }; 2621 2622 static struct clk_regmap g12a_sd_emmc_c_clk0 = { 2623 .data = &(struct clk_regmap_gate_data){ 2624 .offset = HHI_NAND_CLK_CNTL, 2625 .bit_idx = 7, 2626 }, 2627 .hw.init = &(struct clk_init_data){ 2628 .name = "sd_emmc_c_clk0", 2629 .ops = &clk_regmap_gate_ops, 2630 .parent_hws = (const struct clk_hw *[]) { 2631 &g12a_sd_emmc_c_clk0_div.hw 2632 }, 2633 .num_parents = 1, 2634 .flags = CLK_SET_RATE_PARENT, 2635 }, 2636 }; 2637 2638 /* Video Clocks */ 2639 2640 static struct clk_regmap g12a_vid_pll_div = { 2641 .data = &(struct meson_vid_pll_div_data){ 2642 .val = { 2643 .reg_off = HHI_VID_PLL_CLK_DIV, 2644 .shift = 0, 2645 .width = 15, 2646 }, 2647 .sel = { 2648 .reg_off = HHI_VID_PLL_CLK_DIV, 2649 .shift = 16, 2650 .width = 2, 2651 }, 2652 }, 2653 .hw.init = &(struct clk_init_data) { 2654 .name = "vid_pll_div", 2655 .ops = &meson_vid_pll_div_ro_ops, 2656 .parent_hws = (const struct clk_hw *[]) { &g12a_hdmi_pll.hw }, 2657 .num_parents = 1, 2658 .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, 2659 }, 2660 }; 2661 2662 static const struct clk_hw *g12a_vid_pll_parent_hws[] = { 2663 &g12a_vid_pll_div.hw, 2664 &g12a_hdmi_pll.hw, 2665 }; 2666 2667 static struct clk_regmap g12a_vid_pll_sel = { 2668 .data = &(struct clk_regmap_mux_data){ 2669 .offset = HHI_VID_PLL_CLK_DIV, 2670 .mask = 0x1, 2671 .shift = 18, 2672 }, 2673 .hw.init = &(struct clk_init_data){ 2674 .name = "vid_pll_sel", 2675 .ops = &clk_regmap_mux_ops, 2676 /* 2677 * bit 18 selects from 2 possible parents: 2678 * vid_pll_div or hdmi_pll 2679 */ 2680 .parent_hws = g12a_vid_pll_parent_hws, 2681 .num_parents = ARRAY_SIZE(g12a_vid_pll_parent_hws), 2682 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE, 2683 }, 2684 }; 2685 2686 static struct clk_regmap g12a_vid_pll = { 2687 .data = &(struct clk_regmap_gate_data){ 2688 .offset = HHI_VID_PLL_CLK_DIV, 2689 .bit_idx = 19, 2690 }, 2691 .hw.init = &(struct clk_init_data) { 2692 .name = "vid_pll", 2693 .ops = &clk_regmap_gate_ops, 2694 .parent_hws = (const struct clk_hw *[]) { 2695 &g12a_vid_pll_sel.hw 2696 }, 2697 .num_parents = 1, 2698 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 2699 }, 2700 }; 2701 2702 /* VPU Clock */ 2703 2704 static const struct clk_hw *g12a_vpu_parent_hws[] = { 2705 &g12a_fclk_div3.hw, 2706 &g12a_fclk_div4.hw, 2707 &g12a_fclk_div5.hw, 2708 &g12a_fclk_div7.hw, 2709 &g12a_mpll1.hw, 2710 &g12a_vid_pll.hw, 2711 &g12a_hifi_pll.hw, 2712 &g12a_gp0_pll.hw, 2713 }; 2714 2715 static struct clk_regmap g12a_vpu_0_sel = { 2716 .data = &(struct clk_regmap_mux_data){ 2717 .offset = HHI_VPU_CLK_CNTL, 2718 .mask = 0x7, 2719 .shift = 9, 2720 }, 2721 .hw.init = &(struct clk_init_data){ 2722 .name = "vpu_0_sel", 2723 .ops = &clk_regmap_mux_ops, 2724 .parent_hws = g12a_vpu_parent_hws, 2725 .num_parents = ARRAY_SIZE(g12a_vpu_parent_hws), 2726 .flags = CLK_SET_RATE_NO_REPARENT, 2727 }, 2728 }; 2729 2730 static struct clk_regmap g12a_vpu_0_div = { 2731 .data = &(struct clk_regmap_div_data){ 2732 .offset = HHI_VPU_CLK_CNTL, 2733 .shift = 0, 2734 .width = 7, 2735 }, 2736 .hw.init = &(struct clk_init_data){ 2737 .name = "vpu_0_div", 2738 .ops = &clk_regmap_divider_ops, 2739 .parent_hws = (const struct clk_hw *[]) { &g12a_vpu_0_sel.hw }, 2740 .num_parents = 1, 2741 .flags = CLK_SET_RATE_PARENT, 2742 }, 2743 }; 2744 2745 static struct clk_regmap g12a_vpu_0 = { 2746 .data = &(struct clk_regmap_gate_data){ 2747 .offset = HHI_VPU_CLK_CNTL, 2748 .bit_idx = 8, 2749 }, 2750 .hw.init = &(struct clk_init_data) { 2751 .name = "vpu_0", 2752 .ops = &clk_regmap_gate_ops, 2753 .parent_hws = (const struct clk_hw *[]) { &g12a_vpu_0_div.hw }, 2754 .num_parents = 1, 2755 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 2756 }, 2757 }; 2758 2759 static struct clk_regmap g12a_vpu_1_sel = { 2760 .data = &(struct clk_regmap_mux_data){ 2761 .offset = HHI_VPU_CLK_CNTL, 2762 .mask = 0x7, 2763 .shift = 25, 2764 }, 2765 .hw.init = &(struct clk_init_data){ 2766 .name = "vpu_1_sel", 2767 .ops = &clk_regmap_mux_ops, 2768 .parent_hws = g12a_vpu_parent_hws, 2769 .num_parents = ARRAY_SIZE(g12a_vpu_parent_hws), 2770 .flags = CLK_SET_RATE_NO_REPARENT, 2771 }, 2772 }; 2773 2774 static struct clk_regmap g12a_vpu_1_div = { 2775 .data = &(struct clk_regmap_div_data){ 2776 .offset = HHI_VPU_CLK_CNTL, 2777 .shift = 16, 2778 .width = 7, 2779 }, 2780 .hw.init = &(struct clk_init_data){ 2781 .name = "vpu_1_div", 2782 .ops = &clk_regmap_divider_ops, 2783 .parent_hws = (const struct clk_hw *[]) { &g12a_vpu_1_sel.hw }, 2784 .num_parents = 1, 2785 .flags = CLK_SET_RATE_PARENT, 2786 }, 2787 }; 2788 2789 static struct clk_regmap g12a_vpu_1 = { 2790 .data = &(struct clk_regmap_gate_data){ 2791 .offset = HHI_VPU_CLK_CNTL, 2792 .bit_idx = 24, 2793 }, 2794 .hw.init = &(struct clk_init_data) { 2795 .name = "vpu_1", 2796 .ops = &clk_regmap_gate_ops, 2797 .parent_hws = (const struct clk_hw *[]) { &g12a_vpu_1_div.hw }, 2798 .num_parents = 1, 2799 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 2800 }, 2801 }; 2802 2803 static struct clk_regmap g12a_vpu = { 2804 .data = &(struct clk_regmap_mux_data){ 2805 .offset = HHI_VPU_CLK_CNTL, 2806 .mask = 1, 2807 .shift = 31, 2808 }, 2809 .hw.init = &(struct clk_init_data){ 2810 .name = "vpu", 2811 .ops = &clk_regmap_mux_ops, 2812 /* 2813 * bit 31 selects from 2 possible parents: 2814 * vpu_0 or vpu_1 2815 */ 2816 .parent_hws = (const struct clk_hw *[]) { 2817 &g12a_vpu_0.hw, 2818 &g12a_vpu_1.hw, 2819 }, 2820 .num_parents = 2, 2821 .flags = CLK_SET_RATE_NO_REPARENT, 2822 }, 2823 }; 2824 2825 /* VDEC clocks */ 2826 2827 static const struct clk_hw *g12a_vdec_parent_hws[] = { 2828 &g12a_fclk_div2p5.hw, 2829 &g12a_fclk_div3.hw, 2830 &g12a_fclk_div4.hw, 2831 &g12a_fclk_div5.hw, 2832 &g12a_fclk_div7.hw, 2833 &g12a_hifi_pll.hw, 2834 &g12a_gp0_pll.hw, 2835 }; 2836 2837 static struct clk_regmap g12a_vdec_1_sel = { 2838 .data = &(struct clk_regmap_mux_data){ 2839 .offset = HHI_VDEC_CLK_CNTL, 2840 .mask = 0x7, 2841 .shift = 9, 2842 .flags = CLK_MUX_ROUND_CLOSEST, 2843 }, 2844 .hw.init = &(struct clk_init_data){ 2845 .name = "vdec_1_sel", 2846 .ops = &clk_regmap_mux_ops, 2847 .parent_hws = g12a_vdec_parent_hws, 2848 .num_parents = ARRAY_SIZE(g12a_vdec_parent_hws), 2849 .flags = CLK_SET_RATE_PARENT, 2850 }, 2851 }; 2852 2853 static struct clk_regmap g12a_vdec_1_div = { 2854 .data = &(struct clk_regmap_div_data){ 2855 .offset = HHI_VDEC_CLK_CNTL, 2856 .shift = 0, 2857 .width = 7, 2858 .flags = CLK_DIVIDER_ROUND_CLOSEST, 2859 }, 2860 .hw.init = &(struct clk_init_data){ 2861 .name = "vdec_1_div", 2862 .ops = &clk_regmap_divider_ops, 2863 .parent_hws = (const struct clk_hw *[]) { 2864 &g12a_vdec_1_sel.hw 2865 }, 2866 .num_parents = 1, 2867 .flags = CLK_SET_RATE_PARENT, 2868 }, 2869 }; 2870 2871 static struct clk_regmap g12a_vdec_1 = { 2872 .data = &(struct clk_regmap_gate_data){ 2873 .offset = HHI_VDEC_CLK_CNTL, 2874 .bit_idx = 8, 2875 }, 2876 .hw.init = &(struct clk_init_data) { 2877 .name = "vdec_1", 2878 .ops = &clk_regmap_gate_ops, 2879 .parent_hws = (const struct clk_hw *[]) { 2880 &g12a_vdec_1_div.hw 2881 }, 2882 .num_parents = 1, 2883 .flags = CLK_SET_RATE_PARENT, 2884 }, 2885 }; 2886 2887 static struct clk_regmap g12a_vdec_hevcf_sel = { 2888 .data = &(struct clk_regmap_mux_data){ 2889 .offset = HHI_VDEC2_CLK_CNTL, 2890 .mask = 0x7, 2891 .shift = 9, 2892 .flags = CLK_MUX_ROUND_CLOSEST, 2893 }, 2894 .hw.init = &(struct clk_init_data){ 2895 .name = "vdec_hevcf_sel", 2896 .ops = &clk_regmap_mux_ops, 2897 .parent_hws = g12a_vdec_parent_hws, 2898 .num_parents = ARRAY_SIZE(g12a_vdec_parent_hws), 2899 .flags = CLK_SET_RATE_PARENT, 2900 }, 2901 }; 2902 2903 static struct clk_regmap g12a_vdec_hevcf_div = { 2904 .data = &(struct clk_regmap_div_data){ 2905 .offset = HHI_VDEC2_CLK_CNTL, 2906 .shift = 0, 2907 .width = 7, 2908 .flags = CLK_DIVIDER_ROUND_CLOSEST, 2909 }, 2910 .hw.init = &(struct clk_init_data){ 2911 .name = "vdec_hevcf_div", 2912 .ops = &clk_regmap_divider_ops, 2913 .parent_hws = (const struct clk_hw *[]) { 2914 &g12a_vdec_hevcf_sel.hw 2915 }, 2916 .num_parents = 1, 2917 .flags = CLK_SET_RATE_PARENT, 2918 }, 2919 }; 2920 2921 static struct clk_regmap g12a_vdec_hevcf = { 2922 .data = &(struct clk_regmap_gate_data){ 2923 .offset = HHI_VDEC2_CLK_CNTL, 2924 .bit_idx = 8, 2925 }, 2926 .hw.init = &(struct clk_init_data) { 2927 .name = "vdec_hevcf", 2928 .ops = &clk_regmap_gate_ops, 2929 .parent_hws = (const struct clk_hw *[]) { 2930 &g12a_vdec_hevcf_div.hw 2931 }, 2932 .num_parents = 1, 2933 .flags = CLK_SET_RATE_PARENT, 2934 }, 2935 }; 2936 2937 static struct clk_regmap g12a_vdec_hevc_sel = { 2938 .data = &(struct clk_regmap_mux_data){ 2939 .offset = HHI_VDEC2_CLK_CNTL, 2940 .mask = 0x7, 2941 .shift = 25, 2942 .flags = CLK_MUX_ROUND_CLOSEST, 2943 }, 2944 .hw.init = &(struct clk_init_data){ 2945 .name = "vdec_hevc_sel", 2946 .ops = &clk_regmap_mux_ops, 2947 .parent_hws = g12a_vdec_parent_hws, 2948 .num_parents = ARRAY_SIZE(g12a_vdec_parent_hws), 2949 .flags = CLK_SET_RATE_PARENT, 2950 }, 2951 }; 2952 2953 static struct clk_regmap g12a_vdec_hevc_div = { 2954 .data = &(struct clk_regmap_div_data){ 2955 .offset = HHI_VDEC2_CLK_CNTL, 2956 .shift = 16, 2957 .width = 7, 2958 .flags = CLK_DIVIDER_ROUND_CLOSEST, 2959 }, 2960 .hw.init = &(struct clk_init_data){ 2961 .name = "vdec_hevc_div", 2962 .ops = &clk_regmap_divider_ops, 2963 .parent_hws = (const struct clk_hw *[]) { 2964 &g12a_vdec_hevc_sel.hw 2965 }, 2966 .num_parents = 1, 2967 .flags = CLK_SET_RATE_PARENT, 2968 }, 2969 }; 2970 2971 static struct clk_regmap g12a_vdec_hevc = { 2972 .data = &(struct clk_regmap_gate_data){ 2973 .offset = HHI_VDEC2_CLK_CNTL, 2974 .bit_idx = 24, 2975 }, 2976 .hw.init = &(struct clk_init_data) { 2977 .name = "vdec_hevc", 2978 .ops = &clk_regmap_gate_ops, 2979 .parent_hws = (const struct clk_hw *[]) { 2980 &g12a_vdec_hevc_div.hw 2981 }, 2982 .num_parents = 1, 2983 .flags = CLK_SET_RATE_PARENT, 2984 }, 2985 }; 2986 2987 /* VAPB Clock */ 2988 2989 static const struct clk_hw *g12a_vapb_parent_hws[] = { 2990 &g12a_fclk_div4.hw, 2991 &g12a_fclk_div3.hw, 2992 &g12a_fclk_div5.hw, 2993 &g12a_fclk_div7.hw, 2994 &g12a_mpll1.hw, 2995 &g12a_vid_pll.hw, 2996 &g12a_mpll2.hw, 2997 &g12a_fclk_div2p5.hw, 2998 }; 2999 3000 static struct clk_regmap g12a_vapb_0_sel = { 3001 .data = &(struct clk_regmap_mux_data){ 3002 .offset = HHI_VAPBCLK_CNTL, 3003 .mask = 0x3, 3004 .shift = 9, 3005 }, 3006 .hw.init = &(struct clk_init_data){ 3007 .name = "vapb_0_sel", 3008 .ops = &clk_regmap_mux_ops, 3009 .parent_hws = g12a_vapb_parent_hws, 3010 .num_parents = ARRAY_SIZE(g12a_vapb_parent_hws), 3011 .flags = CLK_SET_RATE_NO_REPARENT, 3012 }, 3013 }; 3014 3015 static struct clk_regmap g12a_vapb_0_div = { 3016 .data = &(struct clk_regmap_div_data){ 3017 .offset = HHI_VAPBCLK_CNTL, 3018 .shift = 0, 3019 .width = 7, 3020 }, 3021 .hw.init = &(struct clk_init_data){ 3022 .name = "vapb_0_div", 3023 .ops = &clk_regmap_divider_ops, 3024 .parent_hws = (const struct clk_hw *[]) { 3025 &g12a_vapb_0_sel.hw 3026 }, 3027 .num_parents = 1, 3028 .flags = CLK_SET_RATE_PARENT, 3029 }, 3030 }; 3031 3032 static struct clk_regmap g12a_vapb_0 = { 3033 .data = &(struct clk_regmap_gate_data){ 3034 .offset = HHI_VAPBCLK_CNTL, 3035 .bit_idx = 8, 3036 }, 3037 .hw.init = &(struct clk_init_data) { 3038 .name = "vapb_0", 3039 .ops = &clk_regmap_gate_ops, 3040 .parent_hws = (const struct clk_hw *[]) { 3041 &g12a_vapb_0_div.hw 3042 }, 3043 .num_parents = 1, 3044 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 3045 }, 3046 }; 3047 3048 static struct clk_regmap g12a_vapb_1_sel = { 3049 .data = &(struct clk_regmap_mux_data){ 3050 .offset = HHI_VAPBCLK_CNTL, 3051 .mask = 0x3, 3052 .shift = 25, 3053 }, 3054 .hw.init = &(struct clk_init_data){ 3055 .name = "vapb_1_sel", 3056 .ops = &clk_regmap_mux_ops, 3057 .parent_hws = g12a_vapb_parent_hws, 3058 .num_parents = ARRAY_SIZE(g12a_vapb_parent_hws), 3059 .flags = CLK_SET_RATE_NO_REPARENT, 3060 }, 3061 }; 3062 3063 static struct clk_regmap g12a_vapb_1_div = { 3064 .data = &(struct clk_regmap_div_data){ 3065 .offset = HHI_VAPBCLK_CNTL, 3066 .shift = 16, 3067 .width = 7, 3068 }, 3069 .hw.init = &(struct clk_init_data){ 3070 .name = "vapb_1_div", 3071 .ops = &clk_regmap_divider_ops, 3072 .parent_hws = (const struct clk_hw *[]) { 3073 &g12a_vapb_1_sel.hw 3074 }, 3075 .num_parents = 1, 3076 .flags = CLK_SET_RATE_PARENT, 3077 }, 3078 }; 3079 3080 static struct clk_regmap g12a_vapb_1 = { 3081 .data = &(struct clk_regmap_gate_data){ 3082 .offset = HHI_VAPBCLK_CNTL, 3083 .bit_idx = 24, 3084 }, 3085 .hw.init = &(struct clk_init_data) { 3086 .name = "vapb_1", 3087 .ops = &clk_regmap_gate_ops, 3088 .parent_hws = (const struct clk_hw *[]) { 3089 &g12a_vapb_1_div.hw 3090 }, 3091 .num_parents = 1, 3092 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 3093 }, 3094 }; 3095 3096 static struct clk_regmap g12a_vapb_sel = { 3097 .data = &(struct clk_regmap_mux_data){ 3098 .offset = HHI_VAPBCLK_CNTL, 3099 .mask = 1, 3100 .shift = 31, 3101 }, 3102 .hw.init = &(struct clk_init_data){ 3103 .name = "vapb_sel", 3104 .ops = &clk_regmap_mux_ops, 3105 /* 3106 * bit 31 selects from 2 possible parents: 3107 * vapb_0 or vapb_1 3108 */ 3109 .parent_hws = (const struct clk_hw *[]) { 3110 &g12a_vapb_0.hw, 3111 &g12a_vapb_1.hw, 3112 }, 3113 .num_parents = 2, 3114 .flags = CLK_SET_RATE_NO_REPARENT, 3115 }, 3116 }; 3117 3118 static struct clk_regmap g12a_vapb = { 3119 .data = &(struct clk_regmap_gate_data){ 3120 .offset = HHI_VAPBCLK_CNTL, 3121 .bit_idx = 30, 3122 }, 3123 .hw.init = &(struct clk_init_data) { 3124 .name = "vapb", 3125 .ops = &clk_regmap_gate_ops, 3126 .parent_hws = (const struct clk_hw *[]) { &g12a_vapb_sel.hw }, 3127 .num_parents = 1, 3128 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 3129 }, 3130 }; 3131 3132 static const struct clk_hw *g12a_vclk_parent_hws[] = { 3133 &g12a_vid_pll.hw, 3134 &g12a_gp0_pll.hw, 3135 &g12a_hifi_pll.hw, 3136 &g12a_mpll1.hw, 3137 &g12a_fclk_div3.hw, 3138 &g12a_fclk_div4.hw, 3139 &g12a_fclk_div5.hw, 3140 &g12a_fclk_div7.hw, 3141 }; 3142 3143 static struct clk_regmap g12a_vclk_sel = { 3144 .data = &(struct clk_regmap_mux_data){ 3145 .offset = HHI_VID_CLK_CNTL, 3146 .mask = 0x7, 3147 .shift = 16, 3148 }, 3149 .hw.init = &(struct clk_init_data){ 3150 .name = "vclk_sel", 3151 .ops = &clk_regmap_mux_ops, 3152 .parent_hws = g12a_vclk_parent_hws, 3153 .num_parents = ARRAY_SIZE(g12a_vclk_parent_hws), 3154 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE, 3155 }, 3156 }; 3157 3158 static struct clk_regmap g12a_vclk2_sel = { 3159 .data = &(struct clk_regmap_mux_data){ 3160 .offset = HHI_VIID_CLK_CNTL, 3161 .mask = 0x7, 3162 .shift = 16, 3163 }, 3164 .hw.init = &(struct clk_init_data){ 3165 .name = "vclk2_sel", 3166 .ops = &clk_regmap_mux_ops, 3167 .parent_hws = g12a_vclk_parent_hws, 3168 .num_parents = ARRAY_SIZE(g12a_vclk_parent_hws), 3169 .flags = CLK_SET_RATE_NO_REPARENT, 3170 }, 3171 }; 3172 3173 static struct clk_regmap g12a_vclk_input = { 3174 .data = &(struct clk_regmap_gate_data){ 3175 .offset = HHI_VID_CLK_DIV, 3176 .bit_idx = 16, 3177 }, 3178 .hw.init = &(struct clk_init_data) { 3179 .name = "vclk_input", 3180 .ops = &clk_regmap_gate_ops, 3181 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk_sel.hw }, 3182 .num_parents = 1, 3183 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 3184 }, 3185 }; 3186 3187 static struct clk_regmap g12a_vclk2_input = { 3188 .data = &(struct clk_regmap_gate_data){ 3189 .offset = HHI_VIID_CLK_DIV, 3190 .bit_idx = 16, 3191 }, 3192 .hw.init = &(struct clk_init_data) { 3193 .name = "vclk2_input", 3194 .ops = &clk_regmap_gate_ops, 3195 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk2_sel.hw }, 3196 .num_parents = 1, 3197 }, 3198 }; 3199 3200 static struct clk_regmap g12a_vclk_div = { 3201 .data = &(struct clk_regmap_div_data){ 3202 .offset = HHI_VID_CLK_DIV, 3203 .shift = 0, 3204 .width = 8, 3205 }, 3206 .hw.init = &(struct clk_init_data){ 3207 .name = "vclk_div", 3208 .ops = &clk_regmap_divider_ops, 3209 .parent_hws = (const struct clk_hw *[]) { 3210 &g12a_vclk_input.hw 3211 }, 3212 .num_parents = 1, 3213 .flags = CLK_GET_RATE_NOCACHE, 3214 }, 3215 }; 3216 3217 static struct clk_regmap g12a_vclk2_div = { 3218 .data = &(struct meson_vclk_div_data){ 3219 .div = { 3220 .reg_off = HHI_VIID_CLK_DIV, 3221 .shift = 0, 3222 .width = 8, 3223 }, 3224 .enable = { 3225 .reg_off = HHI_VIID_CLK_DIV, 3226 .shift = 16, 3227 .width = 1, 3228 }, 3229 .reset = { 3230 .reg_off = HHI_VIID_CLK_DIV, 3231 .shift = 17, 3232 .width = 1, 3233 }, 3234 .flags = CLK_DIVIDER_ROUND_CLOSEST, 3235 }, 3236 .hw.init = &(struct clk_init_data){ 3237 .name = "vclk2_div", 3238 .ops = &meson_vclk_div_ops, 3239 .parent_hws = (const struct clk_hw *[]) { 3240 &g12a_vclk2_input.hw 3241 }, 3242 .num_parents = 1, 3243 .flags = CLK_SET_RATE_GATE, 3244 }, 3245 }; 3246 3247 static struct clk_regmap g12a_vclk = { 3248 .data = &(struct clk_regmap_gate_data){ 3249 .offset = HHI_VID_CLK_CNTL, 3250 .bit_idx = 19, 3251 }, 3252 .hw.init = &(struct clk_init_data) { 3253 .name = "vclk", 3254 .ops = &clk_regmap_gate_ops, 3255 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk_div.hw }, 3256 .num_parents = 1, 3257 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 3258 }, 3259 }; 3260 3261 static struct clk_regmap g12a_vclk2 = { 3262 .data = &(struct meson_vclk_gate_data){ 3263 .enable = { 3264 .reg_off = HHI_VIID_CLK_CNTL, 3265 .shift = 19, 3266 .width = 1, 3267 }, 3268 .reset = { 3269 .reg_off = HHI_VIID_CLK_CNTL, 3270 .shift = 15, 3271 .width = 1, 3272 }, 3273 }, 3274 .hw.init = &(struct clk_init_data) { 3275 .name = "vclk2", 3276 .ops = &meson_vclk_gate_ops, 3277 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk2_div.hw }, 3278 .num_parents = 1, 3279 .flags = CLK_SET_RATE_PARENT, 3280 }, 3281 }; 3282 3283 static struct clk_regmap g12a_vclk_div1 = { 3284 .data = &(struct clk_regmap_gate_data){ 3285 .offset = HHI_VID_CLK_CNTL, 3286 .bit_idx = 0, 3287 }, 3288 .hw.init = &(struct clk_init_data) { 3289 .name = "vclk_div1", 3290 .ops = &clk_regmap_gate_ops, 3291 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw }, 3292 .num_parents = 1, 3293 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 3294 }, 3295 }; 3296 3297 static struct clk_regmap g12a_vclk_div2_en = { 3298 .data = &(struct clk_regmap_gate_data){ 3299 .offset = HHI_VID_CLK_CNTL, 3300 .bit_idx = 1, 3301 }, 3302 .hw.init = &(struct clk_init_data) { 3303 .name = "vclk_div2_en", 3304 .ops = &clk_regmap_gate_ops, 3305 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw }, 3306 .num_parents = 1, 3307 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 3308 }, 3309 }; 3310 3311 static struct clk_regmap g12a_vclk_div4_en = { 3312 .data = &(struct clk_regmap_gate_data){ 3313 .offset = HHI_VID_CLK_CNTL, 3314 .bit_idx = 2, 3315 }, 3316 .hw.init = &(struct clk_init_data) { 3317 .name = "vclk_div4_en", 3318 .ops = &clk_regmap_gate_ops, 3319 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw }, 3320 .num_parents = 1, 3321 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 3322 }, 3323 }; 3324 3325 static struct clk_regmap g12a_vclk_div6_en = { 3326 .data = &(struct clk_regmap_gate_data){ 3327 .offset = HHI_VID_CLK_CNTL, 3328 .bit_idx = 3, 3329 }, 3330 .hw.init = &(struct clk_init_data) { 3331 .name = "vclk_div6_en", 3332 .ops = &clk_regmap_gate_ops, 3333 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw }, 3334 .num_parents = 1, 3335 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 3336 }, 3337 }; 3338 3339 static struct clk_regmap g12a_vclk_div12_en = { 3340 .data = &(struct clk_regmap_gate_data){ 3341 .offset = HHI_VID_CLK_CNTL, 3342 .bit_idx = 4, 3343 }, 3344 .hw.init = &(struct clk_init_data) { 3345 .name = "vclk_div12_en", 3346 .ops = &clk_regmap_gate_ops, 3347 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw }, 3348 .num_parents = 1, 3349 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 3350 }, 3351 }; 3352 3353 static struct clk_regmap g12a_vclk2_div1 = { 3354 .data = &(struct clk_regmap_gate_data){ 3355 .offset = HHI_VIID_CLK_CNTL, 3356 .bit_idx = 0, 3357 }, 3358 .hw.init = &(struct clk_init_data) { 3359 .name = "vclk2_div1", 3360 .ops = &clk_regmap_gate_ops, 3361 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw }, 3362 .num_parents = 1, 3363 .flags = CLK_SET_RATE_PARENT, 3364 }, 3365 }; 3366 3367 static struct clk_regmap g12a_vclk2_div2_en = { 3368 .data = &(struct clk_regmap_gate_data){ 3369 .offset = HHI_VIID_CLK_CNTL, 3370 .bit_idx = 1, 3371 }, 3372 .hw.init = &(struct clk_init_data) { 3373 .name = "vclk2_div2_en", 3374 .ops = &clk_regmap_gate_ops, 3375 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw }, 3376 .num_parents = 1, 3377 .flags = CLK_SET_RATE_PARENT, 3378 }, 3379 }; 3380 3381 static struct clk_regmap g12a_vclk2_div4_en = { 3382 .data = &(struct clk_regmap_gate_data){ 3383 .offset = HHI_VIID_CLK_CNTL, 3384 .bit_idx = 2, 3385 }, 3386 .hw.init = &(struct clk_init_data) { 3387 .name = "vclk2_div4_en", 3388 .ops = &clk_regmap_gate_ops, 3389 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw }, 3390 .num_parents = 1, 3391 .flags = CLK_SET_RATE_PARENT, 3392 }, 3393 }; 3394 3395 static struct clk_regmap g12a_vclk2_div6_en = { 3396 .data = &(struct clk_regmap_gate_data){ 3397 .offset = HHI_VIID_CLK_CNTL, 3398 .bit_idx = 3, 3399 }, 3400 .hw.init = &(struct clk_init_data) { 3401 .name = "vclk2_div6_en", 3402 .ops = &clk_regmap_gate_ops, 3403 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw }, 3404 .num_parents = 1, 3405 .flags = CLK_SET_RATE_PARENT, 3406 }, 3407 }; 3408 3409 static struct clk_regmap g12a_vclk2_div12_en = { 3410 .data = &(struct clk_regmap_gate_data){ 3411 .offset = HHI_VIID_CLK_CNTL, 3412 .bit_idx = 4, 3413 }, 3414 .hw.init = &(struct clk_init_data) { 3415 .name = "vclk2_div12_en", 3416 .ops = &clk_regmap_gate_ops, 3417 .parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw }, 3418 .num_parents = 1, 3419 .flags = CLK_SET_RATE_PARENT, 3420 }, 3421 }; 3422 3423 static struct clk_fixed_factor g12a_vclk_div2 = { 3424 .mult = 1, 3425 .div = 2, 3426 .hw.init = &(struct clk_init_data){ 3427 .name = "vclk_div2", 3428 .ops = &clk_fixed_factor_ops, 3429 .parent_hws = (const struct clk_hw *[]) { 3430 &g12a_vclk_div2_en.hw 3431 }, 3432 .num_parents = 1, 3433 }, 3434 }; 3435 3436 static struct clk_fixed_factor g12a_vclk_div4 = { 3437 .mult = 1, 3438 .div = 4, 3439 .hw.init = &(struct clk_init_data){ 3440 .name = "vclk_div4", 3441 .ops = &clk_fixed_factor_ops, 3442 .parent_hws = (const struct clk_hw *[]) { 3443 &g12a_vclk_div4_en.hw 3444 }, 3445 .num_parents = 1, 3446 }, 3447 }; 3448 3449 static struct clk_fixed_factor g12a_vclk_div6 = { 3450 .mult = 1, 3451 .div = 6, 3452 .hw.init = &(struct clk_init_data){ 3453 .name = "vclk_div6", 3454 .ops = &clk_fixed_factor_ops, 3455 .parent_hws = (const struct clk_hw *[]) { 3456 &g12a_vclk_div6_en.hw 3457 }, 3458 .num_parents = 1, 3459 }, 3460 }; 3461 3462 static struct clk_fixed_factor g12a_vclk_div12 = { 3463 .mult = 1, 3464 .div = 12, 3465 .hw.init = &(struct clk_init_data){ 3466 .name = "vclk_div12", 3467 .ops = &clk_fixed_factor_ops, 3468 .parent_hws = (const struct clk_hw *[]) { 3469 &g12a_vclk_div12_en.hw 3470 }, 3471 .num_parents = 1, 3472 }, 3473 }; 3474 3475 static struct clk_fixed_factor g12a_vclk2_div2 = { 3476 .mult = 1, 3477 .div = 2, 3478 .hw.init = &(struct clk_init_data){ 3479 .name = "vclk2_div2", 3480 .ops = &clk_fixed_factor_ops, 3481 .parent_hws = (const struct clk_hw *[]) { 3482 &g12a_vclk2_div2_en.hw 3483 }, 3484 .num_parents = 1, 3485 .flags = CLK_SET_RATE_PARENT, 3486 }, 3487 }; 3488 3489 static struct clk_fixed_factor g12a_vclk2_div4 = { 3490 .mult = 1, 3491 .div = 4, 3492 .hw.init = &(struct clk_init_data){ 3493 .name = "vclk2_div4", 3494 .ops = &clk_fixed_factor_ops, 3495 .parent_hws = (const struct clk_hw *[]) { 3496 &g12a_vclk2_div4_en.hw 3497 }, 3498 .num_parents = 1, 3499 .flags = CLK_SET_RATE_PARENT, 3500 }, 3501 }; 3502 3503 static struct clk_fixed_factor g12a_vclk2_div6 = { 3504 .mult = 1, 3505 .div = 6, 3506 .hw.init = &(struct clk_init_data){ 3507 .name = "vclk2_div6", 3508 .ops = &clk_fixed_factor_ops, 3509 .parent_hws = (const struct clk_hw *[]) { 3510 &g12a_vclk2_div6_en.hw 3511 }, 3512 .num_parents = 1, 3513 .flags = CLK_SET_RATE_PARENT, 3514 }, 3515 }; 3516 3517 static struct clk_fixed_factor g12a_vclk2_div12 = { 3518 .mult = 1, 3519 .div = 12, 3520 .hw.init = &(struct clk_init_data){ 3521 .name = "vclk2_div12", 3522 .ops = &clk_fixed_factor_ops, 3523 .parent_hws = (const struct clk_hw *[]) { 3524 &g12a_vclk2_div12_en.hw 3525 }, 3526 .num_parents = 1, 3527 .flags = CLK_SET_RATE_PARENT, 3528 }, 3529 }; 3530 3531 static u32 mux_table_cts_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 }; 3532 static const struct clk_hw *g12a_cts_parent_hws[] = { 3533 &g12a_vclk_div1.hw, 3534 &g12a_vclk_div2.hw, 3535 &g12a_vclk_div4.hw, 3536 &g12a_vclk_div6.hw, 3537 &g12a_vclk_div12.hw, 3538 &g12a_vclk2_div1.hw, 3539 &g12a_vclk2_div2.hw, 3540 &g12a_vclk2_div4.hw, 3541 &g12a_vclk2_div6.hw, 3542 &g12a_vclk2_div12.hw, 3543 }; 3544 3545 static struct clk_regmap g12a_cts_enci_sel = { 3546 .data = &(struct clk_regmap_mux_data){ 3547 .offset = HHI_VID_CLK_DIV, 3548 .mask = 0xf, 3549 .shift = 28, 3550 .table = mux_table_cts_sel, 3551 }, 3552 .hw.init = &(struct clk_init_data){ 3553 .name = "cts_enci_sel", 3554 .ops = &clk_regmap_mux_ops, 3555 .parent_hws = g12a_cts_parent_hws, 3556 .num_parents = ARRAY_SIZE(g12a_cts_parent_hws), 3557 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE, 3558 }, 3559 }; 3560 3561 static struct clk_regmap g12a_cts_encp_sel = { 3562 .data = &(struct clk_regmap_mux_data){ 3563 .offset = HHI_VID_CLK_DIV, 3564 .mask = 0xf, 3565 .shift = 20, 3566 .table = mux_table_cts_sel, 3567 }, 3568 .hw.init = &(struct clk_init_data){ 3569 .name = "cts_encp_sel", 3570 .ops = &clk_regmap_mux_ops, 3571 .parent_hws = g12a_cts_parent_hws, 3572 .num_parents = ARRAY_SIZE(g12a_cts_parent_hws), 3573 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE, 3574 }, 3575 }; 3576 3577 static struct clk_regmap g12a_cts_encl_sel = { 3578 .data = &(struct clk_regmap_mux_data){ 3579 .offset = HHI_VIID_CLK_DIV, 3580 .mask = 0xf, 3581 .shift = 12, 3582 .table = mux_table_cts_sel, 3583 }, 3584 .hw.init = &(struct clk_init_data){ 3585 .name = "cts_encl_sel", 3586 .ops = &clk_regmap_mux_ops, 3587 .parent_hws = g12a_cts_parent_hws, 3588 .num_parents = ARRAY_SIZE(g12a_cts_parent_hws), 3589 .flags = CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 3590 }, 3591 }; 3592 3593 static struct clk_regmap g12a_cts_vdac_sel = { 3594 .data = &(struct clk_regmap_mux_data){ 3595 .offset = HHI_VIID_CLK_DIV, 3596 .mask = 0xf, 3597 .shift = 28, 3598 .table = mux_table_cts_sel, 3599 }, 3600 .hw.init = &(struct clk_init_data){ 3601 .name = "cts_vdac_sel", 3602 .ops = &clk_regmap_mux_ops, 3603 .parent_hws = g12a_cts_parent_hws, 3604 .num_parents = ARRAY_SIZE(g12a_cts_parent_hws), 3605 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE, 3606 }, 3607 }; 3608 3609 /* TOFIX: add support for cts_tcon */ 3610 static u32 mux_table_hdmi_tx_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 }; 3611 static const struct clk_hw *g12a_cts_hdmi_tx_parent_hws[] = { 3612 &g12a_vclk_div1.hw, 3613 &g12a_vclk_div2.hw, 3614 &g12a_vclk_div4.hw, 3615 &g12a_vclk_div6.hw, 3616 &g12a_vclk_div12.hw, 3617 &g12a_vclk2_div1.hw, 3618 &g12a_vclk2_div2.hw, 3619 &g12a_vclk2_div4.hw, 3620 &g12a_vclk2_div6.hw, 3621 &g12a_vclk2_div12.hw, 3622 }; 3623 3624 static struct clk_regmap g12a_hdmi_tx_sel = { 3625 .data = &(struct clk_regmap_mux_data){ 3626 .offset = HHI_HDMI_CLK_CNTL, 3627 .mask = 0xf, 3628 .shift = 16, 3629 .table = mux_table_hdmi_tx_sel, 3630 }, 3631 .hw.init = &(struct clk_init_data){ 3632 .name = "hdmi_tx_sel", 3633 .ops = &clk_regmap_mux_ops, 3634 .parent_hws = g12a_cts_hdmi_tx_parent_hws, 3635 .num_parents = ARRAY_SIZE(g12a_cts_hdmi_tx_parent_hws), 3636 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE, 3637 }, 3638 }; 3639 3640 static struct clk_regmap g12a_cts_enci = { 3641 .data = &(struct clk_regmap_gate_data){ 3642 .offset = HHI_VID_CLK_CNTL2, 3643 .bit_idx = 0, 3644 }, 3645 .hw.init = &(struct clk_init_data) { 3646 .name = "cts_enci", 3647 .ops = &clk_regmap_gate_ops, 3648 .parent_hws = (const struct clk_hw *[]) { 3649 &g12a_cts_enci_sel.hw 3650 }, 3651 .num_parents = 1, 3652 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 3653 }, 3654 }; 3655 3656 static struct clk_regmap g12a_cts_encp = { 3657 .data = &(struct clk_regmap_gate_data){ 3658 .offset = HHI_VID_CLK_CNTL2, 3659 .bit_idx = 2, 3660 }, 3661 .hw.init = &(struct clk_init_data) { 3662 .name = "cts_encp", 3663 .ops = &clk_regmap_gate_ops, 3664 .parent_hws = (const struct clk_hw *[]) { 3665 &g12a_cts_encp_sel.hw 3666 }, 3667 .num_parents = 1, 3668 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 3669 }, 3670 }; 3671 3672 static struct clk_regmap g12a_cts_encl = { 3673 .data = &(struct clk_regmap_gate_data){ 3674 .offset = HHI_VID_CLK_CNTL2, 3675 .bit_idx = 3, 3676 }, 3677 .hw.init = &(struct clk_init_data) { 3678 .name = "cts_encl", 3679 .ops = &clk_regmap_gate_ops, 3680 .parent_hws = (const struct clk_hw *[]) { 3681 &g12a_cts_encl_sel.hw 3682 }, 3683 .num_parents = 1, 3684 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 3685 }, 3686 }; 3687 3688 static struct clk_regmap g12a_cts_vdac = { 3689 .data = &(struct clk_regmap_gate_data){ 3690 .offset = HHI_VID_CLK_CNTL2, 3691 .bit_idx = 4, 3692 }, 3693 .hw.init = &(struct clk_init_data) { 3694 .name = "cts_vdac", 3695 .ops = &clk_regmap_gate_ops, 3696 .parent_hws = (const struct clk_hw *[]) { 3697 &g12a_cts_vdac_sel.hw 3698 }, 3699 .num_parents = 1, 3700 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 3701 }, 3702 }; 3703 3704 static struct clk_regmap g12a_hdmi_tx = { 3705 .data = &(struct clk_regmap_gate_data){ 3706 .offset = HHI_VID_CLK_CNTL2, 3707 .bit_idx = 5, 3708 }, 3709 .hw.init = &(struct clk_init_data) { 3710 .name = "hdmi_tx", 3711 .ops = &clk_regmap_gate_ops, 3712 .parent_hws = (const struct clk_hw *[]) { 3713 &g12a_hdmi_tx_sel.hw 3714 }, 3715 .num_parents = 1, 3716 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 3717 }, 3718 }; 3719 3720 /* MIPI DSI Host Clocks */ 3721 3722 static const struct clk_hw *g12a_mipi_dsi_pxclk_parent_hws[] = { 3723 &g12a_vid_pll.hw, 3724 &g12a_gp0_pll.hw, 3725 &g12a_hifi_pll.hw, 3726 &g12a_mpll1.hw, 3727 &g12a_fclk_div2.hw, 3728 &g12a_fclk_div2p5.hw, 3729 &g12a_fclk_div3.hw, 3730 &g12a_fclk_div7.hw, 3731 }; 3732 3733 static struct clk_regmap g12a_mipi_dsi_pxclk_sel = { 3734 .data = &(struct clk_regmap_mux_data){ 3735 .offset = HHI_MIPIDSI_PHY_CLK_CNTL, 3736 .mask = 0x7, 3737 .shift = 12, 3738 .flags = CLK_MUX_ROUND_CLOSEST, 3739 }, 3740 .hw.init = &(struct clk_init_data){ 3741 .name = "mipi_dsi_pxclk_sel", 3742 .ops = &clk_regmap_mux_ops, 3743 .parent_hws = g12a_mipi_dsi_pxclk_parent_hws, 3744 .num_parents = ARRAY_SIZE(g12a_mipi_dsi_pxclk_parent_hws), 3745 .flags = CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT, 3746 }, 3747 }; 3748 3749 /* 3750 * FIXME: Force as bypass by forcing a single /1 table entry, and doensn't on boot value 3751 * when setting a clock whith this node in the clock path, but doesn't garantee the divider 3752 * is at /1 at boot until a rate is set. 3753 */ 3754 static const struct clk_div_table g12a_mipi_dsi_pxclk_div_table[] = { 3755 { .val = 0, .div = 1 }, 3756 { /* sentinel */ }, 3757 }; 3758 3759 static struct clk_regmap g12a_mipi_dsi_pxclk_div = { 3760 .data = &(struct clk_regmap_div_data){ 3761 .offset = HHI_MIPIDSI_PHY_CLK_CNTL, 3762 .shift = 0, 3763 .width = 7, 3764 .table = g12a_mipi_dsi_pxclk_div_table, 3765 }, 3766 .hw.init = &(struct clk_init_data){ 3767 .name = "mipi_dsi_pxclk_div", 3768 .ops = &clk_regmap_divider_ops, 3769 .parent_hws = (const struct clk_hw *[]) { 3770 &g12a_mipi_dsi_pxclk_sel.hw 3771 }, 3772 .num_parents = 1, 3773 .flags = CLK_SET_RATE_PARENT, 3774 }, 3775 }; 3776 3777 static struct clk_regmap g12a_mipi_dsi_pxclk = { 3778 .data = &(struct clk_regmap_gate_data){ 3779 .offset = HHI_MIPIDSI_PHY_CLK_CNTL, 3780 .bit_idx = 8, 3781 }, 3782 .hw.init = &(struct clk_init_data) { 3783 .name = "mipi_dsi_pxclk", 3784 .ops = &clk_regmap_gate_ops, 3785 .parent_hws = (const struct clk_hw *[]) { 3786 &g12a_mipi_dsi_pxclk_div.hw 3787 }, 3788 .num_parents = 1, 3789 .flags = CLK_SET_RATE_PARENT, 3790 }, 3791 }; 3792 3793 /* MIPI ISP Clocks */ 3794 3795 static const struct clk_parent_data g12b_mipi_isp_parent_data[] = { 3796 { .fw_name = "xtal", }, 3797 { .hw = &g12a_gp0_pll.hw }, 3798 { .hw = &g12a_hifi_pll.hw }, 3799 { .hw = &g12a_fclk_div2p5.hw }, 3800 { .hw = &g12a_fclk_div3.hw }, 3801 { .hw = &g12a_fclk_div4.hw }, 3802 { .hw = &g12a_fclk_div5.hw }, 3803 { .hw = &g12a_fclk_div7.hw }, 3804 }; 3805 3806 static struct clk_regmap g12b_mipi_isp_sel = { 3807 .data = &(struct clk_regmap_mux_data){ 3808 .offset = HHI_ISP_CLK_CNTL, 3809 .mask = 7, 3810 .shift = 9, 3811 }, 3812 .hw.init = &(struct clk_init_data){ 3813 .name = "mipi_isp_sel", 3814 .ops = &clk_regmap_mux_ops, 3815 .parent_data = g12b_mipi_isp_parent_data, 3816 .num_parents = ARRAY_SIZE(g12b_mipi_isp_parent_data), 3817 }, 3818 }; 3819 3820 static struct clk_regmap g12b_mipi_isp_div = { 3821 .data = &(struct clk_regmap_div_data){ 3822 .offset = HHI_ISP_CLK_CNTL, 3823 .shift = 0, 3824 .width = 7, 3825 }, 3826 .hw.init = &(struct clk_init_data){ 3827 .name = "mipi_isp_div", 3828 .ops = &clk_regmap_divider_ops, 3829 .parent_hws = (const struct clk_hw *[]) { 3830 &g12b_mipi_isp_sel.hw 3831 }, 3832 .num_parents = 1, 3833 .flags = CLK_SET_RATE_PARENT, 3834 }, 3835 }; 3836 3837 static struct clk_regmap g12b_mipi_isp = { 3838 .data = &(struct clk_regmap_gate_data){ 3839 .offset = HHI_ISP_CLK_CNTL, 3840 .bit_idx = 8, 3841 }, 3842 .hw.init = &(struct clk_init_data) { 3843 .name = "mipi_isp", 3844 .ops = &clk_regmap_gate_ops, 3845 .parent_hws = (const struct clk_hw *[]) { 3846 &g12b_mipi_isp_div.hw 3847 }, 3848 .num_parents = 1, 3849 .flags = CLK_SET_RATE_PARENT, 3850 }, 3851 }; 3852 3853 /* HDMI Clocks */ 3854 3855 static const struct clk_parent_data g12a_hdmi_parent_data[] = { 3856 { .fw_name = "xtal", }, 3857 { .hw = &g12a_fclk_div4.hw }, 3858 { .hw = &g12a_fclk_div3.hw }, 3859 { .hw = &g12a_fclk_div5.hw }, 3860 }; 3861 3862 static struct clk_regmap g12a_hdmi_sel = { 3863 .data = &(struct clk_regmap_mux_data){ 3864 .offset = HHI_HDMI_CLK_CNTL, 3865 .mask = 0x3, 3866 .shift = 9, 3867 .flags = CLK_MUX_ROUND_CLOSEST, 3868 }, 3869 .hw.init = &(struct clk_init_data){ 3870 .name = "hdmi_sel", 3871 .ops = &clk_regmap_mux_ops, 3872 .parent_data = g12a_hdmi_parent_data, 3873 .num_parents = ARRAY_SIZE(g12a_hdmi_parent_data), 3874 .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE, 3875 }, 3876 }; 3877 3878 static struct clk_regmap g12a_hdmi_div = { 3879 .data = &(struct clk_regmap_div_data){ 3880 .offset = HHI_HDMI_CLK_CNTL, 3881 .shift = 0, 3882 .width = 7, 3883 }, 3884 .hw.init = &(struct clk_init_data){ 3885 .name = "hdmi_div", 3886 .ops = &clk_regmap_divider_ops, 3887 .parent_hws = (const struct clk_hw *[]) { &g12a_hdmi_sel.hw }, 3888 .num_parents = 1, 3889 .flags = CLK_GET_RATE_NOCACHE, 3890 }, 3891 }; 3892 3893 static struct clk_regmap g12a_hdmi = { 3894 .data = &(struct clk_regmap_gate_data){ 3895 .offset = HHI_HDMI_CLK_CNTL, 3896 .bit_idx = 8, 3897 }, 3898 .hw.init = &(struct clk_init_data) { 3899 .name = "hdmi", 3900 .ops = &clk_regmap_gate_ops, 3901 .parent_hws = (const struct clk_hw *[]) { &g12a_hdmi_div.hw }, 3902 .num_parents = 1, 3903 .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 3904 }, 3905 }; 3906 3907 /* 3908 * The MALI IP is clocked by two identical clocks (mali_0 and mali_1) 3909 * muxed by a glitch-free switch. The CCF can manage this glitch-free 3910 * mux because it does top-to-bottom updates the each clock tree and 3911 * switches to the "inactive" one when CLK_SET_RATE_GATE is set. 3912 */ 3913 static const struct clk_parent_data g12a_mali_0_1_parent_data[] = { 3914 { .fw_name = "xtal", }, 3915 { .hw = &g12a_gp0_pll.hw }, 3916 { .hw = &g12a_hifi_pll.hw }, 3917 { .hw = &g12a_fclk_div2p5.hw }, 3918 { .hw = &g12a_fclk_div3.hw }, 3919 { .hw = &g12a_fclk_div4.hw }, 3920 { .hw = &g12a_fclk_div5.hw }, 3921 { .hw = &g12a_fclk_div7.hw }, 3922 }; 3923 3924 static struct clk_regmap g12a_mali_0_sel = { 3925 .data = &(struct clk_regmap_mux_data){ 3926 .offset = HHI_MALI_CLK_CNTL, 3927 .mask = 0x7, 3928 .shift = 9, 3929 }, 3930 .hw.init = &(struct clk_init_data){ 3931 .name = "mali_0_sel", 3932 .ops = &clk_regmap_mux_ops, 3933 .parent_data = g12a_mali_0_1_parent_data, 3934 .num_parents = 8, 3935 /* 3936 * Don't request the parent to change the rate because 3937 * all GPU frequencies can be derived from the fclk_* 3938 * clocks and one special GP0_PLL setting. This is 3939 * important because we need the MPLL clocks for audio. 3940 */ 3941 .flags = 0, 3942 }, 3943 }; 3944 3945 static struct clk_regmap g12a_mali_0_div = { 3946 .data = &(struct clk_regmap_div_data){ 3947 .offset = HHI_MALI_CLK_CNTL, 3948 .shift = 0, 3949 .width = 7, 3950 }, 3951 .hw.init = &(struct clk_init_data){ 3952 .name = "mali_0_div", 3953 .ops = &clk_regmap_divider_ops, 3954 .parent_hws = (const struct clk_hw *[]) { 3955 &g12a_mali_0_sel.hw 3956 }, 3957 .num_parents = 1, 3958 .flags = CLK_SET_RATE_PARENT, 3959 }, 3960 }; 3961 3962 static struct clk_regmap g12a_mali_0 = { 3963 .data = &(struct clk_regmap_gate_data){ 3964 .offset = HHI_MALI_CLK_CNTL, 3965 .bit_idx = 8, 3966 }, 3967 .hw.init = &(struct clk_init_data){ 3968 .name = "mali_0", 3969 .ops = &clk_regmap_gate_ops, 3970 .parent_hws = (const struct clk_hw *[]) { 3971 &g12a_mali_0_div.hw 3972 }, 3973 .num_parents = 1, 3974 .flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT, 3975 }, 3976 }; 3977 3978 static struct clk_regmap g12a_mali_1_sel = { 3979 .data = &(struct clk_regmap_mux_data){ 3980 .offset = HHI_MALI_CLK_CNTL, 3981 .mask = 0x7, 3982 .shift = 25, 3983 }, 3984 .hw.init = &(struct clk_init_data){ 3985 .name = "mali_1_sel", 3986 .ops = &clk_regmap_mux_ops, 3987 .parent_data = g12a_mali_0_1_parent_data, 3988 .num_parents = 8, 3989 /* 3990 * Don't request the parent to change the rate because 3991 * all GPU frequencies can be derived from the fclk_* 3992 * clocks and one special GP0_PLL setting. This is 3993 * important because we need the MPLL clocks for audio. 3994 */ 3995 .flags = 0, 3996 }, 3997 }; 3998 3999 static struct clk_regmap g12a_mali_1_div = { 4000 .data = &(struct clk_regmap_div_data){ 4001 .offset = HHI_MALI_CLK_CNTL, 4002 .shift = 16, 4003 .width = 7, 4004 }, 4005 .hw.init = &(struct clk_init_data){ 4006 .name = "mali_1_div", 4007 .ops = &clk_regmap_divider_ops, 4008 .parent_hws = (const struct clk_hw *[]) { 4009 &g12a_mali_1_sel.hw 4010 }, 4011 .num_parents = 1, 4012 .flags = CLK_SET_RATE_PARENT, 4013 }, 4014 }; 4015 4016 static struct clk_regmap g12a_mali_1 = { 4017 .data = &(struct clk_regmap_gate_data){ 4018 .offset = HHI_MALI_CLK_CNTL, 4019 .bit_idx = 24, 4020 }, 4021 .hw.init = &(struct clk_init_data){ 4022 .name = "mali_1", 4023 .ops = &clk_regmap_gate_ops, 4024 .parent_hws = (const struct clk_hw *[]) { 4025 &g12a_mali_1_div.hw 4026 }, 4027 .num_parents = 1, 4028 .flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT, 4029 }, 4030 }; 4031 4032 static const struct clk_hw *g12a_mali_parent_hws[] = { 4033 &g12a_mali_0.hw, 4034 &g12a_mali_1.hw, 4035 }; 4036 4037 static struct clk_regmap g12a_mali = { 4038 .data = &(struct clk_regmap_mux_data){ 4039 .offset = HHI_MALI_CLK_CNTL, 4040 .mask = 1, 4041 .shift = 31, 4042 }, 4043 .hw.init = &(struct clk_init_data){ 4044 .name = "mali", 4045 .ops = &clk_regmap_mux_ops, 4046 .parent_hws = g12a_mali_parent_hws, 4047 .num_parents = 2, 4048 .flags = CLK_SET_RATE_PARENT, 4049 }, 4050 }; 4051 4052 static struct clk_regmap g12a_ts_div = { 4053 .data = &(struct clk_regmap_div_data){ 4054 .offset = HHI_TS_CLK_CNTL, 4055 .shift = 0, 4056 .width = 8, 4057 }, 4058 .hw.init = &(struct clk_init_data){ 4059 .name = "ts_div", 4060 .ops = &clk_regmap_divider_ro_ops, 4061 .parent_data = &(const struct clk_parent_data) { 4062 .fw_name = "xtal", 4063 }, 4064 .num_parents = 1, 4065 }, 4066 }; 4067 4068 static struct clk_regmap g12a_ts = { 4069 .data = &(struct clk_regmap_gate_data){ 4070 .offset = HHI_TS_CLK_CNTL, 4071 .bit_idx = 8, 4072 }, 4073 .hw.init = &(struct clk_init_data){ 4074 .name = "ts", 4075 .ops = &clk_regmap_gate_ops, 4076 .parent_hws = (const struct clk_hw *[]) { 4077 &g12a_ts_div.hw 4078 }, 4079 .num_parents = 1, 4080 }, 4081 }; 4082 4083 /* SPICC SCLK source clock */ 4084 4085 static const struct clk_parent_data spicc_sclk_parent_data[] = { 4086 { .fw_name = "xtal", }, 4087 { .hw = &g12a_clk81.hw }, 4088 { .hw = &g12a_fclk_div4.hw }, 4089 { .hw = &g12a_fclk_div3.hw }, 4090 { .hw = &g12a_fclk_div5.hw }, 4091 { .hw = &g12a_fclk_div7.hw }, 4092 }; 4093 4094 static struct clk_regmap g12a_spicc0_sclk_sel = { 4095 .data = &(struct clk_regmap_mux_data){ 4096 .offset = HHI_SPICC_CLK_CNTL, 4097 .mask = 7, 4098 .shift = 7, 4099 }, 4100 .hw.init = &(struct clk_init_data){ 4101 .name = "spicc0_sclk_sel", 4102 .ops = &clk_regmap_mux_ops, 4103 .parent_data = spicc_sclk_parent_data, 4104 .num_parents = ARRAY_SIZE(spicc_sclk_parent_data), 4105 }, 4106 }; 4107 4108 static struct clk_regmap g12a_spicc0_sclk_div = { 4109 .data = &(struct clk_regmap_div_data){ 4110 .offset = HHI_SPICC_CLK_CNTL, 4111 .shift = 0, 4112 .width = 6, 4113 }, 4114 .hw.init = &(struct clk_init_data){ 4115 .name = "spicc0_sclk_div", 4116 .ops = &clk_regmap_divider_ops, 4117 .parent_hws = (const struct clk_hw *[]) { 4118 &g12a_spicc0_sclk_sel.hw 4119 }, 4120 .num_parents = 1, 4121 .flags = CLK_SET_RATE_PARENT, 4122 }, 4123 }; 4124 4125 static struct clk_regmap g12a_spicc0_sclk = { 4126 .data = &(struct clk_regmap_gate_data){ 4127 .offset = HHI_SPICC_CLK_CNTL, 4128 .bit_idx = 6, 4129 }, 4130 .hw.init = &(struct clk_init_data){ 4131 .name = "spicc0_sclk", 4132 .ops = &clk_regmap_gate_ops, 4133 .parent_hws = (const struct clk_hw *[]) { 4134 &g12a_spicc0_sclk_div.hw 4135 }, 4136 .num_parents = 1, 4137 .flags = CLK_SET_RATE_PARENT, 4138 }, 4139 }; 4140 4141 static struct clk_regmap g12a_spicc1_sclk_sel = { 4142 .data = &(struct clk_regmap_mux_data){ 4143 .offset = HHI_SPICC_CLK_CNTL, 4144 .mask = 7, 4145 .shift = 23, 4146 }, 4147 .hw.init = &(struct clk_init_data){ 4148 .name = "spicc1_sclk_sel", 4149 .ops = &clk_regmap_mux_ops, 4150 .parent_data = spicc_sclk_parent_data, 4151 .num_parents = ARRAY_SIZE(spicc_sclk_parent_data), 4152 }, 4153 }; 4154 4155 static struct clk_regmap g12a_spicc1_sclk_div = { 4156 .data = &(struct clk_regmap_div_data){ 4157 .offset = HHI_SPICC_CLK_CNTL, 4158 .shift = 16, 4159 .width = 6, 4160 }, 4161 .hw.init = &(struct clk_init_data){ 4162 .name = "spicc1_sclk_div", 4163 .ops = &clk_regmap_divider_ops, 4164 .parent_hws = (const struct clk_hw *[]) { 4165 &g12a_spicc1_sclk_sel.hw 4166 }, 4167 .num_parents = 1, 4168 .flags = CLK_SET_RATE_PARENT, 4169 }, 4170 }; 4171 4172 static struct clk_regmap g12a_spicc1_sclk = { 4173 .data = &(struct clk_regmap_gate_data){ 4174 .offset = HHI_SPICC_CLK_CNTL, 4175 .bit_idx = 22, 4176 }, 4177 .hw.init = &(struct clk_init_data){ 4178 .name = "spicc1_sclk", 4179 .ops = &clk_regmap_gate_ops, 4180 .parent_hws = (const struct clk_hw *[]) { 4181 &g12a_spicc1_sclk_div.hw 4182 }, 4183 .num_parents = 1, 4184 .flags = CLK_SET_RATE_PARENT, 4185 }, 4186 }; 4187 4188 /* Neural Network Accelerator source clock */ 4189 4190 static const struct clk_parent_data nna_clk_parent_data[] = { 4191 { .fw_name = "xtal", }, 4192 { .hw = &g12a_gp0_pll.hw, }, 4193 { .hw = &g12a_hifi_pll.hw, }, 4194 { .hw = &g12a_fclk_div2p5.hw, }, 4195 { .hw = &g12a_fclk_div3.hw, }, 4196 { .hw = &g12a_fclk_div4.hw, }, 4197 { .hw = &g12a_fclk_div5.hw, }, 4198 { .hw = &g12a_fclk_div7.hw }, 4199 }; 4200 4201 static struct clk_regmap sm1_nna_axi_clk_sel = { 4202 .data = &(struct clk_regmap_mux_data){ 4203 .offset = HHI_NNA_CLK_CNTL, 4204 .mask = 7, 4205 .shift = 9, 4206 }, 4207 .hw.init = &(struct clk_init_data){ 4208 .name = "nna_axi_clk_sel", 4209 .ops = &clk_regmap_mux_ops, 4210 .parent_data = nna_clk_parent_data, 4211 .num_parents = ARRAY_SIZE(nna_clk_parent_data), 4212 }, 4213 }; 4214 4215 static struct clk_regmap sm1_nna_axi_clk_div = { 4216 .data = &(struct clk_regmap_div_data){ 4217 .offset = HHI_NNA_CLK_CNTL, 4218 .shift = 0, 4219 .width = 7, 4220 }, 4221 .hw.init = &(struct clk_init_data){ 4222 .name = "nna_axi_clk_div", 4223 .ops = &clk_regmap_divider_ops, 4224 .parent_hws = (const struct clk_hw *[]) { 4225 &sm1_nna_axi_clk_sel.hw 4226 }, 4227 .num_parents = 1, 4228 .flags = CLK_SET_RATE_PARENT, 4229 }, 4230 }; 4231 4232 static struct clk_regmap sm1_nna_axi_clk = { 4233 .data = &(struct clk_regmap_gate_data){ 4234 .offset = HHI_NNA_CLK_CNTL, 4235 .bit_idx = 8, 4236 }, 4237 .hw.init = &(struct clk_init_data){ 4238 .name = "nna_axi_clk", 4239 .ops = &clk_regmap_gate_ops, 4240 .parent_hws = (const struct clk_hw *[]) { 4241 &sm1_nna_axi_clk_div.hw 4242 }, 4243 .num_parents = 1, 4244 .flags = CLK_SET_RATE_PARENT, 4245 }, 4246 }; 4247 4248 static struct clk_regmap sm1_nna_core_clk_sel = { 4249 .data = &(struct clk_regmap_mux_data){ 4250 .offset = HHI_NNA_CLK_CNTL, 4251 .mask = 7, 4252 .shift = 25, 4253 }, 4254 .hw.init = &(struct clk_init_data){ 4255 .name = "nna_core_clk_sel", 4256 .ops = &clk_regmap_mux_ops, 4257 .parent_data = nna_clk_parent_data, 4258 .num_parents = ARRAY_SIZE(nna_clk_parent_data), 4259 }, 4260 }; 4261 4262 static struct clk_regmap sm1_nna_core_clk_div = { 4263 .data = &(struct clk_regmap_div_data){ 4264 .offset = HHI_NNA_CLK_CNTL, 4265 .shift = 16, 4266 .width = 7, 4267 }, 4268 .hw.init = &(struct clk_init_data){ 4269 .name = "nna_core_clk_div", 4270 .ops = &clk_regmap_divider_ops, 4271 .parent_hws = (const struct clk_hw *[]) { 4272 &sm1_nna_core_clk_sel.hw 4273 }, 4274 .num_parents = 1, 4275 .flags = CLK_SET_RATE_PARENT, 4276 }, 4277 }; 4278 4279 static struct clk_regmap sm1_nna_core_clk = { 4280 .data = &(struct clk_regmap_gate_data){ 4281 .offset = HHI_NNA_CLK_CNTL, 4282 .bit_idx = 24, 4283 }, 4284 .hw.init = &(struct clk_init_data){ 4285 .name = "nna_core_clk", 4286 .ops = &clk_regmap_gate_ops, 4287 .parent_hws = (const struct clk_hw *[]) { 4288 &sm1_nna_core_clk_div.hw 4289 }, 4290 .num_parents = 1, 4291 .flags = CLK_SET_RATE_PARENT, 4292 }, 4293 }; 4294 4295 #define MESON_GATE(_name, _reg, _bit) \ 4296 MESON_PCLK(_name, _reg, _bit, &g12a_clk81.hw) 4297 4298 #define MESON_GATE_RO(_name, _reg, _bit) \ 4299 MESON_PCLK_RO(_name, _reg, _bit, &g12a_clk81.hw) 4300 4301 /* Everything Else (EE) domain gates */ 4302 static MESON_GATE(g12a_ddr, HHI_GCLK_MPEG0, 0); 4303 static MESON_GATE(g12a_dos, HHI_GCLK_MPEG0, 1); 4304 static MESON_GATE(g12a_audio_locker, HHI_GCLK_MPEG0, 2); 4305 static MESON_GATE(g12a_mipi_dsi_host, HHI_GCLK_MPEG0, 3); 4306 static MESON_GATE(g12a_eth_phy, HHI_GCLK_MPEG0, 4); 4307 static MESON_GATE(g12a_isa, HHI_GCLK_MPEG0, 5); 4308 static MESON_GATE(g12a_pl301, HHI_GCLK_MPEG0, 6); 4309 static MESON_GATE(g12a_periphs, HHI_GCLK_MPEG0, 7); 4310 static MESON_GATE(g12a_spicc_0, HHI_GCLK_MPEG0, 8); 4311 static MESON_GATE(g12a_i2c, HHI_GCLK_MPEG0, 9); 4312 static MESON_GATE(g12a_sana, HHI_GCLK_MPEG0, 10); 4313 static MESON_GATE(g12a_sd, HHI_GCLK_MPEG0, 11); 4314 static MESON_GATE(g12a_rng0, HHI_GCLK_MPEG0, 12); 4315 static MESON_GATE(g12a_uart0, HHI_GCLK_MPEG0, 13); 4316 static MESON_GATE(g12a_spicc_1, HHI_GCLK_MPEG0, 14); 4317 static MESON_GATE(g12a_hiu_reg, HHI_GCLK_MPEG0, 19); 4318 static MESON_GATE(g12a_mipi_dsi_phy, HHI_GCLK_MPEG0, 20); 4319 static MESON_GATE(g12a_assist_misc, HHI_GCLK_MPEG0, 23); 4320 static MESON_GATE(g12a_emmc_a, HHI_GCLK_MPEG0, 4); 4321 static MESON_GATE(g12a_emmc_b, HHI_GCLK_MPEG0, 25); 4322 static MESON_GATE(g12a_emmc_c, HHI_GCLK_MPEG0, 26); 4323 static MESON_GATE(g12a_audio_codec, HHI_GCLK_MPEG0, 28); 4324 4325 static MESON_GATE(g12a_audio, HHI_GCLK_MPEG1, 0); 4326 static MESON_GATE(g12a_eth_core, HHI_GCLK_MPEG1, 3); 4327 static MESON_GATE(g12a_demux, HHI_GCLK_MPEG1, 4); 4328 static MESON_GATE(g12a_audio_ififo, HHI_GCLK_MPEG1, 11); 4329 static MESON_GATE(g12a_adc, HHI_GCLK_MPEG1, 13); 4330 static MESON_GATE(g12a_uart1, HHI_GCLK_MPEG1, 16); 4331 static MESON_GATE(g12a_g2d, HHI_GCLK_MPEG1, 20); 4332 static MESON_GATE(g12a_reset, HHI_GCLK_MPEG1, 23); 4333 static MESON_GATE(g12a_pcie_comb, HHI_GCLK_MPEG1, 24); 4334 static MESON_GATE(g12a_parser, HHI_GCLK_MPEG1, 25); 4335 static MESON_GATE(g12a_usb_general, HHI_GCLK_MPEG1, 26); 4336 static MESON_GATE(g12a_pcie_phy, HHI_GCLK_MPEG1, 27); 4337 static MESON_GATE(g12a_ahb_arb0, HHI_GCLK_MPEG1, 29); 4338 4339 static MESON_GATE(g12a_ahb_data_bus, HHI_GCLK_MPEG2, 1); 4340 static MESON_GATE(g12a_ahb_ctrl_bus, HHI_GCLK_MPEG2, 2); 4341 static MESON_GATE(g12a_htx_hdcp22, HHI_GCLK_MPEG2, 3); 4342 static MESON_GATE(g12a_htx_pclk, HHI_GCLK_MPEG2, 4); 4343 static MESON_GATE(g12a_bt656, HHI_GCLK_MPEG2, 6); 4344 static MESON_GATE(g12a_usb1_to_ddr, HHI_GCLK_MPEG2, 8); 4345 static MESON_GATE(g12b_mipi_isp_gate, HHI_GCLK_MPEG2, 17); 4346 static MESON_GATE(g12a_mmc_pclk, HHI_GCLK_MPEG2, 11); 4347 static MESON_GATE(g12a_uart2, HHI_GCLK_MPEG2, 15); 4348 static MESON_GATE(g12a_vpu_intr, HHI_GCLK_MPEG2, 25); 4349 static MESON_GATE(g12b_csi_phy1, HHI_GCLK_MPEG2, 28); 4350 static MESON_GATE(g12b_csi_phy0, HHI_GCLK_MPEG2, 29); 4351 static MESON_GATE(g12a_gic, HHI_GCLK_MPEG2, 30); 4352 4353 static MESON_GATE(g12a_vclk2_venci0, HHI_GCLK_OTHER, 1); 4354 static MESON_GATE(g12a_vclk2_venci1, HHI_GCLK_OTHER, 2); 4355 static MESON_GATE(g12a_vclk2_vencp0, HHI_GCLK_OTHER, 3); 4356 static MESON_GATE(g12a_vclk2_vencp1, HHI_GCLK_OTHER, 4); 4357 static MESON_GATE(g12a_vclk2_venct0, HHI_GCLK_OTHER, 5); 4358 static MESON_GATE(g12a_vclk2_venct1, HHI_GCLK_OTHER, 6); 4359 static MESON_GATE(g12a_vclk2_other, HHI_GCLK_OTHER, 7); 4360 static MESON_GATE(g12a_vclk2_enci, HHI_GCLK_OTHER, 8); 4361 static MESON_GATE(g12a_vclk2_encp, HHI_GCLK_OTHER, 9); 4362 static MESON_GATE(g12a_dac_clk, HHI_GCLK_OTHER, 10); 4363 static MESON_GATE(g12a_aoclk_gate, HHI_GCLK_OTHER, 14); 4364 static MESON_GATE(g12a_iec958_gate, HHI_GCLK_OTHER, 16); 4365 static MESON_GATE(g12a_enc480p, HHI_GCLK_OTHER, 20); 4366 static MESON_GATE(g12a_rng1, HHI_GCLK_OTHER, 21); 4367 static MESON_GATE(g12a_vclk2_enct, HHI_GCLK_OTHER, 22); 4368 static MESON_GATE(g12a_vclk2_encl, HHI_GCLK_OTHER, 23); 4369 static MESON_GATE(g12a_vclk2_venclmmc, HHI_GCLK_OTHER, 24); 4370 static MESON_GATE(g12a_vclk2_vencl, HHI_GCLK_OTHER, 25); 4371 static MESON_GATE(g12a_vclk2_other1, HHI_GCLK_OTHER, 26); 4372 4373 static MESON_GATE_RO(g12a_dma, HHI_GCLK_OTHER2, 0); 4374 static MESON_GATE_RO(g12a_efuse, HHI_GCLK_OTHER2, 1); 4375 static MESON_GATE_RO(g12a_rom_boot, HHI_GCLK_OTHER2, 2); 4376 static MESON_GATE_RO(g12a_reset_sec, HHI_GCLK_OTHER2, 3); 4377 static MESON_GATE_RO(g12a_sec_ahb_apb3, HHI_GCLK_OTHER2, 4); 4378 4379 /* Array of all clocks provided by this provider */ 4380 static struct clk_hw *g12a_hw_clks[] = { 4381 [CLKID_SYS_PLL] = &g12a_sys_pll.hw, 4382 [CLKID_FIXED_PLL] = &g12a_fixed_pll.hw, 4383 [CLKID_FCLK_DIV2] = &g12a_fclk_div2.hw, 4384 [CLKID_FCLK_DIV3] = &g12a_fclk_div3.hw, 4385 [CLKID_FCLK_DIV4] = &g12a_fclk_div4.hw, 4386 [CLKID_FCLK_DIV5] = &g12a_fclk_div5.hw, 4387 [CLKID_FCLK_DIV7] = &g12a_fclk_div7.hw, 4388 [CLKID_FCLK_DIV2P5] = &g12a_fclk_div2p5.hw, 4389 [CLKID_GP0_PLL] = &g12a_gp0_pll.hw, 4390 [CLKID_MPEG_SEL] = &g12a_mpeg_clk_sel.hw, 4391 [CLKID_MPEG_DIV] = &g12a_mpeg_clk_div.hw, 4392 [CLKID_CLK81] = &g12a_clk81.hw, 4393 [CLKID_MPLL0] = &g12a_mpll0.hw, 4394 [CLKID_MPLL1] = &g12a_mpll1.hw, 4395 [CLKID_MPLL2] = &g12a_mpll2.hw, 4396 [CLKID_MPLL3] = &g12a_mpll3.hw, 4397 [CLKID_DDR] = &g12a_ddr.hw, 4398 [CLKID_DOS] = &g12a_dos.hw, 4399 [CLKID_AUDIO_LOCKER] = &g12a_audio_locker.hw, 4400 [CLKID_MIPI_DSI_HOST] = &g12a_mipi_dsi_host.hw, 4401 [CLKID_ETH_PHY] = &g12a_eth_phy.hw, 4402 [CLKID_ISA] = &g12a_isa.hw, 4403 [CLKID_PL301] = &g12a_pl301.hw, 4404 [CLKID_PERIPHS] = &g12a_periphs.hw, 4405 [CLKID_SPICC0] = &g12a_spicc_0.hw, 4406 [CLKID_I2C] = &g12a_i2c.hw, 4407 [CLKID_SANA] = &g12a_sana.hw, 4408 [CLKID_SD] = &g12a_sd.hw, 4409 [CLKID_RNG0] = &g12a_rng0.hw, 4410 [CLKID_UART0] = &g12a_uart0.hw, 4411 [CLKID_SPICC1] = &g12a_spicc_1.hw, 4412 [CLKID_HIU_IFACE] = &g12a_hiu_reg.hw, 4413 [CLKID_MIPI_DSI_PHY] = &g12a_mipi_dsi_phy.hw, 4414 [CLKID_ASSIST_MISC] = &g12a_assist_misc.hw, 4415 [CLKID_SD_EMMC_A] = &g12a_emmc_a.hw, 4416 [CLKID_SD_EMMC_B] = &g12a_emmc_b.hw, 4417 [CLKID_SD_EMMC_C] = &g12a_emmc_c.hw, 4418 [CLKID_AUDIO_CODEC] = &g12a_audio_codec.hw, 4419 [CLKID_AUDIO] = &g12a_audio.hw, 4420 [CLKID_ETH] = &g12a_eth_core.hw, 4421 [CLKID_DEMUX] = &g12a_demux.hw, 4422 [CLKID_AUDIO_IFIFO] = &g12a_audio_ififo.hw, 4423 [CLKID_ADC] = &g12a_adc.hw, 4424 [CLKID_UART1] = &g12a_uart1.hw, 4425 [CLKID_G2D] = &g12a_g2d.hw, 4426 [CLKID_RESET] = &g12a_reset.hw, 4427 [CLKID_PCIE_COMB] = &g12a_pcie_comb.hw, 4428 [CLKID_PARSER] = &g12a_parser.hw, 4429 [CLKID_USB] = &g12a_usb_general.hw, 4430 [CLKID_PCIE_PHY] = &g12a_pcie_phy.hw, 4431 [CLKID_AHB_ARB0] = &g12a_ahb_arb0.hw, 4432 [CLKID_AHB_DATA_BUS] = &g12a_ahb_data_bus.hw, 4433 [CLKID_AHB_CTRL_BUS] = &g12a_ahb_ctrl_bus.hw, 4434 [CLKID_HTX_HDCP22] = &g12a_htx_hdcp22.hw, 4435 [CLKID_HTX_PCLK] = &g12a_htx_pclk.hw, 4436 [CLKID_BT656] = &g12a_bt656.hw, 4437 [CLKID_USB1_DDR_BRIDGE] = &g12a_usb1_to_ddr.hw, 4438 [CLKID_MMC_PCLK] = &g12a_mmc_pclk.hw, 4439 [CLKID_UART2] = &g12a_uart2.hw, 4440 [CLKID_VPU_INTR] = &g12a_vpu_intr.hw, 4441 [CLKID_GIC] = &g12a_gic.hw, 4442 [CLKID_SD_EMMC_A_CLK0_SEL] = &g12a_sd_emmc_a_clk0_sel.hw, 4443 [CLKID_SD_EMMC_A_CLK0_DIV] = &g12a_sd_emmc_a_clk0_div.hw, 4444 [CLKID_SD_EMMC_A_CLK0] = &g12a_sd_emmc_a_clk0.hw, 4445 [CLKID_SD_EMMC_B_CLK0_SEL] = &g12a_sd_emmc_b_clk0_sel.hw, 4446 [CLKID_SD_EMMC_B_CLK0_DIV] = &g12a_sd_emmc_b_clk0_div.hw, 4447 [CLKID_SD_EMMC_B_CLK0] = &g12a_sd_emmc_b_clk0.hw, 4448 [CLKID_SD_EMMC_C_CLK0_SEL] = &g12a_sd_emmc_c_clk0_sel.hw, 4449 [CLKID_SD_EMMC_C_CLK0_DIV] = &g12a_sd_emmc_c_clk0_div.hw, 4450 [CLKID_SD_EMMC_C_CLK0] = &g12a_sd_emmc_c_clk0.hw, 4451 [CLKID_MPLL0_DIV] = &g12a_mpll0_div.hw, 4452 [CLKID_MPLL1_DIV] = &g12a_mpll1_div.hw, 4453 [CLKID_MPLL2_DIV] = &g12a_mpll2_div.hw, 4454 [CLKID_MPLL3_DIV] = &g12a_mpll3_div.hw, 4455 [CLKID_FCLK_DIV2_DIV] = &g12a_fclk_div2_div.hw, 4456 [CLKID_FCLK_DIV3_DIV] = &g12a_fclk_div3_div.hw, 4457 [CLKID_FCLK_DIV4_DIV] = &g12a_fclk_div4_div.hw, 4458 [CLKID_FCLK_DIV5_DIV] = &g12a_fclk_div5_div.hw, 4459 [CLKID_FCLK_DIV7_DIV] = &g12a_fclk_div7_div.hw, 4460 [CLKID_FCLK_DIV2P5_DIV] = &g12a_fclk_div2p5_div.hw, 4461 [CLKID_HIFI_PLL] = &g12a_hifi_pll.hw, 4462 [CLKID_VCLK2_VENCI0] = &g12a_vclk2_venci0.hw, 4463 [CLKID_VCLK2_VENCI1] = &g12a_vclk2_venci1.hw, 4464 [CLKID_VCLK2_VENCP0] = &g12a_vclk2_vencp0.hw, 4465 [CLKID_VCLK2_VENCP1] = &g12a_vclk2_vencp1.hw, 4466 [CLKID_VCLK2_VENCT0] = &g12a_vclk2_venct0.hw, 4467 [CLKID_VCLK2_VENCT1] = &g12a_vclk2_venct1.hw, 4468 [CLKID_VCLK2_OTHER] = &g12a_vclk2_other.hw, 4469 [CLKID_VCLK2_ENCI] = &g12a_vclk2_enci.hw, 4470 [CLKID_VCLK2_ENCP] = &g12a_vclk2_encp.hw, 4471 [CLKID_DAC_CLK] = &g12a_dac_clk.hw, 4472 [CLKID_AOCLK] = &g12a_aoclk_gate.hw, 4473 [CLKID_IEC958] = &g12a_iec958_gate.hw, 4474 [CLKID_ENC480P] = &g12a_enc480p.hw, 4475 [CLKID_RNG1] = &g12a_rng1.hw, 4476 [CLKID_VCLK2_ENCT] = &g12a_vclk2_enct.hw, 4477 [CLKID_VCLK2_ENCL] = &g12a_vclk2_encl.hw, 4478 [CLKID_VCLK2_VENCLMMC] = &g12a_vclk2_venclmmc.hw, 4479 [CLKID_VCLK2_VENCL] = &g12a_vclk2_vencl.hw, 4480 [CLKID_VCLK2_OTHER1] = &g12a_vclk2_other1.hw, 4481 [CLKID_FIXED_PLL_DCO] = &g12a_fixed_pll_dco.hw, 4482 [CLKID_SYS_PLL_DCO] = &g12a_sys_pll_dco.hw, 4483 [CLKID_GP0_PLL_DCO] = &g12a_gp0_pll_dco.hw, 4484 [CLKID_HIFI_PLL_DCO] = &g12a_hifi_pll_dco.hw, 4485 [CLKID_DMA] = &g12a_dma.hw, 4486 [CLKID_EFUSE] = &g12a_efuse.hw, 4487 [CLKID_ROM_BOOT] = &g12a_rom_boot.hw, 4488 [CLKID_RESET_SEC] = &g12a_reset_sec.hw, 4489 [CLKID_SEC_AHB_APB3] = &g12a_sec_ahb_apb3.hw, 4490 [CLKID_MPLL_PREDIV] = &g12a_mpll_prediv.hw, 4491 [CLKID_VPU_0_SEL] = &g12a_vpu_0_sel.hw, 4492 [CLKID_VPU_0_DIV] = &g12a_vpu_0_div.hw, 4493 [CLKID_VPU_0] = &g12a_vpu_0.hw, 4494 [CLKID_VPU_1_SEL] = &g12a_vpu_1_sel.hw, 4495 [CLKID_VPU_1_DIV] = &g12a_vpu_1_div.hw, 4496 [CLKID_VPU_1] = &g12a_vpu_1.hw, 4497 [CLKID_VPU] = &g12a_vpu.hw, 4498 [CLKID_VAPB_0_SEL] = &g12a_vapb_0_sel.hw, 4499 [CLKID_VAPB_0_DIV] = &g12a_vapb_0_div.hw, 4500 [CLKID_VAPB_0] = &g12a_vapb_0.hw, 4501 [CLKID_VAPB_1_SEL] = &g12a_vapb_1_sel.hw, 4502 [CLKID_VAPB_1_DIV] = &g12a_vapb_1_div.hw, 4503 [CLKID_VAPB_1] = &g12a_vapb_1.hw, 4504 [CLKID_VAPB_SEL] = &g12a_vapb_sel.hw, 4505 [CLKID_VAPB] = &g12a_vapb.hw, 4506 [CLKID_HDMI_PLL_DCO] = &g12a_hdmi_pll_dco.hw, 4507 [CLKID_HDMI_PLL_OD] = &g12a_hdmi_pll_od.hw, 4508 [CLKID_HDMI_PLL_OD2] = &g12a_hdmi_pll_od2.hw, 4509 [CLKID_HDMI_PLL] = &g12a_hdmi_pll.hw, 4510 [CLKID_VID_PLL] = &g12a_vid_pll_div.hw, 4511 [CLKID_VID_PLL_SEL] = &g12a_vid_pll_sel.hw, 4512 [CLKID_VID_PLL_DIV] = &g12a_vid_pll.hw, 4513 [CLKID_VCLK_SEL] = &g12a_vclk_sel.hw, 4514 [CLKID_VCLK2_SEL] = &g12a_vclk2_sel.hw, 4515 [CLKID_VCLK_INPUT] = &g12a_vclk_input.hw, 4516 [CLKID_VCLK2_INPUT] = &g12a_vclk2_input.hw, 4517 [CLKID_VCLK_DIV] = &g12a_vclk_div.hw, 4518 [CLKID_VCLK2_DIV] = &g12a_vclk2_div.hw, 4519 [CLKID_VCLK] = &g12a_vclk.hw, 4520 [CLKID_VCLK2] = &g12a_vclk2.hw, 4521 [CLKID_VCLK_DIV1] = &g12a_vclk_div1.hw, 4522 [CLKID_VCLK_DIV2_EN] = &g12a_vclk_div2_en.hw, 4523 [CLKID_VCLK_DIV4_EN] = &g12a_vclk_div4_en.hw, 4524 [CLKID_VCLK_DIV6_EN] = &g12a_vclk_div6_en.hw, 4525 [CLKID_VCLK_DIV12_EN] = &g12a_vclk_div12_en.hw, 4526 [CLKID_VCLK2_DIV1] = &g12a_vclk2_div1.hw, 4527 [CLKID_VCLK2_DIV2_EN] = &g12a_vclk2_div2_en.hw, 4528 [CLKID_VCLK2_DIV4_EN] = &g12a_vclk2_div4_en.hw, 4529 [CLKID_VCLK2_DIV6_EN] = &g12a_vclk2_div6_en.hw, 4530 [CLKID_VCLK2_DIV12_EN] = &g12a_vclk2_div12_en.hw, 4531 [CLKID_VCLK_DIV2] = &g12a_vclk_div2.hw, 4532 [CLKID_VCLK_DIV4] = &g12a_vclk_div4.hw, 4533 [CLKID_VCLK_DIV6] = &g12a_vclk_div6.hw, 4534 [CLKID_VCLK_DIV12] = &g12a_vclk_div12.hw, 4535 [CLKID_VCLK2_DIV2] = &g12a_vclk2_div2.hw, 4536 [CLKID_VCLK2_DIV4] = &g12a_vclk2_div4.hw, 4537 [CLKID_VCLK2_DIV6] = &g12a_vclk2_div6.hw, 4538 [CLKID_VCLK2_DIV12] = &g12a_vclk2_div12.hw, 4539 [CLKID_CTS_ENCI_SEL] = &g12a_cts_enci_sel.hw, 4540 [CLKID_CTS_ENCP_SEL] = &g12a_cts_encp_sel.hw, 4541 [CLKID_CTS_ENCL_SEL] = &g12a_cts_encl_sel.hw, 4542 [CLKID_CTS_VDAC_SEL] = &g12a_cts_vdac_sel.hw, 4543 [CLKID_HDMI_TX_SEL] = &g12a_hdmi_tx_sel.hw, 4544 [CLKID_CTS_ENCI] = &g12a_cts_enci.hw, 4545 [CLKID_CTS_ENCP] = &g12a_cts_encp.hw, 4546 [CLKID_CTS_ENCL] = &g12a_cts_encl.hw, 4547 [CLKID_CTS_VDAC] = &g12a_cts_vdac.hw, 4548 [CLKID_HDMI_TX] = &g12a_hdmi_tx.hw, 4549 [CLKID_HDMI_SEL] = &g12a_hdmi_sel.hw, 4550 [CLKID_HDMI_DIV] = &g12a_hdmi_div.hw, 4551 [CLKID_HDMI] = &g12a_hdmi.hw, 4552 [CLKID_MALI_0_SEL] = &g12a_mali_0_sel.hw, 4553 [CLKID_MALI_0_DIV] = &g12a_mali_0_div.hw, 4554 [CLKID_MALI_0] = &g12a_mali_0.hw, 4555 [CLKID_MALI_1_SEL] = &g12a_mali_1_sel.hw, 4556 [CLKID_MALI_1_DIV] = &g12a_mali_1_div.hw, 4557 [CLKID_MALI_1] = &g12a_mali_1.hw, 4558 [CLKID_MALI] = &g12a_mali.hw, 4559 [CLKID_MPLL_50M_DIV] = &g12a_mpll_50m_div.hw, 4560 [CLKID_MPLL_50M] = &g12a_mpll_50m.hw, 4561 [CLKID_SYS_PLL_DIV16_EN] = &g12a_sys_pll_div16_en.hw, 4562 [CLKID_SYS_PLL_DIV16] = &g12a_sys_pll_div16.hw, 4563 [CLKID_CPU_CLK_DYN0_SEL] = &g12a_cpu_clk_premux0.hw, 4564 [CLKID_CPU_CLK_DYN0_DIV] = &g12a_cpu_clk_mux0_div.hw, 4565 [CLKID_CPU_CLK_DYN0] = &g12a_cpu_clk_postmux0.hw, 4566 [CLKID_CPU_CLK_DYN1_SEL] = &g12a_cpu_clk_premux1.hw, 4567 [CLKID_CPU_CLK_DYN1_DIV] = &g12a_cpu_clk_mux1_div.hw, 4568 [CLKID_CPU_CLK_DYN1] = &g12a_cpu_clk_postmux1.hw, 4569 [CLKID_CPU_CLK_DYN] = &g12a_cpu_clk_dyn.hw, 4570 [CLKID_CPU_CLK] = &g12a_cpu_clk.hw, 4571 [CLKID_CPU_CLK_DIV16_EN] = &g12a_cpu_clk_div16_en.hw, 4572 [CLKID_CPU_CLK_DIV16] = &g12a_cpu_clk_div16.hw, 4573 [CLKID_CPU_CLK_APB_DIV] = &g12a_cpu_clk_apb_div.hw, 4574 [CLKID_CPU_CLK_APB] = &g12a_cpu_clk_apb.hw, 4575 [CLKID_CPU_CLK_ATB_DIV] = &g12a_cpu_clk_atb_div.hw, 4576 [CLKID_CPU_CLK_ATB] = &g12a_cpu_clk_atb.hw, 4577 [CLKID_CPU_CLK_AXI_DIV] = &g12a_cpu_clk_axi_div.hw, 4578 [CLKID_CPU_CLK_AXI] = &g12a_cpu_clk_axi.hw, 4579 [CLKID_CPU_CLK_TRACE_DIV] = &g12a_cpu_clk_trace_div.hw, 4580 [CLKID_CPU_CLK_TRACE] = &g12a_cpu_clk_trace.hw, 4581 [CLKID_PCIE_PLL_DCO] = &g12a_pcie_pll_dco.hw, 4582 [CLKID_PCIE_PLL_DCO_DIV2] = &g12a_pcie_pll_dco_div2.hw, 4583 [CLKID_PCIE_PLL_OD] = &g12a_pcie_pll_od.hw, 4584 [CLKID_PCIE_PLL] = &g12a_pcie_pll.hw, 4585 [CLKID_VDEC_1_SEL] = &g12a_vdec_1_sel.hw, 4586 [CLKID_VDEC_1_DIV] = &g12a_vdec_1_div.hw, 4587 [CLKID_VDEC_1] = &g12a_vdec_1.hw, 4588 [CLKID_VDEC_HEVC_SEL] = &g12a_vdec_hevc_sel.hw, 4589 [CLKID_VDEC_HEVC_DIV] = &g12a_vdec_hevc_div.hw, 4590 [CLKID_VDEC_HEVC] = &g12a_vdec_hevc.hw, 4591 [CLKID_VDEC_HEVCF_SEL] = &g12a_vdec_hevcf_sel.hw, 4592 [CLKID_VDEC_HEVCF_DIV] = &g12a_vdec_hevcf_div.hw, 4593 [CLKID_VDEC_HEVCF] = &g12a_vdec_hevcf.hw, 4594 [CLKID_TS_DIV] = &g12a_ts_div.hw, 4595 [CLKID_TS] = &g12a_ts.hw, 4596 [CLKID_SPICC0_SCLK_SEL] = &g12a_spicc0_sclk_sel.hw, 4597 [CLKID_SPICC0_SCLK_DIV] = &g12a_spicc0_sclk_div.hw, 4598 [CLKID_SPICC0_SCLK] = &g12a_spicc0_sclk.hw, 4599 [CLKID_SPICC1_SCLK_SEL] = &g12a_spicc1_sclk_sel.hw, 4600 [CLKID_SPICC1_SCLK_DIV] = &g12a_spicc1_sclk_div.hw, 4601 [CLKID_SPICC1_SCLK] = &g12a_spicc1_sclk.hw, 4602 [CLKID_MIPI_DSI_PXCLK_SEL] = &g12a_mipi_dsi_pxclk_sel.hw, 4603 [CLKID_MIPI_DSI_PXCLK_DIV] = &g12a_mipi_dsi_pxclk_div.hw, 4604 [CLKID_MIPI_DSI_PXCLK] = &g12a_mipi_dsi_pxclk.hw, 4605 }; 4606 4607 static struct clk_hw *g12b_hw_clks[] = { 4608 [CLKID_SYS_PLL] = &g12a_sys_pll.hw, 4609 [CLKID_FIXED_PLL] = &g12a_fixed_pll.hw, 4610 [CLKID_FCLK_DIV2] = &g12a_fclk_div2.hw, 4611 [CLKID_FCLK_DIV3] = &g12a_fclk_div3.hw, 4612 [CLKID_FCLK_DIV4] = &g12a_fclk_div4.hw, 4613 [CLKID_FCLK_DIV5] = &g12a_fclk_div5.hw, 4614 [CLKID_FCLK_DIV7] = &g12a_fclk_div7.hw, 4615 [CLKID_FCLK_DIV2P5] = &g12a_fclk_div2p5.hw, 4616 [CLKID_GP0_PLL] = &g12a_gp0_pll.hw, 4617 [CLKID_MPEG_SEL] = &g12a_mpeg_clk_sel.hw, 4618 [CLKID_MPEG_DIV] = &g12a_mpeg_clk_div.hw, 4619 [CLKID_CLK81] = &g12a_clk81.hw, 4620 [CLKID_MPLL0] = &g12a_mpll0.hw, 4621 [CLKID_MPLL1] = &g12a_mpll1.hw, 4622 [CLKID_MPLL2] = &g12a_mpll2.hw, 4623 [CLKID_MPLL3] = &g12a_mpll3.hw, 4624 [CLKID_DDR] = &g12a_ddr.hw, 4625 [CLKID_DOS] = &g12a_dos.hw, 4626 [CLKID_AUDIO_LOCKER] = &g12a_audio_locker.hw, 4627 [CLKID_MIPI_DSI_HOST] = &g12a_mipi_dsi_host.hw, 4628 [CLKID_ETH_PHY] = &g12a_eth_phy.hw, 4629 [CLKID_ISA] = &g12a_isa.hw, 4630 [CLKID_PL301] = &g12a_pl301.hw, 4631 [CLKID_PERIPHS] = &g12a_periphs.hw, 4632 [CLKID_SPICC0] = &g12a_spicc_0.hw, 4633 [CLKID_I2C] = &g12a_i2c.hw, 4634 [CLKID_SANA] = &g12a_sana.hw, 4635 [CLKID_SD] = &g12a_sd.hw, 4636 [CLKID_RNG0] = &g12a_rng0.hw, 4637 [CLKID_UART0] = &g12a_uart0.hw, 4638 [CLKID_SPICC1] = &g12a_spicc_1.hw, 4639 [CLKID_HIU_IFACE] = &g12a_hiu_reg.hw, 4640 [CLKID_MIPI_DSI_PHY] = &g12a_mipi_dsi_phy.hw, 4641 [CLKID_ASSIST_MISC] = &g12a_assist_misc.hw, 4642 [CLKID_SD_EMMC_A] = &g12a_emmc_a.hw, 4643 [CLKID_SD_EMMC_B] = &g12a_emmc_b.hw, 4644 [CLKID_SD_EMMC_C] = &g12a_emmc_c.hw, 4645 [CLKID_AUDIO_CODEC] = &g12a_audio_codec.hw, 4646 [CLKID_AUDIO] = &g12a_audio.hw, 4647 [CLKID_ETH] = &g12a_eth_core.hw, 4648 [CLKID_DEMUX] = &g12a_demux.hw, 4649 [CLKID_AUDIO_IFIFO] = &g12a_audio_ififo.hw, 4650 [CLKID_ADC] = &g12a_adc.hw, 4651 [CLKID_UART1] = &g12a_uart1.hw, 4652 [CLKID_G2D] = &g12a_g2d.hw, 4653 [CLKID_RESET] = &g12a_reset.hw, 4654 [CLKID_PCIE_COMB] = &g12a_pcie_comb.hw, 4655 [CLKID_PARSER] = &g12a_parser.hw, 4656 [CLKID_USB] = &g12a_usb_general.hw, 4657 [CLKID_PCIE_PHY] = &g12a_pcie_phy.hw, 4658 [CLKID_AHB_ARB0] = &g12a_ahb_arb0.hw, 4659 [CLKID_AHB_DATA_BUS] = &g12a_ahb_data_bus.hw, 4660 [CLKID_AHB_CTRL_BUS] = &g12a_ahb_ctrl_bus.hw, 4661 [CLKID_HTX_HDCP22] = &g12a_htx_hdcp22.hw, 4662 [CLKID_HTX_PCLK] = &g12a_htx_pclk.hw, 4663 [CLKID_BT656] = &g12a_bt656.hw, 4664 [CLKID_USB1_DDR_BRIDGE] = &g12a_usb1_to_ddr.hw, 4665 [CLKID_MMC_PCLK] = &g12a_mmc_pclk.hw, 4666 [CLKID_UART2] = &g12a_uart2.hw, 4667 [CLKID_VPU_INTR] = &g12a_vpu_intr.hw, 4668 [CLKID_GIC] = &g12a_gic.hw, 4669 [CLKID_SD_EMMC_A_CLK0_SEL] = &g12a_sd_emmc_a_clk0_sel.hw, 4670 [CLKID_SD_EMMC_A_CLK0_DIV] = &g12a_sd_emmc_a_clk0_div.hw, 4671 [CLKID_SD_EMMC_A_CLK0] = &g12a_sd_emmc_a_clk0.hw, 4672 [CLKID_SD_EMMC_B_CLK0_SEL] = &g12a_sd_emmc_b_clk0_sel.hw, 4673 [CLKID_SD_EMMC_B_CLK0_DIV] = &g12a_sd_emmc_b_clk0_div.hw, 4674 [CLKID_SD_EMMC_B_CLK0] = &g12a_sd_emmc_b_clk0.hw, 4675 [CLKID_SD_EMMC_C_CLK0_SEL] = &g12a_sd_emmc_c_clk0_sel.hw, 4676 [CLKID_SD_EMMC_C_CLK0_DIV] = &g12a_sd_emmc_c_clk0_div.hw, 4677 [CLKID_SD_EMMC_C_CLK0] = &g12a_sd_emmc_c_clk0.hw, 4678 [CLKID_MPLL0_DIV] = &g12a_mpll0_div.hw, 4679 [CLKID_MPLL1_DIV] = &g12a_mpll1_div.hw, 4680 [CLKID_MPLL2_DIV] = &g12a_mpll2_div.hw, 4681 [CLKID_MPLL3_DIV] = &g12a_mpll3_div.hw, 4682 [CLKID_FCLK_DIV2_DIV] = &g12a_fclk_div2_div.hw, 4683 [CLKID_FCLK_DIV3_DIV] = &g12a_fclk_div3_div.hw, 4684 [CLKID_FCLK_DIV4_DIV] = &g12a_fclk_div4_div.hw, 4685 [CLKID_FCLK_DIV5_DIV] = &g12a_fclk_div5_div.hw, 4686 [CLKID_FCLK_DIV7_DIV] = &g12a_fclk_div7_div.hw, 4687 [CLKID_FCLK_DIV2P5_DIV] = &g12a_fclk_div2p5_div.hw, 4688 [CLKID_HIFI_PLL] = &g12a_hifi_pll.hw, 4689 [CLKID_VCLK2_VENCI0] = &g12a_vclk2_venci0.hw, 4690 [CLKID_VCLK2_VENCI1] = &g12a_vclk2_venci1.hw, 4691 [CLKID_VCLK2_VENCP0] = &g12a_vclk2_vencp0.hw, 4692 [CLKID_VCLK2_VENCP1] = &g12a_vclk2_vencp1.hw, 4693 [CLKID_VCLK2_VENCT0] = &g12a_vclk2_venct0.hw, 4694 [CLKID_VCLK2_VENCT1] = &g12a_vclk2_venct1.hw, 4695 [CLKID_VCLK2_OTHER] = &g12a_vclk2_other.hw, 4696 [CLKID_VCLK2_ENCI] = &g12a_vclk2_enci.hw, 4697 [CLKID_VCLK2_ENCP] = &g12a_vclk2_encp.hw, 4698 [CLKID_DAC_CLK] = &g12a_dac_clk.hw, 4699 [CLKID_AOCLK] = &g12a_aoclk_gate.hw, 4700 [CLKID_IEC958] = &g12a_iec958_gate.hw, 4701 [CLKID_ENC480P] = &g12a_enc480p.hw, 4702 [CLKID_RNG1] = &g12a_rng1.hw, 4703 [CLKID_VCLK2_ENCT] = &g12a_vclk2_enct.hw, 4704 [CLKID_VCLK2_ENCL] = &g12a_vclk2_encl.hw, 4705 [CLKID_VCLK2_VENCLMMC] = &g12a_vclk2_venclmmc.hw, 4706 [CLKID_VCLK2_VENCL] = &g12a_vclk2_vencl.hw, 4707 [CLKID_VCLK2_OTHER1] = &g12a_vclk2_other1.hw, 4708 [CLKID_FIXED_PLL_DCO] = &g12a_fixed_pll_dco.hw, 4709 [CLKID_SYS_PLL_DCO] = &g12a_sys_pll_dco.hw, 4710 [CLKID_GP0_PLL_DCO] = &g12a_gp0_pll_dco.hw, 4711 [CLKID_HIFI_PLL_DCO] = &g12a_hifi_pll_dco.hw, 4712 [CLKID_DMA] = &g12a_dma.hw, 4713 [CLKID_EFUSE] = &g12a_efuse.hw, 4714 [CLKID_ROM_BOOT] = &g12a_rom_boot.hw, 4715 [CLKID_RESET_SEC] = &g12a_reset_sec.hw, 4716 [CLKID_SEC_AHB_APB3] = &g12a_sec_ahb_apb3.hw, 4717 [CLKID_MPLL_PREDIV] = &g12a_mpll_prediv.hw, 4718 [CLKID_VPU_0_SEL] = &g12a_vpu_0_sel.hw, 4719 [CLKID_VPU_0_DIV] = &g12a_vpu_0_div.hw, 4720 [CLKID_VPU_0] = &g12a_vpu_0.hw, 4721 [CLKID_VPU_1_SEL] = &g12a_vpu_1_sel.hw, 4722 [CLKID_VPU_1_DIV] = &g12a_vpu_1_div.hw, 4723 [CLKID_VPU_1] = &g12a_vpu_1.hw, 4724 [CLKID_VPU] = &g12a_vpu.hw, 4725 [CLKID_VAPB_0_SEL] = &g12a_vapb_0_sel.hw, 4726 [CLKID_VAPB_0_DIV] = &g12a_vapb_0_div.hw, 4727 [CLKID_VAPB_0] = &g12a_vapb_0.hw, 4728 [CLKID_VAPB_1_SEL] = &g12a_vapb_1_sel.hw, 4729 [CLKID_VAPB_1_DIV] = &g12a_vapb_1_div.hw, 4730 [CLKID_VAPB_1] = &g12a_vapb_1.hw, 4731 [CLKID_VAPB_SEL] = &g12a_vapb_sel.hw, 4732 [CLKID_VAPB] = &g12a_vapb.hw, 4733 [CLKID_HDMI_PLL_DCO] = &g12a_hdmi_pll_dco.hw, 4734 [CLKID_HDMI_PLL_OD] = &g12a_hdmi_pll_od.hw, 4735 [CLKID_HDMI_PLL_OD2] = &g12a_hdmi_pll_od2.hw, 4736 [CLKID_HDMI_PLL] = &g12a_hdmi_pll.hw, 4737 [CLKID_VID_PLL] = &g12a_vid_pll_div.hw, 4738 [CLKID_VID_PLL_SEL] = &g12a_vid_pll_sel.hw, 4739 [CLKID_VID_PLL_DIV] = &g12a_vid_pll.hw, 4740 [CLKID_VCLK_SEL] = &g12a_vclk_sel.hw, 4741 [CLKID_VCLK2_SEL] = &g12a_vclk2_sel.hw, 4742 [CLKID_VCLK_INPUT] = &g12a_vclk_input.hw, 4743 [CLKID_VCLK2_INPUT] = &g12a_vclk2_input.hw, 4744 [CLKID_VCLK_DIV] = &g12a_vclk_div.hw, 4745 [CLKID_VCLK2_DIV] = &g12a_vclk2_div.hw, 4746 [CLKID_VCLK] = &g12a_vclk.hw, 4747 [CLKID_VCLK2] = &g12a_vclk2.hw, 4748 [CLKID_VCLK_DIV1] = &g12a_vclk_div1.hw, 4749 [CLKID_VCLK_DIV2_EN] = &g12a_vclk_div2_en.hw, 4750 [CLKID_VCLK_DIV4_EN] = &g12a_vclk_div4_en.hw, 4751 [CLKID_VCLK_DIV6_EN] = &g12a_vclk_div6_en.hw, 4752 [CLKID_VCLK_DIV12_EN] = &g12a_vclk_div12_en.hw, 4753 [CLKID_VCLK2_DIV1] = &g12a_vclk2_div1.hw, 4754 [CLKID_VCLK2_DIV2_EN] = &g12a_vclk2_div2_en.hw, 4755 [CLKID_VCLK2_DIV4_EN] = &g12a_vclk2_div4_en.hw, 4756 [CLKID_VCLK2_DIV6_EN] = &g12a_vclk2_div6_en.hw, 4757 [CLKID_VCLK2_DIV12_EN] = &g12a_vclk2_div12_en.hw, 4758 [CLKID_VCLK_DIV2] = &g12a_vclk_div2.hw, 4759 [CLKID_VCLK_DIV4] = &g12a_vclk_div4.hw, 4760 [CLKID_VCLK_DIV6] = &g12a_vclk_div6.hw, 4761 [CLKID_VCLK_DIV12] = &g12a_vclk_div12.hw, 4762 [CLKID_VCLK2_DIV2] = &g12a_vclk2_div2.hw, 4763 [CLKID_VCLK2_DIV4] = &g12a_vclk2_div4.hw, 4764 [CLKID_VCLK2_DIV6] = &g12a_vclk2_div6.hw, 4765 [CLKID_VCLK2_DIV12] = &g12a_vclk2_div12.hw, 4766 [CLKID_CTS_ENCI_SEL] = &g12a_cts_enci_sel.hw, 4767 [CLKID_CTS_ENCP_SEL] = &g12a_cts_encp_sel.hw, 4768 [CLKID_CTS_ENCL_SEL] = &g12a_cts_encl_sel.hw, 4769 [CLKID_CTS_VDAC_SEL] = &g12a_cts_vdac_sel.hw, 4770 [CLKID_HDMI_TX_SEL] = &g12a_hdmi_tx_sel.hw, 4771 [CLKID_CTS_ENCI] = &g12a_cts_enci.hw, 4772 [CLKID_CTS_ENCP] = &g12a_cts_encp.hw, 4773 [CLKID_CTS_ENCL] = &g12a_cts_encl.hw, 4774 [CLKID_CTS_VDAC] = &g12a_cts_vdac.hw, 4775 [CLKID_HDMI_TX] = &g12a_hdmi_tx.hw, 4776 [CLKID_HDMI_SEL] = &g12a_hdmi_sel.hw, 4777 [CLKID_HDMI_DIV] = &g12a_hdmi_div.hw, 4778 [CLKID_HDMI] = &g12a_hdmi.hw, 4779 [CLKID_MALI_0_SEL] = &g12a_mali_0_sel.hw, 4780 [CLKID_MALI_0_DIV] = &g12a_mali_0_div.hw, 4781 [CLKID_MALI_0] = &g12a_mali_0.hw, 4782 [CLKID_MALI_1_SEL] = &g12a_mali_1_sel.hw, 4783 [CLKID_MALI_1_DIV] = &g12a_mali_1_div.hw, 4784 [CLKID_MALI_1] = &g12a_mali_1.hw, 4785 [CLKID_MALI] = &g12a_mali.hw, 4786 [CLKID_MPLL_50M_DIV] = &g12a_mpll_50m_div.hw, 4787 [CLKID_MPLL_50M] = &g12a_mpll_50m.hw, 4788 [CLKID_SYS_PLL_DIV16_EN] = &g12a_sys_pll_div16_en.hw, 4789 [CLKID_SYS_PLL_DIV16] = &g12a_sys_pll_div16.hw, 4790 [CLKID_CPU_CLK_DYN0_SEL] = &g12a_cpu_clk_premux0.hw, 4791 [CLKID_CPU_CLK_DYN0_DIV] = &g12a_cpu_clk_mux0_div.hw, 4792 [CLKID_CPU_CLK_DYN0] = &g12a_cpu_clk_postmux0.hw, 4793 [CLKID_CPU_CLK_DYN1_SEL] = &g12a_cpu_clk_premux1.hw, 4794 [CLKID_CPU_CLK_DYN1_DIV] = &g12a_cpu_clk_mux1_div.hw, 4795 [CLKID_CPU_CLK_DYN1] = &g12a_cpu_clk_postmux1.hw, 4796 [CLKID_CPU_CLK_DYN] = &g12a_cpu_clk_dyn.hw, 4797 [CLKID_CPU_CLK] = &g12b_cpu_clk.hw, 4798 [CLKID_CPU_CLK_DIV16_EN] = &g12a_cpu_clk_div16_en.hw, 4799 [CLKID_CPU_CLK_DIV16] = &g12a_cpu_clk_div16.hw, 4800 [CLKID_CPU_CLK_APB_DIV] = &g12a_cpu_clk_apb_div.hw, 4801 [CLKID_CPU_CLK_APB] = &g12a_cpu_clk_apb.hw, 4802 [CLKID_CPU_CLK_ATB_DIV] = &g12a_cpu_clk_atb_div.hw, 4803 [CLKID_CPU_CLK_ATB] = &g12a_cpu_clk_atb.hw, 4804 [CLKID_CPU_CLK_AXI_DIV] = &g12a_cpu_clk_axi_div.hw, 4805 [CLKID_CPU_CLK_AXI] = &g12a_cpu_clk_axi.hw, 4806 [CLKID_CPU_CLK_TRACE_DIV] = &g12a_cpu_clk_trace_div.hw, 4807 [CLKID_CPU_CLK_TRACE] = &g12a_cpu_clk_trace.hw, 4808 [CLKID_PCIE_PLL_DCO] = &g12a_pcie_pll_dco.hw, 4809 [CLKID_PCIE_PLL_DCO_DIV2] = &g12a_pcie_pll_dco_div2.hw, 4810 [CLKID_PCIE_PLL_OD] = &g12a_pcie_pll_od.hw, 4811 [CLKID_PCIE_PLL] = &g12a_pcie_pll.hw, 4812 [CLKID_VDEC_1_SEL] = &g12a_vdec_1_sel.hw, 4813 [CLKID_VDEC_1_DIV] = &g12a_vdec_1_div.hw, 4814 [CLKID_VDEC_1] = &g12a_vdec_1.hw, 4815 [CLKID_VDEC_HEVC_SEL] = &g12a_vdec_hevc_sel.hw, 4816 [CLKID_VDEC_HEVC_DIV] = &g12a_vdec_hevc_div.hw, 4817 [CLKID_VDEC_HEVC] = &g12a_vdec_hevc.hw, 4818 [CLKID_VDEC_HEVCF_SEL] = &g12a_vdec_hevcf_sel.hw, 4819 [CLKID_VDEC_HEVCF_DIV] = &g12a_vdec_hevcf_div.hw, 4820 [CLKID_VDEC_HEVCF] = &g12a_vdec_hevcf.hw, 4821 [CLKID_TS_DIV] = &g12a_ts_div.hw, 4822 [CLKID_TS] = &g12a_ts.hw, 4823 [CLKID_SYS1_PLL_DCO] = &g12b_sys1_pll_dco.hw, 4824 [CLKID_SYS1_PLL] = &g12b_sys1_pll.hw, 4825 [CLKID_SYS1_PLL_DIV16_EN] = &g12b_sys1_pll_div16_en.hw, 4826 [CLKID_SYS1_PLL_DIV16] = &g12b_sys1_pll_div16.hw, 4827 [CLKID_CPUB_CLK_DYN0_SEL] = &g12b_cpub_clk_premux0.hw, 4828 [CLKID_CPUB_CLK_DYN0_DIV] = &g12b_cpub_clk_mux0_div.hw, 4829 [CLKID_CPUB_CLK_DYN0] = &g12b_cpub_clk_postmux0.hw, 4830 [CLKID_CPUB_CLK_DYN1_SEL] = &g12b_cpub_clk_premux1.hw, 4831 [CLKID_CPUB_CLK_DYN1_DIV] = &g12b_cpub_clk_mux1_div.hw, 4832 [CLKID_CPUB_CLK_DYN1] = &g12b_cpub_clk_postmux1.hw, 4833 [CLKID_CPUB_CLK_DYN] = &g12b_cpub_clk_dyn.hw, 4834 [CLKID_CPUB_CLK] = &g12b_cpub_clk.hw, 4835 [CLKID_CPUB_CLK_DIV16_EN] = &g12b_cpub_clk_div16_en.hw, 4836 [CLKID_CPUB_CLK_DIV16] = &g12b_cpub_clk_div16.hw, 4837 [CLKID_CPUB_CLK_DIV2] = &g12b_cpub_clk_div2.hw, 4838 [CLKID_CPUB_CLK_DIV3] = &g12b_cpub_clk_div3.hw, 4839 [CLKID_CPUB_CLK_DIV4] = &g12b_cpub_clk_div4.hw, 4840 [CLKID_CPUB_CLK_DIV5] = &g12b_cpub_clk_div5.hw, 4841 [CLKID_CPUB_CLK_DIV6] = &g12b_cpub_clk_div6.hw, 4842 [CLKID_CPUB_CLK_DIV7] = &g12b_cpub_clk_div7.hw, 4843 [CLKID_CPUB_CLK_DIV8] = &g12b_cpub_clk_div8.hw, 4844 [CLKID_CPUB_CLK_APB_SEL] = &g12b_cpub_clk_apb_sel.hw, 4845 [CLKID_CPUB_CLK_APB] = &g12b_cpub_clk_apb.hw, 4846 [CLKID_CPUB_CLK_ATB_SEL] = &g12b_cpub_clk_atb_sel.hw, 4847 [CLKID_CPUB_CLK_ATB] = &g12b_cpub_clk_atb.hw, 4848 [CLKID_CPUB_CLK_AXI_SEL] = &g12b_cpub_clk_axi_sel.hw, 4849 [CLKID_CPUB_CLK_AXI] = &g12b_cpub_clk_axi.hw, 4850 [CLKID_CPUB_CLK_TRACE_SEL] = &g12b_cpub_clk_trace_sel.hw, 4851 [CLKID_CPUB_CLK_TRACE] = &g12b_cpub_clk_trace.hw, 4852 [CLKID_SPICC0_SCLK_SEL] = &g12a_spicc0_sclk_sel.hw, 4853 [CLKID_SPICC0_SCLK_DIV] = &g12a_spicc0_sclk_div.hw, 4854 [CLKID_SPICC0_SCLK] = &g12a_spicc0_sclk.hw, 4855 [CLKID_SPICC1_SCLK_SEL] = &g12a_spicc1_sclk_sel.hw, 4856 [CLKID_SPICC1_SCLK_DIV] = &g12a_spicc1_sclk_div.hw, 4857 [CLKID_SPICC1_SCLK] = &g12a_spicc1_sclk.hw, 4858 [CLKID_NNA_AXI_CLK_SEL] = &sm1_nna_axi_clk_sel.hw, 4859 [CLKID_NNA_AXI_CLK_DIV] = &sm1_nna_axi_clk_div.hw, 4860 [CLKID_NNA_AXI_CLK] = &sm1_nna_axi_clk.hw, 4861 [CLKID_NNA_CORE_CLK_SEL] = &sm1_nna_core_clk_sel.hw, 4862 [CLKID_NNA_CORE_CLK_DIV] = &sm1_nna_core_clk_div.hw, 4863 [CLKID_NNA_CORE_CLK] = &sm1_nna_core_clk.hw, 4864 [CLKID_MIPI_DSI_PXCLK_SEL] = &g12a_mipi_dsi_pxclk_sel.hw, 4865 [CLKID_MIPI_DSI_PXCLK_DIV] = &g12a_mipi_dsi_pxclk_div.hw, 4866 [CLKID_MIPI_DSI_PXCLK] = &g12a_mipi_dsi_pxclk.hw, 4867 [CLKID_MIPI_ISP_SEL] = &g12b_mipi_isp_sel.hw, 4868 [CLKID_MIPI_ISP_DIV] = &g12b_mipi_isp_div.hw, 4869 [CLKID_MIPI_ISP] = &g12b_mipi_isp.hw, 4870 [CLKID_MIPI_ISP_GATE] = &g12b_mipi_isp_gate.hw, 4871 [CLKID_MIPI_ISP_CSI_PHY0] = &g12b_csi_phy0.hw, 4872 [CLKID_MIPI_ISP_CSI_PHY1] = &g12b_csi_phy1.hw, 4873 }; 4874 4875 static struct clk_hw *sm1_hw_clks[] = { 4876 [CLKID_SYS_PLL] = &g12a_sys_pll.hw, 4877 [CLKID_FIXED_PLL] = &g12a_fixed_pll.hw, 4878 [CLKID_FCLK_DIV2] = &g12a_fclk_div2.hw, 4879 [CLKID_FCLK_DIV3] = &g12a_fclk_div3.hw, 4880 [CLKID_FCLK_DIV4] = &g12a_fclk_div4.hw, 4881 [CLKID_FCLK_DIV5] = &g12a_fclk_div5.hw, 4882 [CLKID_FCLK_DIV7] = &g12a_fclk_div7.hw, 4883 [CLKID_FCLK_DIV2P5] = &g12a_fclk_div2p5.hw, 4884 [CLKID_GP0_PLL] = &g12a_gp0_pll.hw, 4885 [CLKID_MPEG_SEL] = &g12a_mpeg_clk_sel.hw, 4886 [CLKID_MPEG_DIV] = &g12a_mpeg_clk_div.hw, 4887 [CLKID_CLK81] = &g12a_clk81.hw, 4888 [CLKID_MPLL0] = &g12a_mpll0.hw, 4889 [CLKID_MPLL1] = &g12a_mpll1.hw, 4890 [CLKID_MPLL2] = &g12a_mpll2.hw, 4891 [CLKID_MPLL3] = &g12a_mpll3.hw, 4892 [CLKID_DDR] = &g12a_ddr.hw, 4893 [CLKID_DOS] = &g12a_dos.hw, 4894 [CLKID_AUDIO_LOCKER] = &g12a_audio_locker.hw, 4895 [CLKID_MIPI_DSI_HOST] = &g12a_mipi_dsi_host.hw, 4896 [CLKID_ETH_PHY] = &g12a_eth_phy.hw, 4897 [CLKID_ISA] = &g12a_isa.hw, 4898 [CLKID_PL301] = &g12a_pl301.hw, 4899 [CLKID_PERIPHS] = &g12a_periphs.hw, 4900 [CLKID_SPICC0] = &g12a_spicc_0.hw, 4901 [CLKID_I2C] = &g12a_i2c.hw, 4902 [CLKID_SANA] = &g12a_sana.hw, 4903 [CLKID_SD] = &g12a_sd.hw, 4904 [CLKID_RNG0] = &g12a_rng0.hw, 4905 [CLKID_UART0] = &g12a_uart0.hw, 4906 [CLKID_SPICC1] = &g12a_spicc_1.hw, 4907 [CLKID_HIU_IFACE] = &g12a_hiu_reg.hw, 4908 [CLKID_MIPI_DSI_PHY] = &g12a_mipi_dsi_phy.hw, 4909 [CLKID_ASSIST_MISC] = &g12a_assist_misc.hw, 4910 [CLKID_SD_EMMC_A] = &g12a_emmc_a.hw, 4911 [CLKID_SD_EMMC_B] = &g12a_emmc_b.hw, 4912 [CLKID_SD_EMMC_C] = &g12a_emmc_c.hw, 4913 [CLKID_AUDIO_CODEC] = &g12a_audio_codec.hw, 4914 [CLKID_AUDIO] = &g12a_audio.hw, 4915 [CLKID_ETH] = &g12a_eth_core.hw, 4916 [CLKID_DEMUX] = &g12a_demux.hw, 4917 [CLKID_AUDIO_IFIFO] = &g12a_audio_ififo.hw, 4918 [CLKID_ADC] = &g12a_adc.hw, 4919 [CLKID_UART1] = &g12a_uart1.hw, 4920 [CLKID_G2D] = &g12a_g2d.hw, 4921 [CLKID_RESET] = &g12a_reset.hw, 4922 [CLKID_PCIE_COMB] = &g12a_pcie_comb.hw, 4923 [CLKID_PARSER] = &g12a_parser.hw, 4924 [CLKID_USB] = &g12a_usb_general.hw, 4925 [CLKID_PCIE_PHY] = &g12a_pcie_phy.hw, 4926 [CLKID_AHB_ARB0] = &g12a_ahb_arb0.hw, 4927 [CLKID_AHB_DATA_BUS] = &g12a_ahb_data_bus.hw, 4928 [CLKID_AHB_CTRL_BUS] = &g12a_ahb_ctrl_bus.hw, 4929 [CLKID_HTX_HDCP22] = &g12a_htx_hdcp22.hw, 4930 [CLKID_HTX_PCLK] = &g12a_htx_pclk.hw, 4931 [CLKID_BT656] = &g12a_bt656.hw, 4932 [CLKID_USB1_DDR_BRIDGE] = &g12a_usb1_to_ddr.hw, 4933 [CLKID_MMC_PCLK] = &g12a_mmc_pclk.hw, 4934 [CLKID_UART2] = &g12a_uart2.hw, 4935 [CLKID_VPU_INTR] = &g12a_vpu_intr.hw, 4936 [CLKID_GIC] = &g12a_gic.hw, 4937 [CLKID_SD_EMMC_A_CLK0_SEL] = &g12a_sd_emmc_a_clk0_sel.hw, 4938 [CLKID_SD_EMMC_A_CLK0_DIV] = &g12a_sd_emmc_a_clk0_div.hw, 4939 [CLKID_SD_EMMC_A_CLK0] = &g12a_sd_emmc_a_clk0.hw, 4940 [CLKID_SD_EMMC_B_CLK0_SEL] = &g12a_sd_emmc_b_clk0_sel.hw, 4941 [CLKID_SD_EMMC_B_CLK0_DIV] = &g12a_sd_emmc_b_clk0_div.hw, 4942 [CLKID_SD_EMMC_B_CLK0] = &g12a_sd_emmc_b_clk0.hw, 4943 [CLKID_SD_EMMC_C_CLK0_SEL] = &g12a_sd_emmc_c_clk0_sel.hw, 4944 [CLKID_SD_EMMC_C_CLK0_DIV] = &g12a_sd_emmc_c_clk0_div.hw, 4945 [CLKID_SD_EMMC_C_CLK0] = &g12a_sd_emmc_c_clk0.hw, 4946 [CLKID_MPLL0_DIV] = &g12a_mpll0_div.hw, 4947 [CLKID_MPLL1_DIV] = &g12a_mpll1_div.hw, 4948 [CLKID_MPLL2_DIV] = &g12a_mpll2_div.hw, 4949 [CLKID_MPLL3_DIV] = &g12a_mpll3_div.hw, 4950 [CLKID_FCLK_DIV2_DIV] = &g12a_fclk_div2_div.hw, 4951 [CLKID_FCLK_DIV3_DIV] = &g12a_fclk_div3_div.hw, 4952 [CLKID_FCLK_DIV4_DIV] = &g12a_fclk_div4_div.hw, 4953 [CLKID_FCLK_DIV5_DIV] = &g12a_fclk_div5_div.hw, 4954 [CLKID_FCLK_DIV7_DIV] = &g12a_fclk_div7_div.hw, 4955 [CLKID_FCLK_DIV2P5_DIV] = &g12a_fclk_div2p5_div.hw, 4956 [CLKID_HIFI_PLL] = &g12a_hifi_pll.hw, 4957 [CLKID_VCLK2_VENCI0] = &g12a_vclk2_venci0.hw, 4958 [CLKID_VCLK2_VENCI1] = &g12a_vclk2_venci1.hw, 4959 [CLKID_VCLK2_VENCP0] = &g12a_vclk2_vencp0.hw, 4960 [CLKID_VCLK2_VENCP1] = &g12a_vclk2_vencp1.hw, 4961 [CLKID_VCLK2_VENCT0] = &g12a_vclk2_venct0.hw, 4962 [CLKID_VCLK2_VENCT1] = &g12a_vclk2_venct1.hw, 4963 [CLKID_VCLK2_OTHER] = &g12a_vclk2_other.hw, 4964 [CLKID_VCLK2_ENCI] = &g12a_vclk2_enci.hw, 4965 [CLKID_VCLK2_ENCP] = &g12a_vclk2_encp.hw, 4966 [CLKID_DAC_CLK] = &g12a_dac_clk.hw, 4967 [CLKID_AOCLK] = &g12a_aoclk_gate.hw, 4968 [CLKID_IEC958] = &g12a_iec958_gate.hw, 4969 [CLKID_ENC480P] = &g12a_enc480p.hw, 4970 [CLKID_RNG1] = &g12a_rng1.hw, 4971 [CLKID_VCLK2_ENCT] = &g12a_vclk2_enct.hw, 4972 [CLKID_VCLK2_ENCL] = &g12a_vclk2_encl.hw, 4973 [CLKID_VCLK2_VENCLMMC] = &g12a_vclk2_venclmmc.hw, 4974 [CLKID_VCLK2_VENCL] = &g12a_vclk2_vencl.hw, 4975 [CLKID_VCLK2_OTHER1] = &g12a_vclk2_other1.hw, 4976 [CLKID_FIXED_PLL_DCO] = &g12a_fixed_pll_dco.hw, 4977 [CLKID_SYS_PLL_DCO] = &g12a_sys_pll_dco.hw, 4978 [CLKID_GP0_PLL_DCO] = &g12a_gp0_pll_dco.hw, 4979 [CLKID_HIFI_PLL_DCO] = &g12a_hifi_pll_dco.hw, 4980 [CLKID_DMA] = &g12a_dma.hw, 4981 [CLKID_EFUSE] = &g12a_efuse.hw, 4982 [CLKID_ROM_BOOT] = &g12a_rom_boot.hw, 4983 [CLKID_RESET_SEC] = &g12a_reset_sec.hw, 4984 [CLKID_SEC_AHB_APB3] = &g12a_sec_ahb_apb3.hw, 4985 [CLKID_MPLL_PREDIV] = &g12a_mpll_prediv.hw, 4986 [CLKID_VPU_0_SEL] = &g12a_vpu_0_sel.hw, 4987 [CLKID_VPU_0_DIV] = &g12a_vpu_0_div.hw, 4988 [CLKID_VPU_0] = &g12a_vpu_0.hw, 4989 [CLKID_VPU_1_SEL] = &g12a_vpu_1_sel.hw, 4990 [CLKID_VPU_1_DIV] = &g12a_vpu_1_div.hw, 4991 [CLKID_VPU_1] = &g12a_vpu_1.hw, 4992 [CLKID_VPU] = &g12a_vpu.hw, 4993 [CLKID_VAPB_0_SEL] = &g12a_vapb_0_sel.hw, 4994 [CLKID_VAPB_0_DIV] = &g12a_vapb_0_div.hw, 4995 [CLKID_VAPB_0] = &g12a_vapb_0.hw, 4996 [CLKID_VAPB_1_SEL] = &g12a_vapb_1_sel.hw, 4997 [CLKID_VAPB_1_DIV] = &g12a_vapb_1_div.hw, 4998 [CLKID_VAPB_1] = &g12a_vapb_1.hw, 4999 [CLKID_VAPB_SEL] = &g12a_vapb_sel.hw, 5000 [CLKID_VAPB] = &g12a_vapb.hw, 5001 [CLKID_HDMI_PLL_DCO] = &g12a_hdmi_pll_dco.hw, 5002 [CLKID_HDMI_PLL_OD] = &g12a_hdmi_pll_od.hw, 5003 [CLKID_HDMI_PLL_OD2] = &g12a_hdmi_pll_od2.hw, 5004 [CLKID_HDMI_PLL] = &g12a_hdmi_pll.hw, 5005 [CLKID_VID_PLL] = &g12a_vid_pll_div.hw, 5006 [CLKID_VID_PLL_SEL] = &g12a_vid_pll_sel.hw, 5007 [CLKID_VID_PLL_DIV] = &g12a_vid_pll.hw, 5008 [CLKID_VCLK_SEL] = &g12a_vclk_sel.hw, 5009 [CLKID_VCLK2_SEL] = &g12a_vclk2_sel.hw, 5010 [CLKID_VCLK_INPUT] = &g12a_vclk_input.hw, 5011 [CLKID_VCLK2_INPUT] = &g12a_vclk2_input.hw, 5012 [CLKID_VCLK_DIV] = &g12a_vclk_div.hw, 5013 [CLKID_VCLK2_DIV] = &g12a_vclk2_div.hw, 5014 [CLKID_VCLK] = &g12a_vclk.hw, 5015 [CLKID_VCLK2] = &g12a_vclk2.hw, 5016 [CLKID_VCLK_DIV1] = &g12a_vclk_div1.hw, 5017 [CLKID_VCLK_DIV2_EN] = &g12a_vclk_div2_en.hw, 5018 [CLKID_VCLK_DIV4_EN] = &g12a_vclk_div4_en.hw, 5019 [CLKID_VCLK_DIV6_EN] = &g12a_vclk_div6_en.hw, 5020 [CLKID_VCLK_DIV12_EN] = &g12a_vclk_div12_en.hw, 5021 [CLKID_VCLK2_DIV1] = &g12a_vclk2_div1.hw, 5022 [CLKID_VCLK2_DIV2_EN] = &g12a_vclk2_div2_en.hw, 5023 [CLKID_VCLK2_DIV4_EN] = &g12a_vclk2_div4_en.hw, 5024 [CLKID_VCLK2_DIV6_EN] = &g12a_vclk2_div6_en.hw, 5025 [CLKID_VCLK2_DIV12_EN] = &g12a_vclk2_div12_en.hw, 5026 [CLKID_VCLK_DIV2] = &g12a_vclk_div2.hw, 5027 [CLKID_VCLK_DIV4] = &g12a_vclk_div4.hw, 5028 [CLKID_VCLK_DIV6] = &g12a_vclk_div6.hw, 5029 [CLKID_VCLK_DIV12] = &g12a_vclk_div12.hw, 5030 [CLKID_VCLK2_DIV2] = &g12a_vclk2_div2.hw, 5031 [CLKID_VCLK2_DIV4] = &g12a_vclk2_div4.hw, 5032 [CLKID_VCLK2_DIV6] = &g12a_vclk2_div6.hw, 5033 [CLKID_VCLK2_DIV12] = &g12a_vclk2_div12.hw, 5034 [CLKID_CTS_ENCI_SEL] = &g12a_cts_enci_sel.hw, 5035 [CLKID_CTS_ENCP_SEL] = &g12a_cts_encp_sel.hw, 5036 [CLKID_CTS_ENCL_SEL] = &g12a_cts_encl_sel.hw, 5037 [CLKID_CTS_VDAC_SEL] = &g12a_cts_vdac_sel.hw, 5038 [CLKID_HDMI_TX_SEL] = &g12a_hdmi_tx_sel.hw, 5039 [CLKID_CTS_ENCI] = &g12a_cts_enci.hw, 5040 [CLKID_CTS_ENCP] = &g12a_cts_encp.hw, 5041 [CLKID_CTS_ENCL] = &g12a_cts_encl.hw, 5042 [CLKID_CTS_VDAC] = &g12a_cts_vdac.hw, 5043 [CLKID_HDMI_TX] = &g12a_hdmi_tx.hw, 5044 [CLKID_HDMI_SEL] = &g12a_hdmi_sel.hw, 5045 [CLKID_HDMI_DIV] = &g12a_hdmi_div.hw, 5046 [CLKID_HDMI] = &g12a_hdmi.hw, 5047 [CLKID_MALI_0_SEL] = &g12a_mali_0_sel.hw, 5048 [CLKID_MALI_0_DIV] = &g12a_mali_0_div.hw, 5049 [CLKID_MALI_0] = &g12a_mali_0.hw, 5050 [CLKID_MALI_1_SEL] = &g12a_mali_1_sel.hw, 5051 [CLKID_MALI_1_DIV] = &g12a_mali_1_div.hw, 5052 [CLKID_MALI_1] = &g12a_mali_1.hw, 5053 [CLKID_MALI] = &g12a_mali.hw, 5054 [CLKID_MPLL_50M_DIV] = &g12a_mpll_50m_div.hw, 5055 [CLKID_MPLL_50M] = &g12a_mpll_50m.hw, 5056 [CLKID_SYS_PLL_DIV16_EN] = &g12a_sys_pll_div16_en.hw, 5057 [CLKID_SYS_PLL_DIV16] = &g12a_sys_pll_div16.hw, 5058 [CLKID_CPU_CLK_DYN0_SEL] = &g12a_cpu_clk_premux0.hw, 5059 [CLKID_CPU_CLK_DYN0_DIV] = &g12a_cpu_clk_mux0_div.hw, 5060 [CLKID_CPU_CLK_DYN0] = &g12a_cpu_clk_postmux0.hw, 5061 [CLKID_CPU_CLK_DYN1_SEL] = &g12a_cpu_clk_premux1.hw, 5062 [CLKID_CPU_CLK_DYN1_DIV] = &g12a_cpu_clk_mux1_div.hw, 5063 [CLKID_CPU_CLK_DYN1] = &g12a_cpu_clk_postmux1.hw, 5064 [CLKID_CPU_CLK_DYN] = &g12a_cpu_clk_dyn.hw, 5065 [CLKID_CPU_CLK] = &g12a_cpu_clk.hw, 5066 [CLKID_CPU_CLK_DIV16_EN] = &g12a_cpu_clk_div16_en.hw, 5067 [CLKID_CPU_CLK_DIV16] = &g12a_cpu_clk_div16.hw, 5068 [CLKID_CPU_CLK_APB_DIV] = &g12a_cpu_clk_apb_div.hw, 5069 [CLKID_CPU_CLK_APB] = &g12a_cpu_clk_apb.hw, 5070 [CLKID_CPU_CLK_ATB_DIV] = &g12a_cpu_clk_atb_div.hw, 5071 [CLKID_CPU_CLK_ATB] = &g12a_cpu_clk_atb.hw, 5072 [CLKID_CPU_CLK_AXI_DIV] = &g12a_cpu_clk_axi_div.hw, 5073 [CLKID_CPU_CLK_AXI] = &g12a_cpu_clk_axi.hw, 5074 [CLKID_CPU_CLK_TRACE_DIV] = &g12a_cpu_clk_trace_div.hw, 5075 [CLKID_CPU_CLK_TRACE] = &g12a_cpu_clk_trace.hw, 5076 [CLKID_PCIE_PLL_DCO] = &g12a_pcie_pll_dco.hw, 5077 [CLKID_PCIE_PLL_DCO_DIV2] = &g12a_pcie_pll_dco_div2.hw, 5078 [CLKID_PCIE_PLL_OD] = &g12a_pcie_pll_od.hw, 5079 [CLKID_PCIE_PLL] = &g12a_pcie_pll.hw, 5080 [CLKID_VDEC_1_SEL] = &g12a_vdec_1_sel.hw, 5081 [CLKID_VDEC_1_DIV] = &g12a_vdec_1_div.hw, 5082 [CLKID_VDEC_1] = &g12a_vdec_1.hw, 5083 [CLKID_VDEC_HEVC_SEL] = &g12a_vdec_hevc_sel.hw, 5084 [CLKID_VDEC_HEVC_DIV] = &g12a_vdec_hevc_div.hw, 5085 [CLKID_VDEC_HEVC] = &g12a_vdec_hevc.hw, 5086 [CLKID_VDEC_HEVCF_SEL] = &g12a_vdec_hevcf_sel.hw, 5087 [CLKID_VDEC_HEVCF_DIV] = &g12a_vdec_hevcf_div.hw, 5088 [CLKID_VDEC_HEVCF] = &g12a_vdec_hevcf.hw, 5089 [CLKID_TS_DIV] = &g12a_ts_div.hw, 5090 [CLKID_TS] = &g12a_ts.hw, 5091 [CLKID_GP1_PLL_DCO] = &sm1_gp1_pll_dco.hw, 5092 [CLKID_GP1_PLL] = &sm1_gp1_pll.hw, 5093 [CLKID_DSU_CLK_DYN0_SEL] = &sm1_dsu_clk_premux0.hw, 5094 [CLKID_DSU_CLK_DYN0_DIV] = &sm1_dsu_clk_premux1.hw, 5095 [CLKID_DSU_CLK_DYN0] = &sm1_dsu_clk_mux0_div.hw, 5096 [CLKID_DSU_CLK_DYN1_SEL] = &sm1_dsu_clk_postmux0.hw, 5097 [CLKID_DSU_CLK_DYN1_DIV] = &sm1_dsu_clk_mux1_div.hw, 5098 [CLKID_DSU_CLK_DYN1] = &sm1_dsu_clk_postmux1.hw, 5099 [CLKID_DSU_CLK_DYN] = &sm1_dsu_clk_dyn.hw, 5100 [CLKID_DSU_CLK_FINAL] = &sm1_dsu_final_clk.hw, 5101 [CLKID_DSU_CLK] = &sm1_dsu_clk.hw, 5102 [CLKID_CPU1_CLK] = &sm1_cpu1_clk.hw, 5103 [CLKID_CPU2_CLK] = &sm1_cpu2_clk.hw, 5104 [CLKID_CPU3_CLK] = &sm1_cpu3_clk.hw, 5105 [CLKID_SPICC0_SCLK_SEL] = &g12a_spicc0_sclk_sel.hw, 5106 [CLKID_SPICC0_SCLK_DIV] = &g12a_spicc0_sclk_div.hw, 5107 [CLKID_SPICC0_SCLK] = &g12a_spicc0_sclk.hw, 5108 [CLKID_SPICC1_SCLK_SEL] = &g12a_spicc1_sclk_sel.hw, 5109 [CLKID_SPICC1_SCLK_DIV] = &g12a_spicc1_sclk_div.hw, 5110 [CLKID_SPICC1_SCLK] = &g12a_spicc1_sclk.hw, 5111 [CLKID_NNA_AXI_CLK_SEL] = &sm1_nna_axi_clk_sel.hw, 5112 [CLKID_NNA_AXI_CLK_DIV] = &sm1_nna_axi_clk_div.hw, 5113 [CLKID_NNA_AXI_CLK] = &sm1_nna_axi_clk.hw, 5114 [CLKID_NNA_CORE_CLK_SEL] = &sm1_nna_core_clk_sel.hw, 5115 [CLKID_NNA_CORE_CLK_DIV] = &sm1_nna_core_clk_div.hw, 5116 [CLKID_NNA_CORE_CLK] = &sm1_nna_core_clk.hw, 5117 [CLKID_MIPI_DSI_PXCLK_SEL] = &g12a_mipi_dsi_pxclk_sel.hw, 5118 [CLKID_MIPI_DSI_PXCLK_DIV] = &g12a_mipi_dsi_pxclk_div.hw, 5119 [CLKID_MIPI_DSI_PXCLK] = &g12a_mipi_dsi_pxclk.hw, 5120 }; 5121 5122 /* Convenience table to populate regmap in .probe */ 5123 static struct clk_regmap *const g12a_clk_regmaps[] = { 5124 &g12a_clk81, 5125 &g12a_dos, 5126 &g12a_ddr, 5127 &g12a_audio_locker, 5128 &g12a_mipi_dsi_host, 5129 &g12a_eth_phy, 5130 &g12a_isa, 5131 &g12a_pl301, 5132 &g12a_periphs, 5133 &g12a_spicc_0, 5134 &g12a_i2c, 5135 &g12a_sana, 5136 &g12a_sd, 5137 &g12a_rng0, 5138 &g12a_uart0, 5139 &g12a_spicc_1, 5140 &g12a_hiu_reg, 5141 &g12a_mipi_dsi_phy, 5142 &g12a_assist_misc, 5143 &g12a_emmc_a, 5144 &g12a_emmc_b, 5145 &g12a_emmc_c, 5146 &g12a_audio_codec, 5147 &g12a_audio, 5148 &g12a_eth_core, 5149 &g12a_demux, 5150 &g12a_audio_ififo, 5151 &g12a_adc, 5152 &g12a_uart1, 5153 &g12a_g2d, 5154 &g12a_reset, 5155 &g12a_pcie_comb, 5156 &g12a_parser, 5157 &g12a_usb_general, 5158 &g12a_pcie_phy, 5159 &g12a_ahb_arb0, 5160 &g12a_ahb_data_bus, 5161 &g12a_ahb_ctrl_bus, 5162 &g12a_htx_hdcp22, 5163 &g12a_htx_pclk, 5164 &g12a_bt656, 5165 &g12a_usb1_to_ddr, 5166 &g12a_mmc_pclk, 5167 &g12a_uart2, 5168 &g12a_vpu_intr, 5169 &g12a_gic, 5170 &g12a_sd_emmc_a_clk0, 5171 &g12a_sd_emmc_b_clk0, 5172 &g12a_sd_emmc_c_clk0, 5173 &g12a_mpeg_clk_div, 5174 &g12a_sd_emmc_a_clk0_div, 5175 &g12a_sd_emmc_b_clk0_div, 5176 &g12a_sd_emmc_c_clk0_div, 5177 &g12a_mpeg_clk_sel, 5178 &g12a_sd_emmc_a_clk0_sel, 5179 &g12a_sd_emmc_b_clk0_sel, 5180 &g12a_sd_emmc_c_clk0_sel, 5181 &g12a_mpll0, 5182 &g12a_mpll1, 5183 &g12a_mpll2, 5184 &g12a_mpll3, 5185 &g12a_mpll0_div, 5186 &g12a_mpll1_div, 5187 &g12a_mpll2_div, 5188 &g12a_mpll3_div, 5189 &g12a_fixed_pll, 5190 &g12a_sys_pll, 5191 &g12a_gp0_pll, 5192 &g12a_hifi_pll, 5193 &g12a_vclk2_venci0, 5194 &g12a_vclk2_venci1, 5195 &g12a_vclk2_vencp0, 5196 &g12a_vclk2_vencp1, 5197 &g12a_vclk2_venct0, 5198 &g12a_vclk2_venct1, 5199 &g12a_vclk2_other, 5200 &g12a_vclk2_enci, 5201 &g12a_vclk2_encp, 5202 &g12a_dac_clk, 5203 &g12a_aoclk_gate, 5204 &g12a_iec958_gate, 5205 &g12a_enc480p, 5206 &g12a_rng1, 5207 &g12a_vclk2_enct, 5208 &g12a_vclk2_encl, 5209 &g12a_vclk2_venclmmc, 5210 &g12a_vclk2_vencl, 5211 &g12a_vclk2_other1, 5212 &g12a_fixed_pll_dco, 5213 &g12a_sys_pll_dco, 5214 &g12a_gp0_pll_dco, 5215 &g12a_hifi_pll_dco, 5216 &g12a_fclk_div2, 5217 &g12a_fclk_div3, 5218 &g12a_fclk_div4, 5219 &g12a_fclk_div5, 5220 &g12a_fclk_div7, 5221 &g12a_fclk_div2p5, 5222 &g12a_dma, 5223 &g12a_efuse, 5224 &g12a_rom_boot, 5225 &g12a_reset_sec, 5226 &g12a_sec_ahb_apb3, 5227 &g12a_vpu_0_sel, 5228 &g12a_vpu_0_div, 5229 &g12a_vpu_0, 5230 &g12a_vpu_1_sel, 5231 &g12a_vpu_1_div, 5232 &g12a_vpu_1, 5233 &g12a_vpu, 5234 &g12a_vapb_0_sel, 5235 &g12a_vapb_0_div, 5236 &g12a_vapb_0, 5237 &g12a_vapb_1_sel, 5238 &g12a_vapb_1_div, 5239 &g12a_vapb_1, 5240 &g12a_vapb_sel, 5241 &g12a_vapb, 5242 &g12a_hdmi_pll_dco, 5243 &g12a_hdmi_pll_od, 5244 &g12a_hdmi_pll_od2, 5245 &g12a_hdmi_pll, 5246 &g12a_vid_pll_div, 5247 &g12a_vid_pll_sel, 5248 &g12a_vid_pll, 5249 &g12a_vclk_sel, 5250 &g12a_vclk2_sel, 5251 &g12a_vclk_input, 5252 &g12a_vclk2_input, 5253 &g12a_vclk_div, 5254 &g12a_vclk2_div, 5255 &g12a_vclk, 5256 &g12a_vclk2, 5257 &g12a_vclk_div1, 5258 &g12a_vclk_div2_en, 5259 &g12a_vclk_div4_en, 5260 &g12a_vclk_div6_en, 5261 &g12a_vclk_div12_en, 5262 &g12a_vclk2_div1, 5263 &g12a_vclk2_div2_en, 5264 &g12a_vclk2_div4_en, 5265 &g12a_vclk2_div6_en, 5266 &g12a_vclk2_div12_en, 5267 &g12a_cts_enci_sel, 5268 &g12a_cts_encp_sel, 5269 &g12a_cts_encl_sel, 5270 &g12a_cts_vdac_sel, 5271 &g12a_hdmi_tx_sel, 5272 &g12a_cts_enci, 5273 &g12a_cts_encp, 5274 &g12a_cts_encl, 5275 &g12a_cts_vdac, 5276 &g12a_hdmi_tx, 5277 &g12a_hdmi_sel, 5278 &g12a_hdmi_div, 5279 &g12a_hdmi, 5280 &g12a_mali_0_sel, 5281 &g12a_mali_0_div, 5282 &g12a_mali_0, 5283 &g12a_mali_1_sel, 5284 &g12a_mali_1_div, 5285 &g12a_mali_1, 5286 &g12a_mali, 5287 &g12a_mpll_50m, 5288 &g12a_sys_pll_div16_en, 5289 &g12a_cpu_clk_premux0, 5290 &g12a_cpu_clk_mux0_div, 5291 &g12a_cpu_clk_postmux0, 5292 &g12a_cpu_clk_premux1, 5293 &g12a_cpu_clk_mux1_div, 5294 &g12a_cpu_clk_postmux1, 5295 &g12a_cpu_clk_dyn, 5296 &g12a_cpu_clk, 5297 &g12a_cpu_clk_div16_en, 5298 &g12a_cpu_clk_apb_div, 5299 &g12a_cpu_clk_apb, 5300 &g12a_cpu_clk_atb_div, 5301 &g12a_cpu_clk_atb, 5302 &g12a_cpu_clk_axi_div, 5303 &g12a_cpu_clk_axi, 5304 &g12a_cpu_clk_trace_div, 5305 &g12a_cpu_clk_trace, 5306 &g12a_pcie_pll_od, 5307 &g12a_pcie_pll_dco, 5308 &g12a_vdec_1_sel, 5309 &g12a_vdec_1_div, 5310 &g12a_vdec_1, 5311 &g12a_vdec_hevc_sel, 5312 &g12a_vdec_hevc_div, 5313 &g12a_vdec_hevc, 5314 &g12a_vdec_hevcf_sel, 5315 &g12a_vdec_hevcf_div, 5316 &g12a_vdec_hevcf, 5317 &g12a_ts_div, 5318 &g12a_ts, 5319 &g12b_cpu_clk, 5320 &g12b_sys1_pll_dco, 5321 &g12b_sys1_pll, 5322 &g12b_sys1_pll_div16_en, 5323 &g12b_cpub_clk_premux0, 5324 &g12b_cpub_clk_mux0_div, 5325 &g12b_cpub_clk_postmux0, 5326 &g12b_cpub_clk_premux1, 5327 &g12b_cpub_clk_mux1_div, 5328 &g12b_cpub_clk_postmux1, 5329 &g12b_cpub_clk_dyn, 5330 &g12b_cpub_clk, 5331 &g12b_cpub_clk_div16_en, 5332 &g12b_cpub_clk_apb_sel, 5333 &g12b_cpub_clk_apb, 5334 &g12b_cpub_clk_atb_sel, 5335 &g12b_cpub_clk_atb, 5336 &g12b_cpub_clk_axi_sel, 5337 &g12b_cpub_clk_axi, 5338 &g12b_cpub_clk_trace_sel, 5339 &g12b_cpub_clk_trace, 5340 &sm1_gp1_pll_dco, 5341 &sm1_gp1_pll, 5342 &sm1_dsu_clk_premux0, 5343 &sm1_dsu_clk_premux1, 5344 &sm1_dsu_clk_mux0_div, 5345 &sm1_dsu_clk_postmux0, 5346 &sm1_dsu_clk_mux1_div, 5347 &sm1_dsu_clk_postmux1, 5348 &sm1_dsu_clk_dyn, 5349 &sm1_dsu_final_clk, 5350 &sm1_dsu_clk, 5351 &sm1_cpu1_clk, 5352 &sm1_cpu2_clk, 5353 &sm1_cpu3_clk, 5354 &g12a_spicc0_sclk_sel, 5355 &g12a_spicc0_sclk_div, 5356 &g12a_spicc0_sclk, 5357 &g12a_spicc1_sclk_sel, 5358 &g12a_spicc1_sclk_div, 5359 &g12a_spicc1_sclk, 5360 &sm1_nna_axi_clk_sel, 5361 &sm1_nna_axi_clk_div, 5362 &sm1_nna_axi_clk, 5363 &sm1_nna_core_clk_sel, 5364 &sm1_nna_core_clk_div, 5365 &sm1_nna_core_clk, 5366 &g12a_mipi_dsi_pxclk_sel, 5367 &g12a_mipi_dsi_pxclk_div, 5368 &g12a_mipi_dsi_pxclk, 5369 &g12b_mipi_isp_sel, 5370 &g12b_mipi_isp_div, 5371 &g12b_mipi_isp, 5372 &g12b_mipi_isp_gate, 5373 &g12b_csi_phy1, 5374 &g12b_csi_phy0, 5375 }; 5376 5377 static const struct reg_sequence g12a_init_regs[] = { 5378 { .reg = HHI_MPLL_CNTL0, .def = 0x00000543 }, 5379 }; 5380 5381 #define DVFS_CON_ID "dvfs" 5382 5383 static int meson_g12a_dvfs_setup_common(struct device *dev, 5384 struct clk_hw **hws) 5385 { 5386 struct clk *notifier_clk; 5387 struct clk_hw *xtal; 5388 int ret; 5389 5390 xtal = clk_hw_get_parent_by_index(hws[CLKID_CPU_CLK_DYN1_SEL], 0); 5391 5392 /* Setup clock notifier for cpu_clk_postmux0 */ 5393 g12a_cpu_clk_postmux0_nb_data.xtal = xtal; 5394 notifier_clk = devm_clk_hw_get_clk(dev, &g12a_cpu_clk_postmux0.hw, 5395 DVFS_CON_ID); 5396 ret = devm_clk_notifier_register(dev, notifier_clk, 5397 &g12a_cpu_clk_postmux0_nb_data.nb); 5398 if (ret) { 5399 dev_err(dev, "failed to register the cpu_clk_postmux0 notifier\n"); 5400 return ret; 5401 } 5402 5403 /* Setup clock notifier for cpu_clk_dyn mux */ 5404 notifier_clk = devm_clk_hw_get_clk(dev, &g12a_cpu_clk_dyn.hw, 5405 DVFS_CON_ID); 5406 ret = devm_clk_notifier_register(dev, notifier_clk, 5407 &g12a_cpu_clk_mux_nb); 5408 if (ret) { 5409 dev_err(dev, "failed to register the cpu_clk_dyn notifier\n"); 5410 return ret; 5411 } 5412 5413 return 0; 5414 } 5415 5416 static int meson_g12b_dvfs_setup(struct platform_device *pdev) 5417 { 5418 struct clk_hw **hws = g12b_hw_clks; 5419 struct device *dev = &pdev->dev; 5420 struct clk *notifier_clk; 5421 struct clk_hw *xtal; 5422 int ret; 5423 5424 ret = meson_g12a_dvfs_setup_common(dev, hws); 5425 if (ret) 5426 return ret; 5427 5428 xtal = clk_hw_get_parent_by_index(hws[CLKID_CPU_CLK_DYN1_SEL], 0); 5429 5430 /* Setup clock notifier for cpu_clk mux */ 5431 notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpu_clk.hw, 5432 DVFS_CON_ID); 5433 ret = devm_clk_notifier_register(dev, notifier_clk, 5434 &g12a_cpu_clk_mux_nb); 5435 if (ret) { 5436 dev_err(dev, "failed to register the cpu_clk notifier\n"); 5437 return ret; 5438 } 5439 5440 /* Setup clock notifier for sys1_pll */ 5441 notifier_clk = devm_clk_hw_get_clk(dev, &g12b_sys1_pll.hw, 5442 DVFS_CON_ID); 5443 ret = devm_clk_notifier_register(dev, notifier_clk, 5444 &g12b_cpu_clk_sys1_pll_nb_data.nb); 5445 if (ret) { 5446 dev_err(dev, "failed to register the sys1_pll notifier\n"); 5447 return ret; 5448 } 5449 5450 /* Add notifiers for the second CPU cluster */ 5451 5452 /* Setup clock notifier for cpub_clk_postmux0 */ 5453 g12b_cpub_clk_postmux0_nb_data.xtal = xtal; 5454 notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpub_clk_postmux0.hw, 5455 DVFS_CON_ID); 5456 ret = devm_clk_notifier_register(dev, notifier_clk, 5457 &g12b_cpub_clk_postmux0_nb_data.nb); 5458 if (ret) { 5459 dev_err(dev, "failed to register the cpub_clk_postmux0 notifier\n"); 5460 return ret; 5461 } 5462 5463 /* Setup clock notifier for cpub_clk_dyn mux */ 5464 notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpub_clk_dyn.hw, "dvfs"); 5465 ret = devm_clk_notifier_register(dev, notifier_clk, 5466 &g12a_cpu_clk_mux_nb); 5467 if (ret) { 5468 dev_err(dev, "failed to register the cpub_clk_dyn notifier\n"); 5469 return ret; 5470 } 5471 5472 /* Setup clock notifier for cpub_clk mux */ 5473 notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpub_clk.hw, DVFS_CON_ID); 5474 ret = devm_clk_notifier_register(dev, notifier_clk, 5475 &g12a_cpu_clk_mux_nb); 5476 if (ret) { 5477 dev_err(dev, "failed to register the cpub_clk notifier\n"); 5478 return ret; 5479 } 5480 5481 /* Setup clock notifier for sys_pll */ 5482 notifier_clk = devm_clk_hw_get_clk(dev, &g12a_sys_pll.hw, DVFS_CON_ID); 5483 ret = devm_clk_notifier_register(dev, notifier_clk, 5484 &g12b_cpub_clk_sys_pll_nb_data.nb); 5485 if (ret) { 5486 dev_err(dev, "failed to register the sys_pll notifier\n"); 5487 return ret; 5488 } 5489 5490 return 0; 5491 } 5492 5493 static int meson_g12a_dvfs_setup(struct platform_device *pdev) 5494 { 5495 struct clk_hw **hws = g12a_hw_clks; 5496 struct device *dev = &pdev->dev; 5497 struct clk *notifier_clk; 5498 int ret; 5499 5500 ret = meson_g12a_dvfs_setup_common(dev, hws); 5501 if (ret) 5502 return ret; 5503 5504 /* Setup clock notifier for cpu_clk mux */ 5505 notifier_clk = devm_clk_hw_get_clk(dev, &g12a_cpu_clk.hw, DVFS_CON_ID); 5506 ret = devm_clk_notifier_register(dev, notifier_clk, 5507 &g12a_cpu_clk_mux_nb); 5508 if (ret) { 5509 dev_err(dev, "failed to register the cpu_clk notifier\n"); 5510 return ret; 5511 } 5512 5513 /* Setup clock notifier for sys_pll */ 5514 notifier_clk = devm_clk_hw_get_clk(dev, &g12a_sys_pll.hw, DVFS_CON_ID); 5515 ret = devm_clk_notifier_register(dev, notifier_clk, 5516 &g12a_sys_pll_nb_data.nb); 5517 if (ret) { 5518 dev_err(dev, "failed to register the sys_pll notifier\n"); 5519 return ret; 5520 } 5521 5522 return 0; 5523 } 5524 5525 struct meson_g12a_data { 5526 const struct meson_eeclkc_data eeclkc_data; 5527 int (*dvfs_setup)(struct platform_device *pdev); 5528 }; 5529 5530 static int meson_g12a_probe(struct platform_device *pdev) 5531 { 5532 const struct meson_eeclkc_data *eeclkc_data; 5533 const struct meson_g12a_data *g12a_data; 5534 int ret; 5535 5536 eeclkc_data = of_device_get_match_data(&pdev->dev); 5537 if (!eeclkc_data) 5538 return -EINVAL; 5539 5540 ret = meson_eeclkc_probe(pdev); 5541 if (ret) 5542 return ret; 5543 5544 g12a_data = container_of(eeclkc_data, struct meson_g12a_data, 5545 eeclkc_data); 5546 5547 if (g12a_data->dvfs_setup) 5548 return g12a_data->dvfs_setup(pdev); 5549 5550 return 0; 5551 } 5552 5553 static const struct meson_g12a_data g12a_clkc_data = { 5554 .eeclkc_data = { 5555 .regmap_clks = g12a_clk_regmaps, 5556 .regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps), 5557 .hw_clks = { 5558 .hws = g12a_hw_clks, 5559 .num = ARRAY_SIZE(g12a_hw_clks), 5560 }, 5561 .init_regs = g12a_init_regs, 5562 .init_count = ARRAY_SIZE(g12a_init_regs), 5563 }, 5564 .dvfs_setup = meson_g12a_dvfs_setup, 5565 }; 5566 5567 static const struct meson_g12a_data g12b_clkc_data = { 5568 .eeclkc_data = { 5569 .regmap_clks = g12a_clk_regmaps, 5570 .regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps), 5571 .hw_clks = { 5572 .hws = g12b_hw_clks, 5573 .num = ARRAY_SIZE(g12b_hw_clks), 5574 }, 5575 }, 5576 .dvfs_setup = meson_g12b_dvfs_setup, 5577 }; 5578 5579 static const struct meson_g12a_data sm1_clkc_data = { 5580 .eeclkc_data = { 5581 .regmap_clks = g12a_clk_regmaps, 5582 .regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps), 5583 .hw_clks = { 5584 .hws = sm1_hw_clks, 5585 .num = ARRAY_SIZE(sm1_hw_clks), 5586 }, 5587 }, 5588 .dvfs_setup = meson_g12a_dvfs_setup, 5589 }; 5590 5591 static const struct of_device_id clkc_match_table[] = { 5592 { 5593 .compatible = "amlogic,g12a-clkc", 5594 .data = &g12a_clkc_data.eeclkc_data 5595 }, 5596 { 5597 .compatible = "amlogic,g12b-clkc", 5598 .data = &g12b_clkc_data.eeclkc_data 5599 }, 5600 { 5601 .compatible = "amlogic,sm1-clkc", 5602 .data = &sm1_clkc_data.eeclkc_data 5603 }, 5604 {} 5605 }; 5606 MODULE_DEVICE_TABLE(of, clkc_match_table); 5607 5608 static struct platform_driver g12a_driver = { 5609 .probe = meson_g12a_probe, 5610 .driver = { 5611 .name = "g12a-clkc", 5612 .of_match_table = clkc_match_table, 5613 }, 5614 }; 5615 module_platform_driver(g12a_driver); 5616 5617 MODULE_DESCRIPTION("Amlogic G12/SM1 Main Clock Controller driver"); 5618 MODULE_LICENSE("GPL"); 5619 MODULE_IMPORT_NS(CLK_MESON); 5620