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

clk: qcom: camcc-sc8280xp: Add sc8280xp CAMCC

Add the sc8280xp CAMCC driver which follows the sdm845 CAMCC lineage
with additional CCI and IFE blocks and more granular clock parentage.

Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Link: https://lore.kernel.org/r/20231026105345.3376-4-bryan.odonoghue@linaro.org
Signed-off-by: Bjorn Andersson <andersson@kernel.org>

authored by

Bryan O'Donoghue and committed by
Bjorn Andersson
ff93872a 3be492cf

+3054
+9
drivers/clk/qcom/Kconfig
··· 427 427 Say Y if you want to support camera devices and functionality such as 428 428 capturing pictures. 429 429 430 + config SC_CAMCC_8280XP 431 + tristate "SC8280XP Camera Clock Controller" 432 + select SC_GCC_8280XP 433 + help 434 + Support for the camera clock controller on Qualcomm Technologies, Inc 435 + SC8280XP devices. 436 + Say Y if you want to support camera devices and functionality such as 437 + capturing pictures. 438 + 430 439 config SC_DISPCC_7180 431 440 tristate "SC7180 Display Clock Controller" 432 441 depends on ARM64 || COMPILE_TEST
+1
drivers/clk/qcom/Makefile
··· 68 68 obj-$(CONFIG_QDU_GCC_1000) += gcc-qdu1000.o 69 69 obj-$(CONFIG_SC_CAMCC_7180) += camcc-sc7180.o 70 70 obj-$(CONFIG_SC_CAMCC_7280) += camcc-sc7280.o 71 + obj-$(CONFIG_SC_CAMCC_8280XP) += camcc-sc8280xp.o 71 72 obj-$(CONFIG_SC_DISPCC_7180) += dispcc-sc7180.o 72 73 obj-$(CONFIG_SC_DISPCC_7280) += dispcc-sc7280.o 73 74 obj-$(CONFIG_SC_DISPCC_8280XP) += dispcc-sc8280xp.o
+3044
drivers/clk/qcom/camcc-sc8280xp.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Copyright (c) 2021, The Linux Foundation. All rights reserved. 4 + * Copyright (c) 2023, Linaro Ltd. 5 + */ 6 + 7 + #include <linux/clk-provider.h> 8 + #include <linux/mod_devicetable.h> 9 + #include <linux/module.h> 10 + #include <linux/platform_device.h> 11 + #include <linux/pm_runtime.h> 12 + #include <linux/regmap.h> 13 + 14 + #include <dt-bindings/clock/qcom,sc8280xp-camcc.h> 15 + 16 + #include "clk-alpha-pll.h" 17 + #include "clk-branch.h" 18 + #include "clk-rcg.h" 19 + #include "clk-regmap.h" 20 + #include "common.h" 21 + #include "gdsc.h" 22 + #include "reset.h" 23 + 24 + enum { 25 + DT_IFACE, 26 + DT_BI_TCXO, 27 + DT_BI_TCXO_AO, 28 + DT_SLEEP_CLK, 29 + }; 30 + 31 + enum { 32 + P_BI_TCXO, 33 + P_CAMCC_PLL0_OUT_EVEN, 34 + P_CAMCC_PLL0_OUT_MAIN, 35 + P_CAMCC_PLL0_OUT_ODD, 36 + P_CAMCC_PLL1_OUT_EVEN, 37 + P_CAMCC_PLL2_OUT_AUX, 38 + P_CAMCC_PLL2_OUT_EARLY, 39 + P_CAMCC_PLL3_OUT_EVEN, 40 + P_CAMCC_PLL4_OUT_EVEN, 41 + P_CAMCC_PLL5_OUT_EVEN, 42 + P_CAMCC_PLL6_OUT_EVEN, 43 + P_CAMCC_PLL7_OUT_EVEN, 44 + P_CAMCC_PLL7_OUT_ODD, 45 + P_SLEEP_CLK, 46 + }; 47 + 48 + static struct pll_vco lucid_vco[] = { 49 + { 249600000, 1800000000, 0 }, 50 + }; 51 + 52 + static struct pll_vco zonda_vco[] = { 53 + { 595200000, 3600000000, 0 }, 54 + }; 55 + 56 + static struct alpha_pll_config camcc_pll0_config = { 57 + .l = 0x3e, 58 + .alpha = 0x8000, 59 + .config_ctl_val = 0x20485699, 60 + .config_ctl_hi_val = 0x00002261, 61 + .config_ctl_hi1_val = 0x2a9a699c, 62 + .test_ctl_val = 0x00000000, 63 + .test_ctl_hi_val = 0x00000000, 64 + .test_ctl_hi1_val = 0x01800000, 65 + .user_ctl_val = 0x00003100, 66 + .user_ctl_hi_val = 0x00000805, 67 + .user_ctl_hi1_val = 0x00000000, 68 + }; 69 + 70 + static struct clk_alpha_pll camcc_pll0 = { 71 + .offset = 0x0, 72 + .vco_table = lucid_vco, 73 + .num_vco = ARRAY_SIZE(lucid_vco), 74 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID], 75 + .clkr = { 76 + .hw.init = &(struct clk_init_data){ 77 + .name = "camcc_pll0", 78 + .parent_data = &(const struct clk_parent_data){ 79 + .index = DT_BI_TCXO, 80 + }, 81 + .num_parents = 1, 82 + .ops = &clk_alpha_pll_lucid_5lpe_ops, 83 + }, 84 + }, 85 + }; 86 + 87 + static const struct clk_div_table post_div_table_camcc_pll0_out_even[] = { 88 + { 0x1, 2 }, 89 + }; 90 + 91 + static struct clk_alpha_pll_postdiv camcc_pll0_out_even = { 92 + .offset = 0x0, 93 + .post_div_shift = 8, 94 + .post_div_table = post_div_table_camcc_pll0_out_even, 95 + .num_post_div = ARRAY_SIZE(post_div_table_camcc_pll0_out_even), 96 + .width = 4, 97 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID], 98 + .clkr.hw.init = &(struct clk_init_data){ 99 + .name = "camcc_pll0_out_even", 100 + .parent_hws = (const struct clk_hw*[]){ 101 + &camcc_pll0.clkr.hw, 102 + }, 103 + .num_parents = 1, 104 + .flags = CLK_SET_RATE_PARENT, 105 + .ops = &clk_alpha_pll_postdiv_lucid_ops, 106 + }, 107 + }; 108 + 109 + static const struct clk_div_table post_div_table_camcc_pll0_out_odd[] = { 110 + { 0x3, 3 }, 111 + }; 112 + 113 + static struct clk_alpha_pll_postdiv camcc_pll0_out_odd = { 114 + .offset = 0x0, 115 + .post_div_shift = 12, 116 + .post_div_table = post_div_table_camcc_pll0_out_odd, 117 + .num_post_div = ARRAY_SIZE(post_div_table_camcc_pll0_out_odd), 118 + .width = 4, 119 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID], 120 + .clkr.hw.init = &(struct clk_init_data){ 121 + .name = "camcc_pll0_out_odd", 122 + .parent_hws = (const struct clk_hw*[]){ 123 + &camcc_pll0.clkr.hw, 124 + }, 125 + .num_parents = 1, 126 + .flags = CLK_SET_RATE_PARENT, 127 + .ops = &clk_alpha_pll_postdiv_lucid_ops, 128 + }, 129 + }; 130 + 131 + static struct alpha_pll_config camcc_pll1_config = { 132 + .l = 0x21, 133 + .alpha = 0x5555, 134 + .config_ctl_val = 0x20485699, 135 + .config_ctl_hi_val = 0x00002261, 136 + .config_ctl_hi1_val = 0x2a9a699c, 137 + .test_ctl_val = 0x00000000, 138 + .test_ctl_hi_val = 0x00000000, 139 + .test_ctl_hi1_val = 0x01800000, 140 + .user_ctl_val = 0x00000100, 141 + .user_ctl_hi_val = 0x00000805, 142 + .user_ctl_hi1_val = 0x00000000, 143 + }; 144 + 145 + static struct clk_alpha_pll camcc_pll1 = { 146 + .offset = 0x1000, 147 + .vco_table = lucid_vco, 148 + .num_vco = ARRAY_SIZE(lucid_vco), 149 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID], 150 + .clkr = { 151 + .hw.init = &(struct clk_init_data){ 152 + .name = "camcc_pll1", 153 + .parent_data = &(const struct clk_parent_data){ 154 + .index = DT_BI_TCXO, 155 + }, 156 + .num_parents = 1, 157 + .ops = &clk_alpha_pll_lucid_5lpe_ops, 158 + }, 159 + }, 160 + }; 161 + 162 + static const struct clk_div_table post_div_table_camcc_pll1_out_even[] = { 163 + { 0x1, 2 }, 164 + }; 165 + 166 + static struct clk_alpha_pll_postdiv camcc_pll1_out_even = { 167 + .offset = 0x1000, 168 + .post_div_shift = 8, 169 + .post_div_table = post_div_table_camcc_pll1_out_even, 170 + .num_post_div = ARRAY_SIZE(post_div_table_camcc_pll1_out_even), 171 + .width = 4, 172 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID], 173 + .clkr.hw.init = &(struct clk_init_data){ 174 + .name = "camcc_pll1_out_even", 175 + .parent_hws = (const struct clk_hw*[]){ 176 + &camcc_pll1.clkr.hw, 177 + }, 178 + .num_parents = 1, 179 + .flags = CLK_SET_RATE_PARENT, 180 + .ops = &clk_alpha_pll_postdiv_lucid_ops, 181 + }, 182 + }; 183 + 184 + static struct alpha_pll_config camcc_pll2_config = { 185 + .l = 0x32, 186 + .alpha = 0x0, 187 + .config_ctl_val = 0x08200800, 188 + .config_ctl_hi_val = 0x05028011, 189 + .config_ctl_hi1_val = 0x08000000, 190 + }; 191 + 192 + static struct clk_alpha_pll camcc_pll2 = { 193 + .offset = 0x2000, 194 + .vco_table = zonda_vco, 195 + .num_vco = ARRAY_SIZE(zonda_vco), 196 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_ZONDA], 197 + .clkr = { 198 + .hw.init = &(struct clk_init_data){ 199 + .name = "camcc_pll2", 200 + .parent_data = &(const struct clk_parent_data){ 201 + .index = DT_BI_TCXO, 202 + }, 203 + .num_parents = 1, 204 + .ops = &clk_alpha_pll_zonda_ops, 205 + }, 206 + }, 207 + }; 208 + 209 + static struct alpha_pll_config camcc_pll3_config = { 210 + .l = 0x29, 211 + .alpha = 0xaaaa, 212 + .config_ctl_val = 0x20485699, 213 + .config_ctl_hi_val = 0x00002261, 214 + .config_ctl_hi1_val = 0x2a9a699c, 215 + .test_ctl_val = 0x00000000, 216 + .test_ctl_hi_val = 0x00000000, 217 + .test_ctl_hi1_val = 0x01800000, 218 + .user_ctl_val = 0x00000100, 219 + .user_ctl_hi_val = 0x00000805, 220 + .user_ctl_hi1_val = 0x00000000, 221 + }; 222 + 223 + static struct clk_alpha_pll camcc_pll3 = { 224 + .offset = 0x3000, 225 + .vco_table = lucid_vco, 226 + .num_vco = ARRAY_SIZE(lucid_vco), 227 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID], 228 + .clkr = { 229 + .hw.init = &(struct clk_init_data){ 230 + .name = "camcc_pll3", 231 + .parent_data = &(const struct clk_parent_data){ 232 + .index = DT_BI_TCXO, 233 + }, 234 + .num_parents = 1, 235 + .ops = &clk_alpha_pll_lucid_5lpe_ops, 236 + }, 237 + }, 238 + }; 239 + 240 + static const struct clk_div_table post_div_table_camcc_pll3_out_even[] = { 241 + { 0x1, 2 }, 242 + }; 243 + 244 + static struct clk_alpha_pll_postdiv camcc_pll3_out_even = { 245 + .offset = 0x3000, 246 + .post_div_shift = 8, 247 + .post_div_table = post_div_table_camcc_pll3_out_even, 248 + .num_post_div = ARRAY_SIZE(post_div_table_camcc_pll3_out_even), 249 + .width = 4, 250 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID], 251 + .clkr.hw.init = &(struct clk_init_data){ 252 + .name = "camcc_pll3_out_even", 253 + .parent_hws = (const struct clk_hw*[]){ 254 + &camcc_pll3.clkr.hw, 255 + }, 256 + .num_parents = 1, 257 + .flags = CLK_SET_RATE_PARENT, 258 + .ops = &clk_alpha_pll_postdiv_lucid_ops, 259 + }, 260 + }; 261 + 262 + static struct alpha_pll_config camcc_pll4_config = { 263 + .l = 0x29, 264 + .alpha = 0xaaaa, 265 + .config_ctl_val = 0x20485699, 266 + .config_ctl_hi_val = 0x00002261, 267 + .config_ctl_hi1_val = 0x2a9a699c, 268 + .test_ctl_val = 0x00000000, 269 + .test_ctl_hi_val = 0x00000000, 270 + .test_ctl_hi1_val = 0x01800000, 271 + .user_ctl_val = 0x00000100, 272 + .user_ctl_hi_val = 0x00000805, 273 + .user_ctl_hi1_val = 0x00000000, 274 + }; 275 + 276 + static struct clk_alpha_pll camcc_pll4 = { 277 + .offset = 0x4000, 278 + .vco_table = lucid_vco, 279 + .num_vco = ARRAY_SIZE(lucid_vco), 280 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID], 281 + .clkr = { 282 + .hw.init = &(struct clk_init_data){ 283 + .name = "camcc_pll4", 284 + .parent_data = &(const struct clk_parent_data){ 285 + .index = DT_BI_TCXO, 286 + }, 287 + .num_parents = 1, 288 + .ops = &clk_alpha_pll_lucid_5lpe_ops, 289 + }, 290 + }, 291 + }; 292 + 293 + static const struct clk_div_table post_div_table_camcc_pll4_out_even[] = { 294 + { 0x1, 2 }, 295 + }; 296 + 297 + static struct clk_alpha_pll_postdiv camcc_pll4_out_even = { 298 + .offset = 0x4000, 299 + .post_div_shift = 8, 300 + .post_div_table = post_div_table_camcc_pll4_out_even, 301 + .num_post_div = ARRAY_SIZE(post_div_table_camcc_pll4_out_even), 302 + .width = 4, 303 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID], 304 + .clkr.hw.init = &(struct clk_init_data){ 305 + .name = "camcc_pll4_out_even", 306 + .parent_hws = (const struct clk_hw*[]){ 307 + &camcc_pll4.clkr.hw, 308 + }, 309 + .num_parents = 1, 310 + .flags = CLK_SET_RATE_PARENT, 311 + .ops = &clk_alpha_pll_postdiv_lucid_ops, 312 + }, 313 + }; 314 + 315 + static struct alpha_pll_config camcc_pll5_config = { 316 + .l = 0x29, 317 + .alpha = 0xaaaa, 318 + .config_ctl_val = 0x20485699, 319 + .config_ctl_hi_val = 0x00002261, 320 + .config_ctl_hi1_val = 0x2a9a699c, 321 + .test_ctl_val = 0x00000000, 322 + .test_ctl_hi_val = 0x00000000, 323 + .test_ctl_hi1_val = 0x01800000, 324 + .user_ctl_val = 0x00000100, 325 + .user_ctl_hi_val = 0x00000805, 326 + .user_ctl_hi1_val = 0x00000000, 327 + }; 328 + 329 + static struct clk_alpha_pll camcc_pll5 = { 330 + .offset = 0x10000, 331 + .vco_table = lucid_vco, 332 + .num_vco = ARRAY_SIZE(lucid_vco), 333 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID], 334 + .clkr = { 335 + .hw.init = &(struct clk_init_data){ 336 + .name = "camcc_pll5", 337 + .parent_data = &(const struct clk_parent_data){ 338 + .index = DT_BI_TCXO, 339 + }, 340 + .num_parents = 1, 341 + .ops = &clk_alpha_pll_lucid_5lpe_ops, 342 + }, 343 + }, 344 + }; 345 + 346 + static const struct clk_div_table post_div_table_camcc_pll5_out_even[] = { 347 + { 0x1, 2 }, 348 + }; 349 + 350 + static struct clk_alpha_pll_postdiv camcc_pll5_out_even = { 351 + .offset = 0x10000, 352 + .post_div_shift = 8, 353 + .post_div_table = post_div_table_camcc_pll5_out_even, 354 + .num_post_div = ARRAY_SIZE(post_div_table_camcc_pll5_out_even), 355 + .width = 4, 356 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID], 357 + .clkr.hw.init = &(struct clk_init_data){ 358 + .name = "camcc_pll5_out_even", 359 + .parent_hws = (const struct clk_hw*[]){ 360 + &camcc_pll5.clkr.hw, 361 + }, 362 + .num_parents = 1, 363 + .flags = CLK_SET_RATE_PARENT, 364 + .ops = &clk_alpha_pll_postdiv_lucid_ops, 365 + }, 366 + }; 367 + 368 + static struct alpha_pll_config camcc_pll6_config = { 369 + .l = 0x29, 370 + .alpha = 0xaaaa, 371 + .config_ctl_val = 0x20486699, 372 + .config_ctl_hi_val = 0x00002261, 373 + .config_ctl_hi1_val = 0x2a9a699c, 374 + .test_ctl_val = 0x00000000, 375 + .test_ctl_hi_val = 0x00000000, 376 + .test_ctl_hi1_val = 0x01800000, 377 + .user_ctl_val = 0x00000100, 378 + .user_ctl_hi_val = 0x00000805, 379 + .user_ctl_hi1_val = 0x00000000, 380 + }; 381 + 382 + static struct clk_alpha_pll camcc_pll6 = { 383 + .offset = 0x11000, 384 + .vco_table = lucid_vco, 385 + .num_vco = ARRAY_SIZE(lucid_vco), 386 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID], 387 + .clkr = { 388 + .hw.init = &(struct clk_init_data){ 389 + .name = "camcc_pll6", 390 + .parent_data = &(const struct clk_parent_data){ 391 + .index = DT_BI_TCXO, 392 + }, 393 + .num_parents = 1, 394 + .ops = &clk_alpha_pll_lucid_5lpe_ops, 395 + }, 396 + }, 397 + }; 398 + 399 + static const struct clk_div_table post_div_table_camcc_pll6_out_even[] = { 400 + { 0x1, 2 }, 401 + }; 402 + 403 + static struct clk_alpha_pll_postdiv camcc_pll6_out_even = { 404 + .offset = 0x11000, 405 + .post_div_shift = 8, 406 + .post_div_table = post_div_table_camcc_pll6_out_even, 407 + .num_post_div = ARRAY_SIZE(post_div_table_camcc_pll6_out_even), 408 + .width = 4, 409 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID], 410 + .clkr.hw.init = &(struct clk_init_data){ 411 + .name = "camcc_pll6_out_even", 412 + .parent_hws = (const struct clk_hw*[]){ 413 + &camcc_pll6.clkr.hw, 414 + }, 415 + .num_parents = 1, 416 + .flags = CLK_SET_RATE_PARENT, 417 + .ops = &clk_alpha_pll_postdiv_lucid_ops, 418 + }, 419 + }; 420 + 421 + static struct alpha_pll_config camcc_pll7_config = { 422 + .l = 0x32, 423 + .alpha = 0x0, 424 + .config_ctl_val = 0x20485699, 425 + .config_ctl_hi_val = 0x00002261, 426 + .config_ctl_hi1_val = 0x2a9a699c, 427 + .test_ctl_val = 0x00000000, 428 + .test_ctl_hi_val = 0x00000000, 429 + .test_ctl_hi1_val = 0x01800000, 430 + .user_ctl_val = 0x00003100, 431 + .user_ctl_hi_val = 0x00000805, 432 + .user_ctl_hi1_val = 0x00000000, 433 + }; 434 + 435 + static struct clk_alpha_pll camcc_pll7 = { 436 + .offset = 0x12000, 437 + .vco_table = lucid_vco, 438 + .num_vco = ARRAY_SIZE(lucid_vco), 439 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID], 440 + .clkr = { 441 + .hw.init = &(struct clk_init_data){ 442 + .name = "camcc_pll7", 443 + .parent_data = &(const struct clk_parent_data){ 444 + .index = DT_BI_TCXO, 445 + }, 446 + .num_parents = 1, 447 + .ops = &clk_alpha_pll_lucid_5lpe_ops, 448 + }, 449 + }, 450 + }; 451 + 452 + static const struct clk_div_table post_div_table_camcc_pll7_out_even[] = { 453 + { 0x1, 2 }, 454 + }; 455 + 456 + static struct clk_alpha_pll_postdiv camcc_pll7_out_even = { 457 + .offset = 0x12000, 458 + .post_div_shift = 8, 459 + .post_div_table = post_div_table_camcc_pll7_out_even, 460 + .num_post_div = ARRAY_SIZE(post_div_table_camcc_pll7_out_even), 461 + .width = 4, 462 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID], 463 + .clkr.hw.init = &(struct clk_init_data){ 464 + .name = "camcc_pll7_out_even", 465 + .parent_hws = (const struct clk_hw*[]){ 466 + &camcc_pll7.clkr.hw, 467 + }, 468 + .num_parents = 1, 469 + .flags = CLK_SET_RATE_PARENT, 470 + .ops = &clk_alpha_pll_postdiv_lucid_ops, 471 + }, 472 + }; 473 + 474 + static const struct clk_div_table post_div_table_camcc_pll7_out_odd[] = { 475 + { 0x3, 3 }, 476 + }; 477 + 478 + static struct clk_alpha_pll_postdiv camcc_pll7_out_odd = { 479 + .offset = 0x12000, 480 + .post_div_shift = 12, 481 + .post_div_table = post_div_table_camcc_pll7_out_odd, 482 + .num_post_div = ARRAY_SIZE(post_div_table_camcc_pll7_out_odd), 483 + .width = 4, 484 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID], 485 + .clkr.hw.init = &(struct clk_init_data){ 486 + .name = "camcc_pll7_out_odd", 487 + .parent_hws = (const struct clk_hw*[]){ 488 + &camcc_pll7.clkr.hw, 489 + }, 490 + .num_parents = 1, 491 + .flags = CLK_SET_RATE_PARENT, 492 + .ops = &clk_alpha_pll_postdiv_lucid_ops, 493 + }, 494 + }; 495 + 496 + static const struct parent_map camcc_parent_map_0[] = { 497 + { P_BI_TCXO, 0 }, 498 + { P_CAMCC_PLL0_OUT_MAIN, 1 }, 499 + { P_CAMCC_PLL0_OUT_EVEN, 2 }, 500 + { P_CAMCC_PLL0_OUT_ODD, 3 }, 501 + { P_CAMCC_PLL7_OUT_EVEN, 5 }, 502 + }; 503 + 504 + static const struct clk_parent_data camcc_parent_data_0[] = { 505 + { .index = DT_BI_TCXO }, 506 + { .hw = &camcc_pll0.clkr.hw }, 507 + { .hw = &camcc_pll0_out_even.clkr.hw }, 508 + { .hw = &camcc_pll0_out_odd.clkr.hw }, 509 + { .hw = &camcc_pll7_out_even.clkr.hw }, 510 + }; 511 + 512 + static const struct parent_map camcc_parent_map_1[] = { 513 + { P_BI_TCXO, 0 }, 514 + { P_CAMCC_PLL2_OUT_AUX, 2 }, 515 + { P_CAMCC_PLL2_OUT_EARLY, 5 }, 516 + }; 517 + 518 + static const struct clk_parent_data camcc_parent_data_1[] = { 519 + { .index = DT_BI_TCXO }, 520 + { .hw = &camcc_pll2.clkr.hw }, 521 + { .hw = &camcc_pll2.clkr.hw }, 522 + }; 523 + 524 + static const struct parent_map camcc_parent_map_2[] = { 525 + { P_BI_TCXO, 0 }, 526 + { P_CAMCC_PLL0_OUT_MAIN, 1 }, 527 + { P_CAMCC_PLL0_OUT_EVEN, 2 }, 528 + { P_CAMCC_PLL0_OUT_ODD, 3 }, 529 + { P_CAMCC_PLL7_OUT_ODD, 4 }, 530 + { P_CAMCC_PLL7_OUT_EVEN, 5 }, 531 + }; 532 + 533 + static const struct clk_parent_data camcc_parent_data_2[] = { 534 + { .index = DT_BI_TCXO }, 535 + { .hw = &camcc_pll0.clkr.hw }, 536 + { .hw = &camcc_pll0_out_even.clkr.hw }, 537 + { .hw = &camcc_pll0_out_odd.clkr.hw }, 538 + { .hw = &camcc_pll7_out_odd.clkr.hw }, 539 + { .hw = &camcc_pll7_out_even.clkr.hw }, 540 + }; 541 + 542 + static const struct parent_map camcc_parent_map_3[] = { 543 + { P_BI_TCXO, 0 }, 544 + { P_CAMCC_PLL0_OUT_MAIN, 1 }, 545 + { P_CAMCC_PLL0_OUT_EVEN, 2 }, 546 + { P_CAMCC_PLL0_OUT_ODD, 3 }, 547 + { P_CAMCC_PLL7_OUT_EVEN, 5 }, 548 + { P_CAMCC_PLL3_OUT_EVEN, 6 }, 549 + }; 550 + 551 + static const struct clk_parent_data camcc_parent_data_3[] = { 552 + { .index = DT_BI_TCXO }, 553 + { .hw = &camcc_pll0.clkr.hw }, 554 + { .hw = &camcc_pll0_out_even.clkr.hw }, 555 + { .hw = &camcc_pll0_out_odd.clkr.hw }, 556 + { .hw = &camcc_pll7_out_even.clkr.hw }, 557 + { .hw = &camcc_pll3_out_even.clkr.hw }, 558 + }; 559 + 560 + static const struct parent_map camcc_parent_map_4[] = { 561 + { P_BI_TCXO, 0 }, 562 + { P_CAMCC_PLL3_OUT_EVEN, 6 }, 563 + }; 564 + 565 + static const struct clk_parent_data camcc_parent_data_4[] = { 566 + { .index = DT_BI_TCXO }, 567 + { .hw = &camcc_pll3_out_even.clkr.hw }, 568 + }; 569 + 570 + static const struct parent_map camcc_parent_map_5[] = { 571 + { P_BI_TCXO, 0 }, 572 + { P_CAMCC_PLL4_OUT_EVEN, 6 }, 573 + }; 574 + 575 + static const struct clk_parent_data camcc_parent_data_5[] = { 576 + { .index = DT_BI_TCXO }, 577 + { .hw = &camcc_pll4_out_even.clkr.hw }, 578 + }; 579 + 580 + static const struct parent_map camcc_parent_map_6[] = { 581 + { P_BI_TCXO, 0 }, 582 + { P_CAMCC_PLL5_OUT_EVEN, 6 }, 583 + }; 584 + 585 + static const struct clk_parent_data camcc_parent_data_6[] = { 586 + { .index = DT_BI_TCXO }, 587 + { .hw = &camcc_pll5_out_even.clkr.hw }, 588 + }; 589 + 590 + static const struct parent_map camcc_parent_map_7[] = { 591 + { P_BI_TCXO, 0 }, 592 + { P_CAMCC_PLL6_OUT_EVEN, 6 }, 593 + }; 594 + 595 + static const struct clk_parent_data camcc_parent_data_7[] = { 596 + { .index = DT_BI_TCXO }, 597 + { .hw = &camcc_pll6_out_even.clkr.hw }, 598 + }; 599 + 600 + static const struct parent_map camcc_parent_map_8[] = { 601 + { P_BI_TCXO, 0 }, 602 + { P_CAMCC_PLL1_OUT_EVEN, 4 }, 603 + }; 604 + 605 + static const struct clk_parent_data camcc_parent_data_8[] = { 606 + { .index = DT_BI_TCXO }, 607 + { .hw = &camcc_pll1_out_even.clkr.hw }, 608 + }; 609 + 610 + static const struct parent_map camcc_parent_map_9[] = { 611 + { P_SLEEP_CLK, 0 }, 612 + }; 613 + 614 + static const struct clk_parent_data camcc_parent_data_9[] = { 615 + { .fw_name = "sleep_clk" }, 616 + }; 617 + 618 + static const struct parent_map camcc_parent_map_10[] = { 619 + { P_BI_TCXO, 0 }, 620 + }; 621 + 622 + static const struct clk_parent_data camcc_parent_data_10_ao[] = { 623 + { .fw_name = "bi_tcxo_ao" }, 624 + }; 625 + 626 + static const struct freq_tbl ftbl_camcc_bps_clk_src[] = { 627 + F(19200000, P_BI_TCXO, 1, 0, 0), 628 + F(200000000, P_CAMCC_PLL0_OUT_ODD, 2, 0, 0), 629 + F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0), 630 + F(480000000, P_CAMCC_PLL7_OUT_EVEN, 1, 0, 0), 631 + F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0), 632 + F(760000000, P_CAMCC_PLL3_OUT_EVEN, 1, 0, 0), 633 + }; 634 + 635 + static struct clk_rcg2 camcc_bps_clk_src = { 636 + .cmd_rcgr = 0x7010, 637 + .mnd_width = 0, 638 + .hid_width = 5, 639 + .parent_map = camcc_parent_map_3, 640 + .freq_tbl = ftbl_camcc_bps_clk_src, 641 + .clkr.hw.init = &(struct clk_init_data){ 642 + .name = "camcc_bps_clk_src", 643 + .parent_data = camcc_parent_data_3, 644 + .num_parents = ARRAY_SIZE(camcc_parent_data_3), 645 + .flags = CLK_SET_RATE_PARENT, 646 + .ops = &clk_rcg2_shared_ops, 647 + }, 648 + }; 649 + 650 + static const struct freq_tbl ftbl_camcc_camnoc_axi_clk_src[] = { 651 + F(19200000, P_BI_TCXO, 1, 0, 0), 652 + F(150000000, P_CAMCC_PLL0_OUT_EVEN, 4, 0, 0), 653 + F(266666667, P_CAMCC_PLL0_OUT_ODD, 1.5, 0, 0), 654 + F(320000000, P_CAMCC_PLL7_OUT_ODD, 1, 0, 0), 655 + F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0), 656 + F(480000000, P_CAMCC_PLL7_OUT_EVEN, 1, 0, 0), 657 + }; 658 + 659 + static struct clk_rcg2 camcc_camnoc_axi_clk_src = { 660 + .cmd_rcgr = 0xc170, 661 + .mnd_width = 0, 662 + .hid_width = 5, 663 + .parent_map = camcc_parent_map_2, 664 + .freq_tbl = ftbl_camcc_camnoc_axi_clk_src, 665 + .clkr.hw.init = &(struct clk_init_data){ 666 + .name = "camcc_camnoc_axi_clk_src", 667 + .parent_data = camcc_parent_data_2, 668 + .num_parents = ARRAY_SIZE(camcc_parent_data_2), 669 + .ops = &clk_rcg2_ops, 670 + }, 671 + }; 672 + 673 + static const struct freq_tbl ftbl_camcc_cci_0_clk_src[] = { 674 + F(19200000, P_BI_TCXO, 1, 0, 0), 675 + F(37500000, P_CAMCC_PLL0_OUT_EVEN, 16, 0, 0), 676 + }; 677 + 678 + static struct clk_rcg2 camcc_cci_0_clk_src = { 679 + .cmd_rcgr = 0xc108, 680 + .mnd_width = 8, 681 + .hid_width = 5, 682 + .parent_map = camcc_parent_map_0, 683 + .freq_tbl = ftbl_camcc_cci_0_clk_src, 684 + .clkr.hw.init = &(struct clk_init_data){ 685 + .name = "camcc_cci_0_clk_src", 686 + .parent_data = camcc_parent_data_0, 687 + .num_parents = ARRAY_SIZE(camcc_parent_data_0), 688 + .ops = &clk_rcg2_ops, 689 + }, 690 + }; 691 + 692 + static struct clk_rcg2 camcc_cci_1_clk_src = { 693 + .cmd_rcgr = 0xc124, 694 + .mnd_width = 8, 695 + .hid_width = 5, 696 + .parent_map = camcc_parent_map_0, 697 + .freq_tbl = ftbl_camcc_cci_0_clk_src, 698 + .clkr.hw.init = &(struct clk_init_data){ 699 + .name = "camcc_cci_1_clk_src", 700 + .parent_data = camcc_parent_data_0, 701 + .num_parents = ARRAY_SIZE(camcc_parent_data_0), 702 + .ops = &clk_rcg2_ops, 703 + }, 704 + }; 705 + 706 + static struct clk_rcg2 camcc_cci_2_clk_src = { 707 + .cmd_rcgr = 0xc204, 708 + .mnd_width = 8, 709 + .hid_width = 5, 710 + .parent_map = camcc_parent_map_0, 711 + .freq_tbl = ftbl_camcc_cci_0_clk_src, 712 + .clkr.hw.init = &(struct clk_init_data){ 713 + .name = "camcc_cci_2_clk_src", 714 + .parent_data = camcc_parent_data_0, 715 + .num_parents = ARRAY_SIZE(camcc_parent_data_0), 716 + .ops = &clk_rcg2_ops, 717 + }, 718 + }; 719 + 720 + static struct clk_rcg2 camcc_cci_3_clk_src = { 721 + .cmd_rcgr = 0xc220, 722 + .mnd_width = 8, 723 + .hid_width = 5, 724 + .parent_map = camcc_parent_map_0, 725 + .freq_tbl = ftbl_camcc_cci_0_clk_src, 726 + .clkr.hw.init = &(struct clk_init_data){ 727 + .name = "camcc_cci_3_clk_src", 728 + .parent_data = camcc_parent_data_0, 729 + .num_parents = ARRAY_SIZE(camcc_parent_data_0), 730 + .ops = &clk_rcg2_ops, 731 + }, 732 + }; 733 + 734 + static const struct freq_tbl ftbl_camcc_cphy_rx_clk_src[] = { 735 + F(19200000, P_BI_TCXO, 1, 0, 0), 736 + F(240000000, P_CAMCC_PLL0_OUT_EVEN, 2.5, 0, 0), 737 + F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0), 738 + }; 739 + 740 + static struct clk_rcg2 camcc_cphy_rx_clk_src = { 741 + .cmd_rcgr = 0xa064, 742 + .mnd_width = 0, 743 + .hid_width = 5, 744 + .parent_map = camcc_parent_map_0, 745 + .freq_tbl = ftbl_camcc_cphy_rx_clk_src, 746 + .clkr.hw.init = &(struct clk_init_data){ 747 + .name = "camcc_cphy_rx_clk_src", 748 + .parent_data = camcc_parent_data_0, 749 + .num_parents = ARRAY_SIZE(camcc_parent_data_0), 750 + .ops = &clk_rcg2_ops, 751 + }, 752 + }; 753 + 754 + static const struct freq_tbl ftbl_camcc_csi0phytimer_clk_src[] = { 755 + F(19200000, P_BI_TCXO, 1, 0, 0), 756 + F(300000000, P_CAMCC_PLL0_OUT_EVEN, 2, 0, 0), 757 + }; 758 + 759 + static struct clk_rcg2 camcc_csi0phytimer_clk_src = { 760 + .cmd_rcgr = 0x6004, 761 + .mnd_width = 0, 762 + .hid_width = 5, 763 + .parent_map = camcc_parent_map_0, 764 + .freq_tbl = ftbl_camcc_csi0phytimer_clk_src, 765 + .clkr.hw.init = &(struct clk_init_data){ 766 + .name = "camcc_csi0phytimer_clk_src", 767 + .parent_data = camcc_parent_data_0, 768 + .num_parents = ARRAY_SIZE(camcc_parent_data_0), 769 + .ops = &clk_rcg2_ops, 770 + }, 771 + }; 772 + 773 + static struct clk_rcg2 camcc_csi1phytimer_clk_src = { 774 + .cmd_rcgr = 0x6028, 775 + .mnd_width = 0, 776 + .hid_width = 5, 777 + .parent_map = camcc_parent_map_0, 778 + .freq_tbl = ftbl_camcc_csi0phytimer_clk_src, 779 + .clkr.hw.init = &(struct clk_init_data){ 780 + .name = "camcc_csi1phytimer_clk_src", 781 + .parent_data = camcc_parent_data_0, 782 + .num_parents = ARRAY_SIZE(camcc_parent_data_0), 783 + .ops = &clk_rcg2_ops, 784 + }, 785 + }; 786 + 787 + static struct clk_rcg2 camcc_csi2phytimer_clk_src = { 788 + .cmd_rcgr = 0x604c, 789 + .mnd_width = 0, 790 + .hid_width = 5, 791 + .parent_map = camcc_parent_map_0, 792 + .freq_tbl = ftbl_camcc_csi0phytimer_clk_src, 793 + .clkr.hw.init = &(struct clk_init_data){ 794 + .name = "camcc_csi2phytimer_clk_src", 795 + .parent_data = camcc_parent_data_0, 796 + .num_parents = ARRAY_SIZE(camcc_parent_data_0), 797 + .ops = &clk_rcg2_ops, 798 + }, 799 + }; 800 + 801 + static struct clk_rcg2 camcc_csi3phytimer_clk_src = { 802 + .cmd_rcgr = 0x6074, 803 + .mnd_width = 0, 804 + .hid_width = 5, 805 + .parent_map = camcc_parent_map_0, 806 + .freq_tbl = ftbl_camcc_csi0phytimer_clk_src, 807 + .clkr.hw.init = &(struct clk_init_data){ 808 + .name = "camcc_csi3phytimer_clk_src", 809 + .parent_data = camcc_parent_data_0, 810 + .num_parents = ARRAY_SIZE(camcc_parent_data_0), 811 + .ops = &clk_rcg2_ops, 812 + }, 813 + }; 814 + 815 + static const struct freq_tbl ftbl_camcc_fast_ahb_clk_src[] = { 816 + F(19200000, P_BI_TCXO, 1, 0, 0), 817 + F(100000000, P_CAMCC_PLL0_OUT_EVEN, 6, 0, 0), 818 + F(200000000, P_CAMCC_PLL0_OUT_EVEN, 3, 0, 0), 819 + F(300000000, P_CAMCC_PLL0_OUT_MAIN, 4, 0, 0), 820 + F(400000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0), 821 + }; 822 + 823 + static struct clk_rcg2 camcc_fast_ahb_clk_src = { 824 + .cmd_rcgr = 0x703c, 825 + .mnd_width = 0, 826 + .hid_width = 5, 827 + .parent_map = camcc_parent_map_0, 828 + .freq_tbl = ftbl_camcc_fast_ahb_clk_src, 829 + .clkr.hw.init = &(struct clk_init_data){ 830 + .name = "camcc_fast_ahb_clk_src", 831 + .parent_data = camcc_parent_data_0, 832 + .num_parents = ARRAY_SIZE(camcc_parent_data_0), 833 + .ops = &clk_rcg2_ops, 834 + }, 835 + }; 836 + 837 + static const struct freq_tbl ftbl_camcc_icp_clk_src[] = { 838 + F(19200000, P_BI_TCXO, 1, 0, 0), 839 + F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0), 840 + F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0), 841 + }; 842 + 843 + static struct clk_rcg2 camcc_icp_clk_src = { 844 + .cmd_rcgr = 0xc0b8, 845 + .mnd_width = 0, 846 + .hid_width = 5, 847 + .parent_map = camcc_parent_map_0, 848 + .freq_tbl = ftbl_camcc_icp_clk_src, 849 + .clkr.hw.init = &(struct clk_init_data){ 850 + .name = "camcc_icp_clk_src", 851 + .parent_data = camcc_parent_data_0, 852 + .num_parents = ARRAY_SIZE(camcc_parent_data_0), 853 + .ops = &clk_rcg2_shared_ops, 854 + }, 855 + }; 856 + 857 + static const struct freq_tbl ftbl_camcc_ife_0_clk_src[] = { 858 + F(19200000, P_BI_TCXO, 1, 0, 0), 859 + F(400000000, P_CAMCC_PLL3_OUT_EVEN, 1, 0, 0), 860 + F(558000000, P_CAMCC_PLL3_OUT_EVEN, 1, 0, 0), 861 + F(637000000, P_CAMCC_PLL3_OUT_EVEN, 1, 0, 0), 862 + F(760000000, P_CAMCC_PLL3_OUT_EVEN, 1, 0, 0), 863 + }; 864 + 865 + static struct clk_rcg2 camcc_ife_0_clk_src = { 866 + .cmd_rcgr = 0xa010, 867 + .mnd_width = 0, 868 + .hid_width = 5, 869 + .parent_map = camcc_parent_map_4, 870 + .freq_tbl = ftbl_camcc_ife_0_clk_src, 871 + .clkr.hw.init = &(struct clk_init_data){ 872 + .name = "camcc_ife_0_clk_src", 873 + .parent_data = camcc_parent_data_4, 874 + .num_parents = ARRAY_SIZE(camcc_parent_data_4), 875 + .flags = CLK_SET_RATE_PARENT, 876 + .ops = &clk_rcg2_shared_ops, 877 + }, 878 + }; 879 + 880 + static const struct freq_tbl ftbl_camcc_ife_0_csid_clk_src[] = { 881 + F(19200000, P_BI_TCXO, 1, 0, 0), 882 + F(75000000, P_CAMCC_PLL0_OUT_EVEN, 8, 0, 0), 883 + F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0), 884 + F(480000000, P_CAMCC_PLL7_OUT_EVEN, 1, 0, 0), 885 + F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0), 886 + }; 887 + 888 + static struct clk_rcg2 camcc_ife_0_csid_clk_src = { 889 + .cmd_rcgr = 0xa03c, 890 + .mnd_width = 0, 891 + .hid_width = 5, 892 + .parent_map = camcc_parent_map_0, 893 + .freq_tbl = ftbl_camcc_ife_0_csid_clk_src, 894 + .clkr.hw.init = &(struct clk_init_data){ 895 + .name = "camcc_ife_0_csid_clk_src", 896 + .parent_data = camcc_parent_data_0, 897 + .num_parents = ARRAY_SIZE(camcc_parent_data_0), 898 + .ops = &clk_rcg2_shared_ops, 899 + }, 900 + }; 901 + 902 + static const struct freq_tbl ftbl_camcc_ife_1_clk_src[] = { 903 + F(19200000, P_BI_TCXO, 1, 0, 0), 904 + F(400000000, P_CAMCC_PLL4_OUT_EVEN, 1, 0, 0), 905 + F(558000000, P_CAMCC_PLL4_OUT_EVEN, 1, 0, 0), 906 + F(637000000, P_CAMCC_PLL4_OUT_EVEN, 1, 0, 0), 907 + F(760000000, P_CAMCC_PLL4_OUT_EVEN, 1, 0, 0), 908 + }; 909 + 910 + static struct clk_rcg2 camcc_ife_1_clk_src = { 911 + .cmd_rcgr = 0xb010, 912 + .mnd_width = 0, 913 + .hid_width = 5, 914 + .parent_map = camcc_parent_map_5, 915 + .freq_tbl = ftbl_camcc_ife_1_clk_src, 916 + .clkr.hw.init = &(struct clk_init_data){ 917 + .name = "camcc_ife_1_clk_src", 918 + .parent_data = camcc_parent_data_5, 919 + .num_parents = ARRAY_SIZE(camcc_parent_data_5), 920 + .flags = CLK_SET_RATE_PARENT, 921 + .ops = &clk_rcg2_shared_ops, 922 + }, 923 + }; 924 + 925 + static struct clk_rcg2 camcc_ife_1_csid_clk_src = { 926 + .cmd_rcgr = 0xb03c, 927 + .mnd_width = 0, 928 + .hid_width = 5, 929 + .parent_map = camcc_parent_map_0, 930 + .freq_tbl = ftbl_camcc_ife_0_csid_clk_src, 931 + .clkr.hw.init = &(struct clk_init_data){ 932 + .name = "camcc_ife_1_csid_clk_src", 933 + .parent_data = camcc_parent_data_0, 934 + .num_parents = ARRAY_SIZE(camcc_parent_data_0), 935 + .ops = &clk_rcg2_shared_ops, 936 + }, 937 + }; 938 + 939 + static const struct freq_tbl ftbl_camcc_ife_2_clk_src[] = { 940 + F(400000000, P_CAMCC_PLL5_OUT_EVEN, 1, 0, 0), 941 + F(558000000, P_CAMCC_PLL5_OUT_EVEN, 1, 0, 0), 942 + F(637000000, P_CAMCC_PLL5_OUT_EVEN, 1, 0, 0), 943 + F(760000000, P_CAMCC_PLL5_OUT_EVEN, 1, 0, 0), 944 + }; 945 + 946 + static struct clk_rcg2 camcc_ife_2_clk_src = { 947 + .cmd_rcgr = 0xf010, 948 + .mnd_width = 0, 949 + .hid_width = 5, 950 + .parent_map = camcc_parent_map_6, 951 + .freq_tbl = ftbl_camcc_ife_2_clk_src, 952 + .clkr.hw.init = &(struct clk_init_data){ 953 + .name = "camcc_ife_2_clk_src", 954 + .parent_data = camcc_parent_data_6, 955 + .num_parents = ARRAY_SIZE(camcc_parent_data_6), 956 + .flags = CLK_SET_RATE_PARENT, 957 + .ops = &clk_rcg2_shared_ops, 958 + }, 959 + }; 960 + 961 + static const struct freq_tbl ftbl_camcc_ife_2_csid_clk_src[] = { 962 + F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0), 963 + F(480000000, P_CAMCC_PLL7_OUT_EVEN, 1, 0, 0), 964 + F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0), 965 + }; 966 + 967 + static struct clk_rcg2 camcc_ife_2_csid_clk_src = { 968 + .cmd_rcgr = 0xf03c, 969 + .mnd_width = 0, 970 + .hid_width = 5, 971 + .parent_map = camcc_parent_map_0, 972 + .freq_tbl = ftbl_camcc_ife_2_csid_clk_src, 973 + .clkr.hw.init = &(struct clk_init_data){ 974 + .name = "camcc_ife_2_csid_clk_src", 975 + .parent_data = camcc_parent_data_0, 976 + .num_parents = ARRAY_SIZE(camcc_parent_data_0), 977 + .ops = &clk_rcg2_shared_ops, 978 + }, 979 + }; 980 + 981 + static const struct freq_tbl ftbl_camcc_ife_3_clk_src[] = { 982 + F(19200000, P_BI_TCXO, 1, 0, 0), 983 + F(400000000, P_CAMCC_PLL6_OUT_EVEN, 1, 0, 0), 984 + F(558000000, P_CAMCC_PLL6_OUT_EVEN, 1, 0, 0), 985 + F(637000000, P_CAMCC_PLL6_OUT_EVEN, 1, 0, 0), 986 + F(760000000, P_CAMCC_PLL6_OUT_EVEN, 1, 0, 0), 987 + }; 988 + 989 + static struct clk_rcg2 camcc_ife_3_clk_src = { 990 + .cmd_rcgr = 0xf07c, 991 + .mnd_width = 0, 992 + .hid_width = 5, 993 + .parent_map = camcc_parent_map_7, 994 + .freq_tbl = ftbl_camcc_ife_3_clk_src, 995 + .clkr.hw.init = &(struct clk_init_data){ 996 + .name = "camcc_ife_3_clk_src", 997 + .parent_data = camcc_parent_data_7, 998 + .num_parents = ARRAY_SIZE(camcc_parent_data_7), 999 + .flags = CLK_SET_RATE_PARENT, 1000 + .ops = &clk_rcg2_shared_ops, 1001 + }, 1002 + }; 1003 + 1004 + static struct clk_rcg2 camcc_ife_3_csid_clk_src = { 1005 + .cmd_rcgr = 0xf0a8, 1006 + .mnd_width = 0, 1007 + .hid_width = 5, 1008 + .parent_map = camcc_parent_map_0, 1009 + .freq_tbl = ftbl_camcc_ife_2_csid_clk_src, 1010 + .clkr.hw.init = &(struct clk_init_data){ 1011 + .name = "camcc_ife_3_csid_clk_src", 1012 + .parent_data = camcc_parent_data_0, 1013 + .num_parents = ARRAY_SIZE(camcc_parent_data_0), 1014 + .ops = &clk_rcg2_shared_ops, 1015 + }, 1016 + }; 1017 + 1018 + static const struct freq_tbl ftbl_camcc_ife_lite_0_clk_src[] = { 1019 + F(320000000, P_CAMCC_PLL7_OUT_ODD, 1, 0, 0), 1020 + F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0), 1021 + F(480000000, P_CAMCC_PLL7_OUT_EVEN, 1, 0, 0), 1022 + F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0), 1023 + }; 1024 + 1025 + static struct clk_rcg2 camcc_ife_lite_0_clk_src = { 1026 + .cmd_rcgr = 0xc004, 1027 + .mnd_width = 0, 1028 + .hid_width = 5, 1029 + .parent_map = camcc_parent_map_2, 1030 + .freq_tbl = ftbl_camcc_ife_lite_0_clk_src, 1031 + .clkr.hw.init = &(struct clk_init_data){ 1032 + .name = "camcc_ife_lite_0_clk_src", 1033 + .parent_data = camcc_parent_data_2, 1034 + .num_parents = ARRAY_SIZE(camcc_parent_data_2), 1035 + .ops = &clk_rcg2_shared_ops, 1036 + }, 1037 + }; 1038 + 1039 + static struct clk_rcg2 camcc_ife_lite_0_csid_clk_src = { 1040 + .cmd_rcgr = 0xc020, 1041 + .mnd_width = 0, 1042 + .hid_width = 5, 1043 + .parent_map = camcc_parent_map_0, 1044 + .freq_tbl = ftbl_camcc_ife_2_csid_clk_src, 1045 + .clkr.hw.init = &(struct clk_init_data){ 1046 + .name = "camcc_ife_lite_0_csid_clk_src", 1047 + .parent_data = camcc_parent_data_0, 1048 + .num_parents = ARRAY_SIZE(camcc_parent_data_0), 1049 + .ops = &clk_rcg2_shared_ops, 1050 + }, 1051 + }; 1052 + 1053 + static struct clk_rcg2 camcc_ife_lite_1_clk_src = { 1054 + .cmd_rcgr = 0xc048, 1055 + .mnd_width = 0, 1056 + .hid_width = 5, 1057 + .parent_map = camcc_parent_map_2, 1058 + .freq_tbl = ftbl_camcc_ife_lite_0_clk_src, 1059 + .clkr.hw.init = &(struct clk_init_data){ 1060 + .name = "camcc_ife_lite_1_clk_src", 1061 + .parent_data = camcc_parent_data_2, 1062 + .num_parents = ARRAY_SIZE(camcc_parent_data_2), 1063 + .ops = &clk_rcg2_shared_ops, 1064 + }, 1065 + }; 1066 + 1067 + static struct clk_rcg2 camcc_ife_lite_1_csid_clk_src = { 1068 + .cmd_rcgr = 0xc064, 1069 + .mnd_width = 0, 1070 + .hid_width = 5, 1071 + .parent_map = camcc_parent_map_0, 1072 + .freq_tbl = ftbl_camcc_ife_2_csid_clk_src, 1073 + .clkr.hw.init = &(struct clk_init_data){ 1074 + .name = "camcc_ife_lite_1_csid_clk_src", 1075 + .parent_data = camcc_parent_data_0, 1076 + .num_parents = ARRAY_SIZE(camcc_parent_data_0), 1077 + .ops = &clk_rcg2_shared_ops, 1078 + }, 1079 + }; 1080 + 1081 + static struct clk_rcg2 camcc_ife_lite_2_clk_src = { 1082 + .cmd_rcgr = 0xc240, 1083 + .mnd_width = 0, 1084 + .hid_width = 5, 1085 + .parent_map = camcc_parent_map_2, 1086 + .freq_tbl = ftbl_camcc_ife_lite_0_clk_src, 1087 + .clkr.hw.init = &(struct clk_init_data){ 1088 + .name = "camcc_ife_lite_2_clk_src", 1089 + .parent_data = camcc_parent_data_2, 1090 + .num_parents = ARRAY_SIZE(camcc_parent_data_2), 1091 + .ops = &clk_rcg2_shared_ops, 1092 + }, 1093 + }; 1094 + 1095 + static struct clk_rcg2 camcc_ife_lite_2_csid_clk_src = { 1096 + .cmd_rcgr = 0xc25c, 1097 + .mnd_width = 0, 1098 + .hid_width = 5, 1099 + .parent_map = camcc_parent_map_0, 1100 + .freq_tbl = ftbl_camcc_ife_2_csid_clk_src, 1101 + .clkr.hw.init = &(struct clk_init_data){ 1102 + .name = "camcc_ife_lite_2_csid_clk_src", 1103 + .parent_data = camcc_parent_data_0, 1104 + .num_parents = ARRAY_SIZE(camcc_parent_data_0), 1105 + .ops = &clk_rcg2_shared_ops, 1106 + }, 1107 + }; 1108 + 1109 + static struct clk_rcg2 camcc_ife_lite_3_clk_src = { 1110 + .cmd_rcgr = 0xc284, 1111 + .mnd_width = 0, 1112 + .hid_width = 5, 1113 + .parent_map = camcc_parent_map_2, 1114 + .freq_tbl = ftbl_camcc_ife_lite_0_clk_src, 1115 + .clkr.hw.init = &(struct clk_init_data){ 1116 + .name = "camcc_ife_lite_3_clk_src", 1117 + .parent_data = camcc_parent_data_2, 1118 + .num_parents = ARRAY_SIZE(camcc_parent_data_2), 1119 + .ops = &clk_rcg2_shared_ops, 1120 + }, 1121 + }; 1122 + 1123 + static struct clk_rcg2 camcc_ife_lite_3_csid_clk_src = { 1124 + .cmd_rcgr = 0xc2a0, 1125 + .mnd_width = 0, 1126 + .hid_width = 5, 1127 + .parent_map = camcc_parent_map_0, 1128 + .freq_tbl = ftbl_camcc_ife_2_csid_clk_src, 1129 + .clkr.hw.init = &(struct clk_init_data){ 1130 + .name = "camcc_ife_lite_3_csid_clk_src", 1131 + .parent_data = camcc_parent_data_0, 1132 + .num_parents = ARRAY_SIZE(camcc_parent_data_0), 1133 + .ops = &clk_rcg2_shared_ops, 1134 + }, 1135 + }; 1136 + 1137 + static const struct freq_tbl ftbl_camcc_ipe_0_clk_src[] = { 1138 + F(19200000, P_BI_TCXO, 1, 0, 0), 1139 + F(320000000, P_CAMCC_PLL1_OUT_EVEN, 1, 0, 0), 1140 + F(475000000, P_CAMCC_PLL1_OUT_EVEN, 1, 0, 0), 1141 + F(520000000, P_CAMCC_PLL1_OUT_EVEN, 1, 0, 0), 1142 + F(600000000, P_CAMCC_PLL1_OUT_EVEN, 1, 0, 0), 1143 + }; 1144 + 1145 + static struct clk_rcg2 camcc_ipe_0_clk_src = { 1146 + .cmd_rcgr = 0x8010, 1147 + .mnd_width = 0, 1148 + .hid_width = 5, 1149 + .parent_map = camcc_parent_map_8, 1150 + .freq_tbl = ftbl_camcc_ipe_0_clk_src, 1151 + .clkr.hw.init = &(struct clk_init_data){ 1152 + .name = "camcc_ipe_0_clk_src", 1153 + .parent_data = camcc_parent_data_8, 1154 + .num_parents = ARRAY_SIZE(camcc_parent_data_8), 1155 + .flags = CLK_SET_RATE_PARENT, 1156 + .ops = &clk_rcg2_shared_ops, 1157 + }, 1158 + }; 1159 + 1160 + static const struct freq_tbl ftbl_camcc_jpeg_clk_src[] = { 1161 + F(19200000, P_BI_TCXO, 1, 0, 0), 1162 + F(200000000, P_CAMCC_PLL0_OUT_ODD, 2, 0, 0), 1163 + F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0), 1164 + F(480000000, P_CAMCC_PLL7_OUT_EVEN, 1, 0, 0), 1165 + F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0), 1166 + }; 1167 + 1168 + static struct clk_rcg2 camcc_jpeg_clk_src = { 1169 + .cmd_rcgr = 0xc08c, 1170 + .mnd_width = 0, 1171 + .hid_width = 5, 1172 + .parent_map = camcc_parent_map_0, 1173 + .freq_tbl = ftbl_camcc_jpeg_clk_src, 1174 + .clkr.hw.init = &(struct clk_init_data){ 1175 + .name = "camcc_jpeg_clk_src", 1176 + .parent_data = camcc_parent_data_0, 1177 + .num_parents = ARRAY_SIZE(camcc_parent_data_0), 1178 + .ops = &clk_rcg2_shared_ops, 1179 + }, 1180 + }; 1181 + 1182 + static const struct freq_tbl ftbl_camcc_lrme_clk_src[] = { 1183 + F(240000000, P_CAMCC_PLL7_OUT_EVEN, 2, 0, 0), 1184 + F(300000000, P_CAMCC_PLL0_OUT_EVEN, 2, 0, 0), 1185 + F(320000000, P_CAMCC_PLL7_OUT_ODD, 1, 0, 0), 1186 + F(400000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0), 1187 + }; 1188 + 1189 + static struct clk_rcg2 camcc_lrme_clk_src = { 1190 + .cmd_rcgr = 0xc144, 1191 + .mnd_width = 0, 1192 + .hid_width = 5, 1193 + .parent_map = camcc_parent_map_2, 1194 + .freq_tbl = ftbl_camcc_lrme_clk_src, 1195 + .clkr.hw.init = &(struct clk_init_data){ 1196 + .name = "camcc_lrme_clk_src", 1197 + .parent_data = camcc_parent_data_2, 1198 + .num_parents = ARRAY_SIZE(camcc_parent_data_2), 1199 + .ops = &clk_rcg2_shared_ops, 1200 + }, 1201 + }; 1202 + 1203 + static const struct freq_tbl ftbl_camcc_mclk0_clk_src[] = { 1204 + F(19200000, P_BI_TCXO, 1, 0, 0), 1205 + F(24000000, P_CAMCC_PLL2_OUT_EARLY, 10, 1, 4), 1206 + F(64000000, P_CAMCC_PLL2_OUT_EARLY, 15, 0, 0), 1207 + }; 1208 + 1209 + static struct clk_rcg2 camcc_mclk0_clk_src = { 1210 + .cmd_rcgr = 0x5004, 1211 + .mnd_width = 8, 1212 + .hid_width = 5, 1213 + .parent_map = camcc_parent_map_1, 1214 + .freq_tbl = ftbl_camcc_mclk0_clk_src, 1215 + .clkr.hw.init = &(struct clk_init_data){ 1216 + .name = "camcc_mclk0_clk_src", 1217 + .parent_data = camcc_parent_data_1, 1218 + .num_parents = ARRAY_SIZE(camcc_parent_data_1), 1219 + .ops = &clk_rcg2_ops, 1220 + }, 1221 + }; 1222 + 1223 + static struct clk_rcg2 camcc_mclk1_clk_src = { 1224 + .cmd_rcgr = 0x5024, 1225 + .mnd_width = 8, 1226 + .hid_width = 5, 1227 + .parent_map = camcc_parent_map_1, 1228 + .freq_tbl = ftbl_camcc_mclk0_clk_src, 1229 + .clkr.hw.init = &(struct clk_init_data){ 1230 + .name = "camcc_mclk1_clk_src", 1231 + .parent_data = camcc_parent_data_1, 1232 + .num_parents = ARRAY_SIZE(camcc_parent_data_1), 1233 + .ops = &clk_rcg2_ops, 1234 + }, 1235 + }; 1236 + 1237 + static struct clk_rcg2 camcc_mclk2_clk_src = { 1238 + .cmd_rcgr = 0x5044, 1239 + .mnd_width = 8, 1240 + .hid_width = 5, 1241 + .parent_map = camcc_parent_map_1, 1242 + .freq_tbl = ftbl_camcc_mclk0_clk_src, 1243 + .clkr.hw.init = &(struct clk_init_data){ 1244 + .name = "camcc_mclk2_clk_src", 1245 + .parent_data = camcc_parent_data_1, 1246 + .num_parents = ARRAY_SIZE(camcc_parent_data_1), 1247 + .ops = &clk_rcg2_ops, 1248 + }, 1249 + }; 1250 + 1251 + static struct clk_rcg2 camcc_mclk3_clk_src = { 1252 + .cmd_rcgr = 0x5064, 1253 + .mnd_width = 8, 1254 + .hid_width = 5, 1255 + .parent_map = camcc_parent_map_1, 1256 + .freq_tbl = ftbl_camcc_mclk0_clk_src, 1257 + .clkr.hw.init = &(struct clk_init_data){ 1258 + .name = "camcc_mclk3_clk_src", 1259 + .parent_data = camcc_parent_data_1, 1260 + .num_parents = ARRAY_SIZE(camcc_parent_data_1), 1261 + .ops = &clk_rcg2_ops, 1262 + }, 1263 + }; 1264 + 1265 + static struct clk_rcg2 camcc_mclk4_clk_src = { 1266 + .cmd_rcgr = 0x5084, 1267 + .mnd_width = 8, 1268 + .hid_width = 5, 1269 + .parent_map = camcc_parent_map_1, 1270 + .freq_tbl = ftbl_camcc_mclk0_clk_src, 1271 + .clkr.hw.init = &(struct clk_init_data){ 1272 + .name = "camcc_mclk4_clk_src", 1273 + .parent_data = camcc_parent_data_1, 1274 + .num_parents = ARRAY_SIZE(camcc_parent_data_1), 1275 + .ops = &clk_rcg2_ops, 1276 + }, 1277 + }; 1278 + 1279 + static struct clk_rcg2 camcc_mclk5_clk_src = { 1280 + .cmd_rcgr = 0x50a4, 1281 + .mnd_width = 8, 1282 + .hid_width = 5, 1283 + .parent_map = camcc_parent_map_1, 1284 + .freq_tbl = ftbl_camcc_mclk0_clk_src, 1285 + .clkr.hw.init = &(struct clk_init_data){ 1286 + .name = "camcc_mclk5_clk_src", 1287 + .parent_data = camcc_parent_data_1, 1288 + .num_parents = ARRAY_SIZE(camcc_parent_data_1), 1289 + .ops = &clk_rcg2_ops, 1290 + }, 1291 + }; 1292 + 1293 + static struct clk_rcg2 camcc_mclk6_clk_src = { 1294 + .cmd_rcgr = 0x50c4, 1295 + .mnd_width = 8, 1296 + .hid_width = 5, 1297 + .parent_map = camcc_parent_map_1, 1298 + .freq_tbl = ftbl_camcc_mclk0_clk_src, 1299 + .clkr.hw.init = &(struct clk_init_data){ 1300 + .name = "camcc_mclk6_clk_src", 1301 + .parent_data = camcc_parent_data_1, 1302 + .num_parents = ARRAY_SIZE(camcc_parent_data_1), 1303 + .ops = &clk_rcg2_ops, 1304 + }, 1305 + }; 1306 + 1307 + static struct clk_rcg2 camcc_mclk7_clk_src = { 1308 + .cmd_rcgr = 0x50e4, 1309 + .mnd_width = 8, 1310 + .hid_width = 5, 1311 + .parent_map = camcc_parent_map_1, 1312 + .freq_tbl = ftbl_camcc_mclk0_clk_src, 1313 + .clkr.hw.init = &(struct clk_init_data){ 1314 + .name = "camcc_mclk7_clk_src", 1315 + .parent_data = camcc_parent_data_1, 1316 + .num_parents = ARRAY_SIZE(camcc_parent_data_1), 1317 + .ops = &clk_rcg2_ops, 1318 + }, 1319 + }; 1320 + 1321 + static const struct freq_tbl ftbl_camcc_sleep_clk_src[] = { 1322 + F(32000, P_SLEEP_CLK, 1, 0, 0), 1323 + }; 1324 + 1325 + static struct clk_rcg2 camcc_sleep_clk_src = { 1326 + .cmd_rcgr = 0xc1e8, 1327 + .mnd_width = 0, 1328 + .hid_width = 5, 1329 + .parent_map = camcc_parent_map_9, 1330 + .freq_tbl = ftbl_camcc_sleep_clk_src, 1331 + .clkr.hw.init = &(struct clk_init_data){ 1332 + .name = "camcc_sleep_clk_src", 1333 + .parent_data = camcc_parent_data_9, 1334 + .num_parents = ARRAY_SIZE(camcc_parent_data_9), 1335 + .ops = &clk_rcg2_ops, 1336 + }, 1337 + }; 1338 + 1339 + static const struct freq_tbl ftbl_camcc_slow_ahb_clk_src[] = { 1340 + F(19200000, P_BI_TCXO, 1, 0, 0), 1341 + F(80000000, P_CAMCC_PLL7_OUT_EVEN, 6, 0, 0), 1342 + }; 1343 + 1344 + static struct clk_rcg2 camcc_slow_ahb_clk_src = { 1345 + .cmd_rcgr = 0x7058, 1346 + .mnd_width = 8, 1347 + .hid_width = 5, 1348 + .parent_map = camcc_parent_map_0, 1349 + .freq_tbl = ftbl_camcc_slow_ahb_clk_src, 1350 + .clkr.hw.init = &(struct clk_init_data){ 1351 + .name = "camcc_slow_ahb_clk_src", 1352 + .parent_data = camcc_parent_data_0, 1353 + .num_parents = ARRAY_SIZE(camcc_parent_data_0), 1354 + .ops = &clk_rcg2_ops, 1355 + }, 1356 + }; 1357 + 1358 + static const struct freq_tbl ftbl_camcc_xo_clk_src[] = { 1359 + F(19200000, P_BI_TCXO, 1, 0, 0), 1360 + }; 1361 + 1362 + static struct clk_rcg2 camcc_xo_clk_src = { 1363 + .cmd_rcgr = 0xc1cc, 1364 + .mnd_width = 0, 1365 + .hid_width = 5, 1366 + .parent_map = camcc_parent_map_10, 1367 + .freq_tbl = ftbl_camcc_xo_clk_src, 1368 + .clkr.hw.init = &(struct clk_init_data){ 1369 + .name = "camcc_xo_clk_src", 1370 + .parent_data = camcc_parent_data_10_ao, 1371 + .num_parents = ARRAY_SIZE(camcc_parent_data_10_ao), 1372 + .ops = &clk_rcg2_ops, 1373 + }, 1374 + }; 1375 + 1376 + static struct clk_branch camcc_bps_ahb_clk = { 1377 + .halt_reg = 0x7070, 1378 + .halt_check = BRANCH_HALT, 1379 + .clkr = { 1380 + .enable_reg = 0x7070, 1381 + .enable_mask = BIT(0), 1382 + .hw.init = &(struct clk_init_data){ 1383 + .name = "camcc_bps_ahb_clk", 1384 + .parent_hws = (const struct clk_hw*[]){ 1385 + &camcc_slow_ahb_clk_src.clkr.hw, 1386 + }, 1387 + .num_parents = 1, 1388 + .flags = CLK_SET_RATE_PARENT, 1389 + .ops = &clk_branch2_ops, 1390 + }, 1391 + }, 1392 + }; 1393 + 1394 + static struct clk_branch camcc_bps_areg_clk = { 1395 + .halt_reg = 0x7054, 1396 + .halt_check = BRANCH_HALT, 1397 + .clkr = { 1398 + .enable_reg = 0x7054, 1399 + .enable_mask = BIT(0), 1400 + .hw.init = &(struct clk_init_data){ 1401 + .name = "camcc_bps_areg_clk", 1402 + .parent_hws = (const struct clk_hw*[]){ 1403 + &camcc_fast_ahb_clk_src.clkr.hw, 1404 + }, 1405 + .num_parents = 1, 1406 + .flags = CLK_SET_RATE_PARENT, 1407 + .ops = &clk_branch2_ops, 1408 + }, 1409 + }, 1410 + }; 1411 + 1412 + static struct clk_branch camcc_bps_axi_clk = { 1413 + .halt_reg = 0x7038, 1414 + .halt_check = BRANCH_HALT, 1415 + .clkr = { 1416 + .enable_reg = 0x7038, 1417 + .enable_mask = BIT(0), 1418 + .hw.init = &(struct clk_init_data){ 1419 + .name = "camcc_bps_axi_clk", 1420 + .parent_hws = (const struct clk_hw*[]){ 1421 + &camcc_camnoc_axi_clk_src.clkr.hw, 1422 + }, 1423 + .num_parents = 1, 1424 + .flags = CLK_SET_RATE_PARENT, 1425 + .ops = &clk_branch2_ops, 1426 + }, 1427 + }, 1428 + }; 1429 + 1430 + static struct clk_branch camcc_bps_clk = { 1431 + .halt_reg = 0x7028, 1432 + .halt_check = BRANCH_HALT, 1433 + .clkr = { 1434 + .enable_reg = 0x7028, 1435 + .enable_mask = BIT(0), 1436 + .hw.init = &(struct clk_init_data){ 1437 + .name = "camcc_bps_clk", 1438 + .parent_hws = (const struct clk_hw*[]){ 1439 + &camcc_bps_clk_src.clkr.hw, 1440 + }, 1441 + .num_parents = 1, 1442 + .flags = CLK_SET_RATE_PARENT, 1443 + .ops = &clk_branch2_ops, 1444 + }, 1445 + }, 1446 + }; 1447 + 1448 + static struct clk_branch camcc_camnoc_axi_clk = { 1449 + .halt_reg = 0xc18c, 1450 + .halt_check = BRANCH_HALT, 1451 + .clkr = { 1452 + .enable_reg = 0xc18c, 1453 + .enable_mask = BIT(0), 1454 + .hw.init = &(struct clk_init_data){ 1455 + .name = "camcc_camnoc_axi_clk", 1456 + .parent_hws = (const struct clk_hw*[]){ 1457 + &camcc_camnoc_axi_clk_src.clkr.hw, 1458 + }, 1459 + .num_parents = 1, 1460 + .flags = CLK_SET_RATE_PARENT, 1461 + .ops = &clk_branch2_ops, 1462 + }, 1463 + }, 1464 + }; 1465 + 1466 + static struct clk_branch camcc_camnoc_dcd_xo_clk = { 1467 + .halt_reg = 0xc194, 1468 + .halt_check = BRANCH_HALT, 1469 + .clkr = { 1470 + .enable_reg = 0xc194, 1471 + .enable_mask = BIT(0), 1472 + .hw.init = &(struct clk_init_data){ 1473 + .name = "camcc_camnoc_dcd_xo_clk", 1474 + .parent_hws = (const struct clk_hw*[]){ 1475 + &camcc_xo_clk_src.clkr.hw, 1476 + }, 1477 + .num_parents = 1, 1478 + .flags = CLK_SET_RATE_PARENT, 1479 + .ops = &clk_branch2_ops, 1480 + }, 1481 + }, 1482 + }; 1483 + 1484 + static struct clk_branch camcc_cci_0_clk = { 1485 + .halt_reg = 0xc120, 1486 + .halt_check = BRANCH_HALT, 1487 + .clkr = { 1488 + .enable_reg = 0xc120, 1489 + .enable_mask = BIT(0), 1490 + .hw.init = &(struct clk_init_data){ 1491 + .name = "camcc_cci_0_clk", 1492 + .parent_hws = (const struct clk_hw*[]){ 1493 + &camcc_cci_0_clk_src.clkr.hw, 1494 + }, 1495 + .num_parents = 1, 1496 + .flags = CLK_SET_RATE_PARENT, 1497 + .ops = &clk_branch2_ops, 1498 + }, 1499 + }, 1500 + }; 1501 + 1502 + static struct clk_branch camcc_cci_1_clk = { 1503 + .halt_reg = 0xc13c, 1504 + .halt_check = BRANCH_HALT, 1505 + .clkr = { 1506 + .enable_reg = 0xc13c, 1507 + .enable_mask = BIT(0), 1508 + .hw.init = &(struct clk_init_data){ 1509 + .name = "camcc_cci_1_clk", 1510 + .parent_hws = (const struct clk_hw*[]){ 1511 + &camcc_cci_1_clk_src.clkr.hw, 1512 + }, 1513 + .num_parents = 1, 1514 + .flags = CLK_SET_RATE_PARENT, 1515 + .ops = &clk_branch2_ops, 1516 + }, 1517 + }, 1518 + }; 1519 + 1520 + static struct clk_branch camcc_cci_2_clk = { 1521 + .halt_reg = 0xc21c, 1522 + .halt_check = BRANCH_HALT, 1523 + .clkr = { 1524 + .enable_reg = 0xc21c, 1525 + .enable_mask = BIT(0), 1526 + .hw.init = &(struct clk_init_data){ 1527 + .name = "camcc_cci_2_clk", 1528 + .parent_hws = (const struct clk_hw*[]){ 1529 + &camcc_cci_2_clk_src.clkr.hw, 1530 + }, 1531 + .num_parents = 1, 1532 + .flags = CLK_SET_RATE_PARENT, 1533 + .ops = &clk_branch2_ops, 1534 + }, 1535 + }, 1536 + }; 1537 + 1538 + static struct clk_branch camcc_cci_3_clk = { 1539 + .halt_reg = 0xc238, 1540 + .halt_check = BRANCH_HALT, 1541 + .clkr = { 1542 + .enable_reg = 0xc238, 1543 + .enable_mask = BIT(0), 1544 + .hw.init = &(struct clk_init_data){ 1545 + .name = "camcc_cci_3_clk", 1546 + .parent_hws = (const struct clk_hw*[]){ 1547 + &camcc_cci_3_clk_src.clkr.hw, 1548 + }, 1549 + .num_parents = 1, 1550 + .flags = CLK_SET_RATE_PARENT, 1551 + .ops = &clk_branch2_ops, 1552 + }, 1553 + }, 1554 + }; 1555 + 1556 + static struct clk_branch camcc_core_ahb_clk = { 1557 + .halt_reg = 0xc1c8, 1558 + .halt_check = BRANCH_HALT_DELAY, 1559 + .clkr = { 1560 + .enable_reg = 0xc1c8, 1561 + .enable_mask = BIT(0), 1562 + .hw.init = &(struct clk_init_data){ 1563 + .name = "camcc_core_ahb_clk", 1564 + .parent_hws = (const struct clk_hw*[]){ 1565 + &camcc_slow_ahb_clk_src.clkr.hw, 1566 + }, 1567 + .num_parents = 1, 1568 + .flags = CLK_SET_RATE_PARENT, 1569 + .ops = &clk_branch2_ops, 1570 + }, 1571 + }, 1572 + }; 1573 + 1574 + static struct clk_branch camcc_cpas_ahb_clk = { 1575 + .halt_reg = 0xc168, 1576 + .halt_check = BRANCH_HALT, 1577 + .clkr = { 1578 + .enable_reg = 0xc168, 1579 + .enable_mask = BIT(0), 1580 + .hw.init = &(struct clk_init_data){ 1581 + .name = "camcc_cpas_ahb_clk", 1582 + .parent_hws = (const struct clk_hw*[]){ 1583 + &camcc_slow_ahb_clk_src.clkr.hw, 1584 + }, 1585 + .num_parents = 1, 1586 + .flags = CLK_SET_RATE_PARENT, 1587 + .ops = &clk_branch2_ops, 1588 + }, 1589 + }, 1590 + }; 1591 + 1592 + static struct clk_branch camcc_csi0phytimer_clk = { 1593 + .halt_reg = 0x601c, 1594 + .halt_check = BRANCH_HALT, 1595 + .clkr = { 1596 + .enable_reg = 0x601c, 1597 + .enable_mask = BIT(0), 1598 + .hw.init = &(struct clk_init_data){ 1599 + .name = "camcc_csi0phytimer_clk", 1600 + .parent_hws = (const struct clk_hw*[]){ 1601 + &camcc_csi0phytimer_clk_src.clkr.hw, 1602 + }, 1603 + .num_parents = 1, 1604 + .flags = CLK_SET_RATE_PARENT, 1605 + .ops = &clk_branch2_ops, 1606 + }, 1607 + }, 1608 + }; 1609 + 1610 + static struct clk_branch camcc_csi1phytimer_clk = { 1611 + .halt_reg = 0x6040, 1612 + .halt_check = BRANCH_HALT, 1613 + .clkr = { 1614 + .enable_reg = 0x6040, 1615 + .enable_mask = BIT(0), 1616 + .hw.init = &(struct clk_init_data){ 1617 + .name = "camcc_csi1phytimer_clk", 1618 + .parent_hws = (const struct clk_hw*[]){ 1619 + &camcc_csi1phytimer_clk_src.clkr.hw, 1620 + }, 1621 + .num_parents = 1, 1622 + .flags = CLK_SET_RATE_PARENT, 1623 + .ops = &clk_branch2_ops, 1624 + }, 1625 + }, 1626 + }; 1627 + 1628 + static struct clk_branch camcc_csi2phytimer_clk = { 1629 + .halt_reg = 0x6064, 1630 + .halt_check = BRANCH_HALT, 1631 + .clkr = { 1632 + .enable_reg = 0x6064, 1633 + .enable_mask = BIT(0), 1634 + .hw.init = &(struct clk_init_data){ 1635 + .name = "camcc_csi2phytimer_clk", 1636 + .parent_hws = (const struct clk_hw*[]){ 1637 + &camcc_csi2phytimer_clk_src.clkr.hw, 1638 + }, 1639 + .num_parents = 1, 1640 + .flags = CLK_SET_RATE_PARENT, 1641 + .ops = &clk_branch2_ops, 1642 + }, 1643 + }, 1644 + }; 1645 + 1646 + static struct clk_branch camcc_csi3phytimer_clk = { 1647 + .halt_reg = 0x608c, 1648 + .halt_check = BRANCH_HALT, 1649 + .clkr = { 1650 + .enable_reg = 0x608c, 1651 + .enable_mask = BIT(0), 1652 + .hw.init = &(struct clk_init_data){ 1653 + .name = "camcc_csi3phytimer_clk", 1654 + .parent_hws = (const struct clk_hw*[]){ 1655 + &camcc_csi3phytimer_clk_src.clkr.hw, 1656 + }, 1657 + .num_parents = 1, 1658 + .flags = CLK_SET_RATE_PARENT, 1659 + .ops = &clk_branch2_ops, 1660 + }, 1661 + }, 1662 + }; 1663 + 1664 + static struct clk_branch camcc_csiphy0_clk = { 1665 + .halt_reg = 0x6020, 1666 + .halt_check = BRANCH_HALT, 1667 + .clkr = { 1668 + .enable_reg = 0x6020, 1669 + .enable_mask = BIT(0), 1670 + .hw.init = &(struct clk_init_data){ 1671 + .name = "camcc_csiphy0_clk", 1672 + .parent_hws = (const struct clk_hw*[]){ 1673 + &camcc_cphy_rx_clk_src.clkr.hw, 1674 + }, 1675 + .num_parents = 1, 1676 + .flags = CLK_SET_RATE_PARENT, 1677 + .ops = &clk_branch2_ops, 1678 + }, 1679 + }, 1680 + }; 1681 + 1682 + static struct clk_branch camcc_csiphy1_clk = { 1683 + .halt_reg = 0x6044, 1684 + .halt_check = BRANCH_HALT, 1685 + .clkr = { 1686 + .enable_reg = 0x6044, 1687 + .enable_mask = BIT(0), 1688 + .hw.init = &(struct clk_init_data){ 1689 + .name = "camcc_csiphy1_clk", 1690 + .parent_hws = (const struct clk_hw*[]){ 1691 + &camcc_cphy_rx_clk_src.clkr.hw, 1692 + }, 1693 + .num_parents = 1, 1694 + .flags = CLK_SET_RATE_PARENT, 1695 + .ops = &clk_branch2_ops, 1696 + }, 1697 + }, 1698 + }; 1699 + 1700 + static struct clk_branch camcc_csiphy2_clk = { 1701 + .halt_reg = 0x6068, 1702 + .halt_check = BRANCH_HALT, 1703 + .clkr = { 1704 + .enable_reg = 0x6068, 1705 + .enable_mask = BIT(0), 1706 + .hw.init = &(struct clk_init_data){ 1707 + .name = "camcc_csiphy2_clk", 1708 + .parent_hws = (const struct clk_hw*[]){ 1709 + &camcc_cphy_rx_clk_src.clkr.hw, 1710 + }, 1711 + .num_parents = 1, 1712 + .flags = CLK_SET_RATE_PARENT, 1713 + .ops = &clk_branch2_ops, 1714 + }, 1715 + }, 1716 + }; 1717 + 1718 + static struct clk_branch camcc_csiphy3_clk = { 1719 + .halt_reg = 0x6090, 1720 + .halt_check = BRANCH_HALT, 1721 + .clkr = { 1722 + .enable_reg = 0x6090, 1723 + .enable_mask = BIT(0), 1724 + .hw.init = &(struct clk_init_data){ 1725 + .name = "camcc_csiphy3_clk", 1726 + .parent_hws = (const struct clk_hw*[]){ 1727 + &camcc_cphy_rx_clk_src.clkr.hw, 1728 + }, 1729 + .num_parents = 1, 1730 + .flags = CLK_SET_RATE_PARENT, 1731 + .ops = &clk_branch2_ops, 1732 + }, 1733 + }, 1734 + }; 1735 + 1736 + static struct clk_branch camcc_gdsc_clk = { 1737 + .halt_reg = 0xc1e4, 1738 + .halt_check = BRANCH_HALT, 1739 + .clkr = { 1740 + .enable_reg = 0xc1e4, 1741 + .enable_mask = BIT(0), 1742 + .hw.init = &(struct clk_init_data){ 1743 + .name = "camcc_gdsc_clk", 1744 + .parent_hws = (const struct clk_hw*[]){ 1745 + &camcc_xo_clk_src.clkr.hw, 1746 + }, 1747 + .num_parents = 1, 1748 + .flags = CLK_SET_RATE_PARENT, 1749 + .ops = &clk_branch2_ops, 1750 + }, 1751 + }, 1752 + }; 1753 + 1754 + static struct clk_branch camcc_icp_ahb_clk = { 1755 + .halt_reg = 0xc0d8, 1756 + .halt_check = BRANCH_HALT, 1757 + .clkr = { 1758 + .enable_reg = 0xc0d8, 1759 + .enable_mask = BIT(0), 1760 + .hw.init = &(struct clk_init_data){ 1761 + .name = "camcc_icp_ahb_clk", 1762 + .parent_hws = (const struct clk_hw*[]){ 1763 + &camcc_slow_ahb_clk_src.clkr.hw, 1764 + }, 1765 + .num_parents = 1, 1766 + .flags = CLK_SET_RATE_PARENT, 1767 + .ops = &clk_branch2_ops, 1768 + }, 1769 + }, 1770 + }; 1771 + 1772 + static struct clk_branch camcc_icp_clk = { 1773 + .halt_reg = 0xc0d0, 1774 + .halt_check = BRANCH_HALT, 1775 + .clkr = { 1776 + .enable_reg = 0xc0d0, 1777 + .enable_mask = BIT(0), 1778 + .hw.init = &(struct clk_init_data){ 1779 + .name = "camcc_icp_clk", 1780 + .parent_hws = (const struct clk_hw*[]){ 1781 + &camcc_icp_clk_src.clkr.hw, 1782 + }, 1783 + .num_parents = 1, 1784 + .flags = CLK_SET_RATE_PARENT, 1785 + .ops = &clk_branch2_ops, 1786 + }, 1787 + }, 1788 + }; 1789 + 1790 + static struct clk_branch camcc_ife_0_axi_clk = { 1791 + .halt_reg = 0xa080, 1792 + .halt_check = BRANCH_HALT, 1793 + .clkr = { 1794 + .enable_reg = 0xa080, 1795 + .enable_mask = BIT(0), 1796 + .hw.init = &(struct clk_init_data){ 1797 + .name = "camcc_ife_0_axi_clk", 1798 + .parent_hws = (const struct clk_hw*[]){ 1799 + &camcc_camnoc_axi_clk_src.clkr.hw, 1800 + }, 1801 + .num_parents = 1, 1802 + .flags = CLK_SET_RATE_PARENT, 1803 + .ops = &clk_branch2_ops, 1804 + }, 1805 + }, 1806 + }; 1807 + 1808 + static struct clk_branch camcc_ife_0_clk = { 1809 + .halt_reg = 0xa028, 1810 + .halt_check = BRANCH_HALT, 1811 + .clkr = { 1812 + .enable_reg = 0xa028, 1813 + .enable_mask = BIT(0), 1814 + .hw.init = &(struct clk_init_data){ 1815 + .name = "camcc_ife_0_clk", 1816 + .parent_hws = (const struct clk_hw*[]){ 1817 + &camcc_ife_0_clk_src.clkr.hw, 1818 + }, 1819 + .num_parents = 1, 1820 + .flags = CLK_SET_RATE_PARENT, 1821 + .ops = &clk_branch2_ops, 1822 + }, 1823 + }, 1824 + }; 1825 + 1826 + static struct clk_branch camcc_ife_0_cphy_rx_clk = { 1827 + .halt_reg = 0xa07c, 1828 + .halt_check = BRANCH_HALT, 1829 + .clkr = { 1830 + .enable_reg = 0xa07c, 1831 + .enable_mask = BIT(0), 1832 + .hw.init = &(struct clk_init_data){ 1833 + .name = "camcc_ife_0_cphy_rx_clk", 1834 + .parent_hws = (const struct clk_hw*[]){ 1835 + &camcc_cphy_rx_clk_src.clkr.hw, 1836 + }, 1837 + .num_parents = 1, 1838 + .flags = CLK_SET_RATE_PARENT, 1839 + .ops = &clk_branch2_ops, 1840 + }, 1841 + }, 1842 + }; 1843 + 1844 + static struct clk_branch camcc_ife_0_csid_clk = { 1845 + .halt_reg = 0xa054, 1846 + .halt_check = BRANCH_HALT, 1847 + .clkr = { 1848 + .enable_reg = 0xa054, 1849 + .enable_mask = BIT(0), 1850 + .hw.init = &(struct clk_init_data){ 1851 + .name = "camcc_ife_0_csid_clk", 1852 + .parent_hws = (const struct clk_hw*[]){ 1853 + &camcc_ife_0_csid_clk_src.clkr.hw, 1854 + }, 1855 + .num_parents = 1, 1856 + .flags = CLK_SET_RATE_PARENT, 1857 + .ops = &clk_branch2_ops, 1858 + }, 1859 + }, 1860 + }; 1861 + 1862 + static struct clk_branch camcc_ife_0_dsp_clk = { 1863 + .halt_reg = 0xa038, 1864 + .halt_check = BRANCH_HALT, 1865 + .clkr = { 1866 + .enable_reg = 0xa038, 1867 + .enable_mask = BIT(0), 1868 + .hw.init = &(struct clk_init_data){ 1869 + .name = "camcc_ife_0_dsp_clk", 1870 + .parent_hws = (const struct clk_hw*[]){ 1871 + &camcc_ife_0_clk_src.clkr.hw, 1872 + }, 1873 + .num_parents = 1, 1874 + .flags = CLK_SET_RATE_PARENT, 1875 + .ops = &clk_branch2_ops, 1876 + }, 1877 + }, 1878 + }; 1879 + 1880 + static struct clk_branch camcc_ife_1_axi_clk = { 1881 + .halt_reg = 0xb068, 1882 + .halt_check = BRANCH_HALT, 1883 + .clkr = { 1884 + .enable_reg = 0xb068, 1885 + .enable_mask = BIT(0), 1886 + .hw.init = &(struct clk_init_data){ 1887 + .name = "camcc_ife_1_axi_clk", 1888 + .parent_hws = (const struct clk_hw*[]){ 1889 + &camcc_camnoc_axi_clk_src.clkr.hw, 1890 + }, 1891 + .num_parents = 1, 1892 + .flags = CLK_SET_RATE_PARENT, 1893 + .ops = &clk_branch2_ops, 1894 + }, 1895 + }, 1896 + }; 1897 + 1898 + static struct clk_branch camcc_ife_1_clk = { 1899 + .halt_reg = 0xb028, 1900 + .halt_check = BRANCH_HALT, 1901 + .clkr = { 1902 + .enable_reg = 0xb028, 1903 + .enable_mask = BIT(0), 1904 + .hw.init = &(struct clk_init_data){ 1905 + .name = "camcc_ife_1_clk", 1906 + .parent_hws = (const struct clk_hw*[]){ 1907 + &camcc_ife_1_clk_src.clkr.hw, 1908 + }, 1909 + .num_parents = 1, 1910 + .flags = CLK_SET_RATE_PARENT, 1911 + .ops = &clk_branch2_ops, 1912 + }, 1913 + }, 1914 + }; 1915 + 1916 + static struct clk_branch camcc_ife_1_cphy_rx_clk = { 1917 + .halt_reg = 0xb064, 1918 + .halt_check = BRANCH_HALT, 1919 + .clkr = { 1920 + .enable_reg = 0xb064, 1921 + .enable_mask = BIT(0), 1922 + .hw.init = &(struct clk_init_data){ 1923 + .name = "camcc_ife_1_cphy_rx_clk", 1924 + .parent_hws = (const struct clk_hw*[]){ 1925 + &camcc_cphy_rx_clk_src.clkr.hw, 1926 + }, 1927 + .num_parents = 1, 1928 + .flags = CLK_SET_RATE_PARENT, 1929 + .ops = &clk_branch2_ops, 1930 + }, 1931 + }, 1932 + }; 1933 + 1934 + static struct clk_branch camcc_ife_1_csid_clk = { 1935 + .halt_reg = 0xb054, 1936 + .halt_check = BRANCH_HALT, 1937 + .clkr = { 1938 + .enable_reg = 0xb054, 1939 + .enable_mask = BIT(0), 1940 + .hw.init = &(struct clk_init_data){ 1941 + .name = "camcc_ife_1_csid_clk", 1942 + .parent_hws = (const struct clk_hw*[]){ 1943 + &camcc_ife_1_csid_clk_src.clkr.hw, 1944 + }, 1945 + .num_parents = 1, 1946 + .flags = CLK_SET_RATE_PARENT, 1947 + .ops = &clk_branch2_ops, 1948 + }, 1949 + }, 1950 + }; 1951 + 1952 + static struct clk_branch camcc_ife_1_dsp_clk = { 1953 + .halt_reg = 0xb038, 1954 + .halt_check = BRANCH_HALT, 1955 + .clkr = { 1956 + .enable_reg = 0xb038, 1957 + .enable_mask = BIT(0), 1958 + .hw.init = &(struct clk_init_data){ 1959 + .name = "camcc_ife_1_dsp_clk", 1960 + .parent_hws = (const struct clk_hw*[]){ 1961 + &camcc_ife_1_clk_src.clkr.hw, 1962 + }, 1963 + .num_parents = 1, 1964 + .flags = CLK_SET_RATE_PARENT, 1965 + .ops = &clk_branch2_ops, 1966 + }, 1967 + }, 1968 + }; 1969 + 1970 + static struct clk_branch camcc_ife_2_axi_clk = { 1971 + .halt_reg = 0xf068, 1972 + .halt_check = BRANCH_HALT, 1973 + .clkr = { 1974 + .enable_reg = 0xf068, 1975 + .enable_mask = BIT(0), 1976 + .hw.init = &(struct clk_init_data){ 1977 + .name = "camcc_ife_2_axi_clk", 1978 + .parent_hws = (const struct clk_hw*[]){ 1979 + &camcc_camnoc_axi_clk_src.clkr.hw, 1980 + }, 1981 + .num_parents = 1, 1982 + .flags = CLK_SET_RATE_PARENT, 1983 + .ops = &clk_branch2_ops, 1984 + }, 1985 + }, 1986 + }; 1987 + 1988 + static struct clk_branch camcc_ife_2_clk = { 1989 + .halt_reg = 0xf028, 1990 + .halt_check = BRANCH_HALT, 1991 + .clkr = { 1992 + .enable_reg = 0xf028, 1993 + .enable_mask = BIT(0), 1994 + .hw.init = &(struct clk_init_data){ 1995 + .name = "camcc_ife_2_clk", 1996 + .parent_hws = (const struct clk_hw*[]){ 1997 + &camcc_ife_2_clk_src.clkr.hw, 1998 + }, 1999 + .num_parents = 1, 2000 + .flags = CLK_SET_RATE_PARENT, 2001 + .ops = &clk_branch2_ops, 2002 + }, 2003 + }, 2004 + }; 2005 + 2006 + static struct clk_branch camcc_ife_2_cphy_rx_clk = { 2007 + .halt_reg = 0xf064, 2008 + .halt_check = BRANCH_HALT, 2009 + .clkr = { 2010 + .enable_reg = 0xf064, 2011 + .enable_mask = BIT(0), 2012 + .hw.init = &(struct clk_init_data){ 2013 + .name = "camcc_ife_2_cphy_rx_clk", 2014 + .parent_hws = (const struct clk_hw*[]){ 2015 + &camcc_cphy_rx_clk_src.clkr.hw, 2016 + }, 2017 + .num_parents = 1, 2018 + .flags = CLK_SET_RATE_PARENT, 2019 + .ops = &clk_branch2_ops, 2020 + }, 2021 + }, 2022 + }; 2023 + 2024 + static struct clk_branch camcc_ife_2_csid_clk = { 2025 + .halt_reg = 0xf054, 2026 + .halt_check = BRANCH_HALT, 2027 + .clkr = { 2028 + .enable_reg = 0xf054, 2029 + .enable_mask = BIT(0), 2030 + .hw.init = &(struct clk_init_data){ 2031 + .name = "camcc_ife_2_csid_clk", 2032 + .parent_hws = (const struct clk_hw*[]){ 2033 + &camcc_ife_2_csid_clk_src.clkr.hw, 2034 + }, 2035 + .num_parents = 1, 2036 + .flags = CLK_SET_RATE_PARENT, 2037 + .ops = &clk_branch2_ops, 2038 + }, 2039 + }, 2040 + }; 2041 + 2042 + static struct clk_branch camcc_ife_2_dsp_clk = { 2043 + .halt_reg = 0xf038, 2044 + .halt_check = BRANCH_HALT, 2045 + .clkr = { 2046 + .enable_reg = 0xf038, 2047 + .enable_mask = BIT(0), 2048 + .hw.init = &(struct clk_init_data){ 2049 + .name = "camcc_ife_2_dsp_clk", 2050 + .parent_hws = (const struct clk_hw*[]){ 2051 + &camcc_ife_2_clk_src.clkr.hw, 2052 + }, 2053 + .num_parents = 1, 2054 + .flags = CLK_SET_RATE_PARENT, 2055 + .ops = &clk_branch2_ops, 2056 + }, 2057 + }, 2058 + }; 2059 + 2060 + static struct clk_branch camcc_ife_3_axi_clk = { 2061 + .halt_reg = 0xf0d4, 2062 + .halt_check = BRANCH_HALT, 2063 + .clkr = { 2064 + .enable_reg = 0xf0d4, 2065 + .enable_mask = BIT(0), 2066 + .hw.init = &(struct clk_init_data){ 2067 + .name = "camcc_ife_3_axi_clk", 2068 + .parent_hws = (const struct clk_hw*[]){ 2069 + &camcc_camnoc_axi_clk_src.clkr.hw, 2070 + }, 2071 + .num_parents = 1, 2072 + .flags = CLK_SET_RATE_PARENT, 2073 + .ops = &clk_branch2_ops, 2074 + }, 2075 + }, 2076 + }; 2077 + 2078 + static struct clk_branch camcc_ife_3_clk = { 2079 + .halt_reg = 0xf094, 2080 + .halt_check = BRANCH_HALT, 2081 + .clkr = { 2082 + .enable_reg = 0xf094, 2083 + .enable_mask = BIT(0), 2084 + .hw.init = &(struct clk_init_data){ 2085 + .name = "camcc_ife_3_clk", 2086 + .parent_hws = (const struct clk_hw*[]){ 2087 + &camcc_ife_3_clk_src.clkr.hw, 2088 + }, 2089 + .num_parents = 1, 2090 + .flags = CLK_SET_RATE_PARENT, 2091 + .ops = &clk_branch2_ops, 2092 + }, 2093 + }, 2094 + }; 2095 + 2096 + static struct clk_branch camcc_ife_3_cphy_rx_clk = { 2097 + .halt_reg = 0xf0d0, 2098 + .halt_check = BRANCH_HALT, 2099 + .clkr = { 2100 + .enable_reg = 0xf0d0, 2101 + .enable_mask = BIT(0), 2102 + .hw.init = &(struct clk_init_data){ 2103 + .name = "camcc_ife_3_cphy_rx_clk", 2104 + .parent_hws = (const struct clk_hw*[]){ 2105 + &camcc_cphy_rx_clk_src.clkr.hw, 2106 + }, 2107 + .num_parents = 1, 2108 + .flags = CLK_SET_RATE_PARENT, 2109 + .ops = &clk_branch2_ops, 2110 + }, 2111 + }, 2112 + }; 2113 + 2114 + static struct clk_branch camcc_ife_3_csid_clk = { 2115 + .halt_reg = 0xf0c0, 2116 + .halt_check = BRANCH_HALT, 2117 + .clkr = { 2118 + .enable_reg = 0xf0c0, 2119 + .enable_mask = BIT(0), 2120 + .hw.init = &(struct clk_init_data){ 2121 + .name = "camcc_ife_3_csid_clk", 2122 + .parent_hws = (const struct clk_hw*[]){ 2123 + &camcc_ife_3_csid_clk_src.clkr.hw, 2124 + }, 2125 + .num_parents = 1, 2126 + .flags = CLK_SET_RATE_PARENT, 2127 + .ops = &clk_branch2_ops, 2128 + }, 2129 + }, 2130 + }; 2131 + 2132 + static struct clk_branch camcc_ife_3_dsp_clk = { 2133 + .halt_reg = 0xf0a4, 2134 + .halt_check = BRANCH_HALT, 2135 + .clkr = { 2136 + .enable_reg = 0xf0a4, 2137 + .enable_mask = BIT(0), 2138 + .hw.init = &(struct clk_init_data){ 2139 + .name = "camcc_ife_3_dsp_clk", 2140 + .parent_hws = (const struct clk_hw*[]){ 2141 + &camcc_ife_3_clk_src.clkr.hw, 2142 + }, 2143 + .num_parents = 1, 2144 + .flags = CLK_SET_RATE_PARENT, 2145 + .ops = &clk_branch2_ops, 2146 + }, 2147 + }, 2148 + }; 2149 + 2150 + static struct clk_branch camcc_ife_lite_0_clk = { 2151 + .halt_reg = 0xc01c, 2152 + .halt_check = BRANCH_HALT, 2153 + .clkr = { 2154 + .enable_reg = 0xc01c, 2155 + .enable_mask = BIT(0), 2156 + .hw.init = &(struct clk_init_data){ 2157 + .name = "camcc_ife_lite_0_clk", 2158 + .parent_hws = (const struct clk_hw*[]){ 2159 + &camcc_ife_lite_0_clk_src.clkr.hw, 2160 + }, 2161 + .num_parents = 1, 2162 + .flags = CLK_SET_RATE_PARENT, 2163 + .ops = &clk_branch2_ops, 2164 + }, 2165 + }, 2166 + }; 2167 + 2168 + static struct clk_branch camcc_ife_lite_0_cphy_rx_clk = { 2169 + .halt_reg = 0xc040, 2170 + .halt_check = BRANCH_HALT, 2171 + .clkr = { 2172 + .enable_reg = 0xc040, 2173 + .enable_mask = BIT(0), 2174 + .hw.init = &(struct clk_init_data){ 2175 + .name = "camcc_ife_lite_0_cphy_rx_clk", 2176 + .parent_hws = (const struct clk_hw*[]){ 2177 + &camcc_cphy_rx_clk_src.clkr.hw, 2178 + }, 2179 + .num_parents = 1, 2180 + .flags = CLK_SET_RATE_PARENT, 2181 + .ops = &clk_branch2_ops, 2182 + }, 2183 + }, 2184 + }; 2185 + 2186 + static struct clk_branch camcc_ife_lite_0_csid_clk = { 2187 + .halt_reg = 0xc038, 2188 + .halt_check = BRANCH_HALT, 2189 + .clkr = { 2190 + .enable_reg = 0xc038, 2191 + .enable_mask = BIT(0), 2192 + .hw.init = &(struct clk_init_data){ 2193 + .name = "camcc_ife_lite_0_csid_clk", 2194 + .parent_hws = (const struct clk_hw*[]){ 2195 + &camcc_ife_lite_0_csid_clk_src.clkr.hw, 2196 + }, 2197 + .num_parents = 1, 2198 + .flags = CLK_SET_RATE_PARENT, 2199 + .ops = &clk_branch2_ops, 2200 + }, 2201 + }, 2202 + }; 2203 + 2204 + static struct clk_branch camcc_ife_lite_1_clk = { 2205 + .halt_reg = 0xc060, 2206 + .halt_check = BRANCH_HALT, 2207 + .clkr = { 2208 + .enable_reg = 0xc060, 2209 + .enable_mask = BIT(0), 2210 + .hw.init = &(struct clk_init_data){ 2211 + .name = "camcc_ife_lite_1_clk", 2212 + .parent_hws = (const struct clk_hw*[]){ 2213 + &camcc_ife_lite_1_clk_src.clkr.hw, 2214 + }, 2215 + .num_parents = 1, 2216 + .flags = CLK_SET_RATE_PARENT, 2217 + .ops = &clk_branch2_ops, 2218 + }, 2219 + }, 2220 + }; 2221 + 2222 + static struct clk_branch camcc_ife_lite_1_cphy_rx_clk = { 2223 + .halt_reg = 0xc084, 2224 + .halt_check = BRANCH_HALT, 2225 + .clkr = { 2226 + .enable_reg = 0xc084, 2227 + .enable_mask = BIT(0), 2228 + .hw.init = &(struct clk_init_data){ 2229 + .name = "camcc_ife_lite_1_cphy_rx_clk", 2230 + .parent_hws = (const struct clk_hw*[]){ 2231 + &camcc_cphy_rx_clk_src.clkr.hw, 2232 + }, 2233 + .num_parents = 1, 2234 + .flags = CLK_SET_RATE_PARENT, 2235 + .ops = &clk_branch2_ops, 2236 + }, 2237 + }, 2238 + }; 2239 + 2240 + static struct clk_branch camcc_ife_lite_1_csid_clk = { 2241 + .halt_reg = 0xc07c, 2242 + .halt_check = BRANCH_HALT, 2243 + .clkr = { 2244 + .enable_reg = 0xc07c, 2245 + .enable_mask = BIT(0), 2246 + .hw.init = &(struct clk_init_data){ 2247 + .name = "camcc_ife_lite_1_csid_clk", 2248 + .parent_hws = (const struct clk_hw*[]){ 2249 + &camcc_ife_lite_1_csid_clk_src.clkr.hw, 2250 + }, 2251 + .num_parents = 1, 2252 + .flags = CLK_SET_RATE_PARENT, 2253 + .ops = &clk_branch2_ops, 2254 + }, 2255 + }, 2256 + }; 2257 + 2258 + static struct clk_branch camcc_ife_lite_2_clk = { 2259 + .halt_reg = 0xc258, 2260 + .halt_check = BRANCH_HALT, 2261 + .clkr = { 2262 + .enable_reg = 0xc258, 2263 + .enable_mask = BIT(0), 2264 + .hw.init = &(struct clk_init_data){ 2265 + .name = "camcc_ife_lite_2_clk", 2266 + .parent_hws = (const struct clk_hw*[]){ 2267 + &camcc_ife_lite_2_clk_src.clkr.hw, 2268 + }, 2269 + .num_parents = 1, 2270 + .flags = CLK_SET_RATE_PARENT, 2271 + .ops = &clk_branch2_ops, 2272 + }, 2273 + }, 2274 + }; 2275 + 2276 + static struct clk_branch camcc_ife_lite_2_cphy_rx_clk = { 2277 + .halt_reg = 0xc27c, 2278 + .halt_check = BRANCH_HALT, 2279 + .clkr = { 2280 + .enable_reg = 0xc27c, 2281 + .enable_mask = BIT(0), 2282 + .hw.init = &(struct clk_init_data){ 2283 + .name = "camcc_ife_lite_2_cphy_rx_clk", 2284 + .parent_hws = (const struct clk_hw*[]){ 2285 + &camcc_cphy_rx_clk_src.clkr.hw, 2286 + }, 2287 + .num_parents = 1, 2288 + .flags = CLK_SET_RATE_PARENT, 2289 + .ops = &clk_branch2_ops, 2290 + }, 2291 + }, 2292 + }; 2293 + 2294 + static struct clk_branch camcc_ife_lite_2_csid_clk = { 2295 + .halt_reg = 0xc274, 2296 + .halt_check = BRANCH_HALT, 2297 + .clkr = { 2298 + .enable_reg = 0xc274, 2299 + .enable_mask = BIT(0), 2300 + .hw.init = &(struct clk_init_data){ 2301 + .name = "camcc_ife_lite_2_csid_clk", 2302 + .parent_hws = (const struct clk_hw*[]){ 2303 + &camcc_ife_lite_2_csid_clk_src.clkr.hw, 2304 + }, 2305 + .num_parents = 1, 2306 + .flags = CLK_SET_RATE_PARENT, 2307 + .ops = &clk_branch2_ops, 2308 + }, 2309 + }, 2310 + }; 2311 + 2312 + static struct clk_branch camcc_ife_lite_3_clk = { 2313 + .halt_reg = 0xc29c, 2314 + .halt_check = BRANCH_HALT, 2315 + .clkr = { 2316 + .enable_reg = 0xc29c, 2317 + .enable_mask = BIT(0), 2318 + .hw.init = &(struct clk_init_data){ 2319 + .name = "camcc_ife_lite_3_clk", 2320 + .parent_hws = (const struct clk_hw*[]){ 2321 + &camcc_ife_lite_3_clk_src.clkr.hw, 2322 + }, 2323 + .num_parents = 1, 2324 + .flags = CLK_SET_RATE_PARENT, 2325 + .ops = &clk_branch2_ops, 2326 + }, 2327 + }, 2328 + }; 2329 + 2330 + static struct clk_branch camcc_ife_lite_3_cphy_rx_clk = { 2331 + .halt_reg = 0xc2c0, 2332 + .halt_check = BRANCH_HALT, 2333 + .clkr = { 2334 + .enable_reg = 0xc2c0, 2335 + .enable_mask = BIT(0), 2336 + .hw.init = &(struct clk_init_data){ 2337 + .name = "camcc_ife_lite_3_cphy_rx_clk", 2338 + .parent_hws = (const struct clk_hw*[]){ 2339 + &camcc_cphy_rx_clk_src.clkr.hw, 2340 + }, 2341 + .num_parents = 1, 2342 + .flags = CLK_SET_RATE_PARENT, 2343 + .ops = &clk_branch2_ops, 2344 + }, 2345 + }, 2346 + }; 2347 + 2348 + static struct clk_branch camcc_ife_lite_3_csid_clk = { 2349 + .halt_reg = 0xc2b8, 2350 + .halt_check = BRANCH_HALT, 2351 + .clkr = { 2352 + .enable_reg = 0xc2b8, 2353 + .enable_mask = BIT(0), 2354 + .hw.init = &(struct clk_init_data){ 2355 + .name = "camcc_ife_lite_3_csid_clk", 2356 + .parent_hws = (const struct clk_hw*[]){ 2357 + &camcc_ife_lite_3_csid_clk_src.clkr.hw, 2358 + }, 2359 + .num_parents = 1, 2360 + .flags = CLK_SET_RATE_PARENT, 2361 + .ops = &clk_branch2_ops, 2362 + }, 2363 + }, 2364 + }; 2365 + 2366 + static struct clk_branch camcc_ipe_0_ahb_clk = { 2367 + .halt_reg = 0x8040, 2368 + .halt_check = BRANCH_HALT, 2369 + .clkr = { 2370 + .enable_reg = 0x8040, 2371 + .enable_mask = BIT(0), 2372 + .hw.init = &(struct clk_init_data){ 2373 + .name = "camcc_ipe_0_ahb_clk", 2374 + .parent_hws = (const struct clk_hw*[]){ 2375 + &camcc_slow_ahb_clk_src.clkr.hw, 2376 + }, 2377 + .num_parents = 1, 2378 + .flags = CLK_SET_RATE_PARENT, 2379 + .ops = &clk_branch2_ops, 2380 + }, 2381 + }, 2382 + }; 2383 + 2384 + static struct clk_branch camcc_ipe_0_areg_clk = { 2385 + .halt_reg = 0x803c, 2386 + .halt_check = BRANCH_HALT, 2387 + .clkr = { 2388 + .enable_reg = 0x803c, 2389 + .enable_mask = BIT(0), 2390 + .hw.init = &(struct clk_init_data){ 2391 + .name = "camcc_ipe_0_areg_clk", 2392 + .parent_hws = (const struct clk_hw*[]){ 2393 + &camcc_fast_ahb_clk_src.clkr.hw, 2394 + }, 2395 + .num_parents = 1, 2396 + .flags = CLK_SET_RATE_PARENT, 2397 + .ops = &clk_branch2_ops, 2398 + }, 2399 + }, 2400 + }; 2401 + 2402 + static struct clk_branch camcc_ipe_0_axi_clk = { 2403 + .halt_reg = 0x8038, 2404 + .halt_check = BRANCH_HALT, 2405 + .clkr = { 2406 + .enable_reg = 0x8038, 2407 + .enable_mask = BIT(0), 2408 + .hw.init = &(struct clk_init_data){ 2409 + .name = "camcc_ipe_0_axi_clk", 2410 + .parent_hws = (const struct clk_hw*[]){ 2411 + &camcc_camnoc_axi_clk_src.clkr.hw, 2412 + }, 2413 + .num_parents = 1, 2414 + .flags = CLK_SET_RATE_PARENT, 2415 + .ops = &clk_branch2_ops, 2416 + }, 2417 + }, 2418 + }; 2419 + 2420 + static struct clk_branch camcc_ipe_0_clk = { 2421 + .halt_reg = 0x8028, 2422 + .halt_check = BRANCH_HALT, 2423 + .clkr = { 2424 + .enable_reg = 0x8028, 2425 + .enable_mask = BIT(0), 2426 + .hw.init = &(struct clk_init_data){ 2427 + .name = "camcc_ipe_0_clk", 2428 + .parent_hws = (const struct clk_hw*[]){ 2429 + &camcc_ipe_0_clk_src.clkr.hw, 2430 + }, 2431 + .num_parents = 1, 2432 + .flags = CLK_SET_RATE_PARENT, 2433 + .ops = &clk_branch2_ops, 2434 + }, 2435 + }, 2436 + }; 2437 + 2438 + static struct clk_branch camcc_ipe_1_ahb_clk = { 2439 + .halt_reg = 0x9028, 2440 + .halt_check = BRANCH_HALT, 2441 + .clkr = { 2442 + .enable_reg = 0x9028, 2443 + .enable_mask = BIT(0), 2444 + .hw.init = &(struct clk_init_data){ 2445 + .name = "camcc_ipe_1_ahb_clk", 2446 + .parent_hws = (const struct clk_hw*[]){ 2447 + &camcc_slow_ahb_clk_src.clkr.hw, 2448 + }, 2449 + .num_parents = 1, 2450 + .flags = CLK_SET_RATE_PARENT, 2451 + .ops = &clk_branch2_ops, 2452 + }, 2453 + }, 2454 + }; 2455 + 2456 + static struct clk_branch camcc_ipe_1_areg_clk = { 2457 + .halt_reg = 0x9024, 2458 + .halt_check = BRANCH_HALT, 2459 + .clkr = { 2460 + .enable_reg = 0x9024, 2461 + .enable_mask = BIT(0), 2462 + .hw.init = &(struct clk_init_data){ 2463 + .name = "camcc_ipe_1_areg_clk", 2464 + .parent_hws = (const struct clk_hw*[]){ 2465 + &camcc_fast_ahb_clk_src.clkr.hw, 2466 + }, 2467 + .num_parents = 1, 2468 + .flags = CLK_SET_RATE_PARENT, 2469 + .ops = &clk_branch2_ops, 2470 + }, 2471 + }, 2472 + }; 2473 + 2474 + static struct clk_branch camcc_ipe_1_axi_clk = { 2475 + .halt_reg = 0x9020, 2476 + .halt_check = BRANCH_HALT, 2477 + .clkr = { 2478 + .enable_reg = 0x9020, 2479 + .enable_mask = BIT(0), 2480 + .hw.init = &(struct clk_init_data){ 2481 + .name = "camcc_ipe_1_axi_clk", 2482 + .parent_hws = (const struct clk_hw*[]){ 2483 + &camcc_camnoc_axi_clk_src.clkr.hw, 2484 + }, 2485 + .num_parents = 1, 2486 + .flags = CLK_SET_RATE_PARENT, 2487 + .ops = &clk_branch2_ops, 2488 + }, 2489 + }, 2490 + }; 2491 + 2492 + static struct clk_branch camcc_ipe_1_clk = { 2493 + .halt_reg = 0x9010, 2494 + .halt_check = BRANCH_HALT, 2495 + .clkr = { 2496 + .enable_reg = 0x9010, 2497 + .enable_mask = BIT(0), 2498 + .hw.init = &(struct clk_init_data){ 2499 + .name = "camcc_ipe_1_clk", 2500 + .parent_hws = (const struct clk_hw*[]){ 2501 + &camcc_ipe_0_clk_src.clkr.hw, 2502 + }, 2503 + .num_parents = 1, 2504 + .flags = CLK_SET_RATE_PARENT, 2505 + .ops = &clk_branch2_ops, 2506 + }, 2507 + }, 2508 + }; 2509 + 2510 + static struct clk_branch camcc_jpeg_clk = { 2511 + .halt_reg = 0xc0a4, 2512 + .halt_check = BRANCH_HALT, 2513 + .clkr = { 2514 + .enable_reg = 0xc0a4, 2515 + .enable_mask = BIT(0), 2516 + .hw.init = &(struct clk_init_data){ 2517 + .name = "camcc_jpeg_clk", 2518 + .parent_hws = (const struct clk_hw*[]){ 2519 + &camcc_jpeg_clk_src.clkr.hw, 2520 + }, 2521 + .num_parents = 1, 2522 + .flags = CLK_SET_RATE_PARENT, 2523 + .ops = &clk_branch2_ops, 2524 + }, 2525 + }, 2526 + }; 2527 + 2528 + static struct clk_branch camcc_lrme_clk = { 2529 + .halt_reg = 0xc15c, 2530 + .halt_check = BRANCH_HALT, 2531 + .clkr = { 2532 + .enable_reg = 0xc15c, 2533 + .enable_mask = BIT(0), 2534 + .hw.init = &(struct clk_init_data){ 2535 + .name = "camcc_lrme_clk", 2536 + .parent_hws = (const struct clk_hw*[]){ 2537 + &camcc_lrme_clk_src.clkr.hw, 2538 + }, 2539 + .num_parents = 1, 2540 + .flags = CLK_SET_RATE_PARENT, 2541 + .ops = &clk_branch2_ops, 2542 + }, 2543 + }, 2544 + }; 2545 + 2546 + static struct clk_branch camcc_mclk0_clk = { 2547 + .halt_reg = 0x501c, 2548 + .halt_check = BRANCH_HALT, 2549 + .clkr = { 2550 + .enable_reg = 0x501c, 2551 + .enable_mask = BIT(0), 2552 + .hw.init = &(struct clk_init_data){ 2553 + .name = "camcc_mclk0_clk", 2554 + .parent_hws = (const struct clk_hw*[]){ 2555 + &camcc_mclk0_clk_src.clkr.hw, 2556 + }, 2557 + .num_parents = 1, 2558 + .flags = CLK_SET_RATE_PARENT, 2559 + .ops = &clk_branch2_ops, 2560 + }, 2561 + }, 2562 + }; 2563 + 2564 + static struct clk_branch camcc_mclk1_clk = { 2565 + .halt_reg = 0x503c, 2566 + .halt_check = BRANCH_HALT, 2567 + .clkr = { 2568 + .enable_reg = 0x503c, 2569 + .enable_mask = BIT(0), 2570 + .hw.init = &(struct clk_init_data){ 2571 + .name = "camcc_mclk1_clk", 2572 + .parent_hws = (const struct clk_hw*[]){ 2573 + &camcc_mclk1_clk_src.clkr.hw, 2574 + }, 2575 + .num_parents = 1, 2576 + .flags = CLK_SET_RATE_PARENT, 2577 + .ops = &clk_branch2_ops, 2578 + }, 2579 + }, 2580 + }; 2581 + 2582 + static struct clk_branch camcc_mclk2_clk = { 2583 + .halt_reg = 0x505c, 2584 + .halt_check = BRANCH_HALT, 2585 + .clkr = { 2586 + .enable_reg = 0x505c, 2587 + .enable_mask = BIT(0), 2588 + .hw.init = &(struct clk_init_data){ 2589 + .name = "camcc_mclk2_clk", 2590 + .parent_hws = (const struct clk_hw*[]){ 2591 + &camcc_mclk2_clk_src.clkr.hw, 2592 + }, 2593 + .num_parents = 1, 2594 + .flags = CLK_SET_RATE_PARENT, 2595 + .ops = &clk_branch2_ops, 2596 + }, 2597 + }, 2598 + }; 2599 + 2600 + static struct clk_branch camcc_mclk3_clk = { 2601 + .halt_reg = 0x507c, 2602 + .halt_check = BRANCH_HALT, 2603 + .clkr = { 2604 + .enable_reg = 0x507c, 2605 + .enable_mask = BIT(0), 2606 + .hw.init = &(struct clk_init_data){ 2607 + .name = "camcc_mclk3_clk", 2608 + .parent_hws = (const struct clk_hw*[]){ 2609 + &camcc_mclk3_clk_src.clkr.hw, 2610 + }, 2611 + .num_parents = 1, 2612 + .flags = CLK_SET_RATE_PARENT, 2613 + .ops = &clk_branch2_ops, 2614 + }, 2615 + }, 2616 + }; 2617 + 2618 + static struct clk_branch camcc_mclk4_clk = { 2619 + .halt_reg = 0x509c, 2620 + .halt_check = BRANCH_HALT, 2621 + .clkr = { 2622 + .enable_reg = 0x509c, 2623 + .enable_mask = BIT(0), 2624 + .hw.init = &(struct clk_init_data){ 2625 + .name = "camcc_mclk4_clk", 2626 + .parent_hws = (const struct clk_hw*[]){ 2627 + &camcc_mclk4_clk_src.clkr.hw, 2628 + }, 2629 + .num_parents = 1, 2630 + .flags = CLK_SET_RATE_PARENT, 2631 + .ops = &clk_branch2_ops, 2632 + }, 2633 + }, 2634 + }; 2635 + 2636 + static struct clk_branch camcc_mclk5_clk = { 2637 + .halt_reg = 0x50bc, 2638 + .halt_check = BRANCH_HALT, 2639 + .clkr = { 2640 + .enable_reg = 0x50bc, 2641 + .enable_mask = BIT(0), 2642 + .hw.init = &(struct clk_init_data){ 2643 + .name = "camcc_mclk5_clk", 2644 + .parent_hws = (const struct clk_hw*[]){ 2645 + &camcc_mclk5_clk_src.clkr.hw, 2646 + }, 2647 + .num_parents = 1, 2648 + .flags = CLK_SET_RATE_PARENT, 2649 + .ops = &clk_branch2_ops, 2650 + }, 2651 + }, 2652 + }; 2653 + 2654 + static struct clk_branch camcc_mclk6_clk = { 2655 + .halt_reg = 0x50dc, 2656 + .halt_check = BRANCH_HALT, 2657 + .clkr = { 2658 + .enable_reg = 0x50dc, 2659 + .enable_mask = BIT(0), 2660 + .hw.init = &(struct clk_init_data){ 2661 + .name = "camcc_mclk6_clk", 2662 + .parent_hws = (const struct clk_hw*[]){ 2663 + &camcc_mclk6_clk_src.clkr.hw, 2664 + }, 2665 + .num_parents = 1, 2666 + .flags = CLK_SET_RATE_PARENT, 2667 + .ops = &clk_branch2_ops, 2668 + }, 2669 + }, 2670 + }; 2671 + 2672 + static struct clk_branch camcc_mclk7_clk = { 2673 + .halt_reg = 0x50fc, 2674 + .halt_check = BRANCH_HALT, 2675 + .clkr = { 2676 + .enable_reg = 0x50fc, 2677 + .enable_mask = BIT(0), 2678 + .hw.init = &(struct clk_init_data){ 2679 + .name = "camcc_mclk7_clk", 2680 + .parent_hws = (const struct clk_hw*[]){ 2681 + &camcc_mclk7_clk_src.clkr.hw, 2682 + }, 2683 + .num_parents = 1, 2684 + .flags = CLK_SET_RATE_PARENT, 2685 + .ops = &clk_branch2_ops, 2686 + }, 2687 + }, 2688 + }; 2689 + 2690 + static struct clk_branch camcc_sleep_clk = { 2691 + .halt_reg = 0xc200, 2692 + .halt_check = BRANCH_HALT, 2693 + .clkr = { 2694 + .enable_reg = 0xc200, 2695 + .enable_mask = BIT(0), 2696 + .hw.init = &(struct clk_init_data){ 2697 + .name = "camcc_sleep_clk", 2698 + .parent_hws = (const struct clk_hw*[]){ 2699 + &camcc_sleep_clk_src.clkr.hw, 2700 + }, 2701 + .num_parents = 1, 2702 + .flags = CLK_SET_RATE_PARENT, 2703 + .ops = &clk_branch2_ops, 2704 + }, 2705 + }, 2706 + }; 2707 + 2708 + static struct gdsc titan_top_gdsc; 2709 + 2710 + static struct gdsc bps_gdsc = { 2711 + .gdscr = 0x7004, 2712 + .pd = { 2713 + .name = "bps_gdsc", 2714 + }, 2715 + .flags = HW_CTRL | RETAIN_FF_ENABLE, 2716 + .parent = &titan_top_gdsc.pd, 2717 + .pwrsts = PWRSTS_OFF_ON, 2718 + }; 2719 + 2720 + static struct gdsc ife_0_gdsc = { 2721 + .gdscr = 0xa004, 2722 + .pd = { 2723 + .name = "ife_0_gdsc", 2724 + }, 2725 + .flags = RETAIN_FF_ENABLE, 2726 + .parent = &titan_top_gdsc.pd, 2727 + .pwrsts = PWRSTS_OFF_ON, 2728 + }; 2729 + 2730 + static struct gdsc ife_1_gdsc = { 2731 + .gdscr = 0xb004, 2732 + .pd = { 2733 + .name = "ife_1_gdsc", 2734 + }, 2735 + .flags = RETAIN_FF_ENABLE, 2736 + .parent = &titan_top_gdsc.pd, 2737 + .pwrsts = PWRSTS_OFF_ON, 2738 + }; 2739 + 2740 + static struct gdsc ife_2_gdsc = { 2741 + .gdscr = 0xf004, 2742 + .pd = { 2743 + .name = "ife_2_gdsc", 2744 + }, 2745 + .flags = RETAIN_FF_ENABLE, 2746 + .parent = &titan_top_gdsc.pd, 2747 + .pwrsts = PWRSTS_OFF_ON, 2748 + }; 2749 + 2750 + static struct gdsc ife_3_gdsc = { 2751 + .gdscr = 0xf070, 2752 + .pd = { 2753 + .name = "ife_3_gdsc", 2754 + }, 2755 + .flags = RETAIN_FF_ENABLE, 2756 + .parent = &titan_top_gdsc.pd, 2757 + .pwrsts = PWRSTS_OFF_ON, 2758 + }; 2759 + 2760 + static struct gdsc ipe_0_gdsc = { 2761 + .gdscr = 0x8004, 2762 + .pd = { 2763 + .name = "ipe_0_gdsc", 2764 + }, 2765 + .flags = HW_CTRL | RETAIN_FF_ENABLE, 2766 + .parent = &titan_top_gdsc.pd, 2767 + .pwrsts = PWRSTS_OFF_ON, 2768 + }; 2769 + 2770 + static struct gdsc ipe_1_gdsc = { 2771 + .gdscr = 0x9004, 2772 + .pd = { 2773 + .name = "ipe_1_gdsc", 2774 + }, 2775 + .flags = HW_CTRL | RETAIN_FF_ENABLE, 2776 + .parent = &titan_top_gdsc.pd, 2777 + .pwrsts = PWRSTS_OFF_ON, 2778 + }; 2779 + 2780 + static struct gdsc titan_top_gdsc = { 2781 + .gdscr = 0xc1bc, 2782 + .pd = { 2783 + .name = "titan_top_gdsc", 2784 + }, 2785 + .flags = RETAIN_FF_ENABLE, 2786 + .pwrsts = PWRSTS_OFF_ON, 2787 + }; 2788 + 2789 + static struct clk_regmap *camcc_sc8280xp_clocks[] = { 2790 + [CAMCC_BPS_AHB_CLK] = &camcc_bps_ahb_clk.clkr, 2791 + [CAMCC_BPS_AREG_CLK] = &camcc_bps_areg_clk.clkr, 2792 + [CAMCC_BPS_AXI_CLK] = &camcc_bps_axi_clk.clkr, 2793 + [CAMCC_BPS_CLK] = &camcc_bps_clk.clkr, 2794 + [CAMCC_BPS_CLK_SRC] = &camcc_bps_clk_src.clkr, 2795 + [CAMCC_CAMNOC_AXI_CLK] = &camcc_camnoc_axi_clk.clkr, 2796 + [CAMCC_CAMNOC_AXI_CLK_SRC] = &camcc_camnoc_axi_clk_src.clkr, 2797 + [CAMCC_CAMNOC_DCD_XO_CLK] = &camcc_camnoc_dcd_xo_clk.clkr, 2798 + [CAMCC_CCI_0_CLK] = &camcc_cci_0_clk.clkr, 2799 + [CAMCC_CCI_0_CLK_SRC] = &camcc_cci_0_clk_src.clkr, 2800 + [CAMCC_CCI_1_CLK] = &camcc_cci_1_clk.clkr, 2801 + [CAMCC_CCI_1_CLK_SRC] = &camcc_cci_1_clk_src.clkr, 2802 + [CAMCC_CCI_2_CLK] = &camcc_cci_2_clk.clkr, 2803 + [CAMCC_CCI_2_CLK_SRC] = &camcc_cci_2_clk_src.clkr, 2804 + [CAMCC_CCI_3_CLK] = &camcc_cci_3_clk.clkr, 2805 + [CAMCC_CCI_3_CLK_SRC] = &camcc_cci_3_clk_src.clkr, 2806 + [CAMCC_CORE_AHB_CLK] = &camcc_core_ahb_clk.clkr, 2807 + [CAMCC_CPAS_AHB_CLK] = &camcc_cpas_ahb_clk.clkr, 2808 + [CAMCC_CPHY_RX_CLK_SRC] = &camcc_cphy_rx_clk_src.clkr, 2809 + [CAMCC_CSI0PHYTIMER_CLK] = &camcc_csi0phytimer_clk.clkr, 2810 + [CAMCC_CSI0PHYTIMER_CLK_SRC] = &camcc_csi0phytimer_clk_src.clkr, 2811 + [CAMCC_CSI1PHYTIMER_CLK] = &camcc_csi1phytimer_clk.clkr, 2812 + [CAMCC_CSI1PHYTIMER_CLK_SRC] = &camcc_csi1phytimer_clk_src.clkr, 2813 + [CAMCC_CSI2PHYTIMER_CLK] = &camcc_csi2phytimer_clk.clkr, 2814 + [CAMCC_CSI2PHYTIMER_CLK_SRC] = &camcc_csi2phytimer_clk_src.clkr, 2815 + [CAMCC_CSI3PHYTIMER_CLK] = &camcc_csi3phytimer_clk.clkr, 2816 + [CAMCC_CSI3PHYTIMER_CLK_SRC] = &camcc_csi3phytimer_clk_src.clkr, 2817 + [CAMCC_CSIPHY0_CLK] = &camcc_csiphy0_clk.clkr, 2818 + [CAMCC_CSIPHY1_CLK] = &camcc_csiphy1_clk.clkr, 2819 + [CAMCC_CSIPHY2_CLK] = &camcc_csiphy2_clk.clkr, 2820 + [CAMCC_CSIPHY3_CLK] = &camcc_csiphy3_clk.clkr, 2821 + [CAMCC_FAST_AHB_CLK_SRC] = &camcc_fast_ahb_clk_src.clkr, 2822 + [CAMCC_GDSC_CLK] = &camcc_gdsc_clk.clkr, 2823 + [CAMCC_ICP_AHB_CLK] = &camcc_icp_ahb_clk.clkr, 2824 + [CAMCC_ICP_CLK] = &camcc_icp_clk.clkr, 2825 + [CAMCC_ICP_CLK_SRC] = &camcc_icp_clk_src.clkr, 2826 + [CAMCC_IFE_0_AXI_CLK] = &camcc_ife_0_axi_clk.clkr, 2827 + [CAMCC_IFE_0_CLK] = &camcc_ife_0_clk.clkr, 2828 + [CAMCC_IFE_0_CLK_SRC] = &camcc_ife_0_clk_src.clkr, 2829 + [CAMCC_IFE_0_CPHY_RX_CLK] = &camcc_ife_0_cphy_rx_clk.clkr, 2830 + [CAMCC_IFE_0_CSID_CLK] = &camcc_ife_0_csid_clk.clkr, 2831 + [CAMCC_IFE_0_CSID_CLK_SRC] = &camcc_ife_0_csid_clk_src.clkr, 2832 + [CAMCC_IFE_0_DSP_CLK] = &camcc_ife_0_dsp_clk.clkr, 2833 + [CAMCC_IFE_1_AXI_CLK] = &camcc_ife_1_axi_clk.clkr, 2834 + [CAMCC_IFE_1_CLK] = &camcc_ife_1_clk.clkr, 2835 + [CAMCC_IFE_1_CLK_SRC] = &camcc_ife_1_clk_src.clkr, 2836 + [CAMCC_IFE_1_CPHY_RX_CLK] = &camcc_ife_1_cphy_rx_clk.clkr, 2837 + [CAMCC_IFE_1_CSID_CLK] = &camcc_ife_1_csid_clk.clkr, 2838 + [CAMCC_IFE_1_CSID_CLK_SRC] = &camcc_ife_1_csid_clk_src.clkr, 2839 + [CAMCC_IFE_1_DSP_CLK] = &camcc_ife_1_dsp_clk.clkr, 2840 + [CAMCC_IFE_2_AXI_CLK] = &camcc_ife_2_axi_clk.clkr, 2841 + [CAMCC_IFE_2_CLK] = &camcc_ife_2_clk.clkr, 2842 + [CAMCC_IFE_2_CLK_SRC] = &camcc_ife_2_clk_src.clkr, 2843 + [CAMCC_IFE_2_CPHY_RX_CLK] = &camcc_ife_2_cphy_rx_clk.clkr, 2844 + [CAMCC_IFE_2_CSID_CLK] = &camcc_ife_2_csid_clk.clkr, 2845 + [CAMCC_IFE_2_CSID_CLK_SRC] = &camcc_ife_2_csid_clk_src.clkr, 2846 + [CAMCC_IFE_2_DSP_CLK] = &camcc_ife_2_dsp_clk.clkr, 2847 + [CAMCC_IFE_3_AXI_CLK] = &camcc_ife_3_axi_clk.clkr, 2848 + [CAMCC_IFE_3_CLK] = &camcc_ife_3_clk.clkr, 2849 + [CAMCC_IFE_3_CLK_SRC] = &camcc_ife_3_clk_src.clkr, 2850 + [CAMCC_IFE_3_CPHY_RX_CLK] = &camcc_ife_3_cphy_rx_clk.clkr, 2851 + [CAMCC_IFE_3_CSID_CLK] = &camcc_ife_3_csid_clk.clkr, 2852 + [CAMCC_IFE_3_CSID_CLK_SRC] = &camcc_ife_3_csid_clk_src.clkr, 2853 + [CAMCC_IFE_3_DSP_CLK] = &camcc_ife_3_dsp_clk.clkr, 2854 + [CAMCC_IFE_LITE_0_CLK] = &camcc_ife_lite_0_clk.clkr, 2855 + [CAMCC_IFE_LITE_0_CLK_SRC] = &camcc_ife_lite_0_clk_src.clkr, 2856 + [CAMCC_IFE_LITE_0_CPHY_RX_CLK] = &camcc_ife_lite_0_cphy_rx_clk.clkr, 2857 + [CAMCC_IFE_LITE_0_CSID_CLK] = &camcc_ife_lite_0_csid_clk.clkr, 2858 + [CAMCC_IFE_LITE_0_CSID_CLK_SRC] = &camcc_ife_lite_0_csid_clk_src.clkr, 2859 + [CAMCC_IFE_LITE_1_CLK] = &camcc_ife_lite_1_clk.clkr, 2860 + [CAMCC_IFE_LITE_1_CLK_SRC] = &camcc_ife_lite_1_clk_src.clkr, 2861 + [CAMCC_IFE_LITE_1_CPHY_RX_CLK] = &camcc_ife_lite_1_cphy_rx_clk.clkr, 2862 + [CAMCC_IFE_LITE_1_CSID_CLK] = &camcc_ife_lite_1_csid_clk.clkr, 2863 + [CAMCC_IFE_LITE_1_CSID_CLK_SRC] = &camcc_ife_lite_1_csid_clk_src.clkr, 2864 + [CAMCC_IFE_LITE_2_CLK] = &camcc_ife_lite_2_clk.clkr, 2865 + [CAMCC_IFE_LITE_2_CLK_SRC] = &camcc_ife_lite_2_clk_src.clkr, 2866 + [CAMCC_IFE_LITE_2_CPHY_RX_CLK] = &camcc_ife_lite_2_cphy_rx_clk.clkr, 2867 + [CAMCC_IFE_LITE_2_CSID_CLK] = &camcc_ife_lite_2_csid_clk.clkr, 2868 + [CAMCC_IFE_LITE_2_CSID_CLK_SRC] = &camcc_ife_lite_2_csid_clk_src.clkr, 2869 + [CAMCC_IFE_LITE_3_CLK] = &camcc_ife_lite_3_clk.clkr, 2870 + [CAMCC_IFE_LITE_3_CLK_SRC] = &camcc_ife_lite_3_clk_src.clkr, 2871 + [CAMCC_IFE_LITE_3_CPHY_RX_CLK] = &camcc_ife_lite_3_cphy_rx_clk.clkr, 2872 + [CAMCC_IFE_LITE_3_CSID_CLK] = &camcc_ife_lite_3_csid_clk.clkr, 2873 + [CAMCC_IFE_LITE_3_CSID_CLK_SRC] = &camcc_ife_lite_3_csid_clk_src.clkr, 2874 + [CAMCC_IPE_0_AHB_CLK] = &camcc_ipe_0_ahb_clk.clkr, 2875 + [CAMCC_IPE_0_AREG_CLK] = &camcc_ipe_0_areg_clk.clkr, 2876 + [CAMCC_IPE_0_AXI_CLK] = &camcc_ipe_0_axi_clk.clkr, 2877 + [CAMCC_IPE_0_CLK] = &camcc_ipe_0_clk.clkr, 2878 + [CAMCC_IPE_0_CLK_SRC] = &camcc_ipe_0_clk_src.clkr, 2879 + [CAMCC_IPE_1_AHB_CLK] = &camcc_ipe_1_ahb_clk.clkr, 2880 + [CAMCC_IPE_1_AREG_CLK] = &camcc_ipe_1_areg_clk.clkr, 2881 + [CAMCC_IPE_1_AXI_CLK] = &camcc_ipe_1_axi_clk.clkr, 2882 + [CAMCC_IPE_1_CLK] = &camcc_ipe_1_clk.clkr, 2883 + [CAMCC_JPEG_CLK] = &camcc_jpeg_clk.clkr, 2884 + [CAMCC_JPEG_CLK_SRC] = &camcc_jpeg_clk_src.clkr, 2885 + [CAMCC_LRME_CLK] = &camcc_lrme_clk.clkr, 2886 + [CAMCC_LRME_CLK_SRC] = &camcc_lrme_clk_src.clkr, 2887 + [CAMCC_MCLK0_CLK] = &camcc_mclk0_clk.clkr, 2888 + [CAMCC_MCLK0_CLK_SRC] = &camcc_mclk0_clk_src.clkr, 2889 + [CAMCC_MCLK1_CLK] = &camcc_mclk1_clk.clkr, 2890 + [CAMCC_MCLK1_CLK_SRC] = &camcc_mclk1_clk_src.clkr, 2891 + [CAMCC_MCLK2_CLK] = &camcc_mclk2_clk.clkr, 2892 + [CAMCC_MCLK2_CLK_SRC] = &camcc_mclk2_clk_src.clkr, 2893 + [CAMCC_MCLK3_CLK] = &camcc_mclk3_clk.clkr, 2894 + [CAMCC_MCLK3_CLK_SRC] = &camcc_mclk3_clk_src.clkr, 2895 + [CAMCC_MCLK4_CLK] = &camcc_mclk4_clk.clkr, 2896 + [CAMCC_MCLK4_CLK_SRC] = &camcc_mclk4_clk_src.clkr, 2897 + [CAMCC_MCLK5_CLK] = &camcc_mclk5_clk.clkr, 2898 + [CAMCC_MCLK5_CLK_SRC] = &camcc_mclk5_clk_src.clkr, 2899 + [CAMCC_MCLK6_CLK] = &camcc_mclk6_clk.clkr, 2900 + [CAMCC_MCLK6_CLK_SRC] = &camcc_mclk6_clk_src.clkr, 2901 + [CAMCC_MCLK7_CLK] = &camcc_mclk7_clk.clkr, 2902 + [CAMCC_MCLK7_CLK_SRC] = &camcc_mclk7_clk_src.clkr, 2903 + [CAMCC_PLL0] = &camcc_pll0.clkr, 2904 + [CAMCC_PLL0_OUT_EVEN] = &camcc_pll0_out_even.clkr, 2905 + [CAMCC_PLL0_OUT_ODD] = &camcc_pll0_out_odd.clkr, 2906 + [CAMCC_PLL1] = &camcc_pll1.clkr, 2907 + [CAMCC_PLL1_OUT_EVEN] = &camcc_pll1_out_even.clkr, 2908 + [CAMCC_PLL2] = &camcc_pll2.clkr, 2909 + [CAMCC_PLL3] = &camcc_pll3.clkr, 2910 + [CAMCC_PLL3_OUT_EVEN] = &camcc_pll3_out_even.clkr, 2911 + [CAMCC_PLL4] = &camcc_pll4.clkr, 2912 + [CAMCC_PLL4_OUT_EVEN] = &camcc_pll4_out_even.clkr, 2913 + [CAMCC_PLL5] = &camcc_pll5.clkr, 2914 + [CAMCC_PLL5_OUT_EVEN] = &camcc_pll5_out_even.clkr, 2915 + [CAMCC_PLL6] = &camcc_pll6.clkr, 2916 + [CAMCC_PLL6_OUT_EVEN] = &camcc_pll6_out_even.clkr, 2917 + [CAMCC_PLL7] = &camcc_pll7.clkr, 2918 + [CAMCC_PLL7_OUT_EVEN] = &camcc_pll7_out_even.clkr, 2919 + [CAMCC_PLL7_OUT_ODD] = &camcc_pll7_out_odd.clkr, 2920 + [CAMCC_SLEEP_CLK] = &camcc_sleep_clk.clkr, 2921 + [CAMCC_SLEEP_CLK_SRC] = &camcc_sleep_clk_src.clkr, 2922 + [CAMCC_SLOW_AHB_CLK_SRC] = &camcc_slow_ahb_clk_src.clkr, 2923 + [CAMCC_XO_CLK_SRC] = &camcc_xo_clk_src.clkr, 2924 + }; 2925 + 2926 + static struct gdsc *camcc_sc8280xp_gdscs[] = { 2927 + [BPS_GDSC] = &bps_gdsc, 2928 + [IFE_0_GDSC] = &ife_0_gdsc, 2929 + [IFE_1_GDSC] = &ife_1_gdsc, 2930 + [IFE_2_GDSC] = &ife_2_gdsc, 2931 + [IFE_3_GDSC] = &ife_3_gdsc, 2932 + [IPE_0_GDSC] = &ipe_0_gdsc, 2933 + [IPE_1_GDSC] = &ipe_1_gdsc, 2934 + [TITAN_TOP_GDSC] = &titan_top_gdsc, 2935 + }; 2936 + 2937 + static const struct qcom_reset_map camcc_sc8280xp_resets[] = { 2938 + [CAMCC_BPS_BCR] = { 0x7000 }, 2939 + [CAMCC_CAMNOC_BCR] = { 0xc16c }, 2940 + [CAMCC_CCI_BCR] = { 0xc104 }, 2941 + [CAMCC_CPAS_BCR] = { 0xc164 }, 2942 + [CAMCC_CSI0PHY_BCR] = { 0x6000 }, 2943 + [CAMCC_CSI1PHY_BCR] = { 0x6024 }, 2944 + [CAMCC_CSI2PHY_BCR] = { 0x6048 }, 2945 + [CAMCC_CSI3PHY_BCR] = { 0x6070 }, 2946 + [CAMCC_ICP_BCR] = { 0xc0b4 }, 2947 + [CAMCC_IFE_0_BCR] = { 0xa000 }, 2948 + [CAMCC_IFE_1_BCR] = { 0xb000 }, 2949 + [CAMCC_IFE_2_BCR] = { 0xf000 }, 2950 + [CAMCC_IFE_3_BCR] = { 0xf06c }, 2951 + [CAMCC_IFE_LITE_0_BCR] = { 0xc000 }, 2952 + [CAMCC_IFE_LITE_1_BCR] = { 0xc044 }, 2953 + [CAMCC_IFE_LITE_2_BCR] = { 0xc23c }, 2954 + [CAMCC_IFE_LITE_3_BCR] = { 0xc280 }, 2955 + [CAMCC_IPE_0_BCR] = { 0x8000 }, 2956 + [CAMCC_IPE_1_BCR] = { 0x9000 }, 2957 + [CAMCC_JPEG_BCR] = { 0xc088 }, 2958 + [CAMCC_LRME_BCR] = { 0xc140 }, 2959 + }; 2960 + 2961 + static const struct regmap_config camcc_sc8280xp_regmap_config = { 2962 + .reg_bits = 32, 2963 + .reg_stride = 4, 2964 + .val_bits = 32, 2965 + .max_register = 0x13020, 2966 + .fast_io = true, 2967 + }; 2968 + 2969 + static struct qcom_cc_desc camcc_sc8280xp_desc = { 2970 + .config = &camcc_sc8280xp_regmap_config, 2971 + .clks = camcc_sc8280xp_clocks, 2972 + .num_clks = ARRAY_SIZE(camcc_sc8280xp_clocks), 2973 + .resets = camcc_sc8280xp_resets, 2974 + .num_resets = ARRAY_SIZE(camcc_sc8280xp_resets), 2975 + .gdscs = camcc_sc8280xp_gdscs, 2976 + .num_gdscs = ARRAY_SIZE(camcc_sc8280xp_gdscs), 2977 + }; 2978 + 2979 + static const struct of_device_id camcc_sc8280xp_match_table[] = { 2980 + { .compatible = "qcom,sc8280xp-camcc" }, 2981 + { } 2982 + }; 2983 + MODULE_DEVICE_TABLE(of, camcc_sc8280xp_match_table); 2984 + 2985 + static int camcc_sc8280xp_probe(struct platform_device *pdev) 2986 + { 2987 + struct regmap *regmap; 2988 + int ret; 2989 + 2990 + ret = devm_pm_runtime_enable(&pdev->dev); 2991 + if (ret) 2992 + return ret; 2993 + 2994 + ret = pm_runtime_resume_and_get(&pdev->dev); 2995 + if (ret) 2996 + return ret; 2997 + 2998 + regmap = qcom_cc_map(pdev, &camcc_sc8280xp_desc); 2999 + if (IS_ERR(regmap)) { 3000 + ret = PTR_ERR(regmap); 3001 + goto err_put_rpm; 3002 + } 3003 + 3004 + clk_lucid_pll_configure(&camcc_pll0, regmap, &camcc_pll0_config); 3005 + clk_lucid_pll_configure(&camcc_pll1, regmap, &camcc_pll1_config); 3006 + clk_zonda_pll_configure(&camcc_pll2, regmap, &camcc_pll2_config); 3007 + clk_lucid_pll_configure(&camcc_pll3, regmap, &camcc_pll3_config); 3008 + clk_lucid_pll_configure(&camcc_pll4, regmap, &camcc_pll4_config); 3009 + clk_lucid_pll_configure(&camcc_pll5, regmap, &camcc_pll5_config); 3010 + clk_lucid_pll_configure(&camcc_pll6, regmap, &camcc_pll6_config); 3011 + clk_lucid_pll_configure(&camcc_pll7, regmap, &camcc_pll7_config); 3012 + 3013 + /* 3014 + * Keep camcc_gdsc_clk always enabled: 3015 + */ 3016 + regmap_update_bits(regmap, 0xc1e4, BIT(0), 1); 3017 + 3018 + ret = qcom_cc_really_probe(pdev, &camcc_sc8280xp_desc, regmap); 3019 + if (ret) 3020 + goto err_put_rpm; 3021 + 3022 + pm_runtime_put(&pdev->dev); 3023 + 3024 + return 0; 3025 + 3026 + err_put_rpm: 3027 + regmap_update_bits(regmap, 0xc1e4, BIT(0), 0); 3028 + pm_runtime_put_sync(&pdev->dev); 3029 + 3030 + return ret; 3031 + } 3032 + 3033 + static struct platform_driver camcc_sc8280xp_driver = { 3034 + .probe = camcc_sc8280xp_probe, 3035 + .driver = { 3036 + .name = "camcc-sc8280xp", 3037 + .of_match_table = camcc_sc8280xp_match_table, 3038 + }, 3039 + }; 3040 + 3041 + module_platform_driver(camcc_sc8280xp_driver); 3042 + 3043 + MODULE_DESCRIPTION("QCOM CAMCC SC8280XP Driver"); 3044 + MODULE_LICENSE("GPL");