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