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