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