Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Copyright (c) 2020, The Linux Foundation. All rights reserved.
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 /* 600MHz configuration */
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 /* 860MHz configuration */
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 /* 1920MHz configuration */
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 /* 1080MHz configuration */
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");