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

clk: qcom: Add Camera Clock controller (CAMCC) driver for Milos

Add support for the camera clock controller found on Milos (e.g. SM7635)
based devices.

Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Signed-off-by: Luca Weiss <luca.weiss@fairphone.com>
Link: https://lore.kernel.org/r/20250715-sm7635-clocks-v3-5-18f9faac4984@fairphone.com
Signed-off-by: Bjorn Andersson <andersson@kernel.org>

authored by

Luca Weiss and committed by
Bjorn Andersson
f003800e dbb9d53b

+2170
+8
drivers/clk/qcom/Kconfig
··· 969 969 Support for the camera clock controller on SM7150 devices. 970 970 Say Y if you want to support camera devices and camera functionality. 971 971 972 + config SM_CAMCC_MILOS 973 + tristate "Milos Camera Clock Controller" 974 + depends on ARM64 || COMPILE_TEST 975 + select SM_GCC_MILOS 976 + help 977 + Support for the camera clock controller on Milos devices. 978 + Say Y if you want to support camera devices and camera functionality. 979 + 972 980 config SM_CAMCC_8150 973 981 tristate "SM8150 Camera Clock Controller" 974 982 depends on ARM64 || COMPILE_TEST
+1
drivers/clk/qcom/Makefile
··· 131 131 obj-$(CONFIG_SM_CAMCC_8450) += camcc-sm8450.o 132 132 obj-$(CONFIG_SM_CAMCC_8550) += camcc-sm8550.o 133 133 obj-$(CONFIG_SM_CAMCC_8650) += camcc-sm8650.o 134 + obj-$(CONFIG_SM_CAMCC_MILOS) += camcc-milos.o 134 135 obj-$(CONFIG_SM_DISPCC_4450) += dispcc-sm4450.o 135 136 obj-$(CONFIG_SM_DISPCC_6115) += dispcc-sm6115.o 136 137 obj-$(CONFIG_SM_DISPCC_6125) += dispcc-sm6125.o
+2161
drivers/clk/qcom/camcc-milos.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved. 4 + * Copyright (c) 2025, Luca Weiss <luca.weiss@fairphone.com> 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/regmap.h> 12 + 13 + #include <dt-bindings/clock/qcom,milos-camcc.h> 14 + 15 + #include "clk-alpha-pll.h" 16 + #include "clk-branch.h" 17 + #include "clk-pll.h" 18 + #include "clk-rcg.h" 19 + #include "clk-regmap.h" 20 + #include "clk-regmap-divider.h" 21 + #include "clk-regmap-mux.h" 22 + #include "common.h" 23 + #include "gdsc.h" 24 + #include "reset.h" 25 + 26 + /* Need to match the order of clocks in DT binding */ 27 + enum { 28 + DT_BI_TCXO, 29 + DT_SLEEP_CLK, 30 + DT_IFACE, 31 + }; 32 + 33 + enum { 34 + P_BI_TCXO, 35 + P_CAM_CC_PLL0_OUT_EVEN, 36 + P_CAM_CC_PLL0_OUT_MAIN, 37 + P_CAM_CC_PLL0_OUT_ODD, 38 + P_CAM_CC_PLL1_OUT_EVEN, 39 + P_CAM_CC_PLL1_OUT_MAIN, 40 + P_CAM_CC_PLL2_OUT_MAIN, 41 + P_CAM_CC_PLL3_OUT_EVEN, 42 + P_CAM_CC_PLL4_OUT_EVEN, 43 + P_CAM_CC_PLL4_OUT_MAIN, 44 + P_CAM_CC_PLL5_OUT_EVEN, 45 + P_CAM_CC_PLL5_OUT_MAIN, 46 + P_CAM_CC_PLL6_OUT_EVEN, 47 + P_CAM_CC_PLL6_OUT_MAIN, 48 + P_SLEEP_CLK, 49 + }; 50 + 51 + static const struct pll_vco lucid_ole_vco[] = { 52 + { 249600000, 2300000000, 0 }, 53 + }; 54 + 55 + static const struct pll_vco rivian_ole_vco[] = { 56 + { 777000000, 1285000000, 0 }, 57 + }; 58 + 59 + /* 1200.0 MHz Configuration */ 60 + static const struct alpha_pll_config cam_cc_pll0_config = { 61 + .l = 0x3e, 62 + .alpha = 0x8000, 63 + .config_ctl_val = 0x20485699, 64 + .config_ctl_hi_val = 0x00182261, 65 + .config_ctl_hi1_val = 0x82aa299c, 66 + .test_ctl_val = 0x00000000, 67 + .test_ctl_hi_val = 0x00000003, 68 + .test_ctl_hi1_val = 0x00009000, 69 + .test_ctl_hi2_val = 0x00000034, 70 + .user_ctl_val = 0x00008400, 71 + .user_ctl_hi_val = 0x00000005, 72 + }; 73 + 74 + static struct clk_alpha_pll cam_cc_pll0 = { 75 + .offset = 0x0, 76 + .config = &cam_cc_pll0_config, 77 + .vco_table = lucid_ole_vco, 78 + .num_vco = ARRAY_SIZE(lucid_ole_vco), 79 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 80 + .clkr = { 81 + .hw.init = &(const struct clk_init_data) { 82 + .name = "cam_cc_pll0", 83 + .parent_data = &(const struct clk_parent_data) { 84 + .index = DT_BI_TCXO, 85 + }, 86 + .num_parents = 1, 87 + .ops = &clk_alpha_pll_lucid_evo_ops, 88 + }, 89 + }, 90 + }; 91 + 92 + static const struct clk_div_table post_div_table_cam_cc_pll0_out_even[] = { 93 + { 0x1, 2 }, 94 + { } 95 + }; 96 + 97 + static struct clk_alpha_pll_postdiv cam_cc_pll0_out_even = { 98 + .offset = 0x0, 99 + .post_div_shift = 10, 100 + .post_div_table = post_div_table_cam_cc_pll0_out_even, 101 + .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll0_out_even), 102 + .width = 4, 103 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 104 + .clkr.hw.init = &(const struct clk_init_data) { 105 + .name = "cam_cc_pll0_out_even", 106 + .parent_hws = (const struct clk_hw*[]) { 107 + &cam_cc_pll0.clkr.hw, 108 + }, 109 + .num_parents = 1, 110 + .flags = CLK_SET_RATE_PARENT, 111 + .ops = &clk_alpha_pll_postdiv_lucid_ole_ops, 112 + }, 113 + }; 114 + 115 + static const struct clk_div_table post_div_table_cam_cc_pll0_out_odd[] = { 116 + { 0x2, 3 }, 117 + { } 118 + }; 119 + 120 + static struct clk_alpha_pll_postdiv cam_cc_pll0_out_odd = { 121 + .offset = 0x0, 122 + .post_div_shift = 14, 123 + .post_div_table = post_div_table_cam_cc_pll0_out_odd, 124 + .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll0_out_odd), 125 + .width = 4, 126 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 127 + .clkr.hw.init = &(const struct clk_init_data) { 128 + .name = "cam_cc_pll0_out_odd", 129 + .parent_hws = (const struct clk_hw*[]) { 130 + &cam_cc_pll0.clkr.hw, 131 + }, 132 + .num_parents = 1, 133 + .flags = CLK_SET_RATE_PARENT, 134 + .ops = &clk_alpha_pll_postdiv_lucid_ole_ops, 135 + }, 136 + }; 137 + 138 + /* 600.0 MHz Configuration */ 139 + static const struct alpha_pll_config cam_cc_pll1_config = { 140 + .l = 0x1f, 141 + .alpha = 0x4000, 142 + .config_ctl_val = 0x20485699, 143 + .config_ctl_hi_val = 0x00182261, 144 + .config_ctl_hi1_val = 0x82aa299c, 145 + .test_ctl_val = 0x00000000, 146 + .test_ctl_hi_val = 0x00000003, 147 + .test_ctl_hi1_val = 0x00009000, 148 + .test_ctl_hi2_val = 0x00000034, 149 + .user_ctl_val = 0x00000400, 150 + .user_ctl_hi_val = 0x00000005, 151 + }; 152 + 153 + static struct clk_alpha_pll cam_cc_pll1 = { 154 + .offset = 0x1000, 155 + .config = &cam_cc_pll1_config, 156 + .vco_table = lucid_ole_vco, 157 + .num_vco = ARRAY_SIZE(lucid_ole_vco), 158 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 159 + .clkr = { 160 + .hw.init = &(const struct clk_init_data) { 161 + .name = "cam_cc_pll1", 162 + .parent_data = &(const struct clk_parent_data) { 163 + .index = DT_BI_TCXO, 164 + }, 165 + .num_parents = 1, 166 + .ops = &clk_alpha_pll_lucid_evo_ops, 167 + }, 168 + }, 169 + }; 170 + 171 + static const struct clk_div_table post_div_table_cam_cc_pll1_out_even[] = { 172 + { 0x1, 2 }, 173 + { } 174 + }; 175 + 176 + static struct clk_alpha_pll_postdiv cam_cc_pll1_out_even = { 177 + .offset = 0x1000, 178 + .post_div_shift = 10, 179 + .post_div_table = post_div_table_cam_cc_pll1_out_even, 180 + .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll1_out_even), 181 + .width = 4, 182 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 183 + .clkr.hw.init = &(const struct clk_init_data) { 184 + .name = "cam_cc_pll1_out_even", 185 + .parent_hws = (const struct clk_hw*[]) { 186 + &cam_cc_pll1.clkr.hw, 187 + }, 188 + .num_parents = 1, 189 + .flags = CLK_SET_RATE_PARENT, 190 + .ops = &clk_alpha_pll_postdiv_lucid_ole_ops, 191 + }, 192 + }; 193 + 194 + /* 960.0 MHz Configuration */ 195 + static const struct alpha_pll_config cam_cc_pll2_config = { 196 + .l = 0x32, 197 + .alpha = 0x0, 198 + .config_ctl_val = 0x10000030, 199 + .config_ctl_hi_val = 0x80890263, 200 + .config_ctl_hi1_val = 0x00000217, 201 + .user_ctl_val = 0x00000001, 202 + .user_ctl_hi_val = 0x00100000, 203 + }; 204 + 205 + static struct clk_alpha_pll cam_cc_pll2 = { 206 + .offset = 0x2000, 207 + .config = &cam_cc_pll2_config, 208 + .vco_table = rivian_ole_vco, 209 + .num_vco = ARRAY_SIZE(rivian_ole_vco), 210 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_RIVIAN_EVO], 211 + .clkr = { 212 + .hw.init = &(const struct clk_init_data) { 213 + .name = "cam_cc_pll2", 214 + .parent_data = &(const struct clk_parent_data) { 215 + .index = DT_BI_TCXO, 216 + }, 217 + .num_parents = 1, 218 + .ops = &clk_alpha_pll_rivian_evo_ops, 219 + }, 220 + }, 221 + }; 222 + 223 + /* 600.0 MHz Configuration */ 224 + static const struct alpha_pll_config cam_cc_pll3_config = { 225 + .l = 0x1f, 226 + .alpha = 0x4000, 227 + .config_ctl_val = 0x20485699, 228 + .config_ctl_hi_val = 0x00182261, 229 + .config_ctl_hi1_val = 0x82aa299c, 230 + .test_ctl_val = 0x00000000, 231 + .test_ctl_hi_val = 0x00000003, 232 + .test_ctl_hi1_val = 0x00009000, 233 + .test_ctl_hi2_val = 0x00000034, 234 + .user_ctl_val = 0x00000400, 235 + .user_ctl_hi_val = 0x00000005, 236 + }; 237 + 238 + static struct clk_alpha_pll cam_cc_pll3 = { 239 + .offset = 0x3000, 240 + .config = &cam_cc_pll3_config, 241 + .vco_table = lucid_ole_vco, 242 + .num_vco = ARRAY_SIZE(lucid_ole_vco), 243 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 244 + .clkr = { 245 + .hw.init = &(const struct clk_init_data) { 246 + .name = "cam_cc_pll3", 247 + .parent_data = &(const struct clk_parent_data) { 248 + .index = DT_BI_TCXO, 249 + }, 250 + .num_parents = 1, 251 + .ops = &clk_alpha_pll_lucid_evo_ops, 252 + }, 253 + }, 254 + }; 255 + 256 + static const struct clk_div_table post_div_table_cam_cc_pll3_out_even[] = { 257 + { 0x1, 2 }, 258 + { } 259 + }; 260 + 261 + static struct clk_alpha_pll_postdiv cam_cc_pll3_out_even = { 262 + .offset = 0x3000, 263 + .post_div_shift = 10, 264 + .post_div_table = post_div_table_cam_cc_pll3_out_even, 265 + .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll3_out_even), 266 + .width = 4, 267 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 268 + .clkr.hw.init = &(const struct clk_init_data) { 269 + .name = "cam_cc_pll3_out_even", 270 + .parent_hws = (const struct clk_hw*[]) { 271 + &cam_cc_pll3.clkr.hw, 272 + }, 273 + .num_parents = 1, 274 + .flags = CLK_SET_RATE_PARENT, 275 + .ops = &clk_alpha_pll_postdiv_lucid_ole_ops, 276 + }, 277 + }; 278 + 279 + /* 700.0 MHz Configuration */ 280 + static const struct alpha_pll_config cam_cc_pll4_config = { 281 + .l = 0x24, 282 + .alpha = 0x7555, 283 + .config_ctl_val = 0x20485699, 284 + .config_ctl_hi_val = 0x00182261, 285 + .config_ctl_hi1_val = 0x82aa299c, 286 + .test_ctl_val = 0x00000000, 287 + .test_ctl_hi_val = 0x00000003, 288 + .test_ctl_hi1_val = 0x00009000, 289 + .test_ctl_hi2_val = 0x00000034, 290 + .user_ctl_val = 0x00000400, 291 + .user_ctl_hi_val = 0x00000005, 292 + }; 293 + 294 + static struct clk_alpha_pll cam_cc_pll4 = { 295 + .offset = 0x4000, 296 + .config = &cam_cc_pll4_config, 297 + .vco_table = lucid_ole_vco, 298 + .num_vco = ARRAY_SIZE(lucid_ole_vco), 299 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 300 + .clkr = { 301 + .hw.init = &(const struct clk_init_data) { 302 + .name = "cam_cc_pll4", 303 + .parent_data = &(const struct clk_parent_data) { 304 + .index = DT_BI_TCXO, 305 + }, 306 + .num_parents = 1, 307 + .ops = &clk_alpha_pll_lucid_evo_ops, 308 + }, 309 + }, 310 + }; 311 + 312 + static const struct clk_div_table post_div_table_cam_cc_pll4_out_even[] = { 313 + { 0x1, 2 }, 314 + { } 315 + }; 316 + 317 + static struct clk_alpha_pll_postdiv cam_cc_pll4_out_even = { 318 + .offset = 0x4000, 319 + .post_div_shift = 10, 320 + .post_div_table = post_div_table_cam_cc_pll4_out_even, 321 + .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll4_out_even), 322 + .width = 4, 323 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 324 + .clkr.hw.init = &(const struct clk_init_data) { 325 + .name = "cam_cc_pll4_out_even", 326 + .parent_hws = (const struct clk_hw*[]) { 327 + &cam_cc_pll4.clkr.hw, 328 + }, 329 + .num_parents = 1, 330 + .flags = CLK_SET_RATE_PARENT, 331 + .ops = &clk_alpha_pll_postdiv_lucid_ole_ops, 332 + }, 333 + }; 334 + 335 + /* 700.0 MHz Configuration */ 336 + static const struct alpha_pll_config cam_cc_pll5_config = { 337 + .l = 0x24, 338 + .alpha = 0x7555, 339 + .config_ctl_val = 0x20485699, 340 + .config_ctl_hi_val = 0x00182261, 341 + .config_ctl_hi1_val = 0x82aa299c, 342 + .test_ctl_val = 0x00000000, 343 + .test_ctl_hi_val = 0x00000003, 344 + .test_ctl_hi1_val = 0x00009000, 345 + .test_ctl_hi2_val = 0x00000034, 346 + .user_ctl_val = 0x00000400, 347 + .user_ctl_hi_val = 0x00000005, 348 + }; 349 + 350 + static struct clk_alpha_pll cam_cc_pll5 = { 351 + .offset = 0x5000, 352 + .config = &cam_cc_pll5_config, 353 + .vco_table = lucid_ole_vco, 354 + .num_vco = ARRAY_SIZE(lucid_ole_vco), 355 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 356 + .clkr = { 357 + .hw.init = &(const struct clk_init_data) { 358 + .name = "cam_cc_pll5", 359 + .parent_data = &(const struct clk_parent_data) { 360 + .index = DT_BI_TCXO, 361 + }, 362 + .num_parents = 1, 363 + .ops = &clk_alpha_pll_lucid_evo_ops, 364 + }, 365 + }, 366 + }; 367 + 368 + static const struct clk_div_table post_div_table_cam_cc_pll5_out_even[] = { 369 + { 0x1, 2 }, 370 + { } 371 + }; 372 + 373 + static struct clk_alpha_pll_postdiv cam_cc_pll5_out_even = { 374 + .offset = 0x5000, 375 + .post_div_shift = 10, 376 + .post_div_table = post_div_table_cam_cc_pll5_out_even, 377 + .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll5_out_even), 378 + .width = 4, 379 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 380 + .clkr.hw.init = &(const struct clk_init_data) { 381 + .name = "cam_cc_pll5_out_even", 382 + .parent_hws = (const struct clk_hw*[]) { 383 + &cam_cc_pll5.clkr.hw, 384 + }, 385 + .num_parents = 1, 386 + .flags = CLK_SET_RATE_PARENT, 387 + .ops = &clk_alpha_pll_postdiv_lucid_ole_ops, 388 + }, 389 + }; 390 + 391 + /* 700.0 MHz Configuration */ 392 + static const struct alpha_pll_config cam_cc_pll6_config = { 393 + .l = 0x24, 394 + .alpha = 0x7555, 395 + .config_ctl_val = 0x20485699, 396 + .config_ctl_hi_val = 0x00182261, 397 + .config_ctl_hi1_val = 0x82aa299c, 398 + .test_ctl_val = 0x00000000, 399 + .test_ctl_hi_val = 0x00000003, 400 + .test_ctl_hi1_val = 0x00009000, 401 + .test_ctl_hi2_val = 0x00000034, 402 + .user_ctl_val = 0x00000400, 403 + .user_ctl_hi_val = 0x00000005, 404 + }; 405 + 406 + static struct clk_alpha_pll cam_cc_pll6 = { 407 + .offset = 0x6000, 408 + .config = &cam_cc_pll6_config, 409 + .vco_table = lucid_ole_vco, 410 + .num_vco = ARRAY_SIZE(lucid_ole_vco), 411 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 412 + .clkr = { 413 + .hw.init = &(const struct clk_init_data) { 414 + .name = "cam_cc_pll6", 415 + .parent_data = &(const struct clk_parent_data) { 416 + .index = DT_BI_TCXO, 417 + }, 418 + .num_parents = 1, 419 + .ops = &clk_alpha_pll_lucid_evo_ops, 420 + }, 421 + }, 422 + }; 423 + 424 + static const struct clk_div_table post_div_table_cam_cc_pll6_out_even[] = { 425 + { 0x1, 2 }, 426 + { } 427 + }; 428 + 429 + static struct clk_alpha_pll_postdiv cam_cc_pll6_out_even = { 430 + .offset = 0x6000, 431 + .post_div_shift = 10, 432 + .post_div_table = post_div_table_cam_cc_pll6_out_even, 433 + .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll6_out_even), 434 + .width = 4, 435 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 436 + .clkr.hw.init = &(const struct clk_init_data) { 437 + .name = "cam_cc_pll6_out_even", 438 + .parent_hws = (const struct clk_hw*[]) { 439 + &cam_cc_pll6.clkr.hw, 440 + }, 441 + .num_parents = 1, 442 + .flags = CLK_SET_RATE_PARENT, 443 + .ops = &clk_alpha_pll_postdiv_lucid_ole_ops, 444 + }, 445 + }; 446 + 447 + static const struct parent_map cam_cc_parent_map_0[] = { 448 + { P_BI_TCXO, 0 }, 449 + { P_CAM_CC_PLL0_OUT_MAIN, 1 }, 450 + { P_CAM_CC_PLL0_OUT_ODD, 5 }, 451 + { P_CAM_CC_PLL0_OUT_EVEN, 6 }, 452 + }; 453 + 454 + static const struct clk_parent_data cam_cc_parent_data_0[] = { 455 + { .index = DT_BI_TCXO }, 456 + { .hw = &cam_cc_pll0.clkr.hw }, 457 + { .hw = &cam_cc_pll0_out_odd.clkr.hw }, 458 + { .hw = &cam_cc_pll0_out_even.clkr.hw }, 459 + }; 460 + 461 + static const struct parent_map cam_cc_parent_map_1[] = { 462 + { P_BI_TCXO, 0 }, 463 + { P_CAM_CC_PLL2_OUT_MAIN, 4 }, 464 + }; 465 + 466 + static const struct clk_parent_data cam_cc_parent_data_1[] = { 467 + { .index = DT_BI_TCXO }, 468 + { .hw = &cam_cc_pll2.clkr.hw }, 469 + }; 470 + 471 + static const struct parent_map cam_cc_parent_map_2[] = { 472 + { P_BI_TCXO, 0 }, 473 + { P_CAM_CC_PLL0_OUT_MAIN, 1 }, 474 + { P_CAM_CC_PLL1_OUT_MAIN, 2 }, 475 + { P_CAM_CC_PLL1_OUT_EVEN, 3 }, 476 + { P_CAM_CC_PLL0_OUT_ODD, 5 }, 477 + { P_CAM_CC_PLL0_OUT_EVEN, 6 }, 478 + }; 479 + 480 + static const struct clk_parent_data cam_cc_parent_data_2[] = { 481 + { .index = DT_BI_TCXO }, 482 + { .hw = &cam_cc_pll0.clkr.hw }, 483 + { .hw = &cam_cc_pll1.clkr.hw }, 484 + { .hw = &cam_cc_pll1_out_even.clkr.hw }, 485 + { .hw = &cam_cc_pll0_out_odd.clkr.hw }, 486 + { .hw = &cam_cc_pll0_out_even.clkr.hw }, 487 + }; 488 + 489 + static const struct parent_map cam_cc_parent_map_3[] = { 490 + { P_BI_TCXO, 0 }, 491 + { P_CAM_CC_PLL0_OUT_ODD, 5 }, 492 + { P_CAM_CC_PLL0_OUT_EVEN, 6 }, 493 + }; 494 + 495 + static const struct clk_parent_data cam_cc_parent_data_3[] = { 496 + { .index = DT_BI_TCXO }, 497 + { .hw = &cam_cc_pll0_out_odd.clkr.hw }, 498 + { .hw = &cam_cc_pll0_out_even.clkr.hw }, 499 + }; 500 + 501 + static const struct parent_map cam_cc_parent_map_4[] = { 502 + { P_BI_TCXO, 0 }, 503 + { P_CAM_CC_PLL0_OUT_MAIN, 1 }, 504 + { P_CAM_CC_PLL0_OUT_EVEN, 6 }, 505 + }; 506 + 507 + static const struct clk_parent_data cam_cc_parent_data_4[] = { 508 + { .index = DT_BI_TCXO }, 509 + { .hw = &cam_cc_pll0.clkr.hw }, 510 + { .hw = &cam_cc_pll0_out_even.clkr.hw }, 511 + }; 512 + 513 + static const struct parent_map cam_cc_parent_map_5[] = { 514 + { P_BI_TCXO, 0 }, 515 + { P_CAM_CC_PLL0_OUT_MAIN, 1 }, 516 + { P_CAM_CC_PLL3_OUT_EVEN, 5 }, 517 + { P_CAM_CC_PLL0_OUT_EVEN, 6 }, 518 + }; 519 + 520 + static const struct clk_parent_data cam_cc_parent_data_5[] = { 521 + { .index = DT_BI_TCXO }, 522 + { .hw = &cam_cc_pll0.clkr.hw }, 523 + { .hw = &cam_cc_pll3_out_even.clkr.hw }, 524 + { .hw = &cam_cc_pll0_out_even.clkr.hw }, 525 + }; 526 + 527 + static const struct parent_map cam_cc_parent_map_6[] = { 528 + { P_SLEEP_CLK, 0 }, 529 + }; 530 + 531 + static const struct clk_parent_data cam_cc_parent_data_6_ao[] = { 532 + { .index = DT_SLEEP_CLK }, 533 + }; 534 + 535 + static const struct parent_map cam_cc_parent_map_7[] = { 536 + { P_BI_TCXO, 0 }, 537 + { P_CAM_CC_PLL0_OUT_MAIN, 1 }, 538 + { P_CAM_CC_PLL4_OUT_EVEN, 2 }, 539 + { P_CAM_CC_PLL4_OUT_MAIN, 3 }, 540 + { P_CAM_CC_PLL0_OUT_ODD, 5 }, 541 + { P_CAM_CC_PLL0_OUT_EVEN, 6 }, 542 + }; 543 + 544 + static const struct clk_parent_data cam_cc_parent_data_7[] = { 545 + { .index = DT_BI_TCXO }, 546 + { .hw = &cam_cc_pll0.clkr.hw }, 547 + { .hw = &cam_cc_pll4_out_even.clkr.hw }, 548 + { .hw = &cam_cc_pll4.clkr.hw }, 549 + { .hw = &cam_cc_pll0_out_odd.clkr.hw }, 550 + { .hw = &cam_cc_pll0_out_even.clkr.hw }, 551 + }; 552 + 553 + static const struct parent_map cam_cc_parent_map_8[] = { 554 + { P_BI_TCXO, 0 }, 555 + { P_CAM_CC_PLL0_OUT_MAIN, 1 }, 556 + { P_CAM_CC_PLL5_OUT_EVEN, 2 }, 557 + { P_CAM_CC_PLL5_OUT_MAIN, 3 }, 558 + { P_CAM_CC_PLL0_OUT_ODD, 5 }, 559 + { P_CAM_CC_PLL0_OUT_EVEN, 6 }, 560 + }; 561 + 562 + static const struct clk_parent_data cam_cc_parent_data_8[] = { 563 + { .index = DT_BI_TCXO }, 564 + { .hw = &cam_cc_pll0.clkr.hw }, 565 + { .hw = &cam_cc_pll5_out_even.clkr.hw }, 566 + { .hw = &cam_cc_pll5.clkr.hw }, 567 + { .hw = &cam_cc_pll0_out_odd.clkr.hw }, 568 + { .hw = &cam_cc_pll0_out_even.clkr.hw }, 569 + }; 570 + 571 + static const struct parent_map cam_cc_parent_map_9[] = { 572 + { P_BI_TCXO, 0 }, 573 + { P_CAM_CC_PLL0_OUT_MAIN, 1 }, 574 + { P_CAM_CC_PLL6_OUT_EVEN, 2 }, 575 + { P_CAM_CC_PLL6_OUT_MAIN, 3 }, 576 + { P_CAM_CC_PLL0_OUT_ODD, 5 }, 577 + { P_CAM_CC_PLL0_OUT_EVEN, 6 }, 578 + }; 579 + 580 + static const struct clk_parent_data cam_cc_parent_data_9[] = { 581 + { .index = DT_BI_TCXO }, 582 + { .hw = &cam_cc_pll0.clkr.hw }, 583 + { .hw = &cam_cc_pll6_out_even.clkr.hw }, 584 + { .hw = &cam_cc_pll6.clkr.hw }, 585 + { .hw = &cam_cc_pll0_out_odd.clkr.hw }, 586 + { .hw = &cam_cc_pll0_out_even.clkr.hw }, 587 + }; 588 + 589 + static const struct parent_map cam_cc_parent_map_10[] = { 590 + { P_BI_TCXO, 0 }, 591 + }; 592 + 593 + static const struct clk_parent_data cam_cc_parent_data_10[] = { 594 + { .index = DT_BI_TCXO }, 595 + }; 596 + 597 + static const struct freq_tbl ftbl_cam_cc_bps_clk_src[] = { 598 + F(300000000, P_CAM_CC_PLL1_OUT_EVEN, 1, 0, 0), 599 + F(410000000, P_CAM_CC_PLL1_OUT_EVEN, 1, 0, 0), 600 + F(460000000, P_CAM_CC_PLL1_OUT_EVEN, 1, 0, 0), 601 + F(600000000, P_CAM_CC_PLL1_OUT_EVEN, 1, 0, 0), 602 + F(700000000, P_CAM_CC_PLL1_OUT_EVEN, 1, 0, 0), 603 + { } 604 + }; 605 + 606 + static struct clk_rcg2 cam_cc_bps_clk_src = { 607 + .cmd_rcgr = 0x1a004, 608 + .mnd_width = 0, 609 + .hid_width = 5, 610 + .parent_map = cam_cc_parent_map_2, 611 + .freq_tbl = ftbl_cam_cc_bps_clk_src, 612 + .clkr.hw.init = &(const struct clk_init_data) { 613 + .name = "cam_cc_bps_clk_src", 614 + .parent_data = cam_cc_parent_data_2, 615 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_2), 616 + .flags = CLK_SET_RATE_PARENT, 617 + .ops = &clk_rcg2_shared_ops, 618 + }, 619 + }; 620 + 621 + static const struct freq_tbl ftbl_cam_cc_camnoc_axi_clk_src[] = { 622 + F(150000000, P_CAM_CC_PLL0_OUT_EVEN, 4, 0, 0), 623 + F(240000000, P_CAM_CC_PLL0_OUT_EVEN, 2.5, 0, 0), 624 + F(300000000, P_CAM_CC_PLL0_OUT_EVEN, 2, 0, 0), 625 + F(400000000, P_CAM_CC_PLL0_OUT_ODD, 1, 0, 0), 626 + { } 627 + }; 628 + 629 + static struct clk_rcg2 cam_cc_camnoc_axi_clk_src = { 630 + .cmd_rcgr = 0x2401c, 631 + .mnd_width = 0, 632 + .hid_width = 5, 633 + .parent_map = cam_cc_parent_map_0, 634 + .freq_tbl = ftbl_cam_cc_camnoc_axi_clk_src, 635 + .clkr.hw.init = &(const struct clk_init_data) { 636 + .name = "cam_cc_camnoc_axi_clk_src", 637 + .parent_data = cam_cc_parent_data_0, 638 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), 639 + .flags = CLK_SET_RATE_PARENT, 640 + .ops = &clk_rcg2_shared_ops, 641 + }, 642 + }; 643 + 644 + static const struct freq_tbl ftbl_cam_cc_cci_0_clk_src[] = { 645 + F(37500000, P_CAM_CC_PLL0_OUT_EVEN, 16, 0, 0), 646 + F(50000000, P_CAM_CC_PLL0_OUT_EVEN, 12, 0, 0), 647 + F(100000000, P_CAM_CC_PLL0_OUT_EVEN, 6, 0, 0), 648 + { } 649 + }; 650 + 651 + static struct clk_rcg2 cam_cc_cci_0_clk_src = { 652 + .cmd_rcgr = 0x21004, 653 + .mnd_width = 8, 654 + .hid_width = 5, 655 + .parent_map = cam_cc_parent_map_3, 656 + .freq_tbl = ftbl_cam_cc_cci_0_clk_src, 657 + .clkr.hw.init = &(const struct clk_init_data) { 658 + .name = "cam_cc_cci_0_clk_src", 659 + .parent_data = cam_cc_parent_data_3, 660 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_3), 661 + .flags = CLK_SET_RATE_PARENT, 662 + .ops = &clk_rcg2_shared_ops, 663 + }, 664 + }; 665 + 666 + static struct clk_rcg2 cam_cc_cci_1_clk_src = { 667 + .cmd_rcgr = 0x22004, 668 + .mnd_width = 8, 669 + .hid_width = 5, 670 + .parent_map = cam_cc_parent_map_3, 671 + .freq_tbl = ftbl_cam_cc_cci_0_clk_src, 672 + .clkr.hw.init = &(const struct clk_init_data) { 673 + .name = "cam_cc_cci_1_clk_src", 674 + .parent_data = cam_cc_parent_data_3, 675 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_3), 676 + .flags = CLK_SET_RATE_PARENT, 677 + .ops = &clk_rcg2_shared_ops, 678 + }, 679 + }; 680 + 681 + static const struct freq_tbl ftbl_cam_cc_cphy_rx_clk_src[] = { 682 + F(200000000, P_CAM_CC_PLL0_OUT_EVEN, 3, 0, 0), 683 + F(300000000, P_CAM_CC_PLL0_OUT_EVEN, 2, 0, 0), 684 + F(400000000, P_CAM_CC_PLL0_OUT_EVEN, 1.5, 0, 0), 685 + { } 686 + }; 687 + 688 + static struct clk_rcg2 cam_cc_cphy_rx_clk_src = { 689 + .cmd_rcgr = 0x1c05c, 690 + .mnd_width = 0, 691 + .hid_width = 5, 692 + .parent_map = cam_cc_parent_map_0, 693 + .freq_tbl = ftbl_cam_cc_cphy_rx_clk_src, 694 + .clkr.hw.init = &(const struct clk_init_data) { 695 + .name = "cam_cc_cphy_rx_clk_src", 696 + .parent_data = cam_cc_parent_data_0, 697 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), 698 + .flags = CLK_SET_RATE_PARENT, 699 + .ops = &clk_rcg2_shared_ops, 700 + }, 701 + }; 702 + 703 + static const struct freq_tbl ftbl_cam_cc_cre_clk_src[] = { 704 + F(300000000, P_CAM_CC_PLL0_OUT_EVEN, 2, 0, 0), 705 + F(400000000, P_CAM_CC_PLL0_OUT_ODD, 1, 0, 0), 706 + F(600000000, P_CAM_CC_PLL0_OUT_MAIN, 2, 0, 0), 707 + { } 708 + }; 709 + 710 + static struct clk_rcg2 cam_cc_cre_clk_src = { 711 + .cmd_rcgr = 0x27004, 712 + .mnd_width = 0, 713 + .hid_width = 5, 714 + .parent_map = cam_cc_parent_map_2, 715 + .freq_tbl = ftbl_cam_cc_cre_clk_src, 716 + .clkr.hw.init = &(const struct clk_init_data) { 717 + .name = "cam_cc_cre_clk_src", 718 + .parent_data = cam_cc_parent_data_2, 719 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_2), 720 + .flags = CLK_SET_RATE_PARENT, 721 + .ops = &clk_rcg2_shared_ops, 722 + }, 723 + }; 724 + 725 + static const struct freq_tbl ftbl_cam_cc_csi0phytimer_clk_src[] = { 726 + F(300000000, P_CAM_CC_PLL0_OUT_EVEN, 2, 0, 0), 727 + { } 728 + }; 729 + 730 + static struct clk_rcg2 cam_cc_csi0phytimer_clk_src = { 731 + .cmd_rcgr = 0x19004, 732 + .mnd_width = 0, 733 + .hid_width = 5, 734 + .parent_map = cam_cc_parent_map_0, 735 + .freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src, 736 + .clkr.hw.init = &(const struct clk_init_data) { 737 + .name = "cam_cc_csi0phytimer_clk_src", 738 + .parent_data = cam_cc_parent_data_0, 739 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), 740 + .flags = CLK_SET_RATE_PARENT, 741 + .ops = &clk_rcg2_shared_ops, 742 + }, 743 + }; 744 + 745 + static struct clk_rcg2 cam_cc_csi1phytimer_clk_src = { 746 + .cmd_rcgr = 0x19028, 747 + .mnd_width = 0, 748 + .hid_width = 5, 749 + .parent_map = cam_cc_parent_map_0, 750 + .freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src, 751 + .clkr.hw.init = &(const struct clk_init_data) { 752 + .name = "cam_cc_csi1phytimer_clk_src", 753 + .parent_data = cam_cc_parent_data_0, 754 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), 755 + .flags = CLK_SET_RATE_PARENT, 756 + .ops = &clk_rcg2_shared_ops, 757 + }, 758 + }; 759 + 760 + static struct clk_rcg2 cam_cc_csi2phytimer_clk_src = { 761 + .cmd_rcgr = 0x1904c, 762 + .mnd_width = 0, 763 + .hid_width = 5, 764 + .parent_map = cam_cc_parent_map_0, 765 + .freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src, 766 + .clkr.hw.init = &(const struct clk_init_data) { 767 + .name = "cam_cc_csi2phytimer_clk_src", 768 + .parent_data = cam_cc_parent_data_0, 769 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), 770 + .flags = CLK_SET_RATE_PARENT, 771 + .ops = &clk_rcg2_shared_ops, 772 + }, 773 + }; 774 + 775 + static struct clk_rcg2 cam_cc_csi3phytimer_clk_src = { 776 + .cmd_rcgr = 0x19070, 777 + .mnd_width = 0, 778 + .hid_width = 5, 779 + .parent_map = cam_cc_parent_map_0, 780 + .freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src, 781 + .clkr.hw.init = &(const struct clk_init_data) { 782 + .name = "cam_cc_csi3phytimer_clk_src", 783 + .parent_data = cam_cc_parent_data_0, 784 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), 785 + .flags = CLK_SET_RATE_PARENT, 786 + .ops = &clk_rcg2_shared_ops, 787 + }, 788 + }; 789 + 790 + static const struct freq_tbl ftbl_cam_cc_fast_ahb_clk_src[] = { 791 + F(100000000, P_CAM_CC_PLL0_OUT_EVEN, 6, 0, 0), 792 + F(150000000, P_CAM_CC_PLL0_OUT_EVEN, 4, 0, 0), 793 + F(200000000, P_CAM_CC_PLL0_OUT_MAIN, 6, 0, 0), 794 + F(240000000, P_CAM_CC_PLL0_OUT_MAIN, 5, 0, 0), 795 + { } 796 + }; 797 + 798 + static struct clk_rcg2 cam_cc_fast_ahb_clk_src = { 799 + .cmd_rcgr = 0x1a030, 800 + .mnd_width = 0, 801 + .hid_width = 5, 802 + .parent_map = cam_cc_parent_map_0, 803 + .freq_tbl = ftbl_cam_cc_fast_ahb_clk_src, 804 + .clkr.hw.init = &(const struct clk_init_data) { 805 + .name = "cam_cc_fast_ahb_clk_src", 806 + .parent_data = cam_cc_parent_data_0, 807 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), 808 + .flags = CLK_SET_RATE_PARENT, 809 + .ops = &clk_rcg2_shared_ops, 810 + }, 811 + }; 812 + 813 + static const struct freq_tbl ftbl_cam_cc_icp_clk_src[] = { 814 + F(400000000, P_CAM_CC_PLL0_OUT_MAIN, 3, 0, 0), 815 + F(480000000, P_CAM_CC_PLL0_OUT_MAIN, 2.5, 0, 0), 816 + F(600000000, P_CAM_CC_PLL0_OUT_MAIN, 2, 0, 0), 817 + { } 818 + }; 819 + 820 + static struct clk_rcg2 cam_cc_icp_clk_src = { 821 + .cmd_rcgr = 0x20014, 822 + .mnd_width = 0, 823 + .hid_width = 5, 824 + .parent_map = cam_cc_parent_map_4, 825 + .freq_tbl = ftbl_cam_cc_icp_clk_src, 826 + .clkr.hw.init = &(const struct clk_init_data) { 827 + .name = "cam_cc_icp_clk_src", 828 + .parent_data = cam_cc_parent_data_4, 829 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_4), 830 + .flags = CLK_SET_RATE_PARENT, 831 + .ops = &clk_rcg2_shared_ops, 832 + }, 833 + }; 834 + 835 + static const struct freq_tbl ftbl_cam_cc_mclk0_clk_src[] = { 836 + F(19200000, P_CAM_CC_PLL2_OUT_MAIN, 1, 1, 50), 837 + F(24000000, P_CAM_CC_PLL2_OUT_MAIN, 10, 1, 4), 838 + F(64000000, P_CAM_CC_PLL2_OUT_MAIN, 15, 0, 0), 839 + { } 840 + }; 841 + 842 + static struct clk_rcg2 cam_cc_mclk0_clk_src = { 843 + .cmd_rcgr = 0x18004, 844 + .mnd_width = 8, 845 + .hid_width = 5, 846 + .parent_map = cam_cc_parent_map_1, 847 + .freq_tbl = ftbl_cam_cc_mclk0_clk_src, 848 + .clkr.hw.init = &(const struct clk_init_data) { 849 + .name = "cam_cc_mclk0_clk_src", 850 + .parent_data = cam_cc_parent_data_1, 851 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_1), 852 + .flags = CLK_SET_RATE_PARENT, 853 + .ops = &clk_rcg2_shared_ops, 854 + }, 855 + }; 856 + 857 + static struct clk_rcg2 cam_cc_mclk1_clk_src = { 858 + .cmd_rcgr = 0x18024, 859 + .mnd_width = 8, 860 + .hid_width = 5, 861 + .parent_map = cam_cc_parent_map_1, 862 + .freq_tbl = ftbl_cam_cc_mclk0_clk_src, 863 + .clkr.hw.init = &(const struct clk_init_data) { 864 + .name = "cam_cc_mclk1_clk_src", 865 + .parent_data = cam_cc_parent_data_1, 866 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_1), 867 + .flags = CLK_SET_RATE_PARENT, 868 + .ops = &clk_rcg2_shared_ops, 869 + }, 870 + }; 871 + 872 + static struct clk_rcg2 cam_cc_mclk2_clk_src = { 873 + .cmd_rcgr = 0x18044, 874 + .mnd_width = 8, 875 + .hid_width = 5, 876 + .parent_map = cam_cc_parent_map_1, 877 + .freq_tbl = ftbl_cam_cc_mclk0_clk_src, 878 + .clkr.hw.init = &(const struct clk_init_data) { 879 + .name = "cam_cc_mclk2_clk_src", 880 + .parent_data = cam_cc_parent_data_1, 881 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_1), 882 + .flags = CLK_SET_RATE_PARENT, 883 + .ops = &clk_rcg2_shared_ops, 884 + }, 885 + }; 886 + 887 + static struct clk_rcg2 cam_cc_mclk3_clk_src = { 888 + .cmd_rcgr = 0x18064, 889 + .mnd_width = 8, 890 + .hid_width = 5, 891 + .parent_map = cam_cc_parent_map_1, 892 + .freq_tbl = ftbl_cam_cc_mclk0_clk_src, 893 + .clkr.hw.init = &(const struct clk_init_data) { 894 + .name = "cam_cc_mclk3_clk_src", 895 + .parent_data = cam_cc_parent_data_1, 896 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_1), 897 + .flags = CLK_SET_RATE_PARENT, 898 + .ops = &clk_rcg2_shared_ops, 899 + }, 900 + }; 901 + 902 + static struct clk_rcg2 cam_cc_mclk4_clk_src = { 903 + .cmd_rcgr = 0x18084, 904 + .mnd_width = 8, 905 + .hid_width = 5, 906 + .parent_map = cam_cc_parent_map_1, 907 + .freq_tbl = ftbl_cam_cc_mclk0_clk_src, 908 + .clkr.hw.init = &(const struct clk_init_data) { 909 + .name = "cam_cc_mclk4_clk_src", 910 + .parent_data = cam_cc_parent_data_1, 911 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_1), 912 + .flags = CLK_SET_RATE_PARENT, 913 + .ops = &clk_rcg2_shared_ops, 914 + }, 915 + }; 916 + 917 + static const struct freq_tbl ftbl_cam_cc_ope_0_clk_src[] = { 918 + F(300000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0), 919 + F(410000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0), 920 + F(520000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0), 921 + F(645000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0), 922 + F(700000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0), 923 + { } 924 + }; 925 + 926 + static struct clk_rcg2 cam_cc_ope_0_clk_src = { 927 + .cmd_rcgr = 0x1b004, 928 + .mnd_width = 0, 929 + .hid_width = 5, 930 + .parent_map = cam_cc_parent_map_5, 931 + .freq_tbl = ftbl_cam_cc_ope_0_clk_src, 932 + .clkr.hw.init = &(const struct clk_init_data) { 933 + .name = "cam_cc_ope_0_clk_src", 934 + .parent_data = cam_cc_parent_data_5, 935 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_5), 936 + .flags = CLK_SET_RATE_PARENT, 937 + .ops = &clk_rcg2_shared_ops, 938 + }, 939 + }; 940 + 941 + static const struct freq_tbl ftbl_cam_cc_sleep_clk_src[] = { 942 + F(32000, P_SLEEP_CLK, 1, 0, 0), 943 + { } 944 + }; 945 + 946 + static struct clk_rcg2 cam_cc_sleep_clk_src = { 947 + .cmd_rcgr = 0x25044, 948 + .mnd_width = 0, 949 + .hid_width = 5, 950 + .parent_map = cam_cc_parent_map_6, 951 + .freq_tbl = ftbl_cam_cc_sleep_clk_src, 952 + .clkr.hw.init = &(const struct clk_init_data) { 953 + .name = "cam_cc_sleep_clk_src", 954 + .parent_data = cam_cc_parent_data_6_ao, 955 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_6_ao), 956 + .flags = CLK_SET_RATE_PARENT, 957 + .ops = &clk_rcg2_ops, 958 + }, 959 + }; 960 + 961 + static const struct freq_tbl ftbl_cam_cc_slow_ahb_clk_src[] = { 962 + F(80000000, P_CAM_CC_PLL0_OUT_EVEN, 7.5, 0, 0), 963 + { } 964 + }; 965 + 966 + static struct clk_rcg2 cam_cc_slow_ahb_clk_src = { 967 + .cmd_rcgr = 0x1a04c, 968 + .mnd_width = 0, 969 + .hid_width = 5, 970 + .parent_map = cam_cc_parent_map_0, 971 + .freq_tbl = ftbl_cam_cc_slow_ahb_clk_src, 972 + .clkr.hw.init = &(const struct clk_init_data) { 973 + .name = "cam_cc_slow_ahb_clk_src", 974 + .parent_data = cam_cc_parent_data_0, 975 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), 976 + .flags = CLK_SET_RATE_PARENT, 977 + .ops = &clk_rcg2_shared_ops, 978 + }, 979 + }; 980 + 981 + static const struct freq_tbl ftbl_cam_cc_tfe_0_clk_src[] = { 982 + F(350000000, P_CAM_CC_PLL4_OUT_EVEN, 1, 0, 0), 983 + F(570000000, P_CAM_CC_PLL4_OUT_EVEN, 1, 0, 0), 984 + F(600000000, P_CAM_CC_PLL4_OUT_EVEN, 1, 0, 0), 985 + F(725000000, P_CAM_CC_PLL4_OUT_EVEN, 1, 0, 0), 986 + { } 987 + }; 988 + 989 + static struct clk_rcg2 cam_cc_tfe_0_clk_src = { 990 + .cmd_rcgr = 0x1c004, 991 + .mnd_width = 0, 992 + .hid_width = 5, 993 + .parent_map = cam_cc_parent_map_7, 994 + .freq_tbl = ftbl_cam_cc_tfe_0_clk_src, 995 + .clkr.hw.init = &(const struct clk_init_data) { 996 + .name = "cam_cc_tfe_0_clk_src", 997 + .parent_data = cam_cc_parent_data_7, 998 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_7), 999 + .flags = CLK_SET_RATE_PARENT, 1000 + .ops = &clk_rcg2_shared_ops, 1001 + }, 1002 + }; 1003 + 1004 + static struct clk_rcg2 cam_cc_tfe_0_csid_clk_src = { 1005 + .cmd_rcgr = 0x1c030, 1006 + .mnd_width = 0, 1007 + .hid_width = 5, 1008 + .parent_map = cam_cc_parent_map_0, 1009 + .freq_tbl = ftbl_cam_cc_cphy_rx_clk_src, 1010 + .clkr.hw.init = &(const struct clk_init_data) { 1011 + .name = "cam_cc_tfe_0_csid_clk_src", 1012 + .parent_data = cam_cc_parent_data_0, 1013 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), 1014 + .flags = CLK_SET_RATE_PARENT, 1015 + .ops = &clk_rcg2_shared_ops, 1016 + }, 1017 + }; 1018 + 1019 + static const struct freq_tbl ftbl_cam_cc_tfe_1_clk_src[] = { 1020 + F(350000000, P_CAM_CC_PLL5_OUT_EVEN, 1, 0, 0), 1021 + F(570000000, P_CAM_CC_PLL5_OUT_EVEN, 1, 0, 0), 1022 + F(600000000, P_CAM_CC_PLL5_OUT_EVEN, 1, 0, 0), 1023 + F(725000000, P_CAM_CC_PLL5_OUT_EVEN, 1, 0, 0), 1024 + { } 1025 + }; 1026 + 1027 + static struct clk_rcg2 cam_cc_tfe_1_clk_src = { 1028 + .cmd_rcgr = 0x1d004, 1029 + .mnd_width = 0, 1030 + .hid_width = 5, 1031 + .parent_map = cam_cc_parent_map_8, 1032 + .freq_tbl = ftbl_cam_cc_tfe_1_clk_src, 1033 + .clkr.hw.init = &(const struct clk_init_data) { 1034 + .name = "cam_cc_tfe_1_clk_src", 1035 + .parent_data = cam_cc_parent_data_8, 1036 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_8), 1037 + .flags = CLK_SET_RATE_PARENT, 1038 + .ops = &clk_rcg2_shared_ops, 1039 + }, 1040 + }; 1041 + 1042 + static struct clk_rcg2 cam_cc_tfe_1_csid_clk_src = { 1043 + .cmd_rcgr = 0x1d030, 1044 + .mnd_width = 0, 1045 + .hid_width = 5, 1046 + .parent_map = cam_cc_parent_map_0, 1047 + .freq_tbl = ftbl_cam_cc_cphy_rx_clk_src, 1048 + .clkr.hw.init = &(const struct clk_init_data) { 1049 + .name = "cam_cc_tfe_1_csid_clk_src", 1050 + .parent_data = cam_cc_parent_data_0, 1051 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), 1052 + .flags = CLK_SET_RATE_PARENT, 1053 + .ops = &clk_rcg2_shared_ops, 1054 + }, 1055 + }; 1056 + 1057 + static const struct freq_tbl ftbl_cam_cc_tfe_2_clk_src[] = { 1058 + F(350000000, P_CAM_CC_PLL6_OUT_EVEN, 1, 0, 0), 1059 + F(570000000, P_CAM_CC_PLL6_OUT_EVEN, 1, 0, 0), 1060 + F(600000000, P_CAM_CC_PLL6_OUT_EVEN, 1, 0, 0), 1061 + F(725000000, P_CAM_CC_PLL6_OUT_EVEN, 1, 0, 0), 1062 + { } 1063 + }; 1064 + 1065 + static struct clk_rcg2 cam_cc_tfe_2_clk_src = { 1066 + .cmd_rcgr = 0x1e004, 1067 + .mnd_width = 0, 1068 + .hid_width = 5, 1069 + .parent_map = cam_cc_parent_map_9, 1070 + .freq_tbl = ftbl_cam_cc_tfe_2_clk_src, 1071 + .clkr.hw.init = &(const struct clk_init_data) { 1072 + .name = "cam_cc_tfe_2_clk_src", 1073 + .parent_data = cam_cc_parent_data_9, 1074 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_9), 1075 + .flags = CLK_SET_RATE_PARENT, 1076 + .ops = &clk_rcg2_shared_ops, 1077 + }, 1078 + }; 1079 + 1080 + static struct clk_rcg2 cam_cc_tfe_2_csid_clk_src = { 1081 + .cmd_rcgr = 0x1e030, 1082 + .mnd_width = 0, 1083 + .hid_width = 5, 1084 + .parent_map = cam_cc_parent_map_0, 1085 + .freq_tbl = ftbl_cam_cc_cphy_rx_clk_src, 1086 + .clkr.hw.init = &(const struct clk_init_data) { 1087 + .name = "cam_cc_tfe_2_csid_clk_src", 1088 + .parent_data = cam_cc_parent_data_0, 1089 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_0), 1090 + .flags = CLK_SET_RATE_PARENT, 1091 + .ops = &clk_rcg2_shared_ops, 1092 + }, 1093 + }; 1094 + 1095 + static const struct freq_tbl ftbl_cam_cc_xo_clk_src[] = { 1096 + F(19200000, P_BI_TCXO, 1, 0, 0), 1097 + { } 1098 + }; 1099 + 1100 + static struct clk_rcg2 cam_cc_xo_clk_src = { 1101 + .cmd_rcgr = 0x25020, 1102 + .mnd_width = 0, 1103 + .hid_width = 5, 1104 + .parent_map = cam_cc_parent_map_10, 1105 + .freq_tbl = ftbl_cam_cc_xo_clk_src, 1106 + .clkr.hw.init = &(const struct clk_init_data) { 1107 + .name = "cam_cc_xo_clk_src", 1108 + .parent_data = cam_cc_parent_data_10, 1109 + .num_parents = ARRAY_SIZE(cam_cc_parent_data_10), 1110 + .flags = CLK_SET_RATE_PARENT, 1111 + .ops = &clk_rcg2_ops, 1112 + }, 1113 + }; 1114 + 1115 + static struct clk_branch cam_cc_bps_ahb_clk = { 1116 + .halt_reg = 0x1a064, 1117 + .halt_check = BRANCH_HALT, 1118 + .clkr = { 1119 + .enable_reg = 0x1a064, 1120 + .enable_mask = BIT(0), 1121 + .hw.init = &(const struct clk_init_data) { 1122 + .name = "cam_cc_bps_ahb_clk", 1123 + .parent_hws = (const struct clk_hw*[]) { 1124 + &cam_cc_slow_ahb_clk_src.clkr.hw, 1125 + }, 1126 + .num_parents = 1, 1127 + .flags = CLK_SET_RATE_PARENT, 1128 + .ops = &clk_branch2_ops, 1129 + }, 1130 + }, 1131 + }; 1132 + 1133 + static struct clk_branch cam_cc_bps_areg_clk = { 1134 + .halt_reg = 0x1a048, 1135 + .halt_check = BRANCH_HALT, 1136 + .clkr = { 1137 + .enable_reg = 0x1a048, 1138 + .enable_mask = BIT(0), 1139 + .hw.init = &(const struct clk_init_data) { 1140 + .name = "cam_cc_bps_areg_clk", 1141 + .parent_hws = (const struct clk_hw*[]) { 1142 + &cam_cc_fast_ahb_clk_src.clkr.hw, 1143 + }, 1144 + .num_parents = 1, 1145 + .flags = CLK_SET_RATE_PARENT, 1146 + .ops = &clk_branch2_ops, 1147 + }, 1148 + }, 1149 + }; 1150 + 1151 + static struct clk_branch cam_cc_bps_clk = { 1152 + .halt_reg = 0x1a01c, 1153 + .halt_check = BRANCH_HALT, 1154 + .clkr = { 1155 + .enable_reg = 0x1a01c, 1156 + .enable_mask = BIT(0), 1157 + .hw.init = &(const struct clk_init_data) { 1158 + .name = "cam_cc_bps_clk", 1159 + .parent_hws = (const struct clk_hw*[]) { 1160 + &cam_cc_bps_clk_src.clkr.hw, 1161 + }, 1162 + .num_parents = 1, 1163 + .flags = CLK_SET_RATE_PARENT, 1164 + .ops = &clk_branch2_ops, 1165 + }, 1166 + }, 1167 + }; 1168 + 1169 + static struct clk_branch cam_cc_camnoc_atb_clk = { 1170 + .halt_reg = 0x24040, 1171 + .halt_check = BRANCH_HALT, 1172 + .clkr = { 1173 + .enable_reg = 0x24040, 1174 + .enable_mask = BIT(0), 1175 + .hw.init = &(const struct clk_init_data) { 1176 + .name = "cam_cc_camnoc_atb_clk", 1177 + .ops = &clk_branch2_ops, 1178 + }, 1179 + }, 1180 + }; 1181 + 1182 + static struct clk_branch cam_cc_camnoc_axi_hf_clk = { 1183 + .halt_reg = 0x24010, 1184 + .halt_check = BRANCH_HALT, 1185 + .clkr = { 1186 + .enable_reg = 0x24010, 1187 + .enable_mask = BIT(0), 1188 + .hw.init = &(const struct clk_init_data) { 1189 + .name = "cam_cc_camnoc_axi_hf_clk", 1190 + .ops = &clk_branch2_ops, 1191 + }, 1192 + }, 1193 + }; 1194 + 1195 + static struct clk_branch cam_cc_camnoc_axi_sf_clk = { 1196 + .halt_reg = 0x24004, 1197 + .halt_check = BRANCH_HALT, 1198 + .clkr = { 1199 + .enable_reg = 0x24004, 1200 + .enable_mask = BIT(0), 1201 + .hw.init = &(const struct clk_init_data) { 1202 + .name = "cam_cc_camnoc_axi_sf_clk", 1203 + .ops = &clk_branch2_ops, 1204 + }, 1205 + }, 1206 + }; 1207 + 1208 + static struct clk_branch cam_cc_camnoc_nrt_axi_clk = { 1209 + .halt_reg = 0x2404c, 1210 + .halt_check = BRANCH_HALT_VOTED, 1211 + .hwcg_reg = 0x2404c, 1212 + .hwcg_bit = 1, 1213 + .clkr = { 1214 + .enable_reg = 0x2404c, 1215 + .enable_mask = BIT(0), 1216 + .hw.init = &(const struct clk_init_data) { 1217 + .name = "cam_cc_camnoc_nrt_axi_clk", 1218 + .parent_hws = (const struct clk_hw*[]) { 1219 + &cam_cc_camnoc_axi_clk_src.clkr.hw, 1220 + }, 1221 + .num_parents = 1, 1222 + .flags = CLK_SET_RATE_PARENT, 1223 + .ops = &clk_branch2_ops, 1224 + }, 1225 + }, 1226 + }; 1227 + 1228 + static struct clk_branch cam_cc_camnoc_rt_axi_clk = { 1229 + .halt_reg = 0x24034, 1230 + .halt_check = BRANCH_HALT, 1231 + .clkr = { 1232 + .enable_reg = 0x24034, 1233 + .enable_mask = BIT(0), 1234 + .hw.init = &(const struct clk_init_data) { 1235 + .name = "cam_cc_camnoc_rt_axi_clk", 1236 + .parent_hws = (const struct clk_hw*[]) { 1237 + &cam_cc_camnoc_axi_clk_src.clkr.hw, 1238 + }, 1239 + .num_parents = 1, 1240 + .flags = CLK_SET_RATE_PARENT, 1241 + .ops = &clk_branch2_ops, 1242 + }, 1243 + }, 1244 + }; 1245 + 1246 + static struct clk_branch cam_cc_cci_0_clk = { 1247 + .halt_reg = 0x2101c, 1248 + .halt_check = BRANCH_HALT, 1249 + .clkr = { 1250 + .enable_reg = 0x2101c, 1251 + .enable_mask = BIT(0), 1252 + .hw.init = &(const struct clk_init_data) { 1253 + .name = "cam_cc_cci_0_clk", 1254 + .parent_hws = (const struct clk_hw*[]) { 1255 + &cam_cc_cci_0_clk_src.clkr.hw, 1256 + }, 1257 + .num_parents = 1, 1258 + .flags = CLK_SET_RATE_PARENT, 1259 + .ops = &clk_branch2_ops, 1260 + }, 1261 + }, 1262 + }; 1263 + 1264 + static struct clk_branch cam_cc_cci_1_clk = { 1265 + .halt_reg = 0x2201c, 1266 + .halt_check = BRANCH_HALT, 1267 + .clkr = { 1268 + .enable_reg = 0x2201c, 1269 + .enable_mask = BIT(0), 1270 + .hw.init = &(const struct clk_init_data) { 1271 + .name = "cam_cc_cci_1_clk", 1272 + .parent_hws = (const struct clk_hw*[]) { 1273 + &cam_cc_cci_1_clk_src.clkr.hw, 1274 + }, 1275 + .num_parents = 1, 1276 + .flags = CLK_SET_RATE_PARENT, 1277 + .ops = &clk_branch2_ops, 1278 + }, 1279 + }, 1280 + }; 1281 + 1282 + static struct clk_branch cam_cc_core_ahb_clk = { 1283 + .halt_reg = 0x2501c, 1284 + .halt_check = BRANCH_HALT_DELAY, 1285 + .clkr = { 1286 + .enable_reg = 0x2501c, 1287 + .enable_mask = BIT(0), 1288 + .hw.init = &(const struct clk_init_data) { 1289 + .name = "cam_cc_core_ahb_clk", 1290 + .parent_hws = (const struct clk_hw*[]) { 1291 + &cam_cc_slow_ahb_clk_src.clkr.hw, 1292 + }, 1293 + .num_parents = 1, 1294 + .flags = CLK_SET_RATE_PARENT, 1295 + .ops = &clk_branch2_ops, 1296 + }, 1297 + }, 1298 + }; 1299 + 1300 + static struct clk_branch cam_cc_cpas_ahb_clk = { 1301 + .halt_reg = 0x23004, 1302 + .halt_check = BRANCH_HALT, 1303 + .clkr = { 1304 + .enable_reg = 0x23004, 1305 + .enable_mask = BIT(0), 1306 + .hw.init = &(const struct clk_init_data) { 1307 + .name = "cam_cc_cpas_ahb_clk", 1308 + .parent_hws = (const struct clk_hw*[]) { 1309 + &cam_cc_slow_ahb_clk_src.clkr.hw, 1310 + }, 1311 + .num_parents = 1, 1312 + .flags = CLK_SET_RATE_PARENT, 1313 + .ops = &clk_branch2_ops, 1314 + }, 1315 + }, 1316 + }; 1317 + 1318 + static struct clk_branch cam_cc_cre_ahb_clk = { 1319 + .halt_reg = 0x27020, 1320 + .halt_check = BRANCH_HALT, 1321 + .clkr = { 1322 + .enable_reg = 0x27020, 1323 + .enable_mask = BIT(0), 1324 + .hw.init = &(const struct clk_init_data) { 1325 + .name = "cam_cc_cre_ahb_clk", 1326 + .parent_hws = (const struct clk_hw*[]) { 1327 + &cam_cc_slow_ahb_clk_src.clkr.hw, 1328 + }, 1329 + .num_parents = 1, 1330 + .flags = CLK_SET_RATE_PARENT, 1331 + .ops = &clk_branch2_ops, 1332 + }, 1333 + }, 1334 + }; 1335 + 1336 + static struct clk_branch cam_cc_cre_clk = { 1337 + .halt_reg = 0x2701c, 1338 + .halt_check = BRANCH_HALT, 1339 + .clkr = { 1340 + .enable_reg = 0x2701c, 1341 + .enable_mask = BIT(0), 1342 + .hw.init = &(const struct clk_init_data) { 1343 + .name = "cam_cc_cre_clk", 1344 + .parent_hws = (const struct clk_hw*[]) { 1345 + &cam_cc_cre_clk_src.clkr.hw, 1346 + }, 1347 + .num_parents = 1, 1348 + .flags = CLK_SET_RATE_PARENT, 1349 + .ops = &clk_branch2_ops, 1350 + }, 1351 + }, 1352 + }; 1353 + 1354 + static struct clk_branch cam_cc_csi0phytimer_clk = { 1355 + .halt_reg = 0x1901c, 1356 + .halt_check = BRANCH_HALT, 1357 + .clkr = { 1358 + .enable_reg = 0x1901c, 1359 + .enable_mask = BIT(0), 1360 + .hw.init = &(const struct clk_init_data) { 1361 + .name = "cam_cc_csi0phytimer_clk", 1362 + .parent_hws = (const struct clk_hw*[]) { 1363 + &cam_cc_csi0phytimer_clk_src.clkr.hw, 1364 + }, 1365 + .num_parents = 1, 1366 + .flags = CLK_SET_RATE_PARENT, 1367 + .ops = &clk_branch2_ops, 1368 + }, 1369 + }, 1370 + }; 1371 + 1372 + static struct clk_branch cam_cc_csi1phytimer_clk = { 1373 + .halt_reg = 0x19040, 1374 + .halt_check = BRANCH_HALT, 1375 + .clkr = { 1376 + .enable_reg = 0x19040, 1377 + .enable_mask = BIT(0), 1378 + .hw.init = &(const struct clk_init_data) { 1379 + .name = "cam_cc_csi1phytimer_clk", 1380 + .parent_hws = (const struct clk_hw*[]) { 1381 + &cam_cc_csi1phytimer_clk_src.clkr.hw, 1382 + }, 1383 + .num_parents = 1, 1384 + .flags = CLK_SET_RATE_PARENT, 1385 + .ops = &clk_branch2_ops, 1386 + }, 1387 + }, 1388 + }; 1389 + 1390 + static struct clk_branch cam_cc_csi2phytimer_clk = { 1391 + .halt_reg = 0x19064, 1392 + .halt_check = BRANCH_HALT, 1393 + .clkr = { 1394 + .enable_reg = 0x19064, 1395 + .enable_mask = BIT(0), 1396 + .hw.init = &(const struct clk_init_data) { 1397 + .name = "cam_cc_csi2phytimer_clk", 1398 + .parent_hws = (const struct clk_hw*[]) { 1399 + &cam_cc_csi2phytimer_clk_src.clkr.hw, 1400 + }, 1401 + .num_parents = 1, 1402 + .flags = CLK_SET_RATE_PARENT, 1403 + .ops = &clk_branch2_ops, 1404 + }, 1405 + }, 1406 + }; 1407 + 1408 + static struct clk_branch cam_cc_csi3phytimer_clk = { 1409 + .halt_reg = 0x19088, 1410 + .halt_check = BRANCH_HALT, 1411 + .clkr = { 1412 + .enable_reg = 0x19088, 1413 + .enable_mask = BIT(0), 1414 + .hw.init = &(const struct clk_init_data) { 1415 + .name = "cam_cc_csi3phytimer_clk", 1416 + .parent_hws = (const struct clk_hw*[]) { 1417 + &cam_cc_csi3phytimer_clk_src.clkr.hw, 1418 + }, 1419 + .num_parents = 1, 1420 + .flags = CLK_SET_RATE_PARENT, 1421 + .ops = &clk_branch2_ops, 1422 + }, 1423 + }, 1424 + }; 1425 + 1426 + static struct clk_branch cam_cc_csiphy0_clk = { 1427 + .halt_reg = 0x19020, 1428 + .halt_check = BRANCH_HALT, 1429 + .clkr = { 1430 + .enable_reg = 0x19020, 1431 + .enable_mask = BIT(0), 1432 + .hw.init = &(const struct clk_init_data) { 1433 + .name = "cam_cc_csiphy0_clk", 1434 + .parent_hws = (const struct clk_hw*[]) { 1435 + &cam_cc_cphy_rx_clk_src.clkr.hw, 1436 + }, 1437 + .num_parents = 1, 1438 + .flags = CLK_SET_RATE_PARENT, 1439 + .ops = &clk_branch2_ops, 1440 + }, 1441 + }, 1442 + }; 1443 + 1444 + static struct clk_branch cam_cc_csiphy1_clk = { 1445 + .halt_reg = 0x19044, 1446 + .halt_check = BRANCH_HALT, 1447 + .clkr = { 1448 + .enable_reg = 0x19044, 1449 + .enable_mask = BIT(0), 1450 + .hw.init = &(const struct clk_init_data) { 1451 + .name = "cam_cc_csiphy1_clk", 1452 + .parent_hws = (const struct clk_hw*[]) { 1453 + &cam_cc_cphy_rx_clk_src.clkr.hw, 1454 + }, 1455 + .num_parents = 1, 1456 + .flags = CLK_SET_RATE_PARENT, 1457 + .ops = &clk_branch2_ops, 1458 + }, 1459 + }, 1460 + }; 1461 + 1462 + static struct clk_branch cam_cc_csiphy2_clk = { 1463 + .halt_reg = 0x19068, 1464 + .halt_check = BRANCH_HALT, 1465 + .clkr = { 1466 + .enable_reg = 0x19068, 1467 + .enable_mask = BIT(0), 1468 + .hw.init = &(const struct clk_init_data) { 1469 + .name = "cam_cc_csiphy2_clk", 1470 + .parent_hws = (const struct clk_hw*[]) { 1471 + &cam_cc_cphy_rx_clk_src.clkr.hw, 1472 + }, 1473 + .num_parents = 1, 1474 + .flags = CLK_SET_RATE_PARENT, 1475 + .ops = &clk_branch2_ops, 1476 + }, 1477 + }, 1478 + }; 1479 + 1480 + static struct clk_branch cam_cc_csiphy3_clk = { 1481 + .halt_reg = 0x1908c, 1482 + .halt_check = BRANCH_HALT, 1483 + .clkr = { 1484 + .enable_reg = 0x1908c, 1485 + .enable_mask = BIT(0), 1486 + .hw.init = &(const struct clk_init_data) { 1487 + .name = "cam_cc_csiphy3_clk", 1488 + .parent_hws = (const struct clk_hw*[]) { 1489 + &cam_cc_cphy_rx_clk_src.clkr.hw, 1490 + }, 1491 + .num_parents = 1, 1492 + .flags = CLK_SET_RATE_PARENT, 1493 + .ops = &clk_branch2_ops, 1494 + }, 1495 + }, 1496 + }; 1497 + 1498 + static struct clk_branch cam_cc_icp_atb_clk = { 1499 + .halt_reg = 0x20004, 1500 + .halt_check = BRANCH_HALT, 1501 + .clkr = { 1502 + .enable_reg = 0x20004, 1503 + .enable_mask = BIT(0), 1504 + .hw.init = &(const struct clk_init_data) { 1505 + .name = "cam_cc_icp_atb_clk", 1506 + .ops = &clk_branch2_ops, 1507 + }, 1508 + }, 1509 + }; 1510 + 1511 + static struct clk_branch cam_cc_icp_clk = { 1512 + .halt_reg = 0x2002c, 1513 + .halt_check = BRANCH_HALT, 1514 + .clkr = { 1515 + .enable_reg = 0x2002c, 1516 + .enable_mask = BIT(0), 1517 + .hw.init = &(const struct clk_init_data) { 1518 + .name = "cam_cc_icp_clk", 1519 + .parent_hws = (const struct clk_hw*[]) { 1520 + &cam_cc_icp_clk_src.clkr.hw, 1521 + }, 1522 + .num_parents = 1, 1523 + .flags = CLK_SET_RATE_PARENT, 1524 + .ops = &clk_branch2_ops, 1525 + }, 1526 + }, 1527 + }; 1528 + 1529 + static struct clk_branch cam_cc_icp_cti_clk = { 1530 + .halt_reg = 0x20008, 1531 + .halt_check = BRANCH_HALT, 1532 + .clkr = { 1533 + .enable_reg = 0x20008, 1534 + .enable_mask = BIT(0), 1535 + .hw.init = &(const struct clk_init_data) { 1536 + .name = "cam_cc_icp_cti_clk", 1537 + .ops = &clk_branch2_ops, 1538 + }, 1539 + }, 1540 + }; 1541 + 1542 + static struct clk_branch cam_cc_icp_ts_clk = { 1543 + .halt_reg = 0x2000c, 1544 + .halt_check = BRANCH_HALT, 1545 + .clkr = { 1546 + .enable_reg = 0x2000c, 1547 + .enable_mask = BIT(0), 1548 + .hw.init = &(const struct clk_init_data) { 1549 + .name = "cam_cc_icp_ts_clk", 1550 + .ops = &clk_branch2_ops, 1551 + }, 1552 + }, 1553 + }; 1554 + 1555 + static struct clk_branch cam_cc_mclk0_clk = { 1556 + .halt_reg = 0x1801c, 1557 + .halt_check = BRANCH_HALT, 1558 + .clkr = { 1559 + .enable_reg = 0x1801c, 1560 + .enable_mask = BIT(0), 1561 + .hw.init = &(const struct clk_init_data) { 1562 + .name = "cam_cc_mclk0_clk", 1563 + .parent_hws = (const struct clk_hw*[]) { 1564 + &cam_cc_mclk0_clk_src.clkr.hw, 1565 + }, 1566 + .num_parents = 1, 1567 + .flags = CLK_SET_RATE_PARENT, 1568 + .ops = &clk_branch2_ops, 1569 + }, 1570 + }, 1571 + }; 1572 + 1573 + static struct clk_branch cam_cc_mclk1_clk = { 1574 + .halt_reg = 0x1803c, 1575 + .halt_check = BRANCH_HALT, 1576 + .clkr = { 1577 + .enable_reg = 0x1803c, 1578 + .enable_mask = BIT(0), 1579 + .hw.init = &(const struct clk_init_data) { 1580 + .name = "cam_cc_mclk1_clk", 1581 + .parent_hws = (const struct clk_hw*[]) { 1582 + &cam_cc_mclk1_clk_src.clkr.hw, 1583 + }, 1584 + .num_parents = 1, 1585 + .flags = CLK_SET_RATE_PARENT, 1586 + .ops = &clk_branch2_ops, 1587 + }, 1588 + }, 1589 + }; 1590 + 1591 + static struct clk_branch cam_cc_mclk2_clk = { 1592 + .halt_reg = 0x1805c, 1593 + .halt_check = BRANCH_HALT, 1594 + .clkr = { 1595 + .enable_reg = 0x1805c, 1596 + .enable_mask = BIT(0), 1597 + .hw.init = &(const struct clk_init_data) { 1598 + .name = "cam_cc_mclk2_clk", 1599 + .parent_hws = (const struct clk_hw*[]) { 1600 + &cam_cc_mclk2_clk_src.clkr.hw, 1601 + }, 1602 + .num_parents = 1, 1603 + .flags = CLK_SET_RATE_PARENT, 1604 + .ops = &clk_branch2_ops, 1605 + }, 1606 + }, 1607 + }; 1608 + 1609 + static struct clk_branch cam_cc_mclk3_clk = { 1610 + .halt_reg = 0x1807c, 1611 + .halt_check = BRANCH_HALT, 1612 + .clkr = { 1613 + .enable_reg = 0x1807c, 1614 + .enable_mask = BIT(0), 1615 + .hw.init = &(const struct clk_init_data) { 1616 + .name = "cam_cc_mclk3_clk", 1617 + .parent_hws = (const struct clk_hw*[]) { 1618 + &cam_cc_mclk3_clk_src.clkr.hw, 1619 + }, 1620 + .num_parents = 1, 1621 + .flags = CLK_SET_RATE_PARENT, 1622 + .ops = &clk_branch2_ops, 1623 + }, 1624 + }, 1625 + }; 1626 + 1627 + static struct clk_branch cam_cc_mclk4_clk = { 1628 + .halt_reg = 0x1809c, 1629 + .halt_check = BRANCH_HALT, 1630 + .clkr = { 1631 + .enable_reg = 0x1809c, 1632 + .enable_mask = BIT(0), 1633 + .hw.init = &(const struct clk_init_data) { 1634 + .name = "cam_cc_mclk4_clk", 1635 + .parent_hws = (const struct clk_hw*[]) { 1636 + &cam_cc_mclk4_clk_src.clkr.hw, 1637 + }, 1638 + .num_parents = 1, 1639 + .flags = CLK_SET_RATE_PARENT, 1640 + .ops = &clk_branch2_ops, 1641 + }, 1642 + }, 1643 + }; 1644 + 1645 + static struct clk_branch cam_cc_ope_0_ahb_clk = { 1646 + .halt_reg = 0x1b034, 1647 + .halt_check = BRANCH_HALT, 1648 + .clkr = { 1649 + .enable_reg = 0x1b034, 1650 + .enable_mask = BIT(0), 1651 + .hw.init = &(const struct clk_init_data) { 1652 + .name = "cam_cc_ope_0_ahb_clk", 1653 + .parent_hws = (const struct clk_hw*[]) { 1654 + &cam_cc_slow_ahb_clk_src.clkr.hw, 1655 + }, 1656 + .num_parents = 1, 1657 + .flags = CLK_SET_RATE_PARENT, 1658 + .ops = &clk_branch2_ops, 1659 + }, 1660 + }, 1661 + }; 1662 + 1663 + static struct clk_branch cam_cc_ope_0_areg_clk = { 1664 + .halt_reg = 0x1b030, 1665 + .halt_check = BRANCH_HALT, 1666 + .clkr = { 1667 + .enable_reg = 0x1b030, 1668 + .enable_mask = BIT(0), 1669 + .hw.init = &(const struct clk_init_data) { 1670 + .name = "cam_cc_ope_0_areg_clk", 1671 + .parent_hws = (const struct clk_hw*[]) { 1672 + &cam_cc_fast_ahb_clk_src.clkr.hw, 1673 + }, 1674 + .num_parents = 1, 1675 + .flags = CLK_SET_RATE_PARENT, 1676 + .ops = &clk_branch2_ops, 1677 + }, 1678 + }, 1679 + }; 1680 + 1681 + static struct clk_branch cam_cc_ope_0_clk = { 1682 + .halt_reg = 0x1b01c, 1683 + .halt_check = BRANCH_HALT, 1684 + .clkr = { 1685 + .enable_reg = 0x1b01c, 1686 + .enable_mask = BIT(0), 1687 + .hw.init = &(const struct clk_init_data) { 1688 + .name = "cam_cc_ope_0_clk", 1689 + .parent_hws = (const struct clk_hw*[]) { 1690 + &cam_cc_ope_0_clk_src.clkr.hw, 1691 + }, 1692 + .num_parents = 1, 1693 + .flags = CLK_SET_RATE_PARENT, 1694 + .ops = &clk_branch2_ops, 1695 + }, 1696 + }, 1697 + }; 1698 + 1699 + static struct clk_branch cam_cc_soc_ahb_clk = { 1700 + .halt_reg = 0x25018, 1701 + .halt_check = BRANCH_HALT, 1702 + .clkr = { 1703 + .enable_reg = 0x25018, 1704 + .enable_mask = BIT(0), 1705 + .hw.init = &(const struct clk_init_data) { 1706 + .name = "cam_cc_soc_ahb_clk", 1707 + .ops = &clk_branch2_ops, 1708 + }, 1709 + }, 1710 + }; 1711 + 1712 + static struct clk_branch cam_cc_sys_tmr_clk = { 1713 + .halt_reg = 0x20038, 1714 + .halt_check = BRANCH_HALT, 1715 + .clkr = { 1716 + .enable_reg = 0x20038, 1717 + .enable_mask = BIT(0), 1718 + .hw.init = &(const struct clk_init_data) { 1719 + .name = "cam_cc_sys_tmr_clk", 1720 + .parent_hws = (const struct clk_hw*[]) { 1721 + &cam_cc_xo_clk_src.clkr.hw, 1722 + }, 1723 + .num_parents = 1, 1724 + .flags = CLK_SET_RATE_PARENT, 1725 + .ops = &clk_branch2_ops, 1726 + }, 1727 + }, 1728 + }; 1729 + 1730 + static struct clk_branch cam_cc_tfe_0_ahb_clk = { 1731 + .halt_reg = 0x1c078, 1732 + .halt_check = BRANCH_HALT, 1733 + .clkr = { 1734 + .enable_reg = 0x1c078, 1735 + .enable_mask = BIT(0), 1736 + .hw.init = &(const struct clk_init_data) { 1737 + .name = "cam_cc_tfe_0_ahb_clk", 1738 + .parent_hws = (const struct clk_hw*[]) { 1739 + &cam_cc_slow_ahb_clk_src.clkr.hw, 1740 + }, 1741 + .num_parents = 1, 1742 + .flags = CLK_SET_RATE_PARENT, 1743 + .ops = &clk_branch2_ops, 1744 + }, 1745 + }, 1746 + }; 1747 + 1748 + static struct clk_branch cam_cc_tfe_0_clk = { 1749 + .halt_reg = 0x1c01c, 1750 + .halt_check = BRANCH_HALT, 1751 + .clkr = { 1752 + .enable_reg = 0x1c01c, 1753 + .enable_mask = BIT(0), 1754 + .hw.init = &(const struct clk_init_data) { 1755 + .name = "cam_cc_tfe_0_clk", 1756 + .parent_hws = (const struct clk_hw*[]) { 1757 + &cam_cc_tfe_0_clk_src.clkr.hw, 1758 + }, 1759 + .num_parents = 1, 1760 + .flags = CLK_SET_RATE_PARENT, 1761 + .ops = &clk_branch2_ops, 1762 + }, 1763 + }, 1764 + }; 1765 + 1766 + static struct clk_branch cam_cc_tfe_0_cphy_rx_clk = { 1767 + .halt_reg = 0x1c074, 1768 + .halt_check = BRANCH_HALT, 1769 + .clkr = { 1770 + .enable_reg = 0x1c074, 1771 + .enable_mask = BIT(0), 1772 + .hw.init = &(const struct clk_init_data) { 1773 + .name = "cam_cc_tfe_0_cphy_rx_clk", 1774 + .parent_hws = (const struct clk_hw*[]) { 1775 + &cam_cc_cphy_rx_clk_src.clkr.hw, 1776 + }, 1777 + .num_parents = 1, 1778 + .flags = CLK_SET_RATE_PARENT, 1779 + .ops = &clk_branch2_ops, 1780 + }, 1781 + }, 1782 + }; 1783 + 1784 + static struct clk_branch cam_cc_tfe_0_csid_clk = { 1785 + .halt_reg = 0x1c048, 1786 + .halt_check = BRANCH_HALT, 1787 + .clkr = { 1788 + .enable_reg = 0x1c048, 1789 + .enable_mask = BIT(0), 1790 + .hw.init = &(const struct clk_init_data) { 1791 + .name = "cam_cc_tfe_0_csid_clk", 1792 + .parent_hws = (const struct clk_hw*[]) { 1793 + &cam_cc_tfe_0_csid_clk_src.clkr.hw, 1794 + }, 1795 + .num_parents = 1, 1796 + .flags = CLK_SET_RATE_PARENT, 1797 + .ops = &clk_branch2_ops, 1798 + }, 1799 + }, 1800 + }; 1801 + 1802 + static struct clk_branch cam_cc_tfe_1_ahb_clk = { 1803 + .halt_reg = 0x1d058, 1804 + .halt_check = BRANCH_HALT, 1805 + .clkr = { 1806 + .enable_reg = 0x1d058, 1807 + .enable_mask = BIT(0), 1808 + .hw.init = &(const struct clk_init_data) { 1809 + .name = "cam_cc_tfe_1_ahb_clk", 1810 + .parent_hws = (const struct clk_hw*[]) { 1811 + &cam_cc_slow_ahb_clk_src.clkr.hw, 1812 + }, 1813 + .num_parents = 1, 1814 + .flags = CLK_SET_RATE_PARENT, 1815 + .ops = &clk_branch2_ops, 1816 + }, 1817 + }, 1818 + }; 1819 + 1820 + static struct clk_branch cam_cc_tfe_1_clk = { 1821 + .halt_reg = 0x1d01c, 1822 + .halt_check = BRANCH_HALT, 1823 + .clkr = { 1824 + .enable_reg = 0x1d01c, 1825 + .enable_mask = BIT(0), 1826 + .hw.init = &(const struct clk_init_data) { 1827 + .name = "cam_cc_tfe_1_clk", 1828 + .parent_hws = (const struct clk_hw*[]) { 1829 + &cam_cc_tfe_1_clk_src.clkr.hw, 1830 + }, 1831 + .num_parents = 1, 1832 + .flags = CLK_SET_RATE_PARENT, 1833 + .ops = &clk_branch2_ops, 1834 + }, 1835 + }, 1836 + }; 1837 + 1838 + static struct clk_branch cam_cc_tfe_1_cphy_rx_clk = { 1839 + .halt_reg = 0x1d054, 1840 + .halt_check = BRANCH_HALT, 1841 + .clkr = { 1842 + .enable_reg = 0x1d054, 1843 + .enable_mask = BIT(0), 1844 + .hw.init = &(const struct clk_init_data) { 1845 + .name = "cam_cc_tfe_1_cphy_rx_clk", 1846 + .parent_hws = (const struct clk_hw*[]) { 1847 + &cam_cc_cphy_rx_clk_src.clkr.hw, 1848 + }, 1849 + .num_parents = 1, 1850 + .flags = CLK_SET_RATE_PARENT, 1851 + .ops = &clk_branch2_ops, 1852 + }, 1853 + }, 1854 + }; 1855 + 1856 + static struct clk_branch cam_cc_tfe_1_csid_clk = { 1857 + .halt_reg = 0x1d048, 1858 + .halt_check = BRANCH_HALT, 1859 + .clkr = { 1860 + .enable_reg = 0x1d048, 1861 + .enable_mask = BIT(0), 1862 + .hw.init = &(const struct clk_init_data) { 1863 + .name = "cam_cc_tfe_1_csid_clk", 1864 + .parent_hws = (const struct clk_hw*[]) { 1865 + &cam_cc_tfe_1_csid_clk_src.clkr.hw, 1866 + }, 1867 + .num_parents = 1, 1868 + .flags = CLK_SET_RATE_PARENT, 1869 + .ops = &clk_branch2_ops, 1870 + }, 1871 + }, 1872 + }; 1873 + 1874 + static struct clk_branch cam_cc_tfe_2_ahb_clk = { 1875 + .halt_reg = 0x1e058, 1876 + .halt_check = BRANCH_HALT, 1877 + .clkr = { 1878 + .enable_reg = 0x1e058, 1879 + .enable_mask = BIT(0), 1880 + .hw.init = &(const struct clk_init_data) { 1881 + .name = "cam_cc_tfe_2_ahb_clk", 1882 + .parent_hws = (const struct clk_hw*[]) { 1883 + &cam_cc_slow_ahb_clk_src.clkr.hw, 1884 + }, 1885 + .num_parents = 1, 1886 + .flags = CLK_SET_RATE_PARENT, 1887 + .ops = &clk_branch2_ops, 1888 + }, 1889 + }, 1890 + }; 1891 + 1892 + static struct clk_branch cam_cc_tfe_2_clk = { 1893 + .halt_reg = 0x1e01c, 1894 + .halt_check = BRANCH_HALT, 1895 + .clkr = { 1896 + .enable_reg = 0x1e01c, 1897 + .enable_mask = BIT(0), 1898 + .hw.init = &(const struct clk_init_data) { 1899 + .name = "cam_cc_tfe_2_clk", 1900 + .parent_hws = (const struct clk_hw*[]) { 1901 + &cam_cc_tfe_2_clk_src.clkr.hw, 1902 + }, 1903 + .num_parents = 1, 1904 + .flags = CLK_SET_RATE_PARENT, 1905 + .ops = &clk_branch2_ops, 1906 + }, 1907 + }, 1908 + }; 1909 + 1910 + static struct clk_branch cam_cc_tfe_2_cphy_rx_clk = { 1911 + .halt_reg = 0x1e054, 1912 + .halt_check = BRANCH_HALT, 1913 + .clkr = { 1914 + .enable_reg = 0x1e054, 1915 + .enable_mask = BIT(0), 1916 + .hw.init = &(const struct clk_init_data) { 1917 + .name = "cam_cc_tfe_2_cphy_rx_clk", 1918 + .parent_hws = (const struct clk_hw*[]) { 1919 + &cam_cc_cphy_rx_clk_src.clkr.hw, 1920 + }, 1921 + .num_parents = 1, 1922 + .flags = CLK_SET_RATE_PARENT, 1923 + .ops = &clk_branch2_ops, 1924 + }, 1925 + }, 1926 + }; 1927 + 1928 + static struct clk_branch cam_cc_tfe_2_csid_clk = { 1929 + .halt_reg = 0x1e048, 1930 + .halt_check = BRANCH_HALT, 1931 + .clkr = { 1932 + .enable_reg = 0x1e048, 1933 + .enable_mask = BIT(0), 1934 + .hw.init = &(const struct clk_init_data) { 1935 + .name = "cam_cc_tfe_2_csid_clk", 1936 + .parent_hws = (const struct clk_hw*[]) { 1937 + &cam_cc_tfe_2_csid_clk_src.clkr.hw, 1938 + }, 1939 + .num_parents = 1, 1940 + .flags = CLK_SET_RATE_PARENT, 1941 + .ops = &clk_branch2_ops, 1942 + }, 1943 + }, 1944 + }; 1945 + 1946 + static struct clk_branch cam_cc_top_shift_clk = { 1947 + .halt_reg = 0x25040, 1948 + .halt_check = BRANCH_HALT_VOTED, 1949 + .clkr = { 1950 + .enable_reg = 0x25040, 1951 + .enable_mask = BIT(0), 1952 + .hw.init = &(const struct clk_init_data) { 1953 + .name = "cam_cc_top_shift_clk", 1954 + .parent_hws = (const struct clk_hw*[]) { 1955 + &cam_cc_xo_clk_src.clkr.hw, 1956 + }, 1957 + .num_parents = 1, 1958 + .flags = CLK_SET_RATE_PARENT, 1959 + .ops = &clk_branch2_ops, 1960 + }, 1961 + }, 1962 + }; 1963 + 1964 + static struct gdsc cam_cc_camss_top_gdsc = { 1965 + .gdscr = 0x25004, 1966 + .en_rest_wait_val = 0x2, 1967 + .en_few_wait_val = 0x2, 1968 + .clk_dis_wait_val = 0xf, 1969 + .pd = { 1970 + .name = "cam_cc_camss_top_gdsc", 1971 + }, 1972 + .pwrsts = PWRSTS_OFF_ON, 1973 + .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 1974 + }; 1975 + 1976 + static struct clk_regmap *cam_cc_milos_clocks[] = { 1977 + [CAM_CC_BPS_AHB_CLK] = &cam_cc_bps_ahb_clk.clkr, 1978 + [CAM_CC_BPS_AREG_CLK] = &cam_cc_bps_areg_clk.clkr, 1979 + [CAM_CC_BPS_CLK] = &cam_cc_bps_clk.clkr, 1980 + [CAM_CC_BPS_CLK_SRC] = &cam_cc_bps_clk_src.clkr, 1981 + [CAM_CC_CAMNOC_ATB_CLK] = &cam_cc_camnoc_atb_clk.clkr, 1982 + [CAM_CC_CAMNOC_AXI_CLK_SRC] = &cam_cc_camnoc_axi_clk_src.clkr, 1983 + [CAM_CC_CAMNOC_AXI_HF_CLK] = &cam_cc_camnoc_axi_hf_clk.clkr, 1984 + [CAM_CC_CAMNOC_AXI_SF_CLK] = &cam_cc_camnoc_axi_sf_clk.clkr, 1985 + [CAM_CC_CAMNOC_NRT_AXI_CLK] = &cam_cc_camnoc_nrt_axi_clk.clkr, 1986 + [CAM_CC_CAMNOC_RT_AXI_CLK] = &cam_cc_camnoc_rt_axi_clk.clkr, 1987 + [CAM_CC_CCI_0_CLK] = &cam_cc_cci_0_clk.clkr, 1988 + [CAM_CC_CCI_0_CLK_SRC] = &cam_cc_cci_0_clk_src.clkr, 1989 + [CAM_CC_CCI_1_CLK] = &cam_cc_cci_1_clk.clkr, 1990 + [CAM_CC_CCI_1_CLK_SRC] = &cam_cc_cci_1_clk_src.clkr, 1991 + [CAM_CC_CORE_AHB_CLK] = &cam_cc_core_ahb_clk.clkr, 1992 + [CAM_CC_CPAS_AHB_CLK] = &cam_cc_cpas_ahb_clk.clkr, 1993 + [CAM_CC_CPHY_RX_CLK_SRC] = &cam_cc_cphy_rx_clk_src.clkr, 1994 + [CAM_CC_CRE_AHB_CLK] = &cam_cc_cre_ahb_clk.clkr, 1995 + [CAM_CC_CRE_CLK] = &cam_cc_cre_clk.clkr, 1996 + [CAM_CC_CRE_CLK_SRC] = &cam_cc_cre_clk_src.clkr, 1997 + [CAM_CC_CSI0PHYTIMER_CLK] = &cam_cc_csi0phytimer_clk.clkr, 1998 + [CAM_CC_CSI0PHYTIMER_CLK_SRC] = &cam_cc_csi0phytimer_clk_src.clkr, 1999 + [CAM_CC_CSI1PHYTIMER_CLK] = &cam_cc_csi1phytimer_clk.clkr, 2000 + [CAM_CC_CSI1PHYTIMER_CLK_SRC] = &cam_cc_csi1phytimer_clk_src.clkr, 2001 + [CAM_CC_CSI2PHYTIMER_CLK] = &cam_cc_csi2phytimer_clk.clkr, 2002 + [CAM_CC_CSI2PHYTIMER_CLK_SRC] = &cam_cc_csi2phytimer_clk_src.clkr, 2003 + [CAM_CC_CSI3PHYTIMER_CLK] = &cam_cc_csi3phytimer_clk.clkr, 2004 + [CAM_CC_CSI3PHYTIMER_CLK_SRC] = &cam_cc_csi3phytimer_clk_src.clkr, 2005 + [CAM_CC_CSIPHY0_CLK] = &cam_cc_csiphy0_clk.clkr, 2006 + [CAM_CC_CSIPHY1_CLK] = &cam_cc_csiphy1_clk.clkr, 2007 + [CAM_CC_CSIPHY2_CLK] = &cam_cc_csiphy2_clk.clkr, 2008 + [CAM_CC_CSIPHY3_CLK] = &cam_cc_csiphy3_clk.clkr, 2009 + [CAM_CC_FAST_AHB_CLK_SRC] = &cam_cc_fast_ahb_clk_src.clkr, 2010 + [CAM_CC_ICP_ATB_CLK] = &cam_cc_icp_atb_clk.clkr, 2011 + [CAM_CC_ICP_CLK] = &cam_cc_icp_clk.clkr, 2012 + [CAM_CC_ICP_CLK_SRC] = &cam_cc_icp_clk_src.clkr, 2013 + [CAM_CC_ICP_CTI_CLK] = &cam_cc_icp_cti_clk.clkr, 2014 + [CAM_CC_ICP_TS_CLK] = &cam_cc_icp_ts_clk.clkr, 2015 + [CAM_CC_MCLK0_CLK] = &cam_cc_mclk0_clk.clkr, 2016 + [CAM_CC_MCLK0_CLK_SRC] = &cam_cc_mclk0_clk_src.clkr, 2017 + [CAM_CC_MCLK1_CLK] = &cam_cc_mclk1_clk.clkr, 2018 + [CAM_CC_MCLK1_CLK_SRC] = &cam_cc_mclk1_clk_src.clkr, 2019 + [CAM_CC_MCLK2_CLK] = &cam_cc_mclk2_clk.clkr, 2020 + [CAM_CC_MCLK2_CLK_SRC] = &cam_cc_mclk2_clk_src.clkr, 2021 + [CAM_CC_MCLK3_CLK] = &cam_cc_mclk3_clk.clkr, 2022 + [CAM_CC_MCLK3_CLK_SRC] = &cam_cc_mclk3_clk_src.clkr, 2023 + [CAM_CC_MCLK4_CLK] = &cam_cc_mclk4_clk.clkr, 2024 + [CAM_CC_MCLK4_CLK_SRC] = &cam_cc_mclk4_clk_src.clkr, 2025 + [CAM_CC_OPE_0_AHB_CLK] = &cam_cc_ope_0_ahb_clk.clkr, 2026 + [CAM_CC_OPE_0_AREG_CLK] = &cam_cc_ope_0_areg_clk.clkr, 2027 + [CAM_CC_OPE_0_CLK] = &cam_cc_ope_0_clk.clkr, 2028 + [CAM_CC_OPE_0_CLK_SRC] = &cam_cc_ope_0_clk_src.clkr, 2029 + [CAM_CC_PLL0] = &cam_cc_pll0.clkr, 2030 + [CAM_CC_PLL0_OUT_EVEN] = &cam_cc_pll0_out_even.clkr, 2031 + [CAM_CC_PLL0_OUT_ODD] = &cam_cc_pll0_out_odd.clkr, 2032 + [CAM_CC_PLL1] = &cam_cc_pll1.clkr, 2033 + [CAM_CC_PLL1_OUT_EVEN] = &cam_cc_pll1_out_even.clkr, 2034 + [CAM_CC_PLL2] = &cam_cc_pll2.clkr, 2035 + [CAM_CC_PLL3] = &cam_cc_pll3.clkr, 2036 + [CAM_CC_PLL3_OUT_EVEN] = &cam_cc_pll3_out_even.clkr, 2037 + [CAM_CC_PLL4] = &cam_cc_pll4.clkr, 2038 + [CAM_CC_PLL4_OUT_EVEN] = &cam_cc_pll4_out_even.clkr, 2039 + [CAM_CC_PLL5] = &cam_cc_pll5.clkr, 2040 + [CAM_CC_PLL5_OUT_EVEN] = &cam_cc_pll5_out_even.clkr, 2041 + [CAM_CC_PLL6] = &cam_cc_pll6.clkr, 2042 + [CAM_CC_PLL6_OUT_EVEN] = &cam_cc_pll6_out_even.clkr, 2043 + [CAM_CC_SLEEP_CLK_SRC] = &cam_cc_sleep_clk_src.clkr, 2044 + [CAM_CC_SLOW_AHB_CLK_SRC] = &cam_cc_slow_ahb_clk_src.clkr, 2045 + [CAM_CC_SOC_AHB_CLK] = &cam_cc_soc_ahb_clk.clkr, 2046 + [CAM_CC_SYS_TMR_CLK] = &cam_cc_sys_tmr_clk.clkr, 2047 + [CAM_CC_TFE_0_AHB_CLK] = &cam_cc_tfe_0_ahb_clk.clkr, 2048 + [CAM_CC_TFE_0_CLK] = &cam_cc_tfe_0_clk.clkr, 2049 + [CAM_CC_TFE_0_CLK_SRC] = &cam_cc_tfe_0_clk_src.clkr, 2050 + [CAM_CC_TFE_0_CPHY_RX_CLK] = &cam_cc_tfe_0_cphy_rx_clk.clkr, 2051 + [CAM_CC_TFE_0_CSID_CLK] = &cam_cc_tfe_0_csid_clk.clkr, 2052 + [CAM_CC_TFE_0_CSID_CLK_SRC] = &cam_cc_tfe_0_csid_clk_src.clkr, 2053 + [CAM_CC_TFE_1_AHB_CLK] = &cam_cc_tfe_1_ahb_clk.clkr, 2054 + [CAM_CC_TFE_1_CLK] = &cam_cc_tfe_1_clk.clkr, 2055 + [CAM_CC_TFE_1_CLK_SRC] = &cam_cc_tfe_1_clk_src.clkr, 2056 + [CAM_CC_TFE_1_CPHY_RX_CLK] = &cam_cc_tfe_1_cphy_rx_clk.clkr, 2057 + [CAM_CC_TFE_1_CSID_CLK] = &cam_cc_tfe_1_csid_clk.clkr, 2058 + [CAM_CC_TFE_1_CSID_CLK_SRC] = &cam_cc_tfe_1_csid_clk_src.clkr, 2059 + [CAM_CC_TFE_2_AHB_CLK] = &cam_cc_tfe_2_ahb_clk.clkr, 2060 + [CAM_CC_TFE_2_CLK] = &cam_cc_tfe_2_clk.clkr, 2061 + [CAM_CC_TFE_2_CLK_SRC] = &cam_cc_tfe_2_clk_src.clkr, 2062 + [CAM_CC_TFE_2_CPHY_RX_CLK] = &cam_cc_tfe_2_cphy_rx_clk.clkr, 2063 + [CAM_CC_TFE_2_CSID_CLK] = &cam_cc_tfe_2_csid_clk.clkr, 2064 + [CAM_CC_TFE_2_CSID_CLK_SRC] = &cam_cc_tfe_2_csid_clk_src.clkr, 2065 + [CAM_CC_TOP_SHIFT_CLK] = &cam_cc_top_shift_clk.clkr, 2066 + [CAM_CC_XO_CLK_SRC] = &cam_cc_xo_clk_src.clkr, 2067 + }; 2068 + 2069 + static const struct qcom_reset_map cam_cc_milos_resets[] = { 2070 + [CAM_CC_BPS_BCR] = { 0x1a000 }, 2071 + [CAM_CC_CAMNOC_BCR] = { 0x24000 }, 2072 + [CAM_CC_CAMSS_TOP_BCR] = { 0x25000 }, 2073 + [CAM_CC_CCI_0_BCR] = { 0x21000 }, 2074 + [CAM_CC_CCI_1_BCR] = { 0x22000 }, 2075 + [CAM_CC_CPAS_BCR] = { 0x23000 }, 2076 + [CAM_CC_CRE_BCR] = { 0x27000 }, 2077 + [CAM_CC_CSI0PHY_BCR] = { 0x19000 }, 2078 + [CAM_CC_CSI1PHY_BCR] = { 0x19024 }, 2079 + [CAM_CC_CSI2PHY_BCR] = { 0x19048 }, 2080 + [CAM_CC_CSI3PHY_BCR] = { 0x1906c }, 2081 + [CAM_CC_ICP_BCR] = { 0x20000 }, 2082 + [CAM_CC_MCLK0_BCR] = { 0x18000 }, 2083 + [CAM_CC_MCLK1_BCR] = { 0x18020 }, 2084 + [CAM_CC_MCLK2_BCR] = { 0x18040 }, 2085 + [CAM_CC_MCLK3_BCR] = { 0x18060 }, 2086 + [CAM_CC_MCLK4_BCR] = { 0x18080 }, 2087 + [CAM_CC_OPE_0_BCR] = { 0x1b000 }, 2088 + [CAM_CC_TFE_0_BCR] = { 0x1c000 }, 2089 + [CAM_CC_TFE_1_BCR] = { 0x1d000 }, 2090 + [CAM_CC_TFE_2_BCR] = { 0x1e000 }, 2091 + }; 2092 + 2093 + static struct gdsc *cam_cc_milos_gdscs[] = { 2094 + [CAM_CC_CAMSS_TOP_GDSC] = &cam_cc_camss_top_gdsc, 2095 + }; 2096 + 2097 + static struct clk_alpha_pll *cam_cc_milos_plls[] = { 2098 + &cam_cc_pll0, 2099 + &cam_cc_pll1, 2100 + &cam_cc_pll2, 2101 + &cam_cc_pll3, 2102 + &cam_cc_pll4, 2103 + &cam_cc_pll5, 2104 + &cam_cc_pll6, 2105 + }; 2106 + 2107 + static u32 cam_cc_milos_critical_cbcrs[] = { 2108 + 0x25038, /* CAM_CC_GDSC_CLK */ 2109 + 0x2505c, /* CAM_CC_SLEEP_CLK */ 2110 + }; 2111 + 2112 + static const struct regmap_config cam_cc_milos_regmap_config = { 2113 + .reg_bits = 32, 2114 + .reg_stride = 4, 2115 + .val_bits = 32, 2116 + .max_register = 0x30728, 2117 + .fast_io = true, 2118 + }; 2119 + 2120 + static struct qcom_cc_driver_data cam_cc_milos_driver_data = { 2121 + .alpha_plls = cam_cc_milos_plls, 2122 + .num_alpha_plls = ARRAY_SIZE(cam_cc_milos_plls), 2123 + .clk_cbcrs = cam_cc_milos_critical_cbcrs, 2124 + .num_clk_cbcrs = ARRAY_SIZE(cam_cc_milos_critical_cbcrs), 2125 + }; 2126 + 2127 + static struct qcom_cc_desc cam_cc_milos_desc = { 2128 + .config = &cam_cc_milos_regmap_config, 2129 + .clks = cam_cc_milos_clocks, 2130 + .num_clks = ARRAY_SIZE(cam_cc_milos_clocks), 2131 + .resets = cam_cc_milos_resets, 2132 + .num_resets = ARRAY_SIZE(cam_cc_milos_resets), 2133 + .gdscs = cam_cc_milos_gdscs, 2134 + .num_gdscs = ARRAY_SIZE(cam_cc_milos_gdscs), 2135 + .use_rpm = true, 2136 + .driver_data = &cam_cc_milos_driver_data, 2137 + }; 2138 + 2139 + static const struct of_device_id cam_cc_milos_match_table[] = { 2140 + { .compatible = "qcom,milos-camcc" }, 2141 + { } 2142 + }; 2143 + MODULE_DEVICE_TABLE(of, cam_cc_milos_match_table); 2144 + 2145 + static int cam_cc_milos_probe(struct platform_device *pdev) 2146 + { 2147 + return qcom_cc_probe(pdev, &cam_cc_milos_desc); 2148 + } 2149 + 2150 + static struct platform_driver cam_cc_milos_driver = { 2151 + .probe = cam_cc_milos_probe, 2152 + .driver = { 2153 + .name = "cam_cc-milos", 2154 + .of_match_table = cam_cc_milos_match_table, 2155 + }, 2156 + }; 2157 + 2158 + module_platform_driver(cam_cc_milos_driver); 2159 + 2160 + MODULE_DESCRIPTION("QTI CAM_CC Milos Driver"); 2161 + MODULE_LICENSE("GPL");