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