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  * Copyright (c) 2020, Martin Botka <martin.botka@somainline.org>
0005  * Copyright (c) 2020, Konrad Dybcio <konrad.dybcio@somainline.org>
0006  */
0007 
0008 #include <linux/kernel.h>
0009 #include <linux/bitops.h>
0010 #include <linux/err.h>
0011 #include <linux/platform_device.h>
0012 #include <linux/module.h>
0013 #include <linux/of.h>
0014 #include <linux/of_device.h>
0015 #include <linux/clk-provider.h>
0016 #include <linux/regmap.h>
0017 #include <linux/reset-controller.h>
0018 #include <linux/clk.h>
0019 
0020 
0021 #include <dt-bindings/clock/qcom,mmcc-sdm660.h>
0022 
0023 #include "common.h"
0024 #include "clk-regmap.h"
0025 #include "clk-regmap-divider.h"
0026 #include "clk-alpha-pll.h"
0027 #include "clk-rcg.h"
0028 #include "clk-branch.h"
0029 #include "reset.h"
0030 #include "gdsc.h"
0031 
0032 enum {
0033     P_XO,
0034     P_DSI0PLL_BYTE,
0035     P_DSI0PLL,
0036     P_DSI1PLL_BYTE,
0037     P_DSI1PLL,
0038     P_GPLL0,
0039     P_GPLL0_DIV,
0040     P_MMPLL0,
0041     P_MMPLL10,
0042     P_MMPLL3,
0043     P_MMPLL4,
0044     P_MMPLL5,
0045     P_MMPLL6,
0046     P_MMPLL7,
0047     P_MMPLL8,
0048     P_SLEEP_CLK,
0049     P_DP_PHY_PLL_LINK_CLK,
0050     P_DP_PHY_PLL_VCO_DIV,
0051 };
0052 
0053 static const struct parent_map mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map[] = {
0054     { P_XO, 0 },
0055     { P_MMPLL0, 1 },
0056     { P_MMPLL4, 2 },
0057     { P_MMPLL7, 3 },
0058     { P_MMPLL8, 4 },
0059     { P_GPLL0, 5 },
0060     { P_GPLL0_DIV, 6 },
0061 };
0062 
0063 /* Voteable PLL */
0064 static struct clk_alpha_pll mmpll0 = {
0065     .offset = 0xc000,
0066     .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
0067     .clkr = {
0068         .enable_reg = 0x1f0,
0069         .enable_mask = BIT(0),
0070         .hw.init = &(struct clk_init_data){
0071             .name = "mmpll0",
0072             .parent_data = &(const struct clk_parent_data){
0073                 .fw_name = "xo",
0074             },
0075             .num_parents = 1,
0076             .ops = &clk_alpha_pll_ops,
0077         },
0078     },
0079 };
0080 
0081 static struct clk_alpha_pll mmpll6 =  {
0082     .offset = 0xf0,
0083     .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
0084     .clkr = {
0085         .enable_reg = 0x1f0,
0086         .enable_mask = BIT(2),
0087         .hw.init = &(struct clk_init_data){
0088             .name = "mmpll6",
0089             .parent_data = &(const struct clk_parent_data){
0090                 .fw_name = "xo",
0091             },
0092             .num_parents = 1,
0093             .ops = &clk_alpha_pll_ops,
0094         },
0095     },
0096 };
0097 
0098 /* APSS controlled PLLs */
0099 static struct pll_vco vco[] = {
0100     { 1000000000, 2000000000, 0 },
0101     { 750000000, 1500000000, 1 },
0102     { 500000000, 1000000000, 2 },
0103     { 250000000, 500000000, 3 },
0104 };
0105 
0106 static struct pll_vco mmpll3_vco[] = {
0107     { 750000000, 1500000000, 1 },
0108 };
0109 
0110 static const struct alpha_pll_config mmpll10_config = {
0111     .l = 0x1e,
0112     .config_ctl_val = 0x00004289,
0113     .main_output_mask = 0x1,
0114 };
0115 
0116 static struct clk_alpha_pll mmpll10 = {
0117     .offset = 0x190,
0118     .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
0119     .clkr = {
0120         .hw.init = &(struct clk_init_data){
0121             .name = "mmpll10",
0122             .parent_data = &(const struct clk_parent_data){
0123                 .fw_name = "xo",
0124             },
0125             .num_parents = 1,
0126             .ops = &clk_alpha_pll_ops,
0127         },
0128     },
0129 };
0130 
0131 static const struct alpha_pll_config mmpll3_config = {
0132     .l = 0x2e,
0133     .config_ctl_val = 0x4001055b,
0134     .vco_val = 0x1 << 20,
0135     .vco_mask = 0x3 << 20,
0136     .main_output_mask = 0x1,
0137 };
0138 
0139 static struct clk_alpha_pll mmpll3 = {
0140     .offset = 0x0,
0141     .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
0142     .vco_table = mmpll3_vco,
0143     .num_vco = ARRAY_SIZE(mmpll3_vco),
0144     .clkr = {
0145         .hw.init = &(struct clk_init_data){
0146             .name = "mmpll3",
0147             .parent_data = &(const struct clk_parent_data){
0148                 .fw_name = "xo",
0149             },
0150             .num_parents = 1,
0151             .ops = &clk_alpha_pll_ops,
0152         },
0153     },
0154 };
0155 
0156 static const struct alpha_pll_config mmpll4_config = {
0157     .l = 0x28,
0158     .config_ctl_val = 0x4001055b,
0159     .vco_val = 0x2 << 20,
0160     .vco_mask = 0x3 << 20,
0161     .main_output_mask = 0x1,
0162 };
0163 
0164 static struct clk_alpha_pll mmpll4 = {
0165     .offset = 0x50,
0166     .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
0167     .vco_table = vco,
0168     .num_vco = ARRAY_SIZE(vco),
0169     .clkr = {
0170         .hw.init = &(struct clk_init_data){
0171             .name = "mmpll4",
0172             .parent_data = &(const struct clk_parent_data){
0173                 .fw_name = "xo",
0174             },
0175             .num_parents = 1,
0176             .ops = &clk_alpha_pll_ops,
0177         },
0178     },
0179 };
0180 
0181 static const struct alpha_pll_config mmpll5_config = {
0182     .l = 0x2a,
0183     .config_ctl_val = 0x4001055b,
0184     .alpha_hi = 0xf8,
0185     .alpha_en_mask = BIT(24),
0186     .vco_val = 0x2 << 20,
0187     .vco_mask = 0x3 << 20,
0188     .main_output_mask = 0x1,
0189 };
0190 
0191 static struct clk_alpha_pll mmpll5 = {
0192     .offset = 0xa0,
0193     .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
0194     .vco_table = vco,
0195     .num_vco = ARRAY_SIZE(vco),
0196     .clkr = {
0197         .hw.init = &(struct clk_init_data){
0198             .name = "mmpll5",
0199             .parent_data = &(const struct clk_parent_data){
0200                 .fw_name = "xo",
0201             },
0202             .num_parents = 1,
0203             .ops = &clk_alpha_pll_ops,
0204         },
0205     },
0206 };
0207 
0208 static const struct alpha_pll_config mmpll7_config = {
0209     .l = 0x32,
0210     .config_ctl_val = 0x4001055b,
0211     .vco_val = 0x2 << 20,
0212     .vco_mask = 0x3 << 20,
0213     .main_output_mask = 0x1,
0214 };
0215 
0216 static struct clk_alpha_pll mmpll7 = {
0217     .offset = 0x140,
0218     .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
0219     .vco_table = vco,
0220     .num_vco = ARRAY_SIZE(vco),
0221     .clkr = {
0222         .hw.init = &(struct clk_init_data){
0223             .name = "mmpll7",
0224             .parent_data = &(const struct clk_parent_data){
0225                 .fw_name = "xo",
0226             },
0227             .num_parents = 1,
0228             .ops = &clk_alpha_pll_ops,
0229         },
0230     },
0231 };
0232 
0233 static const struct alpha_pll_config mmpll8_config = {
0234     .l = 0x30,
0235     .alpha_hi = 0x70,
0236     .alpha_en_mask = BIT(24),
0237     .config_ctl_val = 0x4001055b,
0238     .vco_val = 0x2 << 20,
0239     .vco_mask = 0x3 << 20,
0240     .main_output_mask = 0x1,
0241 };
0242 
0243 static struct clk_alpha_pll mmpll8 = {
0244     .offset = 0x1c0,
0245     .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
0246     .vco_table = vco,
0247     .num_vco = ARRAY_SIZE(vco),
0248     .clkr = {
0249         .hw.init = &(struct clk_init_data){
0250             .name = "mmpll8",
0251             .parent_data = &(const struct clk_parent_data){
0252                 .fw_name = "xo",
0253             },
0254             .num_parents = 1,
0255             .ops = &clk_alpha_pll_ops,
0256         },
0257     },
0258 };
0259 
0260 static const struct clk_parent_data mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div[] = {
0261     { .fw_name = "xo" },
0262     { .hw = &mmpll0.clkr.hw },
0263     { .hw = &mmpll4.clkr.hw },
0264     { .hw = &mmpll7.clkr.hw },
0265     { .hw = &mmpll8.clkr.hw },
0266     { .fw_name = "gpll0" },
0267     { .fw_name = "gpll0_div" },
0268 };
0269 
0270 static const struct parent_map mmcc_xo_dsibyte_map[] = {
0271     { P_XO, 0 },
0272     { P_DSI0PLL_BYTE, 1 },
0273     { P_DSI1PLL_BYTE, 2 },
0274 };
0275 
0276 static const struct clk_parent_data mmcc_xo_dsibyte[] = {
0277     { .fw_name = "xo" },
0278     { .fw_name = "dsi0pllbyte" },
0279     { .fw_name = "dsi1pllbyte" },
0280 };
0281 
0282 static const struct parent_map mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map[] = {
0283     { P_XO, 0 },
0284     { P_MMPLL0, 1 },
0285     { P_MMPLL4, 2 },
0286     { P_MMPLL7, 3 },
0287     { P_MMPLL10, 4 },
0288     { P_GPLL0, 5 },
0289     { P_GPLL0_DIV, 6 },
0290 };
0291 
0292 static const struct clk_parent_data mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div[] = {
0293     { .fw_name = "xo" },
0294     { .hw = &mmpll0.clkr.hw },
0295     { .hw = &mmpll4.clkr.hw },
0296     { .hw = &mmpll7.clkr.hw },
0297     { .hw = &mmpll10.clkr.hw },
0298     { .fw_name = "gpll0" },
0299     { .fw_name = "gpll0_div" },
0300 };
0301 
0302 static const struct parent_map mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map[] = {
0303     { P_XO, 0 },
0304     { P_MMPLL4, 1 },
0305     { P_MMPLL7, 2 },
0306     { P_MMPLL10, 3 },
0307     { P_SLEEP_CLK, 4 },
0308     { P_GPLL0, 5 },
0309     { P_GPLL0_DIV, 6 },
0310 };
0311 
0312 static const struct clk_parent_data mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div[] = {
0313     { .fw_name = "xo" },
0314     { .hw = &mmpll4.clkr.hw },
0315     { .hw = &mmpll7.clkr.hw },
0316     { .hw = &mmpll10.clkr.hw },
0317     { .fw_name = "sleep_clk" },
0318     { .fw_name = "gpll0" },
0319     { .fw_name = "gpll0_div" },
0320 };
0321 
0322 static const struct parent_map mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map[] = {
0323     { P_XO, 0 },
0324     { P_MMPLL0, 1 },
0325     { P_MMPLL7, 2 },
0326     { P_MMPLL10, 3 },
0327     { P_SLEEP_CLK, 4 },
0328     { P_GPLL0, 5 },
0329     { P_GPLL0_DIV, 6 },
0330 };
0331 
0332 static const struct clk_parent_data mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div[] = {
0333     { .fw_name = "xo" },
0334     { .hw = &mmpll0.clkr.hw },
0335     { .hw = &mmpll7.clkr.hw },
0336     { .hw = &mmpll10.clkr.hw },
0337     { .fw_name = "sleep_clk" },
0338     { .fw_name = "gpll0" },
0339     { .fw_name = "gpll0_div" },
0340 };
0341 
0342 static const struct parent_map mmcc_xo_gpll0_gpll0_div_map[] = {
0343     { P_XO, 0 },
0344     { P_GPLL0, 5 },
0345     { P_GPLL0_DIV, 6 },
0346 };
0347 
0348 static const struct clk_parent_data mmcc_xo_gpll0_gpll0_div[] = {
0349     { .fw_name = "xo" },
0350     { .fw_name = "gpll0" },
0351     { .fw_name = "gpll0_div" },
0352 };
0353 
0354 static const struct parent_map mmcc_xo_dplink_dpvco_map[] = {
0355     { P_XO, 0 },
0356     { P_DP_PHY_PLL_LINK_CLK, 1 },
0357     { P_DP_PHY_PLL_VCO_DIV, 2 },
0358 };
0359 
0360 static const struct clk_parent_data mmcc_xo_dplink_dpvco[] = {
0361     { .fw_name = "xo" },
0362     { .fw_name = "dp_link_2x_clk_divsel_five" },
0363     { .fw_name = "dp_vco_divided_clk_src_mux" },
0364 };
0365 
0366 static const struct parent_map mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div_map[] = {
0367     { P_XO, 0 },
0368     { P_MMPLL0, 1 },
0369     { P_MMPLL5, 2 },
0370     { P_MMPLL7, 3 },
0371     { P_GPLL0, 5 },
0372     { P_GPLL0_DIV, 6 },
0373 };
0374 
0375 static const struct clk_parent_data mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div[] = {
0376     { .fw_name = "xo" },
0377     { .hw = &mmpll0.clkr.hw },
0378     { .hw = &mmpll5.clkr.hw },
0379     { .hw = &mmpll7.clkr.hw },
0380     { .fw_name = "gpll0" },
0381     { .fw_name = "gpll0_div" },
0382 };
0383 
0384 static const struct parent_map mmcc_xo_dsi0pll_dsi1pll_map[] = {
0385     { P_XO, 0 },
0386     { P_DSI0PLL, 1 },
0387     { P_DSI1PLL, 2 },
0388 };
0389 
0390 static const struct clk_parent_data mmcc_xo_dsi0pll_dsi1pll[] = {
0391     { .fw_name = "xo" },
0392     { .fw_name = "dsi0pll" },
0393     { .fw_name = "dsi1pll" },
0394 };
0395 
0396 static const struct parent_map mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0_map[] = {
0397     { P_XO, 0 },
0398     { P_MMPLL0, 1 },
0399     { P_MMPLL4, 2 },
0400     { P_MMPLL7, 3 },
0401     { P_MMPLL10, 4 },
0402     { P_MMPLL6, 5 },
0403     { P_GPLL0, 6 },
0404 };
0405 
0406 static const struct clk_parent_data mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0[] = {
0407     { .fw_name = "xo" },
0408     { .hw = &mmpll0.clkr.hw },
0409     { .hw = &mmpll4.clkr.hw },
0410     { .hw = &mmpll7.clkr.hw },
0411     { .hw = &mmpll10.clkr.hw },
0412     { .hw = &mmpll6.clkr.hw },
0413     { .fw_name = "gpll0" },
0414 };
0415 
0416 static const struct parent_map mmcc_xo_mmpll0_gpll0_gpll0_div_map[] = {
0417     { P_XO, 0 },
0418     { P_MMPLL0, 1 },
0419     { P_GPLL0, 5 },
0420     { P_GPLL0_DIV, 6 },
0421 };
0422 
0423 static const struct clk_parent_data mmcc_xo_mmpll0_gpll0_gpll0_div[] = {
0424     { .fw_name = "xo" },
0425     { .hw = &mmpll0.clkr.hw },
0426     { .fw_name = "gpll0" },
0427     { .fw_name = "gpll0_div" },
0428 };
0429 
0430 static const struct parent_map mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6_map[] = {
0431     { P_XO, 0 },
0432     { P_MMPLL0, 1 },
0433     { P_MMPLL4, 2 },
0434     { P_MMPLL7, 3 },
0435     { P_MMPLL10, 4 },
0436     { P_GPLL0, 5 },
0437     { P_MMPLL6, 6 },
0438 };
0439 
0440 static const struct clk_parent_data mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6[] = {
0441     { .fw_name = "xo" },
0442     { .hw = &mmpll0.clkr.hw },
0443     { .hw = &mmpll4.clkr.hw },
0444     { .hw = &mmpll7.clkr.hw },
0445     { .hw = &mmpll10.clkr.hw },
0446     { .fw_name = "gpll0" },
0447     { .hw = &mmpll6.clkr.hw },
0448 };
0449 
0450 static const struct parent_map mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7_map[] = {
0451     { P_XO, 0 },
0452     { P_MMPLL0, 1 },
0453     { P_MMPLL8, 2 },
0454     { P_MMPLL3, 3 },
0455     { P_MMPLL6, 4 },
0456     { P_GPLL0, 5 },
0457     { P_MMPLL7, 6 },
0458 };
0459 
0460 static const struct clk_parent_data mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7[] = {
0461     { .fw_name = "xo" },
0462     { .hw = &mmpll0.clkr.hw },
0463     { .hw = &mmpll8.clkr.hw },
0464     { .hw = &mmpll3.clkr.hw },
0465     { .hw = &mmpll6.clkr.hw },
0466     { .fw_name = "gpll0" },
0467     { .hw = &mmpll7.clkr.hw },
0468 };
0469 
0470 static const struct freq_tbl ftbl_ahb_clk_src[] = {
0471     F(19200000, P_XO, 1, 0, 0),
0472     F(40000000, P_GPLL0_DIV, 7.5, 0, 0),
0473     F(80800000, P_MMPLL0, 10, 0, 0),
0474     { }
0475 };
0476 
0477 static struct clk_rcg2 ahb_clk_src = {
0478     .cmd_rcgr = 0x5000,
0479     .mnd_width = 0,
0480     .hid_width = 5,
0481     .parent_map = mmcc_xo_mmpll0_gpll0_gpll0_div_map,
0482     .freq_tbl = ftbl_ahb_clk_src,
0483     .clkr.hw.init = &(struct clk_init_data){
0484         .name = "ahb_clk_src",
0485         .parent_data = mmcc_xo_mmpll0_gpll0_gpll0_div,
0486         .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_gpll0_gpll0_div),
0487         .ops = &clk_rcg2_ops,
0488     },
0489 };
0490 
0491 static struct clk_rcg2 byte0_clk_src = {
0492     .cmd_rcgr = 0x2120,
0493     .mnd_width = 0,
0494     .hid_width = 5,
0495     .parent_map = mmcc_xo_dsibyte_map,
0496     .clkr.hw.init = &(struct clk_init_data){
0497         .name = "byte0_clk_src",
0498         .parent_data = mmcc_xo_dsibyte,
0499         .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
0500         .ops = &clk_byte2_ops,
0501         .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0502     },
0503 };
0504 
0505 static struct clk_rcg2 byte1_clk_src = {
0506     .cmd_rcgr = 0x2140,
0507     .mnd_width = 0,
0508     .hid_width = 5,
0509     .parent_map = mmcc_xo_dsibyte_map,
0510     .clkr.hw.init = &(struct clk_init_data){
0511         .name = "byte1_clk_src",
0512         .parent_data = mmcc_xo_dsibyte,
0513         .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
0514         .ops = &clk_byte2_ops,
0515         .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0516     },
0517 };
0518 
0519 static const struct freq_tbl ftbl_camss_gp0_clk_src[] = {
0520     F(10000, P_XO, 16, 1, 120),
0521     F(24000, P_XO, 16, 1, 50),
0522     F(6000000, P_GPLL0_DIV, 10, 1, 5),
0523     F(12000000, P_GPLL0_DIV, 10, 2, 5),
0524     F(13043478, P_GPLL0_DIV, 1, 1, 23),
0525     F(24000000, P_GPLL0_DIV, 1, 2, 25),
0526     F(50000000, P_GPLL0_DIV, 6, 0, 0),
0527     F(100000000, P_GPLL0_DIV, 3, 0, 0),
0528     F(200000000, P_GPLL0, 3, 0, 0),
0529     { }
0530 };
0531 
0532 static struct clk_rcg2 camss_gp0_clk_src = {
0533     .cmd_rcgr = 0x3420,
0534     .mnd_width = 8,
0535     .hid_width = 5,
0536     .parent_map = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
0537     .freq_tbl = ftbl_camss_gp0_clk_src,
0538     .clkr.hw.init = &(struct clk_init_data){
0539         .name = "camss_gp0_clk_src",
0540         .parent_data = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
0541         .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
0542         .ops = &clk_rcg2_ops,
0543     },
0544 };
0545 
0546 static struct clk_rcg2 camss_gp1_clk_src = {
0547     .cmd_rcgr = 0x3450,
0548     .mnd_width = 8,
0549     .hid_width = 5,
0550     .parent_map = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
0551     .freq_tbl = ftbl_camss_gp0_clk_src,
0552     .clkr.hw.init = &(struct clk_init_data){
0553         .name = "camss_gp1_clk_src",
0554         .parent_data = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
0555         .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
0556         .ops = &clk_rcg2_ops,
0557     },
0558 };
0559 
0560 static const struct freq_tbl ftbl_cci_clk_src[] = {
0561     F(37500000, P_GPLL0_DIV, 8, 0, 0),
0562     F(50000000, P_GPLL0_DIV, 6, 0, 0),
0563     F(100000000, P_GPLL0, 6, 0, 0),
0564     { }
0565 };
0566 
0567 static struct clk_rcg2 cci_clk_src = {
0568     .cmd_rcgr = 0x3300,
0569     .mnd_width = 8,
0570     .hid_width = 5,
0571     .parent_map = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
0572     .freq_tbl = ftbl_cci_clk_src,
0573     .clkr.hw.init = &(struct clk_init_data){
0574         .name = "cci_clk_src",
0575         .parent_data = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
0576         .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
0577         .ops = &clk_rcg2_ops,
0578     },
0579 };
0580 
0581 static const struct freq_tbl ftbl_cpp_clk_src[] = {
0582     F(120000000, P_GPLL0, 5, 0, 0),
0583     F(256000000, P_MMPLL4, 3, 0, 0),
0584     F(384000000, P_MMPLL4, 2, 0, 0),
0585     F(480000000, P_MMPLL7, 2, 0, 0),
0586     F(540000000, P_MMPLL6, 2, 0, 0),
0587     F(576000000, P_MMPLL10, 1, 0, 0),
0588     { }
0589 };
0590 
0591 static struct clk_rcg2 cpp_clk_src = {
0592     .cmd_rcgr = 0x3640,
0593     .mnd_width = 0,
0594     .hid_width = 5,
0595     .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6_map,
0596     .freq_tbl = ftbl_cpp_clk_src,
0597     .clkr.hw.init = &(struct clk_init_data){
0598         .name = "cpp_clk_src",
0599         .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6,
0600         .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6),
0601         .ops = &clk_rcg2_ops,
0602     },
0603 };
0604 
0605 static const struct freq_tbl ftbl_csi0_clk_src[] = {
0606     F(100000000, P_GPLL0_DIV, 3, 0, 0),
0607     F(200000000, P_GPLL0, 3, 0, 0),
0608     F(310000000, P_MMPLL8, 3, 0, 0),
0609     F(404000000, P_MMPLL0, 2, 0, 0),
0610     F(465000000, P_MMPLL8, 2, 0, 0),
0611     { }
0612 };
0613 
0614 static struct clk_rcg2 csi0_clk_src = {
0615     .cmd_rcgr = 0x3090,
0616     .mnd_width = 0,
0617     .hid_width = 5,
0618     .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
0619     .freq_tbl = ftbl_csi0_clk_src,
0620     .clkr.hw.init = &(struct clk_init_data){
0621         .name = "csi0_clk_src",
0622         .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
0623         .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
0624         .ops = &clk_rcg2_ops,
0625     },
0626 };
0627 
0628 static const struct freq_tbl ftbl_csi0phytimer_clk_src[] = {
0629     F(100000000, P_GPLL0_DIV, 3, 0, 0),
0630     F(200000000, P_GPLL0, 3, 0, 0),
0631     F(269333333, P_MMPLL0, 3, 0, 0),
0632     { }
0633 };
0634 
0635 static struct clk_rcg2 csi0phytimer_clk_src = {
0636     .cmd_rcgr = 0x3000,
0637     .mnd_width = 0,
0638     .hid_width = 5,
0639     .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
0640     .freq_tbl = ftbl_csi0phytimer_clk_src,
0641     .clkr.hw.init = &(struct clk_init_data){
0642         .name = "csi0phytimer_clk_src",
0643         .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
0644         .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
0645         .ops = &clk_rcg2_ops,
0646     },
0647 };
0648 
0649 static struct clk_rcg2 csi1_clk_src = {
0650     .cmd_rcgr = 0x3100,
0651     .mnd_width = 0,
0652     .hid_width = 5,
0653     .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
0654     .freq_tbl = ftbl_csi0_clk_src,
0655     .clkr.hw.init = &(struct clk_init_data){
0656         .name = "csi1_clk_src",
0657         .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
0658         .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
0659         .ops = &clk_rcg2_ops,
0660     },
0661 };
0662 
0663 static struct clk_rcg2 csi1phytimer_clk_src = {
0664     .cmd_rcgr = 0x3030,
0665     .mnd_width = 0,
0666     .hid_width = 5,
0667     .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
0668     .freq_tbl = ftbl_csi0phytimer_clk_src,
0669     .clkr.hw.init = &(struct clk_init_data){
0670         .name = "csi1phytimer_clk_src",
0671         .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
0672         .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
0673         .ops = &clk_rcg2_ops,
0674     },
0675 };
0676 
0677 static struct clk_rcg2 csi2_clk_src = {
0678     .cmd_rcgr = 0x3160,
0679     .mnd_width = 0,
0680     .hid_width = 5,
0681     .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
0682     .freq_tbl = ftbl_csi0_clk_src,
0683     .clkr.hw.init = &(struct clk_init_data){
0684         .name = "csi2_clk_src",
0685         .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
0686         .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
0687         .ops = &clk_rcg2_ops,
0688     },
0689 };
0690 
0691 static struct clk_rcg2 csi2phytimer_clk_src = {
0692     .cmd_rcgr = 0x3060,
0693     .mnd_width = 0,
0694     .hid_width = 5,
0695     .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
0696     .freq_tbl = ftbl_csi0phytimer_clk_src,
0697     .clkr.hw.init = &(struct clk_init_data){
0698         .name = "csi2phytimer_clk_src",
0699         .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
0700         .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
0701         .ops = &clk_rcg2_ops,
0702     },
0703 };
0704 
0705 static struct clk_rcg2 csi3_clk_src = {
0706     .cmd_rcgr = 0x31c0,
0707     .mnd_width = 0,
0708     .hid_width = 5,
0709     .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
0710     .freq_tbl = ftbl_csi0_clk_src,
0711     .clkr.hw.init = &(struct clk_init_data){
0712         .name = "csi3_clk_src",
0713         .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
0714         .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
0715         .ops = &clk_rcg2_ops,
0716     },
0717 };
0718 
0719 static const struct freq_tbl ftbl_csiphy_clk_src[] = {
0720     F(100000000, P_GPLL0_DIV, 3, 0, 0),
0721     F(200000000, P_GPLL0, 3, 0, 0),
0722     F(269333333, P_MMPLL0, 3, 0, 0),
0723     F(320000000, P_MMPLL7, 3, 0, 0),
0724     { }
0725 };
0726 
0727 static struct clk_rcg2 csiphy_clk_src = {
0728     .cmd_rcgr = 0x3800,
0729     .mnd_width = 0,
0730     .hid_width = 5,
0731     .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
0732     .freq_tbl = ftbl_csiphy_clk_src,
0733     .clkr.hw.init = &(struct clk_init_data){
0734         .name = "csiphy_clk_src",
0735         .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
0736         .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
0737         .ops = &clk_rcg2_ops,
0738     },
0739 };
0740 
0741 static const struct freq_tbl ftbl_dp_aux_clk_src[] = {
0742     F(19200000, P_XO, 1, 0, 0),
0743     { }
0744 };
0745 
0746 static struct clk_rcg2 dp_aux_clk_src = {
0747     .cmd_rcgr = 0x2260,
0748     .mnd_width = 0,
0749     .hid_width = 5,
0750     .parent_map = mmcc_xo_gpll0_gpll0_div_map,
0751     .freq_tbl = ftbl_dp_aux_clk_src,
0752     .clkr.hw.init = &(struct clk_init_data){
0753         .name = "dp_aux_clk_src",
0754         .parent_data = mmcc_xo_gpll0_gpll0_div,
0755         .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_gpll0_div),
0756         .ops = &clk_rcg2_ops,
0757     },
0758 };
0759 
0760 static const struct freq_tbl ftbl_dp_crypto_clk_src[] = {
0761     F(101250000, P_DP_PHY_PLL_VCO_DIV, 4, 0, 0),
0762     F(168750000, P_DP_PHY_PLL_VCO_DIV, 4, 0, 0),
0763     F(337500000, P_DP_PHY_PLL_VCO_DIV, 4, 0, 0),
0764     { }
0765 };
0766 
0767 static struct clk_rcg2 dp_crypto_clk_src = {
0768     .cmd_rcgr = 0x2220,
0769     .mnd_width = 8,
0770     .hid_width = 5,
0771     .parent_map = mmcc_xo_dplink_dpvco_map,
0772     .freq_tbl = ftbl_dp_crypto_clk_src,
0773     .clkr.hw.init = &(struct clk_init_data){
0774         .name = "dp_crypto_clk_src",
0775         .parent_data = mmcc_xo_dplink_dpvco,
0776         .num_parents = ARRAY_SIZE(mmcc_xo_dplink_dpvco),
0777         .ops = &clk_rcg2_ops,
0778     },
0779 };
0780 
0781 static const struct freq_tbl ftbl_dp_gtc_clk_src[] = {
0782     F(40000000, P_GPLL0_DIV, 7.5, 0, 0),
0783     F(60000000, P_GPLL0, 10, 0, 0),
0784     { }
0785 };
0786 
0787 static struct clk_rcg2 dp_gtc_clk_src = {
0788     .cmd_rcgr = 0x2280,
0789     .mnd_width = 0,
0790     .hid_width = 5,
0791     .parent_map = mmcc_xo_gpll0_gpll0_div_map,
0792     .freq_tbl = ftbl_dp_gtc_clk_src,
0793     .clkr.hw.init = &(struct clk_init_data){
0794         .name = "dp_gtc_clk_src",
0795         .parent_data = mmcc_xo_gpll0_gpll0_div,
0796         .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_gpll0_div),
0797         .ops = &clk_rcg2_ops,
0798     },
0799 };
0800 
0801 static const struct freq_tbl ftbl_dp_link_clk_src[] = {
0802     F(162000000, P_DP_PHY_PLL_LINK_CLK, 2, 0, 0),
0803     F(270000000, P_DP_PHY_PLL_LINK_CLK, 2, 0, 0),
0804     F(540000000, P_DP_PHY_PLL_LINK_CLK, 2, 0, 0),
0805     { }
0806 };
0807 
0808 static struct clk_rcg2 dp_link_clk_src = {
0809     .cmd_rcgr = 0x2200,
0810     .mnd_width = 0,
0811     .hid_width = 5,
0812     .parent_map = mmcc_xo_dplink_dpvco_map,
0813     .freq_tbl = ftbl_dp_link_clk_src,
0814     .clkr.hw.init = &(struct clk_init_data){
0815         .name = "dp_link_clk_src",
0816         .parent_data = mmcc_xo_dplink_dpvco,
0817         .num_parents = ARRAY_SIZE(mmcc_xo_dplink_dpvco),
0818         .ops = &clk_rcg2_ops,
0819         .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
0820     },
0821 };
0822 
0823 static struct clk_rcg2 dp_pixel_clk_src = {
0824     .cmd_rcgr = 0x2240,
0825     .mnd_width = 16,
0826     .hid_width = 5,
0827     .parent_map = mmcc_xo_dplink_dpvco_map,
0828     .clkr.hw.init = &(struct clk_init_data){
0829         .name = "dp_pixel_clk_src",
0830         .parent_data = mmcc_xo_dplink_dpvco,
0831         .num_parents = ARRAY_SIZE(mmcc_xo_dplink_dpvco),
0832         .ops = &clk_dp_ops,
0833         .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
0834     },
0835 };
0836 
0837 static struct clk_rcg2 esc0_clk_src = {
0838     .cmd_rcgr = 0x2160,
0839     .mnd_width = 0,
0840     .hid_width = 5,
0841     .parent_map = mmcc_xo_dsibyte_map,
0842     .clkr.hw.init = &(struct clk_init_data){
0843         .name = "esc0_clk_src",
0844         .parent_data = mmcc_xo_dsibyte,
0845         .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
0846         .ops = &clk_rcg2_ops,
0847     },
0848 };
0849 
0850 static struct clk_rcg2 esc1_clk_src = {
0851     .cmd_rcgr = 0x2180,
0852     .mnd_width = 0,
0853     .hid_width = 5,
0854     .parent_map = mmcc_xo_dsibyte_map,
0855     .clkr.hw.init = &(struct clk_init_data){
0856         .name = "esc1_clk_src",
0857         .parent_data = mmcc_xo_dsibyte,
0858         .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
0859         .ops = &clk_rcg2_ops,
0860     },
0861 };
0862 
0863 static const struct freq_tbl ftbl_jpeg0_clk_src[] = {
0864     F(66666667, P_GPLL0_DIV, 4.5, 0, 0),
0865     F(133333333, P_GPLL0, 4.5, 0, 0),
0866     F(219428571, P_MMPLL4, 3.5, 0, 0),
0867     F(320000000, P_MMPLL7, 3, 0, 0),
0868     F(480000000, P_MMPLL7, 2, 0, 0),
0869     { }
0870 };
0871 
0872 static struct clk_rcg2 jpeg0_clk_src = {
0873     .cmd_rcgr = 0x3500,
0874     .mnd_width = 0,
0875     .hid_width = 5,
0876     .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
0877     .freq_tbl = ftbl_jpeg0_clk_src,
0878     .clkr.hw.init = &(struct clk_init_data){
0879         .name = "jpeg0_clk_src",
0880         .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
0881         .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
0882         .ops = &clk_rcg2_ops,
0883     },
0884 };
0885 
0886 static const struct freq_tbl ftbl_mclk0_clk_src[] = {
0887     F(4800000, P_XO, 4, 0, 0),
0888     F(6000000, P_GPLL0_DIV, 10, 1, 5),
0889     F(8000000, P_GPLL0_DIV, 1, 2, 75),
0890     F(9600000, P_XO, 2, 0, 0),
0891     F(16666667, P_GPLL0_DIV, 2, 1, 9),
0892     F(19200000, P_XO, 1, 0, 0),
0893     F(24000000, P_MMPLL10, 1, 1, 24),
0894     F(33333333, P_GPLL0_DIV, 1, 1, 9),
0895     F(48000000, P_GPLL0, 1, 2, 25),
0896     F(66666667, P_GPLL0, 1, 1, 9),
0897     { }
0898 };
0899 
0900 static struct clk_rcg2 mclk0_clk_src = {
0901     .cmd_rcgr = 0x3360,
0902     .mnd_width = 8,
0903     .hid_width = 5,
0904     .parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
0905     .freq_tbl = ftbl_mclk0_clk_src,
0906     .clkr.hw.init = &(struct clk_init_data){
0907         .name = "mclk0_clk_src",
0908         .parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
0909         .num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
0910         .ops = &clk_rcg2_ops,
0911     },
0912 };
0913 
0914 static struct clk_rcg2 mclk1_clk_src = {
0915     .cmd_rcgr = 0x3390,
0916     .mnd_width = 8,
0917     .hid_width = 5,
0918     .parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
0919     .freq_tbl = ftbl_mclk0_clk_src,
0920     .clkr.hw.init = &(struct clk_init_data){
0921         .name = "mclk1_clk_src",
0922         .parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
0923         .num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
0924         .ops = &clk_rcg2_ops,
0925     },
0926 };
0927 
0928 static struct clk_rcg2 mclk2_clk_src = {
0929     .cmd_rcgr = 0x33c0,
0930     .mnd_width = 8,
0931     .hid_width = 5,
0932     .parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
0933     .freq_tbl = ftbl_mclk0_clk_src,
0934     .clkr.hw.init = &(struct clk_init_data){
0935         .name = "mclk2_clk_src",
0936         .parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
0937         .num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
0938         .ops = &clk_rcg2_ops,
0939     },
0940 };
0941 
0942 static struct clk_rcg2 mclk3_clk_src = {
0943     .cmd_rcgr = 0x33f0,
0944     .mnd_width = 8,
0945     .hid_width = 5,
0946     .parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
0947     .freq_tbl = ftbl_mclk0_clk_src,
0948     .clkr.hw.init = &(struct clk_init_data){
0949         .name = "mclk3_clk_src",
0950         .parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
0951         .num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
0952         .ops = &clk_rcg2_ops,
0953     },
0954 };
0955 
0956 static const struct freq_tbl ftbl_mdp_clk_src[] = {
0957     F(100000000, P_GPLL0_DIV, 3, 0, 0),
0958     F(150000000, P_GPLL0_DIV, 2, 0, 0),
0959     F(171428571, P_GPLL0, 3.5, 0, 0),
0960     F(200000000, P_GPLL0, 3, 0, 0),
0961     F(275000000, P_MMPLL5, 3, 0, 0),
0962     F(300000000, P_GPLL0, 2, 0, 0),
0963     F(330000000, P_MMPLL5, 2.5, 0, 0),
0964     F(412500000, P_MMPLL5, 2, 0, 0),
0965     { }
0966 };
0967 
0968 static struct clk_rcg2 mdp_clk_src = {
0969     .cmd_rcgr = 0x2040,
0970     .mnd_width = 0,
0971     .hid_width = 5,
0972     .parent_map = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div_map,
0973     .freq_tbl = ftbl_mdp_clk_src,
0974     .clkr.hw.init = &(struct clk_init_data){
0975         .name = "mdp_clk_src",
0976         .parent_data = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div,
0977         .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div),
0978         .ops = &clk_rcg2_ops,
0979     },
0980 };
0981 
0982 static struct clk_rcg2 pclk0_clk_src = {
0983     .cmd_rcgr = 0x2000,
0984     .mnd_width = 8,
0985     .hid_width = 5,
0986     .parent_map = mmcc_xo_dsi0pll_dsi1pll_map,
0987     .clkr.hw.init = &(struct clk_init_data){
0988         .name = "pclk0_clk_src",
0989         .parent_data = mmcc_xo_dsi0pll_dsi1pll,
0990         .num_parents = ARRAY_SIZE(mmcc_xo_dsi0pll_dsi1pll),
0991         .ops = &clk_pixel_ops,
0992         .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
0993     },
0994 };
0995 
0996 static struct clk_rcg2 pclk1_clk_src = {
0997     .cmd_rcgr = 0x2020,
0998     .mnd_width = 8,
0999     .hid_width = 5,
1000     .parent_map = mmcc_xo_dsi0pll_dsi1pll_map,
1001     .clkr.hw.init = &(struct clk_init_data){
1002         .name = "pclk1_clk_src",
1003         .parent_data = mmcc_xo_dsi0pll_dsi1pll,
1004         .num_parents = ARRAY_SIZE(mmcc_xo_dsi0pll_dsi1pll),
1005         .ops = &clk_pixel_ops,
1006         .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
1007     },
1008 };
1009 
1010 static const struct freq_tbl ftbl_rot_clk_src[] = {
1011     F(171428571, P_GPLL0, 3.5, 0, 0),
1012     F(275000000, P_MMPLL5, 3, 0, 0),
1013     F(300000000, P_GPLL0, 2, 0, 0),
1014     F(330000000, P_MMPLL5, 2.5, 0, 0),
1015     F(412500000, P_MMPLL5, 2, 0, 0),
1016     { }
1017 };
1018 
1019 static struct clk_rcg2 rot_clk_src = {
1020     .cmd_rcgr = 0x21a0,
1021     .mnd_width = 0,
1022     .hid_width = 5,
1023     .parent_map = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div_map,
1024     .freq_tbl = ftbl_rot_clk_src,
1025     .clkr.hw.init = &(struct clk_init_data){
1026         .name = "rot_clk_src",
1027         .parent_data = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div,
1028         .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div),
1029         .ops = &clk_rcg2_ops,
1030     },
1031 };
1032 
1033 static const struct freq_tbl ftbl_vfe0_clk_src[] = {
1034     F(120000000, P_GPLL0, 5, 0, 0),
1035     F(200000000, P_GPLL0, 3, 0, 0),
1036     F(256000000, P_MMPLL4, 3, 0, 0),
1037     F(300000000, P_GPLL0, 2, 0, 0),
1038     F(404000000, P_MMPLL0, 2, 0, 0),
1039     F(480000000, P_MMPLL7, 2, 0, 0),
1040     F(540000000, P_MMPLL6, 2, 0, 0),
1041     F(576000000, P_MMPLL10, 1, 0, 0),
1042     { }
1043 };
1044 
1045 static struct clk_rcg2 vfe0_clk_src = {
1046     .cmd_rcgr = 0x3600,
1047     .mnd_width = 0,
1048     .hid_width = 5,
1049     .parent_map = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0_map,
1050     .freq_tbl = ftbl_vfe0_clk_src,
1051     .clkr.hw.init = &(struct clk_init_data){
1052         .name = "vfe0_clk_src",
1053         .parent_data = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0,
1054         .num_parents = ARRAY_SIZE(mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0),
1055         .ops = &clk_rcg2_ops,
1056     },
1057 };
1058 
1059 static struct clk_rcg2 vfe1_clk_src = {
1060     .cmd_rcgr = 0x3620,
1061     .mnd_width = 0,
1062     .hid_width = 5,
1063     .parent_map = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0_map,
1064     .freq_tbl = ftbl_vfe0_clk_src,
1065     .clkr.hw.init = &(struct clk_init_data){
1066         .name = "vfe1_clk_src",
1067         .parent_data = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0,
1068         .num_parents = ARRAY_SIZE(mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0),
1069         .ops = &clk_rcg2_ops,
1070     },
1071 };
1072 
1073 static const struct freq_tbl ftbl_video_core_clk_src[] = {
1074     F(133333333, P_GPLL0, 4.5, 0, 0),
1075     F(269333333, P_MMPLL0, 3, 0, 0),
1076     F(320000000, P_MMPLL7, 3, 0, 0),
1077     F(404000000, P_MMPLL0, 2, 0, 0),
1078     F(441600000, P_MMPLL3, 2, 0, 0),
1079     F(518400000, P_MMPLL3, 2, 0, 0),
1080     { }
1081 };
1082 
1083 static struct clk_rcg2 video_core_clk_src = {
1084     .cmd_rcgr = 0x1000,
1085     .mnd_width = 0,
1086     .hid_width = 5,
1087     .parent_map = mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7_map,
1088     .freq_tbl = ftbl_video_core_clk_src,
1089     .clkr.hw.init = &(struct clk_init_data){
1090         .name = "video_core_clk_src",
1091         .parent_data = mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7,
1092         .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7),
1093         .ops = &clk_rcg2_ops,
1094         .flags = CLK_IS_CRITICAL,
1095     },
1096 };
1097 
1098 static struct clk_rcg2 vsync_clk_src = {
1099     .cmd_rcgr = 0x2080,
1100     .mnd_width = 0,
1101     .hid_width = 5,
1102     .parent_map = mmcc_xo_gpll0_gpll0_div_map,
1103     .freq_tbl = ftbl_dp_aux_clk_src,
1104     .clkr.hw.init = &(struct clk_init_data){
1105         .name = "vsync_clk_src",
1106         .parent_data = mmcc_xo_gpll0_gpll0_div,
1107         .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_gpll0_div),
1108         .ops = &clk_rcg2_ops,
1109     },
1110 };
1111 
1112 static struct clk_branch bimc_smmu_ahb_clk = {
1113     .halt_reg = 0xe004,
1114     .halt_check = BRANCH_VOTED,
1115     .hwcg_reg = 0xe004,
1116     .hwcg_bit = 1,
1117     .clkr = {
1118         .enable_reg = 0xe004,
1119         .enable_mask = BIT(0),
1120         .hw.init = &(struct clk_init_data){
1121             .name = "bimc_smmu_ahb_clk",
1122             .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1123             .num_parents = 1,
1124             .ops = &clk_branch2_ops,
1125         },
1126     },
1127 };
1128 
1129 static struct clk_branch bimc_smmu_axi_clk = {
1130     .halt_reg = 0xe008,
1131     .halt_check = BRANCH_VOTED,
1132     .hwcg_reg = 0xe008,
1133     .hwcg_bit = 1,
1134     .clkr = {
1135         .enable_reg = 0xe008,
1136         .enable_mask = BIT(0),
1137         .hw.init = &(struct clk_init_data){
1138             .name = "bimc_smmu_axi_clk",
1139             .ops = &clk_branch2_ops,
1140         },
1141     },
1142 };
1143 
1144 static struct clk_branch camss_ahb_clk = {
1145     .halt_reg = 0x348c,
1146     .halt_check = BRANCH_HALT,
1147     .hwcg_reg = 0x348c,
1148     .hwcg_bit = 1,
1149     .clkr = {
1150         .enable_reg = 0x348c,
1151         .enable_mask = BIT(0),
1152         .hw.init = &(struct clk_init_data){
1153             .name = "camss_ahb_clk",
1154             .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1155             .num_parents = 1,
1156             .ops = &clk_branch2_ops,
1157         },
1158     },
1159 };
1160 
1161 static struct clk_branch camss_cci_ahb_clk = {
1162     .halt_reg = 0x3348,
1163     .halt_check = BRANCH_HALT,
1164     .clkr = {
1165         .enable_reg = 0x3348,
1166         .enable_mask = BIT(0),
1167         .hw.init = &(struct clk_init_data){
1168             .name = "camss_cci_ahb_clk",
1169             .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1170             .num_parents = 1,
1171             .flags = CLK_SET_RATE_PARENT,
1172             .ops = &clk_branch2_ops,
1173         },
1174     },
1175 };
1176 
1177 static struct clk_branch camss_cci_clk = {
1178     .halt_reg = 0x3344,
1179     .halt_check = BRANCH_HALT,
1180     .clkr = {
1181         .enable_reg = 0x3344,
1182         .enable_mask = BIT(0),
1183         .hw.init = &(struct clk_init_data){
1184             .name = "camss_cci_clk",
1185             .parent_hws = (const struct clk_hw *[]){ &cci_clk_src.clkr.hw },
1186             .num_parents = 1,
1187             .flags = CLK_SET_RATE_PARENT,
1188             .ops = &clk_branch2_ops,
1189         },
1190     },
1191 };
1192 
1193 static struct clk_branch camss_cpp_ahb_clk = {
1194     .halt_reg = 0x36b4,
1195     .halt_check = BRANCH_HALT,
1196     .clkr = {
1197         .enable_reg = 0x36b4,
1198         .enable_mask = BIT(0),
1199         .hw.init = &(struct clk_init_data){
1200             .name = "camss_cpp_ahb_clk",
1201             .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1202             .num_parents = 1,
1203             .ops = &clk_branch2_ops,
1204         },
1205     },
1206 };
1207 
1208 static struct clk_branch camss_cpp_axi_clk = {
1209     .halt_reg = 0x36c4,
1210     .halt_check = BRANCH_HALT,
1211     .clkr = {
1212         .enable_reg = 0x36c4,
1213         .enable_mask = BIT(0),
1214         .hw.init = &(struct clk_init_data){
1215             .name = "camss_cpp_axi_clk",
1216             .ops = &clk_branch2_ops,
1217         },
1218     },
1219 };
1220 
1221 static struct clk_branch camss_cpp_clk = {
1222     .halt_reg = 0x36b0,
1223     .halt_check = BRANCH_HALT,
1224     .clkr = {
1225         .enable_reg = 0x36b0,
1226         .enable_mask = BIT(0),
1227         .hw.init = &(struct clk_init_data){
1228             .name = "camss_cpp_clk",
1229             .parent_hws = (const struct clk_hw *[]){ &cpp_clk_src.clkr.hw },
1230             .num_parents = 1,
1231             .flags = CLK_SET_RATE_PARENT,
1232             .ops = &clk_branch2_ops,
1233         },
1234     },
1235 };
1236 
1237 static struct clk_branch camss_cpp_vbif_ahb_clk = {
1238     .halt_reg = 0x36c8,
1239     .halt_check = BRANCH_HALT,
1240     .clkr = {
1241         .enable_reg = 0x36c8,
1242         .enable_mask = BIT(0),
1243         .hw.init = &(struct clk_init_data){
1244             .name = "camss_cpp_vbif_ahb_clk",
1245             .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1246             .num_parents = 1,
1247             .ops = &clk_branch2_ops,
1248         },
1249     },
1250 };
1251 
1252 static struct clk_branch camss_csi0_ahb_clk = {
1253     .halt_reg = 0x30bc,
1254     .halt_check = BRANCH_HALT,
1255     .clkr = {
1256         .enable_reg = 0x30bc,
1257         .enable_mask = BIT(0),
1258         .hw.init = &(struct clk_init_data){
1259             .name = "camss_csi0_ahb_clk",
1260             .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1261             .num_parents = 1,
1262             .ops = &clk_branch2_ops,
1263         },
1264     },
1265 };
1266 
1267 static struct clk_branch camss_csi0_clk = {
1268     .halt_reg = 0x30b4,
1269     .halt_check = BRANCH_HALT,
1270     .clkr = {
1271         .enable_reg = 0x30b4,
1272         .enable_mask = BIT(0),
1273         .hw.init = &(struct clk_init_data){
1274             .name = "camss_csi0_clk",
1275             .parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
1276             .num_parents = 1,
1277             .flags = CLK_SET_RATE_PARENT,
1278             .ops = &clk_branch2_ops,
1279         },
1280     },
1281 };
1282 
1283 static struct clk_branch camss_csi0phytimer_clk = {
1284     .halt_reg = 0x3024,
1285     .halt_check = BRANCH_HALT,
1286     .clkr = {
1287         .enable_reg = 0x3024,
1288         .enable_mask = BIT(0),
1289         .hw.init = &(struct clk_init_data){
1290             .name = "camss_csi0phytimer_clk",
1291             .parent_hws = (const struct clk_hw *[]){ &csi0phytimer_clk_src.clkr.hw },
1292             .num_parents = 1,
1293             .flags = CLK_SET_RATE_PARENT,
1294             .ops = &clk_branch2_ops,
1295         },
1296     },
1297 };
1298 
1299 static struct clk_branch camss_csi0pix_clk = {
1300     .halt_reg = 0x30e4,
1301     .halt_check = BRANCH_HALT,
1302     .clkr = {
1303         .enable_reg = 0x30e4,
1304         .enable_mask = BIT(0),
1305         .hw.init = &(struct clk_init_data){
1306             .name = "camss_csi0pix_clk",
1307             .parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
1308             .num_parents = 1,
1309             .ops = &clk_branch2_ops,
1310         },
1311     },
1312 };
1313 
1314 static struct clk_branch camss_csi0rdi_clk = {
1315     .halt_reg = 0x30d4,
1316     .halt_check = BRANCH_HALT,
1317     .clkr = {
1318         .enable_reg = 0x30d4,
1319         .enable_mask = BIT(0),
1320         .hw.init = &(struct clk_init_data){
1321             .name = "camss_csi0rdi_clk",
1322             .parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
1323             .num_parents = 1,
1324             .ops = &clk_branch2_ops,
1325         },
1326     },
1327 };
1328 
1329 static struct clk_branch camss_csi1_ahb_clk = {
1330     .halt_reg = 0x3128,
1331     .halt_check = BRANCH_HALT,
1332     .clkr = {
1333         .enable_reg = 0x3128,
1334         .enable_mask = BIT(0),
1335         .hw.init = &(struct clk_init_data){
1336             .name = "camss_csi1_ahb_clk",
1337             .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1338             .num_parents = 1,
1339             .ops = &clk_branch2_ops,
1340         },
1341     },
1342 };
1343 
1344 static struct clk_branch camss_csi1_clk = {
1345     .halt_reg = 0x3124,
1346     .halt_check = BRANCH_HALT,
1347     .clkr = {
1348         .enable_reg = 0x3124,
1349         .enable_mask = BIT(0),
1350         .hw.init = &(struct clk_init_data){
1351             .name = "camss_csi1_clk",
1352             .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1353             .num_parents = 1,
1354             .flags = CLK_SET_RATE_PARENT,
1355             .ops = &clk_branch2_ops,
1356         },
1357     },
1358 };
1359 
1360 static struct clk_branch camss_csi1phytimer_clk = {
1361     .halt_reg = 0x3054,
1362     .halt_check = BRANCH_HALT,
1363     .clkr = {
1364         .enable_reg = 0x3054,
1365         .enable_mask = BIT(0),
1366         .hw.init = &(struct clk_init_data){
1367             .name = "camss_csi1phytimer_clk",
1368             .parent_hws = (const struct clk_hw *[]){ &csi1phytimer_clk_src.clkr.hw },
1369             .num_parents = 1,
1370             .flags = CLK_SET_RATE_PARENT,
1371             .ops = &clk_branch2_ops,
1372         },
1373     },
1374 };
1375 
1376 static struct clk_branch camss_csi1pix_clk = {
1377     .halt_reg = 0x3154,
1378     .halt_check = BRANCH_HALT,
1379     .clkr = {
1380         .enable_reg = 0x3154,
1381         .enable_mask = BIT(0),
1382         .hw.init = &(struct clk_init_data){
1383             .name = "camss_csi1pix_clk",
1384             .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1385             .num_parents = 1,
1386             .ops = &clk_branch2_ops,
1387         },
1388     },
1389 };
1390 
1391 static struct clk_branch camss_csi1rdi_clk = {
1392     .halt_reg = 0x3144,
1393     .halt_check = BRANCH_HALT,
1394     .clkr = {
1395         .enable_reg = 0x3144,
1396         .enable_mask = BIT(0),
1397         .hw.init = &(struct clk_init_data){
1398             .name = "camss_csi1rdi_clk",
1399             .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1400             .num_parents = 1,
1401             .ops = &clk_branch2_ops,
1402         },
1403     },
1404 };
1405 
1406 static struct clk_branch camss_csi2_ahb_clk = {
1407     .halt_reg = 0x3188,
1408     .halt_check = BRANCH_HALT,
1409     .clkr = {
1410         .enable_reg = 0x3188,
1411         .enable_mask = BIT(0),
1412         .hw.init = &(struct clk_init_data){
1413             .name = "camss_csi2_ahb_clk",
1414             .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1415             .num_parents = 1,
1416             .ops = &clk_branch2_ops,
1417         },
1418     },
1419 };
1420 
1421 static struct clk_branch camss_csi2_clk = {
1422     .halt_reg = 0x3184,
1423     .halt_check = BRANCH_HALT,
1424     .clkr = {
1425         .enable_reg = 0x3184,
1426         .enable_mask = BIT(0),
1427         .hw.init = &(struct clk_init_data){
1428             .name = "camss_csi2_clk",
1429             .parent_hws = (const struct clk_hw *[]){ &csi2_clk_src.clkr.hw },
1430             .num_parents = 1,
1431             .flags = CLK_SET_RATE_PARENT,
1432             .ops = &clk_branch2_ops,
1433         },
1434     },
1435 };
1436 
1437 static struct clk_branch camss_csi2phytimer_clk = {
1438     .halt_reg = 0x3084,
1439     .halt_check = BRANCH_HALT,
1440     .clkr = {
1441         .enable_reg = 0x3084,
1442         .enable_mask = BIT(0),
1443         .hw.init = &(struct clk_init_data){
1444             .name = "camss_csi2phytimer_clk",
1445             .parent_hws = (const struct clk_hw *[]){ &csi2phytimer_clk_src.clkr.hw },
1446             .num_parents = 1,
1447             .flags = CLK_SET_RATE_PARENT,
1448             .ops = &clk_branch2_ops,
1449         },
1450     },
1451 };
1452 
1453 static struct clk_branch camss_csi2pix_clk = {
1454     .halt_reg = 0x31b4,
1455     .halt_check = BRANCH_HALT,
1456     .clkr = {
1457         .enable_reg = 0x31b4,
1458         .enable_mask = BIT(0),
1459         .hw.init = &(struct clk_init_data){
1460             .name = "camss_csi2pix_clk",
1461             .parent_hws = (const struct clk_hw *[]){ &csi2_clk_src.clkr.hw },
1462             .num_parents = 1,
1463             .ops = &clk_branch2_ops,
1464         },
1465     },
1466 };
1467 
1468 static struct clk_branch camss_csi2rdi_clk = {
1469     .halt_reg = 0x31a4,
1470     .halt_check = BRANCH_HALT,
1471     .clkr = {
1472         .enable_reg = 0x31a4,
1473         .enable_mask = BIT(0),
1474         .hw.init = &(struct clk_init_data){
1475             .name = "camss_csi2rdi_clk",
1476             .parent_hws = (const struct clk_hw *[]){ &csi2_clk_src.clkr.hw },
1477             .num_parents = 1,
1478             .ops = &clk_branch2_ops,
1479         },
1480     },
1481 };
1482 
1483 static struct clk_branch camss_csi3_ahb_clk = {
1484     .halt_reg = 0x31e8,
1485     .halt_check = BRANCH_HALT,
1486     .clkr = {
1487         .enable_reg = 0x31e8,
1488         .enable_mask = BIT(0),
1489         .hw.init = &(struct clk_init_data){
1490             .name = "camss_csi3_ahb_clk",
1491             .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1492             .num_parents = 1,
1493             .ops = &clk_branch2_ops,
1494         },
1495     },
1496 };
1497 
1498 static struct clk_branch camss_csi3_clk = {
1499     .halt_reg = 0x31e4,
1500     .halt_check = BRANCH_HALT,
1501     .clkr = {
1502         .enable_reg = 0x31e4,
1503         .enable_mask = BIT(0),
1504         .hw.init = &(struct clk_init_data){
1505             .name = "camss_csi3_clk",
1506             .parent_hws = (const struct clk_hw *[]){ &csi3_clk_src.clkr.hw },
1507             .num_parents = 1,
1508             .flags = CLK_SET_RATE_PARENT,
1509             .ops = &clk_branch2_ops,
1510         },
1511     },
1512 };
1513 
1514 static struct clk_branch camss_csi3pix_clk = {
1515     .halt_reg = 0x3214,
1516     .halt_check = BRANCH_HALT,
1517     .clkr = {
1518         .enable_reg = 0x3214,
1519         .enable_mask = BIT(0),
1520         .hw.init = &(struct clk_init_data){
1521             .name = "camss_csi3pix_clk",
1522             .parent_hws = (const struct clk_hw *[]){ &csi3_clk_src.clkr.hw },
1523             .num_parents = 1,
1524             .ops = &clk_branch2_ops,
1525         },
1526     },
1527 };
1528 
1529 static struct clk_branch camss_csi3rdi_clk = {
1530     .halt_reg = 0x3204,
1531     .halt_check = BRANCH_HALT,
1532     .clkr = {
1533         .enable_reg = 0x3204,
1534         .enable_mask = BIT(0),
1535         .hw.init = &(struct clk_init_data){
1536             .name = "camss_csi3rdi_clk",
1537             .parent_hws = (const struct clk_hw *[]){ &csi3_clk_src.clkr.hw },
1538             .num_parents = 1,
1539             .ops = &clk_branch2_ops,
1540         },
1541     },
1542 };
1543 
1544 static struct clk_branch camss_csi_vfe0_clk = {
1545     .halt_reg = 0x3704,
1546     .halt_check = BRANCH_HALT,
1547     .clkr = {
1548         .enable_reg = 0x3704,
1549         .enable_mask = BIT(0),
1550         .hw.init = &(struct clk_init_data){
1551             .name = "camss_csi_vfe0_clk",
1552             .parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },
1553             .num_parents = 1,
1554             .ops = &clk_branch2_ops,
1555         },
1556     },
1557 };
1558 
1559 static struct clk_branch camss_csi_vfe1_clk = {
1560     .halt_reg = 0x3714,
1561     .halt_check = BRANCH_HALT,
1562     .clkr = {
1563         .enable_reg = 0x3714,
1564         .enable_mask = BIT(0),
1565         .hw.init = &(struct clk_init_data){
1566             .name = "camss_csi_vfe1_clk",
1567             .parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },
1568             .num_parents = 1,
1569             .ops = &clk_branch2_ops,
1570         },
1571     },
1572 };
1573 
1574 static struct clk_branch camss_csiphy0_clk = {
1575     .halt_reg = 0x3740,
1576     .halt_check = BRANCH_HALT,
1577     .clkr = {
1578         .enable_reg = 0x3740,
1579         .enable_mask = BIT(0),
1580         .hw.init = &(struct clk_init_data){
1581             .name = "camss_csiphy0_clk",
1582             .parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },
1583             .num_parents = 1,
1584             .flags = CLK_SET_RATE_PARENT,
1585             .ops = &clk_branch2_ops,
1586         },
1587     },
1588 };
1589 
1590 static struct clk_branch camss_csiphy1_clk = {
1591     .halt_reg = 0x3744,
1592     .halt_check = BRANCH_HALT,
1593     .clkr = {
1594         .enable_reg = 0x3744,
1595         .enable_mask = BIT(0),
1596         .hw.init = &(struct clk_init_data){
1597             .name = "camss_csiphy1_clk",
1598             .parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },
1599             .num_parents = 1,
1600             .flags = CLK_SET_RATE_PARENT,
1601             .ops = &clk_branch2_ops,
1602         },
1603     },
1604 };
1605 
1606 static struct clk_branch camss_csiphy2_clk = {
1607     .halt_reg = 0x3748,
1608     .halt_check = BRANCH_HALT,
1609     .clkr = {
1610         .enable_reg = 0x3748,
1611         .enable_mask = BIT(0),
1612         .hw.init = &(struct clk_init_data){
1613             .name = "camss_csiphy2_clk",
1614             .parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },
1615             .num_parents = 1,
1616             .flags = CLK_SET_RATE_PARENT,
1617             .ops = &clk_branch2_ops,
1618         },
1619     },
1620 };
1621 
1622 
1623 static struct clk_branch camss_cphy_csid0_clk = {
1624     .halt_reg = 0x3730,
1625     .halt_check = BRANCH_HALT,
1626     .clkr = {
1627         .enable_reg = 0x3730,
1628         .enable_mask = BIT(0),
1629         .hw.init = &(struct clk_init_data){
1630             .name = "camss_cphy_csid0_clk",
1631             .parent_hws = (const struct clk_hw *[]){ &camss_csiphy0_clk.clkr.hw },
1632             .num_parents = 1,
1633             .flags = CLK_SET_RATE_PARENT,
1634             .ops = &clk_branch2_ops,
1635         },
1636     },
1637 };
1638 
1639 static struct clk_branch camss_cphy_csid1_clk = {
1640     .halt_reg = 0x3734,
1641     .halt_check = BRANCH_HALT,
1642     .clkr = {
1643         .enable_reg = 0x3734,
1644         .enable_mask = BIT(0),
1645         .hw.init = &(struct clk_init_data){
1646             .name = "camss_cphy_csid1_clk",
1647             .parent_hws = (const struct clk_hw *[]){ &camss_csiphy1_clk.clkr.hw },
1648             .num_parents = 1,
1649             .flags = CLK_SET_RATE_PARENT,
1650             .ops = &clk_branch2_ops,
1651         },
1652     },
1653 };
1654 
1655 static struct clk_branch camss_cphy_csid2_clk = {
1656     .halt_reg = 0x3738,
1657     .halt_check = BRANCH_HALT,
1658     .clkr = {
1659         .enable_reg = 0x3738,
1660         .enable_mask = BIT(0),
1661         .hw.init = &(struct clk_init_data){
1662             .name = "camss_cphy_csid2_clk",
1663             .parent_hws = (const struct clk_hw *[]){ &camss_csiphy2_clk.clkr.hw },
1664             .num_parents = 1,
1665             .flags = CLK_SET_RATE_PARENT,
1666             .ops = &clk_branch2_ops,
1667         },
1668     },
1669 };
1670 
1671 static struct clk_branch camss_cphy_csid3_clk = {
1672     .halt_reg = 0x373c,
1673     .halt_check = BRANCH_HALT,
1674     .clkr = {
1675         .enable_reg = 0x373c,
1676         .enable_mask = BIT(0),
1677         .hw.init = &(struct clk_init_data){
1678             .name = "camss_cphy_csid3_clk",
1679             .parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },
1680             .num_parents = 1,
1681             .flags = CLK_SET_RATE_PARENT,
1682             .ops = &clk_branch2_ops,
1683         },
1684     },
1685 };
1686 
1687 static struct clk_branch camss_gp0_clk = {
1688     .halt_reg = 0x3444,
1689     .halt_check = BRANCH_HALT,
1690     .clkr = {
1691         .enable_reg = 0x3444,
1692         .enable_mask = BIT(0),
1693         .hw.init = &(struct clk_init_data){
1694             .name = "camss_gp0_clk",
1695             .parent_hws = (const struct clk_hw *[]){ &camss_gp0_clk_src.clkr.hw },
1696             .num_parents = 1,
1697             .flags = CLK_SET_RATE_PARENT,
1698             .ops = &clk_branch2_ops,
1699         },
1700     },
1701 };
1702 
1703 static struct clk_branch camss_gp1_clk = {
1704     .halt_reg = 0x3474,
1705     .halt_check = BRANCH_HALT,
1706     .clkr = {
1707         .enable_reg = 0x3474,
1708         .enable_mask = BIT(0),
1709         .hw.init = &(struct clk_init_data){
1710             .name = "camss_gp1_clk",
1711             .parent_hws = (const struct clk_hw *[]){ &camss_gp1_clk_src.clkr.hw },
1712             .num_parents = 1,
1713             .flags = CLK_SET_RATE_PARENT,
1714             .ops = &clk_branch2_ops,
1715         },
1716     },
1717 };
1718 
1719 static struct clk_branch camss_ispif_ahb_clk = {
1720     .halt_reg = 0x3224,
1721     .halt_check = BRANCH_HALT,
1722     .clkr = {
1723         .enable_reg = 0x3224,
1724         .enable_mask = BIT(0),
1725         .hw.init = &(struct clk_init_data){
1726             .name = "camss_ispif_ahb_clk",
1727             .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1728             .num_parents = 1,
1729             .ops = &clk_branch2_ops,
1730         },
1731     },
1732 };
1733 
1734 static struct clk_branch camss_jpeg0_clk = {
1735     .halt_reg = 0x35a8,
1736     .halt_check = BRANCH_HALT,
1737     .clkr = {
1738         .enable_reg = 0x35a8,
1739         .enable_mask = BIT(0),
1740         .hw.init = &(struct clk_init_data){
1741             .name = "camss_jpeg0_clk",
1742             .parent_hws = (const struct clk_hw *[]){ &jpeg0_clk_src.clkr.hw },
1743             .num_parents = 1,
1744             .flags = CLK_SET_RATE_PARENT,
1745             .ops = &clk_branch2_ops,
1746         },
1747     },
1748 };
1749 
1750 static struct clk_branch camss_jpeg_ahb_clk = {
1751     .halt_reg = 0x35b4,
1752     .halt_check = BRANCH_HALT,
1753     .clkr = {
1754         .enable_reg = 0x35b4,
1755         .enable_mask = BIT(0),
1756         .hw.init = &(struct clk_init_data){
1757             .name = "camss_jpeg_ahb_clk",
1758             .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1759             .num_parents = 1,
1760             .ops = &clk_branch2_ops,
1761         },
1762     },
1763 };
1764 
1765 static struct clk_branch camss_jpeg_axi_clk = {
1766     .halt_reg = 0x35b8,
1767     .halt_check = BRANCH_HALT,
1768     .clkr = {
1769         .enable_reg = 0x35b8,
1770         .enable_mask = BIT(0),
1771         .hw.init = &(struct clk_init_data){
1772             .name = "camss_jpeg_axi_clk",
1773             .ops = &clk_branch2_ops,
1774         },
1775     },
1776 };
1777 
1778 static struct clk_branch throttle_camss_axi_clk = {
1779     .halt_reg = 0x3c3c,
1780     .halt_check = BRANCH_HALT,
1781     .clkr = {
1782         .enable_reg = 0x3c3c,
1783         .enable_mask = BIT(0),
1784         .hw.init = &(struct clk_init_data){
1785             .name = "throttle_camss_axi_clk",
1786             .ops = &clk_branch2_ops,
1787         },
1788     },
1789 };
1790 
1791 static struct clk_branch camss_mclk0_clk = {
1792     .halt_reg = 0x3384,
1793     .halt_check = BRANCH_HALT,
1794     .clkr = {
1795         .enable_reg = 0x3384,
1796         .enable_mask = BIT(0),
1797         .hw.init = &(struct clk_init_data){
1798             .name = "camss_mclk0_clk",
1799             .parent_hws = (const struct clk_hw *[]){ &mclk0_clk_src.clkr.hw },
1800             .num_parents = 1,
1801             .flags = CLK_SET_RATE_PARENT,
1802             .ops = &clk_branch2_ops,
1803         },
1804     },
1805 };
1806 
1807 static struct clk_branch camss_mclk1_clk = {
1808     .halt_reg = 0x33b4,
1809     .halt_check = BRANCH_HALT,
1810     .clkr = {
1811         .enable_reg = 0x33b4,
1812         .enable_mask = BIT(0),
1813         .hw.init = &(struct clk_init_data){
1814             .name = "camss_mclk1_clk",
1815             .parent_hws = (const struct clk_hw *[]){ &mclk1_clk_src.clkr.hw },
1816             .num_parents = 1,
1817             .flags = CLK_SET_RATE_PARENT,
1818             .ops = &clk_branch2_ops,
1819         },
1820     },
1821 };
1822 
1823 static struct clk_branch camss_mclk2_clk = {
1824     .halt_reg = 0x33e4,
1825     .halt_check = BRANCH_HALT,
1826     .clkr = {
1827         .enable_reg = 0x33e4,
1828         .enable_mask = BIT(0),
1829         .hw.init = &(struct clk_init_data){
1830             .name = "camss_mclk2_clk",
1831             .parent_hws = (const struct clk_hw *[]){ &mclk2_clk_src.clkr.hw },
1832             .num_parents = 1,
1833             .flags = CLK_SET_RATE_PARENT,
1834             .ops = &clk_branch2_ops,
1835         },
1836     },
1837 };
1838 
1839 static struct clk_branch camss_mclk3_clk = {
1840     .halt_reg = 0x3414,
1841     .halt_check = BRANCH_HALT,
1842     .clkr = {
1843         .enable_reg = 0x3414,
1844         .enable_mask = BIT(0),
1845         .hw.init = &(struct clk_init_data){
1846             .name = "camss_mclk3_clk",
1847             .parent_hws = (const struct clk_hw *[]){ &mclk3_clk_src.clkr.hw },
1848             .num_parents = 1,
1849             .flags = CLK_SET_RATE_PARENT,
1850             .ops = &clk_branch2_ops,
1851         },
1852     },
1853 };
1854 
1855 static struct clk_branch camss_micro_ahb_clk = {
1856     .halt_reg = 0x3494,
1857     .halt_check = BRANCH_HALT,
1858     .clkr = {
1859         .enable_reg = 0x3494,
1860         .enable_mask = BIT(0),
1861         .hw.init = &(struct clk_init_data){
1862             .name = "camss_micro_ahb_clk",
1863             .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1864             .num_parents = 1,
1865             .ops = &clk_branch2_ops,
1866         },
1867     },
1868 };
1869 
1870 static struct clk_branch camss_top_ahb_clk = {
1871     .halt_reg = 0x3484,
1872     .halt_check = BRANCH_HALT,
1873     .clkr = {
1874         .enable_reg = 0x3484,
1875         .enable_mask = BIT(0),
1876         .hw.init = &(struct clk_init_data){
1877             .name = "camss_top_ahb_clk",
1878             .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1879             .num_parents = 1,
1880             .ops = &clk_branch2_ops,
1881         },
1882     },
1883 };
1884 
1885 static struct clk_branch camss_vfe0_ahb_clk = {
1886     .halt_reg = 0x3668,
1887     .halt_check = BRANCH_HALT,
1888     .clkr = {
1889         .enable_reg = 0x3668,
1890         .enable_mask = BIT(0),
1891         .hw.init = &(struct clk_init_data){
1892             .name = "camss_vfe0_ahb_clk",
1893             .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1894             .num_parents = 1,
1895             .ops = &clk_branch2_ops,
1896         },
1897     },
1898 };
1899 
1900 static struct clk_branch camss_vfe0_clk = {
1901     .halt_reg = 0x36a8,
1902     .halt_check = BRANCH_HALT,
1903     .clkr = {
1904         .enable_reg = 0x36a8,
1905         .enable_mask = BIT(0),
1906         .hw.init = &(struct clk_init_data){
1907             .name = "camss_vfe0_clk",
1908             .parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },
1909             .num_parents = 1,
1910             .flags = CLK_SET_RATE_PARENT,
1911             .ops = &clk_branch2_ops,
1912         },
1913     },
1914 };
1915 
1916 static struct clk_branch camss_vfe0_stream_clk = {
1917     .halt_reg = 0x3720,
1918     .halt_check = BRANCH_HALT,
1919     .clkr = {
1920         .enable_reg = 0x3720,
1921         .enable_mask = BIT(0),
1922         .hw.init = &(struct clk_init_data){
1923             .name = "camss_vfe0_stream_clk",
1924             .parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },
1925             .num_parents = 1,
1926             .ops = &clk_branch2_ops,
1927         },
1928     },
1929 };
1930 
1931 static struct clk_branch camss_vfe1_ahb_clk = {
1932     .halt_reg = 0x3678,
1933     .halt_check = BRANCH_HALT,
1934     .clkr = {
1935         .enable_reg = 0x3678,
1936         .enable_mask = BIT(0),
1937         .hw.init = &(struct clk_init_data){
1938             .name = "camss_vfe1_ahb_clk",
1939             .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1940             .num_parents = 1,
1941             .ops = &clk_branch2_ops,
1942         },
1943     },
1944 };
1945 
1946 static struct clk_branch camss_vfe1_clk = {
1947     .halt_reg = 0x36ac,
1948     .halt_check = BRANCH_HALT,
1949     .clkr = {
1950         .enable_reg = 0x36ac,
1951         .enable_mask = BIT(0),
1952         .hw.init = &(struct clk_init_data){
1953             .name = "camss_vfe1_clk",
1954             .parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },
1955             .num_parents = 1,
1956             .flags = CLK_SET_RATE_PARENT,
1957             .ops = &clk_branch2_ops,
1958         },
1959     },
1960 };
1961 
1962 static struct clk_branch camss_vfe1_stream_clk = {
1963     .halt_reg = 0x3724,
1964     .halt_check = BRANCH_HALT,
1965     .clkr = {
1966         .enable_reg = 0x3724,
1967         .enable_mask = BIT(0),
1968         .hw.init = &(struct clk_init_data){
1969             .name = "camss_vfe1_stream_clk",
1970             .parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },
1971             .num_parents = 1,
1972             .ops = &clk_branch2_ops,
1973         },
1974     },
1975 };
1976 
1977 static struct clk_branch camss_vfe_vbif_ahb_clk = {
1978     .halt_reg = 0x36b8,
1979     .halt_check = BRANCH_HALT,
1980     .clkr = {
1981         .enable_reg = 0x36b8,
1982         .enable_mask = BIT(0),
1983         .hw.init = &(struct clk_init_data){
1984             .name = "camss_vfe_vbif_ahb_clk",
1985             .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1986             .num_parents = 1,
1987             .ops = &clk_branch2_ops,
1988         },
1989     },
1990 };
1991 
1992 static struct clk_branch camss_vfe_vbif_axi_clk = {
1993     .halt_reg = 0x36bc,
1994     .halt_check = BRANCH_HALT,
1995     .clkr = {
1996         .enable_reg = 0x36bc,
1997         .enable_mask = BIT(0),
1998         .hw.init = &(struct clk_init_data){
1999             .name = "camss_vfe_vbif_axi_clk",
2000             .ops = &clk_branch2_ops,
2001         },
2002     },
2003 };
2004 
2005 static struct clk_branch csiphy_ahb2crif_clk = {
2006     .halt_reg = 0x374c,
2007     .halt_check = BRANCH_HALT,
2008     .hwcg_reg = 0x374c,
2009     .hwcg_bit = 1,
2010     .clkr = {
2011         .enable_reg = 0x374c,
2012         .enable_mask = BIT(0),
2013         .hw.init = &(struct clk_init_data){
2014             .name = "csiphy_ahb2crif_clk",
2015             .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2016             .num_parents = 1,
2017             .ops = &clk_branch2_ops,
2018         },
2019     },
2020 };
2021 
2022 static struct clk_branch mdss_ahb_clk = {
2023     .halt_reg = 0x2308,
2024     .halt_check = BRANCH_HALT,
2025     .hwcg_reg = 0x8a004,
2026     .hwcg_bit = 1,
2027     .clkr = {
2028         .enable_reg = 0x2308,
2029         .enable_mask = BIT(0),
2030         .hw.init = &(struct clk_init_data){
2031             .name = "mdss_ahb_clk",
2032             .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2033             .flags = CLK_SET_RATE_PARENT,
2034             .num_parents = 1,
2035             .ops = &clk_branch2_ops,
2036         },
2037     },
2038 };
2039 
2040 static const struct freq_tbl ftbl_axi_clk_src[] = {
2041         F(75000000, P_GPLL0, 8, 0, 0),
2042         F(171428571, P_GPLL0, 3.5, 0, 0),
2043         F(240000000, P_GPLL0, 2.5, 0, 0),
2044         F(323200000, P_MMPLL0, 2.5, 0, 0),
2045         F(406000000, P_MMPLL0, 2, 0, 0),
2046         { }
2047 };
2048 
2049 /* RO to linux */
2050 static struct clk_rcg2 axi_clk_src = {
2051     .cmd_rcgr = 0xd000,
2052     .hid_width = 5,
2053     .parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
2054     .freq_tbl = ftbl_axi_clk_src,
2055     .clkr.hw.init = &(struct clk_init_data){
2056         .name = "axi_clk_src",
2057         .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
2058         .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
2059         .ops = &clk_rcg2_ops,
2060     },
2061 };
2062 
2063 static struct clk_branch mdss_axi_clk = {
2064     .halt_reg = 0x2310,
2065     .halt_check = BRANCH_HALT,
2066     .clkr = {
2067         .enable_reg = 0x2310,
2068         .enable_mask = BIT(0),
2069         .hw.init = &(struct clk_init_data){
2070             .name = "mdss_axi_clk",
2071             .parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
2072             .ops = &clk_branch2_ops,
2073         },
2074     },
2075 };
2076 
2077 static struct clk_branch throttle_mdss_axi_clk = {
2078     .halt_reg = 0x246c,
2079     .halt_check = BRANCH_HALT,
2080     .hwcg_reg = 0x246c,
2081     .hwcg_bit = 1,
2082     .clkr = {
2083         .enable_reg = 0x246c,
2084         .enable_mask = BIT(0),
2085         .hw.init = &(struct clk_init_data){
2086             .name = "throttle_mdss_axi_clk",
2087             .ops = &clk_branch2_ops,
2088         },
2089     },
2090 };
2091 
2092 static struct clk_branch mdss_byte0_clk = {
2093     .halt_reg = 0x233c,
2094     .halt_check = BRANCH_HALT,
2095     .clkr = {
2096         .enable_reg = 0x233c,
2097         .enable_mask = BIT(0),
2098         .hw.init = &(struct clk_init_data){
2099             .name = "mdss_byte0_clk",
2100             .parent_hws = (const struct clk_hw *[]){ &byte0_clk_src.clkr.hw },
2101             .num_parents = 1,
2102             .flags = CLK_SET_RATE_PARENT,
2103             .ops = &clk_branch2_ops,
2104         },
2105     },
2106 };
2107 
2108 static struct clk_regmap_div mdss_byte0_intf_div_clk = {
2109     .reg = 0x237c,
2110     .shift = 0,
2111     .width = 2,
2112     /*
2113      * NOTE: Op does not work for div-3. Current assumption is that div-3
2114      * is not a recommended setting for this divider.
2115      */
2116     .clkr = {
2117         .hw.init = &(struct clk_init_data){
2118             .name = "mdss_byte0_intf_div_clk",
2119             .parent_hws = (const struct clk_hw *[]){ &byte0_clk_src.clkr.hw },
2120             .num_parents = 1,
2121             .ops = &clk_regmap_div_ops,
2122             .flags = CLK_GET_RATE_NOCACHE,
2123         },
2124     },
2125 };
2126 
2127 static struct clk_branch mdss_byte0_intf_clk = {
2128     .halt_reg = 0x2374,
2129     .halt_check = BRANCH_HALT,
2130     .clkr = {
2131         .enable_reg = 0x2374,
2132         .enable_mask = BIT(0),
2133         .hw.init = &(struct clk_init_data){
2134             .name = "mdss_byte0_intf_clk",
2135             .parent_hws = (const struct clk_hw *[]){ &mdss_byte0_intf_div_clk.clkr.hw },
2136             .num_parents = 1,
2137             .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
2138             .ops = &clk_branch2_ops,
2139         },
2140     },
2141 };
2142 
2143 static struct clk_branch mdss_byte1_clk = {
2144     .halt_reg = 0x2340,
2145     .halt_check = BRANCH_HALT,
2146     .clkr = {
2147         .enable_reg = 0x2340,
2148         .enable_mask = BIT(0),
2149         .hw.init = &(struct clk_init_data){
2150             .name = "mdss_byte1_clk",
2151             .parent_hws = (const struct clk_hw *[]){ &byte1_clk_src.clkr.hw },
2152             .num_parents = 1,
2153             .flags = CLK_SET_RATE_PARENT,
2154             .ops = &clk_branch2_ops,
2155         },
2156     },
2157 };
2158 
2159 static struct clk_regmap_div mdss_byte1_intf_div_clk = {
2160     .reg = 0x2380,
2161     .shift = 0,
2162     .width = 2,
2163     /*
2164      * NOTE: Op does not work for div-3. Current assumption is that div-3
2165      * is not a recommended setting for this divider.
2166      */
2167     .clkr = {
2168         .hw.init = &(struct clk_init_data){
2169             .name = "mdss_byte1_intf_div_clk",
2170             .parent_hws = (const struct clk_hw *[]){ &byte1_clk_src.clkr.hw },
2171             .num_parents = 1,
2172             .ops = &clk_regmap_div_ops,
2173             .flags = CLK_GET_RATE_NOCACHE,
2174         },
2175     },
2176 };
2177 
2178 static struct clk_branch mdss_byte1_intf_clk = {
2179     .halt_reg = 0x2378,
2180     .halt_check = BRANCH_HALT,
2181     .clkr = {
2182         .enable_reg = 0x2378,
2183         .enable_mask = BIT(0),
2184         .hw.init = &(struct clk_init_data){
2185             .name = "mdss_byte1_intf_clk",
2186             .parent_hws = (const struct clk_hw *[]){ &mdss_byte1_intf_div_clk.clkr.hw },
2187             .num_parents = 1,
2188             .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
2189             .ops = &clk_branch2_ops,
2190         },
2191     },
2192 };
2193 
2194 static struct clk_branch mdss_dp_aux_clk = {
2195     .halt_reg = 0x2364,
2196     .halt_check = BRANCH_HALT,
2197     .clkr = {
2198         .enable_reg = 0x2364,
2199         .enable_mask = BIT(0),
2200         .hw.init = &(struct clk_init_data){
2201             .name = "mdss_dp_aux_clk",
2202             .parent_hws = (const struct clk_hw *[]){ &dp_aux_clk_src.clkr.hw },
2203             .num_parents = 1,
2204             .flags = CLK_SET_RATE_PARENT,
2205             .ops = &clk_branch2_ops,
2206         },
2207     },
2208 };
2209 
2210 static struct clk_branch mdss_dp_crypto_clk = {
2211     .halt_reg = 0x235c,
2212     .halt_check = BRANCH_HALT,
2213     .clkr = {
2214         .enable_reg = 0x235c,
2215         .enable_mask = BIT(0),
2216         .hw.init = &(struct clk_init_data){
2217             .name = "mdss_dp_crypto_clk",
2218             .parent_hws = (const struct clk_hw *[]){ &dp_crypto_clk_src.clkr.hw },
2219             .num_parents = 1,
2220             .flags = CLK_SET_RATE_PARENT,
2221             .ops = &clk_branch2_ops,
2222         },
2223     },
2224 };
2225 
2226 static struct clk_branch mdss_dp_gtc_clk = {
2227     .halt_reg = 0x2368,
2228     .halt_check = BRANCH_HALT,
2229     .clkr = {
2230         .enable_reg = 0x2368,
2231         .enable_mask = BIT(0),
2232         .hw.init = &(struct clk_init_data){
2233             .name = "mdss_dp_gtc_clk",
2234             .parent_hws = (const struct clk_hw *[]){ &dp_gtc_clk_src.clkr.hw },
2235             .num_parents = 1,
2236             .flags = CLK_SET_RATE_PARENT,
2237             .ops = &clk_branch2_ops,
2238         },
2239     },
2240 };
2241 
2242 static struct clk_branch mdss_dp_link_clk = {
2243     .halt_reg = 0x2354,
2244     .halt_check = BRANCH_HALT,
2245     .clkr = {
2246         .enable_reg = 0x2354,
2247         .enable_mask = BIT(0),
2248         .hw.init = &(struct clk_init_data){
2249             .name = "mdss_dp_link_clk",
2250             .parent_hws = (const struct clk_hw *[]){ &dp_link_clk_src.clkr.hw },
2251             .num_parents = 1,
2252             .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
2253             .ops = &clk_branch2_ops,
2254         },
2255     },
2256 };
2257 
2258 /* Reset state of MDSS_DP_LINK_INTF_DIV is 0x3 (div-4) */
2259 static struct clk_branch mdss_dp_link_intf_clk = {
2260     .halt_reg = 0x2358,
2261     .halt_check = BRANCH_HALT,
2262     .clkr = {
2263         .enable_reg = 0x2358,
2264         .enable_mask = BIT(0),
2265         .hw.init = &(struct clk_init_data){
2266             .name = "mdss_dp_link_intf_clk",
2267             .parent_hws = (const struct clk_hw *[]){ &dp_link_clk_src.clkr.hw },
2268             .num_parents = 1,
2269             .ops = &clk_branch2_ops,
2270         },
2271     },
2272 };
2273 
2274 static struct clk_branch mdss_dp_pixel_clk = {
2275     .halt_reg = 0x2360,
2276     .halt_check = BRANCH_HALT,
2277     .clkr = {
2278         .enable_reg = 0x2360,
2279         .enable_mask = BIT(0),
2280         .hw.init = &(struct clk_init_data){
2281             .name = "mdss_dp_pixel_clk",
2282             .parent_hws = (const struct clk_hw *[]){ &dp_pixel_clk_src.clkr.hw },
2283             .num_parents = 1,
2284             .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
2285             .ops = &clk_branch2_ops,
2286         },
2287     },
2288 };
2289 
2290 static struct clk_branch mdss_esc0_clk = {
2291     .halt_reg = 0x2344,
2292     .halt_check = BRANCH_HALT,
2293     .clkr = {
2294         .enable_reg = 0x2344,
2295         .enable_mask = BIT(0),
2296         .hw.init = &(struct clk_init_data){
2297             .name = "mdss_esc0_clk",
2298             .parent_hws = (const struct clk_hw *[]){ &esc0_clk_src.clkr.hw },
2299             .num_parents = 1,
2300             .flags = CLK_SET_RATE_PARENT,
2301             .ops = &clk_branch2_ops,
2302         },
2303     },
2304 };
2305 
2306 static struct clk_branch mdss_esc1_clk = {
2307     .halt_reg = 0x2348,
2308     .halt_check = BRANCH_HALT,
2309     .clkr = {
2310         .enable_reg = 0x2348,
2311         .enable_mask = BIT(0),
2312         .hw.init = &(struct clk_init_data){
2313             .name = "mdss_esc1_clk",
2314             .parent_hws = (const struct clk_hw *[]){ &esc1_clk_src.clkr.hw },
2315             .num_parents = 1,
2316             .flags = CLK_SET_RATE_PARENT,
2317             .ops = &clk_branch2_ops,
2318         },
2319     },
2320 };
2321 
2322 static struct clk_branch mdss_hdmi_dp_ahb_clk = {
2323     .halt_reg = 0x230c,
2324     .halt_check = BRANCH_HALT,
2325     .clkr = {
2326         .enable_reg = 0x230c,
2327         .enable_mask = BIT(0),
2328         .hw.init = &(struct clk_init_data){
2329             .name = "mdss_hdmi_dp_ahb_clk",
2330             .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2331             .num_parents = 1,
2332             .ops = &clk_branch2_ops,
2333         },
2334     },
2335 };
2336 
2337 static struct clk_branch mdss_mdp_clk = {
2338     .halt_reg = 0x231c,
2339     .halt_check = BRANCH_HALT,
2340     .clkr = {
2341         .enable_reg = 0x231c,
2342         .enable_mask = BIT(0),
2343         .hw.init = &(struct clk_init_data){
2344             .name = "mdss_mdp_clk",
2345             .parent_hws = (const struct clk_hw *[]){ &mdp_clk_src.clkr.hw },
2346             .num_parents = 1,
2347             .flags = CLK_SET_RATE_PARENT,
2348             .ops = &clk_branch2_ops,
2349         },
2350     },
2351 };
2352 
2353 static struct clk_branch mdss_pclk0_clk = {
2354     .halt_reg = 0x2314,
2355     .halt_check = BRANCH_HALT,
2356     .clkr = {
2357         .enable_reg = 0x2314,
2358         .enable_mask = BIT(0),
2359         .hw.init = &(struct clk_init_data){
2360             .name = "mdss_pclk0_clk",
2361             .parent_hws = (const struct clk_hw *[]){ &pclk0_clk_src.clkr.hw },
2362             .num_parents = 1,
2363             .flags = CLK_SET_RATE_PARENT,
2364             .ops = &clk_branch2_ops,
2365         },
2366     },
2367 };
2368 
2369 static struct clk_branch mdss_pclk1_clk = {
2370     .halt_reg = 0x2318,
2371     .halt_check = BRANCH_HALT,
2372     .clkr = {
2373         .enable_reg = 0x2318,
2374         .enable_mask = BIT(0),
2375         .hw.init = &(struct clk_init_data){
2376             .name = "mdss_pclk1_clk",
2377             .parent_hws = (const struct clk_hw *[]){ &pclk1_clk_src.clkr.hw },
2378             .num_parents = 1,
2379             .flags = CLK_SET_RATE_PARENT,
2380             .ops = &clk_branch2_ops,
2381         },
2382     },
2383 };
2384 
2385 static struct clk_branch mdss_rot_clk = {
2386     .halt_reg = 0x2350,
2387     .halt_check = BRANCH_HALT,
2388     .clkr = {
2389         .enable_reg = 0x2350,
2390         .enable_mask = BIT(0),
2391         .hw.init = &(struct clk_init_data){
2392             .name = "mdss_rot_clk",
2393             .parent_hws = (const struct clk_hw *[]){ &rot_clk_src.clkr.hw },
2394             .num_parents = 1,
2395             .flags = CLK_SET_RATE_PARENT,
2396             .ops = &clk_branch2_ops,
2397         },
2398     },
2399 };
2400 
2401 static struct clk_branch mdss_vsync_clk = {
2402     .halt_reg = 0x2328,
2403     .halt_check = BRANCH_HALT,
2404     .clkr = {
2405         .enable_reg = 0x2328,
2406         .enable_mask = BIT(0),
2407         .hw.init = &(struct clk_init_data){
2408             .name = "mdss_vsync_clk",
2409             .parent_hws = (const struct clk_hw *[]){ &vsync_clk_src.clkr.hw },
2410             .num_parents = 1,
2411             .flags = CLK_SET_RATE_PARENT,
2412             .ops = &clk_branch2_ops,
2413         },
2414     },
2415 };
2416 
2417 static struct clk_branch mnoc_ahb_clk = {
2418     .halt_reg = 0x5024,
2419     .halt_check = BRANCH_VOTED,
2420     .clkr = {
2421         .enable_reg = 0x5024,
2422         .enable_mask = BIT(0),
2423         .hw.init = &(struct clk_init_data){
2424             .name = "mnoc_ahb_clk",
2425             .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2426             .num_parents = 1,
2427             .flags = CLK_SET_RATE_PARENT,
2428             .ops = &clk_branch2_ops,
2429         },
2430     },
2431 };
2432 
2433 static struct clk_branch misc_ahb_clk = {
2434     .halt_reg = 0x328,
2435     .halt_check = BRANCH_HALT,
2436     .hwcg_reg = 0x328,
2437     .hwcg_bit = 1,
2438     .clkr = {
2439         .enable_reg = 0x328,
2440         .enable_mask = BIT(0),
2441         .hw.init = &(struct clk_init_data){
2442             .name = "misc_ahb_clk",
2443             /*
2444              * Dependency to be enabled before the branch is
2445              * enabled.
2446              */
2447             .parent_hws = (const struct clk_hw *[]){ &mnoc_ahb_clk.clkr.hw },
2448             .num_parents = 1,
2449             .ops = &clk_branch2_ops,
2450         },
2451     },
2452 };
2453 
2454 static struct clk_branch misc_cxo_clk = {
2455     .halt_reg = 0x324,
2456     .halt_check = BRANCH_HALT,
2457     .clkr = {
2458         .enable_reg = 0x324,
2459         .enable_mask = BIT(0),
2460         .hw.init = &(struct clk_init_data){
2461             .name = "misc_cxo_clk",
2462             .parent_data = &(const struct clk_parent_data){
2463                 .fw_name = "xo",
2464             },
2465             .num_parents = 1,
2466             .ops = &clk_branch2_ops,
2467         },
2468     },
2469 };
2470 
2471 static struct clk_branch snoc_dvm_axi_clk = {
2472     .halt_reg = 0xe040,
2473     .halt_check = BRANCH_HALT,
2474     .clkr = {
2475         .enable_reg = 0xe040,
2476         .enable_mask = BIT(0),
2477         .hw.init = &(struct clk_init_data){
2478             .name = "snoc_dvm_axi_clk",
2479             .ops = &clk_branch2_ops,
2480         },
2481     },
2482 };
2483 
2484 static struct clk_branch video_ahb_clk = {
2485     .halt_reg = 0x1030,
2486     .halt_check = BRANCH_HALT,
2487     .hwcg_reg = 0x1030,
2488     .hwcg_bit = 1,
2489     .clkr = {
2490         .enable_reg = 0x1030,
2491         .enable_mask = BIT(0),
2492         .hw.init = &(struct clk_init_data){
2493             .name = "video_ahb_clk",
2494             .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2495             .num_parents = 1,
2496             .ops = &clk_branch2_ops,
2497         },
2498     },
2499 };
2500 
2501 static struct clk_branch video_axi_clk = {
2502     .halt_reg = 0x1034,
2503     .halt_check = BRANCH_HALT,
2504     .clkr = {
2505         .enable_reg = 0x1034,
2506         .enable_mask = BIT(0),
2507         .hw.init = &(struct clk_init_data){
2508             .name = "video_axi_clk",
2509             .ops = &clk_branch2_ops,
2510         },
2511     },
2512 };
2513 
2514 static struct clk_branch throttle_video_axi_clk = {
2515     .halt_reg = 0x118c,
2516     .halt_check = BRANCH_HALT,
2517     .hwcg_reg = 0x118c,
2518     .hwcg_bit = 1,
2519     .clkr = {
2520         .enable_reg = 0x118c,
2521         .enable_mask = BIT(0),
2522         .hw.init = &(struct clk_init_data){
2523             .name = "throttle_video_axi_clk",
2524             .ops = &clk_branch2_ops,
2525         },
2526     },
2527 };
2528 
2529 static struct clk_branch video_core_clk = {
2530     .halt_reg = 0x1028,
2531     .halt_check = BRANCH_HALT,
2532     .clkr = {
2533         .enable_reg = 0x1028,
2534         .enable_mask = BIT(0),
2535         .hw.init = &(struct clk_init_data){
2536             .name = "video_core_clk",
2537             .parent_hws = (const struct clk_hw *[]){ &video_core_clk_src.clkr.hw },
2538             .num_parents = 1,
2539             .flags = CLK_SET_RATE_PARENT,
2540             .ops = &clk_branch2_ops,
2541         },
2542     },
2543 };
2544 
2545 static struct clk_branch video_subcore0_clk = {
2546     .halt_reg = 0x1048,
2547     .halt_check = BRANCH_HALT,
2548     .clkr = {
2549         .enable_reg = 0x1048,
2550         .enable_mask = BIT(0),
2551         .hw.init = &(struct clk_init_data){
2552             .name = "video_subcore0_clk",
2553             .parent_hws = (const struct clk_hw *[]){ &video_core_clk_src.clkr.hw },
2554             .num_parents = 1,
2555             .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
2556             .ops = &clk_branch2_ops,
2557         },
2558     },
2559 };
2560 
2561 static struct gdsc venus_gdsc = {
2562     .gdscr = 0x1024,
2563     .cxcs = (unsigned int[]){ 0x1028, 0x1034, 0x1048 },
2564     .cxc_count = 3,
2565     .pd = {
2566         .name = "venus",
2567     },
2568     .pwrsts = PWRSTS_OFF_ON,
2569 };
2570 
2571 static struct gdsc venus_core0_gdsc = {
2572     .gdscr = 0x1040,
2573     .pd = {
2574         .name = "venus_core0",
2575     },
2576     .parent = &venus_gdsc.pd,
2577     .pwrsts = PWRSTS_OFF_ON,
2578     .flags = HW_CTRL,
2579 };
2580 
2581 static struct gdsc mdss_gdsc = {
2582     .gdscr = 0x2304,
2583     .pd = {
2584         .name = "mdss",
2585     },
2586     .cxcs = (unsigned int []){ 0x2040 },
2587     .cxc_count = 1,
2588     .pwrsts = PWRSTS_OFF_ON,
2589 };
2590 
2591 static struct gdsc camss_top_gdsc = {
2592     .gdscr = 0x34a0,
2593     .pd = {
2594         .name = "camss_top",
2595     },
2596     .pwrsts = PWRSTS_OFF_ON,
2597 };
2598 
2599 static struct gdsc camss_vfe0_gdsc = {
2600     .gdscr = 0x3664,
2601     .pd = {
2602         .name = "camss_vfe0",
2603     },
2604     .parent = &camss_top_gdsc.pd,
2605     .pwrsts = PWRSTS_OFF_ON,
2606 };
2607 
2608 static struct gdsc camss_vfe1_gdsc = {
2609     .gdscr = 0x3674,
2610     .pd = {
2611         .name = "camss_vfe1_gdsc",
2612     },
2613     .parent = &camss_top_gdsc.pd,
2614     .pwrsts = PWRSTS_OFF_ON,
2615 };
2616 
2617 static struct gdsc camss_cpp_gdsc = {
2618     .gdscr = 0x36d4,
2619     .pd = {
2620         .name = "camss_cpp",
2621     },
2622     .parent = &camss_top_gdsc.pd,
2623     .pwrsts = PWRSTS_OFF_ON,
2624 };
2625 
2626 /* This GDSC seems to hang the whole multimedia subsystem.
2627 static struct gdsc bimc_smmu_gdsc = {
2628     .gdscr = 0xe020,
2629     .gds_hw_ctrl = 0xe024,
2630     .pd = {
2631         .name = "bimc_smmu",
2632     },
2633     .pwrsts = PWRSTS_OFF_ON,
2634     .parent = &bimc_smmu_gdsc.pd,
2635     .flags = HW_CTRL,
2636 };
2637 */
2638 
2639 static struct clk_regmap *mmcc_660_clocks[] = {
2640     [AHB_CLK_SRC] = &ahb_clk_src.clkr,
2641     [BYTE0_CLK_SRC] = &byte0_clk_src.clkr,
2642     [BYTE1_CLK_SRC] = &byte1_clk_src.clkr,
2643     [CAMSS_GP0_CLK_SRC] = &camss_gp0_clk_src.clkr,
2644     [CAMSS_GP1_CLK_SRC] = &camss_gp1_clk_src.clkr,
2645     [CCI_CLK_SRC] = &cci_clk_src.clkr,
2646     [CPP_CLK_SRC] = &cpp_clk_src.clkr,
2647     [CSI0_CLK_SRC] = &csi0_clk_src.clkr,
2648     [CSI0PHYTIMER_CLK_SRC] = &csi0phytimer_clk_src.clkr,
2649     [CSI1_CLK_SRC] = &csi1_clk_src.clkr,
2650     [CSI1PHYTIMER_CLK_SRC] = &csi1phytimer_clk_src.clkr,
2651     [CSI2_CLK_SRC] = &csi2_clk_src.clkr,
2652     [CSI2PHYTIMER_CLK_SRC] = &csi2phytimer_clk_src.clkr,
2653     [CSI3_CLK_SRC] = &csi3_clk_src.clkr,
2654     [CSIPHY_CLK_SRC] = &csiphy_clk_src.clkr,
2655     [DP_AUX_CLK_SRC] = &dp_aux_clk_src.clkr,
2656     [DP_CRYPTO_CLK_SRC] = &dp_crypto_clk_src.clkr,
2657     [DP_GTC_CLK_SRC] = &dp_gtc_clk_src.clkr,
2658     [DP_LINK_CLK_SRC] = &dp_link_clk_src.clkr,
2659     [DP_PIXEL_CLK_SRC] = &dp_pixel_clk_src.clkr,
2660     [ESC0_CLK_SRC] = &esc0_clk_src.clkr,
2661     [ESC1_CLK_SRC] = &esc1_clk_src.clkr,
2662     [JPEG0_CLK_SRC] = &jpeg0_clk_src.clkr,
2663     [MCLK0_CLK_SRC] = &mclk0_clk_src.clkr,
2664     [MCLK1_CLK_SRC] = &mclk1_clk_src.clkr,
2665     [MCLK2_CLK_SRC] = &mclk2_clk_src.clkr,
2666     [MCLK3_CLK_SRC] = &mclk3_clk_src.clkr,
2667     [MDP_CLK_SRC] = &mdp_clk_src.clkr,
2668     [MMPLL0_PLL] = &mmpll0.clkr,
2669     [MMPLL10_PLL] = &mmpll10.clkr,
2670     [MMPLL3_PLL] = &mmpll3.clkr,
2671     [MMPLL4_PLL] = &mmpll4.clkr,
2672     [MMPLL5_PLL] = &mmpll5.clkr,
2673     [MMPLL6_PLL] = &mmpll6.clkr,
2674     [MMPLL7_PLL] = &mmpll7.clkr,
2675     [MMPLL8_PLL] = &mmpll8.clkr,
2676     [BIMC_SMMU_AHB_CLK] = &bimc_smmu_ahb_clk.clkr,
2677     [BIMC_SMMU_AXI_CLK] = &bimc_smmu_axi_clk.clkr,
2678     [CAMSS_AHB_CLK] = &camss_ahb_clk.clkr,
2679     [CAMSS_CCI_AHB_CLK] = &camss_cci_ahb_clk.clkr,
2680     [CAMSS_CCI_CLK] = &camss_cci_clk.clkr,
2681     [CAMSS_CPHY_CSID0_CLK] = &camss_cphy_csid0_clk.clkr,
2682     [CAMSS_CPHY_CSID1_CLK] = &camss_cphy_csid1_clk.clkr,
2683     [CAMSS_CPHY_CSID2_CLK] = &camss_cphy_csid2_clk.clkr,
2684     [CAMSS_CPHY_CSID3_CLK] = &camss_cphy_csid3_clk.clkr,
2685     [CAMSS_CPP_AHB_CLK] = &camss_cpp_ahb_clk.clkr,
2686     [CAMSS_CPP_AXI_CLK] = &camss_cpp_axi_clk.clkr,
2687     [CAMSS_CPP_CLK] = &camss_cpp_clk.clkr,
2688     [CAMSS_CPP_VBIF_AHB_CLK] = &camss_cpp_vbif_ahb_clk.clkr,
2689     [CAMSS_CSI0_AHB_CLK] = &camss_csi0_ahb_clk.clkr,
2690     [CAMSS_CSI0_CLK] = &camss_csi0_clk.clkr,
2691     [CAMSS_CSI0PHYTIMER_CLK] = &camss_csi0phytimer_clk.clkr,
2692     [CAMSS_CSI0PIX_CLK] = &camss_csi0pix_clk.clkr,
2693     [CAMSS_CSI0RDI_CLK] = &camss_csi0rdi_clk.clkr,
2694     [CAMSS_CSI1_AHB_CLK] = &camss_csi1_ahb_clk.clkr,
2695     [CAMSS_CSI1_CLK] = &camss_csi1_clk.clkr,
2696     [CAMSS_CSI1PHYTIMER_CLK] = &camss_csi1phytimer_clk.clkr,
2697     [CAMSS_CSI1PIX_CLK] = &camss_csi1pix_clk.clkr,
2698     [CAMSS_CSI1RDI_CLK] = &camss_csi1rdi_clk.clkr,
2699     [CAMSS_CSI2_AHB_CLK] = &camss_csi2_ahb_clk.clkr,
2700     [CAMSS_CSI2_CLK] = &camss_csi2_clk.clkr,
2701     [CAMSS_CSI2PHYTIMER_CLK] = &camss_csi2phytimer_clk.clkr,
2702     [CAMSS_CSI2PIX_CLK] = &camss_csi2pix_clk.clkr,
2703     [CAMSS_CSI2RDI_CLK] = &camss_csi2rdi_clk.clkr,
2704     [CAMSS_CSI3_AHB_CLK] = &camss_csi3_ahb_clk.clkr,
2705     [CAMSS_CSI3_CLK] = &camss_csi3_clk.clkr,
2706     [CAMSS_CSI3PIX_CLK] = &camss_csi3pix_clk.clkr,
2707     [CAMSS_CSI3RDI_CLK] = &camss_csi3rdi_clk.clkr,
2708     [CAMSS_CSI_VFE0_CLK] = &camss_csi_vfe0_clk.clkr,
2709     [CAMSS_CSI_VFE1_CLK] = &camss_csi_vfe1_clk.clkr,
2710     [CAMSS_CSIPHY0_CLK] = &camss_csiphy0_clk.clkr,
2711     [CAMSS_CSIPHY1_CLK] = &camss_csiphy1_clk.clkr,
2712     [CAMSS_CSIPHY2_CLK] = &camss_csiphy2_clk.clkr,
2713     [CAMSS_GP0_CLK] = &camss_gp0_clk.clkr,
2714     [CAMSS_GP1_CLK] = &camss_gp1_clk.clkr,
2715     [CAMSS_ISPIF_AHB_CLK] = &camss_ispif_ahb_clk.clkr,
2716     [CAMSS_JPEG0_CLK] = &camss_jpeg0_clk.clkr,
2717     [CAMSS_JPEG_AHB_CLK] = &camss_jpeg_ahb_clk.clkr,
2718     [CAMSS_JPEG_AXI_CLK] = &camss_jpeg_axi_clk.clkr,
2719     [CAMSS_MCLK0_CLK] = &camss_mclk0_clk.clkr,
2720     [CAMSS_MCLK1_CLK] = &camss_mclk1_clk.clkr,
2721     [CAMSS_MCLK2_CLK] = &camss_mclk2_clk.clkr,
2722     [CAMSS_MCLK3_CLK] = &camss_mclk3_clk.clkr,
2723     [CAMSS_MICRO_AHB_CLK] = &camss_micro_ahb_clk.clkr,
2724     [CAMSS_TOP_AHB_CLK] = &camss_top_ahb_clk.clkr,
2725     [CAMSS_VFE0_AHB_CLK] = &camss_vfe0_ahb_clk.clkr,
2726     [CAMSS_VFE0_CLK] = &camss_vfe0_clk.clkr,
2727     [CAMSS_VFE0_STREAM_CLK] = &camss_vfe0_stream_clk.clkr,
2728     [CAMSS_VFE1_AHB_CLK] = &camss_vfe1_ahb_clk.clkr,
2729     [CAMSS_VFE1_CLK] = &camss_vfe1_clk.clkr,
2730     [CAMSS_VFE1_STREAM_CLK] = &camss_vfe1_stream_clk.clkr,
2731     [CAMSS_VFE_VBIF_AHB_CLK] = &camss_vfe_vbif_ahb_clk.clkr,
2732     [CAMSS_VFE_VBIF_AXI_CLK] = &camss_vfe_vbif_axi_clk.clkr,
2733     [CSIPHY_AHB2CRIF_CLK] = &csiphy_ahb2crif_clk.clkr,
2734     [MDSS_AHB_CLK] = &mdss_ahb_clk.clkr,
2735     [MDSS_AXI_CLK] = &mdss_axi_clk.clkr,
2736     [MDSS_BYTE0_CLK] = &mdss_byte0_clk.clkr,
2737     [MDSS_BYTE0_INTF_CLK] = &mdss_byte0_intf_clk.clkr,
2738     [MDSS_BYTE0_INTF_DIV_CLK] = &mdss_byte0_intf_div_clk.clkr,
2739     [MDSS_BYTE1_CLK] = &mdss_byte1_clk.clkr,
2740     [MDSS_BYTE1_INTF_CLK] = &mdss_byte1_intf_clk.clkr,
2741     [MDSS_DP_AUX_CLK] = &mdss_dp_aux_clk.clkr,
2742     [MDSS_DP_CRYPTO_CLK] = &mdss_dp_crypto_clk.clkr,
2743     [MDSS_DP_GTC_CLK] = &mdss_dp_gtc_clk.clkr,
2744     [MDSS_DP_LINK_CLK] = &mdss_dp_link_clk.clkr,
2745     [MDSS_DP_LINK_INTF_CLK] = &mdss_dp_link_intf_clk.clkr,
2746     [MDSS_DP_PIXEL_CLK] = &mdss_dp_pixel_clk.clkr,
2747     [MDSS_ESC0_CLK] = &mdss_esc0_clk.clkr,
2748     [MDSS_ESC1_CLK] = &mdss_esc1_clk.clkr,
2749     [MDSS_HDMI_DP_AHB_CLK] = &mdss_hdmi_dp_ahb_clk.clkr,
2750     [MDSS_MDP_CLK] = &mdss_mdp_clk.clkr,
2751     [MDSS_PCLK0_CLK] = &mdss_pclk0_clk.clkr,
2752     [MDSS_PCLK1_CLK] = &mdss_pclk1_clk.clkr,
2753     [MDSS_ROT_CLK] = &mdss_rot_clk.clkr,
2754     [MDSS_VSYNC_CLK] = &mdss_vsync_clk.clkr,
2755     [MISC_AHB_CLK] = &misc_ahb_clk.clkr,
2756     [MISC_CXO_CLK] = &misc_cxo_clk.clkr,
2757     [MNOC_AHB_CLK] = &mnoc_ahb_clk.clkr,
2758     [SNOC_DVM_AXI_CLK] = &snoc_dvm_axi_clk.clkr,
2759     [THROTTLE_CAMSS_AXI_CLK] = &throttle_camss_axi_clk.clkr,
2760     [THROTTLE_MDSS_AXI_CLK] = &throttle_mdss_axi_clk.clkr,
2761     [THROTTLE_VIDEO_AXI_CLK] = &throttle_video_axi_clk.clkr,
2762     [VIDEO_AHB_CLK] = &video_ahb_clk.clkr,
2763     [VIDEO_AXI_CLK] = &video_axi_clk.clkr,
2764     [VIDEO_CORE_CLK] = &video_core_clk.clkr,
2765     [VIDEO_SUBCORE0_CLK] = &video_subcore0_clk.clkr,
2766     [PCLK0_CLK_SRC] = &pclk0_clk_src.clkr,
2767     [PCLK1_CLK_SRC] = &pclk1_clk_src.clkr,
2768     [ROT_CLK_SRC] = &rot_clk_src.clkr,
2769     [VFE0_CLK_SRC] = &vfe0_clk_src.clkr,
2770     [VFE1_CLK_SRC] = &vfe1_clk_src.clkr,
2771     [VIDEO_CORE_CLK_SRC] = &video_core_clk_src.clkr,
2772     [VSYNC_CLK_SRC] = &vsync_clk_src.clkr,
2773     [MDSS_BYTE1_INTF_DIV_CLK] = &mdss_byte1_intf_div_clk.clkr,
2774     [AXI_CLK_SRC] = &axi_clk_src.clkr,
2775 };
2776 
2777 static struct gdsc *mmcc_sdm660_gdscs[] = {
2778     [VENUS_GDSC] = &venus_gdsc,
2779     [VENUS_CORE0_GDSC] = &venus_core0_gdsc,
2780     [MDSS_GDSC] = &mdss_gdsc,
2781     [CAMSS_TOP_GDSC] = &camss_top_gdsc,
2782     [CAMSS_VFE0_GDSC] = &camss_vfe0_gdsc,
2783     [CAMSS_VFE1_GDSC] = &camss_vfe1_gdsc,
2784     [CAMSS_CPP_GDSC] = &camss_cpp_gdsc,
2785 };
2786 
2787 static const struct qcom_reset_map mmcc_660_resets[] = {
2788     [CAMSS_MICRO_BCR] = { 0x3490 },
2789 };
2790 
2791 static const struct regmap_config mmcc_660_regmap_config = {
2792     .reg_bits   = 32,
2793     .reg_stride = 4,
2794     .val_bits   = 32,
2795     .max_register   = 0x40000,
2796     .fast_io    = true,
2797 };
2798 
2799 static const struct qcom_cc_desc mmcc_660_desc = {
2800     .config = &mmcc_660_regmap_config,
2801     .clks = mmcc_660_clocks,
2802     .num_clks = ARRAY_SIZE(mmcc_660_clocks),
2803     .resets = mmcc_660_resets,
2804     .num_resets = ARRAY_SIZE(mmcc_660_resets),
2805     .gdscs = mmcc_sdm660_gdscs,
2806     .num_gdscs = ARRAY_SIZE(mmcc_sdm660_gdscs),
2807 };
2808 
2809 static const struct of_device_id mmcc_660_match_table[] = {
2810     { .compatible = "qcom,mmcc-sdm660" },
2811     { .compatible = "qcom,mmcc-sdm630", .data = (void *)1UL },
2812     { }
2813 };
2814 MODULE_DEVICE_TABLE(of, mmcc_660_match_table);
2815 
2816 static void sdm630_clock_override(void)
2817 {
2818     /* SDM630 has only one DSI */
2819     mmcc_660_desc.clks[BYTE1_CLK_SRC] = NULL;
2820     mmcc_660_desc.clks[MDSS_BYTE1_CLK] = NULL;
2821     mmcc_660_desc.clks[MDSS_BYTE1_INTF_DIV_CLK] = NULL;
2822     mmcc_660_desc.clks[MDSS_BYTE1_INTF_CLK] = NULL;
2823     mmcc_660_desc.clks[ESC1_CLK_SRC] = NULL;
2824     mmcc_660_desc.clks[MDSS_ESC1_CLK] = NULL;
2825     mmcc_660_desc.clks[PCLK1_CLK_SRC] = NULL;
2826     mmcc_660_desc.clks[MDSS_PCLK1_CLK] = NULL;
2827 }
2828 
2829 static int mmcc_660_probe(struct platform_device *pdev)
2830 {
2831     const struct of_device_id *id;
2832     struct regmap *regmap;
2833     bool is_sdm630;
2834 
2835     id = of_match_device(mmcc_660_match_table, &pdev->dev);
2836     if (!id)
2837         return -ENODEV;
2838     is_sdm630 = !!(id->data);
2839 
2840     regmap = qcom_cc_map(pdev, &mmcc_660_desc);
2841     if (IS_ERR(regmap))
2842         return PTR_ERR(regmap);
2843 
2844     if (is_sdm630)
2845         sdm630_clock_override();
2846 
2847     clk_alpha_pll_configure(&mmpll3, regmap, &mmpll3_config);
2848     clk_alpha_pll_configure(&mmpll4, regmap, &mmpll4_config);
2849     clk_alpha_pll_configure(&mmpll5, regmap, &mmpll5_config);
2850     clk_alpha_pll_configure(&mmpll7, regmap, &mmpll7_config);
2851     clk_alpha_pll_configure(&mmpll8, regmap, &mmpll8_config);
2852     clk_alpha_pll_configure(&mmpll10, regmap, &mmpll10_config);
2853 
2854     return qcom_cc_really_probe(pdev, &mmcc_660_desc, regmap);
2855 }
2856 
2857 static struct platform_driver mmcc_660_driver = {
2858     .probe      = mmcc_660_probe,
2859     .driver     = {
2860         .name   = "mmcc-sdm660",
2861         .of_match_table = mmcc_660_match_table,
2862     },
2863 };
2864 module_platform_driver(mmcc_660_driver);
2865 
2866 MODULE_DESCRIPTION("Qualcomm SDM630/SDM660 MMCC driver");
2867 MODULE_LICENSE("GPL v2");