1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (c) 2015 Endless Mobile, Inc. 4 * Author: Carlo Caione <carlo@endlessm.com> 5 * 6 * Copyright (c) 2016 BayLibre, Inc. 7 * Michael Turquette <mturquette@baylibre.com> 8 */ 9 10 #include <linux/clk.h> 11 #include <linux/clk-provider.h> 12 #include <linux/init.h> 13 #include <linux/mfd/syscon.h> 14 #include <linux/of_address.h> 15 #include <linux/reset-controller.h> 16 #include <linux/slab.h> 17 #include <linux/regmap.h> 18 19 #include "meson8b.h" 20 #include "clk-regmap.h" 21 #include "meson-clkc-utils.h" 22 #include "clk-pll.h" 23 #include "clk-mpll.h" 24 25 #include <dt-bindings/clock/meson8b-clkc.h> 26 #include <dt-bindings/reset/amlogic,meson8b-clkc-reset.h> 27 28 struct meson8b_clk_reset { 29 struct reset_controller_dev reset; 30 struct regmap *regmap; 31 }; 32 33 static const struct pll_params_table sys_pll_params_table[] = { 34 PLL_PARAMS(50, 1), 35 PLL_PARAMS(51, 1), 36 PLL_PARAMS(52, 1), 37 PLL_PARAMS(53, 1), 38 PLL_PARAMS(54, 1), 39 PLL_PARAMS(55, 1), 40 PLL_PARAMS(56, 1), 41 PLL_PARAMS(57, 1), 42 PLL_PARAMS(58, 1), 43 PLL_PARAMS(59, 1), 44 PLL_PARAMS(60, 1), 45 PLL_PARAMS(61, 1), 46 PLL_PARAMS(62, 1), 47 PLL_PARAMS(63, 1), 48 PLL_PARAMS(64, 1), 49 PLL_PARAMS(65, 1), 50 PLL_PARAMS(66, 1), 51 PLL_PARAMS(67, 1), 52 PLL_PARAMS(68, 1), 53 PLL_PARAMS(84, 1), 54 { /* sentinel */ }, 55 }; 56 57 static struct clk_regmap meson8b_fixed_pll_dco = { 58 .data = &(struct meson_clk_pll_data){ 59 .en = { 60 .reg_off = HHI_MPLL_CNTL, 61 .shift = 30, 62 .width = 1, 63 }, 64 .m = { 65 .reg_off = HHI_MPLL_CNTL, 66 .shift = 0, 67 .width = 9, 68 }, 69 .n = { 70 .reg_off = HHI_MPLL_CNTL, 71 .shift = 9, 72 .width = 5, 73 }, 74 .frac = { 75 .reg_off = HHI_MPLL_CNTL2, 76 .shift = 0, 77 .width = 12, 78 }, 79 .l = { 80 .reg_off = HHI_MPLL_CNTL, 81 .shift = 31, 82 .width = 1, 83 }, 84 .rst = { 85 .reg_off = HHI_MPLL_CNTL, 86 .shift = 29, 87 .width = 1, 88 }, 89 }, 90 .hw.init = &(struct clk_init_data){ 91 .name = "fixed_pll_dco", 92 .ops = &meson_clk_pll_ro_ops, 93 .parent_data = &(const struct clk_parent_data) { 94 .fw_name = "xtal", 95 .name = "xtal", 96 .index = -1, 97 }, 98 .num_parents = 1, 99 }, 100 }; 101 102 static struct clk_regmap meson8b_fixed_pll = { 103 .data = &(struct clk_regmap_div_data){ 104 .offset = HHI_MPLL_CNTL, 105 .shift = 16, 106 .width = 2, 107 .flags = CLK_DIVIDER_POWER_OF_TWO, 108 }, 109 .hw.init = &(struct clk_init_data){ 110 .name = "fixed_pll", 111 .ops = &clk_regmap_divider_ro_ops, 112 .parent_hws = (const struct clk_hw *[]) { 113 &meson8b_fixed_pll_dco.hw 114 }, 115 .num_parents = 1, 116 /* 117 * This clock won't ever change at runtime so 118 * CLK_SET_RATE_PARENT is not required 119 */ 120 }, 121 }; 122 123 static struct clk_fixed_factor hdmi_pll_dco_in = { 124 .mult = 2, 125 .div = 1, 126 .hw.init = &(struct clk_init_data){ 127 .name = "hdmi_pll_dco_in", 128 .ops = &clk_fixed_factor_ops, 129 .parent_data = &(const struct clk_parent_data) { 130 .fw_name = "xtal", 131 .index = -1, 132 }, 133 .num_parents = 1, 134 }, 135 }; 136 137 /* 138 * Taken from the vendor driver for the 2970/2975MHz (both only differ in the 139 * FRAC part in HHI_VID_PLL_CNTL2) where these values are identical for Meson8, 140 * Meson8b and Meson8m2. This doubles the input (or output - it's not clear 141 * which one but the result is the same) clock. The vendor driver additionally 142 * has the following comment about: "optimise HPLL VCO 2.97GHz performance". 143 */ 144 static const struct reg_sequence meson8b_hdmi_pll_init_regs[] = { 145 { .reg = HHI_VID_PLL_CNTL2, .def = 0x69c84000 }, 146 { .reg = HHI_VID_PLL_CNTL3, .def = 0x8a46c023 }, 147 { .reg = HHI_VID_PLL_CNTL4, .def = 0x4123b100 }, 148 { .reg = HHI_VID_PLL_CNTL5, .def = 0x00012385 }, 149 { .reg = HHI_VID2_PLL_CNTL2, .def = 0x0430a800 }, 150 }; 151 152 static const struct pll_params_table hdmi_pll_params_table[] = { 153 PLL_PARAMS(40, 1), 154 PLL_PARAMS(42, 1), 155 PLL_PARAMS(44, 1), 156 PLL_PARAMS(45, 1), 157 PLL_PARAMS(49, 1), 158 PLL_PARAMS(52, 1), 159 PLL_PARAMS(54, 1), 160 PLL_PARAMS(56, 1), 161 PLL_PARAMS(59, 1), 162 PLL_PARAMS(60, 1), 163 PLL_PARAMS(61, 1), 164 PLL_PARAMS(62, 1), 165 PLL_PARAMS(64, 1), 166 PLL_PARAMS(66, 1), 167 PLL_PARAMS(68, 1), 168 PLL_PARAMS(71, 1), 169 PLL_PARAMS(82, 1), 170 { /* sentinel */ } 171 }; 172 173 static struct clk_regmap meson8b_hdmi_pll_dco = { 174 .data = &(struct meson_clk_pll_data){ 175 .en = { 176 .reg_off = HHI_VID_PLL_CNTL, 177 .shift = 30, 178 .width = 1, 179 }, 180 .m = { 181 .reg_off = HHI_VID_PLL_CNTL, 182 .shift = 0, 183 .width = 9, 184 }, 185 .n = { 186 .reg_off = HHI_VID_PLL_CNTL, 187 .shift = 10, 188 .width = 5, 189 }, 190 .frac = { 191 .reg_off = HHI_VID_PLL_CNTL2, 192 .shift = 0, 193 .width = 12, 194 }, 195 .l = { 196 .reg_off = HHI_VID_PLL_CNTL, 197 .shift = 31, 198 .width = 1, 199 }, 200 .rst = { 201 .reg_off = HHI_VID_PLL_CNTL, 202 .shift = 29, 203 .width = 1, 204 }, 205 .table = hdmi_pll_params_table, 206 .init_regs = meson8b_hdmi_pll_init_regs, 207 .init_count = ARRAY_SIZE(meson8b_hdmi_pll_init_regs), 208 }, 209 .hw.init = &(struct clk_init_data){ 210 /* sometimes also called "HPLL" or "HPLL PLL" */ 211 .name = "hdmi_pll_dco", 212 .ops = &meson_clk_pll_ops, 213 .parent_hws = (const struct clk_hw *[]) { 214 &hdmi_pll_dco_in.hw 215 }, 216 .num_parents = 1, 217 }, 218 }; 219 220 static struct clk_regmap meson8b_hdmi_pll_lvds_out = { 221 .data = &(struct clk_regmap_div_data){ 222 .offset = HHI_VID_PLL_CNTL, 223 .shift = 16, 224 .width = 2, 225 .flags = CLK_DIVIDER_POWER_OF_TWO, 226 }, 227 .hw.init = &(struct clk_init_data){ 228 .name = "hdmi_pll_lvds_out", 229 .ops = &clk_regmap_divider_ops, 230 .parent_hws = (const struct clk_hw *[]) { 231 &meson8b_hdmi_pll_dco.hw 232 }, 233 .num_parents = 1, 234 .flags = CLK_SET_RATE_PARENT, 235 }, 236 }; 237 238 static struct clk_regmap meson8b_hdmi_pll_hdmi_out = { 239 .data = &(struct clk_regmap_div_data){ 240 .offset = HHI_VID_PLL_CNTL, 241 .shift = 18, 242 .width = 2, 243 .flags = CLK_DIVIDER_POWER_OF_TWO, 244 }, 245 .hw.init = &(struct clk_init_data){ 246 .name = "hdmi_pll_hdmi_out", 247 .ops = &clk_regmap_divider_ops, 248 .parent_hws = (const struct clk_hw *[]) { 249 &meson8b_hdmi_pll_dco.hw 250 }, 251 .num_parents = 1, 252 .flags = CLK_SET_RATE_PARENT, 253 }, 254 }; 255 256 static struct clk_regmap meson8b_sys_pll_dco = { 257 .data = &(struct meson_clk_pll_data){ 258 .en = { 259 .reg_off = HHI_SYS_PLL_CNTL, 260 .shift = 30, 261 .width = 1, 262 }, 263 .m = { 264 .reg_off = HHI_SYS_PLL_CNTL, 265 .shift = 0, 266 .width = 9, 267 }, 268 .n = { 269 .reg_off = HHI_SYS_PLL_CNTL, 270 .shift = 9, 271 .width = 5, 272 }, 273 .l = { 274 .reg_off = HHI_SYS_PLL_CNTL, 275 .shift = 31, 276 .width = 1, 277 }, 278 .rst = { 279 .reg_off = HHI_SYS_PLL_CNTL, 280 .shift = 29, 281 .width = 1, 282 }, 283 .table = sys_pll_params_table, 284 }, 285 .hw.init = &(struct clk_init_data){ 286 .name = "sys_pll_dco", 287 .ops = &meson_clk_pll_ops, 288 .parent_data = &(const struct clk_parent_data) { 289 .fw_name = "xtal", 290 .name = "xtal", 291 .index = -1, 292 }, 293 .num_parents = 1, 294 }, 295 }; 296 297 static struct clk_regmap meson8b_sys_pll = { 298 .data = &(struct clk_regmap_div_data){ 299 .offset = HHI_SYS_PLL_CNTL, 300 .shift = 16, 301 .width = 2, 302 .flags = CLK_DIVIDER_POWER_OF_TWO, 303 }, 304 .hw.init = &(struct clk_init_data){ 305 .name = "sys_pll", 306 .ops = &clk_regmap_divider_ops, 307 .parent_hws = (const struct clk_hw *[]) { 308 &meson8b_sys_pll_dco.hw 309 }, 310 .num_parents = 1, 311 .flags = CLK_SET_RATE_PARENT, 312 }, 313 }; 314 315 static struct clk_fixed_factor meson8b_fclk_div2_div = { 316 .mult = 1, 317 .div = 2, 318 .hw.init = &(struct clk_init_data){ 319 .name = "fclk_div2_div", 320 .ops = &clk_fixed_factor_ops, 321 .parent_hws = (const struct clk_hw *[]) { 322 &meson8b_fixed_pll.hw 323 }, 324 .num_parents = 1, 325 }, 326 }; 327 328 static struct clk_regmap meson8b_fclk_div2 = { 329 .data = &(struct clk_regmap_gate_data){ 330 .offset = HHI_MPLL_CNTL6, 331 .bit_idx = 27, 332 }, 333 .hw.init = &(struct clk_init_data){ 334 .name = "fclk_div2", 335 .ops = &clk_regmap_gate_ops, 336 .parent_hws = (const struct clk_hw *[]) { 337 &meson8b_fclk_div2_div.hw 338 }, 339 .num_parents = 1, 340 }, 341 }; 342 343 static struct clk_fixed_factor meson8b_fclk_div3_div = { 344 .mult = 1, 345 .div = 3, 346 .hw.init = &(struct clk_init_data){ 347 .name = "fclk_div3_div", 348 .ops = &clk_fixed_factor_ops, 349 .parent_hws = (const struct clk_hw *[]) { 350 &meson8b_fixed_pll.hw 351 }, 352 .num_parents = 1, 353 }, 354 }; 355 356 static struct clk_regmap meson8b_fclk_div3 = { 357 .data = &(struct clk_regmap_gate_data){ 358 .offset = HHI_MPLL_CNTL6, 359 .bit_idx = 28, 360 }, 361 .hw.init = &(struct clk_init_data){ 362 .name = "fclk_div3", 363 .ops = &clk_regmap_gate_ops, 364 .parent_hws = (const struct clk_hw *[]) { 365 &meson8b_fclk_div3_div.hw 366 }, 367 .num_parents = 1, 368 }, 369 }; 370 371 static struct clk_fixed_factor meson8b_fclk_div4_div = { 372 .mult = 1, 373 .div = 4, 374 .hw.init = &(struct clk_init_data){ 375 .name = "fclk_div4_div", 376 .ops = &clk_fixed_factor_ops, 377 .parent_hws = (const struct clk_hw *[]) { 378 &meson8b_fixed_pll.hw 379 }, 380 .num_parents = 1, 381 }, 382 }; 383 384 static struct clk_regmap meson8b_fclk_div4 = { 385 .data = &(struct clk_regmap_gate_data){ 386 .offset = HHI_MPLL_CNTL6, 387 .bit_idx = 29, 388 }, 389 .hw.init = &(struct clk_init_data){ 390 .name = "fclk_div4", 391 .ops = &clk_regmap_gate_ops, 392 .parent_hws = (const struct clk_hw *[]) { 393 &meson8b_fclk_div4_div.hw 394 }, 395 .num_parents = 1, 396 }, 397 }; 398 399 static struct clk_fixed_factor meson8b_fclk_div5_div = { 400 .mult = 1, 401 .div = 5, 402 .hw.init = &(struct clk_init_data){ 403 .name = "fclk_div5_div", 404 .ops = &clk_fixed_factor_ops, 405 .parent_hws = (const struct clk_hw *[]) { 406 &meson8b_fixed_pll.hw 407 }, 408 .num_parents = 1, 409 }, 410 }; 411 412 static struct clk_regmap meson8b_fclk_div5 = { 413 .data = &(struct clk_regmap_gate_data){ 414 .offset = HHI_MPLL_CNTL6, 415 .bit_idx = 30, 416 }, 417 .hw.init = &(struct clk_init_data){ 418 .name = "fclk_div5", 419 .ops = &clk_regmap_gate_ops, 420 .parent_hws = (const struct clk_hw *[]) { 421 &meson8b_fclk_div5_div.hw 422 }, 423 .num_parents = 1, 424 }, 425 }; 426 427 static struct clk_fixed_factor meson8b_fclk_div7_div = { 428 .mult = 1, 429 .div = 7, 430 .hw.init = &(struct clk_init_data){ 431 .name = "fclk_div7_div", 432 .ops = &clk_fixed_factor_ops, 433 .parent_hws = (const struct clk_hw *[]) { 434 &meson8b_fixed_pll.hw 435 }, 436 .num_parents = 1, 437 }, 438 }; 439 440 static struct clk_regmap meson8b_fclk_div7 = { 441 .data = &(struct clk_regmap_gate_data){ 442 .offset = HHI_MPLL_CNTL6, 443 .bit_idx = 31, 444 }, 445 .hw.init = &(struct clk_init_data){ 446 .name = "fclk_div7", 447 .ops = &clk_regmap_gate_ops, 448 .parent_hws = (const struct clk_hw *[]) { 449 &meson8b_fclk_div7_div.hw 450 }, 451 .num_parents = 1, 452 }, 453 }; 454 455 static struct clk_regmap meson8b_mpll_prediv = { 456 .data = &(struct clk_regmap_div_data){ 457 .offset = HHI_MPLL_CNTL5, 458 .shift = 12, 459 .width = 1, 460 }, 461 .hw.init = &(struct clk_init_data){ 462 .name = "mpll_prediv", 463 .ops = &clk_regmap_divider_ro_ops, 464 .parent_hws = (const struct clk_hw *[]) { 465 &meson8b_fixed_pll.hw 466 }, 467 .num_parents = 1, 468 }, 469 }; 470 471 static struct clk_regmap meson8b_mpll0_div = { 472 .data = &(struct meson_clk_mpll_data){ 473 .sdm = { 474 .reg_off = HHI_MPLL_CNTL7, 475 .shift = 0, 476 .width = 14, 477 }, 478 .sdm_en = { 479 .reg_off = HHI_MPLL_CNTL7, 480 .shift = 15, 481 .width = 1, 482 }, 483 .n2 = { 484 .reg_off = HHI_MPLL_CNTL7, 485 .shift = 16, 486 .width = 9, 487 }, 488 .ssen = { 489 .reg_off = HHI_MPLL_CNTL, 490 .shift = 25, 491 .width = 1, 492 }, 493 }, 494 .hw.init = &(struct clk_init_data){ 495 .name = "mpll0_div", 496 .ops = &meson_clk_mpll_ops, 497 .parent_hws = (const struct clk_hw *[]) { 498 &meson8b_mpll_prediv.hw 499 }, 500 .num_parents = 1, 501 }, 502 }; 503 504 static struct clk_regmap meson8b_mpll0 = { 505 .data = &(struct clk_regmap_gate_data){ 506 .offset = HHI_MPLL_CNTL7, 507 .bit_idx = 14, 508 }, 509 .hw.init = &(struct clk_init_data){ 510 .name = "mpll0", 511 .ops = &clk_regmap_gate_ops, 512 .parent_hws = (const struct clk_hw *[]) { 513 &meson8b_mpll0_div.hw 514 }, 515 .num_parents = 1, 516 .flags = CLK_SET_RATE_PARENT, 517 }, 518 }; 519 520 static struct clk_regmap meson8b_mpll1_div = { 521 .data = &(struct meson_clk_mpll_data){ 522 .sdm = { 523 .reg_off = HHI_MPLL_CNTL8, 524 .shift = 0, 525 .width = 14, 526 }, 527 .sdm_en = { 528 .reg_off = HHI_MPLL_CNTL8, 529 .shift = 15, 530 .width = 1, 531 }, 532 .n2 = { 533 .reg_off = HHI_MPLL_CNTL8, 534 .shift = 16, 535 .width = 9, 536 }, 537 }, 538 .hw.init = &(struct clk_init_data){ 539 .name = "mpll1_div", 540 .ops = &meson_clk_mpll_ops, 541 .parent_hws = (const struct clk_hw *[]) { 542 &meson8b_mpll_prediv.hw 543 }, 544 .num_parents = 1, 545 }, 546 }; 547 548 static struct clk_regmap meson8b_mpll1 = { 549 .data = &(struct clk_regmap_gate_data){ 550 .offset = HHI_MPLL_CNTL8, 551 .bit_idx = 14, 552 }, 553 .hw.init = &(struct clk_init_data){ 554 .name = "mpll1", 555 .ops = &clk_regmap_gate_ops, 556 .parent_hws = (const struct clk_hw *[]) { 557 &meson8b_mpll1_div.hw 558 }, 559 .num_parents = 1, 560 .flags = CLK_SET_RATE_PARENT, 561 }, 562 }; 563 564 static struct clk_regmap meson8b_mpll2_div = { 565 .data = &(struct meson_clk_mpll_data){ 566 .sdm = { 567 .reg_off = HHI_MPLL_CNTL9, 568 .shift = 0, 569 .width = 14, 570 }, 571 .sdm_en = { 572 .reg_off = HHI_MPLL_CNTL9, 573 .shift = 15, 574 .width = 1, 575 }, 576 .n2 = { 577 .reg_off = HHI_MPLL_CNTL9, 578 .shift = 16, 579 .width = 9, 580 }, 581 }, 582 .hw.init = &(struct clk_init_data){ 583 .name = "mpll2_div", 584 .ops = &meson_clk_mpll_ops, 585 .parent_hws = (const struct clk_hw *[]) { 586 &meson8b_mpll_prediv.hw 587 }, 588 .num_parents = 1, 589 }, 590 }; 591 592 static struct clk_regmap meson8b_mpll2 = { 593 .data = &(struct clk_regmap_gate_data){ 594 .offset = HHI_MPLL_CNTL9, 595 .bit_idx = 14, 596 }, 597 .hw.init = &(struct clk_init_data){ 598 .name = "mpll2", 599 .ops = &clk_regmap_gate_ops, 600 .parent_hws = (const struct clk_hw *[]) { 601 &meson8b_mpll2_div.hw 602 }, 603 .num_parents = 1, 604 .flags = CLK_SET_RATE_PARENT, 605 }, 606 }; 607 608 static u32 mux_table_clk81[] = { 6, 5, 7 }; 609 static struct clk_regmap meson8b_mpeg_clk_sel = { 610 .data = &(struct clk_regmap_mux_data){ 611 .offset = HHI_MPEG_CLK_CNTL, 612 .mask = 0x7, 613 .shift = 12, 614 .table = mux_table_clk81, 615 }, 616 .hw.init = &(struct clk_init_data){ 617 .name = "mpeg_clk_sel", 618 .ops = &clk_regmap_mux_ro_ops, 619 /* 620 * FIXME bits 14:12 selects from 8 possible parents: 621 * xtal, 1'b0 (wtf), fclk_div7, mpll_clkout1, mpll_clkout2, 622 * fclk_div4, fclk_div3, fclk_div5 623 */ 624 .parent_hws = (const struct clk_hw *[]) { 625 &meson8b_fclk_div3.hw, 626 &meson8b_fclk_div4.hw, 627 &meson8b_fclk_div5.hw, 628 }, 629 .num_parents = 3, 630 }, 631 }; 632 633 static struct clk_regmap meson8b_mpeg_clk_div = { 634 .data = &(struct clk_regmap_div_data){ 635 .offset = HHI_MPEG_CLK_CNTL, 636 .shift = 0, 637 .width = 7, 638 }, 639 .hw.init = &(struct clk_init_data){ 640 .name = "mpeg_clk_div", 641 .ops = &clk_regmap_divider_ro_ops, 642 .parent_hws = (const struct clk_hw *[]) { 643 &meson8b_mpeg_clk_sel.hw 644 }, 645 .num_parents = 1, 646 }, 647 }; 648 649 static struct clk_regmap meson8b_clk81 = { 650 .data = &(struct clk_regmap_gate_data){ 651 .offset = HHI_MPEG_CLK_CNTL, 652 .bit_idx = 7, 653 }, 654 .hw.init = &(struct clk_init_data){ 655 .name = "clk81", 656 .ops = &clk_regmap_gate_ops, 657 .parent_hws = (const struct clk_hw *[]) { 658 &meson8b_mpeg_clk_div.hw 659 }, 660 .num_parents = 1, 661 .flags = CLK_IS_CRITICAL, 662 }, 663 }; 664 665 static struct clk_regmap meson8b_cpu_in_sel = { 666 .data = &(struct clk_regmap_mux_data){ 667 .offset = HHI_SYS_CPU_CLK_CNTL0, 668 .mask = 0x1, 669 .shift = 0, 670 }, 671 .hw.init = &(struct clk_init_data){ 672 .name = "cpu_in_sel", 673 .ops = &clk_regmap_mux_ops, 674 .parent_data = (const struct clk_parent_data[]) { 675 { .fw_name = "xtal", .name = "xtal", .index = -1, }, 676 { .hw = &meson8b_sys_pll.hw, }, 677 }, 678 .num_parents = 2, 679 .flags = (CLK_SET_RATE_PARENT | 680 CLK_SET_RATE_NO_REPARENT), 681 }, 682 }; 683 684 static struct clk_fixed_factor meson8b_cpu_in_div2 = { 685 .mult = 1, 686 .div = 2, 687 .hw.init = &(struct clk_init_data){ 688 .name = "cpu_in_div2", 689 .ops = &clk_fixed_factor_ops, 690 .parent_hws = (const struct clk_hw *[]) { 691 &meson8b_cpu_in_sel.hw 692 }, 693 .num_parents = 1, 694 .flags = CLK_SET_RATE_PARENT, 695 }, 696 }; 697 698 static struct clk_fixed_factor meson8b_cpu_in_div3 = { 699 .mult = 1, 700 .div = 3, 701 .hw.init = &(struct clk_init_data){ 702 .name = "cpu_in_div3", 703 .ops = &clk_fixed_factor_ops, 704 .parent_hws = (const struct clk_hw *[]) { 705 &meson8b_cpu_in_sel.hw 706 }, 707 .num_parents = 1, 708 .flags = CLK_SET_RATE_PARENT, 709 }, 710 }; 711 712 static const struct clk_div_table cpu_scale_table[] = { 713 { .val = 1, .div = 4 }, 714 { .val = 2, .div = 6 }, 715 { .val = 3, .div = 8 }, 716 { .val = 4, .div = 10 }, 717 { .val = 5, .div = 12 }, 718 { .val = 6, .div = 14 }, 719 { .val = 7, .div = 16 }, 720 { .val = 8, .div = 18 }, 721 { /* sentinel */ }, 722 }; 723 724 static struct clk_regmap meson8b_cpu_scale_div = { 725 .data = &(struct clk_regmap_div_data){ 726 .offset = HHI_SYS_CPU_CLK_CNTL1, 727 .shift = 20, 728 .width = 10, 729 .table = cpu_scale_table, 730 .flags = CLK_DIVIDER_ALLOW_ZERO, 731 }, 732 .hw.init = &(struct clk_init_data){ 733 .name = "cpu_scale_div", 734 .ops = &clk_regmap_divider_ops, 735 .parent_hws = (const struct clk_hw *[]) { 736 &meson8b_cpu_in_sel.hw 737 }, 738 .num_parents = 1, 739 .flags = CLK_SET_RATE_PARENT, 740 }, 741 }; 742 743 static u32 mux_table_cpu_scale_out_sel[] = { 0, 1, 3 }; 744 static struct clk_regmap meson8b_cpu_scale_out_sel = { 745 .data = &(struct clk_regmap_mux_data){ 746 .offset = HHI_SYS_CPU_CLK_CNTL0, 747 .mask = 0x3, 748 .shift = 2, 749 .table = mux_table_cpu_scale_out_sel, 750 }, 751 .hw.init = &(struct clk_init_data){ 752 .name = "cpu_scale_out_sel", 753 .ops = &clk_regmap_mux_ops, 754 /* 755 * NOTE: We are skipping the parent with value 0x2 (which is 756 * meson8b_cpu_in_div3) because it results in a duty cycle of 757 * 33% which makes the system unstable and can result in a 758 * lockup of the whole system. 759 */ 760 .parent_hws = (const struct clk_hw *[]) { 761 &meson8b_cpu_in_sel.hw, 762 &meson8b_cpu_in_div2.hw, 763 &meson8b_cpu_scale_div.hw, 764 }, 765 .num_parents = 3, 766 .flags = CLK_SET_RATE_PARENT, 767 }, 768 }; 769 770 static struct clk_regmap meson8b_cpu_clk = { 771 .data = &(struct clk_regmap_mux_data){ 772 .offset = HHI_SYS_CPU_CLK_CNTL0, 773 .mask = 0x1, 774 .shift = 7, 775 }, 776 .hw.init = &(struct clk_init_data){ 777 .name = "cpu_clk", 778 .ops = &clk_regmap_mux_ops, 779 .parent_data = (const struct clk_parent_data[]) { 780 { .fw_name = "xtal", .name = "xtal", .index = -1, }, 781 { .hw = &meson8b_cpu_scale_out_sel.hw, }, 782 }, 783 .num_parents = 2, 784 .flags = (CLK_SET_RATE_PARENT | 785 CLK_SET_RATE_NO_REPARENT | 786 CLK_IS_CRITICAL), 787 }, 788 }; 789 790 static struct clk_regmap meson8b_nand_clk_sel = { 791 .data = &(struct clk_regmap_mux_data){ 792 .offset = HHI_NAND_CLK_CNTL, 793 .mask = 0x7, 794 .shift = 9, 795 .flags = CLK_MUX_ROUND_CLOSEST, 796 }, 797 .hw.init = &(struct clk_init_data){ 798 .name = "nand_clk_sel", 799 .ops = &clk_regmap_mux_ops, 800 /* FIXME all other parents are unknown: */ 801 .parent_data = (const struct clk_parent_data[]) { 802 { .hw = &meson8b_fclk_div4.hw, }, 803 { .hw = &meson8b_fclk_div3.hw, }, 804 { .hw = &meson8b_fclk_div5.hw, }, 805 { .hw = &meson8b_fclk_div7.hw, }, 806 { .fw_name = "xtal", .name = "xtal", .index = -1, }, 807 }, 808 .num_parents = 5, 809 .flags = CLK_SET_RATE_PARENT, 810 }, 811 }; 812 813 static struct clk_regmap meson8b_nand_clk_div = { 814 .data = &(struct clk_regmap_div_data){ 815 .offset = HHI_NAND_CLK_CNTL, 816 .shift = 0, 817 .width = 7, 818 .flags = CLK_DIVIDER_ROUND_CLOSEST, 819 }, 820 .hw.init = &(struct clk_init_data){ 821 .name = "nand_clk_div", 822 .ops = &clk_regmap_divider_ops, 823 .parent_hws = (const struct clk_hw *[]) { 824 &meson8b_nand_clk_sel.hw 825 }, 826 .num_parents = 1, 827 .flags = CLK_SET_RATE_PARENT, 828 }, 829 }; 830 831 static struct clk_regmap meson8b_nand_clk_gate = { 832 .data = &(struct clk_regmap_gate_data){ 833 .offset = HHI_NAND_CLK_CNTL, 834 .bit_idx = 8, 835 }, 836 .hw.init = &(struct clk_init_data){ 837 .name = "nand_clk_gate", 838 .ops = &clk_regmap_gate_ops, 839 .parent_hws = (const struct clk_hw *[]) { 840 &meson8b_nand_clk_div.hw 841 }, 842 .num_parents = 1, 843 .flags = CLK_SET_RATE_PARENT, 844 }, 845 }; 846 847 static struct clk_fixed_factor meson8b_cpu_clk_div2 = { 848 .mult = 1, 849 .div = 2, 850 .hw.init = &(struct clk_init_data){ 851 .name = "cpu_clk_div2", 852 .ops = &clk_fixed_factor_ops, 853 .parent_hws = (const struct clk_hw *[]) { 854 &meson8b_cpu_clk.hw 855 }, 856 .num_parents = 1, 857 }, 858 }; 859 860 static struct clk_fixed_factor meson8b_cpu_clk_div3 = { 861 .mult = 1, 862 .div = 3, 863 .hw.init = &(struct clk_init_data){ 864 .name = "cpu_clk_div3", 865 .ops = &clk_fixed_factor_ops, 866 .parent_hws = (const struct clk_hw *[]) { 867 &meson8b_cpu_clk.hw 868 }, 869 .num_parents = 1, 870 }, 871 }; 872 873 static struct clk_fixed_factor meson8b_cpu_clk_div4 = { 874 .mult = 1, 875 .div = 4, 876 .hw.init = &(struct clk_init_data){ 877 .name = "cpu_clk_div4", 878 .ops = &clk_fixed_factor_ops, 879 .parent_hws = (const struct clk_hw *[]) { 880 &meson8b_cpu_clk.hw 881 }, 882 .num_parents = 1, 883 }, 884 }; 885 886 static struct clk_fixed_factor meson8b_cpu_clk_div5 = { 887 .mult = 1, 888 .div = 5, 889 .hw.init = &(struct clk_init_data){ 890 .name = "cpu_clk_div5", 891 .ops = &clk_fixed_factor_ops, 892 .parent_hws = (const struct clk_hw *[]) { 893 &meson8b_cpu_clk.hw 894 }, 895 .num_parents = 1, 896 }, 897 }; 898 899 static struct clk_fixed_factor meson8b_cpu_clk_div6 = { 900 .mult = 1, 901 .div = 6, 902 .hw.init = &(struct clk_init_data){ 903 .name = "cpu_clk_div6", 904 .ops = &clk_fixed_factor_ops, 905 .parent_hws = (const struct clk_hw *[]) { 906 &meson8b_cpu_clk.hw 907 }, 908 .num_parents = 1, 909 }, 910 }; 911 912 static struct clk_fixed_factor meson8b_cpu_clk_div7 = { 913 .mult = 1, 914 .div = 7, 915 .hw.init = &(struct clk_init_data){ 916 .name = "cpu_clk_div7", 917 .ops = &clk_fixed_factor_ops, 918 .parent_hws = (const struct clk_hw *[]) { 919 &meson8b_cpu_clk.hw 920 }, 921 .num_parents = 1, 922 }, 923 }; 924 925 static struct clk_fixed_factor meson8b_cpu_clk_div8 = { 926 .mult = 1, 927 .div = 8, 928 .hw.init = &(struct clk_init_data){ 929 .name = "cpu_clk_div8", 930 .ops = &clk_fixed_factor_ops, 931 .parent_hws = (const struct clk_hw *[]) { 932 &meson8b_cpu_clk.hw 933 }, 934 .num_parents = 1, 935 }, 936 }; 937 938 static u32 mux_table_apb[] = { 1, 2, 3, 4, 5, 6, 7 }; 939 static struct clk_regmap meson8b_apb_clk_sel = { 940 .data = &(struct clk_regmap_mux_data){ 941 .offset = HHI_SYS_CPU_CLK_CNTL1, 942 .mask = 0x7, 943 .shift = 3, 944 .table = mux_table_apb, 945 }, 946 .hw.init = &(struct clk_init_data){ 947 .name = "apb_clk_sel", 948 .ops = &clk_regmap_mux_ops, 949 .parent_hws = (const struct clk_hw *[]) { 950 &meson8b_cpu_clk_div2.hw, 951 &meson8b_cpu_clk_div3.hw, 952 &meson8b_cpu_clk_div4.hw, 953 &meson8b_cpu_clk_div5.hw, 954 &meson8b_cpu_clk_div6.hw, 955 &meson8b_cpu_clk_div7.hw, 956 &meson8b_cpu_clk_div8.hw, 957 }, 958 .num_parents = 7, 959 }, 960 }; 961 962 static struct clk_regmap meson8b_apb_clk_gate = { 963 .data = &(struct clk_regmap_gate_data){ 964 .offset = HHI_SYS_CPU_CLK_CNTL1, 965 .bit_idx = 16, 966 .flags = CLK_GATE_SET_TO_DISABLE, 967 }, 968 .hw.init = &(struct clk_init_data){ 969 .name = "apb_clk_dis", 970 .ops = &clk_regmap_gate_ro_ops, 971 .parent_hws = (const struct clk_hw *[]) { 972 &meson8b_apb_clk_sel.hw 973 }, 974 .num_parents = 1, 975 .flags = CLK_SET_RATE_PARENT, 976 }, 977 }; 978 979 static struct clk_regmap meson8b_periph_clk_sel = { 980 .data = &(struct clk_regmap_mux_data){ 981 .offset = HHI_SYS_CPU_CLK_CNTL1, 982 .mask = 0x7, 983 .shift = 6, 984 }, 985 .hw.init = &(struct clk_init_data){ 986 .name = "periph_clk_sel", 987 .ops = &clk_regmap_mux_ops, 988 .parent_hws = (const struct clk_hw *[]) { 989 &meson8b_cpu_clk_div2.hw, 990 &meson8b_cpu_clk_div3.hw, 991 &meson8b_cpu_clk_div4.hw, 992 &meson8b_cpu_clk_div5.hw, 993 &meson8b_cpu_clk_div6.hw, 994 &meson8b_cpu_clk_div7.hw, 995 &meson8b_cpu_clk_div8.hw, 996 }, 997 .num_parents = 7, 998 }, 999 }; 1000 1001 static struct clk_regmap meson8b_periph_clk_gate = { 1002 .data = &(struct clk_regmap_gate_data){ 1003 .offset = HHI_SYS_CPU_CLK_CNTL1, 1004 .bit_idx = 17, 1005 .flags = CLK_GATE_SET_TO_DISABLE, 1006 }, 1007 .hw.init = &(struct clk_init_data){ 1008 .name = "periph_clk_dis", 1009 .ops = &clk_regmap_gate_ro_ops, 1010 .parent_hws = (const struct clk_hw *[]) { 1011 &meson8b_periph_clk_sel.hw 1012 }, 1013 .num_parents = 1, 1014 .flags = CLK_SET_RATE_PARENT, 1015 }, 1016 }; 1017 1018 static u32 mux_table_axi[] = { 1, 2, 3, 4, 5, 6, 7 }; 1019 static struct clk_regmap meson8b_axi_clk_sel = { 1020 .data = &(struct clk_regmap_mux_data){ 1021 .offset = HHI_SYS_CPU_CLK_CNTL1, 1022 .mask = 0x7, 1023 .shift = 9, 1024 .table = mux_table_axi, 1025 }, 1026 .hw.init = &(struct clk_init_data){ 1027 .name = "axi_clk_sel", 1028 .ops = &clk_regmap_mux_ops, 1029 .parent_hws = (const struct clk_hw *[]) { 1030 &meson8b_cpu_clk_div2.hw, 1031 &meson8b_cpu_clk_div3.hw, 1032 &meson8b_cpu_clk_div4.hw, 1033 &meson8b_cpu_clk_div5.hw, 1034 &meson8b_cpu_clk_div6.hw, 1035 &meson8b_cpu_clk_div7.hw, 1036 &meson8b_cpu_clk_div8.hw, 1037 }, 1038 .num_parents = 7, 1039 }, 1040 }; 1041 1042 static struct clk_regmap meson8b_axi_clk_gate = { 1043 .data = &(struct clk_regmap_gate_data){ 1044 .offset = HHI_SYS_CPU_CLK_CNTL1, 1045 .bit_idx = 18, 1046 .flags = CLK_GATE_SET_TO_DISABLE, 1047 }, 1048 .hw.init = &(struct clk_init_data){ 1049 .name = "axi_clk_dis", 1050 .ops = &clk_regmap_gate_ro_ops, 1051 .parent_hws = (const struct clk_hw *[]) { 1052 &meson8b_axi_clk_sel.hw 1053 }, 1054 .num_parents = 1, 1055 .flags = CLK_SET_RATE_PARENT, 1056 }, 1057 }; 1058 1059 static struct clk_regmap meson8b_l2_dram_clk_sel = { 1060 .data = &(struct clk_regmap_mux_data){ 1061 .offset = HHI_SYS_CPU_CLK_CNTL1, 1062 .mask = 0x7, 1063 .shift = 12, 1064 }, 1065 .hw.init = &(struct clk_init_data){ 1066 .name = "l2_dram_clk_sel", 1067 .ops = &clk_regmap_mux_ops, 1068 .parent_hws = (const struct clk_hw *[]) { 1069 &meson8b_cpu_clk_div2.hw, 1070 &meson8b_cpu_clk_div3.hw, 1071 &meson8b_cpu_clk_div4.hw, 1072 &meson8b_cpu_clk_div5.hw, 1073 &meson8b_cpu_clk_div6.hw, 1074 &meson8b_cpu_clk_div7.hw, 1075 &meson8b_cpu_clk_div8.hw, 1076 }, 1077 .num_parents = 7, 1078 }, 1079 }; 1080 1081 static struct clk_regmap meson8b_l2_dram_clk_gate = { 1082 .data = &(struct clk_regmap_gate_data){ 1083 .offset = HHI_SYS_CPU_CLK_CNTL1, 1084 .bit_idx = 19, 1085 .flags = CLK_GATE_SET_TO_DISABLE, 1086 }, 1087 .hw.init = &(struct clk_init_data){ 1088 .name = "l2_dram_clk_dis", 1089 .ops = &clk_regmap_gate_ro_ops, 1090 .parent_hws = (const struct clk_hw *[]) { 1091 &meson8b_l2_dram_clk_sel.hw 1092 }, 1093 .num_parents = 1, 1094 .flags = CLK_SET_RATE_PARENT, 1095 }, 1096 }; 1097 1098 /* also called LVDS_CLK_EN */ 1099 static struct clk_regmap meson8b_vid_pll_lvds_en = { 1100 .data = &(struct clk_regmap_gate_data){ 1101 .offset = HHI_VID_DIVIDER_CNTL, 1102 .bit_idx = 11, 1103 }, 1104 .hw.init = &(struct clk_init_data){ 1105 .name = "vid_pll_lvds_en", 1106 .ops = &clk_regmap_gate_ops, 1107 .parent_hws = (const struct clk_hw *[]) { 1108 &meson8b_hdmi_pll_lvds_out.hw 1109 }, 1110 .num_parents = 1, 1111 .flags = CLK_SET_RATE_PARENT, 1112 }, 1113 }; 1114 1115 static struct clk_regmap meson8b_vid_pll_in_sel = { 1116 .data = &(struct clk_regmap_mux_data){ 1117 .offset = HHI_VID_DIVIDER_CNTL, 1118 .mask = 0x1, 1119 .shift = 15, 1120 }, 1121 .hw.init = &(struct clk_init_data){ 1122 .name = "vid_pll_in_sel", 1123 .ops = &clk_regmap_mux_ops, 1124 /* 1125 * TODO: depending on the SoC there is also a second parent: 1126 * Meson8: unknown 1127 * Meson8b: hdmi_pll_dco 1128 * Meson8m2: vid2_pll 1129 */ 1130 .parent_hws = (const struct clk_hw *[]) { 1131 &meson8b_vid_pll_lvds_en.hw 1132 }, 1133 .num_parents = 1, 1134 .flags = CLK_SET_RATE_PARENT, 1135 }, 1136 }; 1137 1138 static struct clk_regmap meson8b_vid_pll_in_en = { 1139 .data = &(struct clk_regmap_gate_data){ 1140 .offset = HHI_VID_DIVIDER_CNTL, 1141 .bit_idx = 16, 1142 }, 1143 .hw.init = &(struct clk_init_data){ 1144 .name = "vid_pll_in_en", 1145 .ops = &clk_regmap_gate_ops, 1146 .parent_hws = (const struct clk_hw *[]) { 1147 &meson8b_vid_pll_in_sel.hw 1148 }, 1149 .num_parents = 1, 1150 .flags = CLK_SET_RATE_PARENT, 1151 }, 1152 }; 1153 1154 static struct clk_regmap meson8b_vid_pll_pre_div = { 1155 .data = &(struct clk_regmap_div_data){ 1156 .offset = HHI_VID_DIVIDER_CNTL, 1157 .shift = 4, 1158 .width = 3, 1159 }, 1160 .hw.init = &(struct clk_init_data){ 1161 .name = "vid_pll_pre_div", 1162 .ops = &clk_regmap_divider_ops, 1163 .parent_hws = (const struct clk_hw *[]) { 1164 &meson8b_vid_pll_in_en.hw 1165 }, 1166 .num_parents = 1, 1167 .flags = CLK_SET_RATE_PARENT, 1168 }, 1169 }; 1170 1171 static struct clk_regmap meson8b_vid_pll_post_div = { 1172 .data = &(struct clk_regmap_div_data){ 1173 .offset = HHI_VID_DIVIDER_CNTL, 1174 .shift = 12, 1175 .width = 3, 1176 }, 1177 .hw.init = &(struct clk_init_data){ 1178 .name = "vid_pll_post_div", 1179 .ops = &clk_regmap_divider_ops, 1180 .parent_hws = (const struct clk_hw *[]) { 1181 &meson8b_vid_pll_pre_div.hw 1182 }, 1183 .num_parents = 1, 1184 .flags = CLK_SET_RATE_PARENT, 1185 }, 1186 }; 1187 1188 static struct clk_regmap meson8b_vid_pll = { 1189 .data = &(struct clk_regmap_mux_data){ 1190 .offset = HHI_VID_DIVIDER_CNTL, 1191 .mask = 0x3, 1192 .shift = 8, 1193 }, 1194 .hw.init = &(struct clk_init_data){ 1195 .name = "vid_pll", 1196 .ops = &clk_regmap_mux_ops, 1197 /* TODO: parent 0x2 is vid_pll_pre_div_mult7_div2 */ 1198 .parent_hws = (const struct clk_hw *[]) { 1199 &meson8b_vid_pll_pre_div.hw, 1200 &meson8b_vid_pll_post_div.hw, 1201 }, 1202 .num_parents = 2, 1203 .flags = CLK_SET_RATE_PARENT, 1204 }, 1205 }; 1206 1207 static struct clk_regmap meson8b_vid_pll_final_div = { 1208 .data = &(struct clk_regmap_div_data){ 1209 .offset = HHI_VID_CLK_DIV, 1210 .shift = 0, 1211 .width = 8, 1212 }, 1213 .hw.init = &(struct clk_init_data){ 1214 .name = "vid_pll_final_div", 1215 .ops = &clk_regmap_divider_ops, 1216 .parent_hws = (const struct clk_hw *[]) { 1217 &meson8b_vid_pll.hw 1218 }, 1219 .num_parents = 1, 1220 .flags = CLK_SET_RATE_PARENT, 1221 }, 1222 }; 1223 1224 static const struct clk_hw *meson8b_vclk_mux_parent_hws[] = { 1225 &meson8b_vid_pll_final_div.hw, 1226 &meson8b_fclk_div4.hw, 1227 &meson8b_fclk_div3.hw, 1228 &meson8b_fclk_div5.hw, 1229 &meson8b_vid_pll_final_div.hw, 1230 &meson8b_fclk_div7.hw, 1231 &meson8b_mpll1.hw, 1232 }; 1233 1234 static struct clk_regmap meson8b_vclk_in_sel = { 1235 .data = &(struct clk_regmap_mux_data){ 1236 .offset = HHI_VID_CLK_CNTL, 1237 .mask = 0x7, 1238 .shift = 16, 1239 }, 1240 .hw.init = &(struct clk_init_data){ 1241 .name = "vclk_in_sel", 1242 .ops = &clk_regmap_mux_ops, 1243 .parent_hws = meson8b_vclk_mux_parent_hws, 1244 .num_parents = ARRAY_SIZE(meson8b_vclk_mux_parent_hws), 1245 .flags = CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 1246 }, 1247 }; 1248 1249 static struct clk_regmap meson8b_vclk_in_en = { 1250 .data = &(struct clk_regmap_gate_data){ 1251 .offset = HHI_VID_CLK_DIV, 1252 .bit_idx = 16, 1253 }, 1254 .hw.init = &(struct clk_init_data){ 1255 .name = "vclk_in_en", 1256 .ops = &clk_regmap_gate_ops, 1257 .parent_hws = (const struct clk_hw *[]) { 1258 &meson8b_vclk_in_sel.hw 1259 }, 1260 .num_parents = 1, 1261 .flags = CLK_SET_RATE_PARENT, 1262 }, 1263 }; 1264 1265 static struct clk_regmap meson8b_vclk_en = { 1266 .data = &(struct clk_regmap_gate_data){ 1267 .offset = HHI_VID_CLK_CNTL, 1268 .bit_idx = 19, 1269 }, 1270 .hw.init = &(struct clk_init_data){ 1271 .name = "vclk_en", 1272 .ops = &clk_regmap_gate_ops, 1273 .parent_hws = (const struct clk_hw *[]) { 1274 &meson8b_vclk_in_en.hw 1275 }, 1276 .num_parents = 1, 1277 .flags = CLK_SET_RATE_PARENT, 1278 }, 1279 }; 1280 1281 static struct clk_regmap meson8b_vclk_div1_gate = { 1282 .data = &(struct clk_regmap_gate_data){ 1283 .offset = HHI_VID_CLK_CNTL, 1284 .bit_idx = 0, 1285 }, 1286 .hw.init = &(struct clk_init_data){ 1287 .name = "vclk_div1_en", 1288 .ops = &clk_regmap_gate_ops, 1289 .parent_hws = (const struct clk_hw *[]) { 1290 &meson8b_vclk_en.hw 1291 }, 1292 .num_parents = 1, 1293 .flags = CLK_SET_RATE_PARENT, 1294 }, 1295 }; 1296 1297 static struct clk_fixed_factor meson8b_vclk_div2_div = { 1298 .mult = 1, 1299 .div = 2, 1300 .hw.init = &(struct clk_init_data){ 1301 .name = "vclk_div2", 1302 .ops = &clk_fixed_factor_ops, 1303 .parent_hws = (const struct clk_hw *[]) { 1304 &meson8b_vclk_en.hw 1305 }, 1306 .num_parents = 1, 1307 .flags = CLK_SET_RATE_PARENT, 1308 } 1309 }; 1310 1311 static struct clk_regmap meson8b_vclk_div2_div_gate = { 1312 .data = &(struct clk_regmap_gate_data){ 1313 .offset = HHI_VID_CLK_CNTL, 1314 .bit_idx = 1, 1315 }, 1316 .hw.init = &(struct clk_init_data){ 1317 .name = "vclk_div2_en", 1318 .ops = &clk_regmap_gate_ops, 1319 .parent_hws = (const struct clk_hw *[]) { 1320 &meson8b_vclk_div2_div.hw 1321 }, 1322 .num_parents = 1, 1323 .flags = CLK_SET_RATE_PARENT, 1324 }, 1325 }; 1326 1327 static struct clk_fixed_factor meson8b_vclk_div4_div = { 1328 .mult = 1, 1329 .div = 4, 1330 .hw.init = &(struct clk_init_data){ 1331 .name = "vclk_div4", 1332 .ops = &clk_fixed_factor_ops, 1333 .parent_hws = (const struct clk_hw *[]) { 1334 &meson8b_vclk_en.hw 1335 }, 1336 .num_parents = 1, 1337 .flags = CLK_SET_RATE_PARENT, 1338 } 1339 }; 1340 1341 static struct clk_regmap meson8b_vclk_div4_div_gate = { 1342 .data = &(struct clk_regmap_gate_data){ 1343 .offset = HHI_VID_CLK_CNTL, 1344 .bit_idx = 2, 1345 }, 1346 .hw.init = &(struct clk_init_data){ 1347 .name = "vclk_div4_en", 1348 .ops = &clk_regmap_gate_ops, 1349 .parent_hws = (const struct clk_hw *[]) { 1350 &meson8b_vclk_div4_div.hw 1351 }, 1352 .num_parents = 1, 1353 .flags = CLK_SET_RATE_PARENT, 1354 }, 1355 }; 1356 1357 static struct clk_fixed_factor meson8b_vclk_div6_div = { 1358 .mult = 1, 1359 .div = 6, 1360 .hw.init = &(struct clk_init_data){ 1361 .name = "vclk_div6", 1362 .ops = &clk_fixed_factor_ops, 1363 .parent_hws = (const struct clk_hw *[]) { 1364 &meson8b_vclk_en.hw 1365 }, 1366 .num_parents = 1, 1367 .flags = CLK_SET_RATE_PARENT, 1368 } 1369 }; 1370 1371 static struct clk_regmap meson8b_vclk_div6_div_gate = { 1372 .data = &(struct clk_regmap_gate_data){ 1373 .offset = HHI_VID_CLK_CNTL, 1374 .bit_idx = 3, 1375 }, 1376 .hw.init = &(struct clk_init_data){ 1377 .name = "vclk_div6_en", 1378 .ops = &clk_regmap_gate_ops, 1379 .parent_hws = (const struct clk_hw *[]) { 1380 &meson8b_vclk_div6_div.hw 1381 }, 1382 .num_parents = 1, 1383 .flags = CLK_SET_RATE_PARENT, 1384 }, 1385 }; 1386 1387 static struct clk_fixed_factor meson8b_vclk_div12_div = { 1388 .mult = 1, 1389 .div = 12, 1390 .hw.init = &(struct clk_init_data){ 1391 .name = "vclk_div12", 1392 .ops = &clk_fixed_factor_ops, 1393 .parent_hws = (const struct clk_hw *[]) { 1394 &meson8b_vclk_en.hw 1395 }, 1396 .num_parents = 1, 1397 .flags = CLK_SET_RATE_PARENT, 1398 } 1399 }; 1400 1401 static struct clk_regmap meson8b_vclk_div12_div_gate = { 1402 .data = &(struct clk_regmap_gate_data){ 1403 .offset = HHI_VID_CLK_CNTL, 1404 .bit_idx = 4, 1405 }, 1406 .hw.init = &(struct clk_init_data){ 1407 .name = "vclk_div12_en", 1408 .ops = &clk_regmap_gate_ops, 1409 .parent_hws = (const struct clk_hw *[]) { 1410 &meson8b_vclk_div12_div.hw 1411 }, 1412 .num_parents = 1, 1413 .flags = CLK_SET_RATE_PARENT, 1414 }, 1415 }; 1416 1417 static struct clk_regmap meson8b_vclk2_in_sel = { 1418 .data = &(struct clk_regmap_mux_data){ 1419 .offset = HHI_VIID_CLK_CNTL, 1420 .mask = 0x7, 1421 .shift = 16, 1422 }, 1423 .hw.init = &(struct clk_init_data){ 1424 .name = "vclk2_in_sel", 1425 .ops = &clk_regmap_mux_ops, 1426 .parent_hws = meson8b_vclk_mux_parent_hws, 1427 .num_parents = ARRAY_SIZE(meson8b_vclk_mux_parent_hws), 1428 .flags = CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 1429 }, 1430 }; 1431 1432 static struct clk_regmap meson8b_vclk2_clk_in_en = { 1433 .data = &(struct clk_regmap_gate_data){ 1434 .offset = HHI_VIID_CLK_DIV, 1435 .bit_idx = 16, 1436 }, 1437 .hw.init = &(struct clk_init_data){ 1438 .name = "vclk2_in_en", 1439 .ops = &clk_regmap_gate_ops, 1440 .parent_hws = (const struct clk_hw *[]) { 1441 &meson8b_vclk2_in_sel.hw 1442 }, 1443 .num_parents = 1, 1444 .flags = CLK_SET_RATE_PARENT, 1445 }, 1446 }; 1447 1448 static struct clk_regmap meson8b_vclk2_clk_en = { 1449 .data = &(struct clk_regmap_gate_data){ 1450 .offset = HHI_VIID_CLK_DIV, 1451 .bit_idx = 19, 1452 }, 1453 .hw.init = &(struct clk_init_data){ 1454 .name = "vclk2_en", 1455 .ops = &clk_regmap_gate_ops, 1456 .parent_hws = (const struct clk_hw *[]) { 1457 &meson8b_vclk2_clk_in_en.hw 1458 }, 1459 .num_parents = 1, 1460 .flags = CLK_SET_RATE_PARENT, 1461 }, 1462 }; 1463 1464 static struct clk_regmap meson8b_vclk2_div1_gate = { 1465 .data = &(struct clk_regmap_gate_data){ 1466 .offset = HHI_VIID_CLK_DIV, 1467 .bit_idx = 0, 1468 }, 1469 .hw.init = &(struct clk_init_data){ 1470 .name = "vclk2_div1_en", 1471 .ops = &clk_regmap_gate_ops, 1472 .parent_hws = (const struct clk_hw *[]) { 1473 &meson8b_vclk2_clk_en.hw 1474 }, 1475 .num_parents = 1, 1476 .flags = CLK_SET_RATE_PARENT, 1477 }, 1478 }; 1479 1480 static struct clk_fixed_factor meson8b_vclk2_div2_div = { 1481 .mult = 1, 1482 .div = 2, 1483 .hw.init = &(struct clk_init_data){ 1484 .name = "vclk2_div2", 1485 .ops = &clk_fixed_factor_ops, 1486 .parent_hws = (const struct clk_hw *[]) { 1487 &meson8b_vclk2_clk_en.hw 1488 }, 1489 .num_parents = 1, 1490 .flags = CLK_SET_RATE_PARENT, 1491 } 1492 }; 1493 1494 static struct clk_regmap meson8b_vclk2_div2_div_gate = { 1495 .data = &(struct clk_regmap_gate_data){ 1496 .offset = HHI_VIID_CLK_DIV, 1497 .bit_idx = 1, 1498 }, 1499 .hw.init = &(struct clk_init_data){ 1500 .name = "vclk2_div2_en", 1501 .ops = &clk_regmap_gate_ops, 1502 .parent_hws = (const struct clk_hw *[]) { 1503 &meson8b_vclk2_div2_div.hw 1504 }, 1505 .num_parents = 1, 1506 .flags = CLK_SET_RATE_PARENT, 1507 }, 1508 }; 1509 1510 static struct clk_fixed_factor meson8b_vclk2_div4_div = { 1511 .mult = 1, 1512 .div = 4, 1513 .hw.init = &(struct clk_init_data){ 1514 .name = "vclk2_div4", 1515 .ops = &clk_fixed_factor_ops, 1516 .parent_hws = (const struct clk_hw *[]) { 1517 &meson8b_vclk2_clk_en.hw 1518 }, 1519 .num_parents = 1, 1520 .flags = CLK_SET_RATE_PARENT, 1521 } 1522 }; 1523 1524 static struct clk_regmap meson8b_vclk2_div4_div_gate = { 1525 .data = &(struct clk_regmap_gate_data){ 1526 .offset = HHI_VIID_CLK_DIV, 1527 .bit_idx = 2, 1528 }, 1529 .hw.init = &(struct clk_init_data){ 1530 .name = "vclk2_div4_en", 1531 .ops = &clk_regmap_gate_ops, 1532 .parent_hws = (const struct clk_hw *[]) { 1533 &meson8b_vclk2_div4_div.hw 1534 }, 1535 .num_parents = 1, 1536 .flags = CLK_SET_RATE_PARENT, 1537 }, 1538 }; 1539 1540 static struct clk_fixed_factor meson8b_vclk2_div6_div = { 1541 .mult = 1, 1542 .div = 6, 1543 .hw.init = &(struct clk_init_data){ 1544 .name = "vclk2_div6", 1545 .ops = &clk_fixed_factor_ops, 1546 .parent_hws = (const struct clk_hw *[]) { 1547 &meson8b_vclk2_clk_en.hw 1548 }, 1549 .num_parents = 1, 1550 .flags = CLK_SET_RATE_PARENT, 1551 } 1552 }; 1553 1554 static struct clk_regmap meson8b_vclk2_div6_div_gate = { 1555 .data = &(struct clk_regmap_gate_data){ 1556 .offset = HHI_VIID_CLK_DIV, 1557 .bit_idx = 3, 1558 }, 1559 .hw.init = &(struct clk_init_data){ 1560 .name = "vclk2_div6_en", 1561 .ops = &clk_regmap_gate_ops, 1562 .parent_hws = (const struct clk_hw *[]) { 1563 &meson8b_vclk2_div6_div.hw 1564 }, 1565 .num_parents = 1, 1566 .flags = CLK_SET_RATE_PARENT, 1567 }, 1568 }; 1569 1570 static struct clk_fixed_factor meson8b_vclk2_div12_div = { 1571 .mult = 1, 1572 .div = 12, 1573 .hw.init = &(struct clk_init_data){ 1574 .name = "vclk2_div12", 1575 .ops = &clk_fixed_factor_ops, 1576 .parent_hws = (const struct clk_hw *[]) { 1577 &meson8b_vclk2_clk_en.hw 1578 }, 1579 .num_parents = 1, 1580 .flags = CLK_SET_RATE_PARENT, 1581 } 1582 }; 1583 1584 static struct clk_regmap meson8b_vclk2_div12_div_gate = { 1585 .data = &(struct clk_regmap_gate_data){ 1586 .offset = HHI_VIID_CLK_DIV, 1587 .bit_idx = 4, 1588 }, 1589 .hw.init = &(struct clk_init_data){ 1590 .name = "vclk2_div12_en", 1591 .ops = &clk_regmap_gate_ops, 1592 .parent_hws = (const struct clk_hw *[]) { 1593 &meson8b_vclk2_div12_div.hw 1594 }, 1595 .num_parents = 1, 1596 .flags = CLK_SET_RATE_PARENT, 1597 }, 1598 }; 1599 1600 static const struct clk_hw *meson8b_vclk_enc_mux_parent_hws[] = { 1601 &meson8b_vclk_div1_gate.hw, 1602 &meson8b_vclk_div2_div_gate.hw, 1603 &meson8b_vclk_div4_div_gate.hw, 1604 &meson8b_vclk_div6_div_gate.hw, 1605 &meson8b_vclk_div12_div_gate.hw, 1606 }; 1607 1608 static struct clk_regmap meson8b_cts_enct_sel = { 1609 .data = &(struct clk_regmap_mux_data){ 1610 .offset = HHI_VID_CLK_DIV, 1611 .mask = 0xf, 1612 .shift = 20, 1613 }, 1614 .hw.init = &(struct clk_init_data){ 1615 .name = "cts_enct_sel", 1616 .ops = &clk_regmap_mux_ops, 1617 .parent_hws = meson8b_vclk_enc_mux_parent_hws, 1618 .num_parents = ARRAY_SIZE(meson8b_vclk_enc_mux_parent_hws), 1619 .flags = CLK_SET_RATE_PARENT, 1620 }, 1621 }; 1622 1623 static struct clk_regmap meson8b_cts_enct = { 1624 .data = &(struct clk_regmap_gate_data){ 1625 .offset = HHI_VID_CLK_CNTL2, 1626 .bit_idx = 1, 1627 }, 1628 .hw.init = &(struct clk_init_data){ 1629 .name = "cts_enct", 1630 .ops = &clk_regmap_gate_ops, 1631 .parent_hws = (const struct clk_hw *[]) { 1632 &meson8b_cts_enct_sel.hw 1633 }, 1634 .num_parents = 1, 1635 .flags = CLK_SET_RATE_PARENT, 1636 }, 1637 }; 1638 1639 static struct clk_regmap meson8b_cts_encp_sel = { 1640 .data = &(struct clk_regmap_mux_data){ 1641 .offset = HHI_VID_CLK_DIV, 1642 .mask = 0xf, 1643 .shift = 24, 1644 }, 1645 .hw.init = &(struct clk_init_data){ 1646 .name = "cts_encp_sel", 1647 .ops = &clk_regmap_mux_ops, 1648 .parent_hws = meson8b_vclk_enc_mux_parent_hws, 1649 .num_parents = ARRAY_SIZE(meson8b_vclk_enc_mux_parent_hws), 1650 .flags = CLK_SET_RATE_PARENT, 1651 }, 1652 }; 1653 1654 static struct clk_regmap meson8b_cts_encp = { 1655 .data = &(struct clk_regmap_gate_data){ 1656 .offset = HHI_VID_CLK_CNTL2, 1657 .bit_idx = 2, 1658 }, 1659 .hw.init = &(struct clk_init_data){ 1660 .name = "cts_encp", 1661 .ops = &clk_regmap_gate_ops, 1662 .parent_hws = (const struct clk_hw *[]) { 1663 &meson8b_cts_encp_sel.hw 1664 }, 1665 .num_parents = 1, 1666 .flags = CLK_SET_RATE_PARENT, 1667 }, 1668 }; 1669 1670 static struct clk_regmap meson8b_cts_enci_sel = { 1671 .data = &(struct clk_regmap_mux_data){ 1672 .offset = HHI_VID_CLK_DIV, 1673 .mask = 0xf, 1674 .shift = 28, 1675 }, 1676 .hw.init = &(struct clk_init_data){ 1677 .name = "cts_enci_sel", 1678 .ops = &clk_regmap_mux_ops, 1679 .parent_hws = meson8b_vclk_enc_mux_parent_hws, 1680 .num_parents = ARRAY_SIZE(meson8b_vclk_enc_mux_parent_hws), 1681 .flags = CLK_SET_RATE_PARENT, 1682 }, 1683 }; 1684 1685 static struct clk_regmap meson8b_cts_enci = { 1686 .data = &(struct clk_regmap_gate_data){ 1687 .offset = HHI_VID_CLK_CNTL2, 1688 .bit_idx = 0, 1689 }, 1690 .hw.init = &(struct clk_init_data){ 1691 .name = "cts_enci", 1692 .ops = &clk_regmap_gate_ops, 1693 .parent_hws = (const struct clk_hw *[]) { 1694 &meson8b_cts_enci_sel.hw 1695 }, 1696 .num_parents = 1, 1697 .flags = CLK_SET_RATE_PARENT, 1698 }, 1699 }; 1700 1701 static struct clk_regmap meson8b_hdmi_tx_pixel_sel = { 1702 .data = &(struct clk_regmap_mux_data){ 1703 .offset = HHI_HDMI_CLK_CNTL, 1704 .mask = 0xf, 1705 .shift = 16, 1706 }, 1707 .hw.init = &(struct clk_init_data){ 1708 .name = "hdmi_tx_pixel_sel", 1709 .ops = &clk_regmap_mux_ops, 1710 .parent_hws = meson8b_vclk_enc_mux_parent_hws, 1711 .num_parents = ARRAY_SIZE(meson8b_vclk_enc_mux_parent_hws), 1712 .flags = CLK_SET_RATE_PARENT, 1713 }, 1714 }; 1715 1716 static struct clk_regmap meson8b_hdmi_tx_pixel = { 1717 .data = &(struct clk_regmap_gate_data){ 1718 .offset = HHI_VID_CLK_CNTL2, 1719 .bit_idx = 5, 1720 }, 1721 .hw.init = &(struct clk_init_data){ 1722 .name = "hdmi_tx_pixel", 1723 .ops = &clk_regmap_gate_ops, 1724 .parent_hws = (const struct clk_hw *[]) { 1725 &meson8b_hdmi_tx_pixel_sel.hw 1726 }, 1727 .num_parents = 1, 1728 .flags = CLK_SET_RATE_PARENT, 1729 }, 1730 }; 1731 1732 static const struct clk_hw *meson8b_vclk2_enc_mux_parent_hws[] = { 1733 &meson8b_vclk2_div1_gate.hw, 1734 &meson8b_vclk2_div2_div_gate.hw, 1735 &meson8b_vclk2_div4_div_gate.hw, 1736 &meson8b_vclk2_div6_div_gate.hw, 1737 &meson8b_vclk2_div12_div_gate.hw, 1738 }; 1739 1740 static struct clk_regmap meson8b_cts_encl_sel = { 1741 .data = &(struct clk_regmap_mux_data){ 1742 .offset = HHI_VIID_CLK_DIV, 1743 .mask = 0xf, 1744 .shift = 12, 1745 }, 1746 .hw.init = &(struct clk_init_data){ 1747 .name = "cts_encl_sel", 1748 .ops = &clk_regmap_mux_ops, 1749 .parent_hws = meson8b_vclk2_enc_mux_parent_hws, 1750 .num_parents = ARRAY_SIZE(meson8b_vclk2_enc_mux_parent_hws), 1751 .flags = CLK_SET_RATE_PARENT, 1752 }, 1753 }; 1754 1755 static struct clk_regmap meson8b_cts_encl = { 1756 .data = &(struct clk_regmap_gate_data){ 1757 .offset = HHI_VID_CLK_CNTL2, 1758 .bit_idx = 3, 1759 }, 1760 .hw.init = &(struct clk_init_data){ 1761 .name = "cts_encl", 1762 .ops = &clk_regmap_gate_ops, 1763 .parent_hws = (const struct clk_hw *[]) { 1764 &meson8b_cts_encl_sel.hw 1765 }, 1766 .num_parents = 1, 1767 .flags = CLK_SET_RATE_PARENT, 1768 }, 1769 }; 1770 1771 static struct clk_regmap meson8b_cts_vdac0_sel = { 1772 .data = &(struct clk_regmap_mux_data){ 1773 .offset = HHI_VIID_CLK_DIV, 1774 .mask = 0xf, 1775 .shift = 28, 1776 }, 1777 .hw.init = &(struct clk_init_data){ 1778 .name = "cts_vdac0_sel", 1779 .ops = &clk_regmap_mux_ops, 1780 .parent_hws = meson8b_vclk2_enc_mux_parent_hws, 1781 .num_parents = ARRAY_SIZE(meson8b_vclk2_enc_mux_parent_hws), 1782 .flags = CLK_SET_RATE_PARENT, 1783 }, 1784 }; 1785 1786 static struct clk_regmap meson8b_cts_vdac0 = { 1787 .data = &(struct clk_regmap_gate_data){ 1788 .offset = HHI_VID_CLK_CNTL2, 1789 .bit_idx = 4, 1790 }, 1791 .hw.init = &(struct clk_init_data){ 1792 .name = "cts_vdac0", 1793 .ops = &clk_regmap_gate_ops, 1794 .parent_hws = (const struct clk_hw *[]) { 1795 &meson8b_cts_vdac0_sel.hw 1796 }, 1797 .num_parents = 1, 1798 .flags = CLK_SET_RATE_PARENT, 1799 }, 1800 }; 1801 1802 static struct clk_regmap meson8b_hdmi_sys_sel = { 1803 .data = &(struct clk_regmap_mux_data){ 1804 .offset = HHI_HDMI_CLK_CNTL, 1805 .mask = 0x3, 1806 .shift = 9, 1807 .flags = CLK_MUX_ROUND_CLOSEST, 1808 }, 1809 .hw.init = &(struct clk_init_data){ 1810 .name = "hdmi_sys_sel", 1811 .ops = &clk_regmap_mux_ops, 1812 /* FIXME: all other parents are unknown */ 1813 .parent_data = &(const struct clk_parent_data) { 1814 .fw_name = "xtal", 1815 .name = "xtal", 1816 .index = -1, 1817 }, 1818 .num_parents = 1, 1819 .flags = CLK_SET_RATE_NO_REPARENT, 1820 }, 1821 }; 1822 1823 static struct clk_regmap meson8b_hdmi_sys_div = { 1824 .data = &(struct clk_regmap_div_data){ 1825 .offset = HHI_HDMI_CLK_CNTL, 1826 .shift = 0, 1827 .width = 7, 1828 }, 1829 .hw.init = &(struct clk_init_data){ 1830 .name = "hdmi_sys_div", 1831 .ops = &clk_regmap_divider_ops, 1832 .parent_hws = (const struct clk_hw *[]) { 1833 &meson8b_hdmi_sys_sel.hw 1834 }, 1835 .num_parents = 1, 1836 .flags = CLK_SET_RATE_PARENT, 1837 }, 1838 }; 1839 1840 static struct clk_regmap meson8b_hdmi_sys = { 1841 .data = &(struct clk_regmap_gate_data){ 1842 .offset = HHI_HDMI_CLK_CNTL, 1843 .bit_idx = 8, 1844 }, 1845 .hw.init = &(struct clk_init_data) { 1846 .name = "hdmi_sys", 1847 .ops = &clk_regmap_gate_ops, 1848 .parent_hws = (const struct clk_hw *[]) { 1849 &meson8b_hdmi_sys_div.hw 1850 }, 1851 .num_parents = 1, 1852 .flags = CLK_SET_RATE_PARENT, 1853 }, 1854 }; 1855 1856 /* 1857 * The MALI IP is clocked by two identical clocks (mali_0 and mali_1) 1858 * muxed by a glitch-free switch on Meson8b and Meson8m2. The CCF can 1859 * actually manage this glitch-free mux because it does top-to-bottom 1860 * updates the each clock tree and switches to the "inactive" one when 1861 * CLK_SET_RATE_GATE is set. 1862 * Meson8 only has mali_0 and no glitch-free mux. 1863 */ 1864 static const struct clk_parent_data meson8b_mali_0_1_parent_data[] = { 1865 { .fw_name = "xtal", .name = "xtal", .index = -1, }, 1866 { .hw = &meson8b_mpll2.hw, }, 1867 { .hw = &meson8b_mpll1.hw, }, 1868 { .hw = &meson8b_fclk_div7.hw, }, 1869 { .hw = &meson8b_fclk_div4.hw, }, 1870 { .hw = &meson8b_fclk_div3.hw, }, 1871 { .hw = &meson8b_fclk_div5.hw, }, 1872 }; 1873 1874 static u32 meson8b_mali_0_1_mux_table[] = { 0, 2, 3, 4, 5, 6, 7 }; 1875 1876 static struct clk_regmap meson8b_mali_0_sel = { 1877 .data = &(struct clk_regmap_mux_data){ 1878 .offset = HHI_MALI_CLK_CNTL, 1879 .mask = 0x7, 1880 .shift = 9, 1881 .table = meson8b_mali_0_1_mux_table, 1882 }, 1883 .hw.init = &(struct clk_init_data){ 1884 .name = "mali_0_sel", 1885 .ops = &clk_regmap_mux_ops, 1886 .parent_data = meson8b_mali_0_1_parent_data, 1887 .num_parents = ARRAY_SIZE(meson8b_mali_0_1_parent_data), 1888 /* 1889 * Don't propagate rate changes up because the only changeable 1890 * parents are mpll1 and mpll2 but we need those for audio and 1891 * RGMII (Ethernet). We don't want to change the audio or 1892 * Ethernet clocks when setting the GPU frequency. 1893 */ 1894 .flags = 0, 1895 }, 1896 }; 1897 1898 static struct clk_regmap meson8b_mali_0_div = { 1899 .data = &(struct clk_regmap_div_data){ 1900 .offset = HHI_MALI_CLK_CNTL, 1901 .shift = 0, 1902 .width = 7, 1903 }, 1904 .hw.init = &(struct clk_init_data){ 1905 .name = "mali_0_div", 1906 .ops = &clk_regmap_divider_ops, 1907 .parent_hws = (const struct clk_hw *[]) { 1908 &meson8b_mali_0_sel.hw 1909 }, 1910 .num_parents = 1, 1911 .flags = CLK_SET_RATE_PARENT, 1912 }, 1913 }; 1914 1915 static struct clk_regmap meson8b_mali_0 = { 1916 .data = &(struct clk_regmap_gate_data){ 1917 .offset = HHI_MALI_CLK_CNTL, 1918 .bit_idx = 8, 1919 }, 1920 .hw.init = &(struct clk_init_data){ 1921 .name = "mali_0", 1922 .ops = &clk_regmap_gate_ops, 1923 .parent_hws = (const struct clk_hw *[]) { 1924 &meson8b_mali_0_div.hw 1925 }, 1926 .num_parents = 1, 1927 .flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT, 1928 }, 1929 }; 1930 1931 static struct clk_regmap meson8b_mali_1_sel = { 1932 .data = &(struct clk_regmap_mux_data){ 1933 .offset = HHI_MALI_CLK_CNTL, 1934 .mask = 0x7, 1935 .shift = 25, 1936 .table = meson8b_mali_0_1_mux_table, 1937 }, 1938 .hw.init = &(struct clk_init_data){ 1939 .name = "mali_1_sel", 1940 .ops = &clk_regmap_mux_ops, 1941 .parent_data = meson8b_mali_0_1_parent_data, 1942 .num_parents = ARRAY_SIZE(meson8b_mali_0_1_parent_data), 1943 /* 1944 * Don't propagate rate changes up because the only changeable 1945 * parents are mpll1 and mpll2 but we need those for audio and 1946 * RGMII (Ethernet). We don't want to change the audio or 1947 * Ethernet clocks when setting the GPU frequency. 1948 */ 1949 .flags = 0, 1950 }, 1951 }; 1952 1953 static struct clk_regmap meson8b_mali_1_div = { 1954 .data = &(struct clk_regmap_div_data){ 1955 .offset = HHI_MALI_CLK_CNTL, 1956 .shift = 16, 1957 .width = 7, 1958 }, 1959 .hw.init = &(struct clk_init_data){ 1960 .name = "mali_1_div", 1961 .ops = &clk_regmap_divider_ops, 1962 .parent_hws = (const struct clk_hw *[]) { 1963 &meson8b_mali_1_sel.hw 1964 }, 1965 .num_parents = 1, 1966 .flags = CLK_SET_RATE_PARENT, 1967 }, 1968 }; 1969 1970 static struct clk_regmap meson8b_mali_1 = { 1971 .data = &(struct clk_regmap_gate_data){ 1972 .offset = HHI_MALI_CLK_CNTL, 1973 .bit_idx = 24, 1974 }, 1975 .hw.init = &(struct clk_init_data){ 1976 .name = "mali_1", 1977 .ops = &clk_regmap_gate_ops, 1978 .parent_hws = (const struct clk_hw *[]) { 1979 &meson8b_mali_1_div.hw 1980 }, 1981 .num_parents = 1, 1982 .flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT, 1983 }, 1984 }; 1985 1986 static struct clk_regmap meson8b_mali = { 1987 .data = &(struct clk_regmap_mux_data){ 1988 .offset = HHI_MALI_CLK_CNTL, 1989 .mask = 1, 1990 .shift = 31, 1991 }, 1992 .hw.init = &(struct clk_init_data){ 1993 .name = "mali", 1994 .ops = &clk_regmap_mux_ops, 1995 .parent_hws = (const struct clk_hw *[]) { 1996 &meson8b_mali_0.hw, 1997 &meson8b_mali_1.hw, 1998 }, 1999 .num_parents = 2, 2000 .flags = CLK_SET_RATE_PARENT, 2001 }, 2002 }; 2003 2004 static const struct reg_sequence meson8m2_gp_pll_init_regs[] = { 2005 { .reg = HHI_GP_PLL_CNTL2, .def = 0x59c88000 }, 2006 { .reg = HHI_GP_PLL_CNTL3, .def = 0xca463823 }, 2007 { .reg = HHI_GP_PLL_CNTL4, .def = 0x0286a027 }, 2008 { .reg = HHI_GP_PLL_CNTL5, .def = 0x00003000 }, 2009 }; 2010 2011 static const struct pll_params_table meson8m2_gp_pll_params_table[] = { 2012 PLL_PARAMS(182, 3), 2013 { /* sentinel */ }, 2014 }; 2015 2016 static struct clk_regmap meson8m2_gp_pll_dco = { 2017 .data = &(struct meson_clk_pll_data){ 2018 .en = { 2019 .reg_off = HHI_GP_PLL_CNTL, 2020 .shift = 30, 2021 .width = 1, 2022 }, 2023 .m = { 2024 .reg_off = HHI_GP_PLL_CNTL, 2025 .shift = 0, 2026 .width = 9, 2027 }, 2028 .n = { 2029 .reg_off = HHI_GP_PLL_CNTL, 2030 .shift = 9, 2031 .width = 5, 2032 }, 2033 .l = { 2034 .reg_off = HHI_GP_PLL_CNTL, 2035 .shift = 31, 2036 .width = 1, 2037 }, 2038 .rst = { 2039 .reg_off = HHI_GP_PLL_CNTL, 2040 .shift = 29, 2041 .width = 1, 2042 }, 2043 .table = meson8m2_gp_pll_params_table, 2044 .init_regs = meson8m2_gp_pll_init_regs, 2045 .init_count = ARRAY_SIZE(meson8m2_gp_pll_init_regs), 2046 }, 2047 .hw.init = &(struct clk_init_data){ 2048 .name = "gp_pll_dco", 2049 .ops = &meson_clk_pll_ops, 2050 .parent_data = &(const struct clk_parent_data) { 2051 .fw_name = "xtal", 2052 .name = "xtal", 2053 .index = -1, 2054 }, 2055 .num_parents = 1, 2056 }, 2057 }; 2058 2059 static struct clk_regmap meson8m2_gp_pll = { 2060 .data = &(struct clk_regmap_div_data){ 2061 .offset = HHI_GP_PLL_CNTL, 2062 .shift = 16, 2063 .width = 2, 2064 .flags = CLK_DIVIDER_POWER_OF_TWO, 2065 }, 2066 .hw.init = &(struct clk_init_data){ 2067 .name = "gp_pll", 2068 .ops = &clk_regmap_divider_ops, 2069 .parent_hws = (const struct clk_hw *[]) { 2070 &meson8m2_gp_pll_dco.hw 2071 }, 2072 .num_parents = 1, 2073 .flags = CLK_SET_RATE_PARENT, 2074 }, 2075 }; 2076 2077 static const struct clk_hw *meson8b_vpu_0_1_parent_hws[] = { 2078 &meson8b_fclk_div4.hw, 2079 &meson8b_fclk_div3.hw, 2080 &meson8b_fclk_div5.hw, 2081 &meson8b_fclk_div7.hw, 2082 }; 2083 2084 static const struct clk_hw *mmeson8m2_vpu_0_1_parent_hws[] = { 2085 &meson8b_fclk_div4.hw, 2086 &meson8b_fclk_div3.hw, 2087 &meson8b_fclk_div5.hw, 2088 &meson8m2_gp_pll.hw, 2089 }; 2090 2091 static struct clk_regmap meson8b_vpu_0_sel = { 2092 .data = &(struct clk_regmap_mux_data){ 2093 .offset = HHI_VPU_CLK_CNTL, 2094 .mask = 0x3, 2095 .shift = 9, 2096 }, 2097 .hw.init = &(struct clk_init_data){ 2098 .name = "vpu_0_sel", 2099 .ops = &clk_regmap_mux_ops, 2100 .parent_hws = meson8b_vpu_0_1_parent_hws, 2101 .num_parents = ARRAY_SIZE(meson8b_vpu_0_1_parent_hws), 2102 .flags = CLK_SET_RATE_PARENT, 2103 }, 2104 }; 2105 2106 static struct clk_regmap meson8m2_vpu_0_sel = { 2107 .data = &(struct clk_regmap_mux_data){ 2108 .offset = HHI_VPU_CLK_CNTL, 2109 .mask = 0x3, 2110 .shift = 9, 2111 }, 2112 .hw.init = &(struct clk_init_data){ 2113 .name = "vpu_0_sel", 2114 .ops = &clk_regmap_mux_ops, 2115 .parent_hws = mmeson8m2_vpu_0_1_parent_hws, 2116 .num_parents = ARRAY_SIZE(mmeson8m2_vpu_0_1_parent_hws), 2117 .flags = CLK_SET_RATE_PARENT, 2118 }, 2119 }; 2120 2121 static struct clk_regmap meson8b_vpu_0_div = { 2122 .data = &(struct clk_regmap_div_data){ 2123 .offset = HHI_VPU_CLK_CNTL, 2124 .shift = 0, 2125 .width = 7, 2126 }, 2127 .hw.init = &(struct clk_init_data){ 2128 .name = "vpu_0_div", 2129 .ops = &clk_regmap_divider_ops, 2130 .parent_data = &(const struct clk_parent_data) { 2131 /* 2132 * Note: 2133 * meson8b and meson8m2 have different vpu_0_sels (with 2134 * different struct clk_hw). We fallback to the global 2135 * naming string mechanism so vpu_0_div picks up the 2136 * appropriate one. 2137 */ 2138 .name = "vpu_0_sel", 2139 .index = -1, 2140 }, 2141 .num_parents = 1, 2142 .flags = CLK_SET_RATE_PARENT, 2143 }, 2144 }; 2145 2146 static struct clk_regmap meson8b_vpu_0 = { 2147 .data = &(struct clk_regmap_gate_data){ 2148 .offset = HHI_VPU_CLK_CNTL, 2149 .bit_idx = 8, 2150 }, 2151 .hw.init = &(struct clk_init_data) { 2152 .name = "vpu_0", 2153 .ops = &clk_regmap_gate_ops, 2154 .parent_hws = (const struct clk_hw *[]) { 2155 &meson8b_vpu_0_div.hw 2156 }, 2157 .num_parents = 1, 2158 .flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT, 2159 }, 2160 }; 2161 2162 static struct clk_regmap meson8b_vpu_1_sel = { 2163 .data = &(struct clk_regmap_mux_data){ 2164 .offset = HHI_VPU_CLK_CNTL, 2165 .mask = 0x3, 2166 .shift = 25, 2167 }, 2168 .hw.init = &(struct clk_init_data){ 2169 .name = "vpu_1_sel", 2170 .ops = &clk_regmap_mux_ops, 2171 .parent_hws = meson8b_vpu_0_1_parent_hws, 2172 .num_parents = ARRAY_SIZE(meson8b_vpu_0_1_parent_hws), 2173 .flags = CLK_SET_RATE_PARENT, 2174 }, 2175 }; 2176 2177 static struct clk_regmap meson8m2_vpu_1_sel = { 2178 .data = &(struct clk_regmap_mux_data){ 2179 .offset = HHI_VPU_CLK_CNTL, 2180 .mask = 0x3, 2181 .shift = 25, 2182 }, 2183 .hw.init = &(struct clk_init_data){ 2184 .name = "vpu_1_sel", 2185 .ops = &clk_regmap_mux_ops, 2186 .parent_hws = mmeson8m2_vpu_0_1_parent_hws, 2187 .num_parents = ARRAY_SIZE(mmeson8m2_vpu_0_1_parent_hws), 2188 .flags = CLK_SET_RATE_PARENT, 2189 }, 2190 }; 2191 2192 static struct clk_regmap meson8b_vpu_1_div = { 2193 .data = &(struct clk_regmap_div_data){ 2194 .offset = HHI_VPU_CLK_CNTL, 2195 .shift = 16, 2196 .width = 7, 2197 }, 2198 .hw.init = &(struct clk_init_data){ 2199 .name = "vpu_1_div", 2200 .ops = &clk_regmap_divider_ops, 2201 .parent_data = &(const struct clk_parent_data) { 2202 /* 2203 * Note: 2204 * meson8b and meson8m2 have different vpu_1_sels (with 2205 * different struct clk_hw). We fallback to the global 2206 * naming string mechanism so vpu_1_div picks up the 2207 * appropriate one. 2208 */ 2209 .name = "vpu_1_sel", 2210 .index = -1, 2211 }, 2212 .num_parents = 1, 2213 .flags = CLK_SET_RATE_PARENT, 2214 }, 2215 }; 2216 2217 static struct clk_regmap meson8b_vpu_1 = { 2218 .data = &(struct clk_regmap_gate_data){ 2219 .offset = HHI_VPU_CLK_CNTL, 2220 .bit_idx = 24, 2221 }, 2222 .hw.init = &(struct clk_init_data) { 2223 .name = "vpu_1", 2224 .ops = &clk_regmap_gate_ops, 2225 .parent_hws = (const struct clk_hw *[]) { 2226 &meson8b_vpu_1_div.hw 2227 }, 2228 .num_parents = 1, 2229 .flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT, 2230 }, 2231 }; 2232 2233 /* 2234 * The VPU clock has two identical clock trees (vpu_0 and vpu_1) 2235 * muxed by a glitch-free switch on Meson8b and Meson8m2. The CCF can 2236 * actually manage this glitch-free mux because it does top-to-bottom 2237 * updates the each clock tree and switches to the "inactive" one when 2238 * CLK_SET_RATE_GATE is set. 2239 * Meson8 only has vpu_0 and no glitch-free mux. 2240 */ 2241 static struct clk_regmap meson8b_vpu = { 2242 .data = &(struct clk_regmap_mux_data){ 2243 .offset = HHI_VPU_CLK_CNTL, 2244 .mask = 1, 2245 .shift = 31, 2246 }, 2247 .hw.init = &(struct clk_init_data){ 2248 .name = "vpu", 2249 .ops = &clk_regmap_mux_ops, 2250 .parent_hws = (const struct clk_hw *[]) { 2251 &meson8b_vpu_0.hw, 2252 &meson8b_vpu_1.hw, 2253 }, 2254 .num_parents = 2, 2255 .flags = CLK_SET_RATE_PARENT, 2256 }, 2257 }; 2258 2259 static const struct clk_hw *meson8b_vdec_parent_hws[] = { 2260 &meson8b_fclk_div4.hw, 2261 &meson8b_fclk_div3.hw, 2262 &meson8b_fclk_div5.hw, 2263 &meson8b_fclk_div7.hw, 2264 &meson8b_mpll2.hw, 2265 &meson8b_mpll1.hw, 2266 }; 2267 2268 static struct clk_regmap meson8b_vdec_1_sel = { 2269 .data = &(struct clk_regmap_mux_data){ 2270 .offset = HHI_VDEC_CLK_CNTL, 2271 .mask = 0x3, 2272 .shift = 9, 2273 .flags = CLK_MUX_ROUND_CLOSEST, 2274 }, 2275 .hw.init = &(struct clk_init_data){ 2276 .name = "vdec_1_sel", 2277 .ops = &clk_regmap_mux_ops, 2278 .parent_hws = meson8b_vdec_parent_hws, 2279 .num_parents = ARRAY_SIZE(meson8b_vdec_parent_hws), 2280 .flags = CLK_SET_RATE_PARENT, 2281 }, 2282 }; 2283 2284 static struct clk_regmap meson8b_vdec_1_1_div = { 2285 .data = &(struct clk_regmap_div_data){ 2286 .offset = HHI_VDEC_CLK_CNTL, 2287 .shift = 0, 2288 .width = 7, 2289 .flags = CLK_DIVIDER_ROUND_CLOSEST, 2290 }, 2291 .hw.init = &(struct clk_init_data){ 2292 .name = "vdec_1_1_div", 2293 .ops = &clk_regmap_divider_ops, 2294 .parent_hws = (const struct clk_hw *[]) { 2295 &meson8b_vdec_1_sel.hw 2296 }, 2297 .num_parents = 1, 2298 .flags = CLK_SET_RATE_PARENT, 2299 }, 2300 }; 2301 2302 static struct clk_regmap meson8b_vdec_1_1 = { 2303 .data = &(struct clk_regmap_gate_data){ 2304 .offset = HHI_VDEC_CLK_CNTL, 2305 .bit_idx = 8, 2306 }, 2307 .hw.init = &(struct clk_init_data) { 2308 .name = "vdec_1_1", 2309 .ops = &clk_regmap_gate_ops, 2310 .parent_hws = (const struct clk_hw *[]) { 2311 &meson8b_vdec_1_1_div.hw 2312 }, 2313 .num_parents = 1, 2314 .flags = CLK_SET_RATE_PARENT, 2315 }, 2316 }; 2317 2318 static struct clk_regmap meson8b_vdec_1_2_div = { 2319 .data = &(struct clk_regmap_div_data){ 2320 .offset = HHI_VDEC3_CLK_CNTL, 2321 .shift = 0, 2322 .width = 7, 2323 .flags = CLK_DIVIDER_ROUND_CLOSEST, 2324 }, 2325 .hw.init = &(struct clk_init_data){ 2326 .name = "vdec_1_2_div", 2327 .ops = &clk_regmap_divider_ops, 2328 .parent_hws = (const struct clk_hw *[]) { 2329 &meson8b_vdec_1_sel.hw 2330 }, 2331 .num_parents = 1, 2332 .flags = CLK_SET_RATE_PARENT, 2333 }, 2334 }; 2335 2336 static struct clk_regmap meson8b_vdec_1_2 = { 2337 .data = &(struct clk_regmap_gate_data){ 2338 .offset = HHI_VDEC3_CLK_CNTL, 2339 .bit_idx = 8, 2340 }, 2341 .hw.init = &(struct clk_init_data) { 2342 .name = "vdec_1_2", 2343 .ops = &clk_regmap_gate_ops, 2344 .parent_hws = (const struct clk_hw *[]) { 2345 &meson8b_vdec_1_2_div.hw 2346 }, 2347 .num_parents = 1, 2348 .flags = CLK_SET_RATE_PARENT, 2349 }, 2350 }; 2351 2352 static struct clk_regmap meson8b_vdec_1 = { 2353 .data = &(struct clk_regmap_mux_data){ 2354 .offset = HHI_VDEC3_CLK_CNTL, 2355 .mask = 0x1, 2356 .shift = 15, 2357 .flags = CLK_MUX_ROUND_CLOSEST, 2358 }, 2359 .hw.init = &(struct clk_init_data){ 2360 .name = "vdec_1", 2361 .ops = &clk_regmap_mux_ops, 2362 .parent_hws = (const struct clk_hw *[]) { 2363 &meson8b_vdec_1_1.hw, 2364 &meson8b_vdec_1_2.hw, 2365 }, 2366 .num_parents = 2, 2367 .flags = CLK_SET_RATE_PARENT, 2368 }, 2369 }; 2370 2371 static struct clk_regmap meson8b_vdec_hcodec_sel = { 2372 .data = &(struct clk_regmap_mux_data){ 2373 .offset = HHI_VDEC_CLK_CNTL, 2374 .mask = 0x3, 2375 .shift = 25, 2376 .flags = CLK_MUX_ROUND_CLOSEST, 2377 }, 2378 .hw.init = &(struct clk_init_data){ 2379 .name = "vdec_hcodec_sel", 2380 .ops = &clk_regmap_mux_ops, 2381 .parent_hws = meson8b_vdec_parent_hws, 2382 .num_parents = ARRAY_SIZE(meson8b_vdec_parent_hws), 2383 .flags = CLK_SET_RATE_PARENT, 2384 }, 2385 }; 2386 2387 static struct clk_regmap meson8b_vdec_hcodec_div = { 2388 .data = &(struct clk_regmap_div_data){ 2389 .offset = HHI_VDEC_CLK_CNTL, 2390 .shift = 16, 2391 .width = 7, 2392 .flags = CLK_DIVIDER_ROUND_CLOSEST, 2393 }, 2394 .hw.init = &(struct clk_init_data){ 2395 .name = "vdec_hcodec_div", 2396 .ops = &clk_regmap_divider_ops, 2397 .parent_hws = (const struct clk_hw *[]) { 2398 &meson8b_vdec_hcodec_sel.hw 2399 }, 2400 .num_parents = 1, 2401 .flags = CLK_SET_RATE_PARENT, 2402 }, 2403 }; 2404 2405 static struct clk_regmap meson8b_vdec_hcodec = { 2406 .data = &(struct clk_regmap_gate_data){ 2407 .offset = HHI_VDEC_CLK_CNTL, 2408 .bit_idx = 24, 2409 }, 2410 .hw.init = &(struct clk_init_data) { 2411 .name = "vdec_hcodec", 2412 .ops = &clk_regmap_gate_ops, 2413 .parent_hws = (const struct clk_hw *[]) { 2414 &meson8b_vdec_hcodec_div.hw 2415 }, 2416 .num_parents = 1, 2417 .flags = CLK_SET_RATE_PARENT, 2418 }, 2419 }; 2420 2421 static struct clk_regmap meson8b_vdec_2_sel = { 2422 .data = &(struct clk_regmap_mux_data){ 2423 .offset = HHI_VDEC2_CLK_CNTL, 2424 .mask = 0x3, 2425 .shift = 9, 2426 .flags = CLK_MUX_ROUND_CLOSEST, 2427 }, 2428 .hw.init = &(struct clk_init_data){ 2429 .name = "vdec_2_sel", 2430 .ops = &clk_regmap_mux_ops, 2431 .parent_hws = meson8b_vdec_parent_hws, 2432 .num_parents = ARRAY_SIZE(meson8b_vdec_parent_hws), 2433 .flags = CLK_SET_RATE_PARENT, 2434 }, 2435 }; 2436 2437 static struct clk_regmap meson8b_vdec_2_div = { 2438 .data = &(struct clk_regmap_div_data){ 2439 .offset = HHI_VDEC2_CLK_CNTL, 2440 .shift = 0, 2441 .width = 7, 2442 .flags = CLK_DIVIDER_ROUND_CLOSEST, 2443 }, 2444 .hw.init = &(struct clk_init_data){ 2445 .name = "vdec_2_div", 2446 .ops = &clk_regmap_divider_ops, 2447 .parent_hws = (const struct clk_hw *[]) { 2448 &meson8b_vdec_2_sel.hw 2449 }, 2450 .num_parents = 1, 2451 .flags = CLK_SET_RATE_PARENT, 2452 }, 2453 }; 2454 2455 static struct clk_regmap meson8b_vdec_2 = { 2456 .data = &(struct clk_regmap_gate_data){ 2457 .offset = HHI_VDEC2_CLK_CNTL, 2458 .bit_idx = 8, 2459 }, 2460 .hw.init = &(struct clk_init_data) { 2461 .name = "vdec_2", 2462 .ops = &clk_regmap_gate_ops, 2463 .parent_hws = (const struct clk_hw *[]) { 2464 &meson8b_vdec_2_div.hw 2465 }, 2466 .num_parents = 1, 2467 .flags = CLK_SET_RATE_PARENT, 2468 }, 2469 }; 2470 2471 static struct clk_regmap meson8b_vdec_hevc_sel = { 2472 .data = &(struct clk_regmap_mux_data){ 2473 .offset = HHI_VDEC2_CLK_CNTL, 2474 .mask = 0x3, 2475 .shift = 25, 2476 .flags = CLK_MUX_ROUND_CLOSEST, 2477 }, 2478 .hw.init = &(struct clk_init_data){ 2479 .name = "vdec_hevc_sel", 2480 .ops = &clk_regmap_mux_ops, 2481 .parent_hws = meson8b_vdec_parent_hws, 2482 .num_parents = ARRAY_SIZE(meson8b_vdec_parent_hws), 2483 .flags = CLK_SET_RATE_PARENT, 2484 }, 2485 }; 2486 2487 static struct clk_regmap meson8b_vdec_hevc_div = { 2488 .data = &(struct clk_regmap_div_data){ 2489 .offset = HHI_VDEC2_CLK_CNTL, 2490 .shift = 16, 2491 .width = 7, 2492 .flags = CLK_DIVIDER_ROUND_CLOSEST, 2493 }, 2494 .hw.init = &(struct clk_init_data){ 2495 .name = "vdec_hevc_div", 2496 .ops = &clk_regmap_divider_ops, 2497 .parent_hws = (const struct clk_hw *[]) { 2498 &meson8b_vdec_hevc_sel.hw 2499 }, 2500 .num_parents = 1, 2501 .flags = CLK_SET_RATE_PARENT, 2502 }, 2503 }; 2504 2505 static struct clk_regmap meson8b_vdec_hevc_en = { 2506 .data = &(struct clk_regmap_gate_data){ 2507 .offset = HHI_VDEC2_CLK_CNTL, 2508 .bit_idx = 24, 2509 }, 2510 .hw.init = &(struct clk_init_data) { 2511 .name = "vdec_hevc_en", 2512 .ops = &clk_regmap_gate_ops, 2513 .parent_hws = (const struct clk_hw *[]) { 2514 &meson8b_vdec_hevc_div.hw 2515 }, 2516 .num_parents = 1, 2517 .flags = CLK_SET_RATE_PARENT, 2518 }, 2519 }; 2520 2521 static struct clk_regmap meson8b_vdec_hevc = { 2522 .data = &(struct clk_regmap_mux_data){ 2523 .offset = HHI_VDEC2_CLK_CNTL, 2524 .mask = 0x1, 2525 .shift = 31, 2526 .flags = CLK_MUX_ROUND_CLOSEST, 2527 }, 2528 .hw.init = &(struct clk_init_data){ 2529 .name = "vdec_hevc", 2530 .ops = &clk_regmap_mux_ops, 2531 /* TODO: The second parent is currently unknown */ 2532 .parent_hws = (const struct clk_hw *[]) { 2533 &meson8b_vdec_hevc_en.hw 2534 }, 2535 .num_parents = 1, 2536 .flags = CLK_SET_RATE_PARENT, 2537 }, 2538 }; 2539 2540 /* TODO: the clock at index 0 is "DDR_PLL" which we don't support yet */ 2541 static const struct clk_hw *meson8b_cts_amclk_parent_hws[] = { 2542 &meson8b_mpll0.hw, 2543 &meson8b_mpll1.hw, 2544 &meson8b_mpll2.hw 2545 }; 2546 2547 static u32 meson8b_cts_amclk_mux_table[] = { 1, 2, 3 }; 2548 2549 static struct clk_regmap meson8b_cts_amclk_sel = { 2550 .data = &(struct clk_regmap_mux_data){ 2551 .offset = HHI_AUD_CLK_CNTL, 2552 .mask = 0x3, 2553 .shift = 9, 2554 .table = meson8b_cts_amclk_mux_table, 2555 .flags = CLK_MUX_ROUND_CLOSEST, 2556 }, 2557 .hw.init = &(struct clk_init_data){ 2558 .name = "cts_amclk_sel", 2559 .ops = &clk_regmap_mux_ops, 2560 .parent_hws = meson8b_cts_amclk_parent_hws, 2561 .num_parents = ARRAY_SIZE(meson8b_cts_amclk_parent_hws), 2562 }, 2563 }; 2564 2565 static struct clk_regmap meson8b_cts_amclk_div = { 2566 .data = &(struct clk_regmap_div_data) { 2567 .offset = HHI_AUD_CLK_CNTL, 2568 .shift = 0, 2569 .width = 8, 2570 .flags = CLK_DIVIDER_ROUND_CLOSEST, 2571 }, 2572 .hw.init = &(struct clk_init_data){ 2573 .name = "cts_amclk_div", 2574 .ops = &clk_regmap_divider_ops, 2575 .parent_hws = (const struct clk_hw *[]) { 2576 &meson8b_cts_amclk_sel.hw 2577 }, 2578 .num_parents = 1, 2579 .flags = CLK_SET_RATE_PARENT, 2580 }, 2581 }; 2582 2583 static struct clk_regmap meson8b_cts_amclk = { 2584 .data = &(struct clk_regmap_gate_data){ 2585 .offset = HHI_AUD_CLK_CNTL, 2586 .bit_idx = 8, 2587 }, 2588 .hw.init = &(struct clk_init_data){ 2589 .name = "cts_amclk", 2590 .ops = &clk_regmap_gate_ops, 2591 .parent_hws = (const struct clk_hw *[]) { 2592 &meson8b_cts_amclk_div.hw 2593 }, 2594 .num_parents = 1, 2595 .flags = CLK_SET_RATE_PARENT, 2596 }, 2597 }; 2598 2599 /* TODO: the clock at index 0 is "DDR_PLL" which we don't support yet */ 2600 static const struct clk_hw *meson8b_cts_mclk_i958_parent_hws[] = { 2601 &meson8b_mpll0.hw, 2602 &meson8b_mpll1.hw, 2603 &meson8b_mpll2.hw 2604 }; 2605 2606 static u32 meson8b_cts_mclk_i958_mux_table[] = { 1, 2, 3 }; 2607 2608 static struct clk_regmap meson8b_cts_mclk_i958_sel = { 2609 .data = &(struct clk_regmap_mux_data){ 2610 .offset = HHI_AUD_CLK_CNTL2, 2611 .mask = 0x3, 2612 .shift = 25, 2613 .table = meson8b_cts_mclk_i958_mux_table, 2614 .flags = CLK_MUX_ROUND_CLOSEST, 2615 }, 2616 .hw.init = &(struct clk_init_data) { 2617 .name = "cts_mclk_i958_sel", 2618 .ops = &clk_regmap_mux_ops, 2619 .parent_hws = meson8b_cts_mclk_i958_parent_hws, 2620 .num_parents = ARRAY_SIZE(meson8b_cts_mclk_i958_parent_hws), 2621 }, 2622 }; 2623 2624 static struct clk_regmap meson8b_cts_mclk_i958_div = { 2625 .data = &(struct clk_regmap_div_data){ 2626 .offset = HHI_AUD_CLK_CNTL2, 2627 .shift = 16, 2628 .width = 8, 2629 .flags = CLK_DIVIDER_ROUND_CLOSEST, 2630 }, 2631 .hw.init = &(struct clk_init_data) { 2632 .name = "cts_mclk_i958_div", 2633 .ops = &clk_regmap_divider_ops, 2634 .parent_hws = (const struct clk_hw *[]) { 2635 &meson8b_cts_mclk_i958_sel.hw 2636 }, 2637 .num_parents = 1, 2638 .flags = CLK_SET_RATE_PARENT, 2639 }, 2640 }; 2641 2642 static struct clk_regmap meson8b_cts_mclk_i958 = { 2643 .data = &(struct clk_regmap_gate_data){ 2644 .offset = HHI_AUD_CLK_CNTL2, 2645 .bit_idx = 24, 2646 }, 2647 .hw.init = &(struct clk_init_data){ 2648 .name = "cts_mclk_i958", 2649 .ops = &clk_regmap_gate_ops, 2650 .parent_hws = (const struct clk_hw *[]) { 2651 &meson8b_cts_mclk_i958_div.hw 2652 }, 2653 .num_parents = 1, 2654 .flags = CLK_SET_RATE_PARENT, 2655 }, 2656 }; 2657 2658 static struct clk_regmap meson8b_cts_i958 = { 2659 .data = &(struct clk_regmap_mux_data){ 2660 .offset = HHI_AUD_CLK_CNTL2, 2661 .mask = 0x1, 2662 .shift = 27, 2663 }, 2664 .hw.init = &(struct clk_init_data){ 2665 .name = "cts_i958", 2666 .ops = &clk_regmap_mux_ops, 2667 .parent_hws = (const struct clk_hw *[]) { 2668 &meson8b_cts_amclk.hw, 2669 &meson8b_cts_mclk_i958.hw 2670 }, 2671 .num_parents = 2, 2672 /* 2673 * The parent is specific to origin of the audio data. Let the 2674 * consumer choose the appropriate parent. 2675 */ 2676 .flags = CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 2677 }, 2678 }; 2679 2680 #define MESON_GATE(_name, _reg, _bit) \ 2681 MESON_PCLK(_name, _reg, _bit, &meson8b_clk81.hw) 2682 2683 /* Everything Else (EE) domain gates */ 2684 2685 static MESON_GATE(meson8b_ddr, HHI_GCLK_MPEG0, 0); 2686 static MESON_GATE(meson8b_dos, HHI_GCLK_MPEG0, 1); 2687 static MESON_GATE(meson8b_isa, HHI_GCLK_MPEG0, 5); 2688 static MESON_GATE(meson8b_pl301, HHI_GCLK_MPEG0, 6); 2689 static MESON_GATE(meson8b_periphs, HHI_GCLK_MPEG0, 7); 2690 static MESON_GATE(meson8b_spicc, HHI_GCLK_MPEG0, 8); 2691 static MESON_GATE(meson8b_i2c, HHI_GCLK_MPEG0, 9); 2692 static MESON_GATE(meson8b_sar_adc, HHI_GCLK_MPEG0, 10); 2693 static MESON_GATE(meson8b_smart_card, HHI_GCLK_MPEG0, 11); 2694 static MESON_GATE(meson8b_rng0, HHI_GCLK_MPEG0, 12); 2695 static MESON_GATE(meson8b_uart0, HHI_GCLK_MPEG0, 13); 2696 static MESON_GATE(meson8b_sdhc, HHI_GCLK_MPEG0, 14); 2697 static MESON_GATE(meson8b_stream, HHI_GCLK_MPEG0, 15); 2698 static MESON_GATE(meson8b_async_fifo, HHI_GCLK_MPEG0, 16); 2699 static MESON_GATE(meson8b_sdio, HHI_GCLK_MPEG0, 17); 2700 static MESON_GATE(meson8b_abuf, HHI_GCLK_MPEG0, 18); 2701 static MESON_GATE(meson8b_hiu_iface, HHI_GCLK_MPEG0, 19); 2702 static MESON_GATE(meson8b_assist_misc, HHI_GCLK_MPEG0, 23); 2703 static MESON_GATE(meson8b_spi, HHI_GCLK_MPEG0, 30); 2704 2705 static MESON_GATE(meson8b_i2s_spdif, HHI_GCLK_MPEG1, 2); 2706 static MESON_GATE(meson8b_eth, HHI_GCLK_MPEG1, 3); 2707 static MESON_GATE(meson8b_demux, HHI_GCLK_MPEG1, 4); 2708 static MESON_GATE(meson8b_blkmv, HHI_GCLK_MPEG1, 14); 2709 static MESON_GATE(meson8b_aiu, HHI_GCLK_MPEG1, 15); 2710 static MESON_GATE(meson8b_uart1, HHI_GCLK_MPEG1, 16); 2711 static MESON_GATE(meson8b_g2d, HHI_GCLK_MPEG1, 20); 2712 static MESON_GATE(meson8b_usb0, HHI_GCLK_MPEG1, 21); 2713 static MESON_GATE(meson8b_usb1, HHI_GCLK_MPEG1, 22); 2714 static MESON_GATE(meson8b_reset, HHI_GCLK_MPEG1, 23); 2715 static MESON_GATE(meson8b_nand, HHI_GCLK_MPEG1, 24); 2716 static MESON_GATE(meson8b_dos_parser, HHI_GCLK_MPEG1, 25); 2717 static MESON_GATE(meson8b_usb, HHI_GCLK_MPEG1, 26); 2718 static MESON_GATE(meson8b_vdin1, HHI_GCLK_MPEG1, 28); 2719 static MESON_GATE(meson8b_ahb_arb0, HHI_GCLK_MPEG1, 29); 2720 static MESON_GATE(meson8b_efuse, HHI_GCLK_MPEG1, 30); 2721 static MESON_GATE(meson8b_boot_rom, HHI_GCLK_MPEG1, 31); 2722 2723 static MESON_GATE(meson8b_ahb_data_bus, HHI_GCLK_MPEG2, 1); 2724 static MESON_GATE(meson8b_ahb_ctrl_bus, HHI_GCLK_MPEG2, 2); 2725 static MESON_GATE(meson8b_hdmi_intr_sync, HHI_GCLK_MPEG2, 3); 2726 static MESON_GATE(meson8b_hdmi_pclk, HHI_GCLK_MPEG2, 4); 2727 static MESON_GATE(meson8b_usb1_ddr_bridge, HHI_GCLK_MPEG2, 8); 2728 static MESON_GATE(meson8b_usb0_ddr_bridge, HHI_GCLK_MPEG2, 9); 2729 static MESON_GATE(meson8b_mmc_pclk, HHI_GCLK_MPEG2, 11); 2730 static MESON_GATE(meson8b_dvin, HHI_GCLK_MPEG2, 12); 2731 static MESON_GATE(meson8b_uart2, HHI_GCLK_MPEG2, 15); 2732 static MESON_GATE(meson8b_sana, HHI_GCLK_MPEG2, 22); 2733 static MESON_GATE(meson8b_vpu_intr, HHI_GCLK_MPEG2, 25); 2734 static MESON_GATE(meson8b_sec_ahb_ahb3_bridge, HHI_GCLK_MPEG2, 26); 2735 static MESON_GATE(meson8b_clk81_a9, HHI_GCLK_MPEG2, 29); 2736 2737 static MESON_GATE(meson8b_vclk2_venci0, HHI_GCLK_OTHER, 1); 2738 static MESON_GATE(meson8b_vclk2_venci1, HHI_GCLK_OTHER, 2); 2739 static MESON_GATE(meson8b_vclk2_vencp0, HHI_GCLK_OTHER, 3); 2740 static MESON_GATE(meson8b_vclk2_vencp1, HHI_GCLK_OTHER, 4); 2741 static MESON_GATE(meson8b_gclk_venci_int, HHI_GCLK_OTHER, 8); 2742 static MESON_GATE(meson8b_gclk_vencp_int, HHI_GCLK_OTHER, 9); 2743 static MESON_GATE(meson8b_dac_clk, HHI_GCLK_OTHER, 10); 2744 static MESON_GATE(meson8b_aoclk_gate, HHI_GCLK_OTHER, 14); 2745 static MESON_GATE(meson8b_iec958_gate, HHI_GCLK_OTHER, 16); 2746 static MESON_GATE(meson8b_enc480p, HHI_GCLK_OTHER, 20); 2747 static MESON_GATE(meson8b_rng1, HHI_GCLK_OTHER, 21); 2748 static MESON_GATE(meson8b_gclk_vencl_int, HHI_GCLK_OTHER, 22); 2749 static MESON_GATE(meson8b_vclk2_venclmcc, HHI_GCLK_OTHER, 24); 2750 static MESON_GATE(meson8b_vclk2_vencl, HHI_GCLK_OTHER, 25); 2751 static MESON_GATE(meson8b_vclk2_other, HHI_GCLK_OTHER, 26); 2752 static MESON_GATE(meson8b_edp, HHI_GCLK_OTHER, 31); 2753 2754 /* AIU gates */ 2755 #define MESON_AIU_GLUE_GATE(_name, _reg, _bit) \ 2756 MESON_PCLK(_name, _reg, _bit, &meson8b_aiu_glue.hw) 2757 2758 static MESON_PCLK(meson8b_aiu_glue, HHI_GCLK_MPEG1, 6, &meson8b_aiu.hw); 2759 static MESON_AIU_GLUE_GATE(meson8b_iec958, HHI_GCLK_MPEG1, 7); 2760 static MESON_AIU_GLUE_GATE(meson8b_i2s_out, HHI_GCLK_MPEG1, 8); 2761 static MESON_AIU_GLUE_GATE(meson8b_amclk, HHI_GCLK_MPEG1, 9); 2762 static MESON_AIU_GLUE_GATE(meson8b_aififo2, HHI_GCLK_MPEG1, 10); 2763 static MESON_AIU_GLUE_GATE(meson8b_mixer, HHI_GCLK_MPEG1, 11); 2764 static MESON_AIU_GLUE_GATE(meson8b_mixer_iface, HHI_GCLK_MPEG1, 12); 2765 static MESON_AIU_GLUE_GATE(meson8b_adc, HHI_GCLK_MPEG1, 13); 2766 2767 /* Always On (AO) domain gates */ 2768 2769 static MESON_GATE(meson8b_ao_media_cpu, HHI_GCLK_AO, 0); 2770 static MESON_GATE(meson8b_ao_ahb_sram, HHI_GCLK_AO, 1); 2771 static MESON_GATE(meson8b_ao_ahb_bus, HHI_GCLK_AO, 2); 2772 static MESON_GATE(meson8b_ao_iface, HHI_GCLK_AO, 3); 2773 2774 static struct clk_hw *meson8_hw_clks[] = { 2775 [CLKID_PLL_FIXED] = &meson8b_fixed_pll.hw, 2776 [CLKID_PLL_VID] = &meson8b_vid_pll.hw, 2777 [CLKID_PLL_SYS] = &meson8b_sys_pll.hw, 2778 [CLKID_FCLK_DIV2] = &meson8b_fclk_div2.hw, 2779 [CLKID_FCLK_DIV3] = &meson8b_fclk_div3.hw, 2780 [CLKID_FCLK_DIV4] = &meson8b_fclk_div4.hw, 2781 [CLKID_FCLK_DIV5] = &meson8b_fclk_div5.hw, 2782 [CLKID_FCLK_DIV7] = &meson8b_fclk_div7.hw, 2783 [CLKID_CPUCLK] = &meson8b_cpu_clk.hw, 2784 [CLKID_MPEG_SEL] = &meson8b_mpeg_clk_sel.hw, 2785 [CLKID_MPEG_DIV] = &meson8b_mpeg_clk_div.hw, 2786 [CLKID_CLK81] = &meson8b_clk81.hw, 2787 [CLKID_DDR] = &meson8b_ddr.hw, 2788 [CLKID_DOS] = &meson8b_dos.hw, 2789 [CLKID_ISA] = &meson8b_isa.hw, 2790 [CLKID_PL301] = &meson8b_pl301.hw, 2791 [CLKID_PERIPHS] = &meson8b_periphs.hw, 2792 [CLKID_SPICC] = &meson8b_spicc.hw, 2793 [CLKID_I2C] = &meson8b_i2c.hw, 2794 [CLKID_SAR_ADC] = &meson8b_sar_adc.hw, 2795 [CLKID_SMART_CARD] = &meson8b_smart_card.hw, 2796 [CLKID_RNG0] = &meson8b_rng0.hw, 2797 [CLKID_UART0] = &meson8b_uart0.hw, 2798 [CLKID_SDHC] = &meson8b_sdhc.hw, 2799 [CLKID_STREAM] = &meson8b_stream.hw, 2800 [CLKID_ASYNC_FIFO] = &meson8b_async_fifo.hw, 2801 [CLKID_SDIO] = &meson8b_sdio.hw, 2802 [CLKID_ABUF] = &meson8b_abuf.hw, 2803 [CLKID_HIU_IFACE] = &meson8b_hiu_iface.hw, 2804 [CLKID_ASSIST_MISC] = &meson8b_assist_misc.hw, 2805 [CLKID_SPI] = &meson8b_spi.hw, 2806 [CLKID_I2S_SPDIF] = &meson8b_i2s_spdif.hw, 2807 [CLKID_ETH] = &meson8b_eth.hw, 2808 [CLKID_DEMUX] = &meson8b_demux.hw, 2809 [CLKID_AIU_GLUE] = &meson8b_aiu_glue.hw, 2810 [CLKID_IEC958] = &meson8b_iec958.hw, 2811 [CLKID_I2S_OUT] = &meson8b_i2s_out.hw, 2812 [CLKID_AMCLK] = &meson8b_amclk.hw, 2813 [CLKID_AIFIFO2] = &meson8b_aififo2.hw, 2814 [CLKID_MIXER] = &meson8b_mixer.hw, 2815 [CLKID_MIXER_IFACE] = &meson8b_mixer_iface.hw, 2816 [CLKID_ADC] = &meson8b_adc.hw, 2817 [CLKID_BLKMV] = &meson8b_blkmv.hw, 2818 [CLKID_AIU] = &meson8b_aiu.hw, 2819 [CLKID_UART1] = &meson8b_uart1.hw, 2820 [CLKID_G2D] = &meson8b_g2d.hw, 2821 [CLKID_USB0] = &meson8b_usb0.hw, 2822 [CLKID_USB1] = &meson8b_usb1.hw, 2823 [CLKID_RESET] = &meson8b_reset.hw, 2824 [CLKID_NAND] = &meson8b_nand.hw, 2825 [CLKID_DOS_PARSER] = &meson8b_dos_parser.hw, 2826 [CLKID_USB] = &meson8b_usb.hw, 2827 [CLKID_VDIN1] = &meson8b_vdin1.hw, 2828 [CLKID_AHB_ARB0] = &meson8b_ahb_arb0.hw, 2829 [CLKID_EFUSE] = &meson8b_efuse.hw, 2830 [CLKID_BOOT_ROM] = &meson8b_boot_rom.hw, 2831 [CLKID_AHB_DATA_BUS] = &meson8b_ahb_data_bus.hw, 2832 [CLKID_AHB_CTRL_BUS] = &meson8b_ahb_ctrl_bus.hw, 2833 [CLKID_HDMI_INTR_SYNC] = &meson8b_hdmi_intr_sync.hw, 2834 [CLKID_HDMI_PCLK] = &meson8b_hdmi_pclk.hw, 2835 [CLKID_USB1_DDR_BRIDGE] = &meson8b_usb1_ddr_bridge.hw, 2836 [CLKID_USB0_DDR_BRIDGE] = &meson8b_usb0_ddr_bridge.hw, 2837 [CLKID_MMC_PCLK] = &meson8b_mmc_pclk.hw, 2838 [CLKID_DVIN] = &meson8b_dvin.hw, 2839 [CLKID_UART2] = &meson8b_uart2.hw, 2840 [CLKID_SANA] = &meson8b_sana.hw, 2841 [CLKID_VPU_INTR] = &meson8b_vpu_intr.hw, 2842 [CLKID_SEC_AHB_AHB3_BRIDGE] = &meson8b_sec_ahb_ahb3_bridge.hw, 2843 [CLKID_CLK81_A9] = &meson8b_clk81_a9.hw, 2844 [CLKID_VCLK2_VENCI0] = &meson8b_vclk2_venci0.hw, 2845 [CLKID_VCLK2_VENCI1] = &meson8b_vclk2_venci1.hw, 2846 [CLKID_VCLK2_VENCP0] = &meson8b_vclk2_vencp0.hw, 2847 [CLKID_VCLK2_VENCP1] = &meson8b_vclk2_vencp1.hw, 2848 [CLKID_GCLK_VENCI_INT] = &meson8b_gclk_venci_int.hw, 2849 [CLKID_GCLK_VENCP_INT] = &meson8b_gclk_vencp_int.hw, 2850 [CLKID_DAC_CLK] = &meson8b_dac_clk.hw, 2851 [CLKID_AOCLK_GATE] = &meson8b_aoclk_gate.hw, 2852 [CLKID_IEC958_GATE] = &meson8b_iec958_gate.hw, 2853 [CLKID_ENC480P] = &meson8b_enc480p.hw, 2854 [CLKID_RNG1] = &meson8b_rng1.hw, 2855 [CLKID_GCLK_VENCL_INT] = &meson8b_gclk_vencl_int.hw, 2856 [CLKID_VCLK2_VENCLMCC] = &meson8b_vclk2_venclmcc.hw, 2857 [CLKID_VCLK2_VENCL] = &meson8b_vclk2_vencl.hw, 2858 [CLKID_VCLK2_OTHER] = &meson8b_vclk2_other.hw, 2859 [CLKID_EDP] = &meson8b_edp.hw, 2860 [CLKID_AO_MEDIA_CPU] = &meson8b_ao_media_cpu.hw, 2861 [CLKID_AO_AHB_SRAM] = &meson8b_ao_ahb_sram.hw, 2862 [CLKID_AO_AHB_BUS] = &meson8b_ao_ahb_bus.hw, 2863 [CLKID_AO_IFACE] = &meson8b_ao_iface.hw, 2864 [CLKID_MPLL0] = &meson8b_mpll0.hw, 2865 [CLKID_MPLL1] = &meson8b_mpll1.hw, 2866 [CLKID_MPLL2] = &meson8b_mpll2.hw, 2867 [CLKID_MPLL0_DIV] = &meson8b_mpll0_div.hw, 2868 [CLKID_MPLL1_DIV] = &meson8b_mpll1_div.hw, 2869 [CLKID_MPLL2_DIV] = &meson8b_mpll2_div.hw, 2870 [CLKID_CPU_IN_SEL] = &meson8b_cpu_in_sel.hw, 2871 [CLKID_CPU_IN_DIV2] = &meson8b_cpu_in_div2.hw, 2872 [CLKID_CPU_IN_DIV3] = &meson8b_cpu_in_div3.hw, 2873 [CLKID_CPU_SCALE_DIV] = &meson8b_cpu_scale_div.hw, 2874 [CLKID_CPU_SCALE_OUT_SEL] = &meson8b_cpu_scale_out_sel.hw, 2875 [CLKID_MPLL_PREDIV] = &meson8b_mpll_prediv.hw, 2876 [CLKID_FCLK_DIV2_DIV] = &meson8b_fclk_div2_div.hw, 2877 [CLKID_FCLK_DIV3_DIV] = &meson8b_fclk_div3_div.hw, 2878 [CLKID_FCLK_DIV4_DIV] = &meson8b_fclk_div4_div.hw, 2879 [CLKID_FCLK_DIV5_DIV] = &meson8b_fclk_div5_div.hw, 2880 [CLKID_FCLK_DIV7_DIV] = &meson8b_fclk_div7_div.hw, 2881 [CLKID_NAND_SEL] = &meson8b_nand_clk_sel.hw, 2882 [CLKID_NAND_DIV] = &meson8b_nand_clk_div.hw, 2883 [CLKID_NAND_CLK] = &meson8b_nand_clk_gate.hw, 2884 [CLKID_PLL_FIXED_DCO] = &meson8b_fixed_pll_dco.hw, 2885 [CLKID_HDMI_PLL_DCO] = &meson8b_hdmi_pll_dco.hw, 2886 [CLKID_PLL_SYS_DCO] = &meson8b_sys_pll_dco.hw, 2887 [CLKID_CPU_CLK_DIV2] = &meson8b_cpu_clk_div2.hw, 2888 [CLKID_CPU_CLK_DIV3] = &meson8b_cpu_clk_div3.hw, 2889 [CLKID_CPU_CLK_DIV4] = &meson8b_cpu_clk_div4.hw, 2890 [CLKID_CPU_CLK_DIV5] = &meson8b_cpu_clk_div5.hw, 2891 [CLKID_CPU_CLK_DIV6] = &meson8b_cpu_clk_div6.hw, 2892 [CLKID_CPU_CLK_DIV7] = &meson8b_cpu_clk_div7.hw, 2893 [CLKID_CPU_CLK_DIV8] = &meson8b_cpu_clk_div8.hw, 2894 [CLKID_APB_SEL] = &meson8b_apb_clk_sel.hw, 2895 [CLKID_APB] = &meson8b_apb_clk_gate.hw, 2896 [CLKID_PERIPH_SEL] = &meson8b_periph_clk_sel.hw, 2897 [CLKID_PERIPH] = &meson8b_periph_clk_gate.hw, 2898 [CLKID_AXI_SEL] = &meson8b_axi_clk_sel.hw, 2899 [CLKID_AXI] = &meson8b_axi_clk_gate.hw, 2900 [CLKID_L2_DRAM_SEL] = &meson8b_l2_dram_clk_sel.hw, 2901 [CLKID_L2_DRAM] = &meson8b_l2_dram_clk_gate.hw, 2902 [CLKID_HDMI_PLL_LVDS_OUT] = &meson8b_hdmi_pll_lvds_out.hw, 2903 [CLKID_HDMI_PLL_HDMI_OUT] = &meson8b_hdmi_pll_hdmi_out.hw, 2904 [CLKID_VID_PLL_IN_SEL] = &meson8b_vid_pll_in_sel.hw, 2905 [CLKID_VID_PLL_IN_EN] = &meson8b_vid_pll_in_en.hw, 2906 [CLKID_VID_PLL_PRE_DIV] = &meson8b_vid_pll_pre_div.hw, 2907 [CLKID_VID_PLL_POST_DIV] = &meson8b_vid_pll_post_div.hw, 2908 [CLKID_VID_PLL_FINAL_DIV] = &meson8b_vid_pll_final_div.hw, 2909 [CLKID_VCLK_IN_SEL] = &meson8b_vclk_in_sel.hw, 2910 [CLKID_VCLK_IN_EN] = &meson8b_vclk_in_en.hw, 2911 [CLKID_VCLK_EN] = &meson8b_vclk_en.hw, 2912 [CLKID_VCLK_DIV1] = &meson8b_vclk_div1_gate.hw, 2913 [CLKID_VCLK_DIV2_DIV] = &meson8b_vclk_div2_div.hw, 2914 [CLKID_VCLK_DIV2] = &meson8b_vclk_div2_div_gate.hw, 2915 [CLKID_VCLK_DIV4_DIV] = &meson8b_vclk_div4_div.hw, 2916 [CLKID_VCLK_DIV4] = &meson8b_vclk_div4_div_gate.hw, 2917 [CLKID_VCLK_DIV6_DIV] = &meson8b_vclk_div6_div.hw, 2918 [CLKID_VCLK_DIV6] = &meson8b_vclk_div6_div_gate.hw, 2919 [CLKID_VCLK_DIV12_DIV] = &meson8b_vclk_div12_div.hw, 2920 [CLKID_VCLK_DIV12] = &meson8b_vclk_div12_div_gate.hw, 2921 [CLKID_VCLK2_IN_SEL] = &meson8b_vclk2_in_sel.hw, 2922 [CLKID_VCLK2_IN_EN] = &meson8b_vclk2_clk_in_en.hw, 2923 [CLKID_VCLK2_EN] = &meson8b_vclk2_clk_en.hw, 2924 [CLKID_VCLK2_DIV1] = &meson8b_vclk2_div1_gate.hw, 2925 [CLKID_VCLK2_DIV2_DIV] = &meson8b_vclk2_div2_div.hw, 2926 [CLKID_VCLK2_DIV2] = &meson8b_vclk2_div2_div_gate.hw, 2927 [CLKID_VCLK2_DIV4_DIV] = &meson8b_vclk2_div4_div.hw, 2928 [CLKID_VCLK2_DIV4] = &meson8b_vclk2_div4_div_gate.hw, 2929 [CLKID_VCLK2_DIV6_DIV] = &meson8b_vclk2_div6_div.hw, 2930 [CLKID_VCLK2_DIV6] = &meson8b_vclk2_div6_div_gate.hw, 2931 [CLKID_VCLK2_DIV12_DIV] = &meson8b_vclk2_div12_div.hw, 2932 [CLKID_VCLK2_DIV12] = &meson8b_vclk2_div12_div_gate.hw, 2933 [CLKID_CTS_ENCT_SEL] = &meson8b_cts_enct_sel.hw, 2934 [CLKID_CTS_ENCT] = &meson8b_cts_enct.hw, 2935 [CLKID_CTS_ENCP_SEL] = &meson8b_cts_encp_sel.hw, 2936 [CLKID_CTS_ENCP] = &meson8b_cts_encp.hw, 2937 [CLKID_CTS_ENCI_SEL] = &meson8b_cts_enci_sel.hw, 2938 [CLKID_CTS_ENCI] = &meson8b_cts_enci.hw, 2939 [CLKID_HDMI_TX_PIXEL_SEL] = &meson8b_hdmi_tx_pixel_sel.hw, 2940 [CLKID_HDMI_TX_PIXEL] = &meson8b_hdmi_tx_pixel.hw, 2941 [CLKID_CTS_ENCL_SEL] = &meson8b_cts_encl_sel.hw, 2942 [CLKID_CTS_ENCL] = &meson8b_cts_encl.hw, 2943 [CLKID_CTS_VDAC0_SEL] = &meson8b_cts_vdac0_sel.hw, 2944 [CLKID_CTS_VDAC0] = &meson8b_cts_vdac0.hw, 2945 [CLKID_HDMI_SYS_SEL] = &meson8b_hdmi_sys_sel.hw, 2946 [CLKID_HDMI_SYS_DIV] = &meson8b_hdmi_sys_div.hw, 2947 [CLKID_HDMI_SYS] = &meson8b_hdmi_sys.hw, 2948 [CLKID_MALI_0_SEL] = &meson8b_mali_0_sel.hw, 2949 [CLKID_MALI_0_DIV] = &meson8b_mali_0_div.hw, 2950 [CLKID_MALI] = &meson8b_mali_0.hw, 2951 [CLKID_VPU_0_SEL] = &meson8b_vpu_0_sel.hw, 2952 [CLKID_VPU_0_DIV] = &meson8b_vpu_0_div.hw, 2953 [CLKID_VPU] = &meson8b_vpu_0.hw, 2954 [CLKID_VDEC_1_SEL] = &meson8b_vdec_1_sel.hw, 2955 [CLKID_VDEC_1_1_DIV] = &meson8b_vdec_1_1_div.hw, 2956 [CLKID_VDEC_1] = &meson8b_vdec_1_1.hw, 2957 [CLKID_VDEC_HCODEC_SEL] = &meson8b_vdec_hcodec_sel.hw, 2958 [CLKID_VDEC_HCODEC_DIV] = &meson8b_vdec_hcodec_div.hw, 2959 [CLKID_VDEC_HCODEC] = &meson8b_vdec_hcodec.hw, 2960 [CLKID_VDEC_2_SEL] = &meson8b_vdec_2_sel.hw, 2961 [CLKID_VDEC_2_DIV] = &meson8b_vdec_2_div.hw, 2962 [CLKID_VDEC_2] = &meson8b_vdec_2.hw, 2963 [CLKID_VDEC_HEVC_SEL] = &meson8b_vdec_hevc_sel.hw, 2964 [CLKID_VDEC_HEVC_DIV] = &meson8b_vdec_hevc_div.hw, 2965 [CLKID_VDEC_HEVC_EN] = &meson8b_vdec_hevc_en.hw, 2966 [CLKID_VDEC_HEVC] = &meson8b_vdec_hevc.hw, 2967 [CLKID_CTS_AMCLK_SEL] = &meson8b_cts_amclk_sel.hw, 2968 [CLKID_CTS_AMCLK_DIV] = &meson8b_cts_amclk_div.hw, 2969 [CLKID_CTS_AMCLK] = &meson8b_cts_amclk.hw, 2970 [CLKID_CTS_MCLK_I958_SEL] = &meson8b_cts_mclk_i958_sel.hw, 2971 [CLKID_CTS_MCLK_I958_DIV] = &meson8b_cts_mclk_i958_div.hw, 2972 [CLKID_CTS_MCLK_I958] = &meson8b_cts_mclk_i958.hw, 2973 [CLKID_CTS_I958] = &meson8b_cts_i958.hw, 2974 [CLKID_VID_PLL_LVDS_EN] = &meson8b_vid_pll_lvds_en.hw, 2975 [CLKID_HDMI_PLL_DCO_IN] = &hdmi_pll_dco_in.hw, 2976 }; 2977 2978 static struct clk_hw *meson8b_hw_clks[] = { 2979 [CLKID_PLL_FIXED] = &meson8b_fixed_pll.hw, 2980 [CLKID_PLL_VID] = &meson8b_vid_pll.hw, 2981 [CLKID_PLL_SYS] = &meson8b_sys_pll.hw, 2982 [CLKID_FCLK_DIV2] = &meson8b_fclk_div2.hw, 2983 [CLKID_FCLK_DIV3] = &meson8b_fclk_div3.hw, 2984 [CLKID_FCLK_DIV4] = &meson8b_fclk_div4.hw, 2985 [CLKID_FCLK_DIV5] = &meson8b_fclk_div5.hw, 2986 [CLKID_FCLK_DIV7] = &meson8b_fclk_div7.hw, 2987 [CLKID_CPUCLK] = &meson8b_cpu_clk.hw, 2988 [CLKID_MPEG_SEL] = &meson8b_mpeg_clk_sel.hw, 2989 [CLKID_MPEG_DIV] = &meson8b_mpeg_clk_div.hw, 2990 [CLKID_CLK81] = &meson8b_clk81.hw, 2991 [CLKID_DDR] = &meson8b_ddr.hw, 2992 [CLKID_DOS] = &meson8b_dos.hw, 2993 [CLKID_ISA] = &meson8b_isa.hw, 2994 [CLKID_PL301] = &meson8b_pl301.hw, 2995 [CLKID_PERIPHS] = &meson8b_periphs.hw, 2996 [CLKID_SPICC] = &meson8b_spicc.hw, 2997 [CLKID_I2C] = &meson8b_i2c.hw, 2998 [CLKID_SAR_ADC] = &meson8b_sar_adc.hw, 2999 [CLKID_SMART_CARD] = &meson8b_smart_card.hw, 3000 [CLKID_RNG0] = &meson8b_rng0.hw, 3001 [CLKID_UART0] = &meson8b_uart0.hw, 3002 [CLKID_SDHC] = &meson8b_sdhc.hw, 3003 [CLKID_STREAM] = &meson8b_stream.hw, 3004 [CLKID_ASYNC_FIFO] = &meson8b_async_fifo.hw, 3005 [CLKID_SDIO] = &meson8b_sdio.hw, 3006 [CLKID_ABUF] = &meson8b_abuf.hw, 3007 [CLKID_HIU_IFACE] = &meson8b_hiu_iface.hw, 3008 [CLKID_ASSIST_MISC] = &meson8b_assist_misc.hw, 3009 [CLKID_SPI] = &meson8b_spi.hw, 3010 [CLKID_I2S_SPDIF] = &meson8b_i2s_spdif.hw, 3011 [CLKID_ETH] = &meson8b_eth.hw, 3012 [CLKID_DEMUX] = &meson8b_demux.hw, 3013 [CLKID_AIU_GLUE] = &meson8b_aiu_glue.hw, 3014 [CLKID_IEC958] = &meson8b_iec958.hw, 3015 [CLKID_I2S_OUT] = &meson8b_i2s_out.hw, 3016 [CLKID_AMCLK] = &meson8b_amclk.hw, 3017 [CLKID_AIFIFO2] = &meson8b_aififo2.hw, 3018 [CLKID_MIXER] = &meson8b_mixer.hw, 3019 [CLKID_MIXER_IFACE] = &meson8b_mixer_iface.hw, 3020 [CLKID_ADC] = &meson8b_adc.hw, 3021 [CLKID_BLKMV] = &meson8b_blkmv.hw, 3022 [CLKID_AIU] = &meson8b_aiu.hw, 3023 [CLKID_UART1] = &meson8b_uart1.hw, 3024 [CLKID_G2D] = &meson8b_g2d.hw, 3025 [CLKID_USB0] = &meson8b_usb0.hw, 3026 [CLKID_USB1] = &meson8b_usb1.hw, 3027 [CLKID_RESET] = &meson8b_reset.hw, 3028 [CLKID_NAND] = &meson8b_nand.hw, 3029 [CLKID_DOS_PARSER] = &meson8b_dos_parser.hw, 3030 [CLKID_USB] = &meson8b_usb.hw, 3031 [CLKID_VDIN1] = &meson8b_vdin1.hw, 3032 [CLKID_AHB_ARB0] = &meson8b_ahb_arb0.hw, 3033 [CLKID_EFUSE] = &meson8b_efuse.hw, 3034 [CLKID_BOOT_ROM] = &meson8b_boot_rom.hw, 3035 [CLKID_AHB_DATA_BUS] = &meson8b_ahb_data_bus.hw, 3036 [CLKID_AHB_CTRL_BUS] = &meson8b_ahb_ctrl_bus.hw, 3037 [CLKID_HDMI_INTR_SYNC] = &meson8b_hdmi_intr_sync.hw, 3038 [CLKID_HDMI_PCLK] = &meson8b_hdmi_pclk.hw, 3039 [CLKID_USB1_DDR_BRIDGE] = &meson8b_usb1_ddr_bridge.hw, 3040 [CLKID_USB0_DDR_BRIDGE] = &meson8b_usb0_ddr_bridge.hw, 3041 [CLKID_MMC_PCLK] = &meson8b_mmc_pclk.hw, 3042 [CLKID_DVIN] = &meson8b_dvin.hw, 3043 [CLKID_UART2] = &meson8b_uart2.hw, 3044 [CLKID_SANA] = &meson8b_sana.hw, 3045 [CLKID_VPU_INTR] = &meson8b_vpu_intr.hw, 3046 [CLKID_SEC_AHB_AHB3_BRIDGE] = &meson8b_sec_ahb_ahb3_bridge.hw, 3047 [CLKID_CLK81_A9] = &meson8b_clk81_a9.hw, 3048 [CLKID_VCLK2_VENCI0] = &meson8b_vclk2_venci0.hw, 3049 [CLKID_VCLK2_VENCI1] = &meson8b_vclk2_venci1.hw, 3050 [CLKID_VCLK2_VENCP0] = &meson8b_vclk2_vencp0.hw, 3051 [CLKID_VCLK2_VENCP1] = &meson8b_vclk2_vencp1.hw, 3052 [CLKID_GCLK_VENCI_INT] = &meson8b_gclk_venci_int.hw, 3053 [CLKID_GCLK_VENCP_INT] = &meson8b_gclk_vencp_int.hw, 3054 [CLKID_DAC_CLK] = &meson8b_dac_clk.hw, 3055 [CLKID_AOCLK_GATE] = &meson8b_aoclk_gate.hw, 3056 [CLKID_IEC958_GATE] = &meson8b_iec958_gate.hw, 3057 [CLKID_ENC480P] = &meson8b_enc480p.hw, 3058 [CLKID_RNG1] = &meson8b_rng1.hw, 3059 [CLKID_GCLK_VENCL_INT] = &meson8b_gclk_vencl_int.hw, 3060 [CLKID_VCLK2_VENCLMCC] = &meson8b_vclk2_venclmcc.hw, 3061 [CLKID_VCLK2_VENCL] = &meson8b_vclk2_vencl.hw, 3062 [CLKID_VCLK2_OTHER] = &meson8b_vclk2_other.hw, 3063 [CLKID_EDP] = &meson8b_edp.hw, 3064 [CLKID_AO_MEDIA_CPU] = &meson8b_ao_media_cpu.hw, 3065 [CLKID_AO_AHB_SRAM] = &meson8b_ao_ahb_sram.hw, 3066 [CLKID_AO_AHB_BUS] = &meson8b_ao_ahb_bus.hw, 3067 [CLKID_AO_IFACE] = &meson8b_ao_iface.hw, 3068 [CLKID_MPLL0] = &meson8b_mpll0.hw, 3069 [CLKID_MPLL1] = &meson8b_mpll1.hw, 3070 [CLKID_MPLL2] = &meson8b_mpll2.hw, 3071 [CLKID_MPLL0_DIV] = &meson8b_mpll0_div.hw, 3072 [CLKID_MPLL1_DIV] = &meson8b_mpll1_div.hw, 3073 [CLKID_MPLL2_DIV] = &meson8b_mpll2_div.hw, 3074 [CLKID_CPU_IN_SEL] = &meson8b_cpu_in_sel.hw, 3075 [CLKID_CPU_IN_DIV2] = &meson8b_cpu_in_div2.hw, 3076 [CLKID_CPU_IN_DIV3] = &meson8b_cpu_in_div3.hw, 3077 [CLKID_CPU_SCALE_DIV] = &meson8b_cpu_scale_div.hw, 3078 [CLKID_CPU_SCALE_OUT_SEL] = &meson8b_cpu_scale_out_sel.hw, 3079 [CLKID_MPLL_PREDIV] = &meson8b_mpll_prediv.hw, 3080 [CLKID_FCLK_DIV2_DIV] = &meson8b_fclk_div2_div.hw, 3081 [CLKID_FCLK_DIV3_DIV] = &meson8b_fclk_div3_div.hw, 3082 [CLKID_FCLK_DIV4_DIV] = &meson8b_fclk_div4_div.hw, 3083 [CLKID_FCLK_DIV5_DIV] = &meson8b_fclk_div5_div.hw, 3084 [CLKID_FCLK_DIV7_DIV] = &meson8b_fclk_div7_div.hw, 3085 [CLKID_NAND_SEL] = &meson8b_nand_clk_sel.hw, 3086 [CLKID_NAND_DIV] = &meson8b_nand_clk_div.hw, 3087 [CLKID_NAND_CLK] = &meson8b_nand_clk_gate.hw, 3088 [CLKID_PLL_FIXED_DCO] = &meson8b_fixed_pll_dco.hw, 3089 [CLKID_HDMI_PLL_DCO] = &meson8b_hdmi_pll_dco.hw, 3090 [CLKID_PLL_SYS_DCO] = &meson8b_sys_pll_dco.hw, 3091 [CLKID_CPU_CLK_DIV2] = &meson8b_cpu_clk_div2.hw, 3092 [CLKID_CPU_CLK_DIV3] = &meson8b_cpu_clk_div3.hw, 3093 [CLKID_CPU_CLK_DIV4] = &meson8b_cpu_clk_div4.hw, 3094 [CLKID_CPU_CLK_DIV5] = &meson8b_cpu_clk_div5.hw, 3095 [CLKID_CPU_CLK_DIV6] = &meson8b_cpu_clk_div6.hw, 3096 [CLKID_CPU_CLK_DIV7] = &meson8b_cpu_clk_div7.hw, 3097 [CLKID_CPU_CLK_DIV8] = &meson8b_cpu_clk_div8.hw, 3098 [CLKID_APB_SEL] = &meson8b_apb_clk_sel.hw, 3099 [CLKID_APB] = &meson8b_apb_clk_gate.hw, 3100 [CLKID_PERIPH_SEL] = &meson8b_periph_clk_sel.hw, 3101 [CLKID_PERIPH] = &meson8b_periph_clk_gate.hw, 3102 [CLKID_AXI_SEL] = &meson8b_axi_clk_sel.hw, 3103 [CLKID_AXI] = &meson8b_axi_clk_gate.hw, 3104 [CLKID_L2_DRAM_SEL] = &meson8b_l2_dram_clk_sel.hw, 3105 [CLKID_L2_DRAM] = &meson8b_l2_dram_clk_gate.hw, 3106 [CLKID_HDMI_PLL_LVDS_OUT] = &meson8b_hdmi_pll_lvds_out.hw, 3107 [CLKID_HDMI_PLL_HDMI_OUT] = &meson8b_hdmi_pll_hdmi_out.hw, 3108 [CLKID_VID_PLL_IN_SEL] = &meson8b_vid_pll_in_sel.hw, 3109 [CLKID_VID_PLL_IN_EN] = &meson8b_vid_pll_in_en.hw, 3110 [CLKID_VID_PLL_PRE_DIV] = &meson8b_vid_pll_pre_div.hw, 3111 [CLKID_VID_PLL_POST_DIV] = &meson8b_vid_pll_post_div.hw, 3112 [CLKID_VID_PLL_FINAL_DIV] = &meson8b_vid_pll_final_div.hw, 3113 [CLKID_VCLK_IN_SEL] = &meson8b_vclk_in_sel.hw, 3114 [CLKID_VCLK_IN_EN] = &meson8b_vclk_in_en.hw, 3115 [CLKID_VCLK_EN] = &meson8b_vclk_en.hw, 3116 [CLKID_VCLK_DIV1] = &meson8b_vclk_div1_gate.hw, 3117 [CLKID_VCLK_DIV2_DIV] = &meson8b_vclk_div2_div.hw, 3118 [CLKID_VCLK_DIV2] = &meson8b_vclk_div2_div_gate.hw, 3119 [CLKID_VCLK_DIV4_DIV] = &meson8b_vclk_div4_div.hw, 3120 [CLKID_VCLK_DIV4] = &meson8b_vclk_div4_div_gate.hw, 3121 [CLKID_VCLK_DIV6_DIV] = &meson8b_vclk_div6_div.hw, 3122 [CLKID_VCLK_DIV6] = &meson8b_vclk_div6_div_gate.hw, 3123 [CLKID_VCLK_DIV12_DIV] = &meson8b_vclk_div12_div.hw, 3124 [CLKID_VCLK_DIV12] = &meson8b_vclk_div12_div_gate.hw, 3125 [CLKID_VCLK2_IN_SEL] = &meson8b_vclk2_in_sel.hw, 3126 [CLKID_VCLK2_IN_EN] = &meson8b_vclk2_clk_in_en.hw, 3127 [CLKID_VCLK2_EN] = &meson8b_vclk2_clk_en.hw, 3128 [CLKID_VCLK2_DIV1] = &meson8b_vclk2_div1_gate.hw, 3129 [CLKID_VCLK2_DIV2_DIV] = &meson8b_vclk2_div2_div.hw, 3130 [CLKID_VCLK2_DIV2] = &meson8b_vclk2_div2_div_gate.hw, 3131 [CLKID_VCLK2_DIV4_DIV] = &meson8b_vclk2_div4_div.hw, 3132 [CLKID_VCLK2_DIV4] = &meson8b_vclk2_div4_div_gate.hw, 3133 [CLKID_VCLK2_DIV6_DIV] = &meson8b_vclk2_div6_div.hw, 3134 [CLKID_VCLK2_DIV6] = &meson8b_vclk2_div6_div_gate.hw, 3135 [CLKID_VCLK2_DIV12_DIV] = &meson8b_vclk2_div12_div.hw, 3136 [CLKID_VCLK2_DIV12] = &meson8b_vclk2_div12_div_gate.hw, 3137 [CLKID_CTS_ENCT_SEL] = &meson8b_cts_enct_sel.hw, 3138 [CLKID_CTS_ENCT] = &meson8b_cts_enct.hw, 3139 [CLKID_CTS_ENCP_SEL] = &meson8b_cts_encp_sel.hw, 3140 [CLKID_CTS_ENCP] = &meson8b_cts_encp.hw, 3141 [CLKID_CTS_ENCI_SEL] = &meson8b_cts_enci_sel.hw, 3142 [CLKID_CTS_ENCI] = &meson8b_cts_enci.hw, 3143 [CLKID_HDMI_TX_PIXEL_SEL] = &meson8b_hdmi_tx_pixel_sel.hw, 3144 [CLKID_HDMI_TX_PIXEL] = &meson8b_hdmi_tx_pixel.hw, 3145 [CLKID_CTS_ENCL_SEL] = &meson8b_cts_encl_sel.hw, 3146 [CLKID_CTS_ENCL] = &meson8b_cts_encl.hw, 3147 [CLKID_CTS_VDAC0_SEL] = &meson8b_cts_vdac0_sel.hw, 3148 [CLKID_CTS_VDAC0] = &meson8b_cts_vdac0.hw, 3149 [CLKID_HDMI_SYS_SEL] = &meson8b_hdmi_sys_sel.hw, 3150 [CLKID_HDMI_SYS_DIV] = &meson8b_hdmi_sys_div.hw, 3151 [CLKID_HDMI_SYS] = &meson8b_hdmi_sys.hw, 3152 [CLKID_MALI_0_SEL] = &meson8b_mali_0_sel.hw, 3153 [CLKID_MALI_0_DIV] = &meson8b_mali_0_div.hw, 3154 [CLKID_MALI_0] = &meson8b_mali_0.hw, 3155 [CLKID_MALI_1_SEL] = &meson8b_mali_1_sel.hw, 3156 [CLKID_MALI_1_DIV] = &meson8b_mali_1_div.hw, 3157 [CLKID_MALI_1] = &meson8b_mali_1.hw, 3158 [CLKID_MALI] = &meson8b_mali.hw, 3159 [CLKID_VPU_0_SEL] = &meson8b_vpu_0_sel.hw, 3160 [CLKID_VPU_0_DIV] = &meson8b_vpu_0_div.hw, 3161 [CLKID_VPU_0] = &meson8b_vpu_0.hw, 3162 [CLKID_VPU_1_SEL] = &meson8b_vpu_1_sel.hw, 3163 [CLKID_VPU_1_DIV] = &meson8b_vpu_1_div.hw, 3164 [CLKID_VPU_1] = &meson8b_vpu_1.hw, 3165 [CLKID_VPU] = &meson8b_vpu.hw, 3166 [CLKID_VDEC_1_SEL] = &meson8b_vdec_1_sel.hw, 3167 [CLKID_VDEC_1_1_DIV] = &meson8b_vdec_1_1_div.hw, 3168 [CLKID_VDEC_1_1] = &meson8b_vdec_1_1.hw, 3169 [CLKID_VDEC_1_2_DIV] = &meson8b_vdec_1_2_div.hw, 3170 [CLKID_VDEC_1_2] = &meson8b_vdec_1_2.hw, 3171 [CLKID_VDEC_1] = &meson8b_vdec_1.hw, 3172 [CLKID_VDEC_HCODEC_SEL] = &meson8b_vdec_hcodec_sel.hw, 3173 [CLKID_VDEC_HCODEC_DIV] = &meson8b_vdec_hcodec_div.hw, 3174 [CLKID_VDEC_HCODEC] = &meson8b_vdec_hcodec.hw, 3175 [CLKID_VDEC_2_SEL] = &meson8b_vdec_2_sel.hw, 3176 [CLKID_VDEC_2_DIV] = &meson8b_vdec_2_div.hw, 3177 [CLKID_VDEC_2] = &meson8b_vdec_2.hw, 3178 [CLKID_VDEC_HEVC_SEL] = &meson8b_vdec_hevc_sel.hw, 3179 [CLKID_VDEC_HEVC_DIV] = &meson8b_vdec_hevc_div.hw, 3180 [CLKID_VDEC_HEVC_EN] = &meson8b_vdec_hevc_en.hw, 3181 [CLKID_VDEC_HEVC] = &meson8b_vdec_hevc.hw, 3182 [CLKID_CTS_AMCLK_SEL] = &meson8b_cts_amclk_sel.hw, 3183 [CLKID_CTS_AMCLK_DIV] = &meson8b_cts_amclk_div.hw, 3184 [CLKID_CTS_AMCLK] = &meson8b_cts_amclk.hw, 3185 [CLKID_CTS_MCLK_I958_SEL] = &meson8b_cts_mclk_i958_sel.hw, 3186 [CLKID_CTS_MCLK_I958_DIV] = &meson8b_cts_mclk_i958_div.hw, 3187 [CLKID_CTS_MCLK_I958] = &meson8b_cts_mclk_i958.hw, 3188 [CLKID_CTS_I958] = &meson8b_cts_i958.hw, 3189 [CLKID_VID_PLL_LVDS_EN] = &meson8b_vid_pll_lvds_en.hw, 3190 [CLKID_HDMI_PLL_DCO_IN] = &hdmi_pll_dco_in.hw, 3191 }; 3192 3193 static struct clk_hw *meson8m2_hw_clks[] = { 3194 [CLKID_PLL_FIXED] = &meson8b_fixed_pll.hw, 3195 [CLKID_PLL_VID] = &meson8b_vid_pll.hw, 3196 [CLKID_PLL_SYS] = &meson8b_sys_pll.hw, 3197 [CLKID_FCLK_DIV2] = &meson8b_fclk_div2.hw, 3198 [CLKID_FCLK_DIV3] = &meson8b_fclk_div3.hw, 3199 [CLKID_FCLK_DIV4] = &meson8b_fclk_div4.hw, 3200 [CLKID_FCLK_DIV5] = &meson8b_fclk_div5.hw, 3201 [CLKID_FCLK_DIV7] = &meson8b_fclk_div7.hw, 3202 [CLKID_CPUCLK] = &meson8b_cpu_clk.hw, 3203 [CLKID_MPEG_SEL] = &meson8b_mpeg_clk_sel.hw, 3204 [CLKID_MPEG_DIV] = &meson8b_mpeg_clk_div.hw, 3205 [CLKID_CLK81] = &meson8b_clk81.hw, 3206 [CLKID_DDR] = &meson8b_ddr.hw, 3207 [CLKID_DOS] = &meson8b_dos.hw, 3208 [CLKID_ISA] = &meson8b_isa.hw, 3209 [CLKID_PL301] = &meson8b_pl301.hw, 3210 [CLKID_PERIPHS] = &meson8b_periphs.hw, 3211 [CLKID_SPICC] = &meson8b_spicc.hw, 3212 [CLKID_I2C] = &meson8b_i2c.hw, 3213 [CLKID_SAR_ADC] = &meson8b_sar_adc.hw, 3214 [CLKID_SMART_CARD] = &meson8b_smart_card.hw, 3215 [CLKID_RNG0] = &meson8b_rng0.hw, 3216 [CLKID_UART0] = &meson8b_uart0.hw, 3217 [CLKID_SDHC] = &meson8b_sdhc.hw, 3218 [CLKID_STREAM] = &meson8b_stream.hw, 3219 [CLKID_ASYNC_FIFO] = &meson8b_async_fifo.hw, 3220 [CLKID_SDIO] = &meson8b_sdio.hw, 3221 [CLKID_ABUF] = &meson8b_abuf.hw, 3222 [CLKID_HIU_IFACE] = &meson8b_hiu_iface.hw, 3223 [CLKID_ASSIST_MISC] = &meson8b_assist_misc.hw, 3224 [CLKID_SPI] = &meson8b_spi.hw, 3225 [CLKID_I2S_SPDIF] = &meson8b_i2s_spdif.hw, 3226 [CLKID_ETH] = &meson8b_eth.hw, 3227 [CLKID_DEMUX] = &meson8b_demux.hw, 3228 [CLKID_AIU_GLUE] = &meson8b_aiu_glue.hw, 3229 [CLKID_IEC958] = &meson8b_iec958.hw, 3230 [CLKID_I2S_OUT] = &meson8b_i2s_out.hw, 3231 [CLKID_AMCLK] = &meson8b_amclk.hw, 3232 [CLKID_AIFIFO2] = &meson8b_aififo2.hw, 3233 [CLKID_MIXER] = &meson8b_mixer.hw, 3234 [CLKID_MIXER_IFACE] = &meson8b_mixer_iface.hw, 3235 [CLKID_ADC] = &meson8b_adc.hw, 3236 [CLKID_BLKMV] = &meson8b_blkmv.hw, 3237 [CLKID_AIU] = &meson8b_aiu.hw, 3238 [CLKID_UART1] = &meson8b_uart1.hw, 3239 [CLKID_G2D] = &meson8b_g2d.hw, 3240 [CLKID_USB0] = &meson8b_usb0.hw, 3241 [CLKID_USB1] = &meson8b_usb1.hw, 3242 [CLKID_RESET] = &meson8b_reset.hw, 3243 [CLKID_NAND] = &meson8b_nand.hw, 3244 [CLKID_DOS_PARSER] = &meson8b_dos_parser.hw, 3245 [CLKID_USB] = &meson8b_usb.hw, 3246 [CLKID_VDIN1] = &meson8b_vdin1.hw, 3247 [CLKID_AHB_ARB0] = &meson8b_ahb_arb0.hw, 3248 [CLKID_EFUSE] = &meson8b_efuse.hw, 3249 [CLKID_BOOT_ROM] = &meson8b_boot_rom.hw, 3250 [CLKID_AHB_DATA_BUS] = &meson8b_ahb_data_bus.hw, 3251 [CLKID_AHB_CTRL_BUS] = &meson8b_ahb_ctrl_bus.hw, 3252 [CLKID_HDMI_INTR_SYNC] = &meson8b_hdmi_intr_sync.hw, 3253 [CLKID_HDMI_PCLK] = &meson8b_hdmi_pclk.hw, 3254 [CLKID_USB1_DDR_BRIDGE] = &meson8b_usb1_ddr_bridge.hw, 3255 [CLKID_USB0_DDR_BRIDGE] = &meson8b_usb0_ddr_bridge.hw, 3256 [CLKID_MMC_PCLK] = &meson8b_mmc_pclk.hw, 3257 [CLKID_DVIN] = &meson8b_dvin.hw, 3258 [CLKID_UART2] = &meson8b_uart2.hw, 3259 [CLKID_SANA] = &meson8b_sana.hw, 3260 [CLKID_VPU_INTR] = &meson8b_vpu_intr.hw, 3261 [CLKID_SEC_AHB_AHB3_BRIDGE] = &meson8b_sec_ahb_ahb3_bridge.hw, 3262 [CLKID_CLK81_A9] = &meson8b_clk81_a9.hw, 3263 [CLKID_VCLK2_VENCI0] = &meson8b_vclk2_venci0.hw, 3264 [CLKID_VCLK2_VENCI1] = &meson8b_vclk2_venci1.hw, 3265 [CLKID_VCLK2_VENCP0] = &meson8b_vclk2_vencp0.hw, 3266 [CLKID_VCLK2_VENCP1] = &meson8b_vclk2_vencp1.hw, 3267 [CLKID_GCLK_VENCI_INT] = &meson8b_gclk_venci_int.hw, 3268 [CLKID_GCLK_VENCP_INT] = &meson8b_gclk_vencp_int.hw, 3269 [CLKID_DAC_CLK] = &meson8b_dac_clk.hw, 3270 [CLKID_AOCLK_GATE] = &meson8b_aoclk_gate.hw, 3271 [CLKID_IEC958_GATE] = &meson8b_iec958_gate.hw, 3272 [CLKID_ENC480P] = &meson8b_enc480p.hw, 3273 [CLKID_RNG1] = &meson8b_rng1.hw, 3274 [CLKID_GCLK_VENCL_INT] = &meson8b_gclk_vencl_int.hw, 3275 [CLKID_VCLK2_VENCLMCC] = &meson8b_vclk2_venclmcc.hw, 3276 [CLKID_VCLK2_VENCL] = &meson8b_vclk2_vencl.hw, 3277 [CLKID_VCLK2_OTHER] = &meson8b_vclk2_other.hw, 3278 [CLKID_EDP] = &meson8b_edp.hw, 3279 [CLKID_AO_MEDIA_CPU] = &meson8b_ao_media_cpu.hw, 3280 [CLKID_AO_AHB_SRAM] = &meson8b_ao_ahb_sram.hw, 3281 [CLKID_AO_AHB_BUS] = &meson8b_ao_ahb_bus.hw, 3282 [CLKID_AO_IFACE] = &meson8b_ao_iface.hw, 3283 [CLKID_MPLL0] = &meson8b_mpll0.hw, 3284 [CLKID_MPLL1] = &meson8b_mpll1.hw, 3285 [CLKID_MPLL2] = &meson8b_mpll2.hw, 3286 [CLKID_MPLL0_DIV] = &meson8b_mpll0_div.hw, 3287 [CLKID_MPLL1_DIV] = &meson8b_mpll1_div.hw, 3288 [CLKID_MPLL2_DIV] = &meson8b_mpll2_div.hw, 3289 [CLKID_CPU_IN_SEL] = &meson8b_cpu_in_sel.hw, 3290 [CLKID_CPU_IN_DIV2] = &meson8b_cpu_in_div2.hw, 3291 [CLKID_CPU_IN_DIV3] = &meson8b_cpu_in_div3.hw, 3292 [CLKID_CPU_SCALE_DIV] = &meson8b_cpu_scale_div.hw, 3293 [CLKID_CPU_SCALE_OUT_SEL] = &meson8b_cpu_scale_out_sel.hw, 3294 [CLKID_MPLL_PREDIV] = &meson8b_mpll_prediv.hw, 3295 [CLKID_FCLK_DIV2_DIV] = &meson8b_fclk_div2_div.hw, 3296 [CLKID_FCLK_DIV3_DIV] = &meson8b_fclk_div3_div.hw, 3297 [CLKID_FCLK_DIV4_DIV] = &meson8b_fclk_div4_div.hw, 3298 [CLKID_FCLK_DIV5_DIV] = &meson8b_fclk_div5_div.hw, 3299 [CLKID_FCLK_DIV7_DIV] = &meson8b_fclk_div7_div.hw, 3300 [CLKID_NAND_SEL] = &meson8b_nand_clk_sel.hw, 3301 [CLKID_NAND_DIV] = &meson8b_nand_clk_div.hw, 3302 [CLKID_NAND_CLK] = &meson8b_nand_clk_gate.hw, 3303 [CLKID_PLL_FIXED_DCO] = &meson8b_fixed_pll_dco.hw, 3304 [CLKID_HDMI_PLL_DCO] = &meson8b_hdmi_pll_dco.hw, 3305 [CLKID_PLL_SYS_DCO] = &meson8b_sys_pll_dco.hw, 3306 [CLKID_CPU_CLK_DIV2] = &meson8b_cpu_clk_div2.hw, 3307 [CLKID_CPU_CLK_DIV3] = &meson8b_cpu_clk_div3.hw, 3308 [CLKID_CPU_CLK_DIV4] = &meson8b_cpu_clk_div4.hw, 3309 [CLKID_CPU_CLK_DIV5] = &meson8b_cpu_clk_div5.hw, 3310 [CLKID_CPU_CLK_DIV6] = &meson8b_cpu_clk_div6.hw, 3311 [CLKID_CPU_CLK_DIV7] = &meson8b_cpu_clk_div7.hw, 3312 [CLKID_CPU_CLK_DIV8] = &meson8b_cpu_clk_div8.hw, 3313 [CLKID_APB_SEL] = &meson8b_apb_clk_sel.hw, 3314 [CLKID_APB] = &meson8b_apb_clk_gate.hw, 3315 [CLKID_PERIPH_SEL] = &meson8b_periph_clk_sel.hw, 3316 [CLKID_PERIPH] = &meson8b_periph_clk_gate.hw, 3317 [CLKID_AXI_SEL] = &meson8b_axi_clk_sel.hw, 3318 [CLKID_AXI] = &meson8b_axi_clk_gate.hw, 3319 [CLKID_L2_DRAM_SEL] = &meson8b_l2_dram_clk_sel.hw, 3320 [CLKID_L2_DRAM] = &meson8b_l2_dram_clk_gate.hw, 3321 [CLKID_HDMI_PLL_LVDS_OUT] = &meson8b_hdmi_pll_lvds_out.hw, 3322 [CLKID_HDMI_PLL_HDMI_OUT] = &meson8b_hdmi_pll_hdmi_out.hw, 3323 [CLKID_VID_PLL_IN_SEL] = &meson8b_vid_pll_in_sel.hw, 3324 [CLKID_VID_PLL_IN_EN] = &meson8b_vid_pll_in_en.hw, 3325 [CLKID_VID_PLL_PRE_DIV] = &meson8b_vid_pll_pre_div.hw, 3326 [CLKID_VID_PLL_POST_DIV] = &meson8b_vid_pll_post_div.hw, 3327 [CLKID_VID_PLL_FINAL_DIV] = &meson8b_vid_pll_final_div.hw, 3328 [CLKID_VCLK_IN_SEL] = &meson8b_vclk_in_sel.hw, 3329 [CLKID_VCLK_IN_EN] = &meson8b_vclk_in_en.hw, 3330 [CLKID_VCLK_EN] = &meson8b_vclk_en.hw, 3331 [CLKID_VCLK_DIV1] = &meson8b_vclk_div1_gate.hw, 3332 [CLKID_VCLK_DIV2_DIV] = &meson8b_vclk_div2_div.hw, 3333 [CLKID_VCLK_DIV2] = &meson8b_vclk_div2_div_gate.hw, 3334 [CLKID_VCLK_DIV4_DIV] = &meson8b_vclk_div4_div.hw, 3335 [CLKID_VCLK_DIV4] = &meson8b_vclk_div4_div_gate.hw, 3336 [CLKID_VCLK_DIV6_DIV] = &meson8b_vclk_div6_div.hw, 3337 [CLKID_VCLK_DIV6] = &meson8b_vclk_div6_div_gate.hw, 3338 [CLKID_VCLK_DIV12_DIV] = &meson8b_vclk_div12_div.hw, 3339 [CLKID_VCLK_DIV12] = &meson8b_vclk_div12_div_gate.hw, 3340 [CLKID_VCLK2_IN_SEL] = &meson8b_vclk2_in_sel.hw, 3341 [CLKID_VCLK2_IN_EN] = &meson8b_vclk2_clk_in_en.hw, 3342 [CLKID_VCLK2_EN] = &meson8b_vclk2_clk_en.hw, 3343 [CLKID_VCLK2_DIV1] = &meson8b_vclk2_div1_gate.hw, 3344 [CLKID_VCLK2_DIV2_DIV] = &meson8b_vclk2_div2_div.hw, 3345 [CLKID_VCLK2_DIV2] = &meson8b_vclk2_div2_div_gate.hw, 3346 [CLKID_VCLK2_DIV4_DIV] = &meson8b_vclk2_div4_div.hw, 3347 [CLKID_VCLK2_DIV4] = &meson8b_vclk2_div4_div_gate.hw, 3348 [CLKID_VCLK2_DIV6_DIV] = &meson8b_vclk2_div6_div.hw, 3349 [CLKID_VCLK2_DIV6] = &meson8b_vclk2_div6_div_gate.hw, 3350 [CLKID_VCLK2_DIV12_DIV] = &meson8b_vclk2_div12_div.hw, 3351 [CLKID_VCLK2_DIV12] = &meson8b_vclk2_div12_div_gate.hw, 3352 [CLKID_CTS_ENCT_SEL] = &meson8b_cts_enct_sel.hw, 3353 [CLKID_CTS_ENCT] = &meson8b_cts_enct.hw, 3354 [CLKID_CTS_ENCP_SEL] = &meson8b_cts_encp_sel.hw, 3355 [CLKID_CTS_ENCP] = &meson8b_cts_encp.hw, 3356 [CLKID_CTS_ENCI_SEL] = &meson8b_cts_enci_sel.hw, 3357 [CLKID_CTS_ENCI] = &meson8b_cts_enci.hw, 3358 [CLKID_HDMI_TX_PIXEL_SEL] = &meson8b_hdmi_tx_pixel_sel.hw, 3359 [CLKID_HDMI_TX_PIXEL] = &meson8b_hdmi_tx_pixel.hw, 3360 [CLKID_CTS_ENCL_SEL] = &meson8b_cts_encl_sel.hw, 3361 [CLKID_CTS_ENCL] = &meson8b_cts_encl.hw, 3362 [CLKID_CTS_VDAC0_SEL] = &meson8b_cts_vdac0_sel.hw, 3363 [CLKID_CTS_VDAC0] = &meson8b_cts_vdac0.hw, 3364 [CLKID_HDMI_SYS_SEL] = &meson8b_hdmi_sys_sel.hw, 3365 [CLKID_HDMI_SYS_DIV] = &meson8b_hdmi_sys_div.hw, 3366 [CLKID_HDMI_SYS] = &meson8b_hdmi_sys.hw, 3367 [CLKID_MALI_0_SEL] = &meson8b_mali_0_sel.hw, 3368 [CLKID_MALI_0_DIV] = &meson8b_mali_0_div.hw, 3369 [CLKID_MALI_0] = &meson8b_mali_0.hw, 3370 [CLKID_MALI_1_SEL] = &meson8b_mali_1_sel.hw, 3371 [CLKID_MALI_1_DIV] = &meson8b_mali_1_div.hw, 3372 [CLKID_MALI_1] = &meson8b_mali_1.hw, 3373 [CLKID_MALI] = &meson8b_mali.hw, 3374 [CLKID_GP_PLL_DCO] = &meson8m2_gp_pll_dco.hw, 3375 [CLKID_GP_PLL] = &meson8m2_gp_pll.hw, 3376 [CLKID_VPU_0_SEL] = &meson8m2_vpu_0_sel.hw, 3377 [CLKID_VPU_0_DIV] = &meson8b_vpu_0_div.hw, 3378 [CLKID_VPU_0] = &meson8b_vpu_0.hw, 3379 [CLKID_VPU_1_SEL] = &meson8m2_vpu_1_sel.hw, 3380 [CLKID_VPU_1_DIV] = &meson8b_vpu_1_div.hw, 3381 [CLKID_VPU_1] = &meson8b_vpu_1.hw, 3382 [CLKID_VPU] = &meson8b_vpu.hw, 3383 [CLKID_VDEC_1_SEL] = &meson8b_vdec_1_sel.hw, 3384 [CLKID_VDEC_1_1_DIV] = &meson8b_vdec_1_1_div.hw, 3385 [CLKID_VDEC_1_1] = &meson8b_vdec_1_1.hw, 3386 [CLKID_VDEC_1_2_DIV] = &meson8b_vdec_1_2_div.hw, 3387 [CLKID_VDEC_1_2] = &meson8b_vdec_1_2.hw, 3388 [CLKID_VDEC_1] = &meson8b_vdec_1.hw, 3389 [CLKID_VDEC_HCODEC_SEL] = &meson8b_vdec_hcodec_sel.hw, 3390 [CLKID_VDEC_HCODEC_DIV] = &meson8b_vdec_hcodec_div.hw, 3391 [CLKID_VDEC_HCODEC] = &meson8b_vdec_hcodec.hw, 3392 [CLKID_VDEC_2_SEL] = &meson8b_vdec_2_sel.hw, 3393 [CLKID_VDEC_2_DIV] = &meson8b_vdec_2_div.hw, 3394 [CLKID_VDEC_2] = &meson8b_vdec_2.hw, 3395 [CLKID_VDEC_HEVC_SEL] = &meson8b_vdec_hevc_sel.hw, 3396 [CLKID_VDEC_HEVC_DIV] = &meson8b_vdec_hevc_div.hw, 3397 [CLKID_VDEC_HEVC_EN] = &meson8b_vdec_hevc_en.hw, 3398 [CLKID_VDEC_HEVC] = &meson8b_vdec_hevc.hw, 3399 [CLKID_CTS_AMCLK_SEL] = &meson8b_cts_amclk_sel.hw, 3400 [CLKID_CTS_AMCLK_DIV] = &meson8b_cts_amclk_div.hw, 3401 [CLKID_CTS_AMCLK] = &meson8b_cts_amclk.hw, 3402 [CLKID_CTS_MCLK_I958_SEL] = &meson8b_cts_mclk_i958_sel.hw, 3403 [CLKID_CTS_MCLK_I958_DIV] = &meson8b_cts_mclk_i958_div.hw, 3404 [CLKID_CTS_MCLK_I958] = &meson8b_cts_mclk_i958.hw, 3405 [CLKID_CTS_I958] = &meson8b_cts_i958.hw, 3406 [CLKID_VID_PLL_LVDS_EN] = &meson8b_vid_pll_lvds_en.hw, 3407 [CLKID_HDMI_PLL_DCO_IN] = &hdmi_pll_dco_in.hw, 3408 }; 3409 3410 static struct clk_regmap *const meson8b_clk_regmaps[] = { 3411 &meson8b_clk81, 3412 &meson8b_ddr, 3413 &meson8b_dos, 3414 &meson8b_isa, 3415 &meson8b_pl301, 3416 &meson8b_periphs, 3417 &meson8b_spicc, 3418 &meson8b_i2c, 3419 &meson8b_sar_adc, 3420 &meson8b_smart_card, 3421 &meson8b_rng0, 3422 &meson8b_uart0, 3423 &meson8b_sdhc, 3424 &meson8b_stream, 3425 &meson8b_async_fifo, 3426 &meson8b_sdio, 3427 &meson8b_abuf, 3428 &meson8b_hiu_iface, 3429 &meson8b_assist_misc, 3430 &meson8b_spi, 3431 &meson8b_i2s_spdif, 3432 &meson8b_eth, 3433 &meson8b_demux, 3434 &meson8b_aiu_glue, 3435 &meson8b_iec958, 3436 &meson8b_i2s_out, 3437 &meson8b_amclk, 3438 &meson8b_aififo2, 3439 &meson8b_mixer, 3440 &meson8b_mixer_iface, 3441 &meson8b_adc, 3442 &meson8b_blkmv, 3443 &meson8b_aiu, 3444 &meson8b_uart1, 3445 &meson8b_g2d, 3446 &meson8b_usb0, 3447 &meson8b_usb1, 3448 &meson8b_reset, 3449 &meson8b_nand, 3450 &meson8b_dos_parser, 3451 &meson8b_usb, 3452 &meson8b_vdin1, 3453 &meson8b_ahb_arb0, 3454 &meson8b_efuse, 3455 &meson8b_boot_rom, 3456 &meson8b_ahb_data_bus, 3457 &meson8b_ahb_ctrl_bus, 3458 &meson8b_hdmi_intr_sync, 3459 &meson8b_hdmi_pclk, 3460 &meson8b_usb1_ddr_bridge, 3461 &meson8b_usb0_ddr_bridge, 3462 &meson8b_mmc_pclk, 3463 &meson8b_dvin, 3464 &meson8b_uart2, 3465 &meson8b_sana, 3466 &meson8b_vpu_intr, 3467 &meson8b_sec_ahb_ahb3_bridge, 3468 &meson8b_clk81_a9, 3469 &meson8b_vclk2_venci0, 3470 &meson8b_vclk2_venci1, 3471 &meson8b_vclk2_vencp0, 3472 &meson8b_vclk2_vencp1, 3473 &meson8b_gclk_venci_int, 3474 &meson8b_gclk_vencp_int, 3475 &meson8b_dac_clk, 3476 &meson8b_aoclk_gate, 3477 &meson8b_iec958_gate, 3478 &meson8b_enc480p, 3479 &meson8b_rng1, 3480 &meson8b_gclk_vencl_int, 3481 &meson8b_vclk2_venclmcc, 3482 &meson8b_vclk2_vencl, 3483 &meson8b_vclk2_other, 3484 &meson8b_edp, 3485 &meson8b_ao_media_cpu, 3486 &meson8b_ao_ahb_sram, 3487 &meson8b_ao_ahb_bus, 3488 &meson8b_ao_iface, 3489 &meson8b_mpeg_clk_div, 3490 &meson8b_mpeg_clk_sel, 3491 &meson8b_mpll0, 3492 &meson8b_mpll1, 3493 &meson8b_mpll2, 3494 &meson8b_mpll0_div, 3495 &meson8b_mpll1_div, 3496 &meson8b_mpll2_div, 3497 &meson8b_fixed_pll, 3498 &meson8b_sys_pll, 3499 &meson8b_cpu_in_sel, 3500 &meson8b_cpu_scale_div, 3501 &meson8b_cpu_scale_out_sel, 3502 &meson8b_cpu_clk, 3503 &meson8b_mpll_prediv, 3504 &meson8b_fclk_div2, 3505 &meson8b_fclk_div3, 3506 &meson8b_fclk_div4, 3507 &meson8b_fclk_div5, 3508 &meson8b_fclk_div7, 3509 &meson8b_nand_clk_sel, 3510 &meson8b_nand_clk_div, 3511 &meson8b_nand_clk_gate, 3512 &meson8b_fixed_pll_dco, 3513 &meson8b_hdmi_pll_dco, 3514 &meson8b_sys_pll_dco, 3515 &meson8b_apb_clk_sel, 3516 &meson8b_apb_clk_gate, 3517 &meson8b_periph_clk_sel, 3518 &meson8b_periph_clk_gate, 3519 &meson8b_axi_clk_sel, 3520 &meson8b_axi_clk_gate, 3521 &meson8b_l2_dram_clk_sel, 3522 &meson8b_l2_dram_clk_gate, 3523 &meson8b_hdmi_pll_lvds_out, 3524 &meson8b_hdmi_pll_hdmi_out, 3525 &meson8b_vid_pll_in_sel, 3526 &meson8b_vid_pll_in_en, 3527 &meson8b_vid_pll_pre_div, 3528 &meson8b_vid_pll_post_div, 3529 &meson8b_vid_pll, 3530 &meson8b_vid_pll_final_div, 3531 &meson8b_vclk_in_sel, 3532 &meson8b_vclk_in_en, 3533 &meson8b_vclk_en, 3534 &meson8b_vclk_div1_gate, 3535 &meson8b_vclk_div2_div_gate, 3536 &meson8b_vclk_div4_div_gate, 3537 &meson8b_vclk_div6_div_gate, 3538 &meson8b_vclk_div12_div_gate, 3539 &meson8b_vclk2_in_sel, 3540 &meson8b_vclk2_clk_in_en, 3541 &meson8b_vclk2_clk_en, 3542 &meson8b_vclk2_div1_gate, 3543 &meson8b_vclk2_div2_div_gate, 3544 &meson8b_vclk2_div4_div_gate, 3545 &meson8b_vclk2_div6_div_gate, 3546 &meson8b_vclk2_div12_div_gate, 3547 &meson8b_cts_enct_sel, 3548 &meson8b_cts_enct, 3549 &meson8b_cts_encp_sel, 3550 &meson8b_cts_encp, 3551 &meson8b_cts_enci_sel, 3552 &meson8b_cts_enci, 3553 &meson8b_hdmi_tx_pixel_sel, 3554 &meson8b_hdmi_tx_pixel, 3555 &meson8b_cts_encl_sel, 3556 &meson8b_cts_encl, 3557 &meson8b_cts_vdac0_sel, 3558 &meson8b_cts_vdac0, 3559 &meson8b_hdmi_sys_sel, 3560 &meson8b_hdmi_sys_div, 3561 &meson8b_hdmi_sys, 3562 &meson8b_mali_0_sel, 3563 &meson8b_mali_0_div, 3564 &meson8b_mali_0, 3565 &meson8b_mali_1_sel, 3566 &meson8b_mali_1_div, 3567 &meson8b_mali_1, 3568 &meson8b_mali, 3569 &meson8m2_gp_pll_dco, 3570 &meson8m2_gp_pll, 3571 &meson8b_vpu_0_sel, 3572 &meson8m2_vpu_0_sel, 3573 &meson8b_vpu_0_div, 3574 &meson8b_vpu_0, 3575 &meson8b_vpu_1_sel, 3576 &meson8m2_vpu_1_sel, 3577 &meson8b_vpu_1_div, 3578 &meson8b_vpu_1, 3579 &meson8b_vpu, 3580 &meson8b_vdec_1_sel, 3581 &meson8b_vdec_1_1_div, 3582 &meson8b_vdec_1_1, 3583 &meson8b_vdec_1_2_div, 3584 &meson8b_vdec_1_2, 3585 &meson8b_vdec_1, 3586 &meson8b_vdec_hcodec_sel, 3587 &meson8b_vdec_hcodec_div, 3588 &meson8b_vdec_hcodec, 3589 &meson8b_vdec_2_sel, 3590 &meson8b_vdec_2_div, 3591 &meson8b_vdec_2, 3592 &meson8b_vdec_hevc_sel, 3593 &meson8b_vdec_hevc_div, 3594 &meson8b_vdec_hevc_en, 3595 &meson8b_vdec_hevc, 3596 &meson8b_cts_amclk, 3597 &meson8b_cts_amclk_sel, 3598 &meson8b_cts_amclk_div, 3599 &meson8b_cts_mclk_i958_sel, 3600 &meson8b_cts_mclk_i958_div, 3601 &meson8b_cts_mclk_i958, 3602 &meson8b_cts_i958, 3603 &meson8b_vid_pll_lvds_en, 3604 }; 3605 3606 static const struct meson8b_clk_reset_line { 3607 u32 reg; 3608 u8 bit_idx; 3609 bool active_low; 3610 } meson8b_clk_reset_bits[] = { 3611 [CLKC_RESET_L2_CACHE_SOFT_RESET] = { 3612 .reg = HHI_SYS_CPU_CLK_CNTL0, 3613 .bit_idx = 30, 3614 .active_low = false, 3615 }, 3616 [CLKC_RESET_AXI_64_TO_128_BRIDGE_A5_SOFT_RESET] = { 3617 .reg = HHI_SYS_CPU_CLK_CNTL0, 3618 .bit_idx = 29, 3619 .active_low = false, 3620 }, 3621 [CLKC_RESET_SCU_SOFT_RESET] = { 3622 .reg = HHI_SYS_CPU_CLK_CNTL0, 3623 .bit_idx = 28, 3624 .active_low = false, 3625 }, 3626 [CLKC_RESET_CPU3_SOFT_RESET] = { 3627 .reg = HHI_SYS_CPU_CLK_CNTL0, 3628 .bit_idx = 27, 3629 .active_low = false, 3630 }, 3631 [CLKC_RESET_CPU2_SOFT_RESET] = { 3632 .reg = HHI_SYS_CPU_CLK_CNTL0, 3633 .bit_idx = 26, 3634 .active_low = false, 3635 }, 3636 [CLKC_RESET_CPU1_SOFT_RESET] = { 3637 .reg = HHI_SYS_CPU_CLK_CNTL0, 3638 .bit_idx = 25, 3639 .active_low = false, 3640 }, 3641 [CLKC_RESET_CPU0_SOFT_RESET] = { 3642 .reg = HHI_SYS_CPU_CLK_CNTL0, 3643 .bit_idx = 24, 3644 .active_low = false, 3645 }, 3646 [CLKC_RESET_A5_GLOBAL_RESET] = { 3647 .reg = HHI_SYS_CPU_CLK_CNTL0, 3648 .bit_idx = 18, 3649 .active_low = false, 3650 }, 3651 [CLKC_RESET_A5_AXI_SOFT_RESET] = { 3652 .reg = HHI_SYS_CPU_CLK_CNTL0, 3653 .bit_idx = 17, 3654 .active_low = false, 3655 }, 3656 [CLKC_RESET_A5_ABP_SOFT_RESET] = { 3657 .reg = HHI_SYS_CPU_CLK_CNTL0, 3658 .bit_idx = 16, 3659 .active_low = false, 3660 }, 3661 [CLKC_RESET_AXI_64_TO_128_BRIDGE_MMC_SOFT_RESET] = { 3662 .reg = HHI_SYS_CPU_CLK_CNTL1, 3663 .bit_idx = 30, 3664 .active_low = false, 3665 }, 3666 [CLKC_RESET_VID_CLK_CNTL_SOFT_RESET] = { 3667 .reg = HHI_VID_CLK_CNTL, 3668 .bit_idx = 15, 3669 .active_low = false, 3670 }, 3671 [CLKC_RESET_VID_DIVIDER_CNTL_SOFT_RESET_POST] = { 3672 .reg = HHI_VID_DIVIDER_CNTL, 3673 .bit_idx = 7, 3674 .active_low = false, 3675 }, 3676 [CLKC_RESET_VID_DIVIDER_CNTL_SOFT_RESET_PRE] = { 3677 .reg = HHI_VID_DIVIDER_CNTL, 3678 .bit_idx = 3, 3679 .active_low = false, 3680 }, 3681 [CLKC_RESET_VID_DIVIDER_CNTL_RESET_N_POST] = { 3682 .reg = HHI_VID_DIVIDER_CNTL, 3683 .bit_idx = 1, 3684 .active_low = true, 3685 }, 3686 [CLKC_RESET_VID_DIVIDER_CNTL_RESET_N_PRE] = { 3687 .reg = HHI_VID_DIVIDER_CNTL, 3688 .bit_idx = 0, 3689 .active_low = true, 3690 }, 3691 }; 3692 3693 static int meson8b_clk_reset_update(struct reset_controller_dev *rcdev, 3694 unsigned long id, bool assert) 3695 { 3696 struct meson8b_clk_reset *meson8b_clk_reset = 3697 container_of(rcdev, struct meson8b_clk_reset, reset); 3698 const struct meson8b_clk_reset_line *reset; 3699 unsigned int value = 0; 3700 3701 if (id >= ARRAY_SIZE(meson8b_clk_reset_bits)) 3702 return -EINVAL; 3703 3704 reset = &meson8b_clk_reset_bits[id]; 3705 3706 if (assert != reset->active_low) 3707 value = BIT(reset->bit_idx); 3708 3709 regmap_update_bits(meson8b_clk_reset->regmap, reset->reg, 3710 BIT(reset->bit_idx), value); 3711 3712 return 0; 3713 } 3714 3715 static int meson8b_clk_reset_assert(struct reset_controller_dev *rcdev, 3716 unsigned long id) 3717 { 3718 return meson8b_clk_reset_update(rcdev, id, true); 3719 } 3720 3721 static int meson8b_clk_reset_deassert(struct reset_controller_dev *rcdev, 3722 unsigned long id) 3723 { 3724 return meson8b_clk_reset_update(rcdev, id, false); 3725 } 3726 3727 static const struct reset_control_ops meson8b_clk_reset_ops = { 3728 .assert = meson8b_clk_reset_assert, 3729 .deassert = meson8b_clk_reset_deassert, 3730 }; 3731 3732 struct meson8b_nb_data { 3733 struct notifier_block nb; 3734 struct clk_hw *cpu_clk; 3735 }; 3736 3737 static int meson8b_cpu_clk_notifier_cb(struct notifier_block *nb, 3738 unsigned long event, void *data) 3739 { 3740 struct meson8b_nb_data *nb_data = 3741 container_of(nb, struct meson8b_nb_data, nb); 3742 struct clk_hw *parent_clk; 3743 int ret; 3744 3745 switch (event) { 3746 case PRE_RATE_CHANGE: 3747 /* xtal */ 3748 parent_clk = clk_hw_get_parent_by_index(nb_data->cpu_clk, 0); 3749 break; 3750 3751 case POST_RATE_CHANGE: 3752 /* cpu_scale_out_sel */ 3753 parent_clk = clk_hw_get_parent_by_index(nb_data->cpu_clk, 1); 3754 break; 3755 3756 default: 3757 return NOTIFY_DONE; 3758 } 3759 3760 ret = clk_hw_set_parent(nb_data->cpu_clk, parent_clk); 3761 if (ret) 3762 return notifier_from_errno(ret); 3763 3764 udelay(100); 3765 3766 return NOTIFY_OK; 3767 } 3768 3769 static struct meson8b_nb_data meson8b_cpu_nb_data = { 3770 .nb.notifier_call = meson8b_cpu_clk_notifier_cb, 3771 }; 3772 3773 static struct meson_clk_hw_data meson8_clks = { 3774 .hws = meson8_hw_clks, 3775 .num = ARRAY_SIZE(meson8_hw_clks), 3776 }; 3777 3778 static struct meson_clk_hw_data meson8b_clks = { 3779 .hws = meson8b_hw_clks, 3780 .num = ARRAY_SIZE(meson8b_hw_clks), 3781 }; 3782 3783 static struct meson_clk_hw_data meson8m2_clks = { 3784 .hws = meson8m2_hw_clks, 3785 .num = ARRAY_SIZE(meson8m2_hw_clks), 3786 }; 3787 3788 static void __init meson8b_clkc_init_common(struct device_node *np, 3789 struct meson_clk_hw_data *hw_clks) 3790 { 3791 struct meson8b_clk_reset *rstc; 3792 struct device_node *parent_np; 3793 const char *notifier_clk_name; 3794 struct clk *notifier_clk; 3795 struct regmap *map; 3796 int i, ret; 3797 3798 parent_np = of_get_parent(np); 3799 map = syscon_node_to_regmap(parent_np); 3800 of_node_put(parent_np); 3801 if (IS_ERR(map)) { 3802 pr_err("failed to get HHI regmap - Trying obsolete regs\n"); 3803 return; 3804 } 3805 3806 rstc = kzalloc(sizeof(*rstc), GFP_KERNEL); 3807 if (!rstc) 3808 return; 3809 3810 /* Reset Controller */ 3811 rstc->regmap = map; 3812 rstc->reset.ops = &meson8b_clk_reset_ops; 3813 rstc->reset.nr_resets = ARRAY_SIZE(meson8b_clk_reset_bits); 3814 rstc->reset.of_node = np; 3815 ret = reset_controller_register(&rstc->reset); 3816 if (ret) { 3817 pr_err("%s: Failed to register clkc reset controller: %d\n", 3818 __func__, ret); 3819 return; 3820 } 3821 3822 /* Populate regmap for the regmap backed clocks */ 3823 for (i = 0; i < ARRAY_SIZE(meson8b_clk_regmaps); i++) 3824 meson8b_clk_regmaps[i]->map = map; 3825 3826 /* 3827 * register all clks and start with the first used ID (which is 3828 * CLKID_PLL_FIXED) 3829 */ 3830 for (i = CLKID_PLL_FIXED; i < hw_clks->num; i++) { 3831 /* array might be sparse */ 3832 if (!hw_clks->hws[i]) 3833 continue; 3834 3835 ret = of_clk_hw_register(np, hw_clks->hws[i]); 3836 if (ret) 3837 return; 3838 } 3839 3840 meson8b_cpu_nb_data.cpu_clk = hw_clks->hws[CLKID_CPUCLK]; 3841 3842 /* 3843 * FIXME we shouldn't program the muxes in notifier handlers. The 3844 * tricky programming sequence will be handled by the forthcoming 3845 * coordinated clock rates mechanism once that feature is released. 3846 */ 3847 notifier_clk_name = clk_hw_get_name(&meson8b_cpu_scale_out_sel.hw); 3848 notifier_clk = __clk_lookup(notifier_clk_name); 3849 ret = clk_notifier_register(notifier_clk, &meson8b_cpu_nb_data.nb); 3850 if (ret) { 3851 pr_err("%s: failed to register the CPU clock notifier\n", 3852 __func__); 3853 return; 3854 } 3855 3856 ret = of_clk_add_hw_provider(np, meson_clk_hw_get, hw_clks); 3857 if (ret) 3858 pr_err("%s: failed to register clock provider\n", __func__); 3859 } 3860 3861 static void __init meson8_clkc_init(struct device_node *np) 3862 { 3863 return meson8b_clkc_init_common(np, &meson8_clks); 3864 } 3865 3866 static void __init meson8b_clkc_init(struct device_node *np) 3867 { 3868 return meson8b_clkc_init_common(np, &meson8b_clks); 3869 } 3870 3871 static void __init meson8m2_clkc_init(struct device_node *np) 3872 { 3873 return meson8b_clkc_init_common(np, &meson8m2_clks); 3874 } 3875 3876 CLK_OF_DECLARE_DRIVER(meson8_clkc, "amlogic,meson8-clkc", 3877 meson8_clkc_init); 3878 CLK_OF_DECLARE_DRIVER(meson8b_clkc, "amlogic,meson8b-clkc", 3879 meson8b_clkc_init); 3880 CLK_OF_DECLARE_DRIVER(meson8m2_clkc, "amlogic,meson8m2-clkc", 3881 meson8m2_clkc_init); 3882