0001
0002
0003
0004
0005
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
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
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
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
2114
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
2165
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
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
2445
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
2627
2628
2629
2630
2631
2632
2633
2634
2635
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
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");