0001
0002
0003
0004
0005
0006 #include <linux/clk-provider.h>
0007 #include <linux/err.h>
0008 #include <linux/module.h>
0009 #include <linux/of.h>
0010 #include <linux/of_device.h>
0011 #include <linux/pm_clock.h>
0012 #include <linux/pm_runtime.h>
0013 #include <linux/regmap.h>
0014
0015 #include <dt-bindings/clock/qcom,camcc-sc7180.h>
0016
0017 #include "clk-alpha-pll.h"
0018 #include "clk-branch.h"
0019 #include "clk-rcg.h"
0020 #include "clk-regmap.h"
0021 #include "common.h"
0022 #include "gdsc.h"
0023 #include "reset.h"
0024
0025 enum {
0026 P_BI_TCXO,
0027 P_CAM_CC_PLL0_OUT_EVEN,
0028 P_CAM_CC_PLL1_OUT_EVEN,
0029 P_CAM_CC_PLL2_OUT_AUX,
0030 P_CAM_CC_PLL2_OUT_EARLY,
0031 P_CAM_CC_PLL3_OUT_MAIN,
0032 };
0033
0034 static const struct pll_vco agera_vco[] = {
0035 { 600000000, 3300000000UL, 0 },
0036 };
0037
0038 static const struct pll_vco fabia_vco[] = {
0039 { 249600000, 2000000000UL, 0 },
0040 };
0041
0042
0043 static const struct alpha_pll_config cam_cc_pll0_config = {
0044 .l = 0x1f,
0045 .alpha = 0x4000,
0046 .config_ctl_val = 0x20485699,
0047 .config_ctl_hi_val = 0x00002067,
0048 .test_ctl_val = 0x40000000,
0049 .user_ctl_hi_val = 0x00004805,
0050 .user_ctl_val = 0x00000001,
0051 };
0052
0053 static struct clk_alpha_pll cam_cc_pll0 = {
0054 .offset = 0x0,
0055 .vco_table = fabia_vco,
0056 .num_vco = ARRAY_SIZE(fabia_vco),
0057 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
0058 .clkr = {
0059 .hw.init = &(struct clk_init_data){
0060 .name = "cam_cc_pll0",
0061 .parent_data = &(const struct clk_parent_data){
0062 .fw_name = "bi_tcxo",
0063 },
0064 .num_parents = 1,
0065 .ops = &clk_alpha_pll_fabia_ops,
0066 },
0067 },
0068 };
0069
0070
0071 static const struct alpha_pll_config cam_cc_pll1_config = {
0072 .l = 0x2a,
0073 .alpha = 0x1555,
0074 .config_ctl_val = 0x20485699,
0075 .config_ctl_hi_val = 0x00002067,
0076 .test_ctl_val = 0x40000000,
0077 .user_ctl_hi_val = 0x00004805,
0078 };
0079
0080 static struct clk_alpha_pll cam_cc_pll1 = {
0081 .offset = 0x1000,
0082 .vco_table = fabia_vco,
0083 .num_vco = ARRAY_SIZE(fabia_vco),
0084 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
0085 .clkr = {
0086 .hw.init = &(struct clk_init_data){
0087 .name = "cam_cc_pll1",
0088 .parent_data = &(const struct clk_parent_data){
0089 .fw_name = "bi_tcxo",
0090 },
0091 .num_parents = 1,
0092 .ops = &clk_alpha_pll_fabia_ops,
0093 },
0094 },
0095 };
0096
0097
0098 static const struct alpha_pll_config cam_cc_pll2_config = {
0099 .l = 0x64,
0100 .config_ctl_val = 0x20000800,
0101 .config_ctl_hi_val = 0x400003D2,
0102 .test_ctl_val = 0x04000400,
0103 .test_ctl_hi_val = 0x00004000,
0104 .user_ctl_val = 0x0000030F,
0105 };
0106
0107 static struct clk_alpha_pll cam_cc_pll2 = {
0108 .offset = 0x2000,
0109 .vco_table = agera_vco,
0110 .num_vco = ARRAY_SIZE(agera_vco),
0111 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_AGERA],
0112 .clkr = {
0113 .hw.init = &(struct clk_init_data){
0114 .name = "cam_cc_pll2",
0115 .parent_data = &(const struct clk_parent_data){
0116 .fw_name = "bi_tcxo",
0117 },
0118 .num_parents = 1,
0119 .ops = &clk_alpha_pll_agera_ops,
0120 },
0121 },
0122 };
0123
0124 static struct clk_fixed_factor cam_cc_pll2_out_early = {
0125 .mult = 1,
0126 .div = 2,
0127 .hw.init = &(struct clk_init_data){
0128 .name = "cam_cc_pll2_out_early",
0129 .parent_hws = (const struct clk_hw*[]){
0130 &cam_cc_pll2.clkr.hw,
0131 },
0132 .num_parents = 1,
0133 .ops = &clk_fixed_factor_ops,
0134 },
0135 };
0136
0137 static const struct clk_div_table post_div_table_cam_cc_pll2_out_aux[] = {
0138 { 0x3, 4 },
0139 { }
0140 };
0141
0142 static struct clk_alpha_pll_postdiv cam_cc_pll2_out_aux = {
0143 .offset = 0x2000,
0144 .post_div_shift = 8,
0145 .post_div_table = post_div_table_cam_cc_pll2_out_aux,
0146 .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll2_out_aux),
0147 .width = 2,
0148 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_AGERA],
0149 .clkr.hw.init = &(struct clk_init_data){
0150 .name = "cam_cc_pll2_out_aux",
0151 .parent_hws = (const struct clk_hw*[]){
0152 &cam_cc_pll2.clkr.hw,
0153 },
0154 .num_parents = 1,
0155 .flags = CLK_SET_RATE_PARENT,
0156 .ops = &clk_alpha_pll_postdiv_ops,
0157 },
0158 };
0159
0160
0161 static const struct alpha_pll_config cam_cc_pll3_config = {
0162 .l = 0x38,
0163 .alpha = 0x4000,
0164 .config_ctl_val = 0x20485699,
0165 .config_ctl_hi_val = 0x00002067,
0166 .test_ctl_val = 0x40000000,
0167 .user_ctl_hi_val = 0x00004805,
0168 };
0169
0170 static struct clk_alpha_pll cam_cc_pll3 = {
0171 .offset = 0x3000,
0172 .vco_table = fabia_vco,
0173 .num_vco = ARRAY_SIZE(fabia_vco),
0174 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
0175 .clkr = {
0176 .hw.init = &(struct clk_init_data){
0177 .name = "cam_cc_pll3",
0178 .parent_data = &(const struct clk_parent_data){
0179 .fw_name = "bi_tcxo",
0180 },
0181 .num_parents = 1,
0182 .ops = &clk_alpha_pll_fabia_ops,
0183 },
0184 },
0185 };
0186
0187 static const struct parent_map cam_cc_parent_map_0[] = {
0188 { P_BI_TCXO, 0 },
0189 { P_CAM_CC_PLL1_OUT_EVEN, 2 },
0190 { P_CAM_CC_PLL0_OUT_EVEN, 6 },
0191 };
0192
0193 static const struct clk_parent_data cam_cc_parent_data_0[] = {
0194 { .fw_name = "bi_tcxo" },
0195 { .hw = &cam_cc_pll1.clkr.hw },
0196 { .hw = &cam_cc_pll0.clkr.hw },
0197 };
0198
0199 static const struct parent_map cam_cc_parent_map_1[] = {
0200 { P_BI_TCXO, 0 },
0201 { P_CAM_CC_PLL2_OUT_AUX, 1 },
0202 };
0203
0204 static const struct clk_parent_data cam_cc_parent_data_1[] = {
0205 { .fw_name = "bi_tcxo" },
0206 { .hw = &cam_cc_pll2_out_aux.clkr.hw },
0207 };
0208
0209 static const struct parent_map cam_cc_parent_map_2[] = {
0210 { P_BI_TCXO, 0 },
0211 { P_CAM_CC_PLL2_OUT_EARLY, 4 },
0212 { P_CAM_CC_PLL3_OUT_MAIN, 5 },
0213 { P_CAM_CC_PLL0_OUT_EVEN, 6 },
0214 };
0215
0216 static const struct clk_parent_data cam_cc_parent_data_2[] = {
0217 { .fw_name = "bi_tcxo" },
0218 { .hw = &cam_cc_pll2_out_early.hw },
0219 { .hw = &cam_cc_pll3.clkr.hw },
0220 { .hw = &cam_cc_pll0.clkr.hw },
0221 };
0222
0223 static const struct parent_map cam_cc_parent_map_3[] = {
0224 { P_BI_TCXO, 0 },
0225 { P_CAM_CC_PLL1_OUT_EVEN, 2 },
0226 { P_CAM_CC_PLL2_OUT_EARLY, 4 },
0227 { P_CAM_CC_PLL3_OUT_MAIN, 5 },
0228 { P_CAM_CC_PLL0_OUT_EVEN, 6 },
0229 };
0230
0231 static const struct clk_parent_data cam_cc_parent_data_3[] = {
0232 { .fw_name = "bi_tcxo" },
0233 { .hw = &cam_cc_pll1.clkr.hw },
0234 { .hw = &cam_cc_pll2_out_early.hw },
0235 { .hw = &cam_cc_pll3.clkr.hw },
0236 { .hw = &cam_cc_pll0.clkr.hw },
0237 };
0238
0239 static const struct parent_map cam_cc_parent_map_4[] = {
0240 { P_BI_TCXO, 0 },
0241 { P_CAM_CC_PLL3_OUT_MAIN, 5 },
0242 { P_CAM_CC_PLL0_OUT_EVEN, 6 },
0243 };
0244
0245 static const struct clk_parent_data cam_cc_parent_data_4[] = {
0246 { .fw_name = "bi_tcxo" },
0247 { .hw = &cam_cc_pll3.clkr.hw },
0248 { .hw = &cam_cc_pll0.clkr.hw },
0249 };
0250
0251 static const struct parent_map cam_cc_parent_map_5[] = {
0252 { P_BI_TCXO, 0 },
0253 { P_CAM_CC_PLL0_OUT_EVEN, 6 },
0254 };
0255
0256 static const struct clk_parent_data cam_cc_parent_data_5[] = {
0257 { .fw_name = "bi_tcxo" },
0258 { .hw = &cam_cc_pll0.clkr.hw },
0259 };
0260
0261 static const struct parent_map cam_cc_parent_map_6[] = {
0262 { P_BI_TCXO, 0 },
0263 { P_CAM_CC_PLL1_OUT_EVEN, 2 },
0264 { P_CAM_CC_PLL3_OUT_MAIN, 5 },
0265 { P_CAM_CC_PLL0_OUT_EVEN, 6 },
0266 };
0267
0268 static const struct clk_parent_data cam_cc_parent_data_6[] = {
0269 { .fw_name = "bi_tcxo" },
0270 { .hw = &cam_cc_pll1.clkr.hw },
0271 { .hw = &cam_cc_pll3.clkr.hw },
0272 { .hw = &cam_cc_pll0.clkr.hw },
0273 };
0274
0275 static const struct freq_tbl ftbl_cam_cc_bps_clk_src[] = {
0276 F(200000000, P_CAM_CC_PLL0_OUT_EVEN, 3, 0, 0),
0277 F(360000000, P_CAM_CC_PLL3_OUT_MAIN, 3, 0, 0),
0278 F(432000000, P_CAM_CC_PLL3_OUT_MAIN, 2.5, 0, 0),
0279 F(480000000, P_CAM_CC_PLL2_OUT_EARLY, 2, 0, 0),
0280 F(600000000, P_CAM_CC_PLL0_OUT_EVEN, 1, 0, 0),
0281 { }
0282 };
0283
0284 static struct clk_rcg2 cam_cc_bps_clk_src = {
0285 .cmd_rcgr = 0x6010,
0286 .mnd_width = 0,
0287 .hid_width = 5,
0288 .parent_map = cam_cc_parent_map_2,
0289 .freq_tbl = ftbl_cam_cc_bps_clk_src,
0290 .clkr.hw.init = &(struct clk_init_data){
0291 .name = "cam_cc_bps_clk_src",
0292 .parent_data = cam_cc_parent_data_2,
0293 .num_parents = ARRAY_SIZE(cam_cc_parent_data_2),
0294 .ops = &clk_rcg2_shared_ops,
0295 },
0296 };
0297
0298 static const struct freq_tbl ftbl_cam_cc_cci_0_clk_src[] = {
0299 F(37500000, P_CAM_CC_PLL0_OUT_EVEN, 16, 0, 0),
0300 F(50000000, P_CAM_CC_PLL0_OUT_EVEN, 12, 0, 0),
0301 F(100000000, P_CAM_CC_PLL0_OUT_EVEN, 6, 0, 0),
0302 { }
0303 };
0304
0305 static struct clk_rcg2 cam_cc_cci_0_clk_src = {
0306 .cmd_rcgr = 0xb0d8,
0307 .mnd_width = 8,
0308 .hid_width = 5,
0309 .parent_map = cam_cc_parent_map_5,
0310 .freq_tbl = ftbl_cam_cc_cci_0_clk_src,
0311 .clkr.hw.init = &(struct clk_init_data){
0312 .name = "cam_cc_cci_0_clk_src",
0313 .parent_data = cam_cc_parent_data_5,
0314 .num_parents = ARRAY_SIZE(cam_cc_parent_data_5),
0315 .ops = &clk_rcg2_shared_ops,
0316 },
0317 };
0318
0319 static struct clk_rcg2 cam_cc_cci_1_clk_src = {
0320 .cmd_rcgr = 0xb14c,
0321 .mnd_width = 8,
0322 .hid_width = 5,
0323 .parent_map = cam_cc_parent_map_5,
0324 .freq_tbl = ftbl_cam_cc_cci_0_clk_src,
0325 .clkr.hw.init = &(struct clk_init_data){
0326 .name = "cam_cc_cci_1_clk_src",
0327 .parent_data = cam_cc_parent_data_5,
0328 .num_parents = ARRAY_SIZE(cam_cc_parent_data_5),
0329 .ops = &clk_rcg2_shared_ops,
0330 },
0331 };
0332
0333 static const struct freq_tbl ftbl_cam_cc_cphy_rx_clk_src[] = {
0334 F(150000000, P_CAM_CC_PLL0_OUT_EVEN, 4, 0, 0),
0335 F(270000000, P_CAM_CC_PLL3_OUT_MAIN, 4, 0, 0),
0336 F(360000000, P_CAM_CC_PLL3_OUT_MAIN, 3, 0, 0),
0337 { }
0338 };
0339
0340 static struct clk_rcg2 cam_cc_cphy_rx_clk_src = {
0341 .cmd_rcgr = 0x9064,
0342 .mnd_width = 0,
0343 .hid_width = 5,
0344 .parent_map = cam_cc_parent_map_3,
0345 .freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
0346 .clkr.hw.init = &(struct clk_init_data){
0347 .name = "cam_cc_cphy_rx_clk_src",
0348 .parent_data = cam_cc_parent_data_3,
0349 .num_parents = ARRAY_SIZE(cam_cc_parent_data_3),
0350 .ops = &clk_rcg2_shared_ops,
0351 },
0352 };
0353
0354 static const struct freq_tbl ftbl_cam_cc_csi0phytimer_clk_src[] = {
0355 F(300000000, P_CAM_CC_PLL0_OUT_EVEN, 2, 0, 0),
0356 { }
0357 };
0358
0359 static struct clk_rcg2 cam_cc_csi0phytimer_clk_src = {
0360 .cmd_rcgr = 0x5004,
0361 .mnd_width = 0,
0362 .hid_width = 5,
0363 .parent_map = cam_cc_parent_map_0,
0364 .freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src,
0365 .clkr.hw.init = &(struct clk_init_data){
0366 .name = "cam_cc_csi0phytimer_clk_src",
0367 .parent_data = cam_cc_parent_data_0,
0368 .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
0369 .ops = &clk_rcg2_shared_ops,
0370 },
0371 };
0372
0373 static struct clk_rcg2 cam_cc_csi1phytimer_clk_src = {
0374 .cmd_rcgr = 0x5028,
0375 .mnd_width = 0,
0376 .hid_width = 5,
0377 .parent_map = cam_cc_parent_map_0,
0378 .freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src,
0379 .clkr.hw.init = &(struct clk_init_data){
0380 .name = "cam_cc_csi1phytimer_clk_src",
0381 .parent_data = cam_cc_parent_data_0,
0382 .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
0383 .ops = &clk_rcg2_shared_ops,
0384 },
0385 };
0386
0387 static struct clk_rcg2 cam_cc_csi2phytimer_clk_src = {
0388 .cmd_rcgr = 0x504c,
0389 .mnd_width = 0,
0390 .hid_width = 5,
0391 .parent_map = cam_cc_parent_map_0,
0392 .freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src,
0393 .clkr.hw.init = &(struct clk_init_data){
0394 .name = "cam_cc_csi2phytimer_clk_src",
0395 .parent_data = cam_cc_parent_data_0,
0396 .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
0397 .ops = &clk_rcg2_shared_ops,
0398 },
0399 };
0400
0401 static struct clk_rcg2 cam_cc_csi3phytimer_clk_src = {
0402 .cmd_rcgr = 0x5070,
0403 .mnd_width = 0,
0404 .hid_width = 5,
0405 .parent_map = cam_cc_parent_map_0,
0406 .freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src,
0407 .clkr.hw.init = &(struct clk_init_data){
0408 .name = "cam_cc_csi3phytimer_clk_src",
0409 .parent_data = cam_cc_parent_data_0,
0410 .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
0411 .ops = &clk_rcg2_shared_ops,
0412 },
0413 };
0414
0415 static const struct freq_tbl ftbl_cam_cc_fast_ahb_clk_src[] = {
0416 F(100000000, P_CAM_CC_PLL0_OUT_EVEN, 6, 0, 0),
0417 F(200000000, P_CAM_CC_PLL0_OUT_EVEN, 3, 0, 0),
0418 F(300000000, P_CAM_CC_PLL0_OUT_EVEN, 2, 0, 0),
0419 F(404000000, P_CAM_CC_PLL1_OUT_EVEN, 2, 0, 0),
0420 { }
0421 };
0422
0423 static struct clk_rcg2 cam_cc_fast_ahb_clk_src = {
0424 .cmd_rcgr = 0x603c,
0425 .mnd_width = 0,
0426 .hid_width = 5,
0427 .parent_map = cam_cc_parent_map_0,
0428 .freq_tbl = ftbl_cam_cc_fast_ahb_clk_src,
0429 .clkr.hw.init = &(struct clk_init_data){
0430 .name = "cam_cc_fast_ahb_clk_src",
0431 .parent_data = cam_cc_parent_data_0,
0432 .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
0433 .ops = &clk_rcg2_shared_ops,
0434 },
0435 };
0436
0437 static const struct freq_tbl ftbl_cam_cc_icp_clk_src[] = {
0438 F(240000000, P_CAM_CC_PLL0_OUT_EVEN, 2.5, 0, 0),
0439 F(360000000, P_CAM_CC_PLL3_OUT_MAIN, 3, 0, 0),
0440 F(432000000, P_CAM_CC_PLL3_OUT_MAIN, 2.5, 0, 0),
0441 F(480000000, P_CAM_CC_PLL2_OUT_EARLY, 2, 0, 0),
0442 F(600000000, P_CAM_CC_PLL0_OUT_EVEN, 1, 0, 0),
0443 { }
0444 };
0445
0446 static struct clk_rcg2 cam_cc_icp_clk_src = {
0447 .cmd_rcgr = 0xb088,
0448 .mnd_width = 0,
0449 .hid_width = 5,
0450 .parent_map = cam_cc_parent_map_2,
0451 .freq_tbl = ftbl_cam_cc_icp_clk_src,
0452 .clkr.hw.init = &(struct clk_init_data){
0453 .name = "cam_cc_icp_clk_src",
0454 .parent_data = cam_cc_parent_data_2,
0455 .num_parents = ARRAY_SIZE(cam_cc_parent_data_2),
0456 .ops = &clk_rcg2_shared_ops,
0457 },
0458 };
0459
0460 static const struct freq_tbl ftbl_cam_cc_ife_0_clk_src[] = {
0461 F(240000000, P_CAM_CC_PLL0_OUT_EVEN, 2.5, 0, 0),
0462 F(360000000, P_CAM_CC_PLL3_OUT_MAIN, 3, 0, 0),
0463 F(432000000, P_CAM_CC_PLL3_OUT_MAIN, 2.5, 0, 0),
0464 F(600000000, P_CAM_CC_PLL0_OUT_EVEN, 1, 0, 0),
0465 { }
0466 };
0467
0468 static struct clk_rcg2 cam_cc_ife_0_clk_src = {
0469 .cmd_rcgr = 0x9010,
0470 .mnd_width = 0,
0471 .hid_width = 5,
0472 .parent_map = cam_cc_parent_map_4,
0473 .freq_tbl = ftbl_cam_cc_ife_0_clk_src,
0474 .clkr.hw.init = &(struct clk_init_data){
0475 .name = "cam_cc_ife_0_clk_src",
0476 .parent_data = cam_cc_parent_data_4,
0477 .num_parents = ARRAY_SIZE(cam_cc_parent_data_4),
0478 .ops = &clk_rcg2_shared_ops,
0479 },
0480 };
0481
0482 static const struct freq_tbl ftbl_cam_cc_ife_0_csid_clk_src[] = {
0483 F(150000000, P_CAM_CC_PLL0_OUT_EVEN, 4, 0, 0),
0484 F(270000000, P_CAM_CC_PLL3_OUT_MAIN, 4, 0, 0),
0485 F(360000000, P_CAM_CC_PLL3_OUT_MAIN, 3, 0, 0),
0486 F(480000000, P_CAM_CC_PLL2_OUT_EARLY, 2, 0, 0),
0487 { }
0488 };
0489
0490 static struct clk_rcg2 cam_cc_ife_0_csid_clk_src = {
0491 .cmd_rcgr = 0x903c,
0492 .mnd_width = 0,
0493 .hid_width = 5,
0494 .parent_map = cam_cc_parent_map_3,
0495 .freq_tbl = ftbl_cam_cc_ife_0_csid_clk_src,
0496 .clkr.hw.init = &(struct clk_init_data){
0497 .name = "cam_cc_ife_0_csid_clk_src",
0498 .parent_data = cam_cc_parent_data_3,
0499 .num_parents = ARRAY_SIZE(cam_cc_parent_data_3),
0500 .ops = &clk_rcg2_shared_ops,
0501 },
0502 };
0503
0504 static struct clk_rcg2 cam_cc_ife_1_clk_src = {
0505 .cmd_rcgr = 0xa010,
0506 .mnd_width = 0,
0507 .hid_width = 5,
0508 .parent_map = cam_cc_parent_map_4,
0509 .freq_tbl = ftbl_cam_cc_ife_0_clk_src,
0510 .clkr.hw.init = &(struct clk_init_data){
0511 .name = "cam_cc_ife_1_clk_src",
0512 .parent_data = cam_cc_parent_data_4,
0513 .num_parents = ARRAY_SIZE(cam_cc_parent_data_4),
0514 .ops = &clk_rcg2_shared_ops,
0515 },
0516 };
0517
0518 static struct clk_rcg2 cam_cc_ife_1_csid_clk_src = {
0519 .cmd_rcgr = 0xa034,
0520 .mnd_width = 0,
0521 .hid_width = 5,
0522 .parent_map = cam_cc_parent_map_3,
0523 .freq_tbl = ftbl_cam_cc_ife_0_csid_clk_src,
0524 .clkr.hw.init = &(struct clk_init_data){
0525 .name = "cam_cc_ife_1_csid_clk_src",
0526 .parent_data = cam_cc_parent_data_3,
0527 .num_parents = ARRAY_SIZE(cam_cc_parent_data_3),
0528 .ops = &clk_rcg2_shared_ops,
0529 },
0530 };
0531
0532 static struct clk_rcg2 cam_cc_ife_lite_clk_src = {
0533 .cmd_rcgr = 0xb004,
0534 .mnd_width = 0,
0535 .hid_width = 5,
0536 .parent_map = cam_cc_parent_map_4,
0537 .freq_tbl = ftbl_cam_cc_ife_0_clk_src,
0538 .clkr.hw.init = &(struct clk_init_data){
0539 .name = "cam_cc_ife_lite_clk_src",
0540 .parent_data = cam_cc_parent_data_4,
0541 .num_parents = ARRAY_SIZE(cam_cc_parent_data_4),
0542 .flags = CLK_SET_RATE_PARENT,
0543 .ops = &clk_rcg2_shared_ops,
0544 },
0545 };
0546
0547 static struct clk_rcg2 cam_cc_ife_lite_csid_clk_src = {
0548 .cmd_rcgr = 0xb024,
0549 .mnd_width = 0,
0550 .hid_width = 5,
0551 .parent_map = cam_cc_parent_map_3,
0552 .freq_tbl = ftbl_cam_cc_ife_0_csid_clk_src,
0553 .clkr.hw.init = &(struct clk_init_data){
0554 .name = "cam_cc_ife_lite_csid_clk_src",
0555 .parent_data = cam_cc_parent_data_3,
0556 .num_parents = ARRAY_SIZE(cam_cc_parent_data_3),
0557 .ops = &clk_rcg2_shared_ops,
0558 },
0559 };
0560
0561 static const struct freq_tbl ftbl_cam_cc_ipe_0_clk_src[] = {
0562 F(240000000, P_CAM_CC_PLL0_OUT_EVEN, 2.5, 0, 0),
0563 F(360000000, P_CAM_CC_PLL3_OUT_MAIN, 3, 0, 0),
0564 F(432000000, P_CAM_CC_PLL3_OUT_MAIN, 2.5, 0, 0),
0565 F(540000000, P_CAM_CC_PLL3_OUT_MAIN, 2, 0, 0),
0566 F(600000000, P_CAM_CC_PLL0_OUT_EVEN, 1, 0, 0),
0567 { }
0568 };
0569
0570 static struct clk_rcg2 cam_cc_ipe_0_clk_src = {
0571 .cmd_rcgr = 0x7010,
0572 .mnd_width = 0,
0573 .hid_width = 5,
0574 .parent_map = cam_cc_parent_map_2,
0575 .freq_tbl = ftbl_cam_cc_ipe_0_clk_src,
0576 .clkr.hw.init = &(struct clk_init_data){
0577 .name = "cam_cc_ipe_0_clk_src",
0578 .parent_data = cam_cc_parent_data_2,
0579 .num_parents = ARRAY_SIZE(cam_cc_parent_data_2),
0580 .ops = &clk_rcg2_shared_ops,
0581 },
0582 };
0583
0584 static const struct freq_tbl ftbl_cam_cc_jpeg_clk_src[] = {
0585 F(66666667, P_CAM_CC_PLL0_OUT_EVEN, 9, 0, 0),
0586 F(133333333, P_CAM_CC_PLL0_OUT_EVEN, 4.5, 0, 0),
0587 F(216000000, P_CAM_CC_PLL3_OUT_MAIN, 5, 0, 0),
0588 F(320000000, P_CAM_CC_PLL2_OUT_EARLY, 3, 0, 0),
0589 F(600000000, P_CAM_CC_PLL0_OUT_EVEN, 1, 0, 0),
0590 { }
0591 };
0592
0593 static struct clk_rcg2 cam_cc_jpeg_clk_src = {
0594 .cmd_rcgr = 0xb04c,
0595 .mnd_width = 0,
0596 .hid_width = 5,
0597 .parent_map = cam_cc_parent_map_2,
0598 .freq_tbl = ftbl_cam_cc_jpeg_clk_src,
0599 .clkr.hw.init = &(struct clk_init_data){
0600 .name = "cam_cc_jpeg_clk_src",
0601 .parent_data = cam_cc_parent_data_2,
0602 .num_parents = ARRAY_SIZE(cam_cc_parent_data_2),
0603 .ops = &clk_rcg2_shared_ops,
0604 },
0605 };
0606
0607 static const struct freq_tbl ftbl_cam_cc_lrme_clk_src[] = {
0608 F(200000000, P_CAM_CC_PLL0_OUT_EVEN, 3, 0, 0),
0609 F(216000000, P_CAM_CC_PLL3_OUT_MAIN, 5, 0, 0),
0610 F(300000000, P_CAM_CC_PLL0_OUT_EVEN, 2, 0, 0),
0611 F(404000000, P_CAM_CC_PLL1_OUT_EVEN, 2, 0, 0),
0612 { }
0613 };
0614
0615 static struct clk_rcg2 cam_cc_lrme_clk_src = {
0616 .cmd_rcgr = 0xb0f8,
0617 .mnd_width = 0,
0618 .hid_width = 5,
0619 .parent_map = cam_cc_parent_map_6,
0620 .freq_tbl = ftbl_cam_cc_lrme_clk_src,
0621 .clkr.hw.init = &(struct clk_init_data){
0622 .name = "cam_cc_lrme_clk_src",
0623 .parent_data = cam_cc_parent_data_6,
0624 .num_parents = ARRAY_SIZE(cam_cc_parent_data_6),
0625 .ops = &clk_rcg2_shared_ops,
0626 },
0627 };
0628
0629 static const struct freq_tbl ftbl_cam_cc_mclk0_clk_src[] = {
0630 F(19200000, P_BI_TCXO, 1, 0, 0),
0631 F(24000000, P_CAM_CC_PLL2_OUT_AUX, 10, 1, 2),
0632 F(64000000, P_CAM_CC_PLL2_OUT_AUX, 7.5, 0, 0),
0633 { }
0634 };
0635
0636 static struct clk_rcg2 cam_cc_mclk0_clk_src = {
0637 .cmd_rcgr = 0x4004,
0638 .mnd_width = 8,
0639 .hid_width = 5,
0640 .parent_map = cam_cc_parent_map_1,
0641 .freq_tbl = ftbl_cam_cc_mclk0_clk_src,
0642 .clkr.hw.init = &(struct clk_init_data){
0643 .name = "cam_cc_mclk0_clk_src",
0644 .parent_data = cam_cc_parent_data_1,
0645 .num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
0646 .ops = &clk_rcg2_shared_ops,
0647 },
0648 };
0649
0650 static struct clk_rcg2 cam_cc_mclk1_clk_src = {
0651 .cmd_rcgr = 0x4024,
0652 .mnd_width = 8,
0653 .hid_width = 5,
0654 .parent_map = cam_cc_parent_map_1,
0655 .freq_tbl = ftbl_cam_cc_mclk0_clk_src,
0656 .clkr.hw.init = &(struct clk_init_data){
0657 .name = "cam_cc_mclk1_clk_src",
0658 .parent_data = cam_cc_parent_data_1,
0659 .num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
0660 .ops = &clk_rcg2_shared_ops,
0661 },
0662 };
0663
0664 static struct clk_rcg2 cam_cc_mclk2_clk_src = {
0665 .cmd_rcgr = 0x4044,
0666 .mnd_width = 8,
0667 .hid_width = 5,
0668 .parent_map = cam_cc_parent_map_1,
0669 .freq_tbl = ftbl_cam_cc_mclk0_clk_src,
0670 .clkr.hw.init = &(struct clk_init_data){
0671 .name = "cam_cc_mclk2_clk_src",
0672 .parent_data = cam_cc_parent_data_1,
0673 .num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
0674 .ops = &clk_rcg2_shared_ops,
0675 },
0676 };
0677
0678 static struct clk_rcg2 cam_cc_mclk3_clk_src = {
0679 .cmd_rcgr = 0x4064,
0680 .mnd_width = 8,
0681 .hid_width = 5,
0682 .parent_map = cam_cc_parent_map_1,
0683 .freq_tbl = ftbl_cam_cc_mclk0_clk_src,
0684 .clkr.hw.init = &(struct clk_init_data){
0685 .name = "cam_cc_mclk3_clk_src",
0686 .parent_data = cam_cc_parent_data_1,
0687 .num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
0688 .ops = &clk_rcg2_shared_ops,
0689 },
0690 };
0691
0692 static struct clk_rcg2 cam_cc_mclk4_clk_src = {
0693 .cmd_rcgr = 0x4084,
0694 .mnd_width = 8,
0695 .hid_width = 5,
0696 .parent_map = cam_cc_parent_map_1,
0697 .freq_tbl = ftbl_cam_cc_mclk0_clk_src,
0698 .clkr.hw.init = &(struct clk_init_data){
0699 .name = "cam_cc_mclk4_clk_src",
0700 .parent_data = cam_cc_parent_data_1,
0701 .num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
0702 .ops = &clk_rcg2_shared_ops,
0703 },
0704 };
0705
0706 static const struct freq_tbl ftbl_cam_cc_slow_ahb_clk_src[] = {
0707 F(80000000, P_CAM_CC_PLL0_OUT_EVEN, 7.5, 0, 0),
0708 { }
0709 };
0710
0711 static struct clk_rcg2 cam_cc_slow_ahb_clk_src = {
0712 .cmd_rcgr = 0x6058,
0713 .mnd_width = 0,
0714 .hid_width = 5,
0715 .parent_map = cam_cc_parent_map_0,
0716 .freq_tbl = ftbl_cam_cc_slow_ahb_clk_src,
0717 .clkr.hw.init = &(struct clk_init_data){
0718 .name = "cam_cc_slow_ahb_clk_src",
0719 .parent_data = cam_cc_parent_data_0,
0720 .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
0721 .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
0722 .ops = &clk_rcg2_shared_ops,
0723 },
0724 };
0725
0726 static struct clk_branch cam_cc_bps_ahb_clk = {
0727 .halt_reg = 0x6070,
0728 .halt_check = BRANCH_HALT,
0729 .clkr = {
0730 .enable_reg = 0x6070,
0731 .enable_mask = BIT(0),
0732 .hw.init = &(struct clk_init_data){
0733 .name = "cam_cc_bps_ahb_clk",
0734 .parent_hws = (const struct clk_hw*[]){
0735 &cam_cc_slow_ahb_clk_src.clkr.hw,
0736 },
0737 .num_parents = 1,
0738 .flags = CLK_SET_RATE_PARENT,
0739 .ops = &clk_branch2_ops,
0740 },
0741 },
0742 };
0743
0744 static struct clk_branch cam_cc_bps_areg_clk = {
0745 .halt_reg = 0x6054,
0746 .halt_check = BRANCH_HALT,
0747 .clkr = {
0748 .enable_reg = 0x6054,
0749 .enable_mask = BIT(0),
0750 .hw.init = &(struct clk_init_data){
0751 .name = "cam_cc_bps_areg_clk",
0752 .parent_hws = (const struct clk_hw*[]){
0753 &cam_cc_fast_ahb_clk_src.clkr.hw,
0754 },
0755 .num_parents = 1,
0756 .flags = CLK_SET_RATE_PARENT,
0757 .ops = &clk_branch2_ops,
0758 },
0759 },
0760 };
0761
0762 static struct clk_branch cam_cc_bps_axi_clk = {
0763 .halt_reg = 0x6038,
0764 .halt_check = BRANCH_HALT,
0765 .clkr = {
0766 .enable_reg = 0x6038,
0767 .enable_mask = BIT(0),
0768 .hw.init = &(struct clk_init_data){
0769 .name = "cam_cc_bps_axi_clk",
0770 .ops = &clk_branch2_ops,
0771 },
0772 },
0773 };
0774
0775 static struct clk_branch cam_cc_bps_clk = {
0776 .halt_reg = 0x6028,
0777 .halt_check = BRANCH_HALT,
0778 .clkr = {
0779 .enable_reg = 0x6028,
0780 .enable_mask = BIT(0),
0781 .hw.init = &(struct clk_init_data){
0782 .name = "cam_cc_bps_clk",
0783 .parent_hws = (const struct clk_hw*[]){
0784 &cam_cc_bps_clk_src.clkr.hw,
0785 },
0786 .num_parents = 1,
0787 .flags = CLK_SET_RATE_PARENT,
0788 .ops = &clk_branch2_ops,
0789 },
0790 },
0791 };
0792
0793 static struct clk_branch cam_cc_camnoc_axi_clk = {
0794 .halt_reg = 0xb124,
0795 .halt_check = BRANCH_HALT,
0796 .clkr = {
0797 .enable_reg = 0xb124,
0798 .enable_mask = BIT(0),
0799 .hw.init = &(struct clk_init_data){
0800 .name = "cam_cc_camnoc_axi_clk",
0801 .ops = &clk_branch2_ops,
0802 },
0803 },
0804 };
0805
0806 static struct clk_branch cam_cc_cci_0_clk = {
0807 .halt_reg = 0xb0f0,
0808 .halt_check = BRANCH_HALT,
0809 .clkr = {
0810 .enable_reg = 0xb0f0,
0811 .enable_mask = BIT(0),
0812 .hw.init = &(struct clk_init_data){
0813 .name = "cam_cc_cci_0_clk",
0814 .parent_hws = (const struct clk_hw*[]){
0815 &cam_cc_cci_0_clk_src.clkr.hw,
0816 },
0817 .num_parents = 1,
0818 .flags = CLK_SET_RATE_PARENT,
0819 .ops = &clk_branch2_ops,
0820 },
0821 },
0822 };
0823
0824 static struct clk_branch cam_cc_cci_1_clk = {
0825 .halt_reg = 0xb164,
0826 .halt_check = BRANCH_HALT,
0827 .clkr = {
0828 .enable_reg = 0xb164,
0829 .enable_mask = BIT(0),
0830 .hw.init = &(struct clk_init_data){
0831 .name = "cam_cc_cci_1_clk",
0832 .parent_hws = (const struct clk_hw*[]){
0833 &cam_cc_cci_1_clk_src.clkr.hw,
0834 },
0835 .num_parents = 1,
0836 .flags = CLK_SET_RATE_PARENT,
0837 .ops = &clk_branch2_ops,
0838 },
0839 },
0840 };
0841
0842 static struct clk_branch cam_cc_core_ahb_clk = {
0843 .halt_reg = 0xb144,
0844 .halt_check = BRANCH_HALT_DELAY,
0845 .clkr = {
0846 .enable_reg = 0xb144,
0847 .enable_mask = BIT(0),
0848 .hw.init = &(struct clk_init_data){
0849 .name = "cam_cc_core_ahb_clk",
0850 .parent_hws = (const struct clk_hw*[]){
0851 &cam_cc_slow_ahb_clk_src.clkr.hw,
0852 },
0853 .num_parents = 1,
0854 .flags = CLK_SET_RATE_PARENT,
0855 .ops = &clk_branch2_ops,
0856 },
0857 },
0858 };
0859
0860 static struct clk_branch cam_cc_cpas_ahb_clk = {
0861 .halt_reg = 0xb11c,
0862 .halt_check = BRANCH_HALT,
0863 .clkr = {
0864 .enable_reg = 0xb11c,
0865 .enable_mask = BIT(0),
0866 .hw.init = &(struct clk_init_data){
0867 .name = "cam_cc_cpas_ahb_clk",
0868 .parent_hws = (const struct clk_hw*[]){
0869 &cam_cc_slow_ahb_clk_src.clkr.hw,
0870 },
0871 .num_parents = 1,
0872 .flags = CLK_SET_RATE_PARENT,
0873 .ops = &clk_branch2_ops,
0874 },
0875 },
0876 };
0877
0878 static struct clk_branch cam_cc_csi0phytimer_clk = {
0879 .halt_reg = 0x501c,
0880 .halt_check = BRANCH_HALT,
0881 .clkr = {
0882 .enable_reg = 0x501c,
0883 .enable_mask = BIT(0),
0884 .hw.init = &(struct clk_init_data){
0885 .name = "cam_cc_csi0phytimer_clk",
0886 .parent_hws = (const struct clk_hw*[]){
0887 &cam_cc_csi0phytimer_clk_src.clkr.hw,
0888 },
0889 .num_parents = 1,
0890 .flags = CLK_SET_RATE_PARENT,
0891 .ops = &clk_branch2_ops,
0892 },
0893 },
0894 };
0895
0896 static struct clk_branch cam_cc_csi1phytimer_clk = {
0897 .halt_reg = 0x5040,
0898 .halt_check = BRANCH_HALT,
0899 .clkr = {
0900 .enable_reg = 0x5040,
0901 .enable_mask = BIT(0),
0902 .hw.init = &(struct clk_init_data){
0903 .name = "cam_cc_csi1phytimer_clk",
0904 .parent_hws = (const struct clk_hw*[]){
0905 &cam_cc_csi1phytimer_clk_src.clkr.hw,
0906 },
0907 .num_parents = 1,
0908 .flags = CLK_SET_RATE_PARENT,
0909 .ops = &clk_branch2_ops,
0910 },
0911 },
0912 };
0913
0914 static struct clk_branch cam_cc_csi2phytimer_clk = {
0915 .halt_reg = 0x5064,
0916 .halt_check = BRANCH_HALT,
0917 .clkr = {
0918 .enable_reg = 0x5064,
0919 .enable_mask = BIT(0),
0920 .hw.init = &(struct clk_init_data){
0921 .name = "cam_cc_csi2phytimer_clk",
0922 .parent_hws = (const struct clk_hw*[]){
0923 &cam_cc_csi2phytimer_clk_src.clkr.hw,
0924 },
0925 .num_parents = 1,
0926 .flags = CLK_SET_RATE_PARENT,
0927 .ops = &clk_branch2_ops,
0928 },
0929 },
0930 };
0931
0932 static struct clk_branch cam_cc_csi3phytimer_clk = {
0933 .halt_reg = 0x5088,
0934 .halt_check = BRANCH_HALT,
0935 .clkr = {
0936 .enable_reg = 0x5088,
0937 .enable_mask = BIT(0),
0938 .hw.init = &(struct clk_init_data){
0939 .name = "cam_cc_csi3phytimer_clk",
0940 .parent_hws = (const struct clk_hw*[]){
0941 &cam_cc_csi3phytimer_clk_src.clkr.hw,
0942 },
0943 .num_parents = 1,
0944 .flags = CLK_SET_RATE_PARENT,
0945 .ops = &clk_branch2_ops,
0946 },
0947 },
0948 };
0949
0950 static struct clk_branch cam_cc_csiphy0_clk = {
0951 .halt_reg = 0x5020,
0952 .halt_check = BRANCH_HALT,
0953 .clkr = {
0954 .enable_reg = 0x5020,
0955 .enable_mask = BIT(0),
0956 .hw.init = &(struct clk_init_data){
0957 .name = "cam_cc_csiphy0_clk",
0958 .parent_hws = (const struct clk_hw*[]){
0959 &cam_cc_cphy_rx_clk_src.clkr.hw,
0960 },
0961 .num_parents = 1,
0962 .flags = CLK_SET_RATE_PARENT,
0963 .ops = &clk_branch2_ops,
0964 },
0965 },
0966 };
0967
0968 static struct clk_branch cam_cc_csiphy1_clk = {
0969 .halt_reg = 0x5044,
0970 .halt_check = BRANCH_HALT,
0971 .clkr = {
0972 .enable_reg = 0x5044,
0973 .enable_mask = BIT(0),
0974 .hw.init = &(struct clk_init_data){
0975 .name = "cam_cc_csiphy1_clk",
0976 .parent_hws = (const struct clk_hw*[]){
0977 &cam_cc_cphy_rx_clk_src.clkr.hw,
0978 },
0979 .num_parents = 1,
0980 .flags = CLK_SET_RATE_PARENT,
0981 .ops = &clk_branch2_ops,
0982 },
0983 },
0984 };
0985
0986 static struct clk_branch cam_cc_csiphy2_clk = {
0987 .halt_reg = 0x5068,
0988 .halt_check = BRANCH_HALT,
0989 .clkr = {
0990 .enable_reg = 0x5068,
0991 .enable_mask = BIT(0),
0992 .hw.init = &(struct clk_init_data){
0993 .name = "cam_cc_csiphy2_clk",
0994 .parent_hws = (const struct clk_hw*[]){
0995 &cam_cc_cphy_rx_clk_src.clkr.hw,
0996 },
0997 .num_parents = 1,
0998 .flags = CLK_SET_RATE_PARENT,
0999 .ops = &clk_branch2_ops,
1000 },
1001 },
1002 };
1003
1004 static struct clk_branch cam_cc_csiphy3_clk = {
1005 .halt_reg = 0x508c,
1006 .halt_check = BRANCH_HALT,
1007 .clkr = {
1008 .enable_reg = 0x508c,
1009 .enable_mask = BIT(0),
1010 .hw.init = &(struct clk_init_data){
1011 .name = "cam_cc_csiphy3_clk",
1012 .parent_hws = (const struct clk_hw*[]){
1013 &cam_cc_cphy_rx_clk_src.clkr.hw,
1014 },
1015 .num_parents = 1,
1016 .flags = CLK_SET_RATE_PARENT,
1017 .ops = &clk_branch2_ops,
1018 },
1019 },
1020 };
1021
1022 static struct clk_branch cam_cc_icp_clk = {
1023 .halt_reg = 0xb0a0,
1024 .halt_check = BRANCH_HALT,
1025 .clkr = {
1026 .enable_reg = 0xb0a0,
1027 .enable_mask = BIT(0),
1028 .hw.init = &(struct clk_init_data){
1029 .name = "cam_cc_icp_clk",
1030 .parent_hws = (const struct clk_hw*[]){
1031 &cam_cc_icp_clk_src.clkr.hw,
1032 },
1033 .num_parents = 1,
1034 .flags = CLK_SET_RATE_PARENT,
1035 .ops = &clk_branch2_ops,
1036 },
1037 },
1038 };
1039
1040 static struct clk_branch cam_cc_ife_0_axi_clk = {
1041 .halt_reg = 0x9080,
1042 .halt_check = BRANCH_HALT,
1043 .clkr = {
1044 .enable_reg = 0x9080,
1045 .enable_mask = BIT(0),
1046 .hw.init = &(struct clk_init_data){
1047 .name = "cam_cc_ife_0_axi_clk",
1048 .ops = &clk_branch2_ops,
1049 },
1050 },
1051 };
1052
1053 static struct clk_branch cam_cc_ife_0_clk = {
1054 .halt_reg = 0x9028,
1055 .halt_check = BRANCH_HALT,
1056 .clkr = {
1057 .enable_reg = 0x9028,
1058 .enable_mask = BIT(0),
1059 .hw.init = &(struct clk_init_data){
1060 .name = "cam_cc_ife_0_clk",
1061 .parent_hws = (const struct clk_hw*[]){
1062 &cam_cc_ife_0_clk_src.clkr.hw,
1063 },
1064 .num_parents = 1,
1065 .flags = CLK_SET_RATE_PARENT,
1066 .ops = &clk_branch2_ops,
1067 },
1068 },
1069 };
1070
1071 static struct clk_branch cam_cc_ife_0_cphy_rx_clk = {
1072 .halt_reg = 0x907c,
1073 .halt_check = BRANCH_HALT,
1074 .clkr = {
1075 .enable_reg = 0x907c,
1076 .enable_mask = BIT(0),
1077 .hw.init = &(struct clk_init_data){
1078 .name = "cam_cc_ife_0_cphy_rx_clk",
1079 .parent_hws = (const struct clk_hw*[]){
1080 &cam_cc_cphy_rx_clk_src.clkr.hw,
1081 },
1082 .num_parents = 1,
1083 .flags = CLK_SET_RATE_PARENT,
1084 .ops = &clk_branch2_ops,
1085 },
1086 },
1087 };
1088
1089 static struct clk_branch cam_cc_ife_0_csid_clk = {
1090 .halt_reg = 0x9054,
1091 .halt_check = BRANCH_HALT,
1092 .clkr = {
1093 .enable_reg = 0x9054,
1094 .enable_mask = BIT(0),
1095 .hw.init = &(struct clk_init_data){
1096 .name = "cam_cc_ife_0_csid_clk",
1097 .parent_hws = (const struct clk_hw*[]){
1098 &cam_cc_ife_0_csid_clk_src.clkr.hw,
1099 },
1100 .num_parents = 1,
1101 .flags = CLK_SET_RATE_PARENT,
1102 .ops = &clk_branch2_ops,
1103 },
1104 },
1105 };
1106
1107 static struct clk_branch cam_cc_ife_0_dsp_clk = {
1108 .halt_reg = 0x9038,
1109 .halt_check = BRANCH_HALT,
1110 .clkr = {
1111 .enable_reg = 0x9038,
1112 .enable_mask = BIT(0),
1113 .hw.init = &(struct clk_init_data){
1114 .name = "cam_cc_ife_0_dsp_clk",
1115 .parent_hws = (const struct clk_hw*[]){
1116 &cam_cc_ife_0_clk_src.clkr.hw,
1117 },
1118 .num_parents = 1,
1119 .flags = CLK_SET_RATE_PARENT,
1120 .ops = &clk_branch2_ops,
1121 },
1122 },
1123 };
1124
1125 static struct clk_branch cam_cc_ife_1_axi_clk = {
1126 .halt_reg = 0xa058,
1127 .halt_check = BRANCH_HALT,
1128 .clkr = {
1129 .enable_reg = 0xa058,
1130 .enable_mask = BIT(0),
1131 .hw.init = &(struct clk_init_data){
1132 .name = "cam_cc_ife_1_axi_clk",
1133 .ops = &clk_branch2_ops,
1134 },
1135 },
1136 };
1137
1138 static struct clk_branch cam_cc_ife_1_clk = {
1139 .halt_reg = 0xa028,
1140 .halt_check = BRANCH_HALT,
1141 .clkr = {
1142 .enable_reg = 0xa028,
1143 .enable_mask = BIT(0),
1144 .hw.init = &(struct clk_init_data){
1145 .name = "cam_cc_ife_1_clk",
1146 .parent_hws = (const struct clk_hw*[]){
1147 &cam_cc_ife_1_clk_src.clkr.hw,
1148 },
1149 .num_parents = 1,
1150 .flags = CLK_SET_RATE_PARENT,
1151 .ops = &clk_branch2_ops,
1152 },
1153 },
1154 };
1155
1156 static struct clk_branch cam_cc_ife_1_cphy_rx_clk = {
1157 .halt_reg = 0xa054,
1158 .halt_check = BRANCH_HALT,
1159 .clkr = {
1160 .enable_reg = 0xa054,
1161 .enable_mask = BIT(0),
1162 .hw.init = &(struct clk_init_data){
1163 .name = "cam_cc_ife_1_cphy_rx_clk",
1164 .parent_hws = (const struct clk_hw*[]){
1165 &cam_cc_cphy_rx_clk_src.clkr.hw,
1166 },
1167 .num_parents = 1,
1168 .flags = CLK_SET_RATE_PARENT,
1169 .ops = &clk_branch2_ops,
1170 },
1171 },
1172 };
1173
1174 static struct clk_branch cam_cc_ife_1_csid_clk = {
1175 .halt_reg = 0xa04c,
1176 .halt_check = BRANCH_HALT,
1177 .clkr = {
1178 .enable_reg = 0xa04c,
1179 .enable_mask = BIT(0),
1180 .hw.init = &(struct clk_init_data){
1181 .name = "cam_cc_ife_1_csid_clk",
1182 .parent_hws = (const struct clk_hw*[]){
1183 &cam_cc_ife_1_csid_clk_src.clkr.hw,
1184 },
1185 .num_parents = 1,
1186 .flags = CLK_SET_RATE_PARENT,
1187 .ops = &clk_branch2_ops,
1188 },
1189 },
1190 };
1191
1192 static struct clk_branch cam_cc_ife_1_dsp_clk = {
1193 .halt_reg = 0xa030,
1194 .halt_check = BRANCH_HALT,
1195 .clkr = {
1196 .enable_reg = 0xa030,
1197 .enable_mask = BIT(0),
1198 .hw.init = &(struct clk_init_data){
1199 .name = "cam_cc_ife_1_dsp_clk",
1200 .parent_hws = (const struct clk_hw*[]){
1201 &cam_cc_ife_1_clk_src.clkr.hw,
1202 },
1203 .num_parents = 1,
1204 .flags = CLK_SET_RATE_PARENT,
1205 .ops = &clk_branch2_ops,
1206 },
1207 },
1208 };
1209
1210 static struct clk_branch cam_cc_ife_lite_clk = {
1211 .halt_reg = 0xb01c,
1212 .halt_check = BRANCH_HALT,
1213 .clkr = {
1214 .enable_reg = 0xb01c,
1215 .enable_mask = BIT(0),
1216 .hw.init = &(struct clk_init_data){
1217 .name = "cam_cc_ife_lite_clk",
1218 .parent_hws = (const struct clk_hw*[]){
1219 &cam_cc_ife_lite_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_ife_lite_cphy_rx_clk = {
1229 .halt_reg = 0xb044,
1230 .halt_check = BRANCH_HALT,
1231 .clkr = {
1232 .enable_reg = 0xb044,
1233 .enable_mask = BIT(0),
1234 .hw.init = &(struct clk_init_data){
1235 .name = "cam_cc_ife_lite_cphy_rx_clk",
1236 .parent_hws = (const struct clk_hw*[]){
1237 &cam_cc_cphy_rx_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_ife_lite_csid_clk = {
1247 .halt_reg = 0xb03c,
1248 .halt_check = BRANCH_HALT,
1249 .clkr = {
1250 .enable_reg = 0xb03c,
1251 .enable_mask = BIT(0),
1252 .hw.init = &(struct clk_init_data){
1253 .name = "cam_cc_ife_lite_csid_clk",
1254 .parent_hws = (const struct clk_hw*[]){
1255 &cam_cc_ife_lite_csid_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_ipe_0_ahb_clk = {
1265 .halt_reg = 0x7040,
1266 .halt_check = BRANCH_HALT,
1267 .clkr = {
1268 .enable_reg = 0x7040,
1269 .enable_mask = BIT(0),
1270 .hw.init = &(struct clk_init_data){
1271 .name = "cam_cc_ipe_0_ahb_clk",
1272 .parent_hws = (const struct clk_hw*[]){
1273 &cam_cc_slow_ahb_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_ipe_0_areg_clk = {
1283 .halt_reg = 0x703c,
1284 .halt_check = BRANCH_HALT,
1285 .clkr = {
1286 .enable_reg = 0x703c,
1287 .enable_mask = BIT(0),
1288 .hw.init = &(struct clk_init_data){
1289 .name = "cam_cc_ipe_0_areg_clk",
1290 .parent_hws = (const struct clk_hw*[]){
1291 &cam_cc_fast_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_ipe_0_axi_clk = {
1301 .halt_reg = 0x7038,
1302 .halt_check = BRANCH_HALT,
1303 .clkr = {
1304 .enable_reg = 0x7038,
1305 .enable_mask = BIT(0),
1306 .hw.init = &(struct clk_init_data){
1307 .name = "cam_cc_ipe_0_axi_clk",
1308 .ops = &clk_branch2_ops,
1309 },
1310 },
1311 };
1312
1313 static struct clk_branch cam_cc_ipe_0_clk = {
1314 .halt_reg = 0x7028,
1315 .halt_check = BRANCH_HALT,
1316 .clkr = {
1317 .enable_reg = 0x7028,
1318 .enable_mask = BIT(0),
1319 .hw.init = &(struct clk_init_data){
1320 .name = "cam_cc_ipe_0_clk",
1321 .parent_hws = (const struct clk_hw*[]){
1322 &cam_cc_ipe_0_clk_src.clkr.hw,
1323 },
1324 .num_parents = 1,
1325 .flags = CLK_SET_RATE_PARENT,
1326 .ops = &clk_branch2_ops,
1327 },
1328 },
1329 };
1330
1331 static struct clk_branch cam_cc_jpeg_clk = {
1332 .halt_reg = 0xb064,
1333 .halt_check = BRANCH_HALT,
1334 .clkr = {
1335 .enable_reg = 0xb064,
1336 .enable_mask = BIT(0),
1337 .hw.init = &(struct clk_init_data){
1338 .name = "cam_cc_jpeg_clk",
1339 .parent_hws = (const struct clk_hw*[]){
1340 &cam_cc_jpeg_clk_src.clkr.hw,
1341 },
1342 .num_parents = 1,
1343 .flags = CLK_SET_RATE_PARENT,
1344 .ops = &clk_branch2_ops,
1345 },
1346 },
1347 };
1348
1349 static struct clk_branch cam_cc_lrme_clk = {
1350 .halt_reg = 0xb110,
1351 .halt_check = BRANCH_HALT,
1352 .clkr = {
1353 .enable_reg = 0xb110,
1354 .enable_mask = BIT(0),
1355 .hw.init = &(struct clk_init_data){
1356 .name = "cam_cc_lrme_clk",
1357 .parent_hws = (const struct clk_hw*[]){
1358 &cam_cc_lrme_clk_src.clkr.hw,
1359 },
1360 .num_parents = 1,
1361 .flags = CLK_SET_RATE_PARENT,
1362 .ops = &clk_branch2_ops,
1363 },
1364 },
1365 };
1366
1367 static struct clk_branch cam_cc_mclk0_clk = {
1368 .halt_reg = 0x401c,
1369 .halt_check = BRANCH_HALT,
1370 .clkr = {
1371 .enable_reg = 0x401c,
1372 .enable_mask = BIT(0),
1373 .hw.init = &(struct clk_init_data){
1374 .name = "cam_cc_mclk0_clk",
1375 .parent_hws = (const struct clk_hw*[]){
1376 &cam_cc_mclk0_clk_src.clkr.hw,
1377 },
1378 .num_parents = 1,
1379 .flags = CLK_SET_RATE_PARENT,
1380 .ops = &clk_branch2_ops,
1381 },
1382 },
1383 };
1384
1385 static struct clk_branch cam_cc_mclk1_clk = {
1386 .halt_reg = 0x403c,
1387 .halt_check = BRANCH_HALT,
1388 .clkr = {
1389 .enable_reg = 0x403c,
1390 .enable_mask = BIT(0),
1391 .hw.init = &(struct clk_init_data){
1392 .name = "cam_cc_mclk1_clk",
1393 .parent_hws = (const struct clk_hw*[]){
1394 &cam_cc_mclk1_clk_src.clkr.hw,
1395 },
1396 .num_parents = 1,
1397 .flags = CLK_SET_RATE_PARENT,
1398 .ops = &clk_branch2_ops,
1399 },
1400 },
1401 };
1402
1403 static struct clk_branch cam_cc_mclk2_clk = {
1404 .halt_reg = 0x405c,
1405 .halt_check = BRANCH_HALT,
1406 .clkr = {
1407 .enable_reg = 0x405c,
1408 .enable_mask = BIT(0),
1409 .hw.init = &(struct clk_init_data){
1410 .name = "cam_cc_mclk2_clk",
1411 .parent_hws = (const struct clk_hw*[]){
1412 &cam_cc_mclk2_clk_src.clkr.hw,
1413 },
1414 .num_parents = 1,
1415 .flags = CLK_SET_RATE_PARENT,
1416 .ops = &clk_branch2_ops,
1417 },
1418 },
1419 };
1420
1421 static struct clk_branch cam_cc_mclk3_clk = {
1422 .halt_reg = 0x407c,
1423 .halt_check = BRANCH_HALT,
1424 .clkr = {
1425 .enable_reg = 0x407c,
1426 .enable_mask = BIT(0),
1427 .hw.init = &(struct clk_init_data){
1428 .name = "cam_cc_mclk3_clk",
1429 .parent_hws = (const struct clk_hw*[]){
1430 &cam_cc_mclk3_clk_src.clkr.hw,
1431 },
1432 .num_parents = 1,
1433 .flags = CLK_SET_RATE_PARENT,
1434 .ops = &clk_branch2_ops,
1435 },
1436 },
1437 };
1438
1439 static struct clk_branch cam_cc_mclk4_clk = {
1440 .halt_reg = 0x409c,
1441 .halt_check = BRANCH_HALT,
1442 .clkr = {
1443 .enable_reg = 0x409c,
1444 .enable_mask = BIT(0),
1445 .hw.init = &(struct clk_init_data){
1446 .name = "cam_cc_mclk4_clk",
1447 .parent_hws = (const struct clk_hw*[]){
1448 &cam_cc_mclk4_clk_src.clkr.hw,
1449 },
1450 .num_parents = 1,
1451 .flags = CLK_SET_RATE_PARENT,
1452 .ops = &clk_branch2_ops,
1453 },
1454 },
1455 };
1456
1457 static struct clk_branch cam_cc_soc_ahb_clk = {
1458 .halt_reg = 0xb140,
1459 .halt_check = BRANCH_HALT,
1460 .clkr = {
1461 .enable_reg = 0xb140,
1462 .enable_mask = BIT(0),
1463 .hw.init = &(struct clk_init_data){
1464 .name = "cam_cc_soc_ahb_clk",
1465 .ops = &clk_branch2_ops,
1466 },
1467 },
1468 };
1469
1470 static struct clk_branch cam_cc_sys_tmr_clk = {
1471 .halt_reg = 0xb0a8,
1472 .halt_check = BRANCH_HALT,
1473 .clkr = {
1474 .enable_reg = 0xb0a8,
1475 .enable_mask = BIT(0),
1476 .hw.init = &(struct clk_init_data){
1477 .name = "cam_cc_sys_tmr_clk",
1478 .ops = &clk_branch2_ops,
1479 },
1480 },
1481 };
1482
1483 static struct gdsc bps_gdsc = {
1484 .gdscr = 0x6004,
1485 .pd = {
1486 .name = "bps_gdsc",
1487 },
1488 .pwrsts = PWRSTS_OFF_ON,
1489 .flags = HW_CTRL,
1490 };
1491
1492 static struct gdsc ife_0_gdsc = {
1493 .gdscr = 0x9004,
1494 .pd = {
1495 .name = "ife_0_gdsc",
1496 },
1497 .pwrsts = PWRSTS_OFF_ON,
1498 };
1499
1500 static struct gdsc ife_1_gdsc = {
1501 .gdscr = 0xa004,
1502 .pd = {
1503 .name = "ife_1_gdsc",
1504 },
1505 .pwrsts = PWRSTS_OFF_ON,
1506 };
1507
1508 static struct gdsc ipe_0_gdsc = {
1509 .gdscr = 0x7004,
1510 .pd = {
1511 .name = "ipe_0_gdsc",
1512 },
1513 .pwrsts = PWRSTS_OFF_ON,
1514 .flags = HW_CTRL,
1515 };
1516
1517 static struct gdsc titan_top_gdsc = {
1518 .gdscr = 0xb134,
1519 .pd = {
1520 .name = "titan_top_gdsc",
1521 },
1522 .pwrsts = PWRSTS_OFF_ON,
1523 };
1524
1525 static struct clk_hw *cam_cc_sc7180_hws[] = {
1526 [CAM_CC_PLL2_OUT_EARLY] = &cam_cc_pll2_out_early.hw,
1527 };
1528
1529 static struct clk_regmap *cam_cc_sc7180_clocks[] = {
1530 [CAM_CC_BPS_AHB_CLK] = &cam_cc_bps_ahb_clk.clkr,
1531 [CAM_CC_BPS_AREG_CLK] = &cam_cc_bps_areg_clk.clkr,
1532 [CAM_CC_BPS_AXI_CLK] = &cam_cc_bps_axi_clk.clkr,
1533 [CAM_CC_BPS_CLK] = &cam_cc_bps_clk.clkr,
1534 [CAM_CC_BPS_CLK_SRC] = &cam_cc_bps_clk_src.clkr,
1535 [CAM_CC_CAMNOC_AXI_CLK] = &cam_cc_camnoc_axi_clk.clkr,
1536 [CAM_CC_CCI_0_CLK] = &cam_cc_cci_0_clk.clkr,
1537 [CAM_CC_CCI_0_CLK_SRC] = &cam_cc_cci_0_clk_src.clkr,
1538 [CAM_CC_CCI_1_CLK] = &cam_cc_cci_1_clk.clkr,
1539 [CAM_CC_CCI_1_CLK_SRC] = &cam_cc_cci_1_clk_src.clkr,
1540 [CAM_CC_CORE_AHB_CLK] = &cam_cc_core_ahb_clk.clkr,
1541 [CAM_CC_CPAS_AHB_CLK] = &cam_cc_cpas_ahb_clk.clkr,
1542 [CAM_CC_CPHY_RX_CLK_SRC] = &cam_cc_cphy_rx_clk_src.clkr,
1543 [CAM_CC_CSI0PHYTIMER_CLK] = &cam_cc_csi0phytimer_clk.clkr,
1544 [CAM_CC_CSI0PHYTIMER_CLK_SRC] = &cam_cc_csi0phytimer_clk_src.clkr,
1545 [CAM_CC_CSI1PHYTIMER_CLK] = &cam_cc_csi1phytimer_clk.clkr,
1546 [CAM_CC_CSI1PHYTIMER_CLK_SRC] = &cam_cc_csi1phytimer_clk_src.clkr,
1547 [CAM_CC_CSI2PHYTIMER_CLK] = &cam_cc_csi2phytimer_clk.clkr,
1548 [CAM_CC_CSI2PHYTIMER_CLK_SRC] = &cam_cc_csi2phytimer_clk_src.clkr,
1549 [CAM_CC_CSI3PHYTIMER_CLK] = &cam_cc_csi3phytimer_clk.clkr,
1550 [CAM_CC_CSI3PHYTIMER_CLK_SRC] = &cam_cc_csi3phytimer_clk_src.clkr,
1551 [CAM_CC_CSIPHY0_CLK] = &cam_cc_csiphy0_clk.clkr,
1552 [CAM_CC_CSIPHY1_CLK] = &cam_cc_csiphy1_clk.clkr,
1553 [CAM_CC_CSIPHY2_CLK] = &cam_cc_csiphy2_clk.clkr,
1554 [CAM_CC_CSIPHY3_CLK] = &cam_cc_csiphy3_clk.clkr,
1555 [CAM_CC_FAST_AHB_CLK_SRC] = &cam_cc_fast_ahb_clk_src.clkr,
1556 [CAM_CC_ICP_CLK] = &cam_cc_icp_clk.clkr,
1557 [CAM_CC_ICP_CLK_SRC] = &cam_cc_icp_clk_src.clkr,
1558 [CAM_CC_IFE_0_AXI_CLK] = &cam_cc_ife_0_axi_clk.clkr,
1559 [CAM_CC_IFE_0_CLK] = &cam_cc_ife_0_clk.clkr,
1560 [CAM_CC_IFE_0_CLK_SRC] = &cam_cc_ife_0_clk_src.clkr,
1561 [CAM_CC_IFE_0_CPHY_RX_CLK] = &cam_cc_ife_0_cphy_rx_clk.clkr,
1562 [CAM_CC_IFE_0_CSID_CLK] = &cam_cc_ife_0_csid_clk.clkr,
1563 [CAM_CC_IFE_0_CSID_CLK_SRC] = &cam_cc_ife_0_csid_clk_src.clkr,
1564 [CAM_CC_IFE_0_DSP_CLK] = &cam_cc_ife_0_dsp_clk.clkr,
1565 [CAM_CC_IFE_1_AXI_CLK] = &cam_cc_ife_1_axi_clk.clkr,
1566 [CAM_CC_IFE_1_CLK] = &cam_cc_ife_1_clk.clkr,
1567 [CAM_CC_IFE_1_CLK_SRC] = &cam_cc_ife_1_clk_src.clkr,
1568 [CAM_CC_IFE_1_CPHY_RX_CLK] = &cam_cc_ife_1_cphy_rx_clk.clkr,
1569 [CAM_CC_IFE_1_CSID_CLK] = &cam_cc_ife_1_csid_clk.clkr,
1570 [CAM_CC_IFE_1_CSID_CLK_SRC] = &cam_cc_ife_1_csid_clk_src.clkr,
1571 [CAM_CC_IFE_1_DSP_CLK] = &cam_cc_ife_1_dsp_clk.clkr,
1572 [CAM_CC_IFE_LITE_CLK] = &cam_cc_ife_lite_clk.clkr,
1573 [CAM_CC_IFE_LITE_CLK_SRC] = &cam_cc_ife_lite_clk_src.clkr,
1574 [CAM_CC_IFE_LITE_CPHY_RX_CLK] = &cam_cc_ife_lite_cphy_rx_clk.clkr,
1575 [CAM_CC_IFE_LITE_CSID_CLK] = &cam_cc_ife_lite_csid_clk.clkr,
1576 [CAM_CC_IFE_LITE_CSID_CLK_SRC] = &cam_cc_ife_lite_csid_clk_src.clkr,
1577 [CAM_CC_IPE_0_AHB_CLK] = &cam_cc_ipe_0_ahb_clk.clkr,
1578 [CAM_CC_IPE_0_AREG_CLK] = &cam_cc_ipe_0_areg_clk.clkr,
1579 [CAM_CC_IPE_0_AXI_CLK] = &cam_cc_ipe_0_axi_clk.clkr,
1580 [CAM_CC_IPE_0_CLK] = &cam_cc_ipe_0_clk.clkr,
1581 [CAM_CC_IPE_0_CLK_SRC] = &cam_cc_ipe_0_clk_src.clkr,
1582 [CAM_CC_JPEG_CLK] = &cam_cc_jpeg_clk.clkr,
1583 [CAM_CC_JPEG_CLK_SRC] = &cam_cc_jpeg_clk_src.clkr,
1584 [CAM_CC_LRME_CLK] = &cam_cc_lrme_clk.clkr,
1585 [CAM_CC_LRME_CLK_SRC] = &cam_cc_lrme_clk_src.clkr,
1586 [CAM_CC_MCLK0_CLK] = &cam_cc_mclk0_clk.clkr,
1587 [CAM_CC_MCLK0_CLK_SRC] = &cam_cc_mclk0_clk_src.clkr,
1588 [CAM_CC_MCLK1_CLK] = &cam_cc_mclk1_clk.clkr,
1589 [CAM_CC_MCLK1_CLK_SRC] = &cam_cc_mclk1_clk_src.clkr,
1590 [CAM_CC_MCLK2_CLK] = &cam_cc_mclk2_clk.clkr,
1591 [CAM_CC_MCLK2_CLK_SRC] = &cam_cc_mclk2_clk_src.clkr,
1592 [CAM_CC_MCLK3_CLK] = &cam_cc_mclk3_clk.clkr,
1593 [CAM_CC_MCLK3_CLK_SRC] = &cam_cc_mclk3_clk_src.clkr,
1594 [CAM_CC_MCLK4_CLK] = &cam_cc_mclk4_clk.clkr,
1595 [CAM_CC_MCLK4_CLK_SRC] = &cam_cc_mclk4_clk_src.clkr,
1596 [CAM_CC_PLL0] = &cam_cc_pll0.clkr,
1597 [CAM_CC_PLL1] = &cam_cc_pll1.clkr,
1598 [CAM_CC_PLL2] = &cam_cc_pll2.clkr,
1599 [CAM_CC_PLL2_OUT_AUX] = &cam_cc_pll2_out_aux.clkr,
1600 [CAM_CC_PLL3] = &cam_cc_pll3.clkr,
1601 [CAM_CC_SLOW_AHB_CLK_SRC] = &cam_cc_slow_ahb_clk_src.clkr,
1602 [CAM_CC_SOC_AHB_CLK] = &cam_cc_soc_ahb_clk.clkr,
1603 [CAM_CC_SYS_TMR_CLK] = &cam_cc_sys_tmr_clk.clkr,
1604 };
1605 static struct gdsc *cam_cc_sc7180_gdscs[] = {
1606 [BPS_GDSC] = &bps_gdsc,
1607 [IFE_0_GDSC] = &ife_0_gdsc,
1608 [IFE_1_GDSC] = &ife_1_gdsc,
1609 [IPE_0_GDSC] = &ipe_0_gdsc,
1610 [TITAN_TOP_GDSC] = &titan_top_gdsc,
1611 };
1612
1613 static const struct regmap_config cam_cc_sc7180_regmap_config = {
1614 .reg_bits = 32,
1615 .reg_stride = 4,
1616 .val_bits = 32,
1617 .max_register = 0xd028,
1618 .fast_io = true,
1619 };
1620
1621 static const struct qcom_cc_desc cam_cc_sc7180_desc = {
1622 .config = &cam_cc_sc7180_regmap_config,
1623 .clk_hws = cam_cc_sc7180_hws,
1624 .num_clk_hws = ARRAY_SIZE(cam_cc_sc7180_hws),
1625 .clks = cam_cc_sc7180_clocks,
1626 .num_clks = ARRAY_SIZE(cam_cc_sc7180_clocks),
1627 .gdscs = cam_cc_sc7180_gdscs,
1628 .num_gdscs = ARRAY_SIZE(cam_cc_sc7180_gdscs),
1629 };
1630
1631 static const struct of_device_id cam_cc_sc7180_match_table[] = {
1632 { .compatible = "qcom,sc7180-camcc" },
1633 { }
1634 };
1635 MODULE_DEVICE_TABLE(of, cam_cc_sc7180_match_table);
1636
1637 static int cam_cc_sc7180_probe(struct platform_device *pdev)
1638 {
1639 struct regmap *regmap;
1640 int ret;
1641
1642 ret = devm_pm_runtime_enable(&pdev->dev);
1643 if (ret < 0)
1644 return ret;
1645
1646 ret = devm_pm_clk_create(&pdev->dev);
1647 if (ret < 0)
1648 return ret;
1649
1650 ret = pm_clk_add(&pdev->dev, "xo");
1651 if (ret < 0) {
1652 dev_err(&pdev->dev, "Failed to acquire XO clock\n");
1653 return ret;
1654 }
1655
1656 ret = pm_clk_add(&pdev->dev, "iface");
1657 if (ret < 0) {
1658 dev_err(&pdev->dev, "Failed to acquire iface clock\n");
1659 return ret;
1660 }
1661
1662 ret = pm_runtime_get(&pdev->dev);
1663 if (ret)
1664 return ret;
1665
1666 regmap = qcom_cc_map(pdev, &cam_cc_sc7180_desc);
1667 if (IS_ERR(regmap)) {
1668 ret = PTR_ERR(regmap);
1669 pm_runtime_put(&pdev->dev);
1670 return ret;
1671 }
1672
1673 clk_fabia_pll_configure(&cam_cc_pll0, regmap, &cam_cc_pll0_config);
1674 clk_fabia_pll_configure(&cam_cc_pll1, regmap, &cam_cc_pll1_config);
1675 clk_agera_pll_configure(&cam_cc_pll2, regmap, &cam_cc_pll2_config);
1676 clk_fabia_pll_configure(&cam_cc_pll3, regmap, &cam_cc_pll3_config);
1677
1678 ret = qcom_cc_really_probe(pdev, &cam_cc_sc7180_desc, regmap);
1679 pm_runtime_put(&pdev->dev);
1680 if (ret < 0) {
1681 dev_err(&pdev->dev, "Failed to register CAM CC clocks\n");
1682 return ret;
1683 }
1684
1685 return 0;
1686 }
1687
1688 static const struct dev_pm_ops cam_cc_pm_ops = {
1689 SET_RUNTIME_PM_OPS(pm_clk_suspend, pm_clk_resume, NULL)
1690 };
1691
1692 static struct platform_driver cam_cc_sc7180_driver = {
1693 .probe = cam_cc_sc7180_probe,
1694 .driver = {
1695 .name = "cam_cc-sc7180",
1696 .of_match_table = cam_cc_sc7180_match_table,
1697 .pm = &cam_cc_pm_ops,
1698 },
1699 };
1700
1701 static int __init cam_cc_sc7180_init(void)
1702 {
1703 return platform_driver_register(&cam_cc_sc7180_driver);
1704 }
1705 subsys_initcall(cam_cc_sc7180_init);
1706
1707 static void __exit cam_cc_sc7180_exit(void)
1708 {
1709 platform_driver_unregister(&cam_cc_sc7180_driver);
1710 }
1711 module_exit(cam_cc_sc7180_exit);
1712
1713 MODULE_DESCRIPTION("QTI CAM_CC SC7180 Driver");
1714 MODULE_LICENSE("GPL v2");