Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

clk: meson: S4: add support for Amlogic S4 SoC peripheral clock controller

Add the peripherals clock controller driver in the S4 SoC family.

[jbrunet: remove extra new line at end of s4-peripherals.h]
Signed-off-by: Yu Tu <yu.tu@amlogic.com>
Link: https://lore.kernel.org/r/20230904075504.23263-5-yu.tu@amlogic.com
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>

authored by

Yu Tu and committed by
Jerome Brunet
57b55c76 e787c9c5

+3881
+11
drivers/clk/meson/Kconfig
··· 156 156 Support for the PLL clock controller on Amlogic S805X2 and S905Y4 devices, 157 157 AKA S4. Say Y if you want the board to work, because PLLs are the parent of 158 158 most peripherals. 159 + 160 + config COMMON_CLK_S4_PERIPHERALS 161 + tristate "S4 SoC peripherals clock controllers support" 162 + depends on ARM64 163 + default y 164 + select COMMON_CLK_MESON_REGMAP 165 + select COMMON_CLK_MESON_DUALDIV 166 + select COMMON_CLK_MESON_VID_PLL_DIV 167 + help 168 + Support for the peripherals clock controller on Amlogic S805X2 and S905Y4 169 + devices, AKA S4. Say Y if you want S4 peripherals clock controller to work. 159 170 endmenu
+1
drivers/clk/meson/Makefile
··· 23 23 obj-$(CONFIG_COMMON_CLK_G12A) += g12a.o g12a-aoclk.o 24 24 obj-$(CONFIG_COMMON_CLK_MESON8B) += meson8b.o meson8-ddr.o 25 25 obj-$(CONFIG_COMMON_CLK_S4_PLL) += s4-pll.o 26 + obj-$(CONFIG_COMMON_CLK_S4_PERIPHERALS) += s4-peripherals.o
+3813
drivers/clk/meson/s4-peripherals.c
··· 1 + // SPDX-License-Identifier: (GPL-2.0-only OR MIT) 2 + /* 3 + * Amlogic S4 Peripherals Clock Controller Driver 4 + * 5 + * Copyright (c) 2022-2023 Amlogic, inc. All rights reserved 6 + * Author: Yu Tu <yu.tu@amlogic.com> 7 + */ 8 + 9 + #include <linux/clk-provider.h> 10 + #include <linux/of_device.h> 11 + #include <linux/platform_device.h> 12 + 13 + #include "clk-regmap.h" 14 + #include "vid-pll-div.h" 15 + #include "clk-dualdiv.h" 16 + #include "s4-peripherals.h" 17 + #include "meson-clkc-utils.h" 18 + #include <dt-bindings/clock/amlogic,s4-peripherals-clkc.h> 19 + 20 + static struct clk_regmap s4_rtc_32k_by_oscin_clkin = { 21 + .data = &(struct clk_regmap_gate_data){ 22 + .offset = CLKCTRL_RTC_BY_OSCIN_CTRL0, 23 + .bit_idx = 31, 24 + }, 25 + .hw.init = &(struct clk_init_data) { 26 + .name = "rtc_32k_by_oscin_clkin", 27 + .ops = &clk_regmap_gate_ops, 28 + .parent_data = (const struct clk_parent_data []) { 29 + { .fw_name = "xtal", } 30 + }, 31 + .num_parents = 1, 32 + }, 33 + }; 34 + 35 + static const struct meson_clk_dualdiv_param s4_32k_div_table[] = { 36 + { 37 + .dual = 1, 38 + .n1 = 733, 39 + .m1 = 8, 40 + .n2 = 732, 41 + .m2 = 11, 42 + }, 43 + {} 44 + }; 45 + 46 + static struct clk_regmap s4_rtc_32k_by_oscin_div = { 47 + .data = &(struct meson_clk_dualdiv_data){ 48 + .n1 = { 49 + .reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL0, 50 + .shift = 0, 51 + .width = 12, 52 + }, 53 + .n2 = { 54 + .reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL0, 55 + .shift = 12, 56 + .width = 12, 57 + }, 58 + .m1 = { 59 + .reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL1, 60 + .shift = 0, 61 + .width = 12, 62 + }, 63 + .m2 = { 64 + .reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL1, 65 + .shift = 12, 66 + .width = 12, 67 + }, 68 + .dual = { 69 + .reg_off = CLKCTRL_RTC_BY_OSCIN_CTRL0, 70 + .shift = 28, 71 + .width = 1, 72 + }, 73 + .table = s4_32k_div_table, 74 + }, 75 + .hw.init = &(struct clk_init_data){ 76 + .name = "rtc_32k_by_oscin_div", 77 + .ops = &meson_clk_dualdiv_ops, 78 + .parent_hws = (const struct clk_hw *[]) { 79 + &s4_rtc_32k_by_oscin_clkin.hw 80 + }, 81 + .num_parents = 1, 82 + }, 83 + }; 84 + 85 + static struct clk_regmap s4_rtc_32k_by_oscin_sel = { 86 + .data = &(struct clk_regmap_mux_data) { 87 + .offset = CLKCTRL_RTC_BY_OSCIN_CTRL1, 88 + .mask = 0x1, 89 + .shift = 24, 90 + .flags = CLK_MUX_ROUND_CLOSEST, 91 + }, 92 + .hw.init = &(struct clk_init_data){ 93 + .name = "rtc_32k_by_oscin_sel", 94 + .ops = &clk_regmap_mux_ops, 95 + .parent_hws = (const struct clk_hw *[]) { 96 + &s4_rtc_32k_by_oscin_div.hw, 97 + &s4_rtc_32k_by_oscin_clkin.hw, 98 + }, 99 + .num_parents = 2, 100 + .flags = CLK_SET_RATE_PARENT, 101 + }, 102 + }; 103 + 104 + static struct clk_regmap s4_rtc_32k_by_oscin = { 105 + .data = &(struct clk_regmap_gate_data){ 106 + .offset = CLKCTRL_RTC_BY_OSCIN_CTRL0, 107 + .bit_idx = 30, 108 + }, 109 + .hw.init = &(struct clk_init_data) { 110 + .name = "rtc_32k_by_oscin", 111 + .ops = &clk_regmap_gate_ops, 112 + .parent_hws = (const struct clk_hw *[]) { 113 + &s4_rtc_32k_by_oscin_sel.hw 114 + }, 115 + .num_parents = 1, 116 + .flags = CLK_SET_RATE_PARENT, 117 + }, 118 + }; 119 + 120 + static struct clk_regmap s4_rtc_clk = { 121 + .data = &(struct clk_regmap_mux_data) { 122 + .offset = CLKCTRL_RTC_CTRL, 123 + .mask = 0x3, 124 + .shift = 0, 125 + .flags = CLK_MUX_ROUND_CLOSEST, 126 + }, 127 + .hw.init = &(struct clk_init_data){ 128 + .name = "rtc_clk_sel", 129 + .ops = &clk_regmap_mux_ops, 130 + .parent_hws = (const struct clk_hw *[]) { 131 + &s4_rtc_32k_by_oscin.hw, 132 + &s4_rtc_32k_by_oscin_div.hw, 133 + }, 134 + .num_parents = 2, 135 + .flags = CLK_SET_RATE_PARENT, 136 + }, 137 + }; 138 + 139 + /* The index 5 is AXI_CLK, which is dedicated to AXI. So skip it. */ 140 + static u32 mux_table_sys_ab_clk_sel[] = { 0, 1, 2, 3, 4, 6, 7 }; 141 + static const struct clk_parent_data sys_ab_clk_parent_data[] = { 142 + { .fw_name = "xtal" }, 143 + { .fw_name = "fclk_div2" }, 144 + { .fw_name = "fclk_div3" }, 145 + { .fw_name = "fclk_div4" }, 146 + { .fw_name = "fclk_div5" }, 147 + { .fw_name = "fclk_div7" }, 148 + { .hw = &s4_rtc_clk.hw } 149 + }; 150 + 151 + /* 152 + * This clock is initialized by ROMcode. 153 + * The chip was changed SYS CLK for security reasons. SYS CLK registers are not writable 154 + * in the kernel phase. Write of SYS related register will cause the system to crash. 155 + * Meanwhile, these clock won't ever change at runtime. 156 + * For the above reasons, we can only use ro_ops for SYS related clocks. 157 + */ 158 + static struct clk_regmap s4_sysclk_b_sel = { 159 + .data = &(struct clk_regmap_mux_data){ 160 + .offset = CLKCTRL_SYS_CLK_CTRL0, 161 + .mask = 0x7, 162 + .shift = 26, 163 + .table = mux_table_sys_ab_clk_sel, 164 + }, 165 + .hw.init = &(struct clk_init_data){ 166 + .name = "sysclk_b_sel", 167 + .ops = &clk_regmap_mux_ro_ops, 168 + .parent_data = sys_ab_clk_parent_data, 169 + .num_parents = ARRAY_SIZE(sys_ab_clk_parent_data), 170 + }, 171 + }; 172 + 173 + static struct clk_regmap s4_sysclk_b_div = { 174 + .data = &(struct clk_regmap_div_data){ 175 + .offset = CLKCTRL_SYS_CLK_CTRL0, 176 + .shift = 16, 177 + .width = 10, 178 + }, 179 + .hw.init = &(struct clk_init_data){ 180 + .name = "sysclk_b_div", 181 + .ops = &clk_regmap_divider_ro_ops, 182 + .parent_hws = (const struct clk_hw *[]) { 183 + &s4_sysclk_b_sel.hw 184 + }, 185 + .num_parents = 1, 186 + }, 187 + }; 188 + 189 + static struct clk_regmap s4_sysclk_b = { 190 + .data = &(struct clk_regmap_gate_data){ 191 + .offset = CLKCTRL_SYS_CLK_CTRL0, 192 + .bit_idx = 29, 193 + }, 194 + .hw.init = &(struct clk_init_data) { 195 + .name = "sysclk_b", 196 + .ops = &clk_regmap_gate_ro_ops, 197 + .parent_hws = (const struct clk_hw *[]) { 198 + &s4_sysclk_b_div.hw 199 + }, 200 + .num_parents = 1, 201 + }, 202 + }; 203 + 204 + static struct clk_regmap s4_sysclk_a_sel = { 205 + .data = &(struct clk_regmap_mux_data){ 206 + .offset = CLKCTRL_SYS_CLK_CTRL0, 207 + .mask = 0x7, 208 + .shift = 10, 209 + .table = mux_table_sys_ab_clk_sel, 210 + }, 211 + .hw.init = &(struct clk_init_data){ 212 + .name = "sysclk_a_sel", 213 + .ops = &clk_regmap_mux_ro_ops, 214 + .parent_data = sys_ab_clk_parent_data, 215 + .num_parents = ARRAY_SIZE(sys_ab_clk_parent_data), 216 + }, 217 + }; 218 + 219 + static struct clk_regmap s4_sysclk_a_div = { 220 + .data = &(struct clk_regmap_div_data){ 221 + .offset = CLKCTRL_SYS_CLK_CTRL0, 222 + .shift = 0, 223 + .width = 10, 224 + }, 225 + .hw.init = &(struct clk_init_data){ 226 + .name = "sysclk_a_div", 227 + .ops = &clk_regmap_divider_ro_ops, 228 + .parent_hws = (const struct clk_hw *[]) { 229 + &s4_sysclk_a_sel.hw 230 + }, 231 + .num_parents = 1, 232 + }, 233 + }; 234 + 235 + static struct clk_regmap s4_sysclk_a = { 236 + .data = &(struct clk_regmap_gate_data){ 237 + .offset = CLKCTRL_SYS_CLK_CTRL0, 238 + .bit_idx = 13, 239 + }, 240 + .hw.init = &(struct clk_init_data) { 241 + .name = "sysclk_a", 242 + .ops = &clk_regmap_gate_ro_ops, 243 + .parent_hws = (const struct clk_hw *[]) { 244 + &s4_sysclk_a_div.hw 245 + }, 246 + .num_parents = 1, 247 + }, 248 + }; 249 + 250 + static struct clk_regmap s4_sys_clk = { 251 + .data = &(struct clk_regmap_mux_data){ 252 + .offset = CLKCTRL_SYS_CLK_CTRL0, 253 + .mask = 0x1, 254 + .shift = 31, 255 + }, 256 + .hw.init = &(struct clk_init_data){ 257 + .name = "sys_clk", 258 + .ops = &clk_regmap_mux_ro_ops, 259 + .parent_hws = (const struct clk_hw *[]) { 260 + &s4_sysclk_a.hw, 261 + &s4_sysclk_b.hw 262 + }, 263 + .num_parents = 2, 264 + }, 265 + }; 266 + 267 + static struct clk_regmap s4_ceca_32k_clkin = { 268 + .data = &(struct clk_regmap_gate_data){ 269 + .offset = CLKCTRL_CECA_CTRL0, 270 + .bit_idx = 31, 271 + }, 272 + .hw.init = &(struct clk_init_data) { 273 + .name = "ceca_32k_clkin", 274 + .ops = &clk_regmap_gate_ops, 275 + .parent_data = (const struct clk_parent_data []) { 276 + { .fw_name = "xtal", } 277 + }, 278 + .num_parents = 1, 279 + }, 280 + }; 281 + 282 + static struct clk_regmap s4_ceca_32k_div = { 283 + .data = &(struct meson_clk_dualdiv_data){ 284 + .n1 = { 285 + .reg_off = CLKCTRL_CECA_CTRL0, 286 + .shift = 0, 287 + .width = 12, 288 + }, 289 + .n2 = { 290 + .reg_off = CLKCTRL_CECA_CTRL0, 291 + .shift = 12, 292 + .width = 12, 293 + }, 294 + .m1 = { 295 + .reg_off = CLKCTRL_CECA_CTRL1, 296 + .shift = 0, 297 + .width = 12, 298 + }, 299 + .m2 = { 300 + .reg_off = CLKCTRL_CECA_CTRL1, 301 + .shift = 12, 302 + .width = 12, 303 + }, 304 + .dual = { 305 + .reg_off = CLKCTRL_CECA_CTRL0, 306 + .shift = 28, 307 + .width = 1, 308 + }, 309 + .table = s4_32k_div_table, 310 + }, 311 + .hw.init = &(struct clk_init_data){ 312 + .name = "ceca_32k_div", 313 + .ops = &meson_clk_dualdiv_ops, 314 + .parent_hws = (const struct clk_hw *[]) { 315 + &s4_ceca_32k_clkin.hw 316 + }, 317 + .num_parents = 1, 318 + }, 319 + }; 320 + 321 + static struct clk_regmap s4_ceca_32k_sel_pre = { 322 + .data = &(struct clk_regmap_mux_data) { 323 + .offset = CLKCTRL_CECA_CTRL1, 324 + .mask = 0x1, 325 + .shift = 24, 326 + .flags = CLK_MUX_ROUND_CLOSEST, 327 + }, 328 + .hw.init = &(struct clk_init_data){ 329 + .name = "ceca_32k_sel_pre", 330 + .ops = &clk_regmap_mux_ops, 331 + .parent_hws = (const struct clk_hw *[]) { 332 + &s4_ceca_32k_div.hw, 333 + &s4_ceca_32k_clkin.hw 334 + }, 335 + .num_parents = 2, 336 + .flags = CLK_SET_RATE_PARENT, 337 + }, 338 + }; 339 + 340 + static struct clk_regmap s4_ceca_32k_sel = { 341 + .data = &(struct clk_regmap_mux_data) { 342 + .offset = CLKCTRL_CECA_CTRL1, 343 + .mask = 0x1, 344 + .shift = 31, 345 + .flags = CLK_MUX_ROUND_CLOSEST, 346 + }, 347 + .hw.init = &(struct clk_init_data){ 348 + .name = "ceca_32k_sel", 349 + .ops = &clk_regmap_mux_ops, 350 + .parent_hws = (const struct clk_hw *[]) { 351 + &s4_ceca_32k_sel_pre.hw, 352 + &s4_rtc_clk.hw 353 + }, 354 + .num_parents = 2, 355 + }, 356 + }; 357 + 358 + static struct clk_regmap s4_ceca_32k_clkout = { 359 + .data = &(struct clk_regmap_gate_data){ 360 + .offset = CLKCTRL_CECA_CTRL0, 361 + .bit_idx = 30, 362 + }, 363 + .hw.init = &(struct clk_init_data){ 364 + .name = "ceca_32k_clkout", 365 + .ops = &clk_regmap_gate_ops, 366 + .parent_hws = (const struct clk_hw *[]) { 367 + &s4_ceca_32k_sel.hw 368 + }, 369 + .num_parents = 1, 370 + .flags = CLK_SET_RATE_PARENT, 371 + }, 372 + }; 373 + 374 + static struct clk_regmap s4_cecb_32k_clkin = { 375 + .data = &(struct clk_regmap_gate_data){ 376 + .offset = CLKCTRL_CECB_CTRL0, 377 + .bit_idx = 31, 378 + }, 379 + .hw.init = &(struct clk_init_data) { 380 + .name = "cecb_32k_clkin", 381 + .ops = &clk_regmap_gate_ops, 382 + .parent_data = (const struct clk_parent_data []) { 383 + { .fw_name = "xtal", } 384 + }, 385 + .num_parents = 1, 386 + }, 387 + }; 388 + 389 + static struct clk_regmap s4_cecb_32k_div = { 390 + .data = &(struct meson_clk_dualdiv_data){ 391 + .n1 = { 392 + .reg_off = CLKCTRL_CECB_CTRL0, 393 + .shift = 0, 394 + .width = 12, 395 + }, 396 + .n2 = { 397 + .reg_off = CLKCTRL_CECB_CTRL0, 398 + .shift = 12, 399 + .width = 12, 400 + }, 401 + .m1 = { 402 + .reg_off = CLKCTRL_CECB_CTRL1, 403 + .shift = 0, 404 + .width = 12, 405 + }, 406 + .m2 = { 407 + .reg_off = CLKCTRL_CECB_CTRL1, 408 + .shift = 12, 409 + .width = 12, 410 + }, 411 + .dual = { 412 + .reg_off = CLKCTRL_CECB_CTRL0, 413 + .shift = 28, 414 + .width = 1, 415 + }, 416 + .table = s4_32k_div_table, 417 + }, 418 + .hw.init = &(struct clk_init_data){ 419 + .name = "cecb_32k_div", 420 + .ops = &meson_clk_dualdiv_ops, 421 + .parent_hws = (const struct clk_hw *[]) { 422 + &s4_cecb_32k_clkin.hw 423 + }, 424 + .num_parents = 1, 425 + }, 426 + }; 427 + 428 + static struct clk_regmap s4_cecb_32k_sel_pre = { 429 + .data = &(struct clk_regmap_mux_data) { 430 + .offset = CLKCTRL_CECB_CTRL1, 431 + .mask = 0x1, 432 + .shift = 24, 433 + .flags = CLK_MUX_ROUND_CLOSEST, 434 + }, 435 + .hw.init = &(struct clk_init_data){ 436 + .name = "cecb_32k_sel_pre", 437 + .ops = &clk_regmap_mux_ops, 438 + .parent_hws = (const struct clk_hw *[]) { 439 + &s4_cecb_32k_div.hw, 440 + &s4_cecb_32k_clkin.hw 441 + }, 442 + .num_parents = 2, 443 + .flags = CLK_SET_RATE_PARENT, 444 + }, 445 + }; 446 + 447 + static struct clk_regmap s4_cecb_32k_sel = { 448 + .data = &(struct clk_regmap_mux_data) { 449 + .offset = CLKCTRL_CECB_CTRL1, 450 + .mask = 0x1, 451 + .shift = 31, 452 + .flags = CLK_MUX_ROUND_CLOSEST, 453 + }, 454 + .hw.init = &(struct clk_init_data){ 455 + .name = "cecb_32k_sel", 456 + .ops = &clk_regmap_mux_ops, 457 + .parent_hws = (const struct clk_hw *[]) { 458 + &s4_cecb_32k_sel_pre.hw, 459 + &s4_rtc_clk.hw 460 + }, 461 + .num_parents = 2, 462 + }, 463 + }; 464 + 465 + static struct clk_regmap s4_cecb_32k_clkout = { 466 + .data = &(struct clk_regmap_gate_data){ 467 + .offset = CLKCTRL_CECB_CTRL0, 468 + .bit_idx = 30, 469 + }, 470 + .hw.init = &(struct clk_init_data){ 471 + .name = "cecb_32k_clkout", 472 + .ops = &clk_regmap_gate_ops, 473 + .parent_hws = (const struct clk_hw *[]) { 474 + &s4_cecb_32k_sel.hw 475 + }, 476 + .num_parents = 1, 477 + .flags = CLK_SET_RATE_PARENT, 478 + }, 479 + }; 480 + 481 + static const struct clk_parent_data s4_sc_parent_data[] = { 482 + { .fw_name = "fclk_div4" }, 483 + { .fw_name = "fclk_div3" }, 484 + { .fw_name = "fclk_div5" }, 485 + { .fw_name = "xtal", } 486 + }; 487 + 488 + static struct clk_regmap s4_sc_clk_mux = { 489 + .data = &(struct clk_regmap_mux_data){ 490 + .offset = CLKCTRL_SC_CLK_CTRL, 491 + .mask = 0x3, 492 + .shift = 9, 493 + }, 494 + .hw.init = &(struct clk_init_data) { 495 + .name = "sc_clk_mux", 496 + .ops = &clk_regmap_mux_ops, 497 + .parent_data = s4_sc_parent_data, 498 + .num_parents = ARRAY_SIZE(s4_sc_parent_data), 499 + .flags = CLK_SET_RATE_PARENT, 500 + }, 501 + }; 502 + 503 + static struct clk_regmap s4_sc_clk_div = { 504 + .data = &(struct clk_regmap_div_data){ 505 + .offset = CLKCTRL_SC_CLK_CTRL, 506 + .shift = 0, 507 + .width = 8, 508 + }, 509 + .hw.init = &(struct clk_init_data) { 510 + .name = "sc_clk_div", 511 + .ops = &clk_regmap_divider_ops, 512 + .parent_hws = (const struct clk_hw *[]) { 513 + &s4_sc_clk_mux.hw 514 + }, 515 + .num_parents = 1, 516 + .flags = CLK_SET_RATE_PARENT, 517 + }, 518 + }; 519 + 520 + static struct clk_regmap s4_sc_clk_gate = { 521 + .data = &(struct clk_regmap_gate_data){ 522 + .offset = CLKCTRL_SC_CLK_CTRL, 523 + .bit_idx = 8, 524 + }, 525 + .hw.init = &(struct clk_init_data){ 526 + .name = "sc_clk_gate", 527 + .ops = &clk_regmap_gate_ops, 528 + .parent_hws = (const struct clk_hw *[]) { 529 + &s4_sc_clk_div.hw 530 + }, 531 + .num_parents = 1, 532 + .flags = CLK_SET_RATE_PARENT, 533 + }, 534 + }; 535 + 536 + static struct clk_regmap s4_12_24M_clk_gate = { 537 + .data = &(struct clk_regmap_gate_data){ 538 + .offset = CLKCTRL_CLK12_24_CTRL, 539 + .bit_idx = 11, 540 + }, 541 + .hw.init = &(struct clk_init_data) { 542 + .name = "12_24m_gate", 543 + .ops = &clk_regmap_gate_ops, 544 + .parent_data = (const struct clk_parent_data []) { 545 + { .fw_name = "xtal", } 546 + }, 547 + .num_parents = 1, 548 + }, 549 + }; 550 + 551 + static struct clk_fixed_factor s4_12M_clk_div = { 552 + .mult = 1, 553 + .div = 2, 554 + .hw.init = &(struct clk_init_data){ 555 + .name = "12M", 556 + .ops = &clk_fixed_factor_ops, 557 + .parent_hws = (const struct clk_hw *[]) { 558 + &s4_12_24M_clk_gate.hw 559 + }, 560 + .num_parents = 1, 561 + .flags = CLK_SET_RATE_PARENT, 562 + }, 563 + }; 564 + 565 + static struct clk_regmap s4_12_24M_clk = { 566 + .data = &(struct clk_regmap_mux_data){ 567 + .offset = CLKCTRL_CLK12_24_CTRL, 568 + .mask = 0x1, 569 + .shift = 10, 570 + }, 571 + .hw.init = &(struct clk_init_data) { 572 + .name = "12_24m", 573 + .ops = &clk_regmap_mux_ops, 574 + .parent_hws = (const struct clk_hw *[]) { 575 + &s4_12_24M_clk_gate.hw, 576 + &s4_12M_clk_div.hw, 577 + }, 578 + .num_parents = 2, 579 + .flags = CLK_SET_RATE_PARENT, 580 + }, 581 + }; 582 + 583 + /* Video Clocks */ 584 + static struct clk_regmap s4_vid_pll_div = { 585 + .data = &(struct meson_vid_pll_div_data){ 586 + .val = { 587 + .reg_off = CLKCTRL_VID_PLL_CLK_DIV, 588 + .shift = 0, 589 + .width = 15, 590 + }, 591 + .sel = { 592 + .reg_off = CLKCTRL_VID_PLL_CLK_DIV, 593 + .shift = 16, 594 + .width = 2, 595 + }, 596 + }, 597 + .hw.init = &(struct clk_init_data) { 598 + .name = "vid_pll_div", 599 + /* 600 + * TODO meson_vid_pll_div_ro_ops to meson_vid_pll_div_ops 601 + */ 602 + .ops = &meson_vid_pll_div_ro_ops, 603 + .parent_data = (const struct clk_parent_data []) { 604 + { .fw_name = "hdmi_pll", } 605 + }, 606 + .num_parents = 1, 607 + .flags = CLK_SET_RATE_PARENT, 608 + }, 609 + }; 610 + 611 + static struct clk_regmap s4_vid_pll_sel = { 612 + .data = &(struct clk_regmap_mux_data){ 613 + .offset = CLKCTRL_VID_PLL_CLK_DIV, 614 + .mask = 0x1, 615 + .shift = 18, 616 + }, 617 + .hw.init = &(struct clk_init_data){ 618 + .name = "vid_pll_sel", 619 + .ops = &clk_regmap_mux_ops, 620 + .parent_data = (const struct clk_parent_data []) { 621 + { .hw = &s4_vid_pll_div.hw }, 622 + { .fw_name = "hdmi_pll", } 623 + }, 624 + .num_parents = 2, 625 + .flags = CLK_SET_RATE_PARENT, 626 + }, 627 + }; 628 + 629 + static struct clk_regmap s4_vid_pll = { 630 + .data = &(struct clk_regmap_gate_data){ 631 + .offset = CLKCTRL_VID_PLL_CLK_DIV, 632 + .bit_idx = 19, 633 + }, 634 + .hw.init = &(struct clk_init_data) { 635 + .name = "vid_pll", 636 + .ops = &clk_regmap_gate_ops, 637 + .parent_hws = (const struct clk_hw *[]) { 638 + &s4_vid_pll_sel.hw 639 + }, 640 + .num_parents = 1, 641 + .flags = CLK_SET_RATE_PARENT, 642 + }, 643 + }; 644 + 645 + static const struct clk_parent_data s4_vclk_parent_data[] = { 646 + { .hw = &s4_vid_pll.hw }, 647 + { .fw_name = "gp0_pll", }, 648 + { .fw_name = "hifi_pll", }, 649 + { .fw_name = "mpll1", }, 650 + { .fw_name = "fclk_div3", }, 651 + { .fw_name = "fclk_div4", }, 652 + { .fw_name = "fclk_div5", }, 653 + { .fw_name = "fclk_div7", }, 654 + }; 655 + 656 + static struct clk_regmap s4_vclk_sel = { 657 + .data = &(struct clk_regmap_mux_data){ 658 + .offset = CLKCTRL_VID_CLK_CTRL, 659 + .mask = 0x7, 660 + .shift = 16, 661 + }, 662 + .hw.init = &(struct clk_init_data){ 663 + .name = "vclk_sel", 664 + .ops = &clk_regmap_mux_ops, 665 + .parent_data = s4_vclk_parent_data, 666 + .num_parents = ARRAY_SIZE(s4_vclk_parent_data), 667 + .flags = 0, 668 + }, 669 + }; 670 + 671 + static struct clk_regmap s4_vclk2_sel = { 672 + .data = &(struct clk_regmap_mux_data){ 673 + .offset = CLKCTRL_VIID_CLK_CTRL, 674 + .mask = 0x7, 675 + .shift = 16, 676 + }, 677 + .hw.init = &(struct clk_init_data){ 678 + .name = "vclk2_sel", 679 + .ops = &clk_regmap_mux_ops, 680 + .parent_data = s4_vclk_parent_data, 681 + .num_parents = ARRAY_SIZE(s4_vclk_parent_data), 682 + .flags = 0, 683 + }, 684 + }; 685 + 686 + static struct clk_regmap s4_vclk_input = { 687 + .data = &(struct clk_regmap_gate_data){ 688 + .offset = CLKCTRL_VID_CLK_DIV, 689 + .bit_idx = 16, 690 + }, 691 + .hw.init = &(struct clk_init_data) { 692 + .name = "vclk_input", 693 + .ops = &clk_regmap_gate_ops, 694 + .parent_hws = (const struct clk_hw *[]) { &s4_vclk_sel.hw }, 695 + .num_parents = 1, 696 + .flags = CLK_SET_RATE_PARENT, 697 + }, 698 + }; 699 + 700 + static struct clk_regmap s4_vclk2_input = { 701 + .data = &(struct clk_regmap_gate_data){ 702 + .offset = CLKCTRL_VIID_CLK_DIV, 703 + .bit_idx = 16, 704 + }, 705 + .hw.init = &(struct clk_init_data) { 706 + .name = "vclk2_input", 707 + .ops = &clk_regmap_gate_ops, 708 + .parent_hws = (const struct clk_hw *[]) { &s4_vclk2_sel.hw }, 709 + .num_parents = 1, 710 + .flags = CLK_SET_RATE_PARENT, 711 + }, 712 + }; 713 + 714 + static struct clk_regmap s4_vclk_div = { 715 + .data = &(struct clk_regmap_div_data){ 716 + .offset = CLKCTRL_VID_CLK_DIV, 717 + .shift = 0, 718 + .width = 8, 719 + }, 720 + .hw.init = &(struct clk_init_data){ 721 + .name = "vclk_div", 722 + .ops = &clk_regmap_divider_ops, 723 + .parent_hws = (const struct clk_hw *[]) { 724 + &s4_vclk_input.hw 725 + }, 726 + .num_parents = 1, 727 + .flags = CLK_SET_RATE_PARENT, 728 + }, 729 + }; 730 + 731 + static struct clk_regmap s4_vclk2_div = { 732 + .data = &(struct clk_regmap_div_data){ 733 + .offset = CLKCTRL_VIID_CLK_DIV, 734 + .shift = 0, 735 + .width = 8, 736 + }, 737 + .hw.init = &(struct clk_init_data){ 738 + .name = "vclk2_div", 739 + .ops = &clk_regmap_divider_ops, 740 + .parent_hws = (const struct clk_hw *[]) { 741 + &s4_vclk2_input.hw 742 + }, 743 + .num_parents = 1, 744 + .flags = CLK_SET_RATE_PARENT, 745 + }, 746 + }; 747 + 748 + static struct clk_regmap s4_vclk = { 749 + .data = &(struct clk_regmap_gate_data){ 750 + .offset = CLKCTRL_VID_CLK_CTRL, 751 + .bit_idx = 19, 752 + }, 753 + .hw.init = &(struct clk_init_data) { 754 + .name = "vclk", 755 + .ops = &clk_regmap_gate_ops, 756 + .parent_hws = (const struct clk_hw *[]) { &s4_vclk_div.hw }, 757 + .num_parents = 1, 758 + .flags = CLK_SET_RATE_PARENT, 759 + }, 760 + }; 761 + 762 + static struct clk_regmap s4_vclk2 = { 763 + .data = &(struct clk_regmap_gate_data){ 764 + .offset = CLKCTRL_VIID_CLK_CTRL, 765 + .bit_idx = 19, 766 + }, 767 + .hw.init = &(struct clk_init_data) { 768 + .name = "vclk2", 769 + .ops = &clk_regmap_gate_ops, 770 + .parent_hws = (const struct clk_hw *[]) { &s4_vclk2_div.hw }, 771 + .num_parents = 1, 772 + .flags = CLK_SET_RATE_PARENT, 773 + }, 774 + }; 775 + 776 + static struct clk_regmap s4_vclk_div1 = { 777 + .data = &(struct clk_regmap_gate_data){ 778 + .offset = CLKCTRL_VID_CLK_CTRL, 779 + .bit_idx = 0, 780 + }, 781 + .hw.init = &(struct clk_init_data) { 782 + .name = "vclk_div1", 783 + .ops = &clk_regmap_gate_ops, 784 + .parent_hws = (const struct clk_hw *[]) { &s4_vclk.hw }, 785 + .num_parents = 1, 786 + .flags = CLK_SET_RATE_PARENT, 787 + }, 788 + }; 789 + 790 + static struct clk_regmap s4_vclk_div2_en = { 791 + .data = &(struct clk_regmap_gate_data){ 792 + .offset = CLKCTRL_VID_CLK_CTRL, 793 + .bit_idx = 1, 794 + }, 795 + .hw.init = &(struct clk_init_data) { 796 + .name = "vclk_div2_en", 797 + .ops = &clk_regmap_gate_ops, 798 + .parent_hws = (const struct clk_hw *[]) { &s4_vclk.hw }, 799 + .num_parents = 1, 800 + .flags = CLK_SET_RATE_PARENT, 801 + }, 802 + }; 803 + 804 + static struct clk_regmap s4_vclk_div4_en = { 805 + .data = &(struct clk_regmap_gate_data){ 806 + .offset = CLKCTRL_VID_CLK_CTRL, 807 + .bit_idx = 2, 808 + }, 809 + .hw.init = &(struct clk_init_data) { 810 + .name = "vclk_div4_en", 811 + .ops = &clk_regmap_gate_ops, 812 + .parent_hws = (const struct clk_hw *[]) { &s4_vclk.hw }, 813 + .num_parents = 1, 814 + .flags = CLK_SET_RATE_PARENT, 815 + }, 816 + }; 817 + 818 + static struct clk_regmap s4_vclk_div6_en = { 819 + .data = &(struct clk_regmap_gate_data){ 820 + .offset = CLKCTRL_VID_CLK_CTRL, 821 + .bit_idx = 3, 822 + }, 823 + .hw.init = &(struct clk_init_data) { 824 + .name = "vclk_div6_en", 825 + .ops = &clk_regmap_gate_ops, 826 + .parent_hws = (const struct clk_hw *[]) { &s4_vclk.hw }, 827 + .num_parents = 1, 828 + .flags = CLK_SET_RATE_PARENT, 829 + }, 830 + }; 831 + 832 + static struct clk_regmap s4_vclk_div12_en = { 833 + .data = &(struct clk_regmap_gate_data){ 834 + .offset = CLKCTRL_VID_CLK_CTRL, 835 + .bit_idx = 4, 836 + }, 837 + .hw.init = &(struct clk_init_data) { 838 + .name = "vclk_div12_en", 839 + .ops = &clk_regmap_gate_ops, 840 + .parent_hws = (const struct clk_hw *[]) { &s4_vclk.hw }, 841 + .num_parents = 1, 842 + .flags = CLK_SET_RATE_PARENT, 843 + }, 844 + }; 845 + 846 + static struct clk_regmap s4_vclk2_div1 = { 847 + .data = &(struct clk_regmap_gate_data){ 848 + .offset = CLKCTRL_VIID_CLK_CTRL, 849 + .bit_idx = 0, 850 + }, 851 + .hw.init = &(struct clk_init_data) { 852 + .name = "vclk2_div1", 853 + .ops = &clk_regmap_gate_ops, 854 + .parent_hws = (const struct clk_hw *[]) { &s4_vclk2.hw }, 855 + .num_parents = 1, 856 + .flags = CLK_SET_RATE_PARENT, 857 + }, 858 + }; 859 + 860 + static struct clk_regmap s4_vclk2_div2_en = { 861 + .data = &(struct clk_regmap_gate_data){ 862 + .offset = CLKCTRL_VIID_CLK_CTRL, 863 + .bit_idx = 1, 864 + }, 865 + .hw.init = &(struct clk_init_data) { 866 + .name = "vclk2_div2_en", 867 + .ops = &clk_regmap_gate_ops, 868 + .parent_hws = (const struct clk_hw *[]) { &s4_vclk2.hw }, 869 + .num_parents = 1, 870 + .flags = CLK_SET_RATE_PARENT, 871 + }, 872 + }; 873 + 874 + static struct clk_regmap s4_vclk2_div4_en = { 875 + .data = &(struct clk_regmap_gate_data){ 876 + .offset = CLKCTRL_VIID_CLK_CTRL, 877 + .bit_idx = 2, 878 + }, 879 + .hw.init = &(struct clk_init_data) { 880 + .name = "vclk2_div4_en", 881 + .ops = &clk_regmap_gate_ops, 882 + .parent_hws = (const struct clk_hw *[]) { &s4_vclk2.hw }, 883 + .num_parents = 1, 884 + .flags = CLK_SET_RATE_PARENT, 885 + }, 886 + }; 887 + 888 + static struct clk_regmap s4_vclk2_div6_en = { 889 + .data = &(struct clk_regmap_gate_data){ 890 + .offset = CLKCTRL_VIID_CLK_CTRL, 891 + .bit_idx = 3, 892 + }, 893 + .hw.init = &(struct clk_init_data) { 894 + .name = "vclk2_div6_en", 895 + .ops = &clk_regmap_gate_ops, 896 + .parent_hws = (const struct clk_hw *[]) { &s4_vclk2.hw }, 897 + .num_parents = 1, 898 + .flags = CLK_SET_RATE_PARENT, 899 + }, 900 + }; 901 + 902 + static struct clk_regmap s4_vclk2_div12_en = { 903 + .data = &(struct clk_regmap_gate_data){ 904 + .offset = CLKCTRL_VIID_CLK_CTRL, 905 + .bit_idx = 4, 906 + }, 907 + .hw.init = &(struct clk_init_data) { 908 + .name = "vclk2_div12_en", 909 + .ops = &clk_regmap_gate_ops, 910 + .parent_hws = (const struct clk_hw *[]) { &s4_vclk2.hw }, 911 + .num_parents = 1, 912 + .flags = CLK_SET_RATE_PARENT, 913 + }, 914 + }; 915 + 916 + static struct clk_fixed_factor s4_vclk_div2 = { 917 + .mult = 1, 918 + .div = 2, 919 + .hw.init = &(struct clk_init_data){ 920 + .name = "vclk_div2", 921 + .ops = &clk_fixed_factor_ops, 922 + .parent_hws = (const struct clk_hw *[]) { 923 + &s4_vclk_div2_en.hw 924 + }, 925 + .num_parents = 1, 926 + .flags = CLK_SET_RATE_PARENT, 927 + }, 928 + }; 929 + 930 + static struct clk_fixed_factor s4_vclk_div4 = { 931 + .mult = 1, 932 + .div = 4, 933 + .hw.init = &(struct clk_init_data){ 934 + .name = "vclk_div4", 935 + .ops = &clk_fixed_factor_ops, 936 + .parent_hws = (const struct clk_hw *[]) { 937 + &s4_vclk_div4_en.hw 938 + }, 939 + .num_parents = 1, 940 + .flags = CLK_SET_RATE_PARENT, 941 + }, 942 + }; 943 + 944 + static struct clk_fixed_factor s4_vclk_div6 = { 945 + .mult = 1, 946 + .div = 6, 947 + .hw.init = &(struct clk_init_data){ 948 + .name = "vclk_div6", 949 + .ops = &clk_fixed_factor_ops, 950 + .parent_hws = (const struct clk_hw *[]) { 951 + &s4_vclk_div6_en.hw 952 + }, 953 + .num_parents = 1, 954 + .flags = CLK_SET_RATE_PARENT, 955 + }, 956 + }; 957 + 958 + static struct clk_fixed_factor s4_vclk_div12 = { 959 + .mult = 1, 960 + .div = 12, 961 + .hw.init = &(struct clk_init_data){ 962 + .name = "vclk_div12", 963 + .ops = &clk_fixed_factor_ops, 964 + .parent_hws = (const struct clk_hw *[]) { 965 + &s4_vclk_div12_en.hw 966 + }, 967 + .num_parents = 1, 968 + .flags = CLK_SET_RATE_PARENT, 969 + }, 970 + }; 971 + 972 + static struct clk_fixed_factor s4_vclk2_div2 = { 973 + .mult = 1, 974 + .div = 2, 975 + .hw.init = &(struct clk_init_data){ 976 + .name = "vclk2_div2", 977 + .ops = &clk_fixed_factor_ops, 978 + .parent_hws = (const struct clk_hw *[]) { 979 + &s4_vclk2_div2_en.hw 980 + }, 981 + .num_parents = 1, 982 + .flags = CLK_SET_RATE_PARENT, 983 + }, 984 + }; 985 + 986 + static struct clk_fixed_factor s4_vclk2_div4 = { 987 + .mult = 1, 988 + .div = 4, 989 + .hw.init = &(struct clk_init_data){ 990 + .name = "vclk2_div4", 991 + .ops = &clk_fixed_factor_ops, 992 + .parent_hws = (const struct clk_hw *[]) { 993 + &s4_vclk2_div4_en.hw 994 + }, 995 + .num_parents = 1, 996 + .flags = CLK_SET_RATE_PARENT, 997 + }, 998 + }; 999 + 1000 + static struct clk_fixed_factor s4_vclk2_div6 = { 1001 + .mult = 1, 1002 + .div = 6, 1003 + .hw.init = &(struct clk_init_data){ 1004 + .name = "vclk2_div6", 1005 + .ops = &clk_fixed_factor_ops, 1006 + .parent_hws = (const struct clk_hw *[]) { 1007 + &s4_vclk2_div6_en.hw 1008 + }, 1009 + .num_parents = 1, 1010 + .flags = CLK_SET_RATE_PARENT, 1011 + }, 1012 + }; 1013 + 1014 + static struct clk_fixed_factor s4_vclk2_div12 = { 1015 + .mult = 1, 1016 + .div = 12, 1017 + .hw.init = &(struct clk_init_data){ 1018 + .name = "vclk2_div12", 1019 + .ops = &clk_fixed_factor_ops, 1020 + .parent_hws = (const struct clk_hw *[]) { 1021 + &s4_vclk2_div12_en.hw 1022 + }, 1023 + .num_parents = 1, 1024 + .flags = CLK_SET_RATE_PARENT, 1025 + }, 1026 + }; 1027 + 1028 + /* The 5,6,7 indexes corresponds to no real clock, so there are not used. */ 1029 + static u32 mux_table_cts_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 }; 1030 + static const struct clk_hw *s4_cts_parent_hws[] = { 1031 + &s4_vclk_div1.hw, 1032 + &s4_vclk_div2.hw, 1033 + &s4_vclk_div4.hw, 1034 + &s4_vclk_div6.hw, 1035 + &s4_vclk_div12.hw, 1036 + &s4_vclk2_div1.hw, 1037 + &s4_vclk2_div2.hw, 1038 + &s4_vclk2_div4.hw, 1039 + &s4_vclk2_div6.hw, 1040 + &s4_vclk2_div12.hw 1041 + }; 1042 + 1043 + static struct clk_regmap s4_cts_enci_sel = { 1044 + .data = &(struct clk_regmap_mux_data){ 1045 + .offset = CLKCTRL_VID_CLK_DIV, 1046 + .mask = 0xf, 1047 + .shift = 28, 1048 + .table = mux_table_cts_sel, 1049 + }, 1050 + .hw.init = &(struct clk_init_data){ 1051 + .name = "cts_enci_sel", 1052 + .ops = &clk_regmap_mux_ops, 1053 + .parent_hws = s4_cts_parent_hws, 1054 + .num_parents = ARRAY_SIZE(s4_cts_parent_hws), 1055 + .flags = CLK_SET_RATE_PARENT, 1056 + }, 1057 + }; 1058 + 1059 + static struct clk_regmap s4_cts_encp_sel = { 1060 + .data = &(struct clk_regmap_mux_data){ 1061 + .offset = CLKCTRL_VID_CLK_DIV, 1062 + .mask = 0xf, 1063 + .shift = 20, 1064 + .table = mux_table_cts_sel, 1065 + }, 1066 + .hw.init = &(struct clk_init_data){ 1067 + .name = "cts_encp_sel", 1068 + .ops = &clk_regmap_mux_ops, 1069 + .parent_hws = s4_cts_parent_hws, 1070 + .num_parents = ARRAY_SIZE(s4_cts_parent_hws), 1071 + .flags = CLK_SET_RATE_PARENT, 1072 + }, 1073 + }; 1074 + 1075 + static struct clk_regmap s4_cts_vdac_sel = { 1076 + .data = &(struct clk_regmap_mux_data){ 1077 + .offset = CLKCTRL_VIID_CLK_DIV, 1078 + .mask = 0xf, 1079 + .shift = 28, 1080 + .table = mux_table_cts_sel, 1081 + }, 1082 + .hw.init = &(struct clk_init_data){ 1083 + .name = "cts_vdac_sel", 1084 + .ops = &clk_regmap_mux_ops, 1085 + .parent_hws = s4_cts_parent_hws, 1086 + .num_parents = ARRAY_SIZE(s4_cts_parent_hws), 1087 + .flags = CLK_SET_RATE_PARENT, 1088 + }, 1089 + }; 1090 + 1091 + /* The 5,6,7 indexes corresponds to no real clock, so there are not used. */ 1092 + static u32 mux_table_hdmi_tx_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 }; 1093 + static const struct clk_hw *s4_cts_hdmi_tx_parent_hws[] = { 1094 + &s4_vclk_div1.hw, 1095 + &s4_vclk_div2.hw, 1096 + &s4_vclk_div4.hw, 1097 + &s4_vclk_div6.hw, 1098 + &s4_vclk_div12.hw, 1099 + &s4_vclk2_div1.hw, 1100 + &s4_vclk2_div2.hw, 1101 + &s4_vclk2_div4.hw, 1102 + &s4_vclk2_div6.hw, 1103 + &s4_vclk2_div12.hw 1104 + }; 1105 + 1106 + static struct clk_regmap s4_hdmi_tx_sel = { 1107 + .data = &(struct clk_regmap_mux_data){ 1108 + .offset = CLKCTRL_HDMI_CLK_CTRL, 1109 + .mask = 0xf, 1110 + .shift = 16, 1111 + .table = mux_table_hdmi_tx_sel, 1112 + }, 1113 + .hw.init = &(struct clk_init_data){ 1114 + .name = "hdmi_tx_sel", 1115 + .ops = &clk_regmap_mux_ops, 1116 + .parent_hws = s4_cts_hdmi_tx_parent_hws, 1117 + .num_parents = ARRAY_SIZE(s4_cts_hdmi_tx_parent_hws), 1118 + .flags = CLK_SET_RATE_PARENT, 1119 + }, 1120 + }; 1121 + 1122 + static struct clk_regmap s4_cts_enci = { 1123 + .data = &(struct clk_regmap_gate_data){ 1124 + .offset = CLKCTRL_VID_CLK_CTRL2, 1125 + .bit_idx = 0, 1126 + }, 1127 + .hw.init = &(struct clk_init_data) { 1128 + .name = "cts_enci", 1129 + .ops = &clk_regmap_gate_ops, 1130 + .parent_hws = (const struct clk_hw *[]) { 1131 + &s4_cts_enci_sel.hw 1132 + }, 1133 + .num_parents = 1, 1134 + .flags = CLK_SET_RATE_PARENT, 1135 + }, 1136 + }; 1137 + 1138 + static struct clk_regmap s4_cts_encp = { 1139 + .data = &(struct clk_regmap_gate_data){ 1140 + .offset = CLKCTRL_VID_CLK_CTRL2, 1141 + .bit_idx = 2, 1142 + }, 1143 + .hw.init = &(struct clk_init_data) { 1144 + .name = "cts_encp", 1145 + .ops = &clk_regmap_gate_ops, 1146 + .parent_hws = (const struct clk_hw *[]) { 1147 + &s4_cts_encp_sel.hw 1148 + }, 1149 + .num_parents = 1, 1150 + .flags = CLK_SET_RATE_PARENT, 1151 + }, 1152 + }; 1153 + 1154 + static struct clk_regmap s4_cts_vdac = { 1155 + .data = &(struct clk_regmap_gate_data){ 1156 + .offset = CLKCTRL_VID_CLK_CTRL2, 1157 + .bit_idx = 4, 1158 + }, 1159 + .hw.init = &(struct clk_init_data) { 1160 + .name = "cts_vdac", 1161 + .ops = &clk_regmap_gate_ops, 1162 + .parent_hws = (const struct clk_hw *[]) { 1163 + &s4_cts_vdac_sel.hw 1164 + }, 1165 + .num_parents = 1, 1166 + .flags = CLK_SET_RATE_PARENT, 1167 + }, 1168 + }; 1169 + 1170 + static struct clk_regmap s4_hdmi_tx = { 1171 + .data = &(struct clk_regmap_gate_data){ 1172 + .offset = CLKCTRL_VID_CLK_CTRL2, 1173 + .bit_idx = 5, 1174 + }, 1175 + .hw.init = &(struct clk_init_data) { 1176 + .name = "hdmi_tx", 1177 + .ops = &clk_regmap_gate_ops, 1178 + .parent_hws = (const struct clk_hw *[]) { 1179 + &s4_hdmi_tx_sel.hw 1180 + }, 1181 + .num_parents = 1, 1182 + .flags = CLK_SET_RATE_PARENT, 1183 + }, 1184 + }; 1185 + 1186 + /* HDMI Clocks */ 1187 + static const struct clk_parent_data s4_hdmi_parent_data[] = { 1188 + { .fw_name = "xtal", }, 1189 + { .fw_name = "fclk_div4", }, 1190 + { .fw_name = "fclk_div3", }, 1191 + { .fw_name = "fclk_div5", } 1192 + }; 1193 + 1194 + static struct clk_regmap s4_hdmi_sel = { 1195 + .data = &(struct clk_regmap_mux_data){ 1196 + .offset = CLKCTRL_HDMI_CLK_CTRL, 1197 + .mask = 0x3, 1198 + .shift = 9, 1199 + .flags = CLK_MUX_ROUND_CLOSEST, 1200 + }, 1201 + .hw.init = &(struct clk_init_data){ 1202 + .name = "hdmi_sel", 1203 + .ops = &clk_regmap_mux_ops, 1204 + .parent_data = s4_hdmi_parent_data, 1205 + .num_parents = ARRAY_SIZE(s4_hdmi_parent_data), 1206 + .flags = CLK_SET_RATE_PARENT, 1207 + }, 1208 + }; 1209 + 1210 + static struct clk_regmap s4_hdmi_div = { 1211 + .data = &(struct clk_regmap_div_data){ 1212 + .offset = CLKCTRL_HDMI_CLK_CTRL, 1213 + .shift = 0, 1214 + .width = 7, 1215 + }, 1216 + .hw.init = &(struct clk_init_data){ 1217 + .name = "hdmi_div", 1218 + .ops = &clk_regmap_divider_ops, 1219 + .parent_hws = (const struct clk_hw *[]) { &s4_hdmi_sel.hw }, 1220 + .num_parents = 1, 1221 + .flags = CLK_SET_RATE_PARENT, 1222 + }, 1223 + }; 1224 + 1225 + static struct clk_regmap s4_hdmi = { 1226 + .data = &(struct clk_regmap_gate_data){ 1227 + .offset = CLKCTRL_HDMI_CLK_CTRL, 1228 + .bit_idx = 8, 1229 + }, 1230 + .hw.init = &(struct clk_init_data) { 1231 + .name = "hdmi", 1232 + .ops = &clk_regmap_gate_ops, 1233 + .parent_hws = (const struct clk_hw *[]) { &s4_hdmi_div.hw }, 1234 + .num_parents = 1, 1235 + .flags = CLK_SET_RATE_PARENT, 1236 + }, 1237 + }; 1238 + 1239 + static struct clk_regmap s4_ts_clk_div = { 1240 + .data = &(struct clk_regmap_div_data){ 1241 + .offset = CLKCTRL_TS_CLK_CTRL, 1242 + .shift = 0, 1243 + .width = 8, 1244 + }, 1245 + .hw.init = &(struct clk_init_data){ 1246 + .name = "ts_clk_div", 1247 + .ops = &clk_regmap_divider_ops, 1248 + .parent_data = &(const struct clk_parent_data) { 1249 + .fw_name = "xtal", 1250 + }, 1251 + .num_parents = 1, 1252 + .flags = CLK_SET_RATE_PARENT, 1253 + }, 1254 + }; 1255 + 1256 + static struct clk_regmap s4_ts_clk_gate = { 1257 + .data = &(struct clk_regmap_gate_data){ 1258 + .offset = CLKCTRL_TS_CLK_CTRL, 1259 + .bit_idx = 8, 1260 + }, 1261 + .hw.init = &(struct clk_init_data){ 1262 + .name = "ts_clk", 1263 + .ops = &clk_regmap_gate_ops, 1264 + .parent_hws = (const struct clk_hw *[]) { 1265 + &s4_ts_clk_div.hw 1266 + }, 1267 + .num_parents = 1, 1268 + .flags = CLK_SET_RATE_PARENT, 1269 + }, 1270 + }; 1271 + 1272 + /* 1273 + * The MALI IP is clocked by two identical clocks (mali_0 and mali_1) 1274 + * muxed by a glitch-free switch. The CCF can manage this glitch-free 1275 + * mux because it does top-to-bottom updates the each clock tree and 1276 + * switches to the "inactive" one when CLK_SET_RATE_GATE is set. 1277 + */ 1278 + static const struct clk_parent_data s4_mali_0_1_parent_data[] = { 1279 + { .fw_name = "xtal", }, 1280 + { .fw_name = "gp0_pll", }, 1281 + { .fw_name = "hifi_pll", }, 1282 + { .fw_name = "fclk_div2p5", }, 1283 + { .fw_name = "fclk_div3", }, 1284 + { .fw_name = "fclk_div4", }, 1285 + { .fw_name = "fclk_div5", }, 1286 + { .fw_name = "fclk_div7", } 1287 + }; 1288 + 1289 + static struct clk_regmap s4_mali_0_sel = { 1290 + .data = &(struct clk_regmap_mux_data){ 1291 + .offset = CLKCTRL_MALI_CLK_CTRL, 1292 + .mask = 0x7, 1293 + .shift = 9, 1294 + }, 1295 + .hw.init = &(struct clk_init_data){ 1296 + .name = "mali_0_sel", 1297 + .ops = &clk_regmap_mux_ops, 1298 + .parent_data = s4_mali_0_1_parent_data, 1299 + .num_parents = ARRAY_SIZE(s4_mali_0_1_parent_data), 1300 + /* 1301 + * Don't request the parent to change the rate because 1302 + * all GPU frequencies can be derived from the fclk_* 1303 + * clocks and one special GP0_PLL setting. This is 1304 + * important because we need the HIFI PLL clock for audio. 1305 + */ 1306 + .flags = 0, 1307 + }, 1308 + }; 1309 + 1310 + static struct clk_regmap s4_mali_0_div = { 1311 + .data = &(struct clk_regmap_div_data){ 1312 + .offset = CLKCTRL_MALI_CLK_CTRL, 1313 + .shift = 0, 1314 + .width = 7, 1315 + }, 1316 + .hw.init = &(struct clk_init_data){ 1317 + .name = "mali_0_div", 1318 + .ops = &clk_regmap_divider_ops, 1319 + .parent_hws = (const struct clk_hw *[]) { 1320 + &s4_mali_0_sel.hw 1321 + }, 1322 + .num_parents = 1, 1323 + .flags = CLK_SET_RATE_PARENT, 1324 + }, 1325 + }; 1326 + 1327 + static struct clk_regmap s4_mali_0 = { 1328 + .data = &(struct clk_regmap_gate_data){ 1329 + .offset = CLKCTRL_MALI_CLK_CTRL, 1330 + .bit_idx = 8, 1331 + }, 1332 + .hw.init = &(struct clk_init_data){ 1333 + .name = "mali_0", 1334 + .ops = &clk_regmap_gate_ops, 1335 + .parent_hws = (const struct clk_hw *[]) { 1336 + &s4_mali_0_div.hw 1337 + }, 1338 + .num_parents = 1, 1339 + .flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT, 1340 + }, 1341 + }; 1342 + 1343 + static struct clk_regmap s4_mali_1_sel = { 1344 + .data = &(struct clk_regmap_mux_data){ 1345 + .offset = CLKCTRL_MALI_CLK_CTRL, 1346 + .mask = 0x7, 1347 + .shift = 25, 1348 + }, 1349 + .hw.init = &(struct clk_init_data){ 1350 + .name = "mali_1_sel", 1351 + .ops = &clk_regmap_mux_ops, 1352 + .parent_data = s4_mali_0_1_parent_data, 1353 + .num_parents = ARRAY_SIZE(s4_mali_0_1_parent_data), 1354 + .flags = 0, 1355 + }, 1356 + }; 1357 + 1358 + static struct clk_regmap s4_mali_1_div = { 1359 + .data = &(struct clk_regmap_div_data){ 1360 + .offset = CLKCTRL_MALI_CLK_CTRL, 1361 + .shift = 16, 1362 + .width = 7, 1363 + }, 1364 + .hw.init = &(struct clk_init_data){ 1365 + .name = "mali_1_div", 1366 + .ops = &clk_regmap_divider_ops, 1367 + .parent_hws = (const struct clk_hw *[]) { 1368 + &s4_mali_1_sel.hw 1369 + }, 1370 + .num_parents = 1, 1371 + .flags = CLK_SET_RATE_PARENT, 1372 + }, 1373 + }; 1374 + 1375 + static struct clk_regmap s4_mali_1 = { 1376 + .data = &(struct clk_regmap_gate_data){ 1377 + .offset = CLKCTRL_MALI_CLK_CTRL, 1378 + .bit_idx = 24, 1379 + }, 1380 + .hw.init = &(struct clk_init_data){ 1381 + .name = "mali_1", 1382 + .ops = &clk_regmap_gate_ops, 1383 + .parent_hws = (const struct clk_hw *[]) { 1384 + &s4_mali_1_div.hw 1385 + }, 1386 + .num_parents = 1, 1387 + .flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT, 1388 + }, 1389 + }; 1390 + 1391 + static const struct clk_hw *s4_mali_parent_hws[] = { 1392 + &s4_mali_0.hw, 1393 + &s4_mali_1.hw 1394 + }; 1395 + 1396 + static struct clk_regmap s4_mali_mux = { 1397 + .data = &(struct clk_regmap_mux_data){ 1398 + .offset = CLKCTRL_MALI_CLK_CTRL, 1399 + .mask = 1, 1400 + .shift = 31, 1401 + }, 1402 + .hw.init = &(struct clk_init_data){ 1403 + .name = "mali", 1404 + .ops = &clk_regmap_mux_ops, 1405 + .parent_hws = s4_mali_parent_hws, 1406 + .num_parents = 2, 1407 + .flags = CLK_SET_RATE_PARENT, 1408 + }, 1409 + }; 1410 + 1411 + /* VDEC clocks */ 1412 + static const struct clk_parent_data s4_dec_parent_data[] = { 1413 + { .fw_name = "fclk_div2p5", }, 1414 + { .fw_name = "fclk_div3", }, 1415 + { .fw_name = "fclk_div4", }, 1416 + { .fw_name = "fclk_div5", }, 1417 + { .fw_name = "fclk_div7", }, 1418 + { .fw_name = "hifi_pll", }, 1419 + { .fw_name = "gp0_pll", }, 1420 + { .fw_name = "xtal", } 1421 + }; 1422 + 1423 + static struct clk_regmap s4_vdec_p0_mux = { 1424 + .data = &(struct clk_regmap_mux_data){ 1425 + .offset = CLKCTRL_VDEC_CLK_CTRL, 1426 + .mask = 0x7, 1427 + .shift = 9, 1428 + .flags = CLK_MUX_ROUND_CLOSEST, 1429 + }, 1430 + .hw.init = &(struct clk_init_data) { 1431 + .name = "vdec_p0_mux", 1432 + .ops = &clk_regmap_mux_ops, 1433 + .parent_data = s4_dec_parent_data, 1434 + .num_parents = ARRAY_SIZE(s4_dec_parent_data), 1435 + .flags = 0, 1436 + }, 1437 + }; 1438 + 1439 + static struct clk_regmap s4_vdec_p0_div = { 1440 + .data = &(struct clk_regmap_div_data){ 1441 + .offset = CLKCTRL_VDEC_CLK_CTRL, 1442 + .shift = 0, 1443 + .width = 7, 1444 + .flags = CLK_DIVIDER_ROUND_CLOSEST, 1445 + }, 1446 + .hw.init = &(struct clk_init_data) { 1447 + .name = "vdec_p0_div", 1448 + .ops = &clk_regmap_divider_ops, 1449 + .parent_hws = (const struct clk_hw *[]) { 1450 + &s4_vdec_p0_mux.hw 1451 + }, 1452 + .num_parents = 1, 1453 + .flags = CLK_SET_RATE_PARENT, 1454 + }, 1455 + }; 1456 + 1457 + static struct clk_regmap s4_vdec_p0 = { 1458 + .data = &(struct clk_regmap_gate_data){ 1459 + .offset = CLKCTRL_VDEC_CLK_CTRL, 1460 + .bit_idx = 8, 1461 + }, 1462 + .hw.init = &(struct clk_init_data){ 1463 + .name = "vdec_p0", 1464 + .ops = &clk_regmap_gate_ops, 1465 + .parent_hws = (const struct clk_hw *[]) { 1466 + &s4_vdec_p0_div.hw 1467 + }, 1468 + .num_parents = 1, 1469 + .flags = CLK_SET_RATE_PARENT, 1470 + }, 1471 + }; 1472 + 1473 + static struct clk_regmap s4_vdec_p1_mux = { 1474 + .data = &(struct clk_regmap_mux_data){ 1475 + .offset = CLKCTRL_VDEC3_CLK_CTRL, 1476 + .mask = 0x7, 1477 + .shift = 9, 1478 + .flags = CLK_MUX_ROUND_CLOSEST, 1479 + }, 1480 + .hw.init = &(struct clk_init_data) { 1481 + .name = "vdec_p1_mux", 1482 + .ops = &clk_regmap_mux_ops, 1483 + .parent_data = s4_dec_parent_data, 1484 + .num_parents = ARRAY_SIZE(s4_dec_parent_data), 1485 + .flags = 0, 1486 + }, 1487 + }; 1488 + 1489 + static struct clk_regmap s4_vdec_p1_div = { 1490 + .data = &(struct clk_regmap_div_data){ 1491 + .offset = CLKCTRL_VDEC3_CLK_CTRL, 1492 + .shift = 0, 1493 + .width = 7, 1494 + .flags = CLK_DIVIDER_ROUND_CLOSEST, 1495 + }, 1496 + .hw.init = &(struct clk_init_data) { 1497 + .name = "vdec_p1_div", 1498 + .ops = &clk_regmap_divider_ops, 1499 + .parent_hws = (const struct clk_hw *[]) { 1500 + &s4_vdec_p1_mux.hw 1501 + }, 1502 + .num_parents = 1, 1503 + .flags = CLK_SET_RATE_PARENT, 1504 + }, 1505 + }; 1506 + 1507 + static struct clk_regmap s4_vdec_p1 = { 1508 + .data = &(struct clk_regmap_gate_data){ 1509 + .offset = CLKCTRL_VDEC3_CLK_CTRL, 1510 + .bit_idx = 8, 1511 + }, 1512 + .hw.init = &(struct clk_init_data){ 1513 + .name = "vdec_p1", 1514 + .ops = &clk_regmap_gate_ops, 1515 + .parent_hws = (const struct clk_hw *[]) { 1516 + &s4_vdec_p1_div.hw 1517 + }, 1518 + .num_parents = 1, 1519 + .flags = CLK_SET_RATE_PARENT, 1520 + }, 1521 + }; 1522 + 1523 + static const struct clk_hw *s4_vdec_mux_parent_hws[] = { 1524 + &s4_vdec_p0.hw, 1525 + &s4_vdec_p1.hw 1526 + }; 1527 + 1528 + static struct clk_regmap s4_vdec_mux = { 1529 + .data = &(struct clk_regmap_mux_data){ 1530 + .offset = CLKCTRL_VDEC3_CLK_CTRL, 1531 + .mask = 0x1, 1532 + .shift = 15, 1533 + }, 1534 + .hw.init = &(struct clk_init_data) { 1535 + .name = "vdec_mux", 1536 + .ops = &clk_regmap_mux_ops, 1537 + .parent_hws = s4_vdec_mux_parent_hws, 1538 + .num_parents = ARRAY_SIZE(s4_vdec_mux_parent_hws), 1539 + .flags = CLK_SET_RATE_PARENT, 1540 + }, 1541 + }; 1542 + 1543 + static struct clk_regmap s4_hevcf_p0_mux = { 1544 + .data = &(struct clk_regmap_mux_data){ 1545 + .offset = CLKCTRL_VDEC2_CLK_CTRL, 1546 + .mask = 0x7, 1547 + .shift = 9, 1548 + .flags = CLK_MUX_ROUND_CLOSEST, 1549 + }, 1550 + .hw.init = &(struct clk_init_data) { 1551 + .name = "hevcf_p0_mux", 1552 + .ops = &clk_regmap_mux_ops, 1553 + .parent_data = s4_dec_parent_data, 1554 + .num_parents = ARRAY_SIZE(s4_dec_parent_data), 1555 + .flags = 0, 1556 + }, 1557 + }; 1558 + 1559 + static struct clk_regmap s4_hevcf_p0_div = { 1560 + .data = &(struct clk_regmap_div_data){ 1561 + .offset = CLKCTRL_VDEC2_CLK_CTRL, 1562 + .shift = 0, 1563 + .width = 7, 1564 + .flags = CLK_DIVIDER_ROUND_CLOSEST, 1565 + }, 1566 + .hw.init = &(struct clk_init_data) { 1567 + .name = "hevcf_p0_div", 1568 + .ops = &clk_regmap_divider_ops, 1569 + .parent_hws = (const struct clk_hw *[]) { 1570 + &s4_hevcf_p0_mux.hw 1571 + }, 1572 + .num_parents = 1, 1573 + .flags = CLK_SET_RATE_PARENT, 1574 + }, 1575 + }; 1576 + 1577 + static struct clk_regmap s4_hevcf_p0 = { 1578 + .data = &(struct clk_regmap_gate_data){ 1579 + .offset = CLKCTRL_VDEC2_CLK_CTRL, 1580 + .bit_idx = 8, 1581 + }, 1582 + .hw.init = &(struct clk_init_data){ 1583 + .name = "hevcf_p0_gate", 1584 + .ops = &clk_regmap_gate_ops, 1585 + .parent_hws = (const struct clk_hw *[]) { 1586 + &s4_hevcf_p0_div.hw 1587 + }, 1588 + .num_parents = 1, 1589 + .flags = CLK_SET_RATE_PARENT, 1590 + }, 1591 + }; 1592 + 1593 + static struct clk_regmap s4_hevcf_p1_mux = { 1594 + .data = &(struct clk_regmap_mux_data){ 1595 + .offset = CLKCTRL_VDEC4_CLK_CTRL, 1596 + .mask = 0x7, 1597 + .shift = 9, 1598 + .flags = CLK_MUX_ROUND_CLOSEST, 1599 + }, 1600 + .hw.init = &(struct clk_init_data) { 1601 + .name = "hevcf_p1_mux", 1602 + .ops = &clk_regmap_mux_ops, 1603 + .parent_data = s4_dec_parent_data, 1604 + .num_parents = ARRAY_SIZE(s4_dec_parent_data), 1605 + .flags = 0, 1606 + }, 1607 + }; 1608 + 1609 + static struct clk_regmap s4_hevcf_p1_div = { 1610 + .data = &(struct clk_regmap_div_data){ 1611 + .offset = CLKCTRL_VDEC4_CLK_CTRL, 1612 + .shift = 0, 1613 + .width = 7, 1614 + .flags = CLK_DIVIDER_ROUND_CLOSEST, 1615 + }, 1616 + .hw.init = &(struct clk_init_data) { 1617 + .name = "hevcf_p1_div", 1618 + .ops = &clk_regmap_divider_ops, 1619 + .parent_hws = (const struct clk_hw *[]) { 1620 + &s4_hevcf_p1_mux.hw 1621 + }, 1622 + .num_parents = 1, 1623 + .flags = CLK_SET_RATE_PARENT, 1624 + }, 1625 + }; 1626 + 1627 + static struct clk_regmap s4_hevcf_p1 = { 1628 + .data = &(struct clk_regmap_gate_data){ 1629 + .offset = CLKCTRL_VDEC4_CLK_CTRL, 1630 + .bit_idx = 8, 1631 + }, 1632 + .hw.init = &(struct clk_init_data){ 1633 + .name = "hevcf_p1", 1634 + .ops = &clk_regmap_gate_ops, 1635 + .parent_hws = (const struct clk_hw *[]) { 1636 + &s4_hevcf_p1_div.hw 1637 + }, 1638 + .num_parents = 1, 1639 + .flags = CLK_SET_RATE_PARENT, 1640 + }, 1641 + }; 1642 + 1643 + static const struct clk_hw *s4_hevcf_mux_parent_hws[] = { 1644 + &s4_hevcf_p0.hw, 1645 + &s4_hevcf_p1.hw 1646 + }; 1647 + 1648 + static struct clk_regmap s4_hevcf_mux = { 1649 + .data = &(struct clk_regmap_mux_data){ 1650 + .offset = CLKCTRL_VDEC4_CLK_CTRL, 1651 + .mask = 0x1, 1652 + .shift = 15, 1653 + }, 1654 + .hw.init = &(struct clk_init_data) { 1655 + .name = "hevcf", 1656 + .ops = &clk_regmap_mux_ops, 1657 + .parent_hws = s4_hevcf_mux_parent_hws, 1658 + .num_parents = ARRAY_SIZE(s4_hevcf_mux_parent_hws), 1659 + .flags = CLK_SET_RATE_PARENT, 1660 + }, 1661 + }; 1662 + 1663 + /* VPU Clock */ 1664 + static const struct clk_parent_data s4_vpu_parent_data[] = { 1665 + { .fw_name = "fclk_div3", }, 1666 + { .fw_name = "fclk_div4", }, 1667 + { .fw_name = "fclk_div5", }, 1668 + { .fw_name = "fclk_div7", }, 1669 + { .fw_name = "mpll1", }, 1670 + { .hw = &s4_vid_pll.hw }, 1671 + { .fw_name = "hifi_pll", }, 1672 + { .fw_name = "gp0_pll", }, 1673 + }; 1674 + 1675 + static struct clk_regmap s4_vpu_0_sel = { 1676 + .data = &(struct clk_regmap_mux_data){ 1677 + .offset = CLKCTRL_VPU_CLK_CTRL, 1678 + .mask = 0x7, 1679 + .shift = 9, 1680 + }, 1681 + .hw.init = &(struct clk_init_data){ 1682 + .name = "vpu_0_sel", 1683 + .ops = &clk_regmap_mux_ops, 1684 + .parent_data = s4_vpu_parent_data, 1685 + .num_parents = ARRAY_SIZE(s4_vpu_parent_data), 1686 + .flags = 0, 1687 + }, 1688 + }; 1689 + 1690 + static struct clk_regmap s4_vpu_0_div = { 1691 + .data = &(struct clk_regmap_div_data){ 1692 + .offset = CLKCTRL_VPU_CLK_CTRL, 1693 + .shift = 0, 1694 + .width = 7, 1695 + }, 1696 + .hw.init = &(struct clk_init_data){ 1697 + .name = "vpu_0_div", 1698 + .ops = &clk_regmap_divider_ops, 1699 + .parent_hws = (const struct clk_hw *[]) { &s4_vpu_0_sel.hw }, 1700 + .num_parents = 1, 1701 + .flags = CLK_SET_RATE_PARENT, 1702 + }, 1703 + }; 1704 + 1705 + static struct clk_regmap s4_vpu_0 = { 1706 + .data = &(struct clk_regmap_gate_data){ 1707 + .offset = CLKCTRL_VPU_CLK_CTRL, 1708 + .bit_idx = 8, 1709 + }, 1710 + .hw.init = &(struct clk_init_data) { 1711 + .name = "vpu_0", 1712 + .ops = &clk_regmap_gate_ops, 1713 + .parent_hws = (const struct clk_hw *[]) { &s4_vpu_0_div.hw }, 1714 + .num_parents = 1, 1715 + .flags = CLK_SET_RATE_PARENT, 1716 + }, 1717 + }; 1718 + 1719 + static struct clk_regmap s4_vpu_1_sel = { 1720 + .data = &(struct clk_regmap_mux_data){ 1721 + .offset = CLKCTRL_VPU_CLK_CTRL, 1722 + .mask = 0x7, 1723 + .shift = 25, 1724 + }, 1725 + .hw.init = &(struct clk_init_data){ 1726 + .name = "vpu_1_sel", 1727 + .ops = &clk_regmap_mux_ops, 1728 + .parent_data = s4_vpu_parent_data, 1729 + .num_parents = ARRAY_SIZE(s4_vpu_parent_data), 1730 + .flags = 0, 1731 + }, 1732 + }; 1733 + 1734 + static struct clk_regmap s4_vpu_1_div = { 1735 + .data = &(struct clk_regmap_div_data){ 1736 + .offset = CLKCTRL_VPU_CLK_CTRL, 1737 + .shift = 16, 1738 + .width = 7, 1739 + }, 1740 + .hw.init = &(struct clk_init_data){ 1741 + .name = "vpu_1_div", 1742 + .ops = &clk_regmap_divider_ops, 1743 + .parent_hws = (const struct clk_hw *[]) { &s4_vpu_1_sel.hw }, 1744 + .num_parents = 1, 1745 + .flags = CLK_SET_RATE_PARENT, 1746 + }, 1747 + }; 1748 + 1749 + static struct clk_regmap s4_vpu_1 = { 1750 + .data = &(struct clk_regmap_gate_data){ 1751 + .offset = CLKCTRL_VPU_CLK_CTRL, 1752 + .bit_idx = 24, 1753 + }, 1754 + .hw.init = &(struct clk_init_data) { 1755 + .name = "vpu_1", 1756 + .ops = &clk_regmap_gate_ops, 1757 + .parent_hws = (const struct clk_hw *[]) { &s4_vpu_1_div.hw }, 1758 + .num_parents = 1, 1759 + .flags = CLK_SET_RATE_PARENT, 1760 + }, 1761 + }; 1762 + 1763 + static struct clk_regmap s4_vpu = { 1764 + .data = &(struct clk_regmap_mux_data){ 1765 + .offset = CLKCTRL_VPU_CLK_CTRL, 1766 + .mask = 1, 1767 + .shift = 31, 1768 + }, 1769 + .hw.init = &(struct clk_init_data){ 1770 + .name = "vpu", 1771 + .ops = &clk_regmap_mux_ops, 1772 + .parent_hws = (const struct clk_hw *[]) { 1773 + &s4_vpu_0.hw, 1774 + &s4_vpu_1.hw, 1775 + }, 1776 + .num_parents = 2, 1777 + .flags = CLK_SET_RATE_PARENT, 1778 + }, 1779 + }; 1780 + 1781 + static const struct clk_parent_data vpu_clkb_tmp_parent_data[] = { 1782 + { .hw = &s4_vpu.hw }, 1783 + { .fw_name = "fclk_div4", }, 1784 + { .fw_name = "fclk_div5", }, 1785 + { .fw_name = "fclk_div7", } 1786 + }; 1787 + 1788 + static struct clk_regmap s4_vpu_clkb_tmp_mux = { 1789 + .data = &(struct clk_regmap_mux_data){ 1790 + .offset = CLKCTRL_VPU_CLKB_CTRL, 1791 + .mask = 0x3, 1792 + .shift = 20, 1793 + }, 1794 + .hw.init = &(struct clk_init_data) { 1795 + .name = "vpu_clkb_tmp_mux", 1796 + .ops = &clk_regmap_mux_ops, 1797 + .parent_data = vpu_clkb_tmp_parent_data, 1798 + .num_parents = ARRAY_SIZE(vpu_clkb_tmp_parent_data), 1799 + .flags = CLK_SET_RATE_PARENT, 1800 + }, 1801 + }; 1802 + 1803 + static struct clk_regmap s4_vpu_clkb_tmp_div = { 1804 + .data = &(struct clk_regmap_div_data){ 1805 + .offset = CLKCTRL_VPU_CLKB_CTRL, 1806 + .shift = 16, 1807 + .width = 4, 1808 + }, 1809 + .hw.init = &(struct clk_init_data) { 1810 + .name = "vpu_clkb_tmp_div", 1811 + .ops = &clk_regmap_divider_ops, 1812 + .parent_hws = (const struct clk_hw *[]) { 1813 + &s4_vpu_clkb_tmp_mux.hw 1814 + }, 1815 + .num_parents = 1, 1816 + .flags = CLK_SET_RATE_PARENT, 1817 + }, 1818 + }; 1819 + 1820 + static struct clk_regmap s4_vpu_clkb_tmp = { 1821 + .data = &(struct clk_regmap_gate_data){ 1822 + .offset = CLKCTRL_VPU_CLKB_CTRL, 1823 + .bit_idx = 24, 1824 + }, 1825 + .hw.init = &(struct clk_init_data){ 1826 + .name = "vpu_clkb_tmp", 1827 + .ops = &clk_regmap_gate_ops, 1828 + .parent_hws = (const struct clk_hw *[]) { 1829 + &s4_vpu_clkb_tmp_div.hw 1830 + }, 1831 + .num_parents = 1, 1832 + .flags = CLK_SET_RATE_PARENT, 1833 + }, 1834 + }; 1835 + 1836 + static struct clk_regmap s4_vpu_clkb_div = { 1837 + .data = &(struct clk_regmap_div_data){ 1838 + .offset = CLKCTRL_VPU_CLKB_CTRL, 1839 + .shift = 0, 1840 + .width = 8, 1841 + }, 1842 + .hw.init = &(struct clk_init_data) { 1843 + .name = "vpu_clkb_div", 1844 + .ops = &clk_regmap_divider_ops, 1845 + .parent_hws = (const struct clk_hw *[]) { 1846 + &s4_vpu_clkb_tmp.hw 1847 + }, 1848 + .num_parents = 1, 1849 + .flags = CLK_SET_RATE_PARENT, 1850 + }, 1851 + }; 1852 + 1853 + static struct clk_regmap s4_vpu_clkb = { 1854 + .data = &(struct clk_regmap_gate_data){ 1855 + .offset = CLKCTRL_VPU_CLKB_CTRL, 1856 + .bit_idx = 8, 1857 + }, 1858 + .hw.init = &(struct clk_init_data){ 1859 + .name = "vpu_clkb", 1860 + .ops = &clk_regmap_gate_ops, 1861 + .parent_hws = (const struct clk_hw *[]) { 1862 + &s4_vpu_clkb_div.hw 1863 + }, 1864 + .num_parents = 1, 1865 + .flags = CLK_SET_RATE_PARENT, 1866 + }, 1867 + }; 1868 + 1869 + static const struct clk_parent_data s4_vpu_clkc_parent_data[] = { 1870 + { .fw_name = "fclk_div4", }, 1871 + { .fw_name = "fclk_div3", }, 1872 + { .fw_name = "fclk_div5", }, 1873 + { .fw_name = "fclk_div7", }, 1874 + { .fw_name = "mpll1", }, 1875 + { .hw = &s4_vid_pll.hw }, 1876 + { .fw_name = "mpll2", }, 1877 + { .fw_name = "gp0_pll", }, 1878 + }; 1879 + 1880 + static struct clk_regmap s4_vpu_clkc_p0_mux = { 1881 + .data = &(struct clk_regmap_mux_data){ 1882 + .offset = CLKCTRL_VPU_CLKC_CTRL, 1883 + .mask = 0x7, 1884 + .shift = 9, 1885 + }, 1886 + .hw.init = &(struct clk_init_data) { 1887 + .name = "vpu_clkc_p0_mux", 1888 + .ops = &clk_regmap_mux_ops, 1889 + .parent_data = s4_vpu_clkc_parent_data, 1890 + .num_parents = ARRAY_SIZE(s4_vpu_clkc_parent_data), 1891 + .flags = 0, 1892 + }, 1893 + }; 1894 + 1895 + static struct clk_regmap s4_vpu_clkc_p0_div = { 1896 + .data = &(struct clk_regmap_div_data){ 1897 + .offset = CLKCTRL_VPU_CLKC_CTRL, 1898 + .shift = 0, 1899 + .width = 7, 1900 + }, 1901 + .hw.init = &(struct clk_init_data) { 1902 + .name = "vpu_clkc_p0_div", 1903 + .ops = &clk_regmap_divider_ops, 1904 + .parent_hws = (const struct clk_hw *[]) { 1905 + &s4_vpu_clkc_p0_mux.hw 1906 + }, 1907 + .num_parents = 1, 1908 + .flags = CLK_SET_RATE_PARENT, 1909 + }, 1910 + }; 1911 + 1912 + static struct clk_regmap s4_vpu_clkc_p0 = { 1913 + .data = &(struct clk_regmap_gate_data){ 1914 + .offset = CLKCTRL_VPU_CLKC_CTRL, 1915 + .bit_idx = 8, 1916 + }, 1917 + .hw.init = &(struct clk_init_data){ 1918 + .name = "vpu_clkc_p0", 1919 + .ops = &clk_regmap_gate_ops, 1920 + .parent_hws = (const struct clk_hw *[]) { 1921 + &s4_vpu_clkc_p0_div.hw 1922 + }, 1923 + .num_parents = 1, 1924 + .flags = CLK_SET_RATE_PARENT, 1925 + }, 1926 + }; 1927 + 1928 + static struct clk_regmap s4_vpu_clkc_p1_mux = { 1929 + .data = &(struct clk_regmap_mux_data){ 1930 + .offset = CLKCTRL_VPU_CLKC_CTRL, 1931 + .mask = 0x7, 1932 + .shift = 25, 1933 + }, 1934 + .hw.init = &(struct clk_init_data) { 1935 + .name = "vpu_clkc_p1_mux", 1936 + .ops = &clk_regmap_mux_ops, 1937 + .parent_data = s4_vpu_clkc_parent_data, 1938 + .num_parents = ARRAY_SIZE(s4_vpu_clkc_parent_data), 1939 + .flags = 0, 1940 + }, 1941 + }; 1942 + 1943 + static struct clk_regmap s4_vpu_clkc_p1_div = { 1944 + .data = &(struct clk_regmap_div_data){ 1945 + .offset = CLKCTRL_VPU_CLKC_CTRL, 1946 + .shift = 16, 1947 + .width = 7, 1948 + }, 1949 + .hw.init = &(struct clk_init_data) { 1950 + .name = "vpu_clkc_p1_div", 1951 + .ops = &clk_regmap_divider_ops, 1952 + .parent_hws = (const struct clk_hw *[]) { 1953 + &s4_vpu_clkc_p1_mux.hw 1954 + }, 1955 + .num_parents = 1, 1956 + .flags = CLK_SET_RATE_PARENT, 1957 + }, 1958 + }; 1959 + 1960 + static struct clk_regmap s4_vpu_clkc_p1 = { 1961 + .data = &(struct clk_regmap_gate_data){ 1962 + .offset = CLKCTRL_VPU_CLKC_CTRL, 1963 + .bit_idx = 24, 1964 + }, 1965 + .hw.init = &(struct clk_init_data){ 1966 + .name = "vpu_clkc_p1", 1967 + .ops = &clk_regmap_gate_ops, 1968 + .parent_hws = (const struct clk_hw *[]) { 1969 + &s4_vpu_clkc_p1_div.hw 1970 + }, 1971 + .num_parents = 1, 1972 + .flags = CLK_SET_RATE_PARENT, 1973 + }, 1974 + }; 1975 + 1976 + static const struct clk_hw *s4_vpu_mux_parent_hws[] = { 1977 + &s4_vpu_clkc_p0.hw, 1978 + &s4_vpu_clkc_p1.hw 1979 + }; 1980 + 1981 + static struct clk_regmap s4_vpu_clkc_mux = { 1982 + .data = &(struct clk_regmap_mux_data){ 1983 + .offset = CLKCTRL_VPU_CLKC_CTRL, 1984 + .mask = 0x1, 1985 + .shift = 31, 1986 + }, 1987 + .hw.init = &(struct clk_init_data) { 1988 + .name = "vpu_clkc_mux", 1989 + .ops = &clk_regmap_mux_ops, 1990 + .parent_hws = s4_vpu_mux_parent_hws, 1991 + .num_parents = ARRAY_SIZE(s4_vpu_mux_parent_hws), 1992 + .flags = CLK_SET_RATE_PARENT, 1993 + }, 1994 + }; 1995 + 1996 + /* VAPB Clock */ 1997 + static const struct clk_parent_data s4_vapb_parent_data[] = { 1998 + { .fw_name = "fclk_div4", }, 1999 + { .fw_name = "fclk_div3", }, 2000 + { .fw_name = "fclk_div5", }, 2001 + { .fw_name = "fclk_div7", }, 2002 + { .fw_name = "mpll1", }, 2003 + { .hw = &s4_vid_pll.hw }, 2004 + { .fw_name = "mpll2", }, 2005 + { .fw_name = "fclk_div2p5", }, 2006 + }; 2007 + 2008 + static struct clk_regmap s4_vapb_0_sel = { 2009 + .data = &(struct clk_regmap_mux_data){ 2010 + .offset = CLKCTRL_VAPBCLK_CTRL, 2011 + .mask = 0x7, 2012 + .shift = 9, 2013 + }, 2014 + .hw.init = &(struct clk_init_data){ 2015 + .name = "vapb_0_sel", 2016 + .ops = &clk_regmap_mux_ops, 2017 + .parent_data = s4_vapb_parent_data, 2018 + .num_parents = ARRAY_SIZE(s4_vapb_parent_data), 2019 + .flags = 0, 2020 + }, 2021 + }; 2022 + 2023 + static struct clk_regmap s4_vapb_0_div = { 2024 + .data = &(struct clk_regmap_div_data){ 2025 + .offset = CLKCTRL_VAPBCLK_CTRL, 2026 + .shift = 0, 2027 + .width = 7, 2028 + }, 2029 + .hw.init = &(struct clk_init_data){ 2030 + .name = "vapb_0_div", 2031 + .ops = &clk_regmap_divider_ops, 2032 + .parent_hws = (const struct clk_hw *[]) { 2033 + &s4_vapb_0_sel.hw 2034 + }, 2035 + .num_parents = 1, 2036 + .flags = CLK_SET_RATE_PARENT, 2037 + }, 2038 + }; 2039 + 2040 + static struct clk_regmap s4_vapb_0 = { 2041 + .data = &(struct clk_regmap_gate_data){ 2042 + .offset = CLKCTRL_VAPBCLK_CTRL, 2043 + .bit_idx = 8, 2044 + }, 2045 + .hw.init = &(struct clk_init_data) { 2046 + .name = "vapb_0", 2047 + .ops = &clk_regmap_gate_ops, 2048 + .parent_hws = (const struct clk_hw *[]) { 2049 + &s4_vapb_0_div.hw 2050 + }, 2051 + .num_parents = 1, 2052 + .flags = CLK_SET_RATE_PARENT, 2053 + }, 2054 + }; 2055 + 2056 + static struct clk_regmap s4_vapb_1_sel = { 2057 + .data = &(struct clk_regmap_mux_data){ 2058 + .offset = CLKCTRL_VAPBCLK_CTRL, 2059 + .mask = 0x7, 2060 + .shift = 25, 2061 + }, 2062 + .hw.init = &(struct clk_init_data){ 2063 + .name = "vapb_1_sel", 2064 + .ops = &clk_regmap_mux_ops, 2065 + .parent_data = s4_vapb_parent_data, 2066 + .num_parents = ARRAY_SIZE(s4_vapb_parent_data), 2067 + .flags = 0, 2068 + }, 2069 + }; 2070 + 2071 + static struct clk_regmap s4_vapb_1_div = { 2072 + .data = &(struct clk_regmap_div_data){ 2073 + .offset = CLKCTRL_VAPBCLK_CTRL, 2074 + .shift = 16, 2075 + .width = 7, 2076 + }, 2077 + .hw.init = &(struct clk_init_data){ 2078 + .name = "vapb_1_div", 2079 + .ops = &clk_regmap_divider_ops, 2080 + .parent_hws = (const struct clk_hw *[]) { 2081 + &s4_vapb_1_sel.hw 2082 + }, 2083 + .num_parents = 1, 2084 + .flags = CLK_SET_RATE_PARENT, 2085 + }, 2086 + }; 2087 + 2088 + static struct clk_regmap s4_vapb_1 = { 2089 + .data = &(struct clk_regmap_gate_data){ 2090 + .offset = CLKCTRL_VAPBCLK_CTRL, 2091 + .bit_idx = 24, 2092 + }, 2093 + .hw.init = &(struct clk_init_data) { 2094 + .name = "vapb_1", 2095 + .ops = &clk_regmap_gate_ops, 2096 + .parent_hws = (const struct clk_hw *[]) { 2097 + &s4_vapb_1_div.hw 2098 + }, 2099 + .num_parents = 1, 2100 + .flags = CLK_SET_RATE_PARENT, 2101 + }, 2102 + }; 2103 + 2104 + static struct clk_regmap s4_vapb = { 2105 + .data = &(struct clk_regmap_mux_data){ 2106 + .offset = CLKCTRL_VAPBCLK_CTRL, 2107 + .mask = 1, 2108 + .shift = 31, 2109 + }, 2110 + .hw.init = &(struct clk_init_data){ 2111 + .name = "vapb_sel", 2112 + .ops = &clk_regmap_mux_ops, 2113 + .parent_hws = (const struct clk_hw *[]) { 2114 + &s4_vapb_0.hw, 2115 + &s4_vapb_1.hw 2116 + }, 2117 + .num_parents = 2, 2118 + .flags = CLK_SET_RATE_PARENT, 2119 + }, 2120 + }; 2121 + 2122 + static struct clk_regmap s4_ge2d_gate = { 2123 + .data = &(struct clk_regmap_gate_data){ 2124 + .offset = CLKCTRL_VAPBCLK_CTRL, 2125 + .bit_idx = 30, 2126 + }, 2127 + .hw.init = &(struct clk_init_data) { 2128 + .name = "ge2d_clk", 2129 + .ops = &clk_regmap_gate_ops, 2130 + .parent_hws = (const struct clk_hw *[]) { &s4_vapb.hw }, 2131 + .num_parents = 1, 2132 + .flags = CLK_SET_RATE_PARENT, 2133 + }, 2134 + }; 2135 + 2136 + static const struct clk_parent_data s4_esmclk_parent_data[] = { 2137 + { .fw_name = "fclk_div7", }, 2138 + { .fw_name = "fclk_div4", }, 2139 + { .fw_name = "fclk_div3", }, 2140 + { .fw_name = "fclk_div5", }, 2141 + }; 2142 + 2143 + static struct clk_regmap s4_hdcp22_esmclk_mux = { 2144 + .data = &(struct clk_regmap_mux_data){ 2145 + .offset = CLKCTRL_HDCP22_CTRL, 2146 + .mask = 0x3, 2147 + .shift = 9, 2148 + }, 2149 + .hw.init = &(struct clk_init_data) { 2150 + .name = "hdcp22_esmclk_mux", 2151 + .ops = &clk_regmap_mux_ops, 2152 + .parent_data = s4_esmclk_parent_data, 2153 + .num_parents = ARRAY_SIZE(s4_esmclk_parent_data), 2154 + .flags = CLK_SET_RATE_PARENT, 2155 + }, 2156 + }; 2157 + 2158 + static struct clk_regmap s4_hdcp22_esmclk_div = { 2159 + .data = &(struct clk_regmap_div_data){ 2160 + .offset = CLKCTRL_HDCP22_CTRL, 2161 + .shift = 0, 2162 + .width = 7, 2163 + }, 2164 + .hw.init = &(struct clk_init_data) { 2165 + .name = "hdcp22_esmclk_div", 2166 + .ops = &clk_regmap_divider_ops, 2167 + .parent_hws = (const struct clk_hw *[]) { 2168 + &s4_hdcp22_esmclk_mux.hw 2169 + }, 2170 + .num_parents = 1, 2171 + .flags = CLK_SET_RATE_PARENT, 2172 + }, 2173 + }; 2174 + 2175 + static struct clk_regmap s4_hdcp22_esmclk_gate = { 2176 + .data = &(struct clk_regmap_gate_data){ 2177 + .offset = CLKCTRL_HDCP22_CTRL, 2178 + .bit_idx = 8, 2179 + }, 2180 + .hw.init = &(struct clk_init_data){ 2181 + .name = "hdcp22_esmclk_gate", 2182 + .ops = &clk_regmap_gate_ops, 2183 + .parent_hws = (const struct clk_hw *[]) { 2184 + &s4_hdcp22_esmclk_div.hw 2185 + }, 2186 + .num_parents = 1, 2187 + .flags = CLK_SET_RATE_PARENT, 2188 + }, 2189 + }; 2190 + 2191 + static const struct clk_parent_data s4_skpclk_parent_data[] = { 2192 + { .fw_name = "xtal", }, 2193 + { .fw_name = "fclk_div4", }, 2194 + { .fw_name = "fclk_div3", }, 2195 + { .fw_name = "fclk_div5", }, 2196 + }; 2197 + 2198 + static struct clk_regmap s4_hdcp22_skpclk_mux = { 2199 + .data = &(struct clk_regmap_mux_data){ 2200 + .offset = CLKCTRL_HDCP22_CTRL, 2201 + .mask = 0x3, 2202 + .shift = 25, 2203 + }, 2204 + .hw.init = &(struct clk_init_data) { 2205 + .name = "hdcp22_skpclk_mux", 2206 + .ops = &clk_regmap_mux_ops, 2207 + .parent_data = s4_skpclk_parent_data, 2208 + .num_parents = ARRAY_SIZE(s4_skpclk_parent_data), 2209 + .flags = CLK_SET_RATE_PARENT, 2210 + }, 2211 + }; 2212 + 2213 + static struct clk_regmap s4_hdcp22_skpclk_div = { 2214 + .data = &(struct clk_regmap_div_data){ 2215 + .offset = CLKCTRL_HDCP22_CTRL, 2216 + .shift = 16, 2217 + .width = 7, 2218 + }, 2219 + .hw.init = &(struct clk_init_data) { 2220 + .name = "hdcp22_skpclk_div", 2221 + .ops = &clk_regmap_divider_ops, 2222 + .parent_hws = (const struct clk_hw *[]) { 2223 + &s4_hdcp22_skpclk_mux.hw 2224 + }, 2225 + .num_parents = 1, 2226 + .flags = CLK_SET_RATE_PARENT, 2227 + }, 2228 + }; 2229 + 2230 + static struct clk_regmap s4_hdcp22_skpclk_gate = { 2231 + .data = &(struct clk_regmap_gate_data){ 2232 + .offset = CLKCTRL_HDCP22_CTRL, 2233 + .bit_idx = 24, 2234 + }, 2235 + .hw.init = &(struct clk_init_data){ 2236 + .name = "hdcp22_skpclk_gate", 2237 + .ops = &clk_regmap_gate_ops, 2238 + .parent_hws = (const struct clk_hw *[]) { 2239 + &s4_hdcp22_skpclk_div.hw 2240 + }, 2241 + .num_parents = 1, 2242 + .flags = CLK_SET_RATE_PARENT, 2243 + }, 2244 + }; 2245 + 2246 + static const struct clk_parent_data s4_vdin_parent_data[] = { 2247 + { .fw_name = "xtal", }, 2248 + { .fw_name = "fclk_div4", }, 2249 + { .fw_name = "fclk_div3", }, 2250 + { .fw_name = "fclk_div5", }, 2251 + { .hw = &s4_vid_pll.hw } 2252 + }; 2253 + 2254 + static struct clk_regmap s4_vdin_meas_mux = { 2255 + .data = &(struct clk_regmap_mux_data){ 2256 + .offset = CLKCTRL_VDIN_MEAS_CLK_CTRL, 2257 + .mask = 0x7, 2258 + .shift = 9, 2259 + }, 2260 + .hw.init = &(struct clk_init_data) { 2261 + .name = "vdin_meas_mux", 2262 + .ops = &clk_regmap_mux_ops, 2263 + .parent_data = s4_vdin_parent_data, 2264 + .num_parents = ARRAY_SIZE(s4_vdin_parent_data), 2265 + .flags = CLK_SET_RATE_PARENT, 2266 + }, 2267 + }; 2268 + 2269 + static struct clk_regmap s4_vdin_meas_div = { 2270 + .data = &(struct clk_regmap_div_data){ 2271 + .offset = CLKCTRL_VDIN_MEAS_CLK_CTRL, 2272 + .shift = 0, 2273 + .width = 7, 2274 + }, 2275 + .hw.init = &(struct clk_init_data) { 2276 + .name = "vdin_meas_div", 2277 + .ops = &clk_regmap_divider_ops, 2278 + .parent_hws = (const struct clk_hw *[]) { 2279 + &s4_vdin_meas_mux.hw 2280 + }, 2281 + .num_parents = 1, 2282 + .flags = CLK_SET_RATE_PARENT, 2283 + }, 2284 + }; 2285 + 2286 + static struct clk_regmap s4_vdin_meas_gate = { 2287 + .data = &(struct clk_regmap_gate_data){ 2288 + .offset = CLKCTRL_VDIN_MEAS_CLK_CTRL, 2289 + .bit_idx = 8, 2290 + }, 2291 + .hw.init = &(struct clk_init_data){ 2292 + .name = "vdin_meas_gate", 2293 + .ops = &clk_regmap_gate_ops, 2294 + .parent_hws = (const struct clk_hw *[]) { 2295 + &s4_vdin_meas_div.hw 2296 + }, 2297 + .num_parents = 1, 2298 + .flags = CLK_SET_RATE_PARENT, 2299 + }, 2300 + }; 2301 + 2302 + /* EMMC/NAND clock */ 2303 + static const struct clk_parent_data s4_sd_emmc_clk0_parent_data[] = { 2304 + { .fw_name = "xtal", }, 2305 + { .fw_name = "fclk_div2", }, 2306 + { .fw_name = "fclk_div3", }, 2307 + { .fw_name = "hifi_pll", }, 2308 + { .fw_name = "fclk_div2p5", }, 2309 + { .fw_name = "mpll2", }, 2310 + { .fw_name = "mpll3", }, 2311 + { .fw_name = "gp0_pll", }, 2312 + }; 2313 + 2314 + static struct clk_regmap s4_sd_emmc_c_clk0_sel = { 2315 + .data = &(struct clk_regmap_mux_data){ 2316 + .offset = CLKCTRL_NAND_CLK_CTRL, 2317 + .mask = 0x7, 2318 + .shift = 9, 2319 + }, 2320 + .hw.init = &(struct clk_init_data) { 2321 + .name = "sd_emmc_c_clk0_sel", 2322 + .ops = &clk_regmap_mux_ops, 2323 + .parent_data = s4_sd_emmc_clk0_parent_data, 2324 + .num_parents = ARRAY_SIZE(s4_sd_emmc_clk0_parent_data), 2325 + .flags = 0, 2326 + }, 2327 + }; 2328 + 2329 + static struct clk_regmap s4_sd_emmc_c_clk0_div = { 2330 + .data = &(struct clk_regmap_div_data){ 2331 + .offset = CLKCTRL_NAND_CLK_CTRL, 2332 + .shift = 0, 2333 + .width = 7, 2334 + }, 2335 + .hw.init = &(struct clk_init_data) { 2336 + .name = "sd_emmc_c_clk0_div", 2337 + .ops = &clk_regmap_divider_ops, 2338 + .parent_hws = (const struct clk_hw *[]) { 2339 + &s4_sd_emmc_c_clk0_sel.hw 2340 + }, 2341 + .num_parents = 1, 2342 + .flags = CLK_SET_RATE_PARENT, 2343 + }, 2344 + }; 2345 + 2346 + static struct clk_regmap s4_sd_emmc_c_clk0 = { 2347 + .data = &(struct clk_regmap_gate_data){ 2348 + .offset = CLKCTRL_NAND_CLK_CTRL, 2349 + .bit_idx = 7, 2350 + }, 2351 + .hw.init = &(struct clk_init_data){ 2352 + .name = "sd_emmc_c_clk0", 2353 + .ops = &clk_regmap_gate_ops, 2354 + .parent_hws = (const struct clk_hw *[]) { 2355 + &s4_sd_emmc_c_clk0_div.hw 2356 + }, 2357 + .num_parents = 1, 2358 + .flags = CLK_SET_RATE_PARENT, 2359 + }, 2360 + }; 2361 + 2362 + static struct clk_regmap s4_sd_emmc_a_clk0_sel = { 2363 + .data = &(struct clk_regmap_mux_data){ 2364 + .offset = CLKCTRL_SD_EMMC_CLK_CTRL, 2365 + .mask = 0x7, 2366 + .shift = 9, 2367 + }, 2368 + .hw.init = &(struct clk_init_data) { 2369 + .name = "sd_emmc_a_clk0_sel", 2370 + .ops = &clk_regmap_mux_ops, 2371 + .parent_data = s4_sd_emmc_clk0_parent_data, 2372 + .num_parents = ARRAY_SIZE(s4_sd_emmc_clk0_parent_data), 2373 + .flags = 0, 2374 + }, 2375 + }; 2376 + 2377 + static struct clk_regmap s4_sd_emmc_a_clk0_div = { 2378 + .data = &(struct clk_regmap_div_data){ 2379 + .offset = CLKCTRL_SD_EMMC_CLK_CTRL, 2380 + .shift = 0, 2381 + .width = 7, 2382 + }, 2383 + .hw.init = &(struct clk_init_data) { 2384 + .name = "sd_emmc_a_clk0_div", 2385 + .ops = &clk_regmap_divider_ops, 2386 + .parent_hws = (const struct clk_hw *[]) { 2387 + &s4_sd_emmc_a_clk0_sel.hw 2388 + }, 2389 + .num_parents = 1, 2390 + .flags = CLK_SET_RATE_PARENT, 2391 + }, 2392 + }; 2393 + 2394 + static struct clk_regmap s4_sd_emmc_a_clk0 = { 2395 + .data = &(struct clk_regmap_gate_data){ 2396 + .offset = CLKCTRL_SD_EMMC_CLK_CTRL, 2397 + .bit_idx = 7, 2398 + }, 2399 + .hw.init = &(struct clk_init_data){ 2400 + .name = "sd_emmc_a_clk0", 2401 + .ops = &clk_regmap_gate_ops, 2402 + .parent_hws = (const struct clk_hw *[]) { 2403 + &s4_sd_emmc_a_clk0_div.hw 2404 + }, 2405 + .num_parents = 1, 2406 + .flags = CLK_SET_RATE_PARENT, 2407 + }, 2408 + }; 2409 + 2410 + static struct clk_regmap s4_sd_emmc_b_clk0_sel = { 2411 + .data = &(struct clk_regmap_mux_data){ 2412 + .offset = CLKCTRL_SD_EMMC_CLK_CTRL, 2413 + .mask = 0x7, 2414 + .shift = 25, 2415 + }, 2416 + .hw.init = &(struct clk_init_data) { 2417 + .name = "sd_emmc_b_clk0_sel", 2418 + .ops = &clk_regmap_mux_ops, 2419 + .parent_data = s4_sd_emmc_clk0_parent_data, 2420 + .num_parents = ARRAY_SIZE(s4_sd_emmc_clk0_parent_data), 2421 + .flags = 0, 2422 + }, 2423 + }; 2424 + 2425 + static struct clk_regmap s4_sd_emmc_b_clk0_div = { 2426 + .data = &(struct clk_regmap_div_data){ 2427 + .offset = CLKCTRL_SD_EMMC_CLK_CTRL, 2428 + .shift = 16, 2429 + .width = 7, 2430 + }, 2431 + .hw.init = &(struct clk_init_data) { 2432 + .name = "sd_emmc_b_clk0_div", 2433 + .ops = &clk_regmap_divider_ops, 2434 + .parent_hws = (const struct clk_hw *[]) { 2435 + &s4_sd_emmc_b_clk0_sel.hw 2436 + }, 2437 + .num_parents = 1, 2438 + .flags = CLK_SET_RATE_PARENT, 2439 + }, 2440 + }; 2441 + 2442 + static struct clk_regmap s4_sd_emmc_b_clk0 = { 2443 + .data = &(struct clk_regmap_gate_data){ 2444 + .offset = CLKCTRL_SD_EMMC_CLK_CTRL, 2445 + .bit_idx = 23, 2446 + }, 2447 + .hw.init = &(struct clk_init_data){ 2448 + .name = "sd_emmc_b_clk0", 2449 + .ops = &clk_regmap_gate_ops, 2450 + .parent_hws = (const struct clk_hw *[]) { 2451 + &s4_sd_emmc_b_clk0_div.hw 2452 + }, 2453 + .num_parents = 1, 2454 + .flags = CLK_SET_RATE_PARENT, 2455 + }, 2456 + }; 2457 + 2458 + /* SPICC Clock */ 2459 + static const struct clk_parent_data s4_spicc_parent_data[] = { 2460 + { .fw_name = "xtal", }, 2461 + { .hw = &s4_sys_clk.hw }, 2462 + { .fw_name = "fclk_div4", }, 2463 + { .fw_name = "fclk_div3", }, 2464 + { .fw_name = "fclk_div2", }, 2465 + { .fw_name = "fclk_div5", }, 2466 + { .fw_name = "fclk_div7", }, 2467 + }; 2468 + 2469 + static struct clk_regmap s4_spicc0_mux = { 2470 + .data = &(struct clk_regmap_mux_data){ 2471 + .offset = CLKCTRL_SPICC_CLK_CTRL, 2472 + .mask = 0x7, 2473 + .shift = 7, 2474 + }, 2475 + .hw.init = &(struct clk_init_data) { 2476 + .name = "spicc0_mux", 2477 + .ops = &clk_regmap_mux_ops, 2478 + .parent_data = s4_spicc_parent_data, 2479 + .num_parents = ARRAY_SIZE(s4_spicc_parent_data), 2480 + .flags = CLK_SET_RATE_PARENT, 2481 + }, 2482 + }; 2483 + 2484 + static struct clk_regmap s4_spicc0_div = { 2485 + .data = &(struct clk_regmap_div_data){ 2486 + .offset = CLKCTRL_SPICC_CLK_CTRL, 2487 + .shift = 0, 2488 + .width = 6, 2489 + }, 2490 + .hw.init = &(struct clk_init_data) { 2491 + .name = "spicc0_div", 2492 + .ops = &clk_regmap_divider_ops, 2493 + .parent_hws = (const struct clk_hw *[]) { 2494 + &s4_spicc0_mux.hw 2495 + }, 2496 + .num_parents = 1, 2497 + .flags = CLK_SET_RATE_PARENT, 2498 + }, 2499 + }; 2500 + 2501 + static struct clk_regmap s4_spicc0_gate = { 2502 + .data = &(struct clk_regmap_gate_data){ 2503 + .offset = CLKCTRL_SPICC_CLK_CTRL, 2504 + .bit_idx = 6, 2505 + }, 2506 + .hw.init = &(struct clk_init_data){ 2507 + .name = "spicc0", 2508 + .ops = &clk_regmap_gate_ops, 2509 + .parent_hws = (const struct clk_hw *[]) { 2510 + &s4_spicc0_div.hw 2511 + }, 2512 + .num_parents = 1, 2513 + .flags = CLK_SET_RATE_PARENT, 2514 + }, 2515 + }; 2516 + 2517 + /* PWM Clock */ 2518 + static const struct clk_parent_data s4_pwm_parent_data[] = { 2519 + { .fw_name = "xtal", }, 2520 + { .hw = &s4_vid_pll.hw }, 2521 + { .fw_name = "fclk_div4", }, 2522 + { .fw_name = "fclk_div3", }, 2523 + }; 2524 + 2525 + static struct clk_regmap s4_pwm_a_mux = { 2526 + .data = &(struct clk_regmap_mux_data) { 2527 + .offset = CLKCTRL_PWM_CLK_AB_CTRL, 2528 + .mask = 0x3, 2529 + .shift = 9, 2530 + }, 2531 + .hw.init = &(struct clk_init_data){ 2532 + .name = "pwm_a_mux", 2533 + .ops = &clk_regmap_mux_ops, 2534 + .parent_data = s4_pwm_parent_data, 2535 + .num_parents = ARRAY_SIZE(s4_pwm_parent_data), 2536 + .flags = 0, 2537 + }, 2538 + }; 2539 + 2540 + static struct clk_regmap s4_pwm_a_div = { 2541 + .data = &(struct clk_regmap_div_data) { 2542 + .offset = CLKCTRL_PWM_CLK_AB_CTRL, 2543 + .shift = 0, 2544 + .width = 8, 2545 + }, 2546 + .hw.init = &(struct clk_init_data){ 2547 + .name = "pwm_a_div", 2548 + .ops = &clk_regmap_divider_ops, 2549 + .parent_hws = (const struct clk_hw *[]) { 2550 + &s4_pwm_a_mux.hw 2551 + }, 2552 + .num_parents = 1, 2553 + .flags = CLK_SET_RATE_PARENT, 2554 + }, 2555 + }; 2556 + 2557 + static struct clk_regmap s4_pwm_a_gate = { 2558 + .data = &(struct clk_regmap_gate_data) { 2559 + .offset = CLKCTRL_PWM_CLK_AB_CTRL, 2560 + .bit_idx = 8, 2561 + }, 2562 + .hw.init = &(struct clk_init_data){ 2563 + .name = "pwm_a_gate", 2564 + .ops = &clk_regmap_gate_ops, 2565 + .parent_hws = (const struct clk_hw *[]) { 2566 + &s4_pwm_a_div.hw 2567 + }, 2568 + .num_parents = 1, 2569 + .flags = CLK_SET_RATE_PARENT, 2570 + }, 2571 + }; 2572 + 2573 + static struct clk_regmap s4_pwm_b_mux = { 2574 + .data = &(struct clk_regmap_mux_data) { 2575 + .offset = CLKCTRL_PWM_CLK_AB_CTRL, 2576 + .mask = 0x3, 2577 + .shift = 25, 2578 + }, 2579 + .hw.init = &(struct clk_init_data){ 2580 + .name = "pwm_b_mux", 2581 + .ops = &clk_regmap_mux_ops, 2582 + .parent_data = s4_pwm_parent_data, 2583 + .num_parents = ARRAY_SIZE(s4_pwm_parent_data), 2584 + .flags = 0, 2585 + }, 2586 + }; 2587 + 2588 + static struct clk_regmap s4_pwm_b_div = { 2589 + .data = &(struct clk_regmap_div_data) { 2590 + .offset = CLKCTRL_PWM_CLK_AB_CTRL, 2591 + .shift = 16, 2592 + .width = 8, 2593 + }, 2594 + .hw.init = &(struct clk_init_data){ 2595 + .name = "pwm_b_div", 2596 + .ops = &clk_regmap_divider_ops, 2597 + .parent_hws = (const struct clk_hw *[]) { 2598 + &s4_pwm_b_mux.hw 2599 + }, 2600 + .num_parents = 1, 2601 + .flags = CLK_SET_RATE_PARENT, 2602 + }, 2603 + }; 2604 + 2605 + static struct clk_regmap s4_pwm_b_gate = { 2606 + .data = &(struct clk_regmap_gate_data) { 2607 + .offset = CLKCTRL_PWM_CLK_AB_CTRL, 2608 + .bit_idx = 24, 2609 + }, 2610 + .hw.init = &(struct clk_init_data){ 2611 + .name = "pwm_b_gate", 2612 + .ops = &clk_regmap_gate_ops, 2613 + .parent_hws = (const struct clk_hw *[]) { 2614 + &s4_pwm_b_div.hw 2615 + }, 2616 + .num_parents = 1, 2617 + .flags = CLK_SET_RATE_PARENT, 2618 + }, 2619 + }; 2620 + 2621 + static struct clk_regmap s4_pwm_c_mux = { 2622 + .data = &(struct clk_regmap_mux_data) { 2623 + .offset = CLKCTRL_PWM_CLK_CD_CTRL, 2624 + .mask = 0x3, 2625 + .shift = 9, 2626 + }, 2627 + .hw.init = &(struct clk_init_data){ 2628 + .name = "pwm_c_mux", 2629 + .ops = &clk_regmap_mux_ops, 2630 + .parent_data = s4_pwm_parent_data, 2631 + .num_parents = ARRAY_SIZE(s4_pwm_parent_data), 2632 + .flags = 0, 2633 + }, 2634 + }; 2635 + 2636 + static struct clk_regmap s4_pwm_c_div = { 2637 + .data = &(struct clk_regmap_div_data) { 2638 + .offset = CLKCTRL_PWM_CLK_CD_CTRL, 2639 + .shift = 0, 2640 + .width = 8, 2641 + }, 2642 + .hw.init = &(struct clk_init_data){ 2643 + .name = "pwm_c_div", 2644 + .ops = &clk_regmap_divider_ops, 2645 + .parent_hws = (const struct clk_hw *[]) { 2646 + &s4_pwm_c_mux.hw 2647 + }, 2648 + .num_parents = 1, 2649 + }, 2650 + }; 2651 + 2652 + static struct clk_regmap s4_pwm_c_gate = { 2653 + .data = &(struct clk_regmap_gate_data) { 2654 + .offset = CLKCTRL_PWM_CLK_CD_CTRL, 2655 + .bit_idx = 8, 2656 + }, 2657 + .hw.init = &(struct clk_init_data){ 2658 + .name = "pwm_c_gate", 2659 + .ops = &clk_regmap_gate_ops, 2660 + .parent_hws = (const struct clk_hw *[]) { 2661 + &s4_pwm_c_div.hw 2662 + }, 2663 + .num_parents = 1, 2664 + .flags = CLK_SET_RATE_PARENT, 2665 + }, 2666 + }; 2667 + 2668 + static struct clk_regmap s4_pwm_d_mux = { 2669 + .data = &(struct clk_regmap_mux_data) { 2670 + .offset = CLKCTRL_PWM_CLK_CD_CTRL, 2671 + .mask = 0x3, 2672 + .shift = 25, 2673 + }, 2674 + .hw.init = &(struct clk_init_data){ 2675 + .name = "pwm_d_mux", 2676 + .ops = &clk_regmap_mux_ops, 2677 + .parent_data = s4_pwm_parent_data, 2678 + .num_parents = ARRAY_SIZE(s4_pwm_parent_data), 2679 + .flags = 0, 2680 + }, 2681 + }; 2682 + 2683 + static struct clk_regmap s4_pwm_d_div = { 2684 + .data = &(struct clk_regmap_div_data) { 2685 + .offset = CLKCTRL_PWM_CLK_CD_CTRL, 2686 + .shift = 16, 2687 + .width = 8, 2688 + }, 2689 + .hw.init = &(struct clk_init_data){ 2690 + .name = "pwm_d_div", 2691 + .ops = &clk_regmap_divider_ops, 2692 + .parent_hws = (const struct clk_hw *[]) { 2693 + &s4_pwm_d_mux.hw 2694 + }, 2695 + .num_parents = 1, 2696 + .flags = CLK_SET_RATE_PARENT, 2697 + }, 2698 + }; 2699 + 2700 + static struct clk_regmap s4_pwm_d_gate = { 2701 + .data = &(struct clk_regmap_gate_data) { 2702 + .offset = CLKCTRL_PWM_CLK_CD_CTRL, 2703 + .bit_idx = 24, 2704 + }, 2705 + .hw.init = &(struct clk_init_data){ 2706 + .name = "pwm_d_gate", 2707 + .ops = &clk_regmap_gate_ops, 2708 + .parent_hws = (const struct clk_hw *[]) { 2709 + &s4_pwm_d_div.hw 2710 + }, 2711 + .num_parents = 1, 2712 + .flags = CLK_SET_RATE_PARENT, 2713 + }, 2714 + }; 2715 + 2716 + static struct clk_regmap s4_pwm_e_mux = { 2717 + .data = &(struct clk_regmap_mux_data) { 2718 + .offset = CLKCTRL_PWM_CLK_EF_CTRL, 2719 + .mask = 0x3, 2720 + .shift = 9, 2721 + }, 2722 + .hw.init = &(struct clk_init_data){ 2723 + .name = "pwm_e_mux", 2724 + .ops = &clk_regmap_mux_ops, 2725 + .parent_data = s4_pwm_parent_data, 2726 + .num_parents = ARRAY_SIZE(s4_pwm_parent_data), 2727 + .flags = 0, 2728 + }, 2729 + }; 2730 + 2731 + static struct clk_regmap s4_pwm_e_div = { 2732 + .data = &(struct clk_regmap_div_data) { 2733 + .offset = CLKCTRL_PWM_CLK_EF_CTRL, 2734 + .shift = 0, 2735 + .width = 8, 2736 + }, 2737 + .hw.init = &(struct clk_init_data){ 2738 + .name = "pwm_e_div", 2739 + .ops = &clk_regmap_divider_ops, 2740 + .parent_hws = (const struct clk_hw *[]) { 2741 + &s4_pwm_e_mux.hw 2742 + }, 2743 + .num_parents = 1, 2744 + .flags = CLK_SET_RATE_PARENT, 2745 + }, 2746 + }; 2747 + 2748 + static struct clk_regmap s4_pwm_e_gate = { 2749 + .data = &(struct clk_regmap_gate_data) { 2750 + .offset = CLKCTRL_PWM_CLK_EF_CTRL, 2751 + .bit_idx = 8, 2752 + }, 2753 + .hw.init = &(struct clk_init_data){ 2754 + .name = "pwm_e_gate", 2755 + .ops = &clk_regmap_gate_ops, 2756 + .parent_hws = (const struct clk_hw *[]) { 2757 + &s4_pwm_e_div.hw 2758 + }, 2759 + .num_parents = 1, 2760 + .flags = CLK_SET_RATE_PARENT, 2761 + }, 2762 + }; 2763 + 2764 + static struct clk_regmap s4_pwm_f_mux = { 2765 + .data = &(struct clk_regmap_mux_data) { 2766 + .offset = CLKCTRL_PWM_CLK_EF_CTRL, 2767 + .mask = 0x3, 2768 + .shift = 25, 2769 + }, 2770 + .hw.init = &(struct clk_init_data){ 2771 + .name = "pwm_f_mux", 2772 + .ops = &clk_regmap_mux_ops, 2773 + .parent_data = s4_pwm_parent_data, 2774 + .num_parents = ARRAY_SIZE(s4_pwm_parent_data), 2775 + .flags = 0, 2776 + }, 2777 + }; 2778 + 2779 + static struct clk_regmap s4_pwm_f_div = { 2780 + .data = &(struct clk_regmap_div_data) { 2781 + .offset = CLKCTRL_PWM_CLK_EF_CTRL, 2782 + .shift = 16, 2783 + .width = 8, 2784 + }, 2785 + .hw.init = &(struct clk_init_data){ 2786 + .name = "pwm_f_div", 2787 + .ops = &clk_regmap_divider_ops, 2788 + .parent_hws = (const struct clk_hw *[]) { 2789 + &s4_pwm_f_mux.hw 2790 + }, 2791 + .num_parents = 1, 2792 + .flags = CLK_SET_RATE_PARENT, 2793 + }, 2794 + }; 2795 + 2796 + static struct clk_regmap s4_pwm_f_gate = { 2797 + .data = &(struct clk_regmap_gate_data) { 2798 + .offset = CLKCTRL_PWM_CLK_EF_CTRL, 2799 + .bit_idx = 24, 2800 + }, 2801 + .hw.init = &(struct clk_init_data){ 2802 + .name = "pwm_f_gate", 2803 + .ops = &clk_regmap_gate_ops, 2804 + .parent_hws = (const struct clk_hw *[]) { 2805 + &s4_pwm_f_div.hw 2806 + }, 2807 + .num_parents = 1, 2808 + .flags = CLK_SET_RATE_PARENT, 2809 + }, 2810 + }; 2811 + 2812 + static struct clk_regmap s4_pwm_g_mux = { 2813 + .data = &(struct clk_regmap_mux_data) { 2814 + .offset = CLKCTRL_PWM_CLK_GH_CTRL, 2815 + .mask = 0x3, 2816 + .shift = 9, 2817 + }, 2818 + .hw.init = &(struct clk_init_data){ 2819 + .name = "pwm_g_mux", 2820 + .ops = &clk_regmap_mux_ops, 2821 + .parent_data = s4_pwm_parent_data, 2822 + .num_parents = ARRAY_SIZE(s4_pwm_parent_data), 2823 + .flags = 0, 2824 + }, 2825 + }; 2826 + 2827 + static struct clk_regmap s4_pwm_g_div = { 2828 + .data = &(struct clk_regmap_div_data) { 2829 + .offset = CLKCTRL_PWM_CLK_GH_CTRL, 2830 + .shift = 0, 2831 + .width = 8, 2832 + }, 2833 + .hw.init = &(struct clk_init_data){ 2834 + .name = "pwm_g_div", 2835 + .ops = &clk_regmap_divider_ops, 2836 + .parent_hws = (const struct clk_hw *[]) { 2837 + &s4_pwm_g_mux.hw 2838 + }, 2839 + .num_parents = 1, 2840 + .flags = CLK_SET_RATE_PARENT, 2841 + }, 2842 + }; 2843 + 2844 + static struct clk_regmap s4_pwm_g_gate = { 2845 + .data = &(struct clk_regmap_gate_data) { 2846 + .offset = CLKCTRL_PWM_CLK_GH_CTRL, 2847 + .bit_idx = 8, 2848 + }, 2849 + .hw.init = &(struct clk_init_data){ 2850 + .name = "pwm_g_gate", 2851 + .ops = &clk_regmap_gate_ops, 2852 + .parent_hws = (const struct clk_hw *[]) { 2853 + &s4_pwm_g_div.hw 2854 + }, 2855 + .num_parents = 1, 2856 + .flags = CLK_SET_RATE_PARENT, 2857 + }, 2858 + }; 2859 + 2860 + static struct clk_regmap s4_pwm_h_mux = { 2861 + .data = &(struct clk_regmap_mux_data) { 2862 + .offset = CLKCTRL_PWM_CLK_GH_CTRL, 2863 + .mask = 0x3, 2864 + .shift = 25, 2865 + }, 2866 + .hw.init = &(struct clk_init_data){ 2867 + .name = "pwm_h_mux", 2868 + .ops = &clk_regmap_mux_ops, 2869 + .parent_data = s4_pwm_parent_data, 2870 + .num_parents = ARRAY_SIZE(s4_pwm_parent_data), 2871 + .flags = 0, 2872 + }, 2873 + }; 2874 + 2875 + static struct clk_regmap s4_pwm_h_div = { 2876 + .data = &(struct clk_regmap_div_data) { 2877 + .offset = CLKCTRL_PWM_CLK_GH_CTRL, 2878 + .shift = 16, 2879 + .width = 8, 2880 + }, 2881 + .hw.init = &(struct clk_init_data){ 2882 + .name = "pwm_h_div", 2883 + .ops = &clk_regmap_divider_ops, 2884 + .parent_hws = (const struct clk_hw *[]) { 2885 + &s4_pwm_h_mux.hw 2886 + }, 2887 + .num_parents = 1, 2888 + .flags = CLK_SET_RATE_PARENT, 2889 + }, 2890 + }; 2891 + 2892 + static struct clk_regmap s4_pwm_h_gate = { 2893 + .data = &(struct clk_regmap_gate_data) { 2894 + .offset = CLKCTRL_PWM_CLK_GH_CTRL, 2895 + .bit_idx = 24, 2896 + }, 2897 + .hw.init = &(struct clk_init_data){ 2898 + .name = "pwm_h_gate", 2899 + .ops = &clk_regmap_gate_ops, 2900 + .parent_hws = (const struct clk_hw *[]) { 2901 + &s4_pwm_h_div.hw 2902 + }, 2903 + .num_parents = 1, 2904 + .flags = CLK_SET_RATE_PARENT, 2905 + }, 2906 + }; 2907 + 2908 + static struct clk_regmap s4_pwm_i_mux = { 2909 + .data = &(struct clk_regmap_mux_data) { 2910 + .offset = CLKCTRL_PWM_CLK_IJ_CTRL, 2911 + .mask = 0x3, 2912 + .shift = 9, 2913 + }, 2914 + .hw.init = &(struct clk_init_data){ 2915 + .name = "pwm_i_mux", 2916 + .ops = &clk_regmap_mux_ops, 2917 + .parent_data = s4_pwm_parent_data, 2918 + .num_parents = ARRAY_SIZE(s4_pwm_parent_data), 2919 + .flags = 0, 2920 + }, 2921 + }; 2922 + 2923 + static struct clk_regmap s4_pwm_i_div = { 2924 + .data = &(struct clk_regmap_div_data) { 2925 + .offset = CLKCTRL_PWM_CLK_IJ_CTRL, 2926 + .shift = 0, 2927 + .width = 8, 2928 + }, 2929 + .hw.init = &(struct clk_init_data){ 2930 + .name = "pwm_i_div", 2931 + .ops = &clk_regmap_divider_ops, 2932 + .parent_hws = (const struct clk_hw *[]) { 2933 + &s4_pwm_i_mux.hw 2934 + }, 2935 + .num_parents = 1, 2936 + .flags = CLK_SET_RATE_PARENT, 2937 + }, 2938 + }; 2939 + 2940 + static struct clk_regmap s4_pwm_i_gate = { 2941 + .data = &(struct clk_regmap_gate_data) { 2942 + .offset = CLKCTRL_PWM_CLK_IJ_CTRL, 2943 + .bit_idx = 8, 2944 + }, 2945 + .hw.init = &(struct clk_init_data){ 2946 + .name = "pwm_i_gate", 2947 + .ops = &clk_regmap_gate_ops, 2948 + .parent_hws = (const struct clk_hw *[]) { 2949 + &s4_pwm_i_div.hw 2950 + }, 2951 + .num_parents = 1, 2952 + .flags = CLK_SET_RATE_PARENT, 2953 + }, 2954 + }; 2955 + 2956 + static struct clk_regmap s4_pwm_j_mux = { 2957 + .data = &(struct clk_regmap_mux_data) { 2958 + .offset = CLKCTRL_PWM_CLK_IJ_CTRL, 2959 + .mask = 0x3, 2960 + .shift = 25, 2961 + }, 2962 + .hw.init = &(struct clk_init_data){ 2963 + .name = "pwm_j_mux", 2964 + .ops = &clk_regmap_mux_ops, 2965 + .parent_data = s4_pwm_parent_data, 2966 + .num_parents = ARRAY_SIZE(s4_pwm_parent_data), 2967 + .flags = 0, 2968 + }, 2969 + }; 2970 + 2971 + static struct clk_regmap s4_pwm_j_div = { 2972 + .data = &(struct clk_regmap_div_data) { 2973 + .offset = CLKCTRL_PWM_CLK_IJ_CTRL, 2974 + .shift = 16, 2975 + .width = 8, 2976 + }, 2977 + .hw.init = &(struct clk_init_data){ 2978 + .name = "pwm_j_div", 2979 + .ops = &clk_regmap_divider_ops, 2980 + .parent_hws = (const struct clk_hw *[]) { 2981 + &s4_pwm_h_mux.hw 2982 + }, 2983 + .num_parents = 1, 2984 + .flags = CLK_SET_RATE_PARENT, 2985 + }, 2986 + }; 2987 + 2988 + static struct clk_regmap s4_pwm_j_gate = { 2989 + .data = &(struct clk_regmap_gate_data) { 2990 + .offset = CLKCTRL_PWM_CLK_IJ_CTRL, 2991 + .bit_idx = 24, 2992 + }, 2993 + .hw.init = &(struct clk_init_data){ 2994 + .name = "pwm_j_gate", 2995 + .ops = &clk_regmap_gate_ops, 2996 + .parent_hws = (const struct clk_hw *[]) { 2997 + &s4_pwm_j_div.hw 2998 + }, 2999 + .num_parents = 1, 3000 + .flags = CLK_SET_RATE_PARENT, 3001 + }, 3002 + }; 3003 + 3004 + static struct clk_regmap s4_saradc_mux = { 3005 + .data = &(struct clk_regmap_mux_data) { 3006 + .offset = CLKCTRL_SAR_CLK_CTRL, 3007 + .mask = 0x3, 3008 + .shift = 9, 3009 + }, 3010 + .hw.init = &(struct clk_init_data){ 3011 + .name = "saradc_mux", 3012 + .ops = &clk_regmap_mux_ops, 3013 + .parent_data = (const struct clk_parent_data []) { 3014 + { .fw_name = "xtal", }, 3015 + { .hw = &s4_sys_clk.hw }, 3016 + }, 3017 + .num_parents = 2, 3018 + .flags = CLK_SET_RATE_PARENT, 3019 + }, 3020 + }; 3021 + 3022 + static struct clk_regmap s4_saradc_div = { 3023 + .data = &(struct clk_regmap_div_data) { 3024 + .offset = CLKCTRL_SAR_CLK_CTRL, 3025 + .shift = 0, 3026 + .width = 8, 3027 + }, 3028 + .hw.init = &(struct clk_init_data){ 3029 + .name = "saradc_div", 3030 + .ops = &clk_regmap_divider_ops, 3031 + .parent_hws = (const struct clk_hw *[]) { 3032 + &s4_saradc_mux.hw 3033 + }, 3034 + .num_parents = 1, 3035 + .flags = CLK_SET_RATE_PARENT, 3036 + }, 3037 + }; 3038 + 3039 + static struct clk_regmap s4_saradc_gate = { 3040 + .data = &(struct clk_regmap_gate_data) { 3041 + .offset = CLKCTRL_SAR_CLK_CTRL, 3042 + .bit_idx = 8, 3043 + }, 3044 + .hw.init = &(struct clk_init_data){ 3045 + .name = "saradc_clk", 3046 + .ops = &clk_regmap_gate_ops, 3047 + .parent_hws = (const struct clk_hw *[]) { 3048 + &s4_saradc_div.hw 3049 + }, 3050 + .num_parents = 1, 3051 + .flags = CLK_SET_RATE_PARENT, 3052 + }, 3053 + }; 3054 + 3055 + /* 3056 + * gen clk is designed for debug/monitor some internal clock quality. Some of the 3057 + * corresponding clock sources are not described in the clock tree and internal clock 3058 + * for debug, so they are skipped. 3059 + */ 3060 + static u32 s4_gen_clk_mux_table[] = { 0, 4, 5, 7, 19, 21, 22, 3061 + 23, 24, 25, 26, 27, 28 }; 3062 + static const struct clk_parent_data s4_gen_clk_parent_data[] = { 3063 + { .fw_name = "xtal", }, 3064 + { .hw = &s4_vid_pll.hw }, 3065 + { .fw_name = "gp0_pll", }, 3066 + { .fw_name = "hifi_pll", }, 3067 + { .fw_name = "fclk_div2", }, 3068 + { .fw_name = "fclk_div3", }, 3069 + { .fw_name = "fclk_div4", }, 3070 + { .fw_name = "fclk_div5", }, 3071 + { .fw_name = "fclk_div7", }, 3072 + { .fw_name = "mpll0", }, 3073 + { .fw_name = "mpll1", }, 3074 + { .fw_name = "mpll2", }, 3075 + { .fw_name = "mpll3", }, 3076 + }; 3077 + 3078 + static struct clk_regmap s4_gen_clk_sel = { 3079 + .data = &(struct clk_regmap_mux_data){ 3080 + .offset = CLKCTRL_GEN_CLK_CTRL, 3081 + .mask = 0x1f, 3082 + .shift = 12, 3083 + .table = s4_gen_clk_mux_table, 3084 + }, 3085 + .hw.init = &(struct clk_init_data){ 3086 + .name = "gen_clk_sel", 3087 + .ops = &clk_regmap_mux_ops, 3088 + .parent_data = s4_gen_clk_parent_data, 3089 + .num_parents = ARRAY_SIZE(s4_gen_clk_parent_data), 3090 + /* 3091 + * Because the GEN clock can be connected to an external pad 3092 + * and may be set up directly from the device tree. Don't 3093 + * really want to automatically reparent. 3094 + */ 3095 + .flags = CLK_SET_RATE_NO_REPARENT, 3096 + }, 3097 + }; 3098 + 3099 + static struct clk_regmap s4_gen_clk_div = { 3100 + .data = &(struct clk_regmap_div_data){ 3101 + .offset = CLKCTRL_GEN_CLK_CTRL, 3102 + .shift = 0, 3103 + .width = 11, 3104 + }, 3105 + .hw.init = &(struct clk_init_data){ 3106 + .name = "gen_clk_div", 3107 + .ops = &clk_regmap_divider_ops, 3108 + .parent_hws = (const struct clk_hw *[]) { 3109 + &s4_gen_clk_sel.hw 3110 + }, 3111 + .num_parents = 1, 3112 + .flags = CLK_SET_RATE_PARENT, 3113 + }, 3114 + }; 3115 + 3116 + static struct clk_regmap s4_gen_clk = { 3117 + .data = &(struct clk_regmap_gate_data){ 3118 + .offset = CLKCTRL_GEN_CLK_CTRL, 3119 + .bit_idx = 11, 3120 + }, 3121 + .hw.init = &(struct clk_init_data) { 3122 + .name = "gen_clk", 3123 + .ops = &clk_regmap_gate_ops, 3124 + .parent_hws = (const struct clk_hw *[]) { 3125 + &s4_gen_clk_div.hw 3126 + }, 3127 + .num_parents = 1, 3128 + .flags = CLK_SET_RATE_PARENT, 3129 + }, 3130 + }; 3131 + 3132 + static const struct clk_parent_data s4_adc_extclk_in_parent_data[] = { 3133 + { .fw_name = "xtal", }, 3134 + { .fw_name = "fclk_div4", }, 3135 + { .fw_name = "fclk_div3", }, 3136 + { .fw_name = "fclk_div5", }, 3137 + { .fw_name = "fclk_div7", }, 3138 + { .fw_name = "mpll2", }, 3139 + { .fw_name = "gp0_pll", }, 3140 + { .fw_name = "hifi_pll", }, 3141 + }; 3142 + 3143 + static struct clk_regmap s4_adc_extclk_in_mux = { 3144 + .data = &(struct clk_regmap_mux_data) { 3145 + .offset = CLKCTRL_DEMOD_CLK_CTRL, 3146 + .mask = 0x7, 3147 + .shift = 25, 3148 + }, 3149 + .hw.init = &(struct clk_init_data){ 3150 + .name = "adc_extclk_in_mux", 3151 + .ops = &clk_regmap_mux_ops, 3152 + .parent_data = s4_adc_extclk_in_parent_data, 3153 + .num_parents = ARRAY_SIZE(s4_adc_extclk_in_parent_data), 3154 + .flags = 0, 3155 + }, 3156 + }; 3157 + 3158 + static struct clk_regmap s4_adc_extclk_in_div = { 3159 + .data = &(struct clk_regmap_div_data) { 3160 + .offset = CLKCTRL_DEMOD_CLK_CTRL, 3161 + .shift = 16, 3162 + .width = 7, 3163 + }, 3164 + .hw.init = &(struct clk_init_data){ 3165 + .name = "adc_extclk_in_div", 3166 + .ops = &clk_regmap_divider_ops, 3167 + .parent_hws = (const struct clk_hw *[]) { 3168 + &s4_adc_extclk_in_mux.hw 3169 + }, 3170 + .num_parents = 1, 3171 + .flags = CLK_SET_RATE_PARENT, 3172 + }, 3173 + }; 3174 + 3175 + static struct clk_regmap s4_adc_extclk_in_gate = { 3176 + .data = &(struct clk_regmap_gate_data) { 3177 + .offset = CLKCTRL_DEMOD_CLK_CTRL, 3178 + .bit_idx = 24, 3179 + }, 3180 + .hw.init = &(struct clk_init_data){ 3181 + .name = "adc_extclk_in", 3182 + .ops = &clk_regmap_gate_ops, 3183 + .parent_hws = (const struct clk_hw *[]) { 3184 + &s4_adc_extclk_in_div.hw 3185 + }, 3186 + .num_parents = 1, 3187 + .flags = CLK_SET_RATE_PARENT, 3188 + }, 3189 + }; 3190 + 3191 + static struct clk_regmap s4_demod_core_clk_mux = { 3192 + .data = &(struct clk_regmap_mux_data) { 3193 + .offset = CLKCTRL_DEMOD_CLK_CTRL, 3194 + .mask = 0x3, 3195 + .shift = 9, 3196 + }, 3197 + .hw.init = &(struct clk_init_data){ 3198 + .name = "demod_core_clk_mux", 3199 + .ops = &clk_regmap_mux_ops, 3200 + .parent_data = (const struct clk_parent_data []) { 3201 + { .fw_name = "xtal", }, 3202 + { .fw_name = "fclk_div7", }, 3203 + { .fw_name = "fclk_div4", }, 3204 + { .hw = &s4_adc_extclk_in_gate.hw } 3205 + }, 3206 + .num_parents = 4, 3207 + .flags = CLK_SET_RATE_PARENT, 3208 + }, 3209 + }; 3210 + 3211 + static struct clk_regmap s4_demod_core_clk_div = { 3212 + .data = &(struct clk_regmap_div_data) { 3213 + .offset = CLKCTRL_DEMOD_CLK_CTRL, 3214 + .shift = 0, 3215 + .width = 7, 3216 + }, 3217 + .hw.init = &(struct clk_init_data){ 3218 + .name = "demod_core_clk_div", 3219 + .ops = &clk_regmap_divider_ops, 3220 + .parent_hws = (const struct clk_hw *[]) { 3221 + &s4_demod_core_clk_mux.hw 3222 + }, 3223 + .num_parents = 1, 3224 + .flags = CLK_SET_RATE_PARENT, 3225 + }, 3226 + }; 3227 + 3228 + static struct clk_regmap s4_demod_core_clk_gate = { 3229 + .data = &(struct clk_regmap_gate_data) { 3230 + .offset = CLKCTRL_DEMOD_CLK_CTRL, 3231 + .bit_idx = 8, 3232 + }, 3233 + .hw.init = &(struct clk_init_data){ 3234 + .name = "demod_core_clk", 3235 + .ops = &clk_regmap_gate_ops, 3236 + .parent_hws = (const struct clk_hw *[]) { 3237 + &s4_demod_core_clk_div.hw 3238 + }, 3239 + .num_parents = 1, 3240 + .flags = CLK_SET_RATE_PARENT, 3241 + }, 3242 + }; 3243 + 3244 + #define MESON_GATE(_name, _reg, _bit) \ 3245 + MESON_PCLK(_name, _reg, _bit, &s4_sys_clk.hw) 3246 + 3247 + static MESON_GATE(s4_ddr, CLKCTRL_SYS_CLK_EN0_REG0, 0); 3248 + static MESON_GATE(s4_dos, CLKCTRL_SYS_CLK_EN0_REG0, 1); 3249 + static MESON_GATE(s4_ethphy, CLKCTRL_SYS_CLK_EN0_REG0, 4); 3250 + static MESON_GATE(s4_mali, CLKCTRL_SYS_CLK_EN0_REG0, 6); 3251 + static MESON_GATE(s4_aocpu, CLKCTRL_SYS_CLK_EN0_REG0, 13); 3252 + static MESON_GATE(s4_aucpu, CLKCTRL_SYS_CLK_EN0_REG0, 14); 3253 + static MESON_GATE(s4_cec, CLKCTRL_SYS_CLK_EN0_REG0, 16); 3254 + static MESON_GATE(s4_sdemmca, CLKCTRL_SYS_CLK_EN0_REG0, 24); 3255 + static MESON_GATE(s4_sdemmcb, CLKCTRL_SYS_CLK_EN0_REG0, 25); 3256 + static MESON_GATE(s4_nand, CLKCTRL_SYS_CLK_EN0_REG0, 26); 3257 + static MESON_GATE(s4_smartcard, CLKCTRL_SYS_CLK_EN0_REG0, 27); 3258 + static MESON_GATE(s4_acodec, CLKCTRL_SYS_CLK_EN0_REG0, 28); 3259 + static MESON_GATE(s4_spifc, CLKCTRL_SYS_CLK_EN0_REG0, 29); 3260 + static MESON_GATE(s4_msr_clk, CLKCTRL_SYS_CLK_EN0_REG0, 30); 3261 + static MESON_GATE(s4_ir_ctrl, CLKCTRL_SYS_CLK_EN0_REG0, 31); 3262 + static MESON_GATE(s4_audio, CLKCTRL_SYS_CLK_EN0_REG1, 0); 3263 + static MESON_GATE(s4_eth, CLKCTRL_SYS_CLK_EN0_REG1, 3); 3264 + static MESON_GATE(s4_uart_a, CLKCTRL_SYS_CLK_EN0_REG1, 5); 3265 + static MESON_GATE(s4_uart_b, CLKCTRL_SYS_CLK_EN0_REG1, 6); 3266 + static MESON_GATE(s4_uart_c, CLKCTRL_SYS_CLK_EN0_REG1, 7); 3267 + static MESON_GATE(s4_uart_d, CLKCTRL_SYS_CLK_EN0_REG1, 8); 3268 + static MESON_GATE(s4_uart_e, CLKCTRL_SYS_CLK_EN0_REG1, 9); 3269 + static MESON_GATE(s4_aififo, CLKCTRL_SYS_CLK_EN0_REG1, 11); 3270 + static MESON_GATE(s4_ts_ddr, CLKCTRL_SYS_CLK_EN0_REG1, 15); 3271 + static MESON_GATE(s4_ts_pll, CLKCTRL_SYS_CLK_EN0_REG1, 16); 3272 + static MESON_GATE(s4_g2d, CLKCTRL_SYS_CLK_EN0_REG1, 20); 3273 + static MESON_GATE(s4_spicc0, CLKCTRL_SYS_CLK_EN0_REG1, 21); 3274 + static MESON_GATE(s4_usb, CLKCTRL_SYS_CLK_EN0_REG1, 26); 3275 + static MESON_GATE(s4_i2c_m_a, CLKCTRL_SYS_CLK_EN0_REG1, 30); 3276 + static MESON_GATE(s4_i2c_m_b, CLKCTRL_SYS_CLK_EN0_REG1, 31); 3277 + static MESON_GATE(s4_i2c_m_c, CLKCTRL_SYS_CLK_EN0_REG2, 0); 3278 + static MESON_GATE(s4_i2c_m_d, CLKCTRL_SYS_CLK_EN0_REG2, 1); 3279 + static MESON_GATE(s4_i2c_m_e, CLKCTRL_SYS_CLK_EN0_REG2, 2); 3280 + static MESON_GATE(s4_hdmitx_apb, CLKCTRL_SYS_CLK_EN0_REG2, 4); 3281 + static MESON_GATE(s4_i2c_s_a, CLKCTRL_SYS_CLK_EN0_REG2, 5); 3282 + static MESON_GATE(s4_usb1_to_ddr, CLKCTRL_SYS_CLK_EN0_REG2, 8); 3283 + static MESON_GATE(s4_hdcp22, CLKCTRL_SYS_CLK_EN0_REG2, 10); 3284 + static MESON_GATE(s4_mmc_apb, CLKCTRL_SYS_CLK_EN0_REG2, 11); 3285 + static MESON_GATE(s4_rsa, CLKCTRL_SYS_CLK_EN0_REG2, 18); 3286 + static MESON_GATE(s4_cpu_debug, CLKCTRL_SYS_CLK_EN0_REG2, 19); 3287 + static MESON_GATE(s4_vpu_intr, CLKCTRL_SYS_CLK_EN0_REG2, 25); 3288 + static MESON_GATE(s4_demod, CLKCTRL_SYS_CLK_EN0_REG2, 27); 3289 + static MESON_GATE(s4_sar_adc, CLKCTRL_SYS_CLK_EN0_REG2, 28); 3290 + static MESON_GATE(s4_gic, CLKCTRL_SYS_CLK_EN0_REG2, 30); 3291 + static MESON_GATE(s4_pwm_ab, CLKCTRL_SYS_CLK_EN0_REG3, 7); 3292 + static MESON_GATE(s4_pwm_cd, CLKCTRL_SYS_CLK_EN0_REG3, 8); 3293 + static MESON_GATE(s4_pwm_ef, CLKCTRL_SYS_CLK_EN0_REG3, 9); 3294 + static MESON_GATE(s4_pwm_gh, CLKCTRL_SYS_CLK_EN0_REG3, 10); 3295 + static MESON_GATE(s4_pwm_ij, CLKCTRL_SYS_CLK_EN0_REG3, 11); 3296 + 3297 + /* Array of all clocks provided by this provider */ 3298 + static struct clk_hw *s4_periphs_hw_clks[] = { 3299 + [CLKID_RTC_32K_CLKIN] = &s4_rtc_32k_by_oscin_clkin.hw, 3300 + [CLKID_RTC_32K_DIV] = &s4_rtc_32k_by_oscin_div.hw, 3301 + [CLKID_RTC_32K_SEL] = &s4_rtc_32k_by_oscin_sel.hw, 3302 + [CLKID_RTC_32K_XATL] = &s4_rtc_32k_by_oscin.hw, 3303 + [CLKID_RTC] = &s4_rtc_clk.hw, 3304 + [CLKID_SYS_CLK_B_SEL] = &s4_sysclk_b_sel.hw, 3305 + [CLKID_SYS_CLK_B_DIV] = &s4_sysclk_b_div.hw, 3306 + [CLKID_SYS_CLK_B] = &s4_sysclk_b.hw, 3307 + [CLKID_SYS_CLK_A_SEL] = &s4_sysclk_a_sel.hw, 3308 + [CLKID_SYS_CLK_A_DIV] = &s4_sysclk_a_div.hw, 3309 + [CLKID_SYS_CLK_A] = &s4_sysclk_a.hw, 3310 + [CLKID_SYS] = &s4_sys_clk.hw, 3311 + [CLKID_CECA_32K_CLKIN] = &s4_ceca_32k_clkin.hw, 3312 + [CLKID_CECA_32K_DIV] = &s4_ceca_32k_div.hw, 3313 + [CLKID_CECA_32K_SEL_PRE] = &s4_ceca_32k_sel_pre.hw, 3314 + [CLKID_CECA_32K_SEL] = &s4_ceca_32k_sel.hw, 3315 + [CLKID_CECA_32K_CLKOUT] = &s4_ceca_32k_clkout.hw, 3316 + [CLKID_CECB_32K_CLKIN] = &s4_cecb_32k_clkin.hw, 3317 + [CLKID_CECB_32K_DIV] = &s4_cecb_32k_div.hw, 3318 + [CLKID_CECB_32K_SEL_PRE] = &s4_cecb_32k_sel_pre.hw, 3319 + [CLKID_CECB_32K_SEL] = &s4_cecb_32k_sel.hw, 3320 + [CLKID_CECB_32K_CLKOUT] = &s4_cecb_32k_clkout.hw, 3321 + [CLKID_SC_CLK_SEL] = &s4_sc_clk_mux.hw, 3322 + [CLKID_SC_CLK_DIV] = &s4_sc_clk_div.hw, 3323 + [CLKID_SC] = &s4_sc_clk_gate.hw, 3324 + [CLKID_12_24M] = &s4_12_24M_clk_gate.hw, 3325 + [CLKID_12M_CLK_DIV] = &s4_12M_clk_div.hw, 3326 + [CLKID_12_24M_CLK_SEL] = &s4_12_24M_clk.hw, 3327 + [CLKID_VID_PLL_DIV] = &s4_vid_pll_div.hw, 3328 + [CLKID_VID_PLL_SEL] = &s4_vid_pll_sel.hw, 3329 + [CLKID_VID_PLL] = &s4_vid_pll.hw, 3330 + [CLKID_VCLK_SEL] = &s4_vclk_sel.hw, 3331 + [CLKID_VCLK2_SEL] = &s4_vclk2_sel.hw, 3332 + [CLKID_VCLK_INPUT] = &s4_vclk_input.hw, 3333 + [CLKID_VCLK2_INPUT] = &s4_vclk2_input.hw, 3334 + [CLKID_VCLK_DIV] = &s4_vclk_div.hw, 3335 + [CLKID_VCLK2_DIV] = &s4_vclk2_div.hw, 3336 + [CLKID_VCLK] = &s4_vclk.hw, 3337 + [CLKID_VCLK2] = &s4_vclk2.hw, 3338 + [CLKID_VCLK_DIV1] = &s4_vclk_div1.hw, 3339 + [CLKID_VCLK_DIV2_EN] = &s4_vclk_div2_en.hw, 3340 + [CLKID_VCLK_DIV4_EN] = &s4_vclk_div4_en.hw, 3341 + [CLKID_VCLK_DIV6_EN] = &s4_vclk_div6_en.hw, 3342 + [CLKID_VCLK_DIV12_EN] = &s4_vclk_div12_en.hw, 3343 + [CLKID_VCLK2_DIV1] = &s4_vclk2_div1.hw, 3344 + [CLKID_VCLK2_DIV2_EN] = &s4_vclk2_div2_en.hw, 3345 + [CLKID_VCLK2_DIV4_EN] = &s4_vclk2_div4_en.hw, 3346 + [CLKID_VCLK2_DIV6_EN] = &s4_vclk2_div6_en.hw, 3347 + [CLKID_VCLK2_DIV12_EN] = &s4_vclk2_div12_en.hw, 3348 + [CLKID_VCLK_DIV2] = &s4_vclk_div2.hw, 3349 + [CLKID_VCLK_DIV4] = &s4_vclk_div4.hw, 3350 + [CLKID_VCLK_DIV6] = &s4_vclk_div6.hw, 3351 + [CLKID_VCLK_DIV12] = &s4_vclk_div12.hw, 3352 + [CLKID_VCLK2_DIV2] = &s4_vclk2_div2.hw, 3353 + [CLKID_VCLK2_DIV4] = &s4_vclk2_div4.hw, 3354 + [CLKID_VCLK2_DIV6] = &s4_vclk2_div6.hw, 3355 + [CLKID_VCLK2_DIV12] = &s4_vclk2_div12.hw, 3356 + [CLKID_CTS_ENCI_SEL] = &s4_cts_enci_sel.hw, 3357 + [CLKID_CTS_ENCP_SEL] = &s4_cts_encp_sel.hw, 3358 + [CLKID_CTS_VDAC_SEL] = &s4_cts_vdac_sel.hw, 3359 + [CLKID_HDMI_TX_SEL] = &s4_hdmi_tx_sel.hw, 3360 + [CLKID_CTS_ENCI] = &s4_cts_enci.hw, 3361 + [CLKID_CTS_ENCP] = &s4_cts_encp.hw, 3362 + [CLKID_CTS_VDAC] = &s4_cts_vdac.hw, 3363 + [CLKID_HDMI_TX] = &s4_hdmi_tx.hw, 3364 + [CLKID_HDMI_SEL] = &s4_hdmi_sel.hw, 3365 + [CLKID_HDMI_DIV] = &s4_hdmi_div.hw, 3366 + [CLKID_HDMI] = &s4_hdmi.hw, 3367 + [CLKID_TS_CLK_DIV] = &s4_ts_clk_div.hw, 3368 + [CLKID_TS] = &s4_ts_clk_gate.hw, 3369 + [CLKID_MALI_0_SEL] = &s4_mali_0_sel.hw, 3370 + [CLKID_MALI_0_DIV] = &s4_mali_0_div.hw, 3371 + [CLKID_MALI_0] = &s4_mali_0.hw, 3372 + [CLKID_MALI_1_SEL] = &s4_mali_1_sel.hw, 3373 + [CLKID_MALI_1_DIV] = &s4_mali_1_div.hw, 3374 + [CLKID_MALI_1] = &s4_mali_1.hw, 3375 + [CLKID_MALI_SEL] = &s4_mali_mux.hw, 3376 + [CLKID_VDEC_P0_SEL] = &s4_vdec_p0_mux.hw, 3377 + [CLKID_VDEC_P0_DIV] = &s4_vdec_p0_div.hw, 3378 + [CLKID_VDEC_P0] = &s4_vdec_p0.hw, 3379 + [CLKID_VDEC_P1_SEL] = &s4_vdec_p1_mux.hw, 3380 + [CLKID_VDEC_P1_DIV] = &s4_vdec_p1_div.hw, 3381 + [CLKID_VDEC_P1] = &s4_vdec_p1.hw, 3382 + [CLKID_VDEC_SEL] = &s4_vdec_mux.hw, 3383 + [CLKID_HEVCF_P0_SEL] = &s4_hevcf_p0_mux.hw, 3384 + [CLKID_HEVCF_P0_DIV] = &s4_hevcf_p0_div.hw, 3385 + [CLKID_HEVCF_P0] = &s4_hevcf_p0.hw, 3386 + [CLKID_HEVCF_P1_SEL] = &s4_hevcf_p1_mux.hw, 3387 + [CLKID_HEVCF_P1_DIV] = &s4_hevcf_p1_div.hw, 3388 + [CLKID_HEVCF_P1] = &s4_hevcf_p1.hw, 3389 + [CLKID_HEVCF_SEL] = &s4_hevcf_mux.hw, 3390 + [CLKID_VPU_0_SEL] = &s4_vpu_0_sel.hw, 3391 + [CLKID_VPU_0_DIV] = &s4_vpu_0_div.hw, 3392 + [CLKID_VPU_0] = &s4_vpu_0.hw, 3393 + [CLKID_VPU_1_SEL] = &s4_vpu_1_sel.hw, 3394 + [CLKID_VPU_1_DIV] = &s4_vpu_1_div.hw, 3395 + [CLKID_VPU_1] = &s4_vpu_1.hw, 3396 + [CLKID_VPU] = &s4_vpu.hw, 3397 + [CLKID_VPU_CLKB_TMP_SEL] = &s4_vpu_clkb_tmp_mux.hw, 3398 + [CLKID_VPU_CLKB_TMP_DIV] = &s4_vpu_clkb_tmp_div.hw, 3399 + [CLKID_VPU_CLKB_TMP] = &s4_vpu_clkb_tmp.hw, 3400 + [CLKID_VPU_CLKB_DIV] = &s4_vpu_clkb_div.hw, 3401 + [CLKID_VPU_CLKB] = &s4_vpu_clkb.hw, 3402 + [CLKID_VPU_CLKC_P0_SEL] = &s4_vpu_clkc_p0_mux.hw, 3403 + [CLKID_VPU_CLKC_P0_DIV] = &s4_vpu_clkc_p0_div.hw, 3404 + [CLKID_VPU_CLKC_P0] = &s4_vpu_clkc_p0.hw, 3405 + [CLKID_VPU_CLKC_P1_SEL] = &s4_vpu_clkc_p1_mux.hw, 3406 + [CLKID_VPU_CLKC_P1_DIV] = &s4_vpu_clkc_p1_div.hw, 3407 + [CLKID_VPU_CLKC_P1] = &s4_vpu_clkc_p1.hw, 3408 + [CLKID_VPU_CLKC_SEL] = &s4_vpu_clkc_mux.hw, 3409 + [CLKID_VAPB_0_SEL] = &s4_vapb_0_sel.hw, 3410 + [CLKID_VAPB_0_DIV] = &s4_vapb_0_div.hw, 3411 + [CLKID_VAPB_0] = &s4_vapb_0.hw, 3412 + [CLKID_VAPB_1_SEL] = &s4_vapb_1_sel.hw, 3413 + [CLKID_VAPB_1_DIV] = &s4_vapb_1_div.hw, 3414 + [CLKID_VAPB_1] = &s4_vapb_1.hw, 3415 + [CLKID_VAPB] = &s4_vapb.hw, 3416 + [CLKID_GE2D] = &s4_ge2d_gate.hw, 3417 + [CLKID_VDIN_MEAS_SEL] = &s4_vdin_meas_mux.hw, 3418 + [CLKID_VDIN_MEAS_DIV] = &s4_vdin_meas_div.hw, 3419 + [CLKID_VDIN_MEAS] = &s4_vdin_meas_gate.hw, 3420 + [CLKID_SD_EMMC_C_CLK_SEL] = &s4_sd_emmc_c_clk0_sel.hw, 3421 + [CLKID_SD_EMMC_C_CLK_DIV] = &s4_sd_emmc_c_clk0_div.hw, 3422 + [CLKID_SD_EMMC_C] = &s4_sd_emmc_c_clk0.hw, 3423 + [CLKID_SD_EMMC_A_CLK_SEL] = &s4_sd_emmc_a_clk0_sel.hw, 3424 + [CLKID_SD_EMMC_A_CLK_DIV] = &s4_sd_emmc_a_clk0_div.hw, 3425 + [CLKID_SD_EMMC_A] = &s4_sd_emmc_a_clk0.hw, 3426 + [CLKID_SD_EMMC_B_CLK_SEL] = &s4_sd_emmc_b_clk0_sel.hw, 3427 + [CLKID_SD_EMMC_B_CLK_DIV] = &s4_sd_emmc_b_clk0_div.hw, 3428 + [CLKID_SD_EMMC_B] = &s4_sd_emmc_b_clk0.hw, 3429 + [CLKID_SPICC0_SEL] = &s4_spicc0_mux.hw, 3430 + [CLKID_SPICC0_DIV] = &s4_spicc0_div.hw, 3431 + [CLKID_SPICC0_EN] = &s4_spicc0_gate.hw, 3432 + [CLKID_PWM_A_SEL] = &s4_pwm_a_mux.hw, 3433 + [CLKID_PWM_A_DIV] = &s4_pwm_a_div.hw, 3434 + [CLKID_PWM_A] = &s4_pwm_a_gate.hw, 3435 + [CLKID_PWM_B_SEL] = &s4_pwm_b_mux.hw, 3436 + [CLKID_PWM_B_DIV] = &s4_pwm_b_div.hw, 3437 + [CLKID_PWM_B] = &s4_pwm_b_gate.hw, 3438 + [CLKID_PWM_C_SEL] = &s4_pwm_c_mux.hw, 3439 + [CLKID_PWM_C_DIV] = &s4_pwm_c_div.hw, 3440 + [CLKID_PWM_C] = &s4_pwm_c_gate.hw, 3441 + [CLKID_PWM_D_SEL] = &s4_pwm_d_mux.hw, 3442 + [CLKID_PWM_D_DIV] = &s4_pwm_d_div.hw, 3443 + [CLKID_PWM_D] = &s4_pwm_d_gate.hw, 3444 + [CLKID_PWM_E_SEL] = &s4_pwm_e_mux.hw, 3445 + [CLKID_PWM_E_DIV] = &s4_pwm_e_div.hw, 3446 + [CLKID_PWM_E] = &s4_pwm_e_gate.hw, 3447 + [CLKID_PWM_F_SEL] = &s4_pwm_f_mux.hw, 3448 + [CLKID_PWM_F_DIV] = &s4_pwm_f_div.hw, 3449 + [CLKID_PWM_F] = &s4_pwm_f_gate.hw, 3450 + [CLKID_PWM_G_SEL] = &s4_pwm_g_mux.hw, 3451 + [CLKID_PWM_G_DIV] = &s4_pwm_g_div.hw, 3452 + [CLKID_PWM_G] = &s4_pwm_g_gate.hw, 3453 + [CLKID_PWM_H_SEL] = &s4_pwm_h_mux.hw, 3454 + [CLKID_PWM_H_DIV] = &s4_pwm_h_div.hw, 3455 + [CLKID_PWM_H] = &s4_pwm_h_gate.hw, 3456 + [CLKID_PWM_I_SEL] = &s4_pwm_i_mux.hw, 3457 + [CLKID_PWM_I_DIV] = &s4_pwm_i_div.hw, 3458 + [CLKID_PWM_I] = &s4_pwm_i_gate.hw, 3459 + [CLKID_PWM_J_SEL] = &s4_pwm_j_mux.hw, 3460 + [CLKID_PWM_J_DIV] = &s4_pwm_j_div.hw, 3461 + [CLKID_PWM_J] = &s4_pwm_j_gate.hw, 3462 + [CLKID_SARADC_SEL] = &s4_saradc_mux.hw, 3463 + [CLKID_SARADC_DIV] = &s4_saradc_div.hw, 3464 + [CLKID_SARADC] = &s4_saradc_gate.hw, 3465 + [CLKID_GEN_SEL] = &s4_gen_clk_sel.hw, 3466 + [CLKID_GEN_DIV] = &s4_gen_clk_div.hw, 3467 + [CLKID_GEN] = &s4_gen_clk.hw, 3468 + [CLKID_DDR] = &s4_ddr.hw, 3469 + [CLKID_DOS] = &s4_dos.hw, 3470 + [CLKID_ETHPHY] = &s4_ethphy.hw, 3471 + [CLKID_MALI] = &s4_mali.hw, 3472 + [CLKID_AOCPU] = &s4_aocpu.hw, 3473 + [CLKID_AUCPU] = &s4_aucpu.hw, 3474 + [CLKID_CEC] = &s4_cec.hw, 3475 + [CLKID_SDEMMC_A] = &s4_sdemmca.hw, 3476 + [CLKID_SDEMMC_B] = &s4_sdemmcb.hw, 3477 + [CLKID_NAND] = &s4_nand.hw, 3478 + [CLKID_SMARTCARD] = &s4_smartcard.hw, 3479 + [CLKID_ACODEC] = &s4_acodec.hw, 3480 + [CLKID_SPIFC] = &s4_spifc.hw, 3481 + [CLKID_MSR] = &s4_msr_clk.hw, 3482 + [CLKID_IR_CTRL] = &s4_ir_ctrl.hw, 3483 + [CLKID_AUDIO] = &s4_audio.hw, 3484 + [CLKID_ETH] = &s4_eth.hw, 3485 + [CLKID_UART_A] = &s4_uart_a.hw, 3486 + [CLKID_UART_B] = &s4_uart_b.hw, 3487 + [CLKID_UART_C] = &s4_uart_c.hw, 3488 + [CLKID_UART_D] = &s4_uart_d.hw, 3489 + [CLKID_UART_E] = &s4_uart_e.hw, 3490 + [CLKID_AIFIFO] = &s4_aififo.hw, 3491 + [CLKID_TS_DDR] = &s4_ts_ddr.hw, 3492 + [CLKID_TS_PLL] = &s4_ts_pll.hw, 3493 + [CLKID_G2D] = &s4_g2d.hw, 3494 + [CLKID_SPICC0] = &s4_spicc0.hw, 3495 + [CLKID_USB] = &s4_usb.hw, 3496 + [CLKID_I2C_M_A] = &s4_i2c_m_a.hw, 3497 + [CLKID_I2C_M_B] = &s4_i2c_m_b.hw, 3498 + [CLKID_I2C_M_C] = &s4_i2c_m_c.hw, 3499 + [CLKID_I2C_M_D] = &s4_i2c_m_d.hw, 3500 + [CLKID_I2C_M_E] = &s4_i2c_m_e.hw, 3501 + [CLKID_HDMITX_APB] = &s4_hdmitx_apb.hw, 3502 + [CLKID_I2C_S_A] = &s4_i2c_s_a.hw, 3503 + [CLKID_USB1_TO_DDR] = &s4_usb1_to_ddr.hw, 3504 + [CLKID_HDCP22] = &s4_hdcp22.hw, 3505 + [CLKID_MMC_APB] = &s4_mmc_apb.hw, 3506 + [CLKID_RSA] = &s4_rsa.hw, 3507 + [CLKID_CPU_DEBUG] = &s4_cpu_debug.hw, 3508 + [CLKID_VPU_INTR] = &s4_vpu_intr.hw, 3509 + [CLKID_DEMOD] = &s4_demod.hw, 3510 + [CLKID_SAR_ADC] = &s4_sar_adc.hw, 3511 + [CLKID_GIC] = &s4_gic.hw, 3512 + [CLKID_PWM_AB] = &s4_pwm_ab.hw, 3513 + [CLKID_PWM_CD] = &s4_pwm_cd.hw, 3514 + [CLKID_PWM_EF] = &s4_pwm_ef.hw, 3515 + [CLKID_PWM_GH] = &s4_pwm_gh.hw, 3516 + [CLKID_PWM_IJ] = &s4_pwm_ij.hw, 3517 + [CLKID_HDCP22_ESMCLK_SEL] = &s4_hdcp22_esmclk_mux.hw, 3518 + [CLKID_HDCP22_ESMCLK_DIV] = &s4_hdcp22_esmclk_div.hw, 3519 + [CLKID_HDCP22_ESMCLK] = &s4_hdcp22_esmclk_gate.hw, 3520 + [CLKID_HDCP22_SKPCLK_SEL] = &s4_hdcp22_skpclk_mux.hw, 3521 + [CLKID_HDCP22_SKPCLK_DIV] = &s4_hdcp22_skpclk_div.hw, 3522 + [CLKID_HDCP22_SKPCLK] = &s4_hdcp22_skpclk_gate.hw, 3523 + }; 3524 + 3525 + /* Convenience table to populate regmap in .probe */ 3526 + static struct clk_regmap *const s4_periphs_clk_regmaps[] = { 3527 + &s4_rtc_32k_by_oscin_clkin, 3528 + &s4_rtc_32k_by_oscin_div, 3529 + &s4_rtc_32k_by_oscin_sel, 3530 + &s4_rtc_32k_by_oscin, 3531 + &s4_rtc_clk, 3532 + &s4_sysclk_b_sel, 3533 + &s4_sysclk_b_div, 3534 + &s4_sysclk_b, 3535 + &s4_sysclk_a_sel, 3536 + &s4_sysclk_a_div, 3537 + &s4_sysclk_a, 3538 + &s4_sys_clk, 3539 + &s4_ceca_32k_clkin, 3540 + &s4_ceca_32k_div, 3541 + &s4_ceca_32k_sel_pre, 3542 + &s4_ceca_32k_sel, 3543 + &s4_ceca_32k_clkout, 3544 + &s4_cecb_32k_clkin, 3545 + &s4_cecb_32k_div, 3546 + &s4_cecb_32k_sel_pre, 3547 + &s4_cecb_32k_sel, 3548 + &s4_cecb_32k_clkout, 3549 + &s4_sc_clk_mux, 3550 + &s4_sc_clk_div, 3551 + &s4_sc_clk_gate, 3552 + &s4_12_24M_clk_gate, 3553 + &s4_12_24M_clk, 3554 + &s4_vid_pll_div, 3555 + &s4_vid_pll_sel, 3556 + &s4_vid_pll, 3557 + &s4_vclk_sel, 3558 + &s4_vclk2_sel, 3559 + &s4_vclk_input, 3560 + &s4_vclk2_input, 3561 + &s4_vclk_div, 3562 + &s4_vclk2_div, 3563 + &s4_vclk, 3564 + &s4_vclk2, 3565 + &s4_vclk_div1, 3566 + &s4_vclk_div2_en, 3567 + &s4_vclk_div4_en, 3568 + &s4_vclk_div6_en, 3569 + &s4_vclk_div12_en, 3570 + &s4_vclk2_div1, 3571 + &s4_vclk2_div2_en, 3572 + &s4_vclk2_div4_en, 3573 + &s4_vclk2_div6_en, 3574 + &s4_vclk2_div12_en, 3575 + &s4_cts_enci_sel, 3576 + &s4_cts_encp_sel, 3577 + &s4_cts_vdac_sel, 3578 + &s4_hdmi_tx_sel, 3579 + &s4_cts_enci, 3580 + &s4_cts_encp, 3581 + &s4_cts_vdac, 3582 + &s4_hdmi_tx, 3583 + &s4_hdmi_sel, 3584 + &s4_hdmi_div, 3585 + &s4_hdmi, 3586 + &s4_ts_clk_div, 3587 + &s4_ts_clk_gate, 3588 + &s4_mali_0_sel, 3589 + &s4_mali_0_div, 3590 + &s4_mali_0, 3591 + &s4_mali_1_sel, 3592 + &s4_mali_1_div, 3593 + &s4_mali_1, 3594 + &s4_mali_mux, 3595 + &s4_vdec_p0_mux, 3596 + &s4_vdec_p0_div, 3597 + &s4_vdec_p0, 3598 + &s4_vdec_p1_mux, 3599 + &s4_vdec_p1_div, 3600 + &s4_vdec_p1, 3601 + &s4_vdec_mux, 3602 + &s4_hevcf_p0_mux, 3603 + &s4_hevcf_p0_div, 3604 + &s4_hevcf_p0, 3605 + &s4_hevcf_p1_mux, 3606 + &s4_hevcf_p1_div, 3607 + &s4_hevcf_p1, 3608 + &s4_hevcf_mux, 3609 + &s4_vpu_0_sel, 3610 + &s4_vpu_0_div, 3611 + &s4_vpu_0, 3612 + &s4_vpu_1_sel, 3613 + &s4_vpu_1_div, 3614 + &s4_vpu_1, 3615 + &s4_vpu, 3616 + &s4_vpu_clkb_tmp_mux, 3617 + &s4_vpu_clkb_tmp_div, 3618 + &s4_vpu_clkb_tmp, 3619 + &s4_vpu_clkb_div, 3620 + &s4_vpu_clkb, 3621 + &s4_vpu_clkc_p0_mux, 3622 + &s4_vpu_clkc_p0_div, 3623 + &s4_vpu_clkc_p0, 3624 + &s4_vpu_clkc_p1_mux, 3625 + &s4_vpu_clkc_p1_div, 3626 + &s4_vpu_clkc_p1, 3627 + &s4_vpu_clkc_mux, 3628 + &s4_vapb_0_sel, 3629 + &s4_vapb_0_div, 3630 + &s4_vapb_0, 3631 + &s4_vapb_1_sel, 3632 + &s4_vapb_1_div, 3633 + &s4_vapb_1, 3634 + &s4_vapb, 3635 + &s4_ge2d_gate, 3636 + &s4_hdcp22_esmclk_mux, 3637 + &s4_hdcp22_esmclk_div, 3638 + &s4_hdcp22_esmclk_gate, 3639 + &s4_hdcp22_skpclk_mux, 3640 + &s4_hdcp22_skpclk_div, 3641 + &s4_hdcp22_skpclk_gate, 3642 + &s4_vdin_meas_mux, 3643 + &s4_vdin_meas_div, 3644 + &s4_vdin_meas_gate, 3645 + &s4_sd_emmc_c_clk0_sel, 3646 + &s4_sd_emmc_c_clk0_div, 3647 + &s4_sd_emmc_c_clk0, 3648 + &s4_sd_emmc_a_clk0_sel, 3649 + &s4_sd_emmc_a_clk0_div, 3650 + &s4_sd_emmc_a_clk0, 3651 + &s4_sd_emmc_b_clk0_sel, 3652 + &s4_sd_emmc_b_clk0_div, 3653 + &s4_sd_emmc_b_clk0, 3654 + &s4_spicc0_mux, 3655 + &s4_spicc0_div, 3656 + &s4_spicc0_gate, 3657 + &s4_pwm_a_mux, 3658 + &s4_pwm_a_div, 3659 + &s4_pwm_a_gate, 3660 + &s4_pwm_b_mux, 3661 + &s4_pwm_b_div, 3662 + &s4_pwm_b_gate, 3663 + &s4_pwm_c_mux, 3664 + &s4_pwm_c_div, 3665 + &s4_pwm_c_gate, 3666 + &s4_pwm_d_mux, 3667 + &s4_pwm_d_div, 3668 + &s4_pwm_d_gate, 3669 + &s4_pwm_e_mux, 3670 + &s4_pwm_e_div, 3671 + &s4_pwm_e_gate, 3672 + &s4_pwm_f_mux, 3673 + &s4_pwm_f_div, 3674 + &s4_pwm_f_gate, 3675 + &s4_pwm_g_mux, 3676 + &s4_pwm_g_div, 3677 + &s4_pwm_g_gate, 3678 + &s4_pwm_h_mux, 3679 + &s4_pwm_h_div, 3680 + &s4_pwm_h_gate, 3681 + &s4_pwm_i_mux, 3682 + &s4_pwm_i_div, 3683 + &s4_pwm_i_gate, 3684 + &s4_pwm_j_mux, 3685 + &s4_pwm_j_div, 3686 + &s4_pwm_j_gate, 3687 + &s4_saradc_mux, 3688 + &s4_saradc_div, 3689 + &s4_saradc_gate, 3690 + &s4_gen_clk_sel, 3691 + &s4_gen_clk_div, 3692 + &s4_gen_clk, 3693 + &s4_ddr, 3694 + &s4_dos, 3695 + &s4_ethphy, 3696 + &s4_mali, 3697 + &s4_aocpu, 3698 + &s4_aucpu, 3699 + &s4_cec, 3700 + &s4_sdemmca, 3701 + &s4_sdemmcb, 3702 + &s4_nand, 3703 + &s4_smartcard, 3704 + &s4_acodec, 3705 + &s4_spifc, 3706 + &s4_msr_clk, 3707 + &s4_ir_ctrl, 3708 + &s4_audio, 3709 + &s4_eth, 3710 + &s4_uart_a, 3711 + &s4_uart_b, 3712 + &s4_uart_c, 3713 + &s4_uart_d, 3714 + &s4_uart_e, 3715 + &s4_aififo, 3716 + &s4_ts_ddr, 3717 + &s4_ts_pll, 3718 + &s4_g2d, 3719 + &s4_spicc0, 3720 + &s4_usb, 3721 + &s4_i2c_m_a, 3722 + &s4_i2c_m_b, 3723 + &s4_i2c_m_c, 3724 + &s4_i2c_m_d, 3725 + &s4_i2c_m_e, 3726 + &s4_hdmitx_apb, 3727 + &s4_i2c_s_a, 3728 + &s4_usb1_to_ddr, 3729 + &s4_hdcp22, 3730 + &s4_mmc_apb, 3731 + &s4_rsa, 3732 + &s4_cpu_debug, 3733 + &s4_vpu_intr, 3734 + &s4_demod, 3735 + &s4_sar_adc, 3736 + &s4_gic, 3737 + &s4_pwm_ab, 3738 + &s4_pwm_cd, 3739 + &s4_pwm_ef, 3740 + &s4_pwm_gh, 3741 + &s4_pwm_ij, 3742 + &s4_demod_core_clk_mux, 3743 + &s4_demod_core_clk_div, 3744 + &s4_demod_core_clk_gate, 3745 + &s4_adc_extclk_in_mux, 3746 + &s4_adc_extclk_in_div, 3747 + &s4_adc_extclk_in_gate, 3748 + }; 3749 + 3750 + static struct regmap_config clkc_regmap_config = { 3751 + .reg_bits = 32, 3752 + .val_bits = 32, 3753 + .reg_stride = 4, 3754 + }; 3755 + 3756 + static struct meson_clk_hw_data s4_periphs_clks = { 3757 + .hws = s4_periphs_hw_clks, 3758 + .num = ARRAY_SIZE(s4_periphs_hw_clks), 3759 + }; 3760 + 3761 + static int meson_s4_periphs_probe(struct platform_device *pdev) 3762 + { 3763 + struct device *dev = &pdev->dev; 3764 + struct regmap *regmap; 3765 + void __iomem *base; 3766 + int ret, i; 3767 + 3768 + base = devm_platform_ioremap_resource(pdev, 0); 3769 + if (IS_ERR(base)) 3770 + return dev_err_probe(dev, PTR_ERR(base), 3771 + "can't ioremap resource\n"); 3772 + 3773 + regmap = devm_regmap_init_mmio(dev, base, &clkc_regmap_config); 3774 + if (IS_ERR(regmap)) 3775 + return dev_err_probe(dev, PTR_ERR(regmap), 3776 + "can't init regmap mmio region\n"); 3777 + 3778 + /* Populate regmap for the regmap backed clocks */ 3779 + for (i = 0; i < ARRAY_SIZE(s4_periphs_clk_regmaps); i++) 3780 + s4_periphs_clk_regmaps[i]->map = regmap; 3781 + 3782 + for (i = 0; i < s4_periphs_clks.num; i++) { 3783 + /* array might be sparse */ 3784 + if (!s4_periphs_clks.hws[i]) 3785 + continue; 3786 + 3787 + ret = devm_clk_hw_register(dev, s4_periphs_clks.hws[i]); 3788 + if (ret) 3789 + return dev_err_probe(dev, ret, 3790 + "clock[%d] registration failed\n", i); 3791 + } 3792 + 3793 + return devm_of_clk_add_hw_provider(dev, meson_clk_hw_get, &s4_periphs_clks); 3794 + } 3795 + 3796 + static const struct of_device_id clkc_match_table[] = { 3797 + { 3798 + .compatible = "amlogic,s4-peripherals-clkc", 3799 + }, 3800 + {} 3801 + }; 3802 + 3803 + static struct platform_driver s4_driver = { 3804 + .probe = meson_s4_periphs_probe, 3805 + .driver = { 3806 + .name = "s4-periphs-clkc", 3807 + .of_match_table = clkc_match_table, 3808 + }, 3809 + }; 3810 + 3811 + module_platform_driver(s4_driver); 3812 + MODULE_AUTHOR("Yu Tu <yu.tu@amlogic.com>"); 3813 + MODULE_LICENSE("GPL");
+56
drivers/clk/meson/s4-peripherals.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0-only OR MIT) */ 2 + /* 3 + * Copyright (c) 2022-2023 Amlogic, inc. All rights reserved 4 + * Author: Yu Tu <yu.tu@amlogic.com> 5 + */ 6 + 7 + #ifndef __MESON_S4_PERIPHERALS_H__ 8 + #define __MESON_S4_PERIPHERALS_H__ 9 + 10 + #define CLKCTRL_RTC_BY_OSCIN_CTRL0 0x008 11 + #define CLKCTRL_RTC_BY_OSCIN_CTRL1 0x00c 12 + #define CLKCTRL_RTC_CTRL 0x010 13 + #define CLKCTRL_SYS_CLK_CTRL0 0x040 14 + #define CLKCTRL_SYS_CLK_EN0_REG0 0x044 15 + #define CLKCTRL_SYS_CLK_EN0_REG1 0x048 16 + #define CLKCTRL_SYS_CLK_EN0_REG2 0x04c 17 + #define CLKCTRL_SYS_CLK_EN0_REG3 0x050 18 + #define CLKCTRL_CECA_CTRL0 0x088 19 + #define CLKCTRL_CECA_CTRL1 0x08c 20 + #define CLKCTRL_CECB_CTRL0 0x090 21 + #define CLKCTRL_CECB_CTRL1 0x094 22 + #define CLKCTRL_SC_CLK_CTRL 0x098 23 + #define CLKCTRL_CLK12_24_CTRL 0x0a8 24 + #define CLKCTRL_VID_CLK_CTRL 0x0c0 25 + #define CLKCTRL_VID_CLK_CTRL2 0x0c4 26 + #define CLKCTRL_VID_CLK_DIV 0x0c8 27 + #define CLKCTRL_VIID_CLK_DIV 0x0cc 28 + #define CLKCTRL_VIID_CLK_CTRL 0x0d0 29 + #define CLKCTRL_HDMI_CLK_CTRL 0x0e0 30 + #define CLKCTRL_VID_PLL_CLK_DIV 0x0e4 31 + #define CLKCTRL_VPU_CLK_CTRL 0x0e8 32 + #define CLKCTRL_VPU_CLKB_CTRL 0x0ec 33 + #define CLKCTRL_VPU_CLKC_CTRL 0x0f0 34 + #define CLKCTRL_VID_LOCK_CLK_CTRL 0x0f4 35 + #define CLKCTRL_VDIN_MEAS_CLK_CTRL 0x0f8 36 + #define CLKCTRL_VAPBCLK_CTRL 0x0fc 37 + #define CLKCTRL_HDCP22_CTRL 0x100 38 + #define CLKCTRL_VDEC_CLK_CTRL 0x140 39 + #define CLKCTRL_VDEC2_CLK_CTRL 0x144 40 + #define CLKCTRL_VDEC3_CLK_CTRL 0x148 41 + #define CLKCTRL_VDEC4_CLK_CTRL 0x14c 42 + #define CLKCTRL_TS_CLK_CTRL 0x158 43 + #define CLKCTRL_MALI_CLK_CTRL 0x15c 44 + #define CLKCTRL_NAND_CLK_CTRL 0x168 45 + #define CLKCTRL_SD_EMMC_CLK_CTRL 0x16c 46 + #define CLKCTRL_SPICC_CLK_CTRL 0x174 47 + #define CLKCTRL_GEN_CLK_CTRL 0x178 48 + #define CLKCTRL_SAR_CLK_CTRL 0x17c 49 + #define CLKCTRL_PWM_CLK_AB_CTRL 0x180 50 + #define CLKCTRL_PWM_CLK_CD_CTRL 0x184 51 + #define CLKCTRL_PWM_CLK_EF_CTRL 0x188 52 + #define CLKCTRL_PWM_CLK_GH_CTRL 0x18c 53 + #define CLKCTRL_PWM_CLK_IJ_CTRL 0x190 54 + #define CLKCTRL_DEMOD_CLK_CTRL 0x200 55 + 56 + #endif /* __MESON_S4_PERIPHERALS_H__ */