1 // SPDX-License-Identifier: GPL-2.0-only 2 /*x 3 * Copyright (c) 2015, The Linux Foundation. All rights reserved. 4 */ 5 6 #include <linux/kernel.h> 7 #include <linux/bitops.h> 8 #include <linux/err.h> 9 #include <linux/platform_device.h> 10 #include <linux/module.h> 11 #include <linux/of.h> 12 #include <linux/of_device.h> 13 #include <linux/clk-provider.h> 14 #include <linux/regmap.h> 15 #include <linux/reset-controller.h> 16 #include <linux/clk.h> 17 18 #include <dt-bindings/clock/qcom,mmcc-msm8996.h> 19 20 #include "common.h" 21 #include "clk-regmap.h" 22 #include "clk-regmap-divider.h" 23 #include "clk-alpha-pll.h" 24 #include "clk-rcg.h" 25 #include "clk-branch.h" 26 #include "reset.h" 27 #include "gdsc.h" 28 29 enum { 30 P_XO, 31 P_MMPLL0, 32 P_GPLL0, 33 P_GPLL0_DIV, 34 P_MMPLL1, 35 P_MMPLL9, 36 P_MMPLL2, 37 P_MMPLL8, 38 P_MMPLL3, 39 P_DSI0PLL, 40 P_DSI1PLL, 41 P_MMPLL5, 42 P_HDMIPLL, 43 P_DSI0PLL_BYTE, 44 P_DSI1PLL_BYTE, 45 P_MMPLL4, 46 }; 47 48 static const struct parent_map mmss_xo_hdmi_map[] = { 49 { P_XO, 0 }, 50 { P_HDMIPLL, 1 } 51 }; 52 53 static const char * const mmss_xo_hdmi[] = { 54 "xo", 55 "hdmipll" 56 }; 57 58 static const struct parent_map mmss_xo_dsi0pll_dsi1pll_map[] = { 59 { P_XO, 0 }, 60 { P_DSI0PLL, 1 }, 61 { P_DSI1PLL, 2 } 62 }; 63 64 static const char * const mmss_xo_dsi0pll_dsi1pll[] = { 65 "xo", 66 "dsi0pll", 67 "dsi1pll" 68 }; 69 70 static const struct parent_map mmss_xo_gpll0_gpll0_div_map[] = { 71 { P_XO, 0 }, 72 { P_GPLL0, 5 }, 73 { P_GPLL0_DIV, 6 } 74 }; 75 76 static const char * const mmss_xo_gpll0_gpll0_div[] = { 77 "xo", 78 "gpll0", 79 "gpll0_div" 80 }; 81 82 static const struct parent_map mmss_xo_dsibyte_map[] = { 83 { P_XO, 0 }, 84 { P_DSI0PLL_BYTE, 1 }, 85 { P_DSI1PLL_BYTE, 2 } 86 }; 87 88 static const char * const mmss_xo_dsibyte[] = { 89 "xo", 90 "dsi0pllbyte", 91 "dsi1pllbyte" 92 }; 93 94 static const struct parent_map mmss_xo_mmpll0_gpll0_gpll0_div_map[] = { 95 { P_XO, 0 }, 96 { P_MMPLL0, 1 }, 97 { P_GPLL0, 5 }, 98 { P_GPLL0_DIV, 6 } 99 }; 100 101 static const char * const mmss_xo_mmpll0_gpll0_gpll0_div[] = { 102 "xo", 103 "mmpll0", 104 "gpll0", 105 "gpll0_div" 106 }; 107 108 static const struct parent_map mmss_xo_mmpll0_mmpll1_gpll0_gpll0_div_map[] = { 109 { P_XO, 0 }, 110 { P_MMPLL0, 1 }, 111 { P_MMPLL1, 2 }, 112 { P_GPLL0, 5 }, 113 { P_GPLL0_DIV, 6 } 114 }; 115 116 static const char * const mmss_xo_mmpll0_mmpll1_gpll0_gpll0_div[] = { 117 "xo", 118 "mmpll0", 119 "mmpll1", 120 "gpll0", 121 "gpll0_div" 122 }; 123 124 static const struct parent_map mmss_xo_mmpll0_mmpll3_gpll0_gpll0_div_map[] = { 125 { P_XO, 0 }, 126 { P_MMPLL0, 1 }, 127 { P_MMPLL3, 3 }, 128 { P_GPLL0, 5 }, 129 { P_GPLL0_DIV, 6 } 130 }; 131 132 static const char * const mmss_xo_mmpll0_mmpll3_gpll0_gpll0_div[] = { 133 "xo", 134 "mmpll0", 135 "mmpll3", 136 "gpll0", 137 "gpll0_div" 138 }; 139 140 static const struct parent_map mmss_xo_mmpll0_mmpll5_gpll0_gpll0_div_map[] = { 141 { P_XO, 0 }, 142 { P_MMPLL0, 1 }, 143 { P_MMPLL5, 2 }, 144 { P_GPLL0, 5 }, 145 { P_GPLL0_DIV, 6 } 146 }; 147 148 static const char * const mmss_xo_mmpll0_mmpll5_gpll0_gpll0_div[] = { 149 "xo", 150 "mmpll0", 151 "mmpll5", 152 "gpll0", 153 "gpll0_div" 154 }; 155 156 static const struct parent_map mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div_map[] = { 157 { P_XO, 0 }, 158 { P_MMPLL0, 1 }, 159 { P_MMPLL4, 3 }, 160 { P_GPLL0, 5 }, 161 { P_GPLL0_DIV, 6 } 162 }; 163 164 static const char * const mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div[] = { 165 "xo", 166 "mmpll0", 167 "mmpll4", 168 "gpll0", 169 "gpll0_div" 170 }; 171 172 static const struct parent_map mmss_xo_mmpll0_mmpll9_mmpll2_mmpll8_gpll0_map[] = { 173 { P_XO, 0 }, 174 { P_MMPLL0, 1 }, 175 { P_MMPLL9, 2 }, 176 { P_MMPLL2, 3 }, 177 { P_MMPLL8, 4 }, 178 { P_GPLL0, 5 } 179 }; 180 181 static const char * const mmss_xo_mmpll0_mmpll9_mmpll2_mmpll8_gpll0[] = { 182 "xo", 183 "mmpll0", 184 "mmpll9", 185 "mmpll2", 186 "mmpll8", 187 "gpll0" 188 }; 189 190 static const struct parent_map mmss_xo_mmpll0_mmpll9_mmpll2_mmpll8_gpll0_gpll0_div_map[] = { 191 { P_XO, 0 }, 192 { P_MMPLL0, 1 }, 193 { P_MMPLL9, 2 }, 194 { P_MMPLL2, 3 }, 195 { P_MMPLL8, 4 }, 196 { P_GPLL0, 5 }, 197 { P_GPLL0_DIV, 6 } 198 }; 199 200 static const char * const mmss_xo_mmpll0_mmpll9_mmpll2_mmpll8_gpll0_gpll0_div[] = { 201 "xo", 202 "mmpll0", 203 "mmpll9", 204 "mmpll2", 205 "mmpll8", 206 "gpll0", 207 "gpll0_div" 208 }; 209 210 static const struct parent_map mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map[] = { 211 { P_XO, 0 }, 212 { P_MMPLL0, 1 }, 213 { P_MMPLL1, 2 }, 214 { P_MMPLL4, 3 }, 215 { P_MMPLL3, 4 }, 216 { P_GPLL0, 5 }, 217 { P_GPLL0_DIV, 6 } 218 }; 219 220 static const char * const mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div[] = { 221 "xo", 222 "mmpll0", 223 "mmpll1", 224 "mmpll4", 225 "mmpll3", 226 "gpll0", 227 "gpll0_div" 228 }; 229 230 static struct clk_fixed_factor gpll0_div = { 231 .mult = 1, 232 .div = 2, 233 .hw.init = &(struct clk_init_data){ 234 .name = "gpll0_div", 235 .parent_names = (const char *[]){ "gpll0" }, 236 .num_parents = 1, 237 .ops = &clk_fixed_factor_ops, 238 }, 239 }; 240 241 static struct pll_vco mmpll_p_vco[] = { 242 { 250000000, 500000000, 3 }, 243 { 500000000, 1000000000, 2 }, 244 { 1000000000, 1500000000, 1 }, 245 { 1500000000, 2000000000, 0 }, 246 }; 247 248 static struct pll_vco mmpll_gfx_vco[] = { 249 { 400000000, 1000000000, 2 }, 250 { 1000000000, 1500000000, 1 }, 251 { 1500000000, 2000000000, 0 }, 252 }; 253 254 static struct pll_vco mmpll_t_vco[] = { 255 { 500000000, 1500000000, 0 }, 256 }; 257 258 static struct clk_alpha_pll mmpll0_early = { 259 .offset = 0x0, 260 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 261 .vco_table = mmpll_p_vco, 262 .num_vco = ARRAY_SIZE(mmpll_p_vco), 263 .clkr = { 264 .enable_reg = 0x100, 265 .enable_mask = BIT(0), 266 .hw.init = &(struct clk_init_data){ 267 .name = "mmpll0_early", 268 .parent_names = (const char *[]){ "xo" }, 269 .num_parents = 1, 270 .ops = &clk_alpha_pll_ops, 271 }, 272 }, 273 }; 274 275 static struct clk_alpha_pll_postdiv mmpll0 = { 276 .offset = 0x0, 277 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 278 .width = 4, 279 .clkr.hw.init = &(struct clk_init_data){ 280 .name = "mmpll0", 281 .parent_names = (const char *[]){ "mmpll0_early" }, 282 .num_parents = 1, 283 .ops = &clk_alpha_pll_postdiv_ops, 284 .flags = CLK_SET_RATE_PARENT, 285 }, 286 }; 287 288 static struct clk_alpha_pll mmpll1_early = { 289 .offset = 0x30, 290 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 291 .vco_table = mmpll_p_vco, 292 .num_vco = ARRAY_SIZE(mmpll_p_vco), 293 .clkr = { 294 .enable_reg = 0x100, 295 .enable_mask = BIT(1), 296 .hw.init = &(struct clk_init_data){ 297 .name = "mmpll1_early", 298 .parent_names = (const char *[]){ "xo" }, 299 .num_parents = 1, 300 .ops = &clk_alpha_pll_ops, 301 } 302 }, 303 }; 304 305 static struct clk_alpha_pll_postdiv mmpll1 = { 306 .offset = 0x30, 307 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 308 .width = 4, 309 .clkr.hw.init = &(struct clk_init_data){ 310 .name = "mmpll1", 311 .parent_names = (const char *[]){ "mmpll1_early" }, 312 .num_parents = 1, 313 .ops = &clk_alpha_pll_postdiv_ops, 314 .flags = CLK_SET_RATE_PARENT, 315 }, 316 }; 317 318 static struct clk_alpha_pll mmpll2_early = { 319 .offset = 0x4100, 320 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 321 .vco_table = mmpll_gfx_vco, 322 .num_vco = ARRAY_SIZE(mmpll_gfx_vco), 323 .clkr.hw.init = &(struct clk_init_data){ 324 .name = "mmpll2_early", 325 .parent_names = (const char *[]){ "xo" }, 326 .num_parents = 1, 327 .ops = &clk_alpha_pll_ops, 328 }, 329 }; 330 331 static struct clk_alpha_pll_postdiv mmpll2 = { 332 .offset = 0x4100, 333 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 334 .width = 4, 335 .clkr.hw.init = &(struct clk_init_data){ 336 .name = "mmpll2", 337 .parent_names = (const char *[]){ "mmpll2_early" }, 338 .num_parents = 1, 339 .ops = &clk_alpha_pll_postdiv_ops, 340 .flags = CLK_SET_RATE_PARENT, 341 }, 342 }; 343 344 static struct clk_alpha_pll mmpll3_early = { 345 .offset = 0x60, 346 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 347 .vco_table = mmpll_p_vco, 348 .num_vco = ARRAY_SIZE(mmpll_p_vco), 349 .clkr.hw.init = &(struct clk_init_data){ 350 .name = "mmpll3_early", 351 .parent_names = (const char *[]){ "xo" }, 352 .num_parents = 1, 353 .ops = &clk_alpha_pll_ops, 354 }, 355 }; 356 357 static struct clk_alpha_pll_postdiv mmpll3 = { 358 .offset = 0x60, 359 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 360 .width = 4, 361 .clkr.hw.init = &(struct clk_init_data){ 362 .name = "mmpll3", 363 .parent_names = (const char *[]){ "mmpll3_early" }, 364 .num_parents = 1, 365 .ops = &clk_alpha_pll_postdiv_ops, 366 .flags = CLK_SET_RATE_PARENT, 367 }, 368 }; 369 370 static struct clk_alpha_pll mmpll4_early = { 371 .offset = 0x90, 372 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 373 .vco_table = mmpll_t_vco, 374 .num_vco = ARRAY_SIZE(mmpll_t_vco), 375 .clkr.hw.init = &(struct clk_init_data){ 376 .name = "mmpll4_early", 377 .parent_names = (const char *[]){ "xo" }, 378 .num_parents = 1, 379 .ops = &clk_alpha_pll_ops, 380 }, 381 }; 382 383 static struct clk_alpha_pll_postdiv mmpll4 = { 384 .offset = 0x90, 385 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 386 .width = 2, 387 .clkr.hw.init = &(struct clk_init_data){ 388 .name = "mmpll4", 389 .parent_names = (const char *[]){ "mmpll4_early" }, 390 .num_parents = 1, 391 .ops = &clk_alpha_pll_postdiv_ops, 392 .flags = CLK_SET_RATE_PARENT, 393 }, 394 }; 395 396 static struct clk_alpha_pll mmpll5_early = { 397 .offset = 0xc0, 398 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 399 .vco_table = mmpll_p_vco, 400 .num_vco = ARRAY_SIZE(mmpll_p_vco), 401 .clkr.hw.init = &(struct clk_init_data){ 402 .name = "mmpll5_early", 403 .parent_names = (const char *[]){ "xo" }, 404 .num_parents = 1, 405 .ops = &clk_alpha_pll_ops, 406 }, 407 }; 408 409 static struct clk_alpha_pll_postdiv mmpll5 = { 410 .offset = 0xc0, 411 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 412 .width = 4, 413 .clkr.hw.init = &(struct clk_init_data){ 414 .name = "mmpll5", 415 .parent_names = (const char *[]){ "mmpll5_early" }, 416 .num_parents = 1, 417 .ops = &clk_alpha_pll_postdiv_ops, 418 .flags = CLK_SET_RATE_PARENT, 419 }, 420 }; 421 422 static struct clk_alpha_pll mmpll8_early = { 423 .offset = 0x4130, 424 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 425 .vco_table = mmpll_gfx_vco, 426 .num_vco = ARRAY_SIZE(mmpll_gfx_vco), 427 .clkr.hw.init = &(struct clk_init_data){ 428 .name = "mmpll8_early", 429 .parent_names = (const char *[]){ "xo" }, 430 .num_parents = 1, 431 .ops = &clk_alpha_pll_ops, 432 }, 433 }; 434 435 static struct clk_alpha_pll_postdiv mmpll8 = { 436 .offset = 0x4130, 437 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 438 .width = 4, 439 .clkr.hw.init = &(struct clk_init_data){ 440 .name = "mmpll8", 441 .parent_names = (const char *[]){ "mmpll8_early" }, 442 .num_parents = 1, 443 .ops = &clk_alpha_pll_postdiv_ops, 444 .flags = CLK_SET_RATE_PARENT, 445 }, 446 }; 447 448 static struct clk_alpha_pll mmpll9_early = { 449 .offset = 0x4200, 450 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 451 .vco_table = mmpll_t_vco, 452 .num_vco = ARRAY_SIZE(mmpll_t_vco), 453 .clkr.hw.init = &(struct clk_init_data){ 454 .name = "mmpll9_early", 455 .parent_names = (const char *[]){ "xo" }, 456 .num_parents = 1, 457 .ops = &clk_alpha_pll_ops, 458 }, 459 }; 460 461 static struct clk_alpha_pll_postdiv mmpll9 = { 462 .offset = 0x4200, 463 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 464 .width = 2, 465 .clkr.hw.init = &(struct clk_init_data){ 466 .name = "mmpll9", 467 .parent_names = (const char *[]){ "mmpll9_early" }, 468 .num_parents = 1, 469 .ops = &clk_alpha_pll_postdiv_ops, 470 .flags = CLK_SET_RATE_PARENT, 471 }, 472 }; 473 474 static const struct freq_tbl ftbl_ahb_clk_src[] = { 475 F(19200000, P_XO, 1, 0, 0), 476 F(40000000, P_GPLL0_DIV, 7.5, 0, 0), 477 F(80000000, P_MMPLL0, 10, 0, 0), 478 { } 479 }; 480 481 static struct clk_rcg2 ahb_clk_src = { 482 .cmd_rcgr = 0x5000, 483 .hid_width = 5, 484 .parent_map = mmss_xo_mmpll0_gpll0_gpll0_div_map, 485 .freq_tbl = ftbl_ahb_clk_src, 486 .clkr.hw.init = &(struct clk_init_data){ 487 .name = "ahb_clk_src", 488 .parent_names = mmss_xo_mmpll0_gpll0_gpll0_div, 489 .num_parents = 4, 490 .ops = &clk_rcg2_ops, 491 }, 492 }; 493 494 static const struct freq_tbl ftbl_axi_clk_src[] = { 495 F(19200000, P_XO, 1, 0, 0), 496 F(75000000, P_GPLL0_DIV, 4, 0, 0), 497 F(100000000, P_GPLL0, 6, 0, 0), 498 F(171430000, P_GPLL0, 3.5, 0, 0), 499 F(200000000, P_GPLL0, 3, 0, 0), 500 F(320000000, P_MMPLL0, 2.5, 0, 0), 501 F(400000000, P_MMPLL0, 2, 0, 0), 502 { } 503 }; 504 505 static struct clk_rcg2 axi_clk_src = { 506 .cmd_rcgr = 0x5040, 507 .hid_width = 5, 508 .parent_map = mmss_xo_mmpll0_mmpll1_gpll0_gpll0_div_map, 509 .freq_tbl = ftbl_axi_clk_src, 510 .clkr.hw.init = &(struct clk_init_data){ 511 .name = "axi_clk_src", 512 .parent_names = mmss_xo_mmpll0_mmpll1_gpll0_gpll0_div, 513 .num_parents = 5, 514 .ops = &clk_rcg2_ops, 515 }, 516 }; 517 518 static struct clk_rcg2 maxi_clk_src = { 519 .cmd_rcgr = 0x5090, 520 .hid_width = 5, 521 .parent_map = mmss_xo_mmpll0_mmpll1_gpll0_gpll0_div_map, 522 .freq_tbl = ftbl_axi_clk_src, 523 .clkr.hw.init = &(struct clk_init_data){ 524 .name = "maxi_clk_src", 525 .parent_names = mmss_xo_mmpll0_mmpll1_gpll0_gpll0_div, 526 .num_parents = 5, 527 .ops = &clk_rcg2_ops, 528 }, 529 }; 530 531 static struct clk_rcg2 gfx3d_clk_src = { 532 .cmd_rcgr = 0x4000, 533 .hid_width = 5, 534 .parent_map = mmss_xo_mmpll0_mmpll9_mmpll2_mmpll8_gpll0_map, 535 .clkr.hw.init = &(struct clk_init_data){ 536 .name = "gfx3d_clk_src", 537 .parent_names = mmss_xo_mmpll0_mmpll9_mmpll2_mmpll8_gpll0, 538 .num_parents = 6, 539 .ops = &clk_gfx3d_ops, 540 .flags = CLK_SET_RATE_PARENT, 541 }, 542 }; 543 544 static const struct freq_tbl ftbl_rbbmtimer_clk_src[] = { 545 F(19200000, P_XO, 1, 0, 0), 546 { } 547 }; 548 549 static struct clk_rcg2 rbbmtimer_clk_src = { 550 .cmd_rcgr = 0x4090, 551 .hid_width = 5, 552 .parent_map = mmss_xo_mmpll0_gpll0_gpll0_div_map, 553 .freq_tbl = ftbl_rbbmtimer_clk_src, 554 .clkr.hw.init = &(struct clk_init_data){ 555 .name = "rbbmtimer_clk_src", 556 .parent_names = mmss_xo_mmpll0_gpll0_gpll0_div, 557 .num_parents = 4, 558 .ops = &clk_rcg2_ops, 559 }, 560 }; 561 562 static struct clk_rcg2 isense_clk_src = { 563 .cmd_rcgr = 0x4010, 564 .hid_width = 5, 565 .parent_map = mmss_xo_mmpll0_mmpll9_mmpll2_mmpll8_gpll0_gpll0_div_map, 566 .clkr.hw.init = &(struct clk_init_data){ 567 .name = "isense_clk_src", 568 .parent_names = mmss_xo_mmpll0_mmpll9_mmpll2_mmpll8_gpll0_gpll0_div, 569 .num_parents = 7, 570 .ops = &clk_rcg2_ops, 571 }, 572 }; 573 574 static const struct freq_tbl ftbl_rbcpr_clk_src[] = { 575 F(19200000, P_XO, 1, 0, 0), 576 F(50000000, P_GPLL0, 12, 0, 0), 577 { } 578 }; 579 580 static struct clk_rcg2 rbcpr_clk_src = { 581 .cmd_rcgr = 0x4060, 582 .hid_width = 5, 583 .parent_map = mmss_xo_mmpll0_gpll0_gpll0_div_map, 584 .freq_tbl = ftbl_rbcpr_clk_src, 585 .clkr.hw.init = &(struct clk_init_data){ 586 .name = "rbcpr_clk_src", 587 .parent_names = mmss_xo_mmpll0_gpll0_gpll0_div, 588 .num_parents = 4, 589 .ops = &clk_rcg2_ops, 590 }, 591 }; 592 593 static const struct freq_tbl ftbl_video_core_clk_src[] = { 594 F(75000000, P_GPLL0_DIV, 4, 0, 0), 595 F(150000000, P_GPLL0, 4, 0, 0), 596 F(346666667, P_MMPLL3, 3, 0, 0), 597 F(520000000, P_MMPLL3, 2, 0, 0), 598 { } 599 }; 600 601 static struct clk_rcg2 video_core_clk_src = { 602 .cmd_rcgr = 0x1000, 603 .mnd_width = 8, 604 .hid_width = 5, 605 .parent_map = mmss_xo_mmpll0_mmpll3_gpll0_gpll0_div_map, 606 .freq_tbl = ftbl_video_core_clk_src, 607 .clkr.hw.init = &(struct clk_init_data){ 608 .name = "video_core_clk_src", 609 .parent_names = mmss_xo_mmpll0_mmpll3_gpll0_gpll0_div, 610 .num_parents = 5, 611 .ops = &clk_rcg2_ops, 612 }, 613 }; 614 615 static struct clk_rcg2 video_subcore0_clk_src = { 616 .cmd_rcgr = 0x1060, 617 .mnd_width = 8, 618 .hid_width = 5, 619 .parent_map = mmss_xo_mmpll0_mmpll3_gpll0_gpll0_div_map, 620 .freq_tbl = ftbl_video_core_clk_src, 621 .clkr.hw.init = &(struct clk_init_data){ 622 .name = "video_subcore0_clk_src", 623 .parent_names = mmss_xo_mmpll0_mmpll3_gpll0_gpll0_div, 624 .num_parents = 5, 625 .ops = &clk_rcg2_ops, 626 }, 627 }; 628 629 static struct clk_rcg2 video_subcore1_clk_src = { 630 .cmd_rcgr = 0x1080, 631 .mnd_width = 8, 632 .hid_width = 5, 633 .parent_map = mmss_xo_mmpll0_mmpll3_gpll0_gpll0_div_map, 634 .freq_tbl = ftbl_video_core_clk_src, 635 .clkr.hw.init = &(struct clk_init_data){ 636 .name = "video_subcore1_clk_src", 637 .parent_names = mmss_xo_mmpll0_mmpll3_gpll0_gpll0_div, 638 .num_parents = 5, 639 .ops = &clk_rcg2_ops, 640 }, 641 }; 642 643 static struct clk_rcg2 pclk0_clk_src = { 644 .cmd_rcgr = 0x2000, 645 .mnd_width = 8, 646 .hid_width = 5, 647 .parent_map = mmss_xo_dsi0pll_dsi1pll_map, 648 .clkr.hw.init = &(struct clk_init_data){ 649 .name = "pclk0_clk_src", 650 .parent_names = mmss_xo_dsi0pll_dsi1pll, 651 .num_parents = 3, 652 .ops = &clk_pixel_ops, 653 .flags = CLK_SET_RATE_PARENT, 654 }, 655 }; 656 657 static struct clk_rcg2 pclk1_clk_src = { 658 .cmd_rcgr = 0x2020, 659 .mnd_width = 8, 660 .hid_width = 5, 661 .parent_map = mmss_xo_dsi0pll_dsi1pll_map, 662 .clkr.hw.init = &(struct clk_init_data){ 663 .name = "pclk1_clk_src", 664 .parent_names = mmss_xo_dsi0pll_dsi1pll, 665 .num_parents = 3, 666 .ops = &clk_pixel_ops, 667 .flags = CLK_SET_RATE_PARENT, 668 }, 669 }; 670 671 static const struct freq_tbl ftbl_mdp_clk_src[] = { 672 F(85714286, P_GPLL0, 7, 0, 0), 673 F(100000000, P_GPLL0, 6, 0, 0), 674 F(150000000, P_GPLL0, 4, 0, 0), 675 F(171428571, P_GPLL0, 3.5, 0, 0), 676 F(200000000, P_GPLL0, 3, 0, 0), 677 F(275000000, P_MMPLL5, 3, 0, 0), 678 F(300000000, P_GPLL0, 2, 0, 0), 679 F(330000000, P_MMPLL5, 2.5, 0, 0), 680 F(412500000, P_MMPLL5, 2, 0, 0), 681 { } 682 }; 683 684 static struct clk_rcg2 mdp_clk_src = { 685 .cmd_rcgr = 0x2040, 686 .hid_width = 5, 687 .parent_map = mmss_xo_mmpll0_mmpll5_gpll0_gpll0_div_map, 688 .freq_tbl = ftbl_mdp_clk_src, 689 .clkr.hw.init = &(struct clk_init_data){ 690 .name = "mdp_clk_src", 691 .parent_names = mmss_xo_mmpll0_mmpll5_gpll0_gpll0_div, 692 .num_parents = 5, 693 .ops = &clk_rcg2_ops, 694 }, 695 }; 696 697 static struct freq_tbl extpclk_freq_tbl[] = { 698 { .src = P_HDMIPLL }, 699 { } 700 }; 701 702 static struct clk_rcg2 extpclk_clk_src = { 703 .cmd_rcgr = 0x2060, 704 .hid_width = 5, 705 .parent_map = mmss_xo_hdmi_map, 706 .freq_tbl = extpclk_freq_tbl, 707 .clkr.hw.init = &(struct clk_init_data){ 708 .name = "extpclk_clk_src", 709 .parent_names = mmss_xo_hdmi, 710 .num_parents = 2, 711 .ops = &clk_byte_ops, 712 .flags = CLK_SET_RATE_PARENT, 713 }, 714 }; 715 716 static struct freq_tbl ftbl_mdss_vsync_clk[] = { 717 F(19200000, P_XO, 1, 0, 0), 718 { } 719 }; 720 721 static struct clk_rcg2 vsync_clk_src = { 722 .cmd_rcgr = 0x2080, 723 .hid_width = 5, 724 .parent_map = mmss_xo_gpll0_gpll0_div_map, 725 .freq_tbl = ftbl_mdss_vsync_clk, 726 .clkr.hw.init = &(struct clk_init_data){ 727 .name = "vsync_clk_src", 728 .parent_names = mmss_xo_gpll0_gpll0_div, 729 .num_parents = 3, 730 .ops = &clk_rcg2_ops, 731 }, 732 }; 733 734 static struct freq_tbl ftbl_mdss_hdmi_clk[] = { 735 F(19200000, P_XO, 1, 0, 0), 736 { } 737 }; 738 739 static struct clk_rcg2 hdmi_clk_src = { 740 .cmd_rcgr = 0x2100, 741 .hid_width = 5, 742 .parent_map = mmss_xo_gpll0_gpll0_div_map, 743 .freq_tbl = ftbl_mdss_hdmi_clk, 744 .clkr.hw.init = &(struct clk_init_data){ 745 .name = "hdmi_clk_src", 746 .parent_names = mmss_xo_gpll0_gpll0_div, 747 .num_parents = 3, 748 .ops = &clk_rcg2_ops, 749 }, 750 }; 751 752 static struct clk_rcg2 byte0_clk_src = { 753 .cmd_rcgr = 0x2120, 754 .hid_width = 5, 755 .parent_map = mmss_xo_dsibyte_map, 756 .clkr.hw.init = &(struct clk_init_data){ 757 .name = "byte0_clk_src", 758 .parent_names = mmss_xo_dsibyte, 759 .num_parents = 3, 760 .ops = &clk_byte2_ops, 761 .flags = CLK_SET_RATE_PARENT, 762 }, 763 }; 764 765 static struct clk_rcg2 byte1_clk_src = { 766 .cmd_rcgr = 0x2140, 767 .hid_width = 5, 768 .parent_map = mmss_xo_dsibyte_map, 769 .clkr.hw.init = &(struct clk_init_data){ 770 .name = "byte1_clk_src", 771 .parent_names = mmss_xo_dsibyte, 772 .num_parents = 3, 773 .ops = &clk_byte2_ops, 774 .flags = CLK_SET_RATE_PARENT, 775 }, 776 }; 777 778 static struct freq_tbl ftbl_mdss_esc0_1_clk[] = { 779 F(19200000, P_XO, 1, 0, 0), 780 { } 781 }; 782 783 static struct clk_rcg2 esc0_clk_src = { 784 .cmd_rcgr = 0x2160, 785 .hid_width = 5, 786 .parent_map = mmss_xo_dsibyte_map, 787 .freq_tbl = ftbl_mdss_esc0_1_clk, 788 .clkr.hw.init = &(struct clk_init_data){ 789 .name = "esc0_clk_src", 790 .parent_names = mmss_xo_dsibyte, 791 .num_parents = 3, 792 .ops = &clk_rcg2_ops, 793 }, 794 }; 795 796 static struct clk_rcg2 esc1_clk_src = { 797 .cmd_rcgr = 0x2180, 798 .hid_width = 5, 799 .parent_map = mmss_xo_dsibyte_map, 800 .freq_tbl = ftbl_mdss_esc0_1_clk, 801 .clkr.hw.init = &(struct clk_init_data){ 802 .name = "esc1_clk_src", 803 .parent_names = mmss_xo_dsibyte, 804 .num_parents = 3, 805 .ops = &clk_rcg2_ops, 806 }, 807 }; 808 809 static const struct freq_tbl ftbl_camss_gp0_clk_src[] = { 810 F(10000, P_XO, 16, 1, 120), 811 F(24000, P_XO, 16, 1, 50), 812 F(6000000, P_GPLL0_DIV, 10, 1, 5), 813 F(12000000, P_GPLL0_DIV, 1, 1, 25), 814 F(13000000, P_GPLL0_DIV, 2, 13, 150), 815 F(24000000, P_GPLL0_DIV, 1, 2, 25), 816 { } 817 }; 818 819 static struct clk_rcg2 camss_gp0_clk_src = { 820 .cmd_rcgr = 0x3420, 821 .mnd_width = 8, 822 .hid_width = 5, 823 .parent_map = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div_map, 824 .freq_tbl = ftbl_camss_gp0_clk_src, 825 .clkr.hw.init = &(struct clk_init_data){ 826 .name = "camss_gp0_clk_src", 827 .parent_names = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div, 828 .num_parents = 5, 829 .ops = &clk_rcg2_ops, 830 }, 831 }; 832 833 static struct clk_rcg2 camss_gp1_clk_src = { 834 .cmd_rcgr = 0x3450, 835 .mnd_width = 8, 836 .hid_width = 5, 837 .parent_map = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div_map, 838 .freq_tbl = ftbl_camss_gp0_clk_src, 839 .clkr.hw.init = &(struct clk_init_data){ 840 .name = "camss_gp1_clk_src", 841 .parent_names = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div, 842 .num_parents = 5, 843 .ops = &clk_rcg2_ops, 844 }, 845 }; 846 847 static const struct freq_tbl ftbl_mclk0_clk_src[] = { 848 F(4800000, P_XO, 4, 0, 0), 849 F(6000000, P_GPLL0_DIV, 10, 1, 5), 850 F(8000000, P_GPLL0_DIV, 1, 2, 75), 851 F(9600000, P_XO, 2, 0, 0), 852 F(16666667, P_GPLL0_DIV, 2, 1, 9), 853 F(19200000, P_XO, 1, 0, 0), 854 F(24000000, P_GPLL0_DIV, 1, 2, 25), 855 F(33333333, P_GPLL0_DIV, 1, 1, 9), 856 F(48000000, P_GPLL0, 1, 2, 25), 857 F(66666667, P_GPLL0, 1, 1, 9), 858 { } 859 }; 860 861 static struct clk_rcg2 mclk0_clk_src = { 862 .cmd_rcgr = 0x3360, 863 .mnd_width = 8, 864 .hid_width = 5, 865 .parent_map = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div_map, 866 .freq_tbl = ftbl_mclk0_clk_src, 867 .clkr.hw.init = &(struct clk_init_data){ 868 .name = "mclk0_clk_src", 869 .parent_names = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div, 870 .num_parents = 5, 871 .ops = &clk_rcg2_ops, 872 }, 873 }; 874 875 static struct clk_rcg2 mclk1_clk_src = { 876 .cmd_rcgr = 0x3390, 877 .mnd_width = 8, 878 .hid_width = 5, 879 .parent_map = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div_map, 880 .freq_tbl = ftbl_mclk0_clk_src, 881 .clkr.hw.init = &(struct clk_init_data){ 882 .name = "mclk1_clk_src", 883 .parent_names = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div, 884 .num_parents = 5, 885 .ops = &clk_rcg2_ops, 886 }, 887 }; 888 889 static struct clk_rcg2 mclk2_clk_src = { 890 .cmd_rcgr = 0x33c0, 891 .mnd_width = 8, 892 .hid_width = 5, 893 .parent_map = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div_map, 894 .freq_tbl = ftbl_mclk0_clk_src, 895 .clkr.hw.init = &(struct clk_init_data){ 896 .name = "mclk2_clk_src", 897 .parent_names = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div, 898 .num_parents = 5, 899 .ops = &clk_rcg2_ops, 900 }, 901 }; 902 903 static struct clk_rcg2 mclk3_clk_src = { 904 .cmd_rcgr = 0x33f0, 905 .mnd_width = 8, 906 .hid_width = 5, 907 .parent_map = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div_map, 908 .freq_tbl = ftbl_mclk0_clk_src, 909 .clkr.hw.init = &(struct clk_init_data){ 910 .name = "mclk3_clk_src", 911 .parent_names = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div, 912 .num_parents = 5, 913 .ops = &clk_rcg2_ops, 914 }, 915 }; 916 917 static const struct freq_tbl ftbl_cci_clk_src[] = { 918 F(19200000, P_XO, 1, 0, 0), 919 F(37500000, P_GPLL0, 16, 0, 0), 920 F(50000000, P_GPLL0, 12, 0, 0), 921 F(100000000, P_GPLL0, 6, 0, 0), 922 { } 923 }; 924 925 static struct clk_rcg2 cci_clk_src = { 926 .cmd_rcgr = 0x3300, 927 .mnd_width = 8, 928 .hid_width = 5, 929 .parent_map = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div_map, 930 .freq_tbl = ftbl_cci_clk_src, 931 .clkr.hw.init = &(struct clk_init_data){ 932 .name = "cci_clk_src", 933 .parent_names = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div, 934 .num_parents = 5, 935 .ops = &clk_rcg2_ops, 936 }, 937 }; 938 939 static const struct freq_tbl ftbl_csi0phytimer_clk_src[] = { 940 F(100000000, P_GPLL0_DIV, 3, 0, 0), 941 F(200000000, P_GPLL0, 3, 0, 0), 942 F(266666667, P_MMPLL0, 3, 0, 0), 943 { } 944 }; 945 946 static struct clk_rcg2 csi0phytimer_clk_src = { 947 .cmd_rcgr = 0x3000, 948 .hid_width = 5, 949 .parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map, 950 .freq_tbl = ftbl_csi0phytimer_clk_src, 951 .clkr.hw.init = &(struct clk_init_data){ 952 .name = "csi0phytimer_clk_src", 953 .parent_names = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div, 954 .num_parents = 7, 955 .ops = &clk_rcg2_ops, 956 }, 957 }; 958 959 static struct clk_rcg2 csi1phytimer_clk_src = { 960 .cmd_rcgr = 0x3030, 961 .hid_width = 5, 962 .parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map, 963 .freq_tbl = ftbl_csi0phytimer_clk_src, 964 .clkr.hw.init = &(struct clk_init_data){ 965 .name = "csi1phytimer_clk_src", 966 .parent_names = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div, 967 .num_parents = 7, 968 .ops = &clk_rcg2_ops, 969 }, 970 }; 971 972 static struct clk_rcg2 csi2phytimer_clk_src = { 973 .cmd_rcgr = 0x3060, 974 .hid_width = 5, 975 .parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map, 976 .freq_tbl = ftbl_csi0phytimer_clk_src, 977 .clkr.hw.init = &(struct clk_init_data){ 978 .name = "csi2phytimer_clk_src", 979 .parent_names = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div, 980 .num_parents = 7, 981 .ops = &clk_rcg2_ops, 982 }, 983 }; 984 985 static const struct freq_tbl ftbl_csiphy0_3p_clk_src[] = { 986 F(100000000, P_GPLL0_DIV, 3, 0, 0), 987 F(200000000, P_GPLL0, 3, 0, 0), 988 F(320000000, P_MMPLL4, 3, 0, 0), 989 F(384000000, P_MMPLL4, 2.5, 0, 0), 990 { } 991 }; 992 993 static struct clk_rcg2 csiphy0_3p_clk_src = { 994 .cmd_rcgr = 0x3240, 995 .hid_width = 5, 996 .parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map, 997 .freq_tbl = ftbl_csiphy0_3p_clk_src, 998 .clkr.hw.init = &(struct clk_init_data){ 999 .name = "csiphy0_3p_clk_src", 1000 .parent_names = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div, 1001 .num_parents = 7, 1002 .ops = &clk_rcg2_ops, 1003 }, 1004 }; 1005 1006 static struct clk_rcg2 csiphy1_3p_clk_src = { 1007 .cmd_rcgr = 0x3260, 1008 .hid_width = 5, 1009 .parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map, 1010 .freq_tbl = ftbl_csiphy0_3p_clk_src, 1011 .clkr.hw.init = &(struct clk_init_data){ 1012 .name = "csiphy1_3p_clk_src", 1013 .parent_names = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div, 1014 .num_parents = 7, 1015 .ops = &clk_rcg2_ops, 1016 }, 1017 }; 1018 1019 static struct clk_rcg2 csiphy2_3p_clk_src = { 1020 .cmd_rcgr = 0x3280, 1021 .hid_width = 5, 1022 .parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map, 1023 .freq_tbl = ftbl_csiphy0_3p_clk_src, 1024 .clkr.hw.init = &(struct clk_init_data){ 1025 .name = "csiphy2_3p_clk_src", 1026 .parent_names = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div, 1027 .num_parents = 7, 1028 .ops = &clk_rcg2_ops, 1029 }, 1030 }; 1031 1032 static const struct freq_tbl ftbl_jpeg0_clk_src[] = { 1033 F(75000000, P_GPLL0_DIV, 4, 0, 0), 1034 F(150000000, P_GPLL0, 4, 0, 0), 1035 F(228571429, P_MMPLL0, 3.5, 0, 0), 1036 F(266666667, P_MMPLL0, 3, 0, 0), 1037 F(320000000, P_MMPLL0, 2.5, 0, 0), 1038 F(480000000, P_MMPLL4, 2, 0, 0), 1039 { } 1040 }; 1041 1042 static struct clk_rcg2 jpeg0_clk_src = { 1043 .cmd_rcgr = 0x3500, 1044 .hid_width = 5, 1045 .parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map, 1046 .freq_tbl = ftbl_jpeg0_clk_src, 1047 .clkr.hw.init = &(struct clk_init_data){ 1048 .name = "jpeg0_clk_src", 1049 .parent_names = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div, 1050 .num_parents = 7, 1051 .ops = &clk_rcg2_ops, 1052 }, 1053 }; 1054 1055 static const struct freq_tbl ftbl_jpeg2_clk_src[] = { 1056 F(75000000, P_GPLL0_DIV, 4, 0, 0), 1057 F(150000000, P_GPLL0, 4, 0, 0), 1058 F(228571429, P_MMPLL0, 3.5, 0, 0), 1059 F(266666667, P_MMPLL0, 3, 0, 0), 1060 F(320000000, P_MMPLL0, 2.5, 0, 0), 1061 { } 1062 }; 1063 1064 static struct clk_rcg2 jpeg2_clk_src = { 1065 .cmd_rcgr = 0x3540, 1066 .hid_width = 5, 1067 .parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map, 1068 .freq_tbl = ftbl_jpeg2_clk_src, 1069 .clkr.hw.init = &(struct clk_init_data){ 1070 .name = "jpeg2_clk_src", 1071 .parent_names = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div, 1072 .num_parents = 7, 1073 .ops = &clk_rcg2_ops, 1074 }, 1075 }; 1076 1077 static struct clk_rcg2 jpeg_dma_clk_src = { 1078 .cmd_rcgr = 0x3560, 1079 .hid_width = 5, 1080 .parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map, 1081 .freq_tbl = ftbl_jpeg0_clk_src, 1082 .clkr.hw.init = &(struct clk_init_data){ 1083 .name = "jpeg_dma_clk_src", 1084 .parent_names = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div, 1085 .num_parents = 7, 1086 .ops = &clk_rcg2_ops, 1087 }, 1088 }; 1089 1090 static const struct freq_tbl ftbl_vfe0_clk_src[] = { 1091 F(75000000, P_GPLL0_DIV, 4, 0, 0), 1092 F(100000000, P_GPLL0_DIV, 3, 0, 0), 1093 F(300000000, P_GPLL0, 2, 0, 0), 1094 F(320000000, P_MMPLL0, 2.5, 0, 0), 1095 F(480000000, P_MMPLL4, 2, 0, 0), 1096 F(600000000, P_GPLL0, 1, 0, 0), 1097 { } 1098 }; 1099 1100 static struct clk_rcg2 vfe0_clk_src = { 1101 .cmd_rcgr = 0x3600, 1102 .hid_width = 5, 1103 .parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map, 1104 .freq_tbl = ftbl_vfe0_clk_src, 1105 .clkr.hw.init = &(struct clk_init_data){ 1106 .name = "vfe0_clk_src", 1107 .parent_names = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div, 1108 .num_parents = 7, 1109 .ops = &clk_rcg2_ops, 1110 }, 1111 }; 1112 1113 static struct clk_rcg2 vfe1_clk_src = { 1114 .cmd_rcgr = 0x3620, 1115 .hid_width = 5, 1116 .parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map, 1117 .freq_tbl = ftbl_vfe0_clk_src, 1118 .clkr.hw.init = &(struct clk_init_data){ 1119 .name = "vfe1_clk_src", 1120 .parent_names = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div, 1121 .num_parents = 7, 1122 .ops = &clk_rcg2_ops, 1123 }, 1124 }; 1125 1126 static const struct freq_tbl ftbl_cpp_clk_src[] = { 1127 F(100000000, P_GPLL0_DIV, 3, 0, 0), 1128 F(200000000, P_GPLL0, 3, 0, 0), 1129 F(320000000, P_MMPLL0, 2.5, 0, 0), 1130 F(480000000, P_MMPLL4, 2, 0, 0), 1131 F(640000000, P_MMPLL4, 1.5, 0, 0), 1132 { } 1133 }; 1134 1135 static struct clk_rcg2 cpp_clk_src = { 1136 .cmd_rcgr = 0x3640, 1137 .hid_width = 5, 1138 .parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map, 1139 .freq_tbl = ftbl_cpp_clk_src, 1140 .clkr.hw.init = &(struct clk_init_data){ 1141 .name = "cpp_clk_src", 1142 .parent_names = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div, 1143 .num_parents = 7, 1144 .ops = &clk_rcg2_ops, 1145 }, 1146 }; 1147 1148 static const struct freq_tbl ftbl_csi0_clk_src[] = { 1149 F(100000000, P_GPLL0_DIV, 3, 0, 0), 1150 F(200000000, P_GPLL0, 3, 0, 0), 1151 F(266666667, P_MMPLL0, 3, 0, 0), 1152 F(480000000, P_MMPLL4, 2, 0, 0), 1153 F(600000000, P_GPLL0, 1, 0, 0), 1154 { } 1155 }; 1156 1157 static struct clk_rcg2 csi0_clk_src = { 1158 .cmd_rcgr = 0x3090, 1159 .hid_width = 5, 1160 .parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map, 1161 .freq_tbl = ftbl_csi0_clk_src, 1162 .clkr.hw.init = &(struct clk_init_data){ 1163 .name = "csi0_clk_src", 1164 .parent_names = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div, 1165 .num_parents = 7, 1166 .ops = &clk_rcg2_ops, 1167 }, 1168 }; 1169 1170 static struct clk_rcg2 csi1_clk_src = { 1171 .cmd_rcgr = 0x3100, 1172 .hid_width = 5, 1173 .parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map, 1174 .freq_tbl = ftbl_csi0_clk_src, 1175 .clkr.hw.init = &(struct clk_init_data){ 1176 .name = "csi1_clk_src", 1177 .parent_names = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div, 1178 .num_parents = 7, 1179 .ops = &clk_rcg2_ops, 1180 }, 1181 }; 1182 1183 static struct clk_rcg2 csi2_clk_src = { 1184 .cmd_rcgr = 0x3160, 1185 .hid_width = 5, 1186 .parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map, 1187 .freq_tbl = ftbl_csi0_clk_src, 1188 .clkr.hw.init = &(struct clk_init_data){ 1189 .name = "csi2_clk_src", 1190 .parent_names = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div, 1191 .num_parents = 7, 1192 .ops = &clk_rcg2_ops, 1193 }, 1194 }; 1195 1196 static struct clk_rcg2 csi3_clk_src = { 1197 .cmd_rcgr = 0x31c0, 1198 .hid_width = 5, 1199 .parent_map = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div_map, 1200 .freq_tbl = ftbl_csi0_clk_src, 1201 .clkr.hw.init = &(struct clk_init_data){ 1202 .name = "csi3_clk_src", 1203 .parent_names = mmss_xo_mmpll0_mmpll1_mmpll4_mmpll3_gpll0_gpll0_div, 1204 .num_parents = 7, 1205 .ops = &clk_rcg2_ops, 1206 }, 1207 }; 1208 1209 static const struct freq_tbl ftbl_fd_core_clk_src[] = { 1210 F(100000000, P_GPLL0_DIV, 3, 0, 0), 1211 F(200000000, P_GPLL0, 3, 0, 0), 1212 F(400000000, P_MMPLL0, 2, 0, 0), 1213 { } 1214 }; 1215 1216 static struct clk_rcg2 fd_core_clk_src = { 1217 .cmd_rcgr = 0x3b00, 1218 .hid_width = 5, 1219 .parent_map = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div_map, 1220 .freq_tbl = ftbl_fd_core_clk_src, 1221 .clkr.hw.init = &(struct clk_init_data){ 1222 .name = "fd_core_clk_src", 1223 .parent_names = mmss_xo_mmpll0_mmpll4_gpll0_gpll0_div, 1224 .num_parents = 5, 1225 .ops = &clk_rcg2_ops, 1226 }, 1227 }; 1228 1229 static struct clk_branch mmss_mmagic_ahb_clk = { 1230 .halt_reg = 0x5024, 1231 .clkr = { 1232 .enable_reg = 0x5024, 1233 .enable_mask = BIT(0), 1234 .hw.init = &(struct clk_init_data){ 1235 .name = "mmss_mmagic_ahb_clk", 1236 .parent_names = (const char *[]){ "ahb_clk_src" }, 1237 .num_parents = 1, 1238 .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 1239 .ops = &clk_branch2_ops, 1240 }, 1241 }, 1242 }; 1243 1244 static struct clk_branch mmss_mmagic_cfg_ahb_clk = { 1245 .halt_reg = 0x5054, 1246 .clkr = { 1247 .enable_reg = 0x5054, 1248 .enable_mask = BIT(0), 1249 .hw.init = &(struct clk_init_data){ 1250 .name = "mmss_mmagic_cfg_ahb_clk", 1251 .parent_names = (const char *[]){ "ahb_clk_src" }, 1252 .num_parents = 1, 1253 .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 1254 .ops = &clk_branch2_ops, 1255 }, 1256 }, 1257 }; 1258 1259 static struct clk_branch mmss_misc_ahb_clk = { 1260 .halt_reg = 0x5018, 1261 .clkr = { 1262 .enable_reg = 0x5018, 1263 .enable_mask = BIT(0), 1264 .hw.init = &(struct clk_init_data){ 1265 .name = "mmss_misc_ahb_clk", 1266 .parent_names = (const char *[]){ "ahb_clk_src" }, 1267 .num_parents = 1, 1268 .flags = CLK_SET_RATE_PARENT, 1269 .ops = &clk_branch2_ops, 1270 }, 1271 }, 1272 }; 1273 1274 static struct clk_branch mmss_misc_cxo_clk = { 1275 .halt_reg = 0x5014, 1276 .clkr = { 1277 .enable_reg = 0x5014, 1278 .enable_mask = BIT(0), 1279 .hw.init = &(struct clk_init_data){ 1280 .name = "mmss_misc_cxo_clk", 1281 .parent_names = (const char *[]){ "xo" }, 1282 .num_parents = 1, 1283 .ops = &clk_branch2_ops, 1284 }, 1285 }, 1286 }; 1287 1288 static struct clk_branch mmss_mmagic_maxi_clk = { 1289 .halt_reg = 0x5074, 1290 .clkr = { 1291 .enable_reg = 0x5074, 1292 .enable_mask = BIT(0), 1293 .hw.init = &(struct clk_init_data){ 1294 .name = "mmss_mmagic_maxi_clk", 1295 .parent_names = (const char *[]){ "maxi_clk_src" }, 1296 .num_parents = 1, 1297 .flags = CLK_SET_RATE_PARENT, 1298 .ops = &clk_branch2_ops, 1299 }, 1300 }, 1301 }; 1302 1303 static struct clk_branch mmagic_camss_axi_clk = { 1304 .halt_reg = 0x3c44, 1305 .clkr = { 1306 .enable_reg = 0x3c44, 1307 .enable_mask = BIT(0), 1308 .hw.init = &(struct clk_init_data){ 1309 .name = "mmagic_camss_axi_clk", 1310 .parent_names = (const char *[]){ "axi_clk_src" }, 1311 .num_parents = 1, 1312 .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 1313 .ops = &clk_branch2_ops, 1314 }, 1315 }, 1316 }; 1317 1318 static struct clk_branch mmagic_camss_noc_cfg_ahb_clk = { 1319 .halt_reg = 0x3c48, 1320 .clkr = { 1321 .enable_reg = 0x3c48, 1322 .enable_mask = BIT(0), 1323 .hw.init = &(struct clk_init_data){ 1324 .name = "mmagic_camss_noc_cfg_ahb_clk", 1325 .parent_names = (const char *[]){ "gcc_mmss_noc_cfg_ahb_clk" }, 1326 .num_parents = 1, 1327 .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 1328 .ops = &clk_branch2_ops, 1329 }, 1330 }, 1331 }; 1332 1333 static struct clk_branch smmu_vfe_ahb_clk = { 1334 .halt_reg = 0x3c04, 1335 .clkr = { 1336 .enable_reg = 0x3c04, 1337 .enable_mask = BIT(0), 1338 .hw.init = &(struct clk_init_data){ 1339 .name = "smmu_vfe_ahb_clk", 1340 .parent_names = (const char *[]){ "ahb_clk_src" }, 1341 .num_parents = 1, 1342 .flags = CLK_SET_RATE_PARENT, 1343 .ops = &clk_branch2_ops, 1344 }, 1345 }, 1346 }; 1347 1348 static struct clk_branch smmu_vfe_axi_clk = { 1349 .halt_reg = 0x3c08, 1350 .clkr = { 1351 .enable_reg = 0x3c08, 1352 .enable_mask = BIT(0), 1353 .hw.init = &(struct clk_init_data){ 1354 .name = "smmu_vfe_axi_clk", 1355 .parent_names = (const char *[]){ "axi_clk_src" }, 1356 .num_parents = 1, 1357 .flags = CLK_SET_RATE_PARENT, 1358 .ops = &clk_branch2_ops, 1359 }, 1360 }, 1361 }; 1362 1363 static struct clk_branch smmu_cpp_ahb_clk = { 1364 .halt_reg = 0x3c14, 1365 .clkr = { 1366 .enable_reg = 0x3c14, 1367 .enable_mask = BIT(0), 1368 .hw.init = &(struct clk_init_data){ 1369 .name = "smmu_cpp_ahb_clk", 1370 .parent_names = (const char *[]){ "ahb_clk_src" }, 1371 .num_parents = 1, 1372 .flags = CLK_SET_RATE_PARENT, 1373 .ops = &clk_branch2_ops, 1374 }, 1375 }, 1376 }; 1377 1378 static struct clk_branch smmu_cpp_axi_clk = { 1379 .halt_reg = 0x3c18, 1380 .clkr = { 1381 .enable_reg = 0x3c18, 1382 .enable_mask = BIT(0), 1383 .hw.init = &(struct clk_init_data){ 1384 .name = "smmu_cpp_axi_clk", 1385 .parent_names = (const char *[]){ "axi_clk_src" }, 1386 .num_parents = 1, 1387 .flags = CLK_SET_RATE_PARENT, 1388 .ops = &clk_branch2_ops, 1389 }, 1390 }, 1391 }; 1392 1393 static struct clk_branch smmu_jpeg_ahb_clk = { 1394 .halt_reg = 0x3c24, 1395 .clkr = { 1396 .enable_reg = 0x3c24, 1397 .enable_mask = BIT(0), 1398 .hw.init = &(struct clk_init_data){ 1399 .name = "smmu_jpeg_ahb_clk", 1400 .parent_names = (const char *[]){ "ahb_clk_src" }, 1401 .num_parents = 1, 1402 .flags = CLK_SET_RATE_PARENT, 1403 .ops = &clk_branch2_ops, 1404 }, 1405 }, 1406 }; 1407 1408 static struct clk_branch smmu_jpeg_axi_clk = { 1409 .halt_reg = 0x3c28, 1410 .clkr = { 1411 .enable_reg = 0x3c28, 1412 .enable_mask = BIT(0), 1413 .hw.init = &(struct clk_init_data){ 1414 .name = "smmu_jpeg_axi_clk", 1415 .parent_names = (const char *[]){ "axi_clk_src" }, 1416 .num_parents = 1, 1417 .flags = CLK_SET_RATE_PARENT, 1418 .ops = &clk_branch2_ops, 1419 }, 1420 }, 1421 }; 1422 1423 static struct clk_branch mmagic_mdss_axi_clk = { 1424 .halt_reg = 0x2474, 1425 .clkr = { 1426 .enable_reg = 0x2474, 1427 .enable_mask = BIT(0), 1428 .hw.init = &(struct clk_init_data){ 1429 .name = "mmagic_mdss_axi_clk", 1430 .parent_names = (const char *[]){ "axi_clk_src" }, 1431 .num_parents = 1, 1432 .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 1433 .ops = &clk_branch2_ops, 1434 }, 1435 }, 1436 }; 1437 1438 static struct clk_branch mmagic_mdss_noc_cfg_ahb_clk = { 1439 .halt_reg = 0x2478, 1440 .clkr = { 1441 .enable_reg = 0x2478, 1442 .enable_mask = BIT(0), 1443 .hw.init = &(struct clk_init_data){ 1444 .name = "mmagic_mdss_noc_cfg_ahb_clk", 1445 .parent_names = (const char *[]){ "gcc_mmss_noc_cfg_ahb_clk" }, 1446 .num_parents = 1, 1447 .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 1448 .ops = &clk_branch2_ops, 1449 }, 1450 }, 1451 }; 1452 1453 static struct clk_branch smmu_rot_ahb_clk = { 1454 .halt_reg = 0x2444, 1455 .clkr = { 1456 .enable_reg = 0x2444, 1457 .enable_mask = BIT(0), 1458 .hw.init = &(struct clk_init_data){ 1459 .name = "smmu_rot_ahb_clk", 1460 .parent_names = (const char *[]){ "ahb_clk_src" }, 1461 .num_parents = 1, 1462 .flags = CLK_SET_RATE_PARENT, 1463 .ops = &clk_branch2_ops, 1464 }, 1465 }, 1466 }; 1467 1468 static struct clk_branch smmu_rot_axi_clk = { 1469 .halt_reg = 0x2448, 1470 .clkr = { 1471 .enable_reg = 0x2448, 1472 .enable_mask = BIT(0), 1473 .hw.init = &(struct clk_init_data){ 1474 .name = "smmu_rot_axi_clk", 1475 .parent_names = (const char *[]){ "axi_clk_src" }, 1476 .num_parents = 1, 1477 .flags = CLK_SET_RATE_PARENT, 1478 .ops = &clk_branch2_ops, 1479 }, 1480 }, 1481 }; 1482 1483 static struct clk_branch smmu_mdp_ahb_clk = { 1484 .halt_reg = 0x2454, 1485 .clkr = { 1486 .enable_reg = 0x2454, 1487 .enable_mask = BIT(0), 1488 .hw.init = &(struct clk_init_data){ 1489 .name = "smmu_mdp_ahb_clk", 1490 .parent_names = (const char *[]){ "ahb_clk_src" }, 1491 .num_parents = 1, 1492 .flags = CLK_SET_RATE_PARENT, 1493 .ops = &clk_branch2_ops, 1494 }, 1495 }, 1496 }; 1497 1498 static struct clk_branch smmu_mdp_axi_clk = { 1499 .halt_reg = 0x2458, 1500 .clkr = { 1501 .enable_reg = 0x2458, 1502 .enable_mask = BIT(0), 1503 .hw.init = &(struct clk_init_data){ 1504 .name = "smmu_mdp_axi_clk", 1505 .parent_names = (const char *[]){ "axi_clk_src" }, 1506 .num_parents = 1, 1507 .flags = CLK_SET_RATE_PARENT, 1508 .ops = &clk_branch2_ops, 1509 }, 1510 }, 1511 }; 1512 1513 static struct clk_branch mmagic_video_axi_clk = { 1514 .halt_reg = 0x1194, 1515 .clkr = { 1516 .enable_reg = 0x1194, 1517 .enable_mask = BIT(0), 1518 .hw.init = &(struct clk_init_data){ 1519 .name = "mmagic_video_axi_clk", 1520 .parent_names = (const char *[]){ "axi_clk_src" }, 1521 .num_parents = 1, 1522 .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 1523 .ops = &clk_branch2_ops, 1524 }, 1525 }, 1526 }; 1527 1528 static struct clk_branch mmagic_video_noc_cfg_ahb_clk = { 1529 .halt_reg = 0x1198, 1530 .clkr = { 1531 .enable_reg = 0x1198, 1532 .enable_mask = BIT(0), 1533 .hw.init = &(struct clk_init_data){ 1534 .name = "mmagic_video_noc_cfg_ahb_clk", 1535 .parent_names = (const char *[]){ "gcc_mmss_noc_cfg_ahb_clk" }, 1536 .num_parents = 1, 1537 .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 1538 .ops = &clk_branch2_ops, 1539 }, 1540 }, 1541 }; 1542 1543 static struct clk_branch smmu_video_ahb_clk = { 1544 .halt_reg = 0x1174, 1545 .clkr = { 1546 .enable_reg = 0x1174, 1547 .enable_mask = BIT(0), 1548 .hw.init = &(struct clk_init_data){ 1549 .name = "smmu_video_ahb_clk", 1550 .parent_names = (const char *[]){ "ahb_clk_src" }, 1551 .num_parents = 1, 1552 .flags = CLK_SET_RATE_PARENT, 1553 .ops = &clk_branch2_ops, 1554 }, 1555 }, 1556 }; 1557 1558 static struct clk_branch smmu_video_axi_clk = { 1559 .halt_reg = 0x1178, 1560 .clkr = { 1561 .enable_reg = 0x1178, 1562 .enable_mask = BIT(0), 1563 .hw.init = &(struct clk_init_data){ 1564 .name = "smmu_video_axi_clk", 1565 .parent_names = (const char *[]){ "axi_clk_src" }, 1566 .num_parents = 1, 1567 .flags = CLK_SET_RATE_PARENT, 1568 .ops = &clk_branch2_ops, 1569 }, 1570 }, 1571 }; 1572 1573 static struct clk_branch mmagic_bimc_noc_cfg_ahb_clk = { 1574 .halt_reg = 0x5298, 1575 .clkr = { 1576 .enable_reg = 0x5298, 1577 .enable_mask = BIT(0), 1578 .hw.init = &(struct clk_init_data){ 1579 .name = "mmagic_bimc_noc_cfg_ahb_clk", 1580 .parent_names = (const char *[]){ "gcc_mmss_noc_cfg_ahb_clk" }, 1581 .num_parents = 1, 1582 .flags = CLK_SET_RATE_PARENT, 1583 .ops = &clk_branch2_ops, 1584 }, 1585 }, 1586 }; 1587 1588 static struct clk_branch gpu_gx_gfx3d_clk = { 1589 .halt_reg = 0x4028, 1590 .clkr = { 1591 .enable_reg = 0x4028, 1592 .enable_mask = BIT(0), 1593 .hw.init = &(struct clk_init_data){ 1594 .name = "gpu_gx_gfx3d_clk", 1595 .parent_names = (const char *[]){ "gfx3d_clk_src" }, 1596 .num_parents = 1, 1597 .flags = CLK_SET_RATE_PARENT, 1598 .ops = &clk_branch2_ops, 1599 }, 1600 }, 1601 }; 1602 1603 static struct clk_branch gpu_gx_rbbmtimer_clk = { 1604 .halt_reg = 0x40b0, 1605 .clkr = { 1606 .enable_reg = 0x40b0, 1607 .enable_mask = BIT(0), 1608 .hw.init = &(struct clk_init_data){ 1609 .name = "gpu_gx_rbbmtimer_clk", 1610 .parent_names = (const char *[]){ "rbbmtimer_clk_src" }, 1611 .num_parents = 1, 1612 .flags = CLK_SET_RATE_PARENT, 1613 .ops = &clk_branch2_ops, 1614 }, 1615 }, 1616 }; 1617 1618 static struct clk_branch gpu_ahb_clk = { 1619 .halt_reg = 0x403c, 1620 .clkr = { 1621 .enable_reg = 0x403c, 1622 .enable_mask = BIT(0), 1623 .hw.init = &(struct clk_init_data){ 1624 .name = "gpu_ahb_clk", 1625 .parent_names = (const char *[]){ "ahb_clk_src" }, 1626 .num_parents = 1, 1627 .flags = CLK_SET_RATE_PARENT, 1628 .ops = &clk_branch2_ops, 1629 }, 1630 }, 1631 }; 1632 1633 static struct clk_branch gpu_aon_isense_clk = { 1634 .halt_reg = 0x4044, 1635 .clkr = { 1636 .enable_reg = 0x4044, 1637 .enable_mask = BIT(0), 1638 .hw.init = &(struct clk_init_data){ 1639 .name = "gpu_aon_isense_clk", 1640 .parent_names = (const char *[]){ "isense_clk_src" }, 1641 .num_parents = 1, 1642 .flags = CLK_SET_RATE_PARENT, 1643 .ops = &clk_branch2_ops, 1644 }, 1645 }, 1646 }; 1647 1648 static struct clk_branch vmem_maxi_clk = { 1649 .halt_reg = 0x1204, 1650 .clkr = { 1651 .enable_reg = 0x1204, 1652 .enable_mask = BIT(0), 1653 .hw.init = &(struct clk_init_data){ 1654 .name = "vmem_maxi_clk", 1655 .parent_names = (const char *[]){ "maxi_clk_src" }, 1656 .num_parents = 1, 1657 .flags = CLK_SET_RATE_PARENT, 1658 .ops = &clk_branch2_ops, 1659 }, 1660 }, 1661 }; 1662 1663 static struct clk_branch vmem_ahb_clk = { 1664 .halt_reg = 0x1208, 1665 .clkr = { 1666 .enable_reg = 0x1208, 1667 .enable_mask = BIT(0), 1668 .hw.init = &(struct clk_init_data){ 1669 .name = "vmem_ahb_clk", 1670 .parent_names = (const char *[]){ "ahb_clk_src" }, 1671 .num_parents = 1, 1672 .flags = CLK_SET_RATE_PARENT, 1673 .ops = &clk_branch2_ops, 1674 }, 1675 }, 1676 }; 1677 1678 static struct clk_branch mmss_rbcpr_clk = { 1679 .halt_reg = 0x4084, 1680 .clkr = { 1681 .enable_reg = 0x4084, 1682 .enable_mask = BIT(0), 1683 .hw.init = &(struct clk_init_data){ 1684 .name = "mmss_rbcpr_clk", 1685 .parent_names = (const char *[]){ "rbcpr_clk_src" }, 1686 .num_parents = 1, 1687 .flags = CLK_SET_RATE_PARENT, 1688 .ops = &clk_branch2_ops, 1689 }, 1690 }, 1691 }; 1692 1693 static struct clk_branch mmss_rbcpr_ahb_clk = { 1694 .halt_reg = 0x4088, 1695 .clkr = { 1696 .enable_reg = 0x4088, 1697 .enable_mask = BIT(0), 1698 .hw.init = &(struct clk_init_data){ 1699 .name = "mmss_rbcpr_ahb_clk", 1700 .parent_names = (const char *[]){ "ahb_clk_src" }, 1701 .num_parents = 1, 1702 .flags = CLK_SET_RATE_PARENT, 1703 .ops = &clk_branch2_ops, 1704 }, 1705 }, 1706 }; 1707 1708 static struct clk_branch video_core_clk = { 1709 .halt_reg = 0x1028, 1710 .clkr = { 1711 .enable_reg = 0x1028, 1712 .enable_mask = BIT(0), 1713 .hw.init = &(struct clk_init_data){ 1714 .name = "video_core_clk", 1715 .parent_names = (const char *[]){ "video_core_clk_src" }, 1716 .num_parents = 1, 1717 .flags = CLK_SET_RATE_PARENT, 1718 .ops = &clk_branch2_ops, 1719 }, 1720 }, 1721 }; 1722 1723 static struct clk_branch video_axi_clk = { 1724 .halt_reg = 0x1034, 1725 .clkr = { 1726 .enable_reg = 0x1034, 1727 .enable_mask = BIT(0), 1728 .hw.init = &(struct clk_init_data){ 1729 .name = "video_axi_clk", 1730 .parent_names = (const char *[]){ "axi_clk_src" }, 1731 .num_parents = 1, 1732 .flags = CLK_SET_RATE_PARENT, 1733 .ops = &clk_branch2_ops, 1734 }, 1735 }, 1736 }; 1737 1738 static struct clk_branch video_maxi_clk = { 1739 .halt_reg = 0x1038, 1740 .clkr = { 1741 .enable_reg = 0x1038, 1742 .enable_mask = BIT(0), 1743 .hw.init = &(struct clk_init_data){ 1744 .name = "video_maxi_clk", 1745 .parent_names = (const char *[]){ "maxi_clk_src" }, 1746 .num_parents = 1, 1747 .flags = CLK_SET_RATE_PARENT, 1748 .ops = &clk_branch2_ops, 1749 }, 1750 }, 1751 }; 1752 1753 static struct clk_branch video_ahb_clk = { 1754 .halt_reg = 0x1030, 1755 .clkr = { 1756 .enable_reg = 0x1030, 1757 .enable_mask = BIT(0), 1758 .hw.init = &(struct clk_init_data){ 1759 .name = "video_ahb_clk", 1760 .parent_names = (const char *[]){ "ahb_clk_src" }, 1761 .num_parents = 1, 1762 .flags = CLK_SET_RATE_PARENT, 1763 .ops = &clk_branch2_ops, 1764 }, 1765 }, 1766 }; 1767 1768 static struct clk_branch video_subcore0_clk = { 1769 .halt_reg = 0x1048, 1770 .clkr = { 1771 .enable_reg = 0x1048, 1772 .enable_mask = BIT(0), 1773 .hw.init = &(struct clk_init_data){ 1774 .name = "video_subcore0_clk", 1775 .parent_names = (const char *[]){ "video_subcore0_clk_src" }, 1776 .num_parents = 1, 1777 .flags = CLK_SET_RATE_PARENT, 1778 .ops = &clk_branch2_ops, 1779 }, 1780 }, 1781 }; 1782 1783 static struct clk_branch video_subcore1_clk = { 1784 .halt_reg = 0x104c, 1785 .clkr = { 1786 .enable_reg = 0x104c, 1787 .enable_mask = BIT(0), 1788 .hw.init = &(struct clk_init_data){ 1789 .name = "video_subcore1_clk", 1790 .parent_names = (const char *[]){ "video_subcore1_clk_src" }, 1791 .num_parents = 1, 1792 .flags = CLK_SET_RATE_PARENT, 1793 .ops = &clk_branch2_ops, 1794 }, 1795 }, 1796 }; 1797 1798 static struct clk_branch mdss_ahb_clk = { 1799 .halt_reg = 0x2308, 1800 .clkr = { 1801 .enable_reg = 0x2308, 1802 .enable_mask = BIT(0), 1803 .hw.init = &(struct clk_init_data){ 1804 .name = "mdss_ahb_clk", 1805 .parent_names = (const char *[]){ "ahb_clk_src" }, 1806 .num_parents = 1, 1807 .flags = CLK_SET_RATE_PARENT, 1808 .ops = &clk_branch2_ops, 1809 }, 1810 }, 1811 }; 1812 1813 static struct clk_branch mdss_hdmi_ahb_clk = { 1814 .halt_reg = 0x230c, 1815 .clkr = { 1816 .enable_reg = 0x230c, 1817 .enable_mask = BIT(0), 1818 .hw.init = &(struct clk_init_data){ 1819 .name = "mdss_hdmi_ahb_clk", 1820 .parent_names = (const char *[]){ "ahb_clk_src" }, 1821 .num_parents = 1, 1822 .flags = CLK_SET_RATE_PARENT, 1823 .ops = &clk_branch2_ops, 1824 }, 1825 }, 1826 }; 1827 1828 static struct clk_branch mdss_axi_clk = { 1829 .halt_reg = 0x2310, 1830 .clkr = { 1831 .enable_reg = 0x2310, 1832 .enable_mask = BIT(0), 1833 .hw.init = &(struct clk_init_data){ 1834 .name = "mdss_axi_clk", 1835 .parent_names = (const char *[]){ "axi_clk_src" }, 1836 .num_parents = 1, 1837 .flags = CLK_SET_RATE_PARENT, 1838 .ops = &clk_branch2_ops, 1839 }, 1840 }, 1841 }; 1842 1843 static struct clk_branch mdss_pclk0_clk = { 1844 .halt_reg = 0x2314, 1845 .clkr = { 1846 .enable_reg = 0x2314, 1847 .enable_mask = BIT(0), 1848 .hw.init = &(struct clk_init_data){ 1849 .name = "mdss_pclk0_clk", 1850 .parent_names = (const char *[]){ "pclk0_clk_src" }, 1851 .num_parents = 1, 1852 .flags = CLK_SET_RATE_PARENT, 1853 .ops = &clk_branch2_ops, 1854 }, 1855 }, 1856 }; 1857 1858 static struct clk_branch mdss_pclk1_clk = { 1859 .halt_reg = 0x2318, 1860 .clkr = { 1861 .enable_reg = 0x2318, 1862 .enable_mask = BIT(0), 1863 .hw.init = &(struct clk_init_data){ 1864 .name = "mdss_pclk1_clk", 1865 .parent_names = (const char *[]){ "pclk1_clk_src" }, 1866 .num_parents = 1, 1867 .flags = CLK_SET_RATE_PARENT, 1868 .ops = &clk_branch2_ops, 1869 }, 1870 }, 1871 }; 1872 1873 static struct clk_branch mdss_mdp_clk = { 1874 .halt_reg = 0x231c, 1875 .clkr = { 1876 .enable_reg = 0x231c, 1877 .enable_mask = BIT(0), 1878 .hw.init = &(struct clk_init_data){ 1879 .name = "mdss_mdp_clk", 1880 .parent_names = (const char *[]){ "mdp_clk_src" }, 1881 .num_parents = 1, 1882 .flags = CLK_SET_RATE_PARENT, 1883 .ops = &clk_branch2_ops, 1884 }, 1885 }, 1886 }; 1887 1888 static struct clk_branch mdss_extpclk_clk = { 1889 .halt_reg = 0x2324, 1890 .clkr = { 1891 .enable_reg = 0x2324, 1892 .enable_mask = BIT(0), 1893 .hw.init = &(struct clk_init_data){ 1894 .name = "mdss_extpclk_clk", 1895 .parent_names = (const char *[]){ "extpclk_clk_src" }, 1896 .num_parents = 1, 1897 .flags = CLK_SET_RATE_PARENT, 1898 .ops = &clk_branch2_ops, 1899 }, 1900 }, 1901 }; 1902 1903 static struct clk_branch mdss_vsync_clk = { 1904 .halt_reg = 0x2328, 1905 .clkr = { 1906 .enable_reg = 0x2328, 1907 .enable_mask = BIT(0), 1908 .hw.init = &(struct clk_init_data){ 1909 .name = "mdss_vsync_clk", 1910 .parent_names = (const char *[]){ "vsync_clk_src" }, 1911 .num_parents = 1, 1912 .flags = CLK_SET_RATE_PARENT, 1913 .ops = &clk_branch2_ops, 1914 }, 1915 }, 1916 }; 1917 1918 static struct clk_branch mdss_hdmi_clk = { 1919 .halt_reg = 0x2338, 1920 .clkr = { 1921 .enable_reg = 0x2338, 1922 .enable_mask = BIT(0), 1923 .hw.init = &(struct clk_init_data){ 1924 .name = "mdss_hdmi_clk", 1925 .parent_names = (const char *[]){ "hdmi_clk_src" }, 1926 .num_parents = 1, 1927 .flags = CLK_SET_RATE_PARENT, 1928 .ops = &clk_branch2_ops, 1929 }, 1930 }, 1931 }; 1932 1933 static struct clk_branch mdss_byte0_clk = { 1934 .halt_reg = 0x233c, 1935 .clkr = { 1936 .enable_reg = 0x233c, 1937 .enable_mask = BIT(0), 1938 .hw.init = &(struct clk_init_data){ 1939 .name = "mdss_byte0_clk", 1940 .parent_names = (const char *[]){ "byte0_clk_src" }, 1941 .num_parents = 1, 1942 .flags = CLK_SET_RATE_PARENT, 1943 .ops = &clk_branch2_ops, 1944 }, 1945 }, 1946 }; 1947 1948 static struct clk_branch mdss_byte1_clk = { 1949 .halt_reg = 0x2340, 1950 .clkr = { 1951 .enable_reg = 0x2340, 1952 .enable_mask = BIT(0), 1953 .hw.init = &(struct clk_init_data){ 1954 .name = "mdss_byte1_clk", 1955 .parent_names = (const char *[]){ "byte1_clk_src" }, 1956 .num_parents = 1, 1957 .flags = CLK_SET_RATE_PARENT, 1958 .ops = &clk_branch2_ops, 1959 }, 1960 }, 1961 }; 1962 1963 static struct clk_branch mdss_esc0_clk = { 1964 .halt_reg = 0x2344, 1965 .clkr = { 1966 .enable_reg = 0x2344, 1967 .enable_mask = BIT(0), 1968 .hw.init = &(struct clk_init_data){ 1969 .name = "mdss_esc0_clk", 1970 .parent_names = (const char *[]){ "esc0_clk_src" }, 1971 .num_parents = 1, 1972 .flags = CLK_SET_RATE_PARENT, 1973 .ops = &clk_branch2_ops, 1974 }, 1975 }, 1976 }; 1977 1978 static struct clk_branch mdss_esc1_clk = { 1979 .halt_reg = 0x2348, 1980 .clkr = { 1981 .enable_reg = 0x2348, 1982 .enable_mask = BIT(0), 1983 .hw.init = &(struct clk_init_data){ 1984 .name = "mdss_esc1_clk", 1985 .parent_names = (const char *[]){ "esc1_clk_src" }, 1986 .num_parents = 1, 1987 .flags = CLK_SET_RATE_PARENT, 1988 .ops = &clk_branch2_ops, 1989 }, 1990 }, 1991 }; 1992 1993 static struct clk_branch camss_top_ahb_clk = { 1994 .halt_reg = 0x3484, 1995 .clkr = { 1996 .enable_reg = 0x3484, 1997 .enable_mask = BIT(0), 1998 .hw.init = &(struct clk_init_data){ 1999 .name = "camss_top_ahb_clk", 2000 .parent_names = (const char *[]){ "ahb_clk_src" }, 2001 .num_parents = 1, 2002 .flags = CLK_SET_RATE_PARENT, 2003 .ops = &clk_branch2_ops, 2004 }, 2005 }, 2006 }; 2007 2008 static struct clk_branch camss_ahb_clk = { 2009 .halt_reg = 0x348c, 2010 .clkr = { 2011 .enable_reg = 0x348c, 2012 .enable_mask = BIT(0), 2013 .hw.init = &(struct clk_init_data){ 2014 .name = "camss_ahb_clk", 2015 .parent_names = (const char *[]){ "ahb_clk_src" }, 2016 .num_parents = 1, 2017 .flags = CLK_SET_RATE_PARENT, 2018 .ops = &clk_branch2_ops, 2019 }, 2020 }, 2021 }; 2022 2023 static struct clk_branch camss_micro_ahb_clk = { 2024 .halt_reg = 0x3494, 2025 .clkr = { 2026 .enable_reg = 0x3494, 2027 .enable_mask = BIT(0), 2028 .hw.init = &(struct clk_init_data){ 2029 .name = "camss_micro_ahb_clk", 2030 .parent_names = (const char *[]){ "ahb_clk_src" }, 2031 .num_parents = 1, 2032 .flags = CLK_SET_RATE_PARENT, 2033 .ops = &clk_branch2_ops, 2034 }, 2035 }, 2036 }; 2037 2038 static struct clk_branch camss_gp0_clk = { 2039 .halt_reg = 0x3444, 2040 .clkr = { 2041 .enable_reg = 0x3444, 2042 .enable_mask = BIT(0), 2043 .hw.init = &(struct clk_init_data){ 2044 .name = "camss_gp0_clk", 2045 .parent_names = (const char *[]){ "camss_gp0_clk_src" }, 2046 .num_parents = 1, 2047 .flags = CLK_SET_RATE_PARENT, 2048 .ops = &clk_branch2_ops, 2049 }, 2050 }, 2051 }; 2052 2053 static struct clk_branch camss_gp1_clk = { 2054 .halt_reg = 0x3474, 2055 .clkr = { 2056 .enable_reg = 0x3474, 2057 .enable_mask = BIT(0), 2058 .hw.init = &(struct clk_init_data){ 2059 .name = "camss_gp1_clk", 2060 .parent_names = (const char *[]){ "camss_gp1_clk_src" }, 2061 .num_parents = 1, 2062 .flags = CLK_SET_RATE_PARENT, 2063 .ops = &clk_branch2_ops, 2064 }, 2065 }, 2066 }; 2067 2068 static struct clk_branch camss_mclk0_clk = { 2069 .halt_reg = 0x3384, 2070 .clkr = { 2071 .enable_reg = 0x3384, 2072 .enable_mask = BIT(0), 2073 .hw.init = &(struct clk_init_data){ 2074 .name = "camss_mclk0_clk", 2075 .parent_names = (const char *[]){ "mclk0_clk_src" }, 2076 .num_parents = 1, 2077 .flags = CLK_SET_RATE_PARENT, 2078 .ops = &clk_branch2_ops, 2079 }, 2080 }, 2081 }; 2082 2083 static struct clk_branch camss_mclk1_clk = { 2084 .halt_reg = 0x33b4, 2085 .clkr = { 2086 .enable_reg = 0x33b4, 2087 .enable_mask = BIT(0), 2088 .hw.init = &(struct clk_init_data){ 2089 .name = "camss_mclk1_clk", 2090 .parent_names = (const char *[]){ "mclk1_clk_src" }, 2091 .num_parents = 1, 2092 .flags = CLK_SET_RATE_PARENT, 2093 .ops = &clk_branch2_ops, 2094 }, 2095 }, 2096 }; 2097 2098 static struct clk_branch camss_mclk2_clk = { 2099 .halt_reg = 0x33e4, 2100 .clkr = { 2101 .enable_reg = 0x33e4, 2102 .enable_mask = BIT(0), 2103 .hw.init = &(struct clk_init_data){ 2104 .name = "camss_mclk2_clk", 2105 .parent_names = (const char *[]){ "mclk2_clk_src" }, 2106 .num_parents = 1, 2107 .flags = CLK_SET_RATE_PARENT, 2108 .ops = &clk_branch2_ops, 2109 }, 2110 }, 2111 }; 2112 2113 static struct clk_branch camss_mclk3_clk = { 2114 .halt_reg = 0x3414, 2115 .clkr = { 2116 .enable_reg = 0x3414, 2117 .enable_mask = BIT(0), 2118 .hw.init = &(struct clk_init_data){ 2119 .name = "camss_mclk3_clk", 2120 .parent_names = (const char *[]){ "mclk3_clk_src" }, 2121 .num_parents = 1, 2122 .flags = CLK_SET_RATE_PARENT, 2123 .ops = &clk_branch2_ops, 2124 }, 2125 }, 2126 }; 2127 2128 static struct clk_branch camss_cci_clk = { 2129 .halt_reg = 0x3344, 2130 .clkr = { 2131 .enable_reg = 0x3344, 2132 .enable_mask = BIT(0), 2133 .hw.init = &(struct clk_init_data){ 2134 .name = "camss_cci_clk", 2135 .parent_names = (const char *[]){ "cci_clk_src" }, 2136 .num_parents = 1, 2137 .flags = CLK_SET_RATE_PARENT, 2138 .ops = &clk_branch2_ops, 2139 }, 2140 }, 2141 }; 2142 2143 static struct clk_branch camss_cci_ahb_clk = { 2144 .halt_reg = 0x3348, 2145 .clkr = { 2146 .enable_reg = 0x3348, 2147 .enable_mask = BIT(0), 2148 .hw.init = &(struct clk_init_data){ 2149 .name = "camss_cci_ahb_clk", 2150 .parent_names = (const char *[]){ "ahb_clk_src" }, 2151 .num_parents = 1, 2152 .flags = CLK_SET_RATE_PARENT, 2153 .ops = &clk_branch2_ops, 2154 }, 2155 }, 2156 }; 2157 2158 static struct clk_branch camss_csi0phytimer_clk = { 2159 .halt_reg = 0x3024, 2160 .clkr = { 2161 .enable_reg = 0x3024, 2162 .enable_mask = BIT(0), 2163 .hw.init = &(struct clk_init_data){ 2164 .name = "camss_csi0phytimer_clk", 2165 .parent_names = (const char *[]){ "csi0phytimer_clk_src" }, 2166 .num_parents = 1, 2167 .flags = CLK_SET_RATE_PARENT, 2168 .ops = &clk_branch2_ops, 2169 }, 2170 }, 2171 }; 2172 2173 static struct clk_branch camss_csi1phytimer_clk = { 2174 .halt_reg = 0x3054, 2175 .clkr = { 2176 .enable_reg = 0x3054, 2177 .enable_mask = BIT(0), 2178 .hw.init = &(struct clk_init_data){ 2179 .name = "camss_csi1phytimer_clk", 2180 .parent_names = (const char *[]){ "csi1phytimer_clk_src" }, 2181 .num_parents = 1, 2182 .flags = CLK_SET_RATE_PARENT, 2183 .ops = &clk_branch2_ops, 2184 }, 2185 }, 2186 }; 2187 2188 static struct clk_branch camss_csi2phytimer_clk = { 2189 .halt_reg = 0x3084, 2190 .clkr = { 2191 .enable_reg = 0x3084, 2192 .enable_mask = BIT(0), 2193 .hw.init = &(struct clk_init_data){ 2194 .name = "camss_csi2phytimer_clk", 2195 .parent_names = (const char *[]){ "csi2phytimer_clk_src" }, 2196 .num_parents = 1, 2197 .flags = CLK_SET_RATE_PARENT, 2198 .ops = &clk_branch2_ops, 2199 }, 2200 }, 2201 }; 2202 2203 static struct clk_branch camss_csiphy0_3p_clk = { 2204 .halt_reg = 0x3234, 2205 .clkr = { 2206 .enable_reg = 0x3234, 2207 .enable_mask = BIT(0), 2208 .hw.init = &(struct clk_init_data){ 2209 .name = "camss_csiphy0_3p_clk", 2210 .parent_names = (const char *[]){ "csiphy0_3p_clk_src" }, 2211 .num_parents = 1, 2212 .flags = CLK_SET_RATE_PARENT, 2213 .ops = &clk_branch2_ops, 2214 }, 2215 }, 2216 }; 2217 2218 static struct clk_branch camss_csiphy1_3p_clk = { 2219 .halt_reg = 0x3254, 2220 .clkr = { 2221 .enable_reg = 0x3254, 2222 .enable_mask = BIT(0), 2223 .hw.init = &(struct clk_init_data){ 2224 .name = "camss_csiphy1_3p_clk", 2225 .parent_names = (const char *[]){ "csiphy1_3p_clk_src" }, 2226 .num_parents = 1, 2227 .flags = CLK_SET_RATE_PARENT, 2228 .ops = &clk_branch2_ops, 2229 }, 2230 }, 2231 }; 2232 2233 static struct clk_branch camss_csiphy2_3p_clk = { 2234 .halt_reg = 0x3274, 2235 .clkr = { 2236 .enable_reg = 0x3274, 2237 .enable_mask = BIT(0), 2238 .hw.init = &(struct clk_init_data){ 2239 .name = "camss_csiphy2_3p_clk", 2240 .parent_names = (const char *[]){ "csiphy2_3p_clk_src" }, 2241 .num_parents = 1, 2242 .flags = CLK_SET_RATE_PARENT, 2243 .ops = &clk_branch2_ops, 2244 }, 2245 }, 2246 }; 2247 2248 static struct clk_branch camss_jpeg0_clk = { 2249 .halt_reg = 0x35a8, 2250 .clkr = { 2251 .enable_reg = 0x35a8, 2252 .enable_mask = BIT(0), 2253 .hw.init = &(struct clk_init_data){ 2254 .name = "camss_jpeg0_clk", 2255 .parent_names = (const char *[]){ "jpeg0_clk_src" }, 2256 .num_parents = 1, 2257 .flags = CLK_SET_RATE_PARENT, 2258 .ops = &clk_branch2_ops, 2259 }, 2260 }, 2261 }; 2262 2263 static struct clk_branch camss_jpeg2_clk = { 2264 .halt_reg = 0x35b0, 2265 .clkr = { 2266 .enable_reg = 0x35b0, 2267 .enable_mask = BIT(0), 2268 .hw.init = &(struct clk_init_data){ 2269 .name = "camss_jpeg2_clk", 2270 .parent_names = (const char *[]){ "jpeg2_clk_src" }, 2271 .num_parents = 1, 2272 .flags = CLK_SET_RATE_PARENT, 2273 .ops = &clk_branch2_ops, 2274 }, 2275 }, 2276 }; 2277 2278 static struct clk_branch camss_jpeg_dma_clk = { 2279 .halt_reg = 0x35c0, 2280 .clkr = { 2281 .enable_reg = 0x35c0, 2282 .enable_mask = BIT(0), 2283 .hw.init = &(struct clk_init_data){ 2284 .name = "camss_jpeg_dma_clk", 2285 .parent_names = (const char *[]){ "jpeg_dma_clk_src" }, 2286 .num_parents = 1, 2287 .flags = CLK_SET_RATE_PARENT, 2288 .ops = &clk_branch2_ops, 2289 }, 2290 }, 2291 }; 2292 2293 static struct clk_branch camss_jpeg_ahb_clk = { 2294 .halt_reg = 0x35b4, 2295 .clkr = { 2296 .enable_reg = 0x35b4, 2297 .enable_mask = BIT(0), 2298 .hw.init = &(struct clk_init_data){ 2299 .name = "camss_jpeg_ahb_clk", 2300 .parent_names = (const char *[]){ "ahb_clk_src" }, 2301 .num_parents = 1, 2302 .flags = CLK_SET_RATE_PARENT, 2303 .ops = &clk_branch2_ops, 2304 }, 2305 }, 2306 }; 2307 2308 static struct clk_branch camss_jpeg_axi_clk = { 2309 .halt_reg = 0x35b8, 2310 .clkr = { 2311 .enable_reg = 0x35b8, 2312 .enable_mask = BIT(0), 2313 .hw.init = &(struct clk_init_data){ 2314 .name = "camss_jpeg_axi_clk", 2315 .parent_names = (const char *[]){ "axi_clk_src" }, 2316 .num_parents = 1, 2317 .flags = CLK_SET_RATE_PARENT, 2318 .ops = &clk_branch2_ops, 2319 }, 2320 }, 2321 }; 2322 2323 static struct clk_branch camss_vfe_ahb_clk = { 2324 .halt_reg = 0x36b8, 2325 .clkr = { 2326 .enable_reg = 0x36b8, 2327 .enable_mask = BIT(0), 2328 .hw.init = &(struct clk_init_data){ 2329 .name = "camss_vfe_ahb_clk", 2330 .parent_names = (const char *[]){ "ahb_clk_src" }, 2331 .num_parents = 1, 2332 .flags = CLK_SET_RATE_PARENT, 2333 .ops = &clk_branch2_ops, 2334 }, 2335 }, 2336 }; 2337 2338 static struct clk_branch camss_vfe_axi_clk = { 2339 .halt_reg = 0x36bc, 2340 .clkr = { 2341 .enable_reg = 0x36bc, 2342 .enable_mask = BIT(0), 2343 .hw.init = &(struct clk_init_data){ 2344 .name = "camss_vfe_axi_clk", 2345 .parent_names = (const char *[]){ "axi_clk_src" }, 2346 .num_parents = 1, 2347 .flags = CLK_SET_RATE_PARENT, 2348 .ops = &clk_branch2_ops, 2349 }, 2350 }, 2351 }; 2352 2353 static struct clk_branch camss_vfe0_clk = { 2354 .halt_reg = 0x36a8, 2355 .clkr = { 2356 .enable_reg = 0x36a8, 2357 .enable_mask = BIT(0), 2358 .hw.init = &(struct clk_init_data){ 2359 .name = "camss_vfe0_clk", 2360 .parent_names = (const char *[]){ "vfe0_clk_src" }, 2361 .num_parents = 1, 2362 .flags = CLK_SET_RATE_PARENT, 2363 .ops = &clk_branch2_ops, 2364 }, 2365 }, 2366 }; 2367 2368 static struct clk_branch camss_vfe0_stream_clk = { 2369 .halt_reg = 0x3720, 2370 .clkr = { 2371 .enable_reg = 0x3720, 2372 .enable_mask = BIT(0), 2373 .hw.init = &(struct clk_init_data){ 2374 .name = "camss_vfe0_stream_clk", 2375 .parent_names = (const char *[]){ "vfe0_clk_src" }, 2376 .num_parents = 1, 2377 .flags = CLK_SET_RATE_PARENT, 2378 .ops = &clk_branch2_ops, 2379 }, 2380 }, 2381 }; 2382 2383 static struct clk_branch camss_vfe0_ahb_clk = { 2384 .halt_reg = 0x3668, 2385 .clkr = { 2386 .enable_reg = 0x3668, 2387 .enable_mask = BIT(0), 2388 .hw.init = &(struct clk_init_data){ 2389 .name = "camss_vfe0_ahb_clk", 2390 .parent_names = (const char *[]){ "ahb_clk_src" }, 2391 .num_parents = 1, 2392 .flags = CLK_SET_RATE_PARENT, 2393 .ops = &clk_branch2_ops, 2394 }, 2395 }, 2396 }; 2397 2398 static struct clk_branch camss_vfe1_clk = { 2399 .halt_reg = 0x36ac, 2400 .clkr = { 2401 .enable_reg = 0x36ac, 2402 .enable_mask = BIT(0), 2403 .hw.init = &(struct clk_init_data){ 2404 .name = "camss_vfe1_clk", 2405 .parent_names = (const char *[]){ "vfe1_clk_src" }, 2406 .num_parents = 1, 2407 .flags = CLK_SET_RATE_PARENT, 2408 .ops = &clk_branch2_ops, 2409 }, 2410 }, 2411 }; 2412 2413 static struct clk_branch camss_vfe1_stream_clk = { 2414 .halt_reg = 0x3724, 2415 .clkr = { 2416 .enable_reg = 0x3724, 2417 .enable_mask = BIT(0), 2418 .hw.init = &(struct clk_init_data){ 2419 .name = "camss_vfe1_stream_clk", 2420 .parent_names = (const char *[]){ "vfe1_clk_src" }, 2421 .num_parents = 1, 2422 .flags = CLK_SET_RATE_PARENT, 2423 .ops = &clk_branch2_ops, 2424 }, 2425 }, 2426 }; 2427 2428 static struct clk_branch camss_vfe1_ahb_clk = { 2429 .halt_reg = 0x3678, 2430 .clkr = { 2431 .enable_reg = 0x3678, 2432 .enable_mask = BIT(0), 2433 .hw.init = &(struct clk_init_data){ 2434 .name = "camss_vfe1_ahb_clk", 2435 .parent_names = (const char *[]){ "ahb_clk_src" }, 2436 .num_parents = 1, 2437 .flags = CLK_SET_RATE_PARENT, 2438 .ops = &clk_branch2_ops, 2439 }, 2440 }, 2441 }; 2442 2443 static struct clk_branch camss_csi_vfe0_clk = { 2444 .halt_reg = 0x3704, 2445 .clkr = { 2446 .enable_reg = 0x3704, 2447 .enable_mask = BIT(0), 2448 .hw.init = &(struct clk_init_data){ 2449 .name = "camss_csi_vfe0_clk", 2450 .parent_names = (const char *[]){ "vfe0_clk_src" }, 2451 .num_parents = 1, 2452 .flags = CLK_SET_RATE_PARENT, 2453 .ops = &clk_branch2_ops, 2454 }, 2455 }, 2456 }; 2457 2458 static struct clk_branch camss_csi_vfe1_clk = { 2459 .halt_reg = 0x3714, 2460 .clkr = { 2461 .enable_reg = 0x3714, 2462 .enable_mask = BIT(0), 2463 .hw.init = &(struct clk_init_data){ 2464 .name = "camss_csi_vfe1_clk", 2465 .parent_names = (const char *[]){ "vfe1_clk_src" }, 2466 .num_parents = 1, 2467 .flags = CLK_SET_RATE_PARENT, 2468 .ops = &clk_branch2_ops, 2469 }, 2470 }, 2471 }; 2472 2473 static struct clk_branch camss_cpp_vbif_ahb_clk = { 2474 .halt_reg = 0x36c8, 2475 .clkr = { 2476 .enable_reg = 0x36c8, 2477 .enable_mask = BIT(0), 2478 .hw.init = &(struct clk_init_data){ 2479 .name = "camss_cpp_vbif_ahb_clk", 2480 .parent_names = (const char *[]){ "ahb_clk_src" }, 2481 .num_parents = 1, 2482 .flags = CLK_SET_RATE_PARENT, 2483 .ops = &clk_branch2_ops, 2484 }, 2485 }, 2486 }; 2487 2488 static struct clk_branch camss_cpp_axi_clk = { 2489 .halt_reg = 0x36c4, 2490 .clkr = { 2491 .enable_reg = 0x36c4, 2492 .enable_mask = BIT(0), 2493 .hw.init = &(struct clk_init_data){ 2494 .name = "camss_cpp_axi_clk", 2495 .parent_names = (const char *[]){ "axi_clk_src" }, 2496 .num_parents = 1, 2497 .flags = CLK_SET_RATE_PARENT, 2498 .ops = &clk_branch2_ops, 2499 }, 2500 }, 2501 }; 2502 2503 static struct clk_branch camss_cpp_clk = { 2504 .halt_reg = 0x36b0, 2505 .clkr = { 2506 .enable_reg = 0x36b0, 2507 .enable_mask = BIT(0), 2508 .hw.init = &(struct clk_init_data){ 2509 .name = "camss_cpp_clk", 2510 .parent_names = (const char *[]){ "cpp_clk_src" }, 2511 .num_parents = 1, 2512 .flags = CLK_SET_RATE_PARENT, 2513 .ops = &clk_branch2_ops, 2514 }, 2515 }, 2516 }; 2517 2518 static struct clk_branch camss_cpp_ahb_clk = { 2519 .halt_reg = 0x36b4, 2520 .clkr = { 2521 .enable_reg = 0x36b4, 2522 .enable_mask = BIT(0), 2523 .hw.init = &(struct clk_init_data){ 2524 .name = "camss_cpp_ahb_clk", 2525 .parent_names = (const char *[]){ "ahb_clk_src" }, 2526 .num_parents = 1, 2527 .flags = CLK_SET_RATE_PARENT, 2528 .ops = &clk_branch2_ops, 2529 }, 2530 }, 2531 }; 2532 2533 static struct clk_branch camss_csi0_clk = { 2534 .halt_reg = 0x30b4, 2535 .clkr = { 2536 .enable_reg = 0x30b4, 2537 .enable_mask = BIT(0), 2538 .hw.init = &(struct clk_init_data){ 2539 .name = "camss_csi0_clk", 2540 .parent_names = (const char *[]){ "csi0_clk_src" }, 2541 .num_parents = 1, 2542 .flags = CLK_SET_RATE_PARENT, 2543 .ops = &clk_branch2_ops, 2544 }, 2545 }, 2546 }; 2547 2548 static struct clk_branch camss_csi0_ahb_clk = { 2549 .halt_reg = 0x30bc, 2550 .clkr = { 2551 .enable_reg = 0x30bc, 2552 .enable_mask = BIT(0), 2553 .hw.init = &(struct clk_init_data){ 2554 .name = "camss_csi0_ahb_clk", 2555 .parent_names = (const char *[]){ "ahb_clk_src" }, 2556 .num_parents = 1, 2557 .flags = CLK_SET_RATE_PARENT, 2558 .ops = &clk_branch2_ops, 2559 }, 2560 }, 2561 }; 2562 2563 static struct clk_branch camss_csi0phy_clk = { 2564 .halt_reg = 0x30c4, 2565 .clkr = { 2566 .enable_reg = 0x30c4, 2567 .enable_mask = BIT(0), 2568 .hw.init = &(struct clk_init_data){ 2569 .name = "camss_csi0phy_clk", 2570 .parent_names = (const char *[]){ "csi0_clk_src" }, 2571 .num_parents = 1, 2572 .flags = CLK_SET_RATE_PARENT, 2573 .ops = &clk_branch2_ops, 2574 }, 2575 }, 2576 }; 2577 2578 static struct clk_branch camss_csi0rdi_clk = { 2579 .halt_reg = 0x30d4, 2580 .clkr = { 2581 .enable_reg = 0x30d4, 2582 .enable_mask = BIT(0), 2583 .hw.init = &(struct clk_init_data){ 2584 .name = "camss_csi0rdi_clk", 2585 .parent_names = (const char *[]){ "csi0_clk_src" }, 2586 .num_parents = 1, 2587 .flags = CLK_SET_RATE_PARENT, 2588 .ops = &clk_branch2_ops, 2589 }, 2590 }, 2591 }; 2592 2593 static struct clk_branch camss_csi0pix_clk = { 2594 .halt_reg = 0x30e4, 2595 .clkr = { 2596 .enable_reg = 0x30e4, 2597 .enable_mask = BIT(0), 2598 .hw.init = &(struct clk_init_data){ 2599 .name = "camss_csi0pix_clk", 2600 .parent_names = (const char *[]){ "csi0_clk_src" }, 2601 .num_parents = 1, 2602 .flags = CLK_SET_RATE_PARENT, 2603 .ops = &clk_branch2_ops, 2604 }, 2605 }, 2606 }; 2607 2608 static struct clk_branch camss_csi1_clk = { 2609 .halt_reg = 0x3124, 2610 .clkr = { 2611 .enable_reg = 0x3124, 2612 .enable_mask = BIT(0), 2613 .hw.init = &(struct clk_init_data){ 2614 .name = "camss_csi1_clk", 2615 .parent_names = (const char *[]){ "csi1_clk_src" }, 2616 .num_parents = 1, 2617 .flags = CLK_SET_RATE_PARENT, 2618 .ops = &clk_branch2_ops, 2619 }, 2620 }, 2621 }; 2622 2623 static struct clk_branch camss_csi1_ahb_clk = { 2624 .halt_reg = 0x3128, 2625 .clkr = { 2626 .enable_reg = 0x3128, 2627 .enable_mask = BIT(0), 2628 .hw.init = &(struct clk_init_data){ 2629 .name = "camss_csi1_ahb_clk", 2630 .parent_names = (const char *[]){ "ahb_clk_src" }, 2631 .num_parents = 1, 2632 .flags = CLK_SET_RATE_PARENT, 2633 .ops = &clk_branch2_ops, 2634 }, 2635 }, 2636 }; 2637 2638 static struct clk_branch camss_csi1phy_clk = { 2639 .halt_reg = 0x3134, 2640 .clkr = { 2641 .enable_reg = 0x3134, 2642 .enable_mask = BIT(0), 2643 .hw.init = &(struct clk_init_data){ 2644 .name = "camss_csi1phy_clk", 2645 .parent_names = (const char *[]){ "csi1_clk_src" }, 2646 .num_parents = 1, 2647 .flags = CLK_SET_RATE_PARENT, 2648 .ops = &clk_branch2_ops, 2649 }, 2650 }, 2651 }; 2652 2653 static struct clk_branch camss_csi1rdi_clk = { 2654 .halt_reg = 0x3144, 2655 .clkr = { 2656 .enable_reg = 0x3144, 2657 .enable_mask = BIT(0), 2658 .hw.init = &(struct clk_init_data){ 2659 .name = "camss_csi1rdi_clk", 2660 .parent_names = (const char *[]){ "csi1_clk_src" }, 2661 .num_parents = 1, 2662 .flags = CLK_SET_RATE_PARENT, 2663 .ops = &clk_branch2_ops, 2664 }, 2665 }, 2666 }; 2667 2668 static struct clk_branch camss_csi1pix_clk = { 2669 .halt_reg = 0x3154, 2670 .clkr = { 2671 .enable_reg = 0x3154, 2672 .enable_mask = BIT(0), 2673 .hw.init = &(struct clk_init_data){ 2674 .name = "camss_csi1pix_clk", 2675 .parent_names = (const char *[]){ "csi1_clk_src" }, 2676 .num_parents = 1, 2677 .flags = CLK_SET_RATE_PARENT, 2678 .ops = &clk_branch2_ops, 2679 }, 2680 }, 2681 }; 2682 2683 static struct clk_branch camss_csi2_clk = { 2684 .halt_reg = 0x3184, 2685 .clkr = { 2686 .enable_reg = 0x3184, 2687 .enable_mask = BIT(0), 2688 .hw.init = &(struct clk_init_data){ 2689 .name = "camss_csi2_clk", 2690 .parent_names = (const char *[]){ "csi2_clk_src" }, 2691 .num_parents = 1, 2692 .flags = CLK_SET_RATE_PARENT, 2693 .ops = &clk_branch2_ops, 2694 }, 2695 }, 2696 }; 2697 2698 static struct clk_branch camss_csi2_ahb_clk = { 2699 .halt_reg = 0x3188, 2700 .clkr = { 2701 .enable_reg = 0x3188, 2702 .enable_mask = BIT(0), 2703 .hw.init = &(struct clk_init_data){ 2704 .name = "camss_csi2_ahb_clk", 2705 .parent_names = (const char *[]){ "ahb_clk_src" }, 2706 .num_parents = 1, 2707 .flags = CLK_SET_RATE_PARENT, 2708 .ops = &clk_branch2_ops, 2709 }, 2710 }, 2711 }; 2712 2713 static struct clk_branch camss_csi2phy_clk = { 2714 .halt_reg = 0x3194, 2715 .clkr = { 2716 .enable_reg = 0x3194, 2717 .enable_mask = BIT(0), 2718 .hw.init = &(struct clk_init_data){ 2719 .name = "camss_csi2phy_clk", 2720 .parent_names = (const char *[]){ "csi2_clk_src" }, 2721 .num_parents = 1, 2722 .flags = CLK_SET_RATE_PARENT, 2723 .ops = &clk_branch2_ops, 2724 }, 2725 }, 2726 }; 2727 2728 static struct clk_branch camss_csi2rdi_clk = { 2729 .halt_reg = 0x31a4, 2730 .clkr = { 2731 .enable_reg = 0x31a4, 2732 .enable_mask = BIT(0), 2733 .hw.init = &(struct clk_init_data){ 2734 .name = "camss_csi2rdi_clk", 2735 .parent_names = (const char *[]){ "csi2_clk_src" }, 2736 .num_parents = 1, 2737 .flags = CLK_SET_RATE_PARENT, 2738 .ops = &clk_branch2_ops, 2739 }, 2740 }, 2741 }; 2742 2743 static struct clk_branch camss_csi2pix_clk = { 2744 .halt_reg = 0x31b4, 2745 .clkr = { 2746 .enable_reg = 0x31b4, 2747 .enable_mask = BIT(0), 2748 .hw.init = &(struct clk_init_data){ 2749 .name = "camss_csi2pix_clk", 2750 .parent_names = (const char *[]){ "csi2_clk_src" }, 2751 .num_parents = 1, 2752 .flags = CLK_SET_RATE_PARENT, 2753 .ops = &clk_branch2_ops, 2754 }, 2755 }, 2756 }; 2757 2758 static struct clk_branch camss_csi3_clk = { 2759 .halt_reg = 0x31e4, 2760 .clkr = { 2761 .enable_reg = 0x31e4, 2762 .enable_mask = BIT(0), 2763 .hw.init = &(struct clk_init_data){ 2764 .name = "camss_csi3_clk", 2765 .parent_names = (const char *[]){ "csi3_clk_src" }, 2766 .num_parents = 1, 2767 .flags = CLK_SET_RATE_PARENT, 2768 .ops = &clk_branch2_ops, 2769 }, 2770 }, 2771 }; 2772 2773 static struct clk_branch camss_csi3_ahb_clk = { 2774 .halt_reg = 0x31e8, 2775 .clkr = { 2776 .enable_reg = 0x31e8, 2777 .enable_mask = BIT(0), 2778 .hw.init = &(struct clk_init_data){ 2779 .name = "camss_csi3_ahb_clk", 2780 .parent_names = (const char *[]){ "ahb_clk_src" }, 2781 .num_parents = 1, 2782 .flags = CLK_SET_RATE_PARENT, 2783 .ops = &clk_branch2_ops, 2784 }, 2785 }, 2786 }; 2787 2788 static struct clk_branch camss_csi3phy_clk = { 2789 .halt_reg = 0x31f4, 2790 .clkr = { 2791 .enable_reg = 0x31f4, 2792 .enable_mask = BIT(0), 2793 .hw.init = &(struct clk_init_data){ 2794 .name = "camss_csi3phy_clk", 2795 .parent_names = (const char *[]){ "csi3_clk_src" }, 2796 .num_parents = 1, 2797 .flags = CLK_SET_RATE_PARENT, 2798 .ops = &clk_branch2_ops, 2799 }, 2800 }, 2801 }; 2802 2803 static struct clk_branch camss_csi3rdi_clk = { 2804 .halt_reg = 0x3204, 2805 .clkr = { 2806 .enable_reg = 0x3204, 2807 .enable_mask = BIT(0), 2808 .hw.init = &(struct clk_init_data){ 2809 .name = "camss_csi3rdi_clk", 2810 .parent_names = (const char *[]){ "csi3_clk_src" }, 2811 .num_parents = 1, 2812 .flags = CLK_SET_RATE_PARENT, 2813 .ops = &clk_branch2_ops, 2814 }, 2815 }, 2816 }; 2817 2818 static struct clk_branch camss_csi3pix_clk = { 2819 .halt_reg = 0x3214, 2820 .clkr = { 2821 .enable_reg = 0x3214, 2822 .enable_mask = BIT(0), 2823 .hw.init = &(struct clk_init_data){ 2824 .name = "camss_csi3pix_clk", 2825 .parent_names = (const char *[]){ "csi3_clk_src" }, 2826 .num_parents = 1, 2827 .flags = CLK_SET_RATE_PARENT, 2828 .ops = &clk_branch2_ops, 2829 }, 2830 }, 2831 }; 2832 2833 static struct clk_branch camss_ispif_ahb_clk = { 2834 .halt_reg = 0x3224, 2835 .clkr = { 2836 .enable_reg = 0x3224, 2837 .enable_mask = BIT(0), 2838 .hw.init = &(struct clk_init_data){ 2839 .name = "camss_ispif_ahb_clk", 2840 .parent_names = (const char *[]){ "ahb_clk_src" }, 2841 .num_parents = 1, 2842 .flags = CLK_SET_RATE_PARENT, 2843 .ops = &clk_branch2_ops, 2844 }, 2845 }, 2846 }; 2847 2848 static struct clk_branch fd_core_clk = { 2849 .halt_reg = 0x3b68, 2850 .clkr = { 2851 .enable_reg = 0x3b68, 2852 .enable_mask = BIT(0), 2853 .hw.init = &(struct clk_init_data){ 2854 .name = "fd_core_clk", 2855 .parent_names = (const char *[]){ "fd_core_clk_src" }, 2856 .num_parents = 1, 2857 .flags = CLK_SET_RATE_PARENT, 2858 .ops = &clk_branch2_ops, 2859 }, 2860 }, 2861 }; 2862 2863 static struct clk_branch fd_core_uar_clk = { 2864 .halt_reg = 0x3b6c, 2865 .clkr = { 2866 .enable_reg = 0x3b6c, 2867 .enable_mask = BIT(0), 2868 .hw.init = &(struct clk_init_data){ 2869 .name = "fd_core_uar_clk", 2870 .parent_names = (const char *[]){ "fd_core_clk_src" }, 2871 .num_parents = 1, 2872 .flags = CLK_SET_RATE_PARENT, 2873 .ops = &clk_branch2_ops, 2874 }, 2875 }, 2876 }; 2877 2878 static struct clk_branch fd_ahb_clk = { 2879 .halt_reg = 0x3ba74, 2880 .clkr = { 2881 .enable_reg = 0x3ba74, 2882 .enable_mask = BIT(0), 2883 .hw.init = &(struct clk_init_data){ 2884 .name = "fd_ahb_clk", 2885 .parent_names = (const char *[]){ "ahb_clk_src" }, 2886 .num_parents = 1, 2887 .flags = CLK_SET_RATE_PARENT, 2888 .ops = &clk_branch2_ops, 2889 }, 2890 }, 2891 }; 2892 2893 static struct clk_hw *mmcc_msm8996_hws[] = { 2894 &gpll0_div.hw, 2895 }; 2896 2897 static struct gdsc mmagic_bimc_gdsc = { 2898 .gdscr = 0x529c, 2899 .pd = { 2900 .name = "mmagic_bimc", 2901 }, 2902 .pwrsts = PWRSTS_OFF_ON, 2903 .flags = ALWAYS_ON, 2904 }; 2905 2906 static struct gdsc mmagic_video_gdsc = { 2907 .gdscr = 0x119c, 2908 .gds_hw_ctrl = 0x120c, 2909 .pd = { 2910 .name = "mmagic_video", 2911 }, 2912 .pwrsts = PWRSTS_OFF_ON, 2913 .flags = VOTABLE | ALWAYS_ON, 2914 }; 2915 2916 static struct gdsc mmagic_mdss_gdsc = { 2917 .gdscr = 0x247c, 2918 .gds_hw_ctrl = 0x2480, 2919 .pd = { 2920 .name = "mmagic_mdss", 2921 }, 2922 .pwrsts = PWRSTS_OFF_ON, 2923 .flags = VOTABLE | ALWAYS_ON, 2924 }; 2925 2926 static struct gdsc mmagic_camss_gdsc = { 2927 .gdscr = 0x3c4c, 2928 .gds_hw_ctrl = 0x3c50, 2929 .pd = { 2930 .name = "mmagic_camss", 2931 }, 2932 .pwrsts = PWRSTS_OFF_ON, 2933 .flags = VOTABLE | ALWAYS_ON, 2934 }; 2935 2936 static struct gdsc venus_gdsc = { 2937 .gdscr = 0x1024, 2938 .cxcs = (unsigned int []){ 0x1028, 0x1034, 0x1038 }, 2939 .cxc_count = 3, 2940 .pd = { 2941 .name = "venus", 2942 }, 2943 .parent = &mmagic_video_gdsc.pd, 2944 .pwrsts = PWRSTS_OFF_ON, 2945 }; 2946 2947 static struct gdsc venus_core0_gdsc = { 2948 .gdscr = 0x1040, 2949 .cxcs = (unsigned int []){ 0x1048 }, 2950 .cxc_count = 1, 2951 .pd = { 2952 .name = "venus_core0", 2953 }, 2954 .parent = &venus_gdsc.pd, 2955 .pwrsts = PWRSTS_OFF_ON, 2956 .flags = HW_CTRL, 2957 }; 2958 2959 static struct gdsc venus_core1_gdsc = { 2960 .gdscr = 0x1044, 2961 .cxcs = (unsigned int []){ 0x104c }, 2962 .cxc_count = 1, 2963 .pd = { 2964 .name = "venus_core1", 2965 }, 2966 .parent = &venus_gdsc.pd, 2967 .pwrsts = PWRSTS_OFF_ON, 2968 .flags = HW_CTRL, 2969 }; 2970 2971 static struct gdsc camss_gdsc = { 2972 .gdscr = 0x34a0, 2973 .cxcs = (unsigned int []){ 0x36bc, 0x36c4 }, 2974 .cxc_count = 2, 2975 .pd = { 2976 .name = "camss", 2977 }, 2978 .parent = &mmagic_camss_gdsc.pd, 2979 .pwrsts = PWRSTS_OFF_ON, 2980 }; 2981 2982 static struct gdsc vfe0_gdsc = { 2983 .gdscr = 0x3664, 2984 .cxcs = (unsigned int []){ 0x36a8 }, 2985 .cxc_count = 1, 2986 .pd = { 2987 .name = "vfe0", 2988 }, 2989 .parent = &camss_gdsc.pd, 2990 .pwrsts = PWRSTS_OFF_ON, 2991 }; 2992 2993 static struct gdsc vfe1_gdsc = { 2994 .gdscr = 0x3674, 2995 .cxcs = (unsigned int []){ 0x36ac }, 2996 .cxc_count = 1, 2997 .pd = { 2998 .name = "vfe1", 2999 }, 3000 .parent = &camss_gdsc.pd, 3001 .pwrsts = PWRSTS_OFF_ON, 3002 }; 3003 3004 static struct gdsc jpeg_gdsc = { 3005 .gdscr = 0x35a4, 3006 .cxcs = (unsigned int []){ 0x35a8, 0x35b0, 0x35c0, 0x35b8 }, 3007 .cxc_count = 4, 3008 .pd = { 3009 .name = "jpeg", 3010 }, 3011 .parent = &camss_gdsc.pd, 3012 .pwrsts = PWRSTS_OFF_ON, 3013 }; 3014 3015 static struct gdsc cpp_gdsc = { 3016 .gdscr = 0x36d4, 3017 .cxcs = (unsigned int []){ 0x36b0 }, 3018 .cxc_count = 1, 3019 .pd = { 3020 .name = "cpp", 3021 }, 3022 .parent = &camss_gdsc.pd, 3023 .pwrsts = PWRSTS_OFF_ON, 3024 }; 3025 3026 static struct gdsc fd_gdsc = { 3027 .gdscr = 0x3b64, 3028 .cxcs = (unsigned int []){ 0x3b68, 0x3b6c }, 3029 .cxc_count = 2, 3030 .pd = { 3031 .name = "fd", 3032 }, 3033 .parent = &camss_gdsc.pd, 3034 .pwrsts = PWRSTS_OFF_ON, 3035 }; 3036 3037 static struct gdsc mdss_gdsc = { 3038 .gdscr = 0x2304, 3039 .cxcs = (unsigned int []){ 0x2310, 0x231c }, 3040 .cxc_count = 2, 3041 .pd = { 3042 .name = "mdss", 3043 }, 3044 .parent = &mmagic_mdss_gdsc.pd, 3045 .pwrsts = PWRSTS_OFF_ON, 3046 }; 3047 3048 static struct gdsc gpu_gdsc = { 3049 .gdscr = 0x4034, 3050 .gds_hw_ctrl = 0x4038, 3051 .pd = { 3052 .name = "gpu", 3053 }, 3054 .pwrsts = PWRSTS_OFF_ON, 3055 .flags = VOTABLE, 3056 }; 3057 3058 static struct gdsc gpu_gx_gdsc = { 3059 .gdscr = 0x4024, 3060 .clamp_io_ctrl = 0x4300, 3061 .cxcs = (unsigned int []){ 0x4028 }, 3062 .cxc_count = 1, 3063 .pd = { 3064 .name = "gpu_gx", 3065 }, 3066 .pwrsts = PWRSTS_OFF_ON, 3067 .flags = CLAMP_IO, 3068 }; 3069 3070 static struct clk_regmap *mmcc_msm8996_clocks[] = { 3071 [MMPLL0_EARLY] = &mmpll0_early.clkr, 3072 [MMPLL0_PLL] = &mmpll0.clkr, 3073 [MMPLL1_EARLY] = &mmpll1_early.clkr, 3074 [MMPLL1_PLL] = &mmpll1.clkr, 3075 [MMPLL2_EARLY] = &mmpll2_early.clkr, 3076 [MMPLL2_PLL] = &mmpll2.clkr, 3077 [MMPLL3_EARLY] = &mmpll3_early.clkr, 3078 [MMPLL3_PLL] = &mmpll3.clkr, 3079 [MMPLL4_EARLY] = &mmpll4_early.clkr, 3080 [MMPLL4_PLL] = &mmpll4.clkr, 3081 [MMPLL5_EARLY] = &mmpll5_early.clkr, 3082 [MMPLL5_PLL] = &mmpll5.clkr, 3083 [MMPLL8_EARLY] = &mmpll8_early.clkr, 3084 [MMPLL8_PLL] = &mmpll8.clkr, 3085 [MMPLL9_EARLY] = &mmpll9_early.clkr, 3086 [MMPLL9_PLL] = &mmpll9.clkr, 3087 [AHB_CLK_SRC] = &ahb_clk_src.clkr, 3088 [AXI_CLK_SRC] = &axi_clk_src.clkr, 3089 [MAXI_CLK_SRC] = &maxi_clk_src.clkr, 3090 [GFX3D_CLK_SRC] = &gfx3d_clk_src.clkr, 3091 [RBBMTIMER_CLK_SRC] = &rbbmtimer_clk_src.clkr, 3092 [ISENSE_CLK_SRC] = &isense_clk_src.clkr, 3093 [RBCPR_CLK_SRC] = &rbcpr_clk_src.clkr, 3094 [VIDEO_CORE_CLK_SRC] = &video_core_clk_src.clkr, 3095 [VIDEO_SUBCORE0_CLK_SRC] = &video_subcore0_clk_src.clkr, 3096 [VIDEO_SUBCORE1_CLK_SRC] = &video_subcore1_clk_src.clkr, 3097 [PCLK0_CLK_SRC] = &pclk0_clk_src.clkr, 3098 [PCLK1_CLK_SRC] = &pclk1_clk_src.clkr, 3099 [MDP_CLK_SRC] = &mdp_clk_src.clkr, 3100 [EXTPCLK_CLK_SRC] = &extpclk_clk_src.clkr, 3101 [VSYNC_CLK_SRC] = &vsync_clk_src.clkr, 3102 [HDMI_CLK_SRC] = &hdmi_clk_src.clkr, 3103 [BYTE0_CLK_SRC] = &byte0_clk_src.clkr, 3104 [BYTE1_CLK_SRC] = &byte1_clk_src.clkr, 3105 [ESC0_CLK_SRC] = &esc0_clk_src.clkr, 3106 [ESC1_CLK_SRC] = &esc1_clk_src.clkr, 3107 [CAMSS_GP0_CLK_SRC] = &camss_gp0_clk_src.clkr, 3108 [CAMSS_GP1_CLK_SRC] = &camss_gp1_clk_src.clkr, 3109 [MCLK0_CLK_SRC] = &mclk0_clk_src.clkr, 3110 [MCLK1_CLK_SRC] = &mclk1_clk_src.clkr, 3111 [MCLK2_CLK_SRC] = &mclk2_clk_src.clkr, 3112 [MCLK3_CLK_SRC] = &mclk3_clk_src.clkr, 3113 [CCI_CLK_SRC] = &cci_clk_src.clkr, 3114 [CSI0PHYTIMER_CLK_SRC] = &csi0phytimer_clk_src.clkr, 3115 [CSI1PHYTIMER_CLK_SRC] = &csi1phytimer_clk_src.clkr, 3116 [CSI2PHYTIMER_CLK_SRC] = &csi2phytimer_clk_src.clkr, 3117 [CSIPHY0_3P_CLK_SRC] = &csiphy0_3p_clk_src.clkr, 3118 [CSIPHY1_3P_CLK_SRC] = &csiphy1_3p_clk_src.clkr, 3119 [CSIPHY2_3P_CLK_SRC] = &csiphy2_3p_clk_src.clkr, 3120 [JPEG0_CLK_SRC] = &jpeg0_clk_src.clkr, 3121 [JPEG2_CLK_SRC] = &jpeg2_clk_src.clkr, 3122 [JPEG_DMA_CLK_SRC] = &jpeg_dma_clk_src.clkr, 3123 [VFE0_CLK_SRC] = &vfe0_clk_src.clkr, 3124 [VFE1_CLK_SRC] = &vfe1_clk_src.clkr, 3125 [CPP_CLK_SRC] = &cpp_clk_src.clkr, 3126 [CSI0_CLK_SRC] = &csi0_clk_src.clkr, 3127 [CSI1_CLK_SRC] = &csi1_clk_src.clkr, 3128 [CSI2_CLK_SRC] = &csi2_clk_src.clkr, 3129 [CSI3_CLK_SRC] = &csi3_clk_src.clkr, 3130 [FD_CORE_CLK_SRC] = &fd_core_clk_src.clkr, 3131 [MMSS_MMAGIC_AHB_CLK] = &mmss_mmagic_ahb_clk.clkr, 3132 [MMSS_MMAGIC_CFG_AHB_CLK] = &mmss_mmagic_cfg_ahb_clk.clkr, 3133 [MMSS_MISC_AHB_CLK] = &mmss_misc_ahb_clk.clkr, 3134 [MMSS_MISC_CXO_CLK] = &mmss_misc_cxo_clk.clkr, 3135 [MMSS_MMAGIC_MAXI_CLK] = &mmss_mmagic_maxi_clk.clkr, 3136 [MMAGIC_CAMSS_AXI_CLK] = &mmagic_camss_axi_clk.clkr, 3137 [MMAGIC_CAMSS_NOC_CFG_AHB_CLK] = &mmagic_camss_noc_cfg_ahb_clk.clkr, 3138 [SMMU_VFE_AHB_CLK] = &smmu_vfe_ahb_clk.clkr, 3139 [SMMU_VFE_AXI_CLK] = &smmu_vfe_axi_clk.clkr, 3140 [SMMU_CPP_AHB_CLK] = &smmu_cpp_ahb_clk.clkr, 3141 [SMMU_CPP_AXI_CLK] = &smmu_cpp_axi_clk.clkr, 3142 [SMMU_JPEG_AHB_CLK] = &smmu_jpeg_ahb_clk.clkr, 3143 [SMMU_JPEG_AXI_CLK] = &smmu_jpeg_axi_clk.clkr, 3144 [MMAGIC_MDSS_AXI_CLK] = &mmagic_mdss_axi_clk.clkr, 3145 [MMAGIC_MDSS_NOC_CFG_AHB_CLK] = &mmagic_mdss_noc_cfg_ahb_clk.clkr, 3146 [SMMU_ROT_AHB_CLK] = &smmu_rot_ahb_clk.clkr, 3147 [SMMU_ROT_AXI_CLK] = &smmu_rot_axi_clk.clkr, 3148 [SMMU_MDP_AHB_CLK] = &smmu_mdp_ahb_clk.clkr, 3149 [SMMU_MDP_AXI_CLK] = &smmu_mdp_axi_clk.clkr, 3150 [MMAGIC_VIDEO_AXI_CLK] = &mmagic_video_axi_clk.clkr, 3151 [MMAGIC_VIDEO_NOC_CFG_AHB_CLK] = &mmagic_video_noc_cfg_ahb_clk.clkr, 3152 [SMMU_VIDEO_AHB_CLK] = &smmu_video_ahb_clk.clkr, 3153 [SMMU_VIDEO_AXI_CLK] = &smmu_video_axi_clk.clkr, 3154 [MMAGIC_BIMC_NOC_CFG_AHB_CLK] = &mmagic_bimc_noc_cfg_ahb_clk.clkr, 3155 [GPU_GX_GFX3D_CLK] = &gpu_gx_gfx3d_clk.clkr, 3156 [GPU_GX_RBBMTIMER_CLK] = &gpu_gx_rbbmtimer_clk.clkr, 3157 [GPU_AHB_CLK] = &gpu_ahb_clk.clkr, 3158 [GPU_AON_ISENSE_CLK] = &gpu_aon_isense_clk.clkr, 3159 [VMEM_MAXI_CLK] = &vmem_maxi_clk.clkr, 3160 [VMEM_AHB_CLK] = &vmem_ahb_clk.clkr, 3161 [MMSS_RBCPR_CLK] = &mmss_rbcpr_clk.clkr, 3162 [MMSS_RBCPR_AHB_CLK] = &mmss_rbcpr_ahb_clk.clkr, 3163 [VIDEO_CORE_CLK] = &video_core_clk.clkr, 3164 [VIDEO_AXI_CLK] = &video_axi_clk.clkr, 3165 [VIDEO_MAXI_CLK] = &video_maxi_clk.clkr, 3166 [VIDEO_AHB_CLK] = &video_ahb_clk.clkr, 3167 [VIDEO_SUBCORE0_CLK] = &video_subcore0_clk.clkr, 3168 [VIDEO_SUBCORE1_CLK] = &video_subcore1_clk.clkr, 3169 [MDSS_AHB_CLK] = &mdss_ahb_clk.clkr, 3170 [MDSS_HDMI_AHB_CLK] = &mdss_hdmi_ahb_clk.clkr, 3171 [MDSS_AXI_CLK] = &mdss_axi_clk.clkr, 3172 [MDSS_PCLK0_CLK] = &mdss_pclk0_clk.clkr, 3173 [MDSS_PCLK1_CLK] = &mdss_pclk1_clk.clkr, 3174 [MDSS_MDP_CLK] = &mdss_mdp_clk.clkr, 3175 [MDSS_EXTPCLK_CLK] = &mdss_extpclk_clk.clkr, 3176 [MDSS_VSYNC_CLK] = &mdss_vsync_clk.clkr, 3177 [MDSS_HDMI_CLK] = &mdss_hdmi_clk.clkr, 3178 [MDSS_BYTE0_CLK] = &mdss_byte0_clk.clkr, 3179 [MDSS_BYTE1_CLK] = &mdss_byte1_clk.clkr, 3180 [MDSS_ESC0_CLK] = &mdss_esc0_clk.clkr, 3181 [MDSS_ESC1_CLK] = &mdss_esc1_clk.clkr, 3182 [CAMSS_TOP_AHB_CLK] = &camss_top_ahb_clk.clkr, 3183 [CAMSS_AHB_CLK] = &camss_ahb_clk.clkr, 3184 [CAMSS_MICRO_AHB_CLK] = &camss_micro_ahb_clk.clkr, 3185 [CAMSS_GP0_CLK] = &camss_gp0_clk.clkr, 3186 [CAMSS_GP1_CLK] = &camss_gp1_clk.clkr, 3187 [CAMSS_MCLK0_CLK] = &camss_mclk0_clk.clkr, 3188 [CAMSS_MCLK1_CLK] = &camss_mclk1_clk.clkr, 3189 [CAMSS_MCLK2_CLK] = &camss_mclk2_clk.clkr, 3190 [CAMSS_MCLK3_CLK] = &camss_mclk3_clk.clkr, 3191 [CAMSS_CCI_CLK] = &camss_cci_clk.clkr, 3192 [CAMSS_CCI_AHB_CLK] = &camss_cci_ahb_clk.clkr, 3193 [CAMSS_CSI0PHYTIMER_CLK] = &camss_csi0phytimer_clk.clkr, 3194 [CAMSS_CSI1PHYTIMER_CLK] = &camss_csi1phytimer_clk.clkr, 3195 [CAMSS_CSI2PHYTIMER_CLK] = &camss_csi2phytimer_clk.clkr, 3196 [CAMSS_CSIPHY0_3P_CLK] = &camss_csiphy0_3p_clk.clkr, 3197 [CAMSS_CSIPHY1_3P_CLK] = &camss_csiphy1_3p_clk.clkr, 3198 [CAMSS_CSIPHY2_3P_CLK] = &camss_csiphy2_3p_clk.clkr, 3199 [CAMSS_JPEG0_CLK] = &camss_jpeg0_clk.clkr, 3200 [CAMSS_JPEG2_CLK] = &camss_jpeg2_clk.clkr, 3201 [CAMSS_JPEG_DMA_CLK] = &camss_jpeg_dma_clk.clkr, 3202 [CAMSS_JPEG_AHB_CLK] = &camss_jpeg_ahb_clk.clkr, 3203 [CAMSS_JPEG_AXI_CLK] = &camss_jpeg_axi_clk.clkr, 3204 [CAMSS_VFE_AHB_CLK] = &camss_vfe_ahb_clk.clkr, 3205 [CAMSS_VFE_AXI_CLK] = &camss_vfe_axi_clk.clkr, 3206 [CAMSS_VFE0_CLK] = &camss_vfe0_clk.clkr, 3207 [CAMSS_VFE0_STREAM_CLK] = &camss_vfe0_stream_clk.clkr, 3208 [CAMSS_VFE0_AHB_CLK] = &camss_vfe0_ahb_clk.clkr, 3209 [CAMSS_VFE1_CLK] = &camss_vfe1_clk.clkr, 3210 [CAMSS_VFE1_STREAM_CLK] = &camss_vfe1_stream_clk.clkr, 3211 [CAMSS_VFE1_AHB_CLK] = &camss_vfe1_ahb_clk.clkr, 3212 [CAMSS_CSI_VFE0_CLK] = &camss_csi_vfe0_clk.clkr, 3213 [CAMSS_CSI_VFE1_CLK] = &camss_csi_vfe1_clk.clkr, 3214 [CAMSS_CPP_VBIF_AHB_CLK] = &camss_cpp_vbif_ahb_clk.clkr, 3215 [CAMSS_CPP_AXI_CLK] = &camss_cpp_axi_clk.clkr, 3216 [CAMSS_CPP_CLK] = &camss_cpp_clk.clkr, 3217 [CAMSS_CPP_AHB_CLK] = &camss_cpp_ahb_clk.clkr, 3218 [CAMSS_CSI0_CLK] = &camss_csi0_clk.clkr, 3219 [CAMSS_CSI0_AHB_CLK] = &camss_csi0_ahb_clk.clkr, 3220 [CAMSS_CSI0PHY_CLK] = &camss_csi0phy_clk.clkr, 3221 [CAMSS_CSI0RDI_CLK] = &camss_csi0rdi_clk.clkr, 3222 [CAMSS_CSI0PIX_CLK] = &camss_csi0pix_clk.clkr, 3223 [CAMSS_CSI1_CLK] = &camss_csi1_clk.clkr, 3224 [CAMSS_CSI1_AHB_CLK] = &camss_csi1_ahb_clk.clkr, 3225 [CAMSS_CSI1PHY_CLK] = &camss_csi1phy_clk.clkr, 3226 [CAMSS_CSI1RDI_CLK] = &camss_csi1rdi_clk.clkr, 3227 [CAMSS_CSI1PIX_CLK] = &camss_csi1pix_clk.clkr, 3228 [CAMSS_CSI2_CLK] = &camss_csi2_clk.clkr, 3229 [CAMSS_CSI2_AHB_CLK] = &camss_csi2_ahb_clk.clkr, 3230 [CAMSS_CSI2PHY_CLK] = &camss_csi2phy_clk.clkr, 3231 [CAMSS_CSI2RDI_CLK] = &camss_csi2rdi_clk.clkr, 3232 [CAMSS_CSI2PIX_CLK] = &camss_csi2pix_clk.clkr, 3233 [CAMSS_CSI3_CLK] = &camss_csi3_clk.clkr, 3234 [CAMSS_CSI3_AHB_CLK] = &camss_csi3_ahb_clk.clkr, 3235 [CAMSS_CSI3PHY_CLK] = &camss_csi3phy_clk.clkr, 3236 [CAMSS_CSI3RDI_CLK] = &camss_csi3rdi_clk.clkr, 3237 [CAMSS_CSI3PIX_CLK] = &camss_csi3pix_clk.clkr, 3238 [CAMSS_ISPIF_AHB_CLK] = &camss_ispif_ahb_clk.clkr, 3239 [FD_CORE_CLK] = &fd_core_clk.clkr, 3240 [FD_CORE_UAR_CLK] = &fd_core_uar_clk.clkr, 3241 [FD_AHB_CLK] = &fd_ahb_clk.clkr, 3242 }; 3243 3244 static struct gdsc *mmcc_msm8996_gdscs[] = { 3245 [MMAGIC_BIMC_GDSC] = &mmagic_bimc_gdsc, 3246 [MMAGIC_VIDEO_GDSC] = &mmagic_video_gdsc, 3247 [MMAGIC_MDSS_GDSC] = &mmagic_mdss_gdsc, 3248 [MMAGIC_CAMSS_GDSC] = &mmagic_camss_gdsc, 3249 [VENUS_GDSC] = &venus_gdsc, 3250 [VENUS_CORE0_GDSC] = &venus_core0_gdsc, 3251 [VENUS_CORE1_GDSC] = &venus_core1_gdsc, 3252 [CAMSS_GDSC] = &camss_gdsc, 3253 [VFE0_GDSC] = &vfe0_gdsc, 3254 [VFE1_GDSC] = &vfe1_gdsc, 3255 [JPEG_GDSC] = &jpeg_gdsc, 3256 [CPP_GDSC] = &cpp_gdsc, 3257 [FD_GDSC] = &fd_gdsc, 3258 [MDSS_GDSC] = &mdss_gdsc, 3259 [GPU_GDSC] = &gpu_gdsc, 3260 [GPU_GX_GDSC] = &gpu_gx_gdsc, 3261 }; 3262 3263 static const struct qcom_reset_map mmcc_msm8996_resets[] = { 3264 [MMAGICAHB_BCR] = { 0x5020 }, 3265 [MMAGIC_CFG_BCR] = { 0x5050 }, 3266 [MISC_BCR] = { 0x5010 }, 3267 [BTO_BCR] = { 0x5030 }, 3268 [MMAGICAXI_BCR] = { 0x5060 }, 3269 [MMAGICMAXI_BCR] = { 0x5070 }, 3270 [DSA_BCR] = { 0x50a0 }, 3271 [MMAGIC_CAMSS_BCR] = { 0x3c40 }, 3272 [THROTTLE_CAMSS_BCR] = { 0x3c30 }, 3273 [SMMU_VFE_BCR] = { 0x3c00 }, 3274 [SMMU_CPP_BCR] = { 0x3c10 }, 3275 [SMMU_JPEG_BCR] = { 0x3c20 }, 3276 [MMAGIC_MDSS_BCR] = { 0x2470 }, 3277 [THROTTLE_MDSS_BCR] = { 0x2460 }, 3278 [SMMU_ROT_BCR] = { 0x2440 }, 3279 [SMMU_MDP_BCR] = { 0x2450 }, 3280 [MMAGIC_VIDEO_BCR] = { 0x1190 }, 3281 [THROTTLE_VIDEO_BCR] = { 0x1180 }, 3282 [SMMU_VIDEO_BCR] = { 0x1170 }, 3283 [MMAGIC_BIMC_BCR] = { 0x5290 }, 3284 [GPU_GX_BCR] = { 0x4020 }, 3285 [GPU_BCR] = { 0x4030 }, 3286 [GPU_AON_BCR] = { 0x4040 }, 3287 [VMEM_BCR] = { 0x1200 }, 3288 [MMSS_RBCPR_BCR] = { 0x4080 }, 3289 [VIDEO_BCR] = { 0x1020 }, 3290 [MDSS_BCR] = { 0x2300 }, 3291 [CAMSS_TOP_BCR] = { 0x3480 }, 3292 [CAMSS_AHB_BCR] = { 0x3488 }, 3293 [CAMSS_MICRO_BCR] = { 0x3490 }, 3294 [CAMSS_CCI_BCR] = { 0x3340 }, 3295 [CAMSS_PHY0_BCR] = { 0x3020 }, 3296 [CAMSS_PHY1_BCR] = { 0x3050 }, 3297 [CAMSS_PHY2_BCR] = { 0x3080 }, 3298 [CAMSS_CSIPHY0_3P_BCR] = { 0x3230 }, 3299 [CAMSS_CSIPHY1_3P_BCR] = { 0x3250 }, 3300 [CAMSS_CSIPHY2_3P_BCR] = { 0x3270 }, 3301 [CAMSS_JPEG_BCR] = { 0x35a0 }, 3302 [CAMSS_VFE_BCR] = { 0x36a0 }, 3303 [CAMSS_VFE0_BCR] = { 0x3660 }, 3304 [CAMSS_VFE1_BCR] = { 0x3670 }, 3305 [CAMSS_CSI_VFE0_BCR] = { 0x3700 }, 3306 [CAMSS_CSI_VFE1_BCR] = { 0x3710 }, 3307 [CAMSS_CPP_TOP_BCR] = { 0x36c0 }, 3308 [CAMSS_CPP_BCR] = { 0x36d0 }, 3309 [CAMSS_CSI0_BCR] = { 0x30b0 }, 3310 [CAMSS_CSI0RDI_BCR] = { 0x30d0 }, 3311 [CAMSS_CSI0PIX_BCR] = { 0x30e0 }, 3312 [CAMSS_CSI1_BCR] = { 0x3120 }, 3313 [CAMSS_CSI1RDI_BCR] = { 0x3140 }, 3314 [CAMSS_CSI1PIX_BCR] = { 0x3150 }, 3315 [CAMSS_CSI2_BCR] = { 0x3180 }, 3316 [CAMSS_CSI2RDI_BCR] = { 0x31a0 }, 3317 [CAMSS_CSI2PIX_BCR] = { 0x31b0 }, 3318 [CAMSS_CSI3_BCR] = { 0x31e0 }, 3319 [CAMSS_CSI3RDI_BCR] = { 0x3200 }, 3320 [CAMSS_CSI3PIX_BCR] = { 0x3210 }, 3321 [CAMSS_ISPIF_BCR] = { 0x3220 }, 3322 [FD_BCR] = { 0x3b60 }, 3323 [MMSS_SPDM_RM_BCR] = { 0x300 }, 3324 }; 3325 3326 static const struct regmap_config mmcc_msm8996_regmap_config = { 3327 .reg_bits = 32, 3328 .reg_stride = 4, 3329 .val_bits = 32, 3330 .max_register = 0xb008, 3331 .fast_io = true, 3332 }; 3333 3334 static const struct qcom_cc_desc mmcc_msm8996_desc = { 3335 .config = &mmcc_msm8996_regmap_config, 3336 .clks = mmcc_msm8996_clocks, 3337 .num_clks = ARRAY_SIZE(mmcc_msm8996_clocks), 3338 .resets = mmcc_msm8996_resets, 3339 .num_resets = ARRAY_SIZE(mmcc_msm8996_resets), 3340 .gdscs = mmcc_msm8996_gdscs, 3341 .num_gdscs = ARRAY_SIZE(mmcc_msm8996_gdscs), 3342 .clk_hws = mmcc_msm8996_hws, 3343 .num_clk_hws = ARRAY_SIZE(mmcc_msm8996_hws), 3344 }; 3345 3346 static const struct of_device_id mmcc_msm8996_match_table[] = { 3347 { .compatible = "qcom,mmcc-msm8996" }, 3348 { } 3349 }; 3350 MODULE_DEVICE_TABLE(of, mmcc_msm8996_match_table); 3351 3352 static int mmcc_msm8996_probe(struct platform_device *pdev) 3353 { 3354 struct regmap *regmap; 3355 3356 regmap = qcom_cc_map(pdev, &mmcc_msm8996_desc); 3357 if (IS_ERR(regmap)) 3358 return PTR_ERR(regmap); 3359 3360 /* Disable the AHB DCD */ 3361 regmap_update_bits(regmap, 0x50d8, BIT(31), 0); 3362 /* Disable the NoC FSM for mmss_mmagic_cfg_ahb_clk */ 3363 regmap_update_bits(regmap, 0x5054, BIT(15), 0); 3364 3365 return qcom_cc_really_probe(pdev, &mmcc_msm8996_desc, regmap); 3366 } 3367 3368 static struct platform_driver mmcc_msm8996_driver = { 3369 .probe = mmcc_msm8996_probe, 3370 .driver = { 3371 .name = "mmcc-msm8996", 3372 .of_match_table = mmcc_msm8996_match_table, 3373 }, 3374 }; 3375 module_platform_driver(mmcc_msm8996_driver); 3376 3377 MODULE_DESCRIPTION("QCOM MMCC MSM8996 Driver"); 3378 MODULE_LICENSE("GPL v2"); 3379 MODULE_ALIAS("platform:mmcc-msm8996"); 3380