File Index
Files and directories
Sign in
FILE

camcc-sa8775p.c

File preview with syntax highlighting.

linux-6.19.14/drivers/clk/qcom/camcc-sa8775p.c C
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved.
   4 */
   5
   6#include <linux/clk-provider.h>
   7#include <linux/module.h>
   8#include <linux/mod_devicetable.h>
   9#include <linux/platform_device.h>
  10#include <linux/pm_runtime.h>
  11#include <linux/regmap.h>
  12
  13#include <dt-bindings/clock/qcom,qcs8300-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
  26enum {
  27	DT_IFACE,
  28	DT_BI_TCXO,
  29	DT_BI_TCXO_AO,
  30	DT_SLEEP_CLK,
  31};
  32
  33enum {
  34	P_BI_TCXO,
  35	P_BI_TCXO_AO,
  36	P_CAM_CC_PLL0_OUT_EVEN,
  37	P_CAM_CC_PLL0_OUT_MAIN,
  38	P_CAM_CC_PLL0_OUT_ODD,
  39	P_CAM_CC_PLL2_OUT_EVEN,
  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_PLL5_OUT_EVEN,
  44	P_SLEEP_CLK,
  45};
  46
  47static const struct pll_vco lucid_evo_vco[] = {
  48	{ 249600000, 2020000000, 0 },
  49};
  50
  51static const struct pll_vco rivian_evo_vco[] = {
  52	{ 864000000, 1056000000, 0 },
  53};
  54
  55static const struct alpha_pll_config cam_cc_pll0_config = {
  56	.l = 0x3e,
  57	.alpha = 0x8000,
  58	.config_ctl_val = 0x20485699,
  59	.config_ctl_hi_val = 0x00182261,
  60	.config_ctl_hi1_val = 0x32aa299c,
  61	.user_ctl_val = 0x00008400,
  62	.user_ctl_hi_val = 0x00400805,
  63};
  64
  65static struct clk_alpha_pll cam_cc_pll0 = {
  66	.offset = 0x0,
  67	.vco_table = lucid_evo_vco,
  68	.num_vco = ARRAY_SIZE(lucid_evo_vco),
  69	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
  70	.clkr = {
  71		.hw.init = &(const struct clk_init_data) {
  72			.name = "cam_cc_pll0",
  73			.parent_data = &(const struct clk_parent_data) {
  74				.index = DT_BI_TCXO,
  75			},
  76			.num_parents = 1,
  77			.ops = &clk_alpha_pll_lucid_evo_ops,
  78		},
  79	},
  80};
  81
  82static const struct clk_div_table post_div_table_cam_cc_pll0_out_even[] = {
  83	{ 0x1, 2 },
  84	{ }
  85};
  86
  87static struct clk_alpha_pll_postdiv cam_cc_pll0_out_even = {
  88	.offset = 0x0,
  89	.post_div_shift = 10,
  90	.post_div_table = post_div_table_cam_cc_pll0_out_even,
  91	.num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll0_out_even),
  92	.width = 4,
  93	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
  94	.clkr.hw.init = &(const struct clk_init_data) {
  95		.name = "cam_cc_pll0_out_even",
  96		.parent_hws = (const struct clk_hw*[]) {
  97			&cam_cc_pll0.clkr.hw,
  98		},
  99		.num_parents = 1,
 100		.flags = CLK_SET_RATE_PARENT,
 101		.ops = &clk_alpha_pll_postdiv_lucid_evo_ops,
 102	},
 103};
 104
 105static const struct clk_div_table post_div_table_cam_cc_pll0_out_odd[] = {
 106	{ 0x2, 3 },
 107	{ }
 108};
 109
 110static struct clk_alpha_pll_postdiv cam_cc_pll0_out_odd = {
 111	.offset = 0x0,
 112	.post_div_shift = 14,
 113	.post_div_table = post_div_table_cam_cc_pll0_out_odd,
 114	.num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll0_out_odd),
 115	.width = 4,
 116	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
 117	.clkr.hw.init = &(const struct clk_init_data) {
 118		.name = "cam_cc_pll0_out_odd",
 119		.parent_hws = (const struct clk_hw*[]) {
 120			&cam_cc_pll0.clkr.hw,
 121		},
 122		.num_parents = 1,
 123		.flags = CLK_SET_RATE_PARENT,
 124		.ops = &clk_alpha_pll_postdiv_lucid_evo_ops,
 125	},
 126};
 127
 128static const struct alpha_pll_config cam_cc_pll2_config = {
 129	.l = 0x32,
 130	.alpha = 0x0,
 131	.config_ctl_val = 0x90008820,
 132	.config_ctl_hi_val = 0x00890263,
 133	.config_ctl_hi1_val = 0x00000247,
 134	.user_ctl_val = 0x00000000,
 135	.user_ctl_hi_val = 0x00400000,
 136};
 137
 138static struct clk_alpha_pll cam_cc_pll2 = {
 139	.offset = 0x1000,
 140	.vco_table = rivian_evo_vco,
 141	.num_vco = ARRAY_SIZE(rivian_evo_vco),
 142	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_RIVIAN_EVO],
 143	.clkr = {
 144		.hw.init = &(const struct clk_init_data) {
 145			.name = "cam_cc_pll2",
 146			.parent_data = &(const struct clk_parent_data) {
 147				.index = DT_BI_TCXO,
 148			},
 149			.num_parents = 1,
 150			.ops = &clk_alpha_pll_rivian_evo_ops,
 151		},
 152	},
 153};
 154
 155static const struct alpha_pll_config cam_cc_pll3_config = {
 156	.l = 0x32,
 157	.alpha = 0x0,
 158	.config_ctl_val = 0x20485699,
 159	.config_ctl_hi_val = 0x00182261,
 160	.config_ctl_hi1_val = 0x32aa299c,
 161	.user_ctl_val = 0x00000400,
 162	.user_ctl_hi_val = 0x00400805,
 163};
 164
 165static struct clk_alpha_pll cam_cc_pll3 = {
 166	.offset = 0x2000,
 167	.vco_table = lucid_evo_vco,
 168	.num_vco = ARRAY_SIZE(lucid_evo_vco),
 169	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
 170	.clkr = {
 171		.hw.init = &(const struct clk_init_data) {
 172			.name = "cam_cc_pll3",
 173			.parent_data = &(const struct clk_parent_data) {
 174				.index = DT_BI_TCXO,
 175			},
 176			.num_parents = 1,
 177			.ops = &clk_alpha_pll_lucid_evo_ops,
 178		},
 179	},
 180};
 181
 182static const struct clk_div_table post_div_table_cam_cc_pll3_out_even[] = {
 183	{ 0x1, 2 },
 184	{ }
 185};
 186
 187static struct clk_alpha_pll_postdiv cam_cc_pll3_out_even = {
 188	.offset = 0x2000,
 189	.post_div_shift = 10,
 190	.post_div_table = post_div_table_cam_cc_pll3_out_even,
 191	.num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll3_out_even),
 192	.width = 4,
 193	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
 194	.clkr.hw.init = &(const struct clk_init_data) {
 195		.name = "cam_cc_pll3_out_even",
 196		.parent_hws = (const struct clk_hw*[]) {
 197			&cam_cc_pll3.clkr.hw,
 198		},
 199		.num_parents = 1,
 200		.flags = CLK_SET_RATE_PARENT,
 201		.ops = &clk_alpha_pll_postdiv_lucid_evo_ops,
 202	},
 203};
 204
 205static const struct alpha_pll_config cam_cc_pll4_config = {
 206	.l = 0x32,
 207	.alpha = 0x0,
 208	.config_ctl_val = 0x20485699,
 209	.config_ctl_hi_val = 0x00182261,
 210	.config_ctl_hi1_val = 0x32aa299c,
 211	.user_ctl_val = 0x00000400,
 212	.user_ctl_hi_val = 0x00400805,
 213};
 214
 215static struct clk_alpha_pll cam_cc_pll4 = {
 216	.offset = 0x3000,
 217	.vco_table = lucid_evo_vco,
 218	.num_vco = ARRAY_SIZE(lucid_evo_vco),
 219	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
 220	.clkr = {
 221		.hw.init = &(const struct clk_init_data) {
 222			.name = "cam_cc_pll4",
 223			.parent_data = &(const struct clk_parent_data) {
 224				.index = DT_BI_TCXO,
 225			},
 226			.num_parents = 1,
 227			.ops = &clk_alpha_pll_lucid_evo_ops,
 228		},
 229	},
 230};
 231
 232static const struct clk_div_table post_div_table_cam_cc_pll4_out_even[] = {
 233	{ 0x1, 2 },
 234	{ }
 235};
 236
 237static struct clk_alpha_pll_postdiv cam_cc_pll4_out_even = {
 238	.offset = 0x3000,
 239	.post_div_shift = 10,
 240	.post_div_table = post_div_table_cam_cc_pll4_out_even,
 241	.num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll4_out_even),
 242	.width = 4,
 243	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
 244	.clkr.hw.init = &(const struct clk_init_data) {
 245		.name = "cam_cc_pll4_out_even",
 246		.parent_hws = (const struct clk_hw*[]) {
 247			&cam_cc_pll4.clkr.hw,
 248		},
 249		.num_parents = 1,
 250		.flags = CLK_SET_RATE_PARENT,
 251		.ops = &clk_alpha_pll_postdiv_lucid_evo_ops,
 252	},
 253};
 254
 255static const struct alpha_pll_config cam_cc_pll5_config = {
 256	.l = 0x32,
 257	.alpha = 0x0,
 258	.config_ctl_val = 0x20485699,
 259	.config_ctl_hi_val = 0x00182261,
 260	.config_ctl_hi1_val = 0x32aa299c,
 261	.user_ctl_val = 0x00000400,
 262	.user_ctl_hi_val = 0x00400805,
 263};
 264
 265static struct clk_alpha_pll cam_cc_pll5 = {
 266	.offset = 0x4000,
 267	.vco_table = lucid_evo_vco,
 268	.num_vco = ARRAY_SIZE(lucid_evo_vco),
 269	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
 270	.clkr = {
 271		.hw.init = &(const struct clk_init_data) {
 272			.name = "cam_cc_pll5",
 273			.parent_data = &(const struct clk_parent_data) {
 274				.index = DT_BI_TCXO,
 275			},
 276			.num_parents = 1,
 277			.ops = &clk_alpha_pll_lucid_evo_ops,
 278		},
 279	},
 280};
 281
 282static const struct clk_div_table post_div_table_cam_cc_pll5_out_even[] = {
 283	{ 0x1, 2 },
 284	{ }
 285};
 286
 287static struct clk_alpha_pll_postdiv cam_cc_pll5_out_even = {
 288	.offset = 0x4000,
 289	.post_div_shift = 10,
 290	.post_div_table = post_div_table_cam_cc_pll5_out_even,
 291	.num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll5_out_even),
 292	.width = 4,
 293	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
 294	.clkr.hw.init = &(const struct clk_init_data) {
 295		.name = "cam_cc_pll5_out_even",
 296		.parent_hws = (const struct clk_hw*[]) {
 297			&cam_cc_pll5.clkr.hw,
 298		},
 299		.num_parents = 1,
 300		.flags = CLK_SET_RATE_PARENT,
 301		.ops = &clk_alpha_pll_postdiv_lucid_evo_ops,
 302	},
 303};
 304
 305static const struct parent_map cam_cc_parent_map_0[] = {
 306	{ P_BI_TCXO, 0 },
 307	{ P_CAM_CC_PLL0_OUT_MAIN, 1 },
 308	{ P_CAM_CC_PLL0_OUT_EVEN, 2 },
 309	{ P_CAM_CC_PLL0_OUT_ODD, 3 },
 310};
 311
 312static const struct clk_parent_data cam_cc_parent_data_0[] = {
 313	{ .index = DT_BI_TCXO },
 314	{ .hw = &cam_cc_pll0.clkr.hw },
 315	{ .hw = &cam_cc_pll0_out_even.clkr.hw },
 316	{ .hw = &cam_cc_pll0_out_odd.clkr.hw },
 317};
 318
 319static const struct parent_map cam_cc_parent_map_1[] = {
 320	{ P_BI_TCXO, 0 },
 321	{ P_CAM_CC_PLL2_OUT_EVEN, 3 },
 322	{ P_CAM_CC_PLL2_OUT_MAIN, 5 },
 323};
 324
 325static const struct clk_parent_data cam_cc_parent_data_1[] = {
 326	{ .index = DT_BI_TCXO },
 327	{ .hw = &cam_cc_pll2.clkr.hw },
 328	{ .hw = &cam_cc_pll2.clkr.hw },
 329};
 330
 331static const struct parent_map cam_cc_parent_map_2[] = {
 332	{ P_BI_TCXO, 0 },
 333	{ P_CAM_CC_PLL4_OUT_EVEN, 6 },
 334};
 335
 336static const struct clk_parent_data cam_cc_parent_data_2[] = {
 337	{ .index = DT_BI_TCXO },
 338	{ .hw = &cam_cc_pll4_out_even.clkr.hw },
 339};
 340
 341static const struct parent_map cam_cc_parent_map_3[] = {
 342	{ P_BI_TCXO, 0 },
 343	{ P_CAM_CC_PLL5_OUT_EVEN, 6 },
 344};
 345
 346static const struct clk_parent_data cam_cc_parent_data_3[] = {
 347	{ .index = DT_BI_TCXO },
 348	{ .hw = &cam_cc_pll5_out_even.clkr.hw },
 349};
 350
 351static const struct parent_map cam_cc_parent_map_4[] = {
 352	{ P_BI_TCXO, 0 },
 353	{ P_CAM_CC_PLL3_OUT_EVEN, 6 },
 354};
 355
 356static const struct clk_parent_data cam_cc_parent_data_4[] = {
 357	{ .index = DT_BI_TCXO },
 358	{ .hw = &cam_cc_pll3_out_even.clkr.hw },
 359};
 360
 361static const struct parent_map cam_cc_parent_map_5[] = {
 362	{ P_SLEEP_CLK, 0 },
 363};
 364
 365static const struct clk_parent_data cam_cc_parent_data_5[] = {
 366	{ .index = DT_SLEEP_CLK },
 367};
 368
 369static const struct parent_map cam_cc_parent_map_6_ao[] = {
 370	{ P_BI_TCXO_AO, 0 },
 371};
 372
 373static const struct clk_parent_data cam_cc_parent_data_6_ao[] = {
 374	{ .index = DT_BI_TCXO_AO },
 375};
 376
 377static const struct freq_tbl ftbl_cam_cc_camnoc_axi_clk_src[] = {
 378	F(400000000, P_CAM_CC_PLL0_OUT_MAIN, 3, 0, 0),
 379	{ }
 380};
 381
 382static struct clk_rcg2 cam_cc_camnoc_axi_clk_src = {
 383	.cmd_rcgr = 0x13170,
 384	.mnd_width = 0,
 385	.hid_width = 5,
 386	.parent_map = cam_cc_parent_map_0,
 387	.freq_tbl = ftbl_cam_cc_camnoc_axi_clk_src,
 388	.clkr.hw.init = &(const struct clk_init_data) {
 389		.name = "cam_cc_camnoc_axi_clk_src",
 390		.parent_data = cam_cc_parent_data_0,
 391		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
 392		.flags = CLK_SET_RATE_PARENT,
 393		.ops = &clk_rcg2_shared_ops,
 394	},
 395};
 396
 397static const struct freq_tbl ftbl_cam_cc_cci_0_clk_src[] = {
 398	F(37500000, P_CAM_CC_PLL0_OUT_MAIN, 16, 1, 2),
 399	{ }
 400};
 401
 402static struct clk_rcg2 cam_cc_cci_0_clk_src = {
 403	.cmd_rcgr = 0x130a0,
 404	.mnd_width = 8,
 405	.hid_width = 5,
 406	.parent_map = cam_cc_parent_map_0,
 407	.freq_tbl = ftbl_cam_cc_cci_0_clk_src,
 408	.clkr.hw.init = &(const struct clk_init_data) {
 409		.name = "cam_cc_cci_0_clk_src",
 410		.parent_data = cam_cc_parent_data_0,
 411		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
 412		.flags = CLK_SET_RATE_PARENT,
 413		.ops = &clk_rcg2_shared_ops,
 414	},
 415};
 416
 417static struct clk_rcg2 cam_cc_cci_1_clk_src = {
 418	.cmd_rcgr = 0x130bc,
 419	.mnd_width = 8,
 420	.hid_width = 5,
 421	.parent_map = cam_cc_parent_map_0,
 422	.freq_tbl = ftbl_cam_cc_cci_0_clk_src,
 423	.clkr.hw.init = &(const struct clk_init_data) {
 424		.name = "cam_cc_cci_1_clk_src",
 425		.parent_data = cam_cc_parent_data_0,
 426		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
 427		.flags = CLK_SET_RATE_PARENT,
 428		.ops = &clk_rcg2_shared_ops,
 429	},
 430};
 431
 432static struct clk_rcg2 cam_cc_cci_2_clk_src = {
 433	.cmd_rcgr = 0x130d8,
 434	.mnd_width = 8,
 435	.hid_width = 5,
 436	.parent_map = cam_cc_parent_map_0,
 437	.freq_tbl = ftbl_cam_cc_cci_0_clk_src,
 438	.clkr.hw.init = &(const struct clk_init_data) {
 439		.name = "cam_cc_cci_2_clk_src",
 440		.parent_data = cam_cc_parent_data_0,
 441		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
 442		.flags = CLK_SET_RATE_PARENT,
 443		.ops = &clk_rcg2_shared_ops,
 444	},
 445};
 446
 447static struct clk_rcg2 cam_cc_cci_3_clk_src = {
 448	.cmd_rcgr = 0x130f4,
 449	.mnd_width = 8,
 450	.hid_width = 5,
 451	.parent_map = cam_cc_parent_map_0,
 452	.freq_tbl = ftbl_cam_cc_cci_0_clk_src,
 453	.clkr.hw.init = &(const struct clk_init_data) {
 454		.name = "cam_cc_cci_3_clk_src",
 455		.parent_data = cam_cc_parent_data_0,
 456		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
 457		.flags = CLK_SET_RATE_PARENT,
 458		.ops = &clk_rcg2_shared_ops,
 459	},
 460};
 461
 462static const struct freq_tbl ftbl_cam_cc_cphy_rx_clk_src[] = {
 463	F(400000000, P_CAM_CC_PLL0_OUT_ODD, 1, 0, 0),
 464	{ }
 465};
 466
 467static struct clk_rcg2 cam_cc_cphy_rx_clk_src = {
 468	.cmd_rcgr = 0x11034,
 469	.mnd_width = 0,
 470	.hid_width = 5,
 471	.parent_map = cam_cc_parent_map_0,
 472	.freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
 473	.clkr.hw.init = &(const struct clk_init_data) {
 474		.name = "cam_cc_cphy_rx_clk_src",
 475		.parent_data = cam_cc_parent_data_0,
 476		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
 477		.flags = CLK_SET_RATE_PARENT,
 478		.ops = &clk_rcg2_shared_ops,
 479	},
 480};
 481
 482static struct clk_rcg2 cam_cc_csi0phytimer_clk_src = {
 483	.cmd_rcgr = 0x15074,
 484	.mnd_width = 0,
 485	.hid_width = 5,
 486	.parent_map = cam_cc_parent_map_0,
 487	.freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
 488	.clkr.hw.init = &(const struct clk_init_data) {
 489		.name = "cam_cc_csi0phytimer_clk_src",
 490		.parent_data = cam_cc_parent_data_0,
 491		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
 492		.flags = CLK_SET_RATE_PARENT,
 493		.ops = &clk_rcg2_shared_ops,
 494	},
 495};
 496
 497static struct clk_rcg2 cam_cc_csi1phytimer_clk_src = {
 498	.cmd_rcgr = 0x15098,
 499	.mnd_width = 0,
 500	.hid_width = 5,
 501	.parent_map = cam_cc_parent_map_0,
 502	.freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
 503	.clkr.hw.init = &(const struct clk_init_data) {
 504		.name = "cam_cc_csi1phytimer_clk_src",
 505		.parent_data = cam_cc_parent_data_0,
 506		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
 507		.flags = CLK_SET_RATE_PARENT,
 508		.ops = &clk_rcg2_shared_ops,
 509	},
 510};
 511
 512static struct clk_rcg2 cam_cc_csi2phytimer_clk_src = {
 513	.cmd_rcgr = 0x150b8,
 514	.mnd_width = 0,
 515	.hid_width = 5,
 516	.parent_map = cam_cc_parent_map_0,
 517	.freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
 518	.clkr.hw.init = &(const struct clk_init_data) {
 519		.name = "cam_cc_csi2phytimer_clk_src",
 520		.parent_data = cam_cc_parent_data_0,
 521		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
 522		.flags = CLK_SET_RATE_PARENT,
 523		.ops = &clk_rcg2_shared_ops,
 524	},
 525};
 526
 527static struct clk_rcg2 cam_cc_csi3phytimer_clk_src = {
 528	.cmd_rcgr = 0x150d8,
 529	.mnd_width = 0,
 530	.hid_width = 5,
 531	.parent_map = cam_cc_parent_map_0,
 532	.freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
 533	.clkr.hw.init = &(const struct clk_init_data) {
 534		.name = "cam_cc_csi3phytimer_clk_src",
 535		.parent_data = cam_cc_parent_data_0,
 536		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
 537		.flags = CLK_SET_RATE_PARENT,
 538		.ops = &clk_rcg2_shared_ops,
 539	},
 540};
 541
 542static struct clk_rcg2 cam_cc_csid_clk_src = {
 543	.cmd_rcgr = 0x13150,
 544	.mnd_width = 0,
 545	.hid_width = 5,
 546	.parent_map = cam_cc_parent_map_0,
 547	.freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
 548	.clkr.hw.init = &(const struct clk_init_data) {
 549		.name = "cam_cc_csid_clk_src",
 550		.parent_data = cam_cc_parent_data_0,
 551		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
 552		.flags = CLK_SET_RATE_PARENT,
 553		.ops = &clk_rcg2_shared_ops,
 554	},
 555};
 556
 557static const struct freq_tbl ftbl_cam_cc_fast_ahb_clk_src[] = {
 558	F(300000000, P_CAM_CC_PLL0_OUT_MAIN, 4, 0, 0),
 559	F(400000000, P_CAM_CC_PLL0_OUT_MAIN, 3, 0, 0),
 560	{ }
 561};
 562
 563static struct clk_rcg2 cam_cc_fast_ahb_clk_src = {
 564	.cmd_rcgr = 0x13120,
 565	.mnd_width = 0,
 566	.hid_width = 5,
 567	.parent_map = cam_cc_parent_map_0,
 568	.freq_tbl = ftbl_cam_cc_fast_ahb_clk_src,
 569	.clkr.hw.init = &(const struct clk_init_data) {
 570		.name = "cam_cc_fast_ahb_clk_src",
 571		.parent_data = cam_cc_parent_data_0,
 572		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
 573		.flags = CLK_SET_RATE_PARENT,
 574		.ops = &clk_rcg2_shared_ops,
 575	},
 576};
 577
 578static const struct freq_tbl ftbl_cam_cc_icp_clk_src[] = {
 579	F(480000000, P_CAM_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
 580	F(600000000, P_CAM_CC_PLL0_OUT_MAIN, 2, 0, 0),
 581	{ }
 582};
 583
 584static struct clk_rcg2 cam_cc_icp_clk_src = {
 585	.cmd_rcgr = 0x1307c,
 586	.mnd_width = 0,
 587	.hid_width = 5,
 588	.parent_map = cam_cc_parent_map_0,
 589	.freq_tbl = ftbl_cam_cc_icp_clk_src,
 590	.clkr.hw.init = &(const struct clk_init_data) {
 591		.name = "cam_cc_icp_clk_src",
 592		.parent_data = cam_cc_parent_data_0,
 593		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
 594		.flags = CLK_SET_RATE_PARENT,
 595		.ops = &clk_rcg2_shared_ops,
 596	},
 597};
 598
 599static const struct freq_tbl ftbl_cam_cc_ife_0_clk_src[] = {
 600	F(480000000, P_CAM_CC_PLL4_OUT_EVEN, 1, 0, 0),
 601	F(600000000, P_CAM_CC_PLL4_OUT_EVEN, 1, 0, 0),
 602	{ }
 603};
 604
 605static struct clk_rcg2 cam_cc_ife_0_clk_src = {
 606	.cmd_rcgr = 0x11004,
 607	.mnd_width = 0,
 608	.hid_width = 5,
 609	.parent_map = cam_cc_parent_map_2,
 610	.freq_tbl = ftbl_cam_cc_ife_0_clk_src,
 611	.clkr.hw.init = &(const struct clk_init_data) {
 612		.name = "cam_cc_ife_0_clk_src",
 613		.parent_data = cam_cc_parent_data_2,
 614		.num_parents = ARRAY_SIZE(cam_cc_parent_data_2),
 615		.flags = CLK_SET_RATE_PARENT,
 616		.ops = &clk_rcg2_shared_ops,
 617	},
 618};
 619
 620static const struct freq_tbl ftbl_cam_cc_ife_1_clk_src[] = {
 621	F(480000000, P_CAM_CC_PLL5_OUT_EVEN, 1, 0, 0),
 622	F(600000000, P_CAM_CC_PLL5_OUT_EVEN, 1, 0, 0),
 623	{ }
 624};
 625
 626static struct clk_rcg2 cam_cc_ife_1_clk_src = {
 627	.cmd_rcgr = 0x12004,
 628	.mnd_width = 0,
 629	.hid_width = 5,
 630	.parent_map = cam_cc_parent_map_3,
 631	.freq_tbl = ftbl_cam_cc_ife_1_clk_src,
 632	.clkr.hw.init = &(const struct clk_init_data) {
 633		.name = "cam_cc_ife_1_clk_src",
 634		.parent_data = cam_cc_parent_data_3,
 635		.num_parents = ARRAY_SIZE(cam_cc_parent_data_3),
 636		.flags = CLK_SET_RATE_PARENT,
 637		.ops = &clk_rcg2_shared_ops,
 638	},
 639};
 640
 641static const struct freq_tbl ftbl_cam_cc_ife_lite_clk_src[] = {
 642	F(400000000, P_CAM_CC_PLL0_OUT_MAIN, 3, 0, 0),
 643	F(480000000, P_CAM_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
 644	{ }
 645};
 646
 647static struct clk_rcg2 cam_cc_ife_lite_clk_src = {
 648	.cmd_rcgr = 0x13000,
 649	.mnd_width = 0,
 650	.hid_width = 5,
 651	.parent_map = cam_cc_parent_map_0,
 652	.freq_tbl = ftbl_cam_cc_ife_lite_clk_src,
 653	.clkr.hw.init = &(const struct clk_init_data) {
 654		.name = "cam_cc_ife_lite_clk_src",
 655		.parent_data = cam_cc_parent_data_0,
 656		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
 657		.flags = CLK_SET_RATE_PARENT,
 658		.ops = &clk_rcg2_shared_ops,
 659	},
 660};
 661
 662static struct clk_rcg2 cam_cc_ife_lite_csid_clk_src = {
 663	.cmd_rcgr = 0x13020,
 664	.mnd_width = 0,
 665	.hid_width = 5,
 666	.parent_map = cam_cc_parent_map_0,
 667	.freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
 668	.clkr.hw.init = &(const struct clk_init_data) {
 669		.name = "cam_cc_ife_lite_csid_clk_src",
 670		.parent_data = cam_cc_parent_data_0,
 671		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
 672		.flags = CLK_SET_RATE_PARENT,
 673		.ops = &clk_rcg2_shared_ops,
 674	},
 675};
 676
 677static const struct freq_tbl ftbl_cam_cc_ipe_clk_src[] = {
 678	F(480000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0),
 679	F(600000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0),
 680	{ }
 681};
 682
 683static struct clk_rcg2 cam_cc_ipe_clk_src = {
 684	.cmd_rcgr = 0x10004,
 685	.mnd_width = 0,
 686	.hid_width = 5,
 687	.parent_map = cam_cc_parent_map_4,
 688	.freq_tbl = ftbl_cam_cc_ipe_clk_src,
 689	.clkr.hw.init = &(const struct clk_init_data) {
 690		.name = "cam_cc_ipe_clk_src",
 691		.parent_data = cam_cc_parent_data_4,
 692		.num_parents = ARRAY_SIZE(cam_cc_parent_data_4),
 693		.flags = CLK_SET_RATE_PARENT,
 694		.ops = &clk_rcg2_shared_ops,
 695	},
 696};
 697
 698static const struct freq_tbl ftbl_cam_cc_mclk0_clk_src[] = {
 699	F(19200000, P_CAM_CC_PLL2_OUT_MAIN, 1, 1, 50),
 700	F(24000000, P_CAM_CC_PLL2_OUT_MAIN, 10, 1, 4),
 701	F(64000000, P_CAM_CC_PLL2_OUT_MAIN, 15, 0, 0),
 702	{ }
 703};
 704
 705static struct clk_rcg2 cam_cc_mclk0_clk_src = {
 706	.cmd_rcgr = 0x15004,
 707	.mnd_width = 8,
 708	.hid_width = 5,
 709	.parent_map = cam_cc_parent_map_1,
 710	.freq_tbl = ftbl_cam_cc_mclk0_clk_src,
 711	.clkr.hw.init = &(const struct clk_init_data) {
 712		.name = "cam_cc_mclk0_clk_src",
 713		.parent_data = cam_cc_parent_data_1,
 714		.num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
 715		.flags = CLK_SET_RATE_PARENT,
 716		.ops = &clk_rcg2_shared_ops,
 717	},
 718};
 719
 720static struct clk_rcg2 cam_cc_mclk1_clk_src = {
 721	.cmd_rcgr = 0x15020,
 722	.mnd_width = 8,
 723	.hid_width = 5,
 724	.parent_map = cam_cc_parent_map_1,
 725	.freq_tbl = ftbl_cam_cc_mclk0_clk_src,
 726	.clkr.hw.init = &(const struct clk_init_data) {
 727		.name = "cam_cc_mclk1_clk_src",
 728		.parent_data = cam_cc_parent_data_1,
 729		.num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
 730		.flags = CLK_SET_RATE_PARENT,
 731		.ops = &clk_rcg2_shared_ops,
 732	},
 733};
 734
 735static struct clk_rcg2 cam_cc_mclk2_clk_src = {
 736	.cmd_rcgr = 0x1503c,
 737	.mnd_width = 8,
 738	.hid_width = 5,
 739	.parent_map = cam_cc_parent_map_1,
 740	.freq_tbl = ftbl_cam_cc_mclk0_clk_src,
 741	.clkr.hw.init = &(const struct clk_init_data) {
 742		.name = "cam_cc_mclk2_clk_src",
 743		.parent_data = cam_cc_parent_data_1,
 744		.num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
 745		.flags = CLK_SET_RATE_PARENT,
 746		.ops = &clk_rcg2_shared_ops,
 747	},
 748};
 749
 750static struct clk_rcg2 cam_cc_mclk3_clk_src = {
 751	.cmd_rcgr = 0x15058,
 752	.mnd_width = 8,
 753	.hid_width = 5,
 754	.parent_map = cam_cc_parent_map_1,
 755	.freq_tbl = ftbl_cam_cc_mclk0_clk_src,
 756	.clkr.hw.init = &(const struct clk_init_data) {
 757		.name = "cam_cc_mclk3_clk_src",
 758		.parent_data = cam_cc_parent_data_1,
 759		.num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
 760		.flags = CLK_SET_RATE_PARENT,
 761		.ops = &clk_rcg2_shared_ops,
 762	},
 763};
 764
 765static const struct freq_tbl ftbl_cam_cc_sleep_clk_src[] = {
 766	F(32000, P_SLEEP_CLK, 1, 0, 0),
 767	{ }
 768};
 769
 770static struct clk_rcg2 cam_cc_sleep_clk_src = {
 771	.cmd_rcgr = 0x131f0,
 772	.mnd_width = 0,
 773	.hid_width = 5,
 774	.parent_map = cam_cc_parent_map_5,
 775	.freq_tbl = ftbl_cam_cc_sleep_clk_src,
 776	.clkr.hw.init = &(const struct clk_init_data) {
 777		.name = "cam_cc_sleep_clk_src",
 778		.parent_data = cam_cc_parent_data_5,
 779		.num_parents = ARRAY_SIZE(cam_cc_parent_data_5),
 780		.flags = CLK_SET_RATE_PARENT,
 781		.ops = &clk_rcg2_shared_ops,
 782	},
 783};
 784
 785static const struct freq_tbl ftbl_cam_cc_slow_ahb_clk_src[] = {
 786	F(80000000, P_CAM_CC_PLL0_OUT_EVEN, 7.5, 0, 0),
 787	{ }
 788};
 789
 790static struct clk_rcg2 cam_cc_slow_ahb_clk_src = {
 791	.cmd_rcgr = 0x13138,
 792	.mnd_width = 8,
 793	.hid_width = 5,
 794	.parent_map = cam_cc_parent_map_0,
 795	.freq_tbl = ftbl_cam_cc_slow_ahb_clk_src,
 796	.clkr.hw.init = &(const struct clk_init_data) {
 797		.name = "cam_cc_slow_ahb_clk_src",
 798		.parent_data = cam_cc_parent_data_0,
 799		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
 800		.flags = CLK_SET_RATE_PARENT,
 801		.ops = &clk_rcg2_shared_ops,
 802	},
 803};
 804
 805static const struct freq_tbl ftbl_cam_cc_xo_clk_src[] = {
 806	F(19200000, P_BI_TCXO_AO, 1, 0, 0),
 807	{ }
 808};
 809
 810static struct clk_rcg2 cam_cc_xo_clk_src = {
 811	.cmd_rcgr = 0x131d4,
 812	.mnd_width = 0,
 813	.hid_width = 5,
 814	.parent_map = cam_cc_parent_map_6_ao,
 815	.freq_tbl = ftbl_cam_cc_xo_clk_src,
 816	.clkr.hw.init = &(const struct clk_init_data) {
 817		.name = "cam_cc_xo_clk_src",
 818		.parent_data = cam_cc_parent_data_6_ao,
 819		.num_parents = ARRAY_SIZE(cam_cc_parent_data_6_ao),
 820		.flags = CLK_SET_RATE_PARENT,
 821		.ops = &clk_rcg2_shared_ops,
 822	},
 823};
 824
 825static struct clk_branch cam_cc_camnoc_axi_clk = {
 826	.halt_reg = 0x13188,
 827	.halt_check = BRANCH_HALT,
 828	.clkr = {
 829		.enable_reg = 0x13188,
 830		.enable_mask = BIT(0),
 831		.hw.init = &(const struct clk_init_data) {
 832			.name = "cam_cc_camnoc_axi_clk",
 833			.parent_hws = (const struct clk_hw*[]) {
 834				&cam_cc_camnoc_axi_clk_src.clkr.hw,
 835			},
 836			.num_parents = 1,
 837			.flags = CLK_SET_RATE_PARENT,
 838			.ops = &clk_branch2_ops,
 839		},
 840	},
 841};
 842
 843static struct clk_branch cam_cc_camnoc_dcd_xo_clk = {
 844	.halt_reg = 0x13190,
 845	.halt_check = BRANCH_HALT,
 846	.clkr = {
 847		.enable_reg = 0x13190,
 848		.enable_mask = BIT(0),
 849		.hw.init = &(const struct clk_init_data) {
 850			.name = "cam_cc_camnoc_dcd_xo_clk",
 851			.parent_hws = (const struct clk_hw*[]) {
 852				&cam_cc_xo_clk_src.clkr.hw,
 853			},
 854			.num_parents = 1,
 855			.flags = CLK_SET_RATE_PARENT,
 856			.ops = &clk_branch2_ops,
 857		},
 858	},
 859};
 860
 861static struct clk_branch cam_cc_qdss_debug_xo_clk = {
 862	.halt_reg = 0x131b8,
 863	.halt_check = BRANCH_HALT,
 864	.clkr = {
 865		.enable_reg = 0x131b8,
 866		.enable_mask = BIT(0),
 867		.hw.init = &(const struct clk_init_data) {
 868			.name = "cam_cc_qdss_debug_xo_clk",
 869			.parent_hws = (const struct clk_hw*[]) {
 870				&cam_cc_xo_clk_src.clkr.hw,
 871			},
 872			.num_parents = 1,
 873			.flags = CLK_SET_RATE_PARENT,
 874			.ops = &clk_branch2_ops,
 875		},
 876	},
 877};
 878
 879static struct clk_branch cam_cc_cci_0_clk = {
 880	.halt_reg = 0x130b8,
 881	.halt_check = BRANCH_HALT,
 882	.clkr = {
 883		.enable_reg = 0x130b8,
 884		.enable_mask = BIT(0),
 885		.hw.init = &(const struct clk_init_data) {
 886			.name = "cam_cc_cci_0_clk",
 887			.parent_hws = (const struct clk_hw*[]) {
 888				&cam_cc_cci_0_clk_src.clkr.hw,
 889			},
 890			.num_parents = 1,
 891			.flags = CLK_SET_RATE_PARENT,
 892			.ops = &clk_branch2_ops,
 893		},
 894	},
 895};
 896
 897static struct clk_branch cam_cc_cci_1_clk = {
 898	.halt_reg = 0x130d4,
 899	.halt_check = BRANCH_HALT,
 900	.clkr = {
 901		.enable_reg = 0x130d4,
 902		.enable_mask = BIT(0),
 903		.hw.init = &(const struct clk_init_data) {
 904			.name = "cam_cc_cci_1_clk",
 905			.parent_hws = (const struct clk_hw*[]) {
 906				&cam_cc_cci_1_clk_src.clkr.hw,
 907			},
 908			.num_parents = 1,
 909			.flags = CLK_SET_RATE_PARENT,
 910			.ops = &clk_branch2_ops,
 911		},
 912	},
 913};
 914
 915static struct clk_branch cam_cc_cci_2_clk = {
 916	.halt_reg = 0x130f0,
 917	.halt_check = BRANCH_HALT,
 918	.clkr = {
 919		.enable_reg = 0x130f0,
 920		.enable_mask = BIT(0),
 921		.hw.init = &(const struct clk_init_data) {
 922			.name = "cam_cc_cci_2_clk",
 923			.parent_hws = (const struct clk_hw*[]) {
 924				&cam_cc_cci_2_clk_src.clkr.hw,
 925			},
 926			.num_parents = 1,
 927			.flags = CLK_SET_RATE_PARENT,
 928			.ops = &clk_branch2_ops,
 929		},
 930	},
 931};
 932
 933static struct clk_branch cam_cc_cci_3_clk = {
 934	.halt_reg = 0x1310c,
 935	.halt_check = BRANCH_HALT,
 936	.clkr = {
 937		.enable_reg = 0x1310c,
 938		.enable_mask = BIT(0),
 939		.hw.init = &(const struct clk_init_data) {
 940			.name = "cam_cc_cci_3_clk",
 941			.parent_hws = (const struct clk_hw*[]) {
 942				&cam_cc_cci_3_clk_src.clkr.hw,
 943			},
 944			.num_parents = 1,
 945			.flags = CLK_SET_RATE_PARENT,
 946			.ops = &clk_branch2_ops,
 947		},
 948	},
 949};
 950
 951static struct clk_branch cam_cc_core_ahb_clk = {
 952	.halt_reg = 0x131d0,
 953	.halt_check = BRANCH_HALT_DELAY,
 954	.clkr = {
 955		.enable_reg = 0x131d0,
 956		.enable_mask = BIT(0),
 957		.hw.init = &(const struct clk_init_data) {
 958			.name = "cam_cc_core_ahb_clk",
 959			.parent_hws = (const struct clk_hw*[]) {
 960				&cam_cc_slow_ahb_clk_src.clkr.hw,
 961			},
 962			.num_parents = 1,
 963			.flags = CLK_SET_RATE_PARENT,
 964			.ops = &clk_branch2_ops,
 965		},
 966	},
 967};
 968
 969static struct clk_branch cam_cc_cpas_ahb_clk = {
 970	.halt_reg = 0x13110,
 971	.halt_check = BRANCH_HALT,
 972	.clkr = {
 973		.enable_reg = 0x13110,
 974		.enable_mask = BIT(0),
 975		.hw.init = &(const struct clk_init_data) {
 976			.name = "cam_cc_cpas_ahb_clk",
 977			.parent_hws = (const struct clk_hw*[]) {
 978				&cam_cc_slow_ahb_clk_src.clkr.hw,
 979			},
 980			.num_parents = 1,
 981			.flags = CLK_SET_RATE_PARENT,
 982			.ops = &clk_branch2_ops,
 983		},
 984	},
 985};
 986
 987static struct clk_branch cam_cc_cpas_fast_ahb_clk = {
 988	.halt_reg = 0x13118,
 989	.halt_check = BRANCH_HALT,
 990	.clkr = {
 991		.enable_reg = 0x13118,
 992		.enable_mask = BIT(0),
 993		.hw.init = &(const struct clk_init_data) {
 994			.name = "cam_cc_cpas_fast_ahb_clk",
 995			.parent_hws = (const struct clk_hw*[]) {
 996				&cam_cc_fast_ahb_clk_src.clkr.hw,
 997			},
 998			.num_parents = 1,
 999			.flags = CLK_SET_RATE_PARENT,
1000			.ops = &clk_branch2_ops,
1001		},
1002	},
1003};
1004
1005static struct clk_branch cam_cc_cpas_ife_0_clk = {
1006	.halt_reg = 0x11024,
1007	.halt_check = BRANCH_HALT,
1008	.clkr = {
1009		.enable_reg = 0x11024,
1010		.enable_mask = BIT(0),
1011		.hw.init = &(const struct clk_init_data) {
1012			.name = "cam_cc_cpas_ife_0_clk",
1013			.parent_hws = (const struct clk_hw*[]) {
1014				&cam_cc_ife_0_clk_src.clkr.hw,
1015			},
1016			.num_parents = 1,
1017			.flags = CLK_SET_RATE_PARENT,
1018			.ops = &clk_branch2_ops,
1019		},
1020	},
1021};
1022
1023static struct clk_branch cam_cc_cpas_ife_1_clk = {
1024	.halt_reg = 0x12024,
1025	.halt_check = BRANCH_HALT,
1026	.clkr = {
1027		.enable_reg = 0x12024,
1028		.enable_mask = BIT(0),
1029		.hw.init = &(const struct clk_init_data) {
1030			.name = "cam_cc_cpas_ife_1_clk",
1031			.parent_hws = (const struct clk_hw*[]) {
1032				&cam_cc_ife_1_clk_src.clkr.hw,
1033			},
1034			.num_parents = 1,
1035			.flags = CLK_SET_RATE_PARENT,
1036			.ops = &clk_branch2_ops,
1037		},
1038	},
1039};
1040
1041static struct clk_branch cam_cc_cpas_ife_lite_clk = {
1042	.halt_reg = 0x1301c,
1043	.halt_check = BRANCH_HALT,
1044	.clkr = {
1045		.enable_reg = 0x1301c,
1046		.enable_mask = BIT(0),
1047		.hw.init = &(const struct clk_init_data) {
1048			.name = "cam_cc_cpas_ife_lite_clk",
1049			.parent_hws = (const struct clk_hw*[]) {
1050				&cam_cc_ife_lite_clk_src.clkr.hw,
1051			},
1052			.num_parents = 1,
1053			.flags = CLK_SET_RATE_PARENT,
1054			.ops = &clk_branch2_ops,
1055		},
1056	},
1057};
1058
1059static struct clk_branch cam_cc_cpas_ipe_clk = {
1060	.halt_reg = 0x10024,
1061	.halt_check = BRANCH_HALT,
1062	.clkr = {
1063		.enable_reg = 0x10024,
1064		.enable_mask = BIT(0),
1065		.hw.init = &(const struct clk_init_data) {
1066			.name = "cam_cc_cpas_ipe_clk",
1067			.parent_hws = (const struct clk_hw*[]) {
1068				&cam_cc_ipe_clk_src.clkr.hw,
1069			},
1070			.num_parents = 1,
1071			.flags = CLK_SET_RATE_PARENT,
1072			.ops = &clk_branch2_ops,
1073		},
1074	},
1075};
1076
1077static struct clk_branch cam_cc_cpas_sfe_lite_0_clk = {
1078	.halt_reg = 0x13050,
1079	.halt_check = BRANCH_HALT,
1080	.clkr = {
1081		.enable_reg = 0x13050,
1082		.enable_mask = BIT(0),
1083		.hw.init = &(const struct clk_init_data) {
1084			.name = "cam_cc_cpas_sfe_lite_0_clk",
1085			.parent_hws = (const struct clk_hw*[]) {
1086				&cam_cc_ife_0_clk_src.clkr.hw,
1087			},
1088			.num_parents = 1,
1089			.flags = CLK_SET_RATE_PARENT,
1090			.ops = &clk_branch2_ops,
1091		},
1092	},
1093};
1094
1095static struct clk_branch cam_cc_cpas_sfe_lite_1_clk = {
1096	.halt_reg = 0x13068,
1097	.halt_check = BRANCH_HALT,
1098	.clkr = {
1099		.enable_reg = 0x13068,
1100		.enable_mask = BIT(0),
1101		.hw.init = &(const struct clk_init_data) {
1102			.name = "cam_cc_cpas_sfe_lite_1_clk",
1103			.parent_hws = (const struct clk_hw*[]) {
1104				&cam_cc_ife_1_clk_src.clkr.hw,
1105			},
1106			.num_parents = 1,
1107			.flags = CLK_SET_RATE_PARENT,
1108			.ops = &clk_branch2_ops,
1109		},
1110	},
1111};
1112
1113static struct clk_branch cam_cc_csi0phytimer_clk = {
1114	.halt_reg = 0x1508c,
1115	.halt_check = BRANCH_HALT,
1116	.clkr = {
1117		.enable_reg = 0x1508c,
1118		.enable_mask = BIT(0),
1119		.hw.init = &(const struct clk_init_data) {
1120			.name = "cam_cc_csi0phytimer_clk",
1121			.parent_hws = (const struct clk_hw*[]) {
1122				&cam_cc_csi0phytimer_clk_src.clkr.hw,
1123			},
1124			.num_parents = 1,
1125			.flags = CLK_SET_RATE_PARENT,
1126			.ops = &clk_branch2_ops,
1127		},
1128	},
1129};
1130
1131static struct clk_branch cam_cc_csi1phytimer_clk = {
1132	.halt_reg = 0x150b0,
1133	.halt_check = BRANCH_HALT,
1134	.clkr = {
1135		.enable_reg = 0x150b0,
1136		.enable_mask = BIT(0),
1137		.hw.init = &(const struct clk_init_data) {
1138			.name = "cam_cc_csi1phytimer_clk",
1139			.parent_hws = (const struct clk_hw*[]) {
1140				&cam_cc_csi1phytimer_clk_src.clkr.hw,
1141			},
1142			.num_parents = 1,
1143			.flags = CLK_SET_RATE_PARENT,
1144			.ops = &clk_branch2_ops,
1145		},
1146	},
1147};
1148
1149static struct clk_branch cam_cc_csi2phytimer_clk = {
1150	.halt_reg = 0x150d0,
1151	.halt_check = BRANCH_HALT,
1152	.clkr = {
1153		.enable_reg = 0x150d0,
1154		.enable_mask = BIT(0),
1155		.hw.init = &(const struct clk_init_data) {
1156			.name = "cam_cc_csi2phytimer_clk",
1157			.parent_hws = (const struct clk_hw*[]) {
1158				&cam_cc_csi2phytimer_clk_src.clkr.hw,
1159			},
1160			.num_parents = 1,
1161			.flags = CLK_SET_RATE_PARENT,
1162			.ops = &clk_branch2_ops,
1163		},
1164	},
1165};
1166
1167static struct clk_branch cam_cc_csi3phytimer_clk = {
1168	.halt_reg = 0x150f0,
1169	.halt_check = BRANCH_HALT,
1170	.clkr = {
1171		.enable_reg = 0x150f0,
1172		.enable_mask = BIT(0),
1173		.hw.init = &(const struct clk_init_data) {
1174			.name = "cam_cc_csi3phytimer_clk",
1175			.parent_hws = (const struct clk_hw*[]) {
1176				&cam_cc_csi3phytimer_clk_src.clkr.hw,
1177			},
1178			.num_parents = 1,
1179			.flags = CLK_SET_RATE_PARENT,
1180			.ops = &clk_branch2_ops,
1181		},
1182	},
1183};
1184
1185static struct clk_branch cam_cc_csid_clk = {
1186	.halt_reg = 0x13168,
1187	.halt_check = BRANCH_HALT,
1188	.clkr = {
1189		.enable_reg = 0x13168,
1190		.enable_mask = BIT(0),
1191		.hw.init = &(const struct clk_init_data) {
1192			.name = "cam_cc_csid_clk",
1193			.parent_hws = (const struct clk_hw*[]) {
1194				&cam_cc_csid_clk_src.clkr.hw,
1195			},
1196			.num_parents = 1,
1197			.flags = CLK_SET_RATE_PARENT,
1198			.ops = &clk_branch2_ops,
1199		},
1200	},
1201};
1202
1203static struct clk_branch cam_cc_csid_csiphy_rx_clk = {
1204	.halt_reg = 0x15094,
1205	.halt_check = BRANCH_HALT,
1206	.clkr = {
1207		.enable_reg = 0x15094,
1208		.enable_mask = BIT(0),
1209		.hw.init = &(const struct clk_init_data) {
1210			.name = "cam_cc_csid_csiphy_rx_clk",
1211			.parent_hws = (const struct clk_hw*[]) {
1212				&cam_cc_cphy_rx_clk_src.clkr.hw,
1213			},
1214			.num_parents = 1,
1215			.flags = CLK_SET_RATE_PARENT,
1216			.ops = &clk_branch2_ops,
1217		},
1218	},
1219};
1220
1221static struct clk_branch cam_cc_csiphy0_clk = {
1222	.halt_reg = 0x15090,
1223	.halt_check = BRANCH_HALT,
1224	.clkr = {
1225		.enable_reg = 0x15090,
1226		.enable_mask = BIT(0),
1227		.hw.init = &(const struct clk_init_data) {
1228			.name = "cam_cc_csiphy0_clk",
1229			.parent_hws = (const struct clk_hw*[]) {
1230				&cam_cc_cphy_rx_clk_src.clkr.hw,
1231			},
1232			.num_parents = 1,
1233			.flags = CLK_SET_RATE_PARENT,
1234			.ops = &clk_branch2_ops,
1235		},
1236	},
1237};
1238
1239static struct clk_branch cam_cc_csiphy1_clk = {
1240	.halt_reg = 0x150b4,
1241	.halt_check = BRANCH_HALT,
1242	.clkr = {
1243		.enable_reg = 0x150b4,
1244		.enable_mask = BIT(0),
1245		.hw.init = &(const struct clk_init_data) {
1246			.name = "cam_cc_csiphy1_clk",
1247			.parent_hws = (const struct clk_hw*[]) {
1248				&cam_cc_cphy_rx_clk_src.clkr.hw,
1249			},
1250			.num_parents = 1,
1251			.flags = CLK_SET_RATE_PARENT,
1252			.ops = &clk_branch2_ops,
1253		},
1254	},
1255};
1256
1257static struct clk_branch cam_cc_csiphy2_clk = {
1258	.halt_reg = 0x150d4,
1259	.halt_check = BRANCH_HALT,
1260	.clkr = {
1261		.enable_reg = 0x150d4,
1262		.enable_mask = BIT(0),
1263		.hw.init = &(const struct clk_init_data) {
1264			.name = "cam_cc_csiphy2_clk",
1265			.parent_hws = (const struct clk_hw*[]) {
1266				&cam_cc_cphy_rx_clk_src.clkr.hw,
1267			},
1268			.num_parents = 1,
1269			.flags = CLK_SET_RATE_PARENT,
1270			.ops = &clk_branch2_ops,
1271		},
1272	},
1273};
1274
1275static struct clk_branch cam_cc_csiphy3_clk = {
1276	.halt_reg = 0x150f4,
1277	.halt_check = BRANCH_HALT,
1278	.clkr = {
1279		.enable_reg = 0x150f4,
1280		.enable_mask = BIT(0),
1281		.hw.init = &(const struct clk_init_data) {
1282			.name = "cam_cc_csiphy3_clk",
1283			.parent_hws = (const struct clk_hw*[]) {
1284				&cam_cc_cphy_rx_clk_src.clkr.hw,
1285			},
1286			.num_parents = 1,
1287			.flags = CLK_SET_RATE_PARENT,
1288			.ops = &clk_branch2_ops,
1289		},
1290	},
1291};
1292
1293static struct clk_branch cam_cc_icp_ahb_clk = {
1294	.halt_reg = 0x1309c,
1295	.halt_check = BRANCH_HALT,
1296	.clkr = {
1297		.enable_reg = 0x1309c,
1298		.enable_mask = BIT(0),
1299		.hw.init = &(const struct clk_init_data) {
1300			.name = "cam_cc_icp_ahb_clk",
1301			.parent_hws = (const struct clk_hw*[]) {
1302				&cam_cc_slow_ahb_clk_src.clkr.hw,
1303			},
1304			.num_parents = 1,
1305			.flags = CLK_SET_RATE_PARENT,
1306			.ops = &clk_branch2_ops,
1307		},
1308	},
1309};
1310
1311static struct clk_branch cam_cc_icp_clk = {
1312	.halt_reg = 0x13094,
1313	.halt_check = BRANCH_HALT,
1314	.clkr = {
1315		.enable_reg = 0x13094,
1316		.enable_mask = BIT(0),
1317		.hw.init = &(const struct clk_init_data) {
1318			.name = "cam_cc_icp_clk",
1319			.parent_hws = (const struct clk_hw*[]) {
1320				&cam_cc_icp_clk_src.clkr.hw,
1321			},
1322			.num_parents = 1,
1323			.flags = CLK_SET_RATE_PARENT,
1324			.ops = &clk_branch2_ops,
1325		},
1326	},
1327};
1328
1329static struct clk_branch cam_cc_ife_0_clk = {
1330	.halt_reg = 0x1101c,
1331	.halt_check = BRANCH_HALT,
1332	.clkr = {
1333		.enable_reg = 0x1101c,
1334		.enable_mask = BIT(0),
1335		.hw.init = &(const struct clk_init_data) {
1336			.name = "cam_cc_ife_0_clk",
1337			.parent_hws = (const struct clk_hw*[]) {
1338				&cam_cc_ife_0_clk_src.clkr.hw,
1339			},
1340			.num_parents = 1,
1341			.flags = CLK_SET_RATE_PARENT,
1342			.ops = &clk_branch2_ops,
1343		},
1344	},
1345};
1346
1347static struct clk_branch cam_cc_ife_0_fast_ahb_clk = {
1348	.halt_reg = 0x11030,
1349	.halt_check = BRANCH_HALT,
1350	.clkr = {
1351		.enable_reg = 0x11030,
1352		.enable_mask = BIT(0),
1353		.hw.init = &(const struct clk_init_data) {
1354			.name = "cam_cc_ife_0_fast_ahb_clk",
1355			.parent_hws = (const struct clk_hw*[]) {
1356				&cam_cc_fast_ahb_clk_src.clkr.hw,
1357			},
1358			.num_parents = 1,
1359			.flags = CLK_SET_RATE_PARENT,
1360			.ops = &clk_branch2_ops,
1361		},
1362	},
1363};
1364
1365static struct clk_branch cam_cc_ife_1_clk = {
1366	.halt_reg = 0x1201c,
1367	.halt_check = BRANCH_HALT,
1368	.clkr = {
1369		.enable_reg = 0x1201c,
1370		.enable_mask = BIT(0),
1371		.hw.init = &(const struct clk_init_data) {
1372			.name = "cam_cc_ife_1_clk",
1373			.parent_hws = (const struct clk_hw*[]) {
1374				&cam_cc_ife_1_clk_src.clkr.hw,
1375			},
1376			.num_parents = 1,
1377			.flags = CLK_SET_RATE_PARENT,
1378			.ops = &clk_branch2_ops,
1379		},
1380	},
1381};
1382
1383static struct clk_branch cam_cc_ife_1_fast_ahb_clk = {
1384	.halt_reg = 0x12030,
1385	.halt_check = BRANCH_HALT,
1386	.clkr = {
1387		.enable_reg = 0x12030,
1388		.enable_mask = BIT(0),
1389		.hw.init = &(const struct clk_init_data) {
1390			.name = "cam_cc_ife_1_fast_ahb_clk",
1391			.parent_hws = (const struct clk_hw*[]) {
1392				&cam_cc_fast_ahb_clk_src.clkr.hw,
1393			},
1394			.num_parents = 1,
1395			.flags = CLK_SET_RATE_PARENT,
1396			.ops = &clk_branch2_ops,
1397		},
1398	},
1399};
1400
1401static struct clk_branch cam_cc_ife_lite_ahb_clk = {
1402	.halt_reg = 0x13044,
1403	.halt_check = BRANCH_HALT,
1404	.clkr = {
1405		.enable_reg = 0x13044,
1406		.enable_mask = BIT(0),
1407		.hw.init = &(const struct clk_init_data) {
1408			.name = "cam_cc_ife_lite_ahb_clk",
1409			.parent_hws = (const struct clk_hw*[]) {
1410				&cam_cc_slow_ahb_clk_src.clkr.hw,
1411			},
1412			.num_parents = 1,
1413			.flags = CLK_SET_RATE_PARENT,
1414			.ops = &clk_branch2_ops,
1415		},
1416	},
1417};
1418
1419static struct clk_branch cam_cc_ife_lite_clk = {
1420	.halt_reg = 0x13018,
1421	.halt_check = BRANCH_HALT,
1422	.clkr = {
1423		.enable_reg = 0x13018,
1424		.enable_mask = BIT(0),
1425		.hw.init = &(const struct clk_init_data) {
1426			.name = "cam_cc_ife_lite_clk",
1427			.parent_hws = (const struct clk_hw*[]) {
1428				&cam_cc_ife_lite_clk_src.clkr.hw,
1429			},
1430			.num_parents = 1,
1431			.flags = CLK_SET_RATE_PARENT,
1432			.ops = &clk_branch2_ops,
1433		},
1434	},
1435};
1436
1437static struct clk_branch cam_cc_ife_lite_cphy_rx_clk = {
1438	.halt_reg = 0x13040,
1439	.halt_check = BRANCH_HALT,
1440	.clkr = {
1441		.enable_reg = 0x13040,
1442		.enable_mask = BIT(0),
1443		.hw.init = &(const struct clk_init_data) {
1444			.name = "cam_cc_ife_lite_cphy_rx_clk",
1445			.parent_hws = (const struct clk_hw*[]) {
1446				&cam_cc_cphy_rx_clk_src.clkr.hw,
1447			},
1448			.num_parents = 1,
1449			.flags = CLK_SET_RATE_PARENT,
1450			.ops = &clk_branch2_ops,
1451		},
1452	},
1453};
1454
1455static struct clk_branch cam_cc_ife_lite_csid_clk = {
1456	.halt_reg = 0x13038,
1457	.halt_check = BRANCH_HALT,
1458	.clkr = {
1459		.enable_reg = 0x13038,
1460		.enable_mask = BIT(0),
1461		.hw.init = &(const struct clk_init_data) {
1462			.name = "cam_cc_ife_lite_csid_clk",
1463			.parent_hws = (const struct clk_hw*[]) {
1464				&cam_cc_ife_lite_csid_clk_src.clkr.hw,
1465			},
1466			.num_parents = 1,
1467			.flags = CLK_SET_RATE_PARENT,
1468			.ops = &clk_branch2_ops,
1469		},
1470	},
1471};
1472
1473static struct clk_branch cam_cc_ipe_ahb_clk = {
1474	.halt_reg = 0x10030,
1475	.halt_check = BRANCH_HALT,
1476	.clkr = {
1477		.enable_reg = 0x10030,
1478		.enable_mask = BIT(0),
1479		.hw.init = &(const struct clk_init_data) {
1480			.name = "cam_cc_ipe_ahb_clk",
1481			.parent_hws = (const struct clk_hw*[]) {
1482				&cam_cc_slow_ahb_clk_src.clkr.hw,
1483			},
1484			.num_parents = 1,
1485			.flags = CLK_SET_RATE_PARENT,
1486			.ops = &clk_branch2_ops,
1487		},
1488	},
1489};
1490
1491static struct clk_branch cam_cc_ipe_clk = {
1492	.halt_reg = 0x1001c,
1493	.halt_check = BRANCH_HALT,
1494	.clkr = {
1495		.enable_reg = 0x1001c,
1496		.enable_mask = BIT(0),
1497		.hw.init = &(const struct clk_init_data) {
1498			.name = "cam_cc_ipe_clk",
1499			.parent_hws = (const struct clk_hw*[]) {
1500				&cam_cc_ipe_clk_src.clkr.hw,
1501			},
1502			.num_parents = 1,
1503			.flags = CLK_SET_RATE_PARENT,
1504			.ops = &clk_branch2_ops,
1505		},
1506	},
1507};
1508
1509static struct clk_branch cam_cc_ipe_fast_ahb_clk = {
1510	.halt_reg = 0x10034,
1511	.halt_check = BRANCH_HALT,
1512	.clkr = {
1513		.enable_reg = 0x10034,
1514		.enable_mask = BIT(0),
1515		.hw.init = &(const struct clk_init_data) {
1516			.name = "cam_cc_ipe_fast_ahb_clk",
1517			.parent_hws = (const struct clk_hw*[]) {
1518				&cam_cc_fast_ahb_clk_src.clkr.hw,
1519			},
1520			.num_parents = 1,
1521			.flags = CLK_SET_RATE_PARENT,
1522			.ops = &clk_branch2_ops,
1523		},
1524	},
1525};
1526
1527static struct clk_branch cam_cc_mclk0_clk = {
1528	.halt_reg = 0x1501c,
1529	.halt_check = BRANCH_HALT,
1530	.clkr = {
1531		.enable_reg = 0x1501c,
1532		.enable_mask = BIT(0),
1533		.hw.init = &(const struct clk_init_data) {
1534			.name = "cam_cc_mclk0_clk",
1535			.parent_hws = (const struct clk_hw*[]) {
1536				&cam_cc_mclk0_clk_src.clkr.hw,
1537			},
1538			.num_parents = 1,
1539			.flags = CLK_SET_RATE_PARENT,
1540			.ops = &clk_branch2_ops,
1541		},
1542	},
1543};
1544
1545static struct clk_branch cam_cc_mclk1_clk = {
1546	.halt_reg = 0x15038,
1547	.halt_check = BRANCH_HALT,
1548	.clkr = {
1549		.enable_reg = 0x15038,
1550		.enable_mask = BIT(0),
1551		.hw.init = &(const struct clk_init_data) {
1552			.name = "cam_cc_mclk1_clk",
1553			.parent_hws = (const struct clk_hw*[]) {
1554				&cam_cc_mclk1_clk_src.clkr.hw,
1555			},
1556			.num_parents = 1,
1557			.flags = CLK_SET_RATE_PARENT,
1558			.ops = &clk_branch2_ops,
1559		},
1560	},
1561};
1562
1563static struct clk_branch cam_cc_mclk2_clk = {
1564	.halt_reg = 0x15054,
1565	.halt_check = BRANCH_HALT,
1566	.clkr = {
1567		.enable_reg = 0x15054,
1568		.enable_mask = BIT(0),
1569		.hw.init = &(const struct clk_init_data) {
1570			.name = "cam_cc_mclk2_clk",
1571			.parent_hws = (const struct clk_hw*[]) {
1572				&cam_cc_mclk2_clk_src.clkr.hw,
1573			},
1574			.num_parents = 1,
1575			.flags = CLK_SET_RATE_PARENT,
1576			.ops = &clk_branch2_ops,
1577		},
1578	},
1579};
1580
1581static struct clk_branch cam_cc_mclk3_clk = {
1582	.halt_reg = 0x15070,
1583	.halt_check = BRANCH_HALT,
1584	.clkr = {
1585		.enable_reg = 0x15070,
1586		.enable_mask = BIT(0),
1587		.hw.init = &(const struct clk_init_data) {
1588			.name = "cam_cc_mclk3_clk",
1589			.parent_hws = (const struct clk_hw*[]) {
1590				&cam_cc_mclk3_clk_src.clkr.hw,
1591			},
1592			.num_parents = 1,
1593			.flags = CLK_SET_RATE_PARENT,
1594			.ops = &clk_branch2_ops,
1595		},
1596	},
1597};
1598
1599static struct clk_branch cam_cc_sfe_lite_0_clk = {
1600	.halt_reg = 0x1304c,
1601	.halt_check = BRANCH_HALT,
1602	.clkr = {
1603		.enable_reg = 0x1304c,
1604		.enable_mask = BIT(0),
1605		.hw.init = &(const struct clk_init_data) {
1606			.name = "cam_cc_sfe_lite_0_clk",
1607			.parent_hws = (const struct clk_hw*[]) {
1608				&cam_cc_ife_0_clk_src.clkr.hw,
1609			},
1610			.num_parents = 1,
1611			.flags = CLK_SET_RATE_PARENT,
1612			.ops = &clk_branch2_ops,
1613		},
1614	},
1615};
1616
1617static struct clk_branch cam_cc_sfe_lite_0_fast_ahb_clk = {
1618	.halt_reg = 0x1305c,
1619	.halt_check = BRANCH_HALT,
1620	.clkr = {
1621		.enable_reg = 0x1305c,
1622		.enable_mask = BIT(0),
1623		.hw.init = &(const struct clk_init_data) {
1624			.name = "cam_cc_sfe_lite_0_fast_ahb_clk",
1625			.parent_hws = (const struct clk_hw*[]) {
1626				&cam_cc_fast_ahb_clk_src.clkr.hw,
1627			},
1628			.num_parents = 1,
1629			.flags = CLK_SET_RATE_PARENT,
1630			.ops = &clk_branch2_ops,
1631		},
1632	},
1633};
1634
1635static struct clk_branch cam_cc_sfe_lite_1_clk = {
1636	.halt_reg = 0x13064,
1637	.halt_check = BRANCH_HALT,
1638	.clkr = {
1639		.enable_reg = 0x13064,
1640		.enable_mask = BIT(0),
1641		.hw.init = &(const struct clk_init_data) {
1642			.name = "cam_cc_sfe_lite_1_clk",
1643			.parent_hws = (const struct clk_hw*[]) {
1644				&cam_cc_ife_1_clk_src.clkr.hw,
1645			},
1646			.num_parents = 1,
1647			.flags = CLK_SET_RATE_PARENT,
1648			.ops = &clk_branch2_ops,
1649		},
1650	},
1651};
1652
1653static struct clk_branch cam_cc_sfe_lite_1_fast_ahb_clk = {
1654	.halt_reg = 0x13074,
1655	.halt_check = BRANCH_HALT,
1656	.clkr = {
1657		.enable_reg = 0x13074,
1658		.enable_mask = BIT(0),
1659		.hw.init = &(const struct clk_init_data) {
1660			.name = "cam_cc_sfe_lite_1_fast_ahb_clk",
1661			.parent_hws = (const struct clk_hw*[]) {
1662				&cam_cc_fast_ahb_clk_src.clkr.hw,
1663			},
1664			.num_parents = 1,
1665			.flags = CLK_SET_RATE_PARENT,
1666			.ops = &clk_branch2_ops,
1667		},
1668	},
1669};
1670
1671static struct clk_branch cam_cc_sm_obs_clk = {
1672	.halt_reg = 0x1510c,
1673	.halt_check = BRANCH_HALT_SKIP,
1674	.clkr = {
1675		.enable_reg = 0x1510c,
1676		.enable_mask = BIT(0),
1677		.hw.init = &(const struct clk_init_data) {
1678			.name = "cam_cc_sm_obs_clk",
1679			.ops = &clk_branch2_ops,
1680		},
1681	},
1682};
1683
1684static struct clk_branch cam_cc_titan_top_accu_shift_clk = {
1685	.halt_reg = 0x131f0,
1686	.halt_check = BRANCH_HALT_VOTED,
1687	.clkr = {
1688		.enable_reg = 0x131f0,
1689		.enable_mask = BIT(0),
1690		.hw.init = &(const struct clk_init_data) {
1691			.name = "cam_cc_titan_top_accu_shift_clk",
1692			.parent_hws = (const struct clk_hw*[]) {
1693				&cam_cc_xo_clk_src.clkr.hw,
1694			},
1695			.num_parents = 1,
1696			.flags = CLK_SET_RATE_PARENT,
1697			.ops = &clk_branch2_ops,
1698		},
1699	},
1700};
1701
1702static struct gdsc cam_cc_titan_top_gdsc = {
1703	.gdscr = 0x131bc,
1704	.en_rest_wait_val = 0x2,
1705	.en_few_wait_val = 0x2,
1706	.clk_dis_wait_val = 0xf,
1707	.pd = {
1708		.name = "cam_cc_titan_top_gdsc",
1709	},
1710	.pwrsts = PWRSTS_OFF_ON,
1711	.flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
1712};
1713
1714static struct clk_regmap *cam_cc_sa8775p_clocks[] = {
1715	[CAM_CC_CAMNOC_AXI_CLK] = &cam_cc_camnoc_axi_clk.clkr,
1716	[CAM_CC_CAMNOC_AXI_CLK_SRC] = &cam_cc_camnoc_axi_clk_src.clkr,
1717	[CAM_CC_CAMNOC_DCD_XO_CLK] = &cam_cc_camnoc_dcd_xo_clk.clkr,
1718	[CAM_CC_CCI_0_CLK] = &cam_cc_cci_0_clk.clkr,
1719	[CAM_CC_CCI_0_CLK_SRC] = &cam_cc_cci_0_clk_src.clkr,
1720	[CAM_CC_CCI_1_CLK] = &cam_cc_cci_1_clk.clkr,
1721	[CAM_CC_CCI_1_CLK_SRC] = &cam_cc_cci_1_clk_src.clkr,
1722	[CAM_CC_CCI_2_CLK] = &cam_cc_cci_2_clk.clkr,
1723	[CAM_CC_CCI_2_CLK_SRC] = &cam_cc_cci_2_clk_src.clkr,
1724	[CAM_CC_CCI_3_CLK] = &cam_cc_cci_3_clk.clkr,
1725	[CAM_CC_CCI_3_CLK_SRC] = &cam_cc_cci_3_clk_src.clkr,
1726	[CAM_CC_CORE_AHB_CLK] = &cam_cc_core_ahb_clk.clkr,
1727	[CAM_CC_CPAS_AHB_CLK] = &cam_cc_cpas_ahb_clk.clkr,
1728	[CAM_CC_CPAS_FAST_AHB_CLK] = &cam_cc_cpas_fast_ahb_clk.clkr,
1729	[CAM_CC_CPAS_IFE_0_CLK] = &cam_cc_cpas_ife_0_clk.clkr,
1730	[CAM_CC_CPAS_IFE_1_CLK] = &cam_cc_cpas_ife_1_clk.clkr,
1731	[CAM_CC_CPAS_IFE_LITE_CLK] = &cam_cc_cpas_ife_lite_clk.clkr,
1732	[CAM_CC_CPAS_IPE_CLK] = &cam_cc_cpas_ipe_clk.clkr,
1733	[CAM_CC_CPAS_SFE_LITE_0_CLK] = &cam_cc_cpas_sfe_lite_0_clk.clkr,
1734	[CAM_CC_CPAS_SFE_LITE_1_CLK] = &cam_cc_cpas_sfe_lite_1_clk.clkr,
1735	[CAM_CC_CPHY_RX_CLK_SRC] = &cam_cc_cphy_rx_clk_src.clkr,
1736	[CAM_CC_CSI0PHYTIMER_CLK] = &cam_cc_csi0phytimer_clk.clkr,
1737	[CAM_CC_CSI0PHYTIMER_CLK_SRC] = &cam_cc_csi0phytimer_clk_src.clkr,
1738	[CAM_CC_CSI1PHYTIMER_CLK] = &cam_cc_csi1phytimer_clk.clkr,
1739	[CAM_CC_CSI1PHYTIMER_CLK_SRC] = &cam_cc_csi1phytimer_clk_src.clkr,
1740	[CAM_CC_CSI2PHYTIMER_CLK] = &cam_cc_csi2phytimer_clk.clkr,
1741	[CAM_CC_CSI2PHYTIMER_CLK_SRC] = &cam_cc_csi2phytimer_clk_src.clkr,
1742	[CAM_CC_CSI3PHYTIMER_CLK] = &cam_cc_csi3phytimer_clk.clkr,
1743	[CAM_CC_CSI3PHYTIMER_CLK_SRC] = &cam_cc_csi3phytimer_clk_src.clkr,
1744	[CAM_CC_CSID_CLK] = &cam_cc_csid_clk.clkr,
1745	[CAM_CC_CSID_CLK_SRC] = &cam_cc_csid_clk_src.clkr,
1746	[CAM_CC_CSID_CSIPHY_RX_CLK] = &cam_cc_csid_csiphy_rx_clk.clkr,
1747	[CAM_CC_CSIPHY0_CLK] = &cam_cc_csiphy0_clk.clkr,
1748	[CAM_CC_CSIPHY1_CLK] = &cam_cc_csiphy1_clk.clkr,
1749	[CAM_CC_CSIPHY2_CLK] = &cam_cc_csiphy2_clk.clkr,
1750	[CAM_CC_CSIPHY3_CLK] = &cam_cc_csiphy3_clk.clkr,
1751	[CAM_CC_FAST_AHB_CLK_SRC] = &cam_cc_fast_ahb_clk_src.clkr,
1752	[CAM_CC_ICP_AHB_CLK] = &cam_cc_icp_ahb_clk.clkr,
1753	[CAM_CC_ICP_CLK] = &cam_cc_icp_clk.clkr,
1754	[CAM_CC_ICP_CLK_SRC] = &cam_cc_icp_clk_src.clkr,
1755	[CAM_CC_IFE_0_CLK] = &cam_cc_ife_0_clk.clkr,
1756	[CAM_CC_IFE_0_CLK_SRC] = &cam_cc_ife_0_clk_src.clkr,
1757	[CAM_CC_IFE_0_FAST_AHB_CLK] = &cam_cc_ife_0_fast_ahb_clk.clkr,
1758	[CAM_CC_IFE_1_CLK] = &cam_cc_ife_1_clk.clkr,
1759	[CAM_CC_IFE_1_CLK_SRC] = &cam_cc_ife_1_clk_src.clkr,
1760	[CAM_CC_IFE_1_FAST_AHB_CLK] = &cam_cc_ife_1_fast_ahb_clk.clkr,
1761	[CAM_CC_IFE_LITE_AHB_CLK] = &cam_cc_ife_lite_ahb_clk.clkr,
1762	[CAM_CC_IFE_LITE_CLK] = &cam_cc_ife_lite_clk.clkr,
1763	[CAM_CC_IFE_LITE_CLK_SRC] = &cam_cc_ife_lite_clk_src.clkr,
1764	[CAM_CC_IFE_LITE_CPHY_RX_CLK] = &cam_cc_ife_lite_cphy_rx_clk.clkr,
1765	[CAM_CC_IFE_LITE_CSID_CLK] = &cam_cc_ife_lite_csid_clk.clkr,
1766	[CAM_CC_IFE_LITE_CSID_CLK_SRC] = &cam_cc_ife_lite_csid_clk_src.clkr,
1767	[CAM_CC_IPE_AHB_CLK] = &cam_cc_ipe_ahb_clk.clkr,
1768	[CAM_CC_IPE_CLK] = &cam_cc_ipe_clk.clkr,
1769	[CAM_CC_IPE_CLK_SRC] = &cam_cc_ipe_clk_src.clkr,
1770	[CAM_CC_IPE_FAST_AHB_CLK] = &cam_cc_ipe_fast_ahb_clk.clkr,
1771	[CAM_CC_MCLK0_CLK] = &cam_cc_mclk0_clk.clkr,
1772	[CAM_CC_MCLK0_CLK_SRC] = &cam_cc_mclk0_clk_src.clkr,
1773	[CAM_CC_MCLK1_CLK] = &cam_cc_mclk1_clk.clkr,
1774	[CAM_CC_MCLK1_CLK_SRC] = &cam_cc_mclk1_clk_src.clkr,
1775	[CAM_CC_MCLK2_CLK] = &cam_cc_mclk2_clk.clkr,
1776	[CAM_CC_MCLK2_CLK_SRC] = &cam_cc_mclk2_clk_src.clkr,
1777	[CAM_CC_MCLK3_CLK] = &cam_cc_mclk3_clk.clkr,
1778	[CAM_CC_MCLK3_CLK_SRC] = &cam_cc_mclk3_clk_src.clkr,
1779	[CAM_CC_PLL0] = &cam_cc_pll0.clkr,
1780	[CAM_CC_PLL0_OUT_EVEN] = &cam_cc_pll0_out_even.clkr,
1781	[CAM_CC_PLL0_OUT_ODD] = &cam_cc_pll0_out_odd.clkr,
1782	[CAM_CC_PLL2] = &cam_cc_pll2.clkr,
1783	[CAM_CC_PLL3] = &cam_cc_pll3.clkr,
1784	[CAM_CC_PLL3_OUT_EVEN] = &cam_cc_pll3_out_even.clkr,
1785	[CAM_CC_PLL4] = &cam_cc_pll4.clkr,
1786	[CAM_CC_PLL4_OUT_EVEN] = &cam_cc_pll4_out_even.clkr,
1787	[CAM_CC_PLL5] = &cam_cc_pll5.clkr,
1788	[CAM_CC_PLL5_OUT_EVEN] = &cam_cc_pll5_out_even.clkr,
1789	[CAM_CC_SFE_LITE_0_CLK] = &cam_cc_sfe_lite_0_clk.clkr,
1790	[CAM_CC_SFE_LITE_0_FAST_AHB_CLK] = &cam_cc_sfe_lite_0_fast_ahb_clk.clkr,
1791	[CAM_CC_SFE_LITE_1_CLK] = &cam_cc_sfe_lite_1_clk.clkr,
1792	[CAM_CC_SFE_LITE_1_FAST_AHB_CLK] = &cam_cc_sfe_lite_1_fast_ahb_clk.clkr,
1793	[CAM_CC_SLEEP_CLK_SRC] = &cam_cc_sleep_clk_src.clkr,
1794	[CAM_CC_SLOW_AHB_CLK_SRC] = &cam_cc_slow_ahb_clk_src.clkr,
1795	[CAM_CC_SM_OBS_CLK] = &cam_cc_sm_obs_clk.clkr,
1796	[CAM_CC_TITAN_TOP_ACCU_SHIFT_CLK] = NULL,
1797	[CAM_CC_XO_CLK_SRC] = &cam_cc_xo_clk_src.clkr,
1798	[CAM_CC_QDSS_DEBUG_XO_CLK] = &cam_cc_qdss_debug_xo_clk.clkr,
1799};
1800
1801static struct gdsc *cam_cc_sa8775p_gdscs[] = {
1802	[CAM_CC_TITAN_TOP_GDSC] = &cam_cc_titan_top_gdsc,
1803};
1804
1805static const struct qcom_reset_map cam_cc_sa8775p_resets[] = {
1806	[CAM_CC_ICP_BCR] = { 0x13078 },
1807	[CAM_CC_IFE_0_BCR] = { 0x11000 },
1808	[CAM_CC_IFE_1_BCR] = { 0x12000 },
1809	[CAM_CC_IPE_0_BCR] = { 0x10000 },
1810	[CAM_CC_SFE_LITE_0_BCR] = { 0x13048 },
1811	[CAM_CC_SFE_LITE_1_BCR] = { 0x13060 },
1812};
1813
1814static const struct regmap_config cam_cc_sa8775p_regmap_config = {
1815	.reg_bits = 32,
1816	.reg_stride = 4,
1817	.val_bits = 32,
1818	.max_register = 0x16218,
1819	.fast_io = true,
1820};
1821
1822static const struct qcom_cc_desc cam_cc_sa8775p_desc = {
1823	.config = &cam_cc_sa8775p_regmap_config,
1824	.clks = cam_cc_sa8775p_clocks,
1825	.num_clks = ARRAY_SIZE(cam_cc_sa8775p_clocks),
1826	.resets = cam_cc_sa8775p_resets,
1827	.num_resets = ARRAY_SIZE(cam_cc_sa8775p_resets),
1828	.gdscs = cam_cc_sa8775p_gdscs,
1829	.num_gdscs = ARRAY_SIZE(cam_cc_sa8775p_gdscs),
1830};
1831
1832static const struct of_device_id cam_cc_sa8775p_match_table[] = {
1833	{ .compatible = "qcom,qcs8300-camcc" },
1834	{ .compatible = "qcom,sa8775p-camcc" },
1835	{ }
1836};
1837MODULE_DEVICE_TABLE(of, cam_cc_sa8775p_match_table);
1838
1839static int cam_cc_sa8775p_probe(struct platform_device *pdev)
1840{
1841	struct regmap *regmap;
1842	int ret;
1843
1844	ret = devm_pm_runtime_enable(&pdev->dev);
1845	if (ret)
1846		return ret;
1847
1848	ret = pm_runtime_resume_and_get(&pdev->dev);
1849	if (ret)
1850		return ret;
1851
1852	regmap = qcom_cc_map(pdev, &cam_cc_sa8775p_desc);
1853	if (IS_ERR(regmap)) {
1854		pm_runtime_put(&pdev->dev);
1855		return PTR_ERR(regmap);
1856	}
1857
1858	clk_lucid_evo_pll_configure(&cam_cc_pll0, regmap, &cam_cc_pll0_config);
1859	clk_rivian_evo_pll_configure(&cam_cc_pll2, regmap, &cam_cc_pll2_config);
1860	clk_lucid_evo_pll_configure(&cam_cc_pll3, regmap, &cam_cc_pll3_config);
1861	clk_lucid_evo_pll_configure(&cam_cc_pll4, regmap, &cam_cc_pll4_config);
1862	clk_lucid_evo_pll_configure(&cam_cc_pll5, regmap, &cam_cc_pll5_config);
1863
1864	if (device_is_compatible(&pdev->dev, "qcom,qcs8300-camcc")) {
1865		cam_cc_camnoc_axi_clk_src.cmd_rcgr = 0x13154;
1866		cam_cc_camnoc_axi_clk.halt_reg = 0x1316c;
1867		cam_cc_camnoc_axi_clk.clkr.enable_reg = 0x1316c;
1868		cam_cc_camnoc_dcd_xo_clk.halt_reg = 0x13174;
1869		cam_cc_camnoc_dcd_xo_clk.clkr.enable_reg = 0x13174;
1870
1871		cam_cc_csi0phytimer_clk_src.cmd_rcgr = 0x15054;
1872		cam_cc_csi1phytimer_clk_src.cmd_rcgr = 0x15078;
1873		cam_cc_csi2phytimer_clk_src.cmd_rcgr = 0x15098;
1874		cam_cc_csid_clk_src.cmd_rcgr = 0x13134;
1875
1876		cam_cc_mclk0_clk_src.cmd_rcgr = 0x15000;
1877		cam_cc_mclk1_clk_src.cmd_rcgr = 0x1501c;
1878		cam_cc_mclk2_clk_src.cmd_rcgr = 0x15038;
1879
1880		cam_cc_fast_ahb_clk_src.cmd_rcgr = 0x13104;
1881		cam_cc_slow_ahb_clk_src.cmd_rcgr = 0x1311c;
1882		cam_cc_xo_clk_src.cmd_rcgr = 0x131b8;
1883		cam_cc_sleep_clk_src.cmd_rcgr = 0x131d4;
1884
1885		cam_cc_core_ahb_clk.halt_reg = 0x131b4;
1886		cam_cc_core_ahb_clk.clkr.enable_reg = 0x131b4;
1887
1888		cam_cc_cpas_ahb_clk.halt_reg = 0x130f4;
1889		cam_cc_cpas_ahb_clk.clkr.enable_reg = 0x130f4;
1890		cam_cc_cpas_fast_ahb_clk.halt_reg = 0x130fc;
1891		cam_cc_cpas_fast_ahb_clk.clkr.enable_reg = 0x130fc;
1892
1893		cam_cc_csi0phytimer_clk.halt_reg = 0x1506c;
1894		cam_cc_csi0phytimer_clk.clkr.enable_reg = 0x1506c;
1895		cam_cc_csi1phytimer_clk.halt_reg = 0x15090;
1896		cam_cc_csi1phytimer_clk.clkr.enable_reg = 0x15090;
1897		cam_cc_csi2phytimer_clk.halt_reg = 0x150b0;
1898		cam_cc_csi2phytimer_clk.clkr.enable_reg = 0x150b0;
1899		cam_cc_csid_clk.halt_reg = 0x1314c;
1900		cam_cc_csid_clk.clkr.enable_reg = 0x1314c;
1901		cam_cc_csid_csiphy_rx_clk.halt_reg = 0x15074;
1902		cam_cc_csid_csiphy_rx_clk.clkr.enable_reg = 0x15074;
1903		cam_cc_csiphy0_clk.halt_reg = 0x15070;
1904		cam_cc_csiphy0_clk.clkr.enable_reg = 0x15070;
1905		cam_cc_csiphy1_clk.halt_reg = 0x15094;
1906		cam_cc_csiphy1_clk.clkr.enable_reg = 0x15094;
1907		cam_cc_csiphy2_clk.halt_reg = 0x150b4;
1908		cam_cc_csiphy2_clk.clkr.enable_reg = 0x150b4;
1909
1910		cam_cc_mclk0_clk.halt_reg = 0x15018;
1911		cam_cc_mclk0_clk.clkr.enable_reg = 0x15018;
1912		cam_cc_mclk1_clk.halt_reg = 0x15034;
1913		cam_cc_mclk1_clk.clkr.enable_reg = 0x15034;
1914		cam_cc_mclk2_clk.halt_reg = 0x15050;
1915		cam_cc_mclk2_clk.clkr.enable_reg = 0x15050;
1916		cam_cc_qdss_debug_xo_clk.halt_reg = 0x1319c;
1917		cam_cc_qdss_debug_xo_clk.clkr.enable_reg = 0x1319c;
1918
1919		cam_cc_titan_top_gdsc.gdscr = 0x131a0;
1920
1921		cam_cc_sa8775p_clocks[CAM_CC_CCI_3_CLK] = NULL;
1922		cam_cc_sa8775p_clocks[CAM_CC_CCI_3_CLK_SRC] = NULL;
1923		cam_cc_sa8775p_clocks[CAM_CC_CSI3PHYTIMER_CLK] = NULL;
1924		cam_cc_sa8775p_clocks[CAM_CC_CSI3PHYTIMER_CLK_SRC] = NULL;
1925		cam_cc_sa8775p_clocks[CAM_CC_CSIPHY3_CLK] = NULL;
1926		cam_cc_sa8775p_clocks[CAM_CC_MCLK3_CLK] = NULL;
1927		cam_cc_sa8775p_clocks[CAM_CC_MCLK3_CLK_SRC] = NULL;
1928		cam_cc_sa8775p_clocks[CAM_CC_TITAN_TOP_ACCU_SHIFT_CLK] =
1929				&cam_cc_titan_top_accu_shift_clk.clkr;
1930
1931		/* Keep some clocks always enabled */
1932		qcom_branch_set_clk_en(regmap, 0x13178); /* CAM_CC_CAMNOC_XO_CLK */
1933		qcom_branch_set_clk_en(regmap, 0x131d0); /* CAM_CC_GDSC_CLK */
1934		qcom_branch_set_clk_en(regmap, 0x131ec); /* CAM_CC_SLEEP_CLK */
1935	} else {
1936		/* Keep some clocks always enabled */
1937		qcom_branch_set_clk_en(regmap, 0x13194); /* CAM_CC_CAMNOC_XO_CLK */
1938		qcom_branch_set_clk_en(regmap, 0x131ec); /* CAM_CC_GDSC_CLK */
1939		qcom_branch_set_clk_en(regmap, 0x13208); /* CAM_CC_SLEEP_CLK */
1940	}
1941
1942	ret = qcom_cc_really_probe(&pdev->dev, &cam_cc_sa8775p_desc, regmap);
1943
1944	pm_runtime_put(&pdev->dev);
1945
1946	return ret;
1947}
1948
1949static struct platform_driver cam_cc_sa8775p_driver = {
1950	.probe = cam_cc_sa8775p_probe,
1951	.driver = {
1952		.name = "camcc-sa8775p",
1953		.of_match_table = cam_cc_sa8775p_match_table,
1954	},
1955};
1956
1957module_platform_driver(cam_cc_sa8775p_driver);
1958
1959MODULE_DESCRIPTION("QTI CAMCC SA8775P Driver");
1960MODULE_LICENSE("GPL");
~/ Read-only file preview.