1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved. 4 */ 5 6 #include <linux/clk-provider.h> 7 #include <linux/err.h> 8 #include <linux/kernel.h> 9 #include <linux/mod_devicetable.h> 10 #include <linux/module.h> 11 #include <linux/platform_device.h> 12 #include <linux/pm_runtime.h> 13 #include <linux/regmap.h> 14 15 #include <dt-bindings/clock/qcom,x1e80100-dispcc.h> 16 17 #include "common.h" 18 #include "clk-alpha-pll.h" 19 #include "clk-branch.h" 20 #include "clk-pll.h" 21 #include "clk-rcg.h" 22 #include "clk-regmap.h" 23 #include "clk-regmap-divider.h" 24 #include "reset.h" 25 #include "gdsc.h" 26 27 /* Need to match the order of clocks in DT binding */ 28 enum { 29 DT_BI_TCXO, 30 DT_BI_TCXO_AO, 31 DT_AHB_CLK, 32 DT_SLEEP_CLK, 33 34 DT_DSI0_PHY_PLL_OUT_BYTECLK, 35 DT_DSI0_PHY_PLL_OUT_DSICLK, 36 DT_DSI1_PHY_PLL_OUT_BYTECLK, 37 DT_DSI1_PHY_PLL_OUT_DSICLK, 38 39 DT_DP0_PHY_PLL_LINK_CLK, 40 DT_DP0_PHY_PLL_VCO_DIV_CLK, 41 DT_DP1_PHY_PLL_LINK_CLK, 42 DT_DP1_PHY_PLL_VCO_DIV_CLK, 43 DT_DP2_PHY_PLL_LINK_CLK, 44 DT_DP2_PHY_PLL_VCO_DIV_CLK, 45 DT_DP3_PHY_PLL_LINK_CLK, 46 DT_DP3_PHY_PLL_VCO_DIV_CLK, 47 }; 48 49 #define DISP_CC_MISC_CMD 0xF000 50 51 enum { 52 P_BI_TCXO, 53 P_BI_TCXO_AO, 54 P_DISP_CC_PLL0_OUT_MAIN, 55 P_DISP_CC_PLL1_OUT_EVEN, 56 P_DISP_CC_PLL1_OUT_MAIN, 57 P_DP0_PHY_PLL_LINK_CLK, 58 P_DP0_PHY_PLL_VCO_DIV_CLK, 59 P_DP1_PHY_PLL_LINK_CLK, 60 P_DP1_PHY_PLL_VCO_DIV_CLK, 61 P_DP2_PHY_PLL_LINK_CLK, 62 P_DP2_PHY_PLL_VCO_DIV_CLK, 63 P_DP3_PHY_PLL_LINK_CLK, 64 P_DP3_PHY_PLL_VCO_DIV_CLK, 65 P_DSI0_PHY_PLL_OUT_BYTECLK, 66 P_DSI0_PHY_PLL_OUT_DSICLK, 67 P_DSI1_PHY_PLL_OUT_BYTECLK, 68 P_DSI1_PHY_PLL_OUT_DSICLK, 69 P_SLEEP_CLK, 70 }; 71 72 static const struct pll_vco lucid_ole_vco[] = { 73 { 249600000, 2300000000, 0 }, 74 }; 75 76 static const struct alpha_pll_config disp_cc_pll0_config = { 77 .l = 0xd, 78 .alpha = 0x6492, 79 .config_ctl_val = 0x20485699, 80 .config_ctl_hi_val = 0x00182261, 81 .config_ctl_hi1_val = 0x82aa299c, 82 .test_ctl_val = 0x00000000, 83 .test_ctl_hi_val = 0x00000003, 84 .test_ctl_hi1_val = 0x00009000, 85 .test_ctl_hi2_val = 0x00000034, 86 .user_ctl_val = 0x00000000, 87 .user_ctl_hi_val = 0x00000005, 88 }; 89 90 static struct clk_alpha_pll disp_cc_pll0 = { 91 .offset = 0x0, 92 .vco_table = lucid_ole_vco, 93 .num_vco = ARRAY_SIZE(lucid_ole_vco), 94 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 95 .clkr = { 96 .hw.init = &(const struct clk_init_data) { 97 .name = "disp_cc_pll0", 98 .parent_data = &(const struct clk_parent_data) { 99 .index = DT_BI_TCXO, 100 }, 101 .num_parents = 1, 102 .ops = &clk_alpha_pll_reset_lucid_ole_ops, 103 }, 104 }, 105 }; 106 107 static const struct alpha_pll_config disp_cc_pll1_config = { 108 .l = 0x1f, 109 .alpha = 0x4000, 110 .config_ctl_val = 0x20485699, 111 .config_ctl_hi_val = 0x00182261, 112 .config_ctl_hi1_val = 0x82aa299c, 113 .test_ctl_val = 0x00000000, 114 .test_ctl_hi_val = 0x00000003, 115 .test_ctl_hi1_val = 0x00009000, 116 .test_ctl_hi2_val = 0x00000034, 117 .user_ctl_val = 0x00000000, 118 .user_ctl_hi_val = 0x00000005, 119 }; 120 121 static struct clk_alpha_pll disp_cc_pll1 = { 122 .offset = 0x1000, 123 .vco_table = lucid_ole_vco, 124 .num_vco = ARRAY_SIZE(lucid_ole_vco), 125 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 126 .clkr = { 127 .hw.init = &(const struct clk_init_data) { 128 .name = "disp_cc_pll1", 129 .parent_data = &(const struct clk_parent_data) { 130 .index = DT_BI_TCXO, 131 }, 132 .num_parents = 1, 133 .ops = &clk_alpha_pll_reset_lucid_ole_ops, 134 }, 135 }, 136 }; 137 138 static const struct parent_map disp_cc_parent_map_0[] = { 139 { P_BI_TCXO, 0 }, 140 { P_DP0_PHY_PLL_LINK_CLK, 1 }, 141 { P_DP0_PHY_PLL_VCO_DIV_CLK, 2 }, 142 { P_DP3_PHY_PLL_VCO_DIV_CLK, 3 }, 143 { P_DP1_PHY_PLL_VCO_DIV_CLK, 4 }, 144 { P_DP2_PHY_PLL_VCO_DIV_CLK, 6 }, 145 }; 146 147 static const struct clk_parent_data disp_cc_parent_data_0[] = { 148 { .index = DT_BI_TCXO }, 149 { .index = DT_DP0_PHY_PLL_LINK_CLK }, 150 { .index = DT_DP0_PHY_PLL_VCO_DIV_CLK }, 151 { .index = DT_DP3_PHY_PLL_VCO_DIV_CLK }, 152 { .index = DT_DP1_PHY_PLL_VCO_DIV_CLK }, 153 { .index = DT_DP2_PHY_PLL_VCO_DIV_CLK }, 154 }; 155 156 static const struct parent_map disp_cc_parent_map_1[] = { 157 { P_BI_TCXO, 0 }, 158 }; 159 160 static const struct clk_parent_data disp_cc_parent_data_1[] = { 161 { .index = DT_BI_TCXO }, 162 }; 163 164 static const struct clk_parent_data disp_cc_parent_data_1_ao[] = { 165 { .index = DT_BI_TCXO_AO }, 166 }; 167 168 static const struct parent_map disp_cc_parent_map_2[] = { 169 { P_BI_TCXO, 0 }, 170 { P_DSI0_PHY_PLL_OUT_DSICLK, 1 }, 171 { P_DSI0_PHY_PLL_OUT_BYTECLK, 2 }, 172 { P_DSI1_PHY_PLL_OUT_DSICLK, 3 }, 173 { P_DSI1_PHY_PLL_OUT_BYTECLK, 4 }, 174 }; 175 176 static const struct clk_parent_data disp_cc_parent_data_2[] = { 177 { .index = DT_BI_TCXO }, 178 { .index = DT_DSI0_PHY_PLL_OUT_DSICLK }, 179 { .index = DT_DSI0_PHY_PLL_OUT_BYTECLK }, 180 { .index = DT_DSI1_PHY_PLL_OUT_DSICLK }, 181 { .index = DT_DSI1_PHY_PLL_OUT_BYTECLK }, 182 }; 183 184 static const struct parent_map disp_cc_parent_map_3[] = { 185 { P_BI_TCXO, 0 }, 186 { P_DP0_PHY_PLL_LINK_CLK, 1 }, 187 { P_DP1_PHY_PLL_LINK_CLK, 2 }, 188 { P_DP2_PHY_PLL_LINK_CLK, 3 }, 189 { P_DP3_PHY_PLL_LINK_CLK, 4 }, 190 }; 191 192 static const struct clk_parent_data disp_cc_parent_data_3[] = { 193 { .index = DT_BI_TCXO }, 194 { .index = DT_DP0_PHY_PLL_LINK_CLK }, 195 { .index = DT_DP1_PHY_PLL_LINK_CLK }, 196 { .index = DT_DP2_PHY_PLL_LINK_CLK }, 197 { .index = DT_DP3_PHY_PLL_LINK_CLK }, 198 }; 199 200 static const struct parent_map disp_cc_parent_map_4[] = { 201 { P_BI_TCXO, 0 }, 202 { P_DSI0_PHY_PLL_OUT_BYTECLK, 2 }, 203 { P_DSI1_PHY_PLL_OUT_BYTECLK, 4 }, 204 }; 205 206 static const struct clk_parent_data disp_cc_parent_data_4[] = { 207 { .index = DT_BI_TCXO }, 208 { .index = DT_DSI0_PHY_PLL_OUT_BYTECLK }, 209 { .index = DT_DSI1_PHY_PLL_OUT_BYTECLK }, 210 }; 211 212 static const struct parent_map disp_cc_parent_map_5[] = { 213 { P_BI_TCXO, 0 }, 214 { P_DISP_CC_PLL1_OUT_MAIN, 4 }, 215 { P_DISP_CC_PLL1_OUT_EVEN, 6 }, 216 }; 217 218 static const struct clk_parent_data disp_cc_parent_data_5[] = { 219 { .index = DT_BI_TCXO }, 220 { .hw = &disp_cc_pll1.clkr.hw }, 221 { .hw = &disp_cc_pll1.clkr.hw }, 222 }; 223 224 static const struct parent_map disp_cc_parent_map_6[] = { 225 { P_BI_TCXO, 0 }, 226 { P_DISP_CC_PLL0_OUT_MAIN, 1 }, 227 { P_DISP_CC_PLL1_OUT_MAIN, 4 }, 228 { P_DISP_CC_PLL1_OUT_EVEN, 6 }, 229 }; 230 231 static const struct clk_parent_data disp_cc_parent_data_6[] = { 232 { .index = DT_BI_TCXO }, 233 { .hw = &disp_cc_pll0.clkr.hw }, 234 { .hw = &disp_cc_pll1.clkr.hw }, 235 { .hw = &disp_cc_pll1.clkr.hw }, 236 }; 237 238 static const struct parent_map disp_cc_parent_map_7[] = { 239 { P_SLEEP_CLK, 0 }, 240 }; 241 242 static const struct clk_parent_data disp_cc_parent_data_7[] = { 243 { .index = DT_SLEEP_CLK }, 244 }; 245 246 static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = { 247 F(19200000, P_BI_TCXO, 1, 0, 0), 248 F(37500000, P_DISP_CC_PLL1_OUT_MAIN, 16, 0, 0), 249 F(75000000, P_DISP_CC_PLL1_OUT_MAIN, 8, 0, 0), 250 { } 251 }; 252 253 static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = { 254 .cmd_rcgr = 0x82ec, 255 .mnd_width = 0, 256 .hid_width = 5, 257 .parent_map = disp_cc_parent_map_5, 258 .freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src, 259 .clkr.hw.init = &(const struct clk_init_data) { 260 .name = "disp_cc_mdss_ahb_clk_src", 261 .parent_data = disp_cc_parent_data_5, 262 .num_parents = ARRAY_SIZE(disp_cc_parent_data_5), 263 .flags = CLK_SET_RATE_PARENT, 264 .ops = &clk_rcg2_ops, 265 }, 266 }; 267 268 static const struct freq_tbl ftbl_disp_cc_mdss_byte0_clk_src[] = { 269 F(19200000, P_BI_TCXO, 1, 0, 0), 270 { } 271 }; 272 273 static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = { 274 .cmd_rcgr = 0x810c, 275 .mnd_width = 0, 276 .hid_width = 5, 277 .parent_map = disp_cc_parent_map_2, 278 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 279 .clkr.hw.init = &(const struct clk_init_data) { 280 .name = "disp_cc_mdss_byte0_clk_src", 281 .parent_data = disp_cc_parent_data_2, 282 .num_parents = ARRAY_SIZE(disp_cc_parent_data_2), 283 .flags = CLK_SET_RATE_PARENT, 284 .ops = &clk_byte2_ops, 285 }, 286 }; 287 288 static struct clk_rcg2 disp_cc_mdss_byte1_clk_src = { 289 .cmd_rcgr = 0x8128, 290 .mnd_width = 0, 291 .hid_width = 5, 292 .parent_map = disp_cc_parent_map_2, 293 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 294 .clkr.hw.init = &(const struct clk_init_data) { 295 .name = "disp_cc_mdss_byte1_clk_src", 296 .parent_data = disp_cc_parent_data_2, 297 .num_parents = ARRAY_SIZE(disp_cc_parent_data_2), 298 .flags = CLK_SET_RATE_PARENT, 299 .ops = &clk_byte2_ops, 300 }, 301 }; 302 303 static struct clk_rcg2 disp_cc_mdss_dptx0_aux_clk_src = { 304 .cmd_rcgr = 0x81c0, 305 .mnd_width = 0, 306 .hid_width = 5, 307 .parent_map = disp_cc_parent_map_1, 308 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 309 .clkr.hw.init = &(const struct clk_init_data) { 310 .name = "disp_cc_mdss_dptx0_aux_clk_src", 311 .parent_data = disp_cc_parent_data_1, 312 .num_parents = ARRAY_SIZE(disp_cc_parent_data_1), 313 .flags = CLK_SET_RATE_PARENT, 314 .ops = &clk_rcg2_ops, 315 }, 316 }; 317 318 static struct clk_rcg2 disp_cc_mdss_dptx0_link_clk_src = { 319 .cmd_rcgr = 0x8174, 320 .mnd_width = 0, 321 .hid_width = 5, 322 .parent_map = disp_cc_parent_map_3, 323 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 324 .clkr.hw.init = &(const struct clk_init_data) { 325 .name = "disp_cc_mdss_dptx0_link_clk_src", 326 .parent_data = disp_cc_parent_data_3, 327 .num_parents = ARRAY_SIZE(disp_cc_parent_data_3), 328 .flags = CLK_SET_RATE_PARENT, 329 .ops = &clk_byte2_ops, 330 }, 331 }; 332 333 static struct clk_rcg2 disp_cc_mdss_dptx0_pixel0_clk_src = { 334 .cmd_rcgr = 0x8190, 335 .mnd_width = 16, 336 .hid_width = 5, 337 .parent_map = disp_cc_parent_map_0, 338 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 339 .clkr.hw.init = &(const struct clk_init_data) { 340 .name = "disp_cc_mdss_dptx0_pixel0_clk_src", 341 .parent_data = disp_cc_parent_data_0, 342 .num_parents = ARRAY_SIZE(disp_cc_parent_data_0), 343 .flags = CLK_SET_RATE_PARENT, 344 .ops = &clk_dp_ops, 345 }, 346 }; 347 348 static struct clk_rcg2 disp_cc_mdss_dptx0_pixel1_clk_src = { 349 .cmd_rcgr = 0x81a8, 350 .mnd_width = 16, 351 .hid_width = 5, 352 .parent_map = disp_cc_parent_map_0, 353 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 354 .clkr.hw.init = &(const struct clk_init_data) { 355 .name = "disp_cc_mdss_dptx0_pixel1_clk_src", 356 .parent_data = disp_cc_parent_data_0, 357 .num_parents = ARRAY_SIZE(disp_cc_parent_data_0), 358 .flags = CLK_SET_RATE_PARENT, 359 .ops = &clk_dp_ops, 360 }, 361 }; 362 363 static struct clk_rcg2 disp_cc_mdss_dptx1_aux_clk_src = { 364 .cmd_rcgr = 0x8224, 365 .mnd_width = 0, 366 .hid_width = 5, 367 .parent_map = disp_cc_parent_map_1, 368 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 369 .clkr.hw.init = &(const struct clk_init_data) { 370 .name = "disp_cc_mdss_dptx1_aux_clk_src", 371 .parent_data = disp_cc_parent_data_1, 372 .num_parents = ARRAY_SIZE(disp_cc_parent_data_1), 373 .flags = CLK_SET_RATE_PARENT, 374 .ops = &clk_rcg2_ops, 375 }, 376 }; 377 378 static struct clk_rcg2 disp_cc_mdss_dptx1_link_clk_src = { 379 .cmd_rcgr = 0x8208, 380 .mnd_width = 0, 381 .hid_width = 5, 382 .parent_map = disp_cc_parent_map_3, 383 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 384 .clkr.hw.init = &(const struct clk_init_data) { 385 .name = "disp_cc_mdss_dptx1_link_clk_src", 386 .parent_data = disp_cc_parent_data_3, 387 .num_parents = ARRAY_SIZE(disp_cc_parent_data_3), 388 .flags = CLK_SET_RATE_PARENT, 389 .ops = &clk_byte2_ops, 390 }, 391 }; 392 393 static struct clk_rcg2 disp_cc_mdss_dptx1_pixel0_clk_src = { 394 .cmd_rcgr = 0x81d8, 395 .mnd_width = 16, 396 .hid_width = 5, 397 .parent_map = disp_cc_parent_map_0, 398 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 399 .clkr.hw.init = &(const struct clk_init_data) { 400 .name = "disp_cc_mdss_dptx1_pixel0_clk_src", 401 .parent_data = disp_cc_parent_data_0, 402 .num_parents = ARRAY_SIZE(disp_cc_parent_data_0), 403 .flags = CLK_SET_RATE_PARENT, 404 .ops = &clk_dp_ops, 405 }, 406 }; 407 408 static struct clk_rcg2 disp_cc_mdss_dptx1_pixel1_clk_src = { 409 .cmd_rcgr = 0x81f0, 410 .mnd_width = 16, 411 .hid_width = 5, 412 .parent_map = disp_cc_parent_map_0, 413 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 414 .clkr.hw.init = &(const struct clk_init_data) { 415 .name = "disp_cc_mdss_dptx1_pixel1_clk_src", 416 .parent_data = disp_cc_parent_data_0, 417 .num_parents = ARRAY_SIZE(disp_cc_parent_data_0), 418 .flags = CLK_SET_RATE_PARENT, 419 .ops = &clk_dp_ops, 420 }, 421 }; 422 423 static struct clk_rcg2 disp_cc_mdss_dptx2_aux_clk_src = { 424 .cmd_rcgr = 0x8288, 425 .mnd_width = 0, 426 .hid_width = 5, 427 .parent_map = disp_cc_parent_map_1, 428 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 429 .clkr.hw.init = &(const struct clk_init_data) { 430 .name = "disp_cc_mdss_dptx2_aux_clk_src", 431 .parent_data = disp_cc_parent_data_1, 432 .num_parents = ARRAY_SIZE(disp_cc_parent_data_1), 433 .flags = CLK_SET_RATE_PARENT, 434 .ops = &clk_rcg2_ops, 435 }, 436 }; 437 438 static struct clk_rcg2 disp_cc_mdss_dptx2_link_clk_src = { 439 .cmd_rcgr = 0x823c, 440 .mnd_width = 0, 441 .hid_width = 5, 442 .parent_map = disp_cc_parent_map_3, 443 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 444 .clkr.hw.init = &(const struct clk_init_data) { 445 .name = "disp_cc_mdss_dptx2_link_clk_src", 446 .parent_data = disp_cc_parent_data_3, 447 .num_parents = ARRAY_SIZE(disp_cc_parent_data_3), 448 .flags = CLK_SET_RATE_PARENT, 449 .ops = &clk_byte2_ops, 450 }, 451 }; 452 453 static struct clk_rcg2 disp_cc_mdss_dptx2_pixel0_clk_src = { 454 .cmd_rcgr = 0x8258, 455 .mnd_width = 16, 456 .hid_width = 5, 457 .parent_map = disp_cc_parent_map_0, 458 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 459 .clkr.hw.init = &(const struct clk_init_data) { 460 .name = "disp_cc_mdss_dptx2_pixel0_clk_src", 461 .parent_data = disp_cc_parent_data_0, 462 .num_parents = ARRAY_SIZE(disp_cc_parent_data_0), 463 .flags = CLK_SET_RATE_PARENT, 464 .ops = &clk_dp_ops, 465 }, 466 }; 467 468 static struct clk_rcg2 disp_cc_mdss_dptx2_pixel1_clk_src = { 469 .cmd_rcgr = 0x8270, 470 .mnd_width = 16, 471 .hid_width = 5, 472 .parent_map = disp_cc_parent_map_0, 473 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 474 .clkr.hw.init = &(const struct clk_init_data) { 475 .name = "disp_cc_mdss_dptx2_pixel1_clk_src", 476 .parent_data = disp_cc_parent_data_0, 477 .num_parents = ARRAY_SIZE(disp_cc_parent_data_0), 478 .flags = CLK_SET_RATE_PARENT, 479 .ops = &clk_dp_ops, 480 }, 481 }; 482 483 static struct clk_rcg2 disp_cc_mdss_dptx3_aux_clk_src = { 484 .cmd_rcgr = 0x82d4, 485 .mnd_width = 0, 486 .hid_width = 5, 487 .parent_map = disp_cc_parent_map_1, 488 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 489 .clkr.hw.init = &(const struct clk_init_data) { 490 .name = "disp_cc_mdss_dptx3_aux_clk_src", 491 .parent_data = disp_cc_parent_data_1, 492 .num_parents = ARRAY_SIZE(disp_cc_parent_data_1), 493 .flags = CLK_SET_RATE_PARENT, 494 .ops = &clk_rcg2_ops, 495 }, 496 }; 497 498 static struct clk_rcg2 disp_cc_mdss_dptx3_link_clk_src = { 499 .cmd_rcgr = 0x82b8, 500 .mnd_width = 0, 501 .hid_width = 5, 502 .parent_map = disp_cc_parent_map_3, 503 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 504 .clkr.hw.init = &(const struct clk_init_data) { 505 .name = "disp_cc_mdss_dptx3_link_clk_src", 506 .parent_data = disp_cc_parent_data_3, 507 .num_parents = ARRAY_SIZE(disp_cc_parent_data_3), 508 .flags = CLK_SET_RATE_PARENT, 509 .ops = &clk_byte2_ops, 510 }, 511 }; 512 513 static struct clk_rcg2 disp_cc_mdss_dptx3_pixel0_clk_src = { 514 .cmd_rcgr = 0x82a0, 515 .mnd_width = 16, 516 .hid_width = 5, 517 .parent_map = disp_cc_parent_map_0, 518 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 519 .clkr.hw.init = &(const struct clk_init_data) { 520 .name = "disp_cc_mdss_dptx3_pixel0_clk_src", 521 .parent_data = disp_cc_parent_data_0, 522 .num_parents = ARRAY_SIZE(disp_cc_parent_data_0), 523 .flags = CLK_SET_RATE_PARENT, 524 .ops = &clk_dp_ops, 525 }, 526 }; 527 528 static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = { 529 .cmd_rcgr = 0x8144, 530 .mnd_width = 0, 531 .hid_width = 5, 532 .parent_map = disp_cc_parent_map_4, 533 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 534 .clkr.hw.init = &(const struct clk_init_data) { 535 .name = "disp_cc_mdss_esc0_clk_src", 536 .parent_data = disp_cc_parent_data_4, 537 .num_parents = ARRAY_SIZE(disp_cc_parent_data_4), 538 .flags = CLK_SET_RATE_PARENT, 539 .ops = &clk_rcg2_ops, 540 }, 541 }; 542 543 static struct clk_rcg2 disp_cc_mdss_esc1_clk_src = { 544 .cmd_rcgr = 0x815c, 545 .mnd_width = 0, 546 .hid_width = 5, 547 .parent_map = disp_cc_parent_map_4, 548 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 549 .clkr.hw.init = &(const struct clk_init_data) { 550 .name = "disp_cc_mdss_esc1_clk_src", 551 .parent_data = disp_cc_parent_data_4, 552 .num_parents = ARRAY_SIZE(disp_cc_parent_data_4), 553 .flags = CLK_SET_RATE_PARENT, 554 .ops = &clk_rcg2_ops, 555 }, 556 }; 557 558 static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = { 559 F(19200000, P_BI_TCXO, 1, 0, 0), 560 F(85714286, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 561 F(100000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 562 F(150000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 563 F(172000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 564 F(200000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 565 F(325000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 566 F(375000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 567 F(514000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 568 F(575000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 569 { } 570 }; 571 572 static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = { 573 .cmd_rcgr = 0x80dc, 574 .mnd_width = 0, 575 .hid_width = 5, 576 .parent_map = disp_cc_parent_map_6, 577 .freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src, 578 .clkr.hw.init = &(const struct clk_init_data) { 579 .name = "disp_cc_mdss_mdp_clk_src", 580 .parent_data = disp_cc_parent_data_6, 581 .num_parents = ARRAY_SIZE(disp_cc_parent_data_6), 582 .flags = CLK_SET_RATE_PARENT, 583 .ops = &clk_rcg2_shared_ops, 584 }, 585 }; 586 587 static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = { 588 .cmd_rcgr = 0x80ac, 589 .mnd_width = 8, 590 .hid_width = 5, 591 .parent_map = disp_cc_parent_map_2, 592 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 593 .clkr.hw.init = &(const struct clk_init_data) { 594 .name = "disp_cc_mdss_pclk0_clk_src", 595 .parent_data = disp_cc_parent_data_2, 596 .num_parents = ARRAY_SIZE(disp_cc_parent_data_2), 597 .flags = CLK_SET_RATE_PARENT, 598 .ops = &clk_pixel_ops, 599 }, 600 }; 601 602 static struct clk_rcg2 disp_cc_mdss_pclk1_clk_src = { 603 .cmd_rcgr = 0x80c4, 604 .mnd_width = 8, 605 .hid_width = 5, 606 .parent_map = disp_cc_parent_map_2, 607 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 608 .clkr.hw.init = &(const struct clk_init_data) { 609 .name = "disp_cc_mdss_pclk1_clk_src", 610 .parent_data = disp_cc_parent_data_2, 611 .num_parents = ARRAY_SIZE(disp_cc_parent_data_2), 612 .flags = CLK_SET_RATE_PARENT, 613 .ops = &clk_pixel_ops, 614 }, 615 }; 616 617 static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = { 618 .cmd_rcgr = 0x80f4, 619 .mnd_width = 0, 620 .hid_width = 5, 621 .parent_map = disp_cc_parent_map_1, 622 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 623 .clkr.hw.init = &(const struct clk_init_data) { 624 .name = "disp_cc_mdss_vsync_clk_src", 625 .parent_data = disp_cc_parent_data_1, 626 .num_parents = ARRAY_SIZE(disp_cc_parent_data_1), 627 .flags = CLK_SET_RATE_PARENT, 628 .ops = &clk_rcg2_ops, 629 }, 630 }; 631 632 static const struct freq_tbl ftbl_disp_cc_sleep_clk_src[] = { 633 F(32000, P_SLEEP_CLK, 1, 0, 0), 634 { } 635 }; 636 637 static struct clk_rcg2 disp_cc_sleep_clk_src = { 638 .cmd_rcgr = 0xe05c, 639 .mnd_width = 0, 640 .hid_width = 5, 641 .parent_map = disp_cc_parent_map_7, 642 .freq_tbl = ftbl_disp_cc_sleep_clk_src, 643 .clkr.hw.init = &(const struct clk_init_data) { 644 .name = "disp_cc_sleep_clk_src", 645 .parent_data = disp_cc_parent_data_7, 646 .num_parents = ARRAY_SIZE(disp_cc_parent_data_7), 647 .flags = CLK_SET_RATE_PARENT, 648 .ops = &clk_rcg2_ops, 649 }, 650 }; 651 652 static struct clk_rcg2 disp_cc_xo_clk_src = { 653 .cmd_rcgr = 0xe03c, 654 .mnd_width = 0, 655 .hid_width = 5, 656 .parent_map = disp_cc_parent_map_1, 657 .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, 658 .clkr.hw.init = &(const struct clk_init_data) { 659 .name = "disp_cc_xo_clk_src", 660 .parent_data = disp_cc_parent_data_1_ao, 661 .num_parents = ARRAY_SIZE(disp_cc_parent_data_1_ao), 662 .flags = CLK_SET_RATE_PARENT, 663 .ops = &clk_rcg2_ops, 664 }, 665 }; 666 667 static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = { 668 .reg = 0x8124, 669 .shift = 0, 670 .width = 4, 671 .clkr.hw.init = &(const struct clk_init_data) { 672 .name = "disp_cc_mdss_byte0_div_clk_src", 673 .parent_hws = (const struct clk_hw*[]) { 674 &disp_cc_mdss_byte0_clk_src.clkr.hw, 675 }, 676 .num_parents = 1, 677 .flags = CLK_SET_RATE_PARENT, 678 .ops = &clk_regmap_div_ro_ops, 679 }, 680 }; 681 682 static struct clk_regmap_div disp_cc_mdss_byte1_div_clk_src = { 683 .reg = 0x8140, 684 .shift = 0, 685 .width = 4, 686 .clkr.hw.init = &(const struct clk_init_data) { 687 .name = "disp_cc_mdss_byte1_div_clk_src", 688 .parent_hws = (const struct clk_hw*[]) { 689 &disp_cc_mdss_byte1_clk_src.clkr.hw, 690 }, 691 .num_parents = 1, 692 .flags = CLK_SET_RATE_PARENT, 693 .ops = &clk_regmap_div_ro_ops, 694 }, 695 }; 696 697 static struct clk_regmap_div disp_cc_mdss_dptx0_link_div_clk_src = { 698 .reg = 0x818c, 699 .shift = 0, 700 .width = 4, 701 .clkr.hw.init = &(const struct clk_init_data) { 702 .name = "disp_cc_mdss_dptx0_link_div_clk_src", 703 .parent_hws = (const struct clk_hw*[]) { 704 &disp_cc_mdss_dptx0_link_clk_src.clkr.hw, 705 }, 706 .num_parents = 1, 707 .flags = CLK_SET_RATE_PARENT, 708 .ops = &clk_regmap_div_ro_ops, 709 }, 710 }; 711 712 static struct clk_regmap_div disp_cc_mdss_dptx1_link_div_clk_src = { 713 .reg = 0x8220, 714 .shift = 0, 715 .width = 4, 716 .clkr.hw.init = &(const struct clk_init_data) { 717 .name = "disp_cc_mdss_dptx1_link_div_clk_src", 718 .parent_hws = (const struct clk_hw*[]) { 719 &disp_cc_mdss_dptx1_link_clk_src.clkr.hw, 720 }, 721 .num_parents = 1, 722 .flags = CLK_SET_RATE_PARENT, 723 .ops = &clk_regmap_div_ro_ops, 724 }, 725 }; 726 727 static struct clk_regmap_div disp_cc_mdss_dptx2_link_div_clk_src = { 728 .reg = 0x8254, 729 .shift = 0, 730 .width = 4, 731 .clkr.hw.init = &(const struct clk_init_data) { 732 .name = "disp_cc_mdss_dptx2_link_div_clk_src", 733 .parent_hws = (const struct clk_hw*[]) { 734 &disp_cc_mdss_dptx2_link_clk_src.clkr.hw, 735 }, 736 .num_parents = 1, 737 .flags = CLK_SET_RATE_PARENT, 738 .ops = &clk_regmap_div_ro_ops, 739 }, 740 }; 741 742 static struct clk_regmap_div disp_cc_mdss_dptx3_link_div_clk_src = { 743 .reg = 0x82d0, 744 .shift = 0, 745 .width = 4, 746 .clkr.hw.init = &(const struct clk_init_data) { 747 .name = "disp_cc_mdss_dptx3_link_div_clk_src", 748 .parent_hws = (const struct clk_hw*[]) { 749 &disp_cc_mdss_dptx3_link_clk_src.clkr.hw, 750 }, 751 .num_parents = 1, 752 .flags = CLK_SET_RATE_PARENT, 753 .ops = &clk_regmap_div_ro_ops, 754 }, 755 }; 756 757 static struct clk_branch disp_cc_mdss_accu_clk = { 758 .halt_reg = 0xe058, 759 .halt_check = BRANCH_HALT_VOTED, 760 .clkr = { 761 .enable_reg = 0xe058, 762 .enable_mask = BIT(0), 763 .hw.init = &(const struct clk_init_data) { 764 .name = "disp_cc_mdss_accu_clk", 765 .parent_hws = (const struct clk_hw*[]) { 766 &disp_cc_xo_clk_src.clkr.hw, 767 }, 768 .num_parents = 1, 769 .flags = CLK_SET_RATE_PARENT, 770 .ops = &clk_branch2_ops, 771 }, 772 }, 773 }; 774 775 static struct clk_branch disp_cc_mdss_ahb1_clk = { 776 .halt_reg = 0xa020, 777 .halt_check = BRANCH_HALT, 778 .clkr = { 779 .enable_reg = 0xa020, 780 .enable_mask = BIT(0), 781 .hw.init = &(const struct clk_init_data) { 782 .name = "disp_cc_mdss_ahb1_clk", 783 .parent_hws = (const struct clk_hw*[]) { 784 &disp_cc_mdss_ahb_clk_src.clkr.hw, 785 }, 786 .num_parents = 1, 787 .flags = CLK_SET_RATE_PARENT, 788 .ops = &clk_branch2_ops, 789 }, 790 }, 791 }; 792 793 static struct clk_branch disp_cc_mdss_ahb_clk = { 794 .halt_reg = 0x80a8, 795 .halt_check = BRANCH_HALT, 796 .clkr = { 797 .enable_reg = 0x80a8, 798 .enable_mask = BIT(0), 799 .hw.init = &(const struct clk_init_data) { 800 .name = "disp_cc_mdss_ahb_clk", 801 .parent_hws = (const struct clk_hw*[]) { 802 &disp_cc_mdss_ahb_clk_src.clkr.hw, 803 }, 804 .num_parents = 1, 805 .flags = CLK_SET_RATE_PARENT, 806 .ops = &clk_branch2_ops, 807 }, 808 }, 809 }; 810 811 static struct clk_branch disp_cc_mdss_byte0_clk = { 812 .halt_reg = 0x8028, 813 .halt_check = BRANCH_HALT, 814 .clkr = { 815 .enable_reg = 0x8028, 816 .enable_mask = BIT(0), 817 .hw.init = &(const struct clk_init_data) { 818 .name = "disp_cc_mdss_byte0_clk", 819 .parent_hws = (const struct clk_hw*[]) { 820 &disp_cc_mdss_byte0_clk_src.clkr.hw, 821 }, 822 .num_parents = 1, 823 .flags = CLK_SET_RATE_PARENT, 824 .ops = &clk_branch2_ops, 825 }, 826 }, 827 }; 828 829 static struct clk_branch disp_cc_mdss_byte0_intf_clk = { 830 .halt_reg = 0x802c, 831 .halt_check = BRANCH_HALT, 832 .clkr = { 833 .enable_reg = 0x802c, 834 .enable_mask = BIT(0), 835 .hw.init = &(const struct clk_init_data) { 836 .name = "disp_cc_mdss_byte0_intf_clk", 837 .parent_hws = (const struct clk_hw*[]) { 838 &disp_cc_mdss_byte0_div_clk_src.clkr.hw, 839 }, 840 .num_parents = 1, 841 .flags = CLK_SET_RATE_PARENT, 842 .ops = &clk_branch2_ops, 843 }, 844 }, 845 }; 846 847 static struct clk_branch disp_cc_mdss_byte1_clk = { 848 .halt_reg = 0x8030, 849 .halt_check = BRANCH_HALT, 850 .clkr = { 851 .enable_reg = 0x8030, 852 .enable_mask = BIT(0), 853 .hw.init = &(const struct clk_init_data) { 854 .name = "disp_cc_mdss_byte1_clk", 855 .parent_hws = (const struct clk_hw*[]) { 856 &disp_cc_mdss_byte1_clk_src.clkr.hw, 857 }, 858 .num_parents = 1, 859 .flags = CLK_SET_RATE_PARENT, 860 .ops = &clk_branch2_ops, 861 }, 862 }, 863 }; 864 865 static struct clk_branch disp_cc_mdss_byte1_intf_clk = { 866 .halt_reg = 0x8034, 867 .halt_check = BRANCH_HALT, 868 .clkr = { 869 .enable_reg = 0x8034, 870 .enable_mask = BIT(0), 871 .hw.init = &(const struct clk_init_data) { 872 .name = "disp_cc_mdss_byte1_intf_clk", 873 .parent_hws = (const struct clk_hw*[]) { 874 &disp_cc_mdss_byte1_div_clk_src.clkr.hw, 875 }, 876 .num_parents = 1, 877 .flags = CLK_SET_RATE_PARENT, 878 .ops = &clk_branch2_ops, 879 }, 880 }, 881 }; 882 883 static struct clk_branch disp_cc_mdss_dptx0_aux_clk = { 884 .halt_reg = 0x8058, 885 .halt_check = BRANCH_HALT, 886 .clkr = { 887 .enable_reg = 0x8058, 888 .enable_mask = BIT(0), 889 .hw.init = &(const struct clk_init_data) { 890 .name = "disp_cc_mdss_dptx0_aux_clk", 891 .parent_hws = (const struct clk_hw*[]) { 892 &disp_cc_mdss_dptx0_aux_clk_src.clkr.hw, 893 }, 894 .num_parents = 1, 895 .flags = CLK_SET_RATE_PARENT, 896 .ops = &clk_branch2_ops, 897 }, 898 }, 899 }; 900 901 static struct clk_branch disp_cc_mdss_dptx0_link_clk = { 902 .halt_reg = 0x8040, 903 .halt_check = BRANCH_HALT, 904 .clkr = { 905 .enable_reg = 0x8040, 906 .enable_mask = BIT(0), 907 .hw.init = &(const struct clk_init_data) { 908 .name = "disp_cc_mdss_dptx0_link_clk", 909 .parent_hws = (const struct clk_hw*[]) { 910 &disp_cc_mdss_dptx0_link_clk_src.clkr.hw, 911 }, 912 .num_parents = 1, 913 .flags = CLK_SET_RATE_PARENT, 914 .ops = &clk_branch2_ops, 915 }, 916 }, 917 }; 918 919 static struct clk_branch disp_cc_mdss_dptx0_link_intf_clk = { 920 .halt_reg = 0x8048, 921 .halt_check = BRANCH_HALT, 922 .clkr = { 923 .enable_reg = 0x8048, 924 .enable_mask = BIT(0), 925 .hw.init = &(const struct clk_init_data) { 926 .name = "disp_cc_mdss_dptx0_link_intf_clk", 927 .parent_hws = (const struct clk_hw*[]) { 928 &disp_cc_mdss_dptx0_link_div_clk_src.clkr.hw, 929 }, 930 .num_parents = 1, 931 .flags = CLK_SET_RATE_PARENT, 932 .ops = &clk_branch2_ops, 933 }, 934 }, 935 }; 936 937 static struct clk_branch disp_cc_mdss_dptx0_pixel0_clk = { 938 .halt_reg = 0x8050, 939 .halt_check = BRANCH_HALT, 940 .clkr = { 941 .enable_reg = 0x8050, 942 .enable_mask = BIT(0), 943 .hw.init = &(const struct clk_init_data) { 944 .name = "disp_cc_mdss_dptx0_pixel0_clk", 945 .parent_hws = (const struct clk_hw*[]) { 946 &disp_cc_mdss_dptx0_pixel0_clk_src.clkr.hw, 947 }, 948 .num_parents = 1, 949 .flags = CLK_SET_RATE_PARENT, 950 .ops = &clk_branch2_ops, 951 }, 952 }, 953 }; 954 955 static struct clk_branch disp_cc_mdss_dptx0_pixel1_clk = { 956 .halt_reg = 0x8054, 957 .halt_check = BRANCH_HALT, 958 .clkr = { 959 .enable_reg = 0x8054, 960 .enable_mask = BIT(0), 961 .hw.init = &(const struct clk_init_data) { 962 .name = "disp_cc_mdss_dptx0_pixel1_clk", 963 .parent_hws = (const struct clk_hw*[]) { 964 &disp_cc_mdss_dptx0_pixel1_clk_src.clkr.hw, 965 }, 966 .num_parents = 1, 967 .flags = CLK_SET_RATE_PARENT, 968 .ops = &clk_branch2_ops, 969 }, 970 }, 971 }; 972 973 static struct clk_branch disp_cc_mdss_dptx0_usb_router_link_intf_clk = { 974 .halt_reg = 0x8044, 975 .halt_check = BRANCH_HALT, 976 .clkr = { 977 .enable_reg = 0x8044, 978 .enable_mask = BIT(0), 979 .hw.init = &(const struct clk_init_data) { 980 .name = "disp_cc_mdss_dptx0_usb_router_link_intf_clk", 981 .parent_hws = (const struct clk_hw*[]) { 982 &disp_cc_mdss_dptx0_link_div_clk_src.clkr.hw, 983 }, 984 .num_parents = 1, 985 .flags = CLK_SET_RATE_PARENT, 986 .ops = &clk_branch2_ops, 987 }, 988 }, 989 }; 990 991 static struct clk_branch disp_cc_mdss_dptx1_aux_clk = { 992 .halt_reg = 0x8074, 993 .halt_check = BRANCH_HALT, 994 .clkr = { 995 .enable_reg = 0x8074, 996 .enable_mask = BIT(0), 997 .hw.init = &(const struct clk_init_data) { 998 .name = "disp_cc_mdss_dptx1_aux_clk", 999 .parent_hws = (const struct clk_hw*[]) { 1000 &disp_cc_mdss_dptx1_aux_clk_src.clkr.hw, 1001 }, 1002 .num_parents = 1, 1003 .flags = CLK_SET_RATE_PARENT, 1004 .ops = &clk_branch2_ops, 1005 }, 1006 }, 1007 }; 1008 1009 static struct clk_branch disp_cc_mdss_dptx1_link_clk = { 1010 .halt_reg = 0x8064, 1011 .halt_check = BRANCH_HALT, 1012 .clkr = { 1013 .enable_reg = 0x8064, 1014 .enable_mask = BIT(0), 1015 .hw.init = &(const struct clk_init_data) { 1016 .name = "disp_cc_mdss_dptx1_link_clk", 1017 .parent_hws = (const struct clk_hw*[]) { 1018 &disp_cc_mdss_dptx1_link_clk_src.clkr.hw, 1019 }, 1020 .num_parents = 1, 1021 .flags = CLK_SET_RATE_PARENT, 1022 .ops = &clk_branch2_ops, 1023 }, 1024 }, 1025 }; 1026 1027 static struct clk_branch disp_cc_mdss_dptx1_link_intf_clk = { 1028 .halt_reg = 0x806c, 1029 .halt_check = BRANCH_HALT, 1030 .clkr = { 1031 .enable_reg = 0x806c, 1032 .enable_mask = BIT(0), 1033 .hw.init = &(const struct clk_init_data) { 1034 .name = "disp_cc_mdss_dptx1_link_intf_clk", 1035 .parent_hws = (const struct clk_hw*[]) { 1036 &disp_cc_mdss_dptx1_link_div_clk_src.clkr.hw, 1037 }, 1038 .num_parents = 1, 1039 .flags = CLK_SET_RATE_PARENT, 1040 .ops = &clk_branch2_ops, 1041 }, 1042 }, 1043 }; 1044 1045 static struct clk_branch disp_cc_mdss_dptx1_pixel0_clk = { 1046 .halt_reg = 0x805c, 1047 .halt_check = BRANCH_HALT, 1048 .clkr = { 1049 .enable_reg = 0x805c, 1050 .enable_mask = BIT(0), 1051 .hw.init = &(const struct clk_init_data) { 1052 .name = "disp_cc_mdss_dptx1_pixel0_clk", 1053 .parent_hws = (const struct clk_hw*[]) { 1054 &disp_cc_mdss_dptx1_pixel0_clk_src.clkr.hw, 1055 }, 1056 .num_parents = 1, 1057 .flags = CLK_SET_RATE_PARENT, 1058 .ops = &clk_branch2_ops, 1059 }, 1060 }, 1061 }; 1062 1063 static struct clk_branch disp_cc_mdss_dptx1_pixel1_clk = { 1064 .halt_reg = 0x8060, 1065 .halt_check = BRANCH_HALT, 1066 .clkr = { 1067 .enable_reg = 0x8060, 1068 .enable_mask = BIT(0), 1069 .hw.init = &(const struct clk_init_data) { 1070 .name = "disp_cc_mdss_dptx1_pixel1_clk", 1071 .parent_hws = (const struct clk_hw*[]) { 1072 &disp_cc_mdss_dptx1_pixel1_clk_src.clkr.hw, 1073 }, 1074 .num_parents = 1, 1075 .flags = CLK_SET_RATE_PARENT, 1076 .ops = &clk_branch2_ops, 1077 }, 1078 }, 1079 }; 1080 1081 static struct clk_branch disp_cc_mdss_dptx1_usb_router_link_intf_clk = { 1082 .halt_reg = 0x8068, 1083 .halt_check = BRANCH_HALT, 1084 .clkr = { 1085 .enable_reg = 0x8068, 1086 .enable_mask = BIT(0), 1087 .hw.init = &(const struct clk_init_data) { 1088 .name = "disp_cc_mdss_dptx1_usb_router_link_intf_clk", 1089 .parent_hws = (const struct clk_hw*[]) { 1090 &disp_cc_mdss_dptx1_link_div_clk_src.clkr.hw, 1091 }, 1092 .num_parents = 1, 1093 .flags = CLK_SET_RATE_PARENT, 1094 .ops = &clk_branch2_ops, 1095 }, 1096 }, 1097 }; 1098 1099 static struct clk_branch disp_cc_mdss_dptx2_aux_clk = { 1100 .halt_reg = 0x8090, 1101 .halt_check = BRANCH_HALT, 1102 .clkr = { 1103 .enable_reg = 0x8090, 1104 .enable_mask = BIT(0), 1105 .hw.init = &(const struct clk_init_data) { 1106 .name = "disp_cc_mdss_dptx2_aux_clk", 1107 .parent_hws = (const struct clk_hw*[]) { 1108 &disp_cc_mdss_dptx2_aux_clk_src.clkr.hw, 1109 }, 1110 .num_parents = 1, 1111 .flags = CLK_SET_RATE_PARENT, 1112 .ops = &clk_branch2_ops, 1113 }, 1114 }, 1115 }; 1116 1117 static struct clk_branch disp_cc_mdss_dptx2_link_clk = { 1118 .halt_reg = 0x8080, 1119 .halt_check = BRANCH_HALT, 1120 .clkr = { 1121 .enable_reg = 0x8080, 1122 .enable_mask = BIT(0), 1123 .hw.init = &(const struct clk_init_data) { 1124 .name = "disp_cc_mdss_dptx2_link_clk", 1125 .parent_hws = (const struct clk_hw*[]) { 1126 &disp_cc_mdss_dptx2_link_clk_src.clkr.hw, 1127 }, 1128 .num_parents = 1, 1129 .flags = CLK_SET_RATE_PARENT, 1130 .ops = &clk_branch2_ops, 1131 }, 1132 }, 1133 }; 1134 1135 static struct clk_branch disp_cc_mdss_dptx2_link_intf_clk = { 1136 .halt_reg = 0x8084, 1137 .halt_check = BRANCH_HALT, 1138 .clkr = { 1139 .enable_reg = 0x8084, 1140 .enable_mask = BIT(0), 1141 .hw.init = &(const struct clk_init_data) { 1142 .name = "disp_cc_mdss_dptx2_link_intf_clk", 1143 .parent_hws = (const struct clk_hw*[]) { 1144 &disp_cc_mdss_dptx2_link_div_clk_src.clkr.hw, 1145 }, 1146 .num_parents = 1, 1147 .flags = CLK_SET_RATE_PARENT, 1148 .ops = &clk_branch2_ops, 1149 }, 1150 }, 1151 }; 1152 1153 static struct clk_branch disp_cc_mdss_dptx2_pixel0_clk = { 1154 .halt_reg = 0x8078, 1155 .halt_check = BRANCH_HALT, 1156 .clkr = { 1157 .enable_reg = 0x8078, 1158 .enable_mask = BIT(0), 1159 .hw.init = &(const struct clk_init_data) { 1160 .name = "disp_cc_mdss_dptx2_pixel0_clk", 1161 .parent_hws = (const struct clk_hw*[]) { 1162 &disp_cc_mdss_dptx2_pixel0_clk_src.clkr.hw, 1163 }, 1164 .num_parents = 1, 1165 .flags = CLK_SET_RATE_PARENT, 1166 .ops = &clk_branch2_ops, 1167 }, 1168 }, 1169 }; 1170 1171 static struct clk_branch disp_cc_mdss_dptx2_pixel1_clk = { 1172 .halt_reg = 0x807c, 1173 .halt_check = BRANCH_HALT, 1174 .clkr = { 1175 .enable_reg = 0x807c, 1176 .enable_mask = BIT(0), 1177 .hw.init = &(const struct clk_init_data) { 1178 .name = "disp_cc_mdss_dptx2_pixel1_clk", 1179 .parent_hws = (const struct clk_hw*[]) { 1180 &disp_cc_mdss_dptx2_pixel1_clk_src.clkr.hw, 1181 }, 1182 .num_parents = 1, 1183 .flags = CLK_SET_RATE_PARENT, 1184 .ops = &clk_branch2_ops, 1185 }, 1186 }, 1187 }; 1188 1189 static struct clk_branch disp_cc_mdss_dptx2_usb_router_link_intf_clk = { 1190 .halt_reg = 0x8088, 1191 .halt_check = BRANCH_HALT, 1192 .clkr = { 1193 .enable_reg = 0x8088, 1194 .enable_mask = BIT(0), 1195 .hw.init = &(const struct clk_init_data) { 1196 .name = "disp_cc_mdss_dptx2_usb_router_link_intf_clk", 1197 .parent_hws = (const struct clk_hw*[]) { 1198 &disp_cc_mdss_dptx2_link_div_clk_src.clkr.hw, 1199 }, 1200 .num_parents = 1, 1201 .flags = CLK_SET_RATE_PARENT, 1202 .ops = &clk_branch2_ops, 1203 }, 1204 }, 1205 }; 1206 1207 static struct clk_branch disp_cc_mdss_dptx3_aux_clk = { 1208 .halt_reg = 0x80a0, 1209 .halt_check = BRANCH_HALT, 1210 .clkr = { 1211 .enable_reg = 0x80a0, 1212 .enable_mask = BIT(0), 1213 .hw.init = &(const struct clk_init_data) { 1214 .name = "disp_cc_mdss_dptx3_aux_clk", 1215 .parent_hws = (const struct clk_hw*[]) { 1216 &disp_cc_mdss_dptx3_aux_clk_src.clkr.hw, 1217 }, 1218 .num_parents = 1, 1219 .flags = CLK_SET_RATE_PARENT, 1220 .ops = &clk_branch2_ops, 1221 }, 1222 }, 1223 }; 1224 1225 static struct clk_branch disp_cc_mdss_dptx3_link_clk = { 1226 .halt_reg = 0x8098, 1227 .halt_check = BRANCH_HALT, 1228 .clkr = { 1229 .enable_reg = 0x8098, 1230 .enable_mask = BIT(0), 1231 .hw.init = &(const struct clk_init_data) { 1232 .name = "disp_cc_mdss_dptx3_link_clk", 1233 .parent_hws = (const struct clk_hw*[]) { 1234 &disp_cc_mdss_dptx3_link_clk_src.clkr.hw, 1235 }, 1236 .num_parents = 1, 1237 .flags = CLK_SET_RATE_PARENT, 1238 .ops = &clk_branch2_ops, 1239 }, 1240 }, 1241 }; 1242 1243 static struct clk_branch disp_cc_mdss_dptx3_link_intf_clk = { 1244 .halt_reg = 0x809c, 1245 .halt_check = BRANCH_HALT, 1246 .clkr = { 1247 .enable_reg = 0x809c, 1248 .enable_mask = BIT(0), 1249 .hw.init = &(const struct clk_init_data) { 1250 .name = "disp_cc_mdss_dptx3_link_intf_clk", 1251 .parent_hws = (const struct clk_hw*[]) { 1252 &disp_cc_mdss_dptx3_link_div_clk_src.clkr.hw, 1253 }, 1254 .num_parents = 1, 1255 .flags = CLK_SET_RATE_PARENT, 1256 .ops = &clk_branch2_ops, 1257 }, 1258 }, 1259 }; 1260 1261 static struct clk_branch disp_cc_mdss_dptx3_pixel0_clk = { 1262 .halt_reg = 0x8094, 1263 .halt_check = BRANCH_HALT, 1264 .clkr = { 1265 .enable_reg = 0x8094, 1266 .enable_mask = BIT(0), 1267 .hw.init = &(const struct clk_init_data) { 1268 .name = "disp_cc_mdss_dptx3_pixel0_clk", 1269 .parent_hws = (const struct clk_hw*[]) { 1270 &disp_cc_mdss_dptx3_pixel0_clk_src.clkr.hw, 1271 }, 1272 .num_parents = 1, 1273 .flags = CLK_SET_RATE_PARENT, 1274 .ops = &clk_branch2_ops, 1275 }, 1276 }, 1277 }; 1278 1279 static struct clk_branch disp_cc_mdss_esc0_clk = { 1280 .halt_reg = 0x8038, 1281 .halt_check = BRANCH_HALT, 1282 .clkr = { 1283 .enable_reg = 0x8038, 1284 .enable_mask = BIT(0), 1285 .hw.init = &(const struct clk_init_data) { 1286 .name = "disp_cc_mdss_esc0_clk", 1287 .parent_hws = (const struct clk_hw*[]) { 1288 &disp_cc_mdss_esc0_clk_src.clkr.hw, 1289 }, 1290 .num_parents = 1, 1291 .flags = CLK_SET_RATE_PARENT, 1292 .ops = &clk_branch2_ops, 1293 }, 1294 }, 1295 }; 1296 1297 static struct clk_branch disp_cc_mdss_esc1_clk = { 1298 .halt_reg = 0x803c, 1299 .halt_check = BRANCH_HALT, 1300 .clkr = { 1301 .enable_reg = 0x803c, 1302 .enable_mask = BIT(0), 1303 .hw.init = &(const struct clk_init_data) { 1304 .name = "disp_cc_mdss_esc1_clk", 1305 .parent_hws = (const struct clk_hw*[]) { 1306 &disp_cc_mdss_esc1_clk_src.clkr.hw, 1307 }, 1308 .num_parents = 1, 1309 .flags = CLK_SET_RATE_PARENT, 1310 .ops = &clk_branch2_ops, 1311 }, 1312 }, 1313 }; 1314 1315 static struct clk_branch disp_cc_mdss_mdp1_clk = { 1316 .halt_reg = 0xa004, 1317 .halt_check = BRANCH_HALT, 1318 .clkr = { 1319 .enable_reg = 0xa004, 1320 .enable_mask = BIT(0), 1321 .hw.init = &(const struct clk_init_data) { 1322 .name = "disp_cc_mdss_mdp1_clk", 1323 .parent_hws = (const struct clk_hw*[]) { 1324 &disp_cc_mdss_mdp_clk_src.clkr.hw, 1325 }, 1326 .num_parents = 1, 1327 .flags = CLK_SET_RATE_PARENT, 1328 .ops = &clk_branch2_ops, 1329 }, 1330 }, 1331 }; 1332 1333 static struct clk_branch disp_cc_mdss_mdp_clk = { 1334 .halt_reg = 0x800c, 1335 .halt_check = BRANCH_HALT, 1336 .clkr = { 1337 .enable_reg = 0x800c, 1338 .enable_mask = BIT(0), 1339 .hw.init = &(const struct clk_init_data) { 1340 .name = "disp_cc_mdss_mdp_clk", 1341 .parent_hws = (const struct clk_hw*[]) { 1342 &disp_cc_mdss_mdp_clk_src.clkr.hw, 1343 }, 1344 .num_parents = 1, 1345 .flags = CLK_SET_RATE_PARENT, 1346 .ops = &clk_branch2_ops, 1347 }, 1348 }, 1349 }; 1350 1351 static struct clk_branch disp_cc_mdss_mdp_lut1_clk = { 1352 .halt_reg = 0xa010, 1353 .halt_check = BRANCH_HALT, 1354 .clkr = { 1355 .enable_reg = 0xa010, 1356 .enable_mask = BIT(0), 1357 .hw.init = &(const struct clk_init_data) { 1358 .name = "disp_cc_mdss_mdp_lut1_clk", 1359 .parent_hws = (const struct clk_hw*[]) { 1360 &disp_cc_mdss_mdp_clk_src.clkr.hw, 1361 }, 1362 .num_parents = 1, 1363 .flags = CLK_SET_RATE_PARENT, 1364 .ops = &clk_branch2_ops, 1365 }, 1366 }, 1367 }; 1368 1369 static struct clk_branch disp_cc_mdss_mdp_lut_clk = { 1370 .halt_reg = 0x8018, 1371 .halt_check = BRANCH_HALT_VOTED, 1372 .clkr = { 1373 .enable_reg = 0x8018, 1374 .enable_mask = BIT(0), 1375 .hw.init = &(const struct clk_init_data) { 1376 .name = "disp_cc_mdss_mdp_lut_clk", 1377 .parent_hws = (const struct clk_hw*[]) { 1378 &disp_cc_mdss_mdp_clk_src.clkr.hw, 1379 }, 1380 .num_parents = 1, 1381 .flags = CLK_SET_RATE_PARENT, 1382 .ops = &clk_branch2_ops, 1383 }, 1384 }, 1385 }; 1386 1387 static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = { 1388 .halt_reg = 0xc004, 1389 .halt_check = BRANCH_HALT_VOTED, 1390 .clkr = { 1391 .enable_reg = 0xc004, 1392 .enable_mask = BIT(0), 1393 .hw.init = &(const struct clk_init_data) { 1394 .name = "disp_cc_mdss_non_gdsc_ahb_clk", 1395 .parent_hws = (const struct clk_hw*[]) { 1396 &disp_cc_mdss_ahb_clk_src.clkr.hw, 1397 }, 1398 .num_parents = 1, 1399 .flags = CLK_SET_RATE_PARENT, 1400 .ops = &clk_branch2_ops, 1401 }, 1402 }, 1403 }; 1404 1405 static struct clk_branch disp_cc_mdss_pclk0_clk = { 1406 .halt_reg = 0x8004, 1407 .halt_check = BRANCH_HALT, 1408 .clkr = { 1409 .enable_reg = 0x8004, 1410 .enable_mask = BIT(0), 1411 .hw.init = &(const struct clk_init_data) { 1412 .name = "disp_cc_mdss_pclk0_clk", 1413 .parent_hws = (const struct clk_hw*[]) { 1414 &disp_cc_mdss_pclk0_clk_src.clkr.hw, 1415 }, 1416 .num_parents = 1, 1417 .flags = CLK_SET_RATE_PARENT, 1418 .ops = &clk_branch2_ops, 1419 }, 1420 }, 1421 }; 1422 1423 static struct clk_branch disp_cc_mdss_pclk1_clk = { 1424 .halt_reg = 0x8008, 1425 .halt_check = BRANCH_HALT, 1426 .clkr = { 1427 .enable_reg = 0x8008, 1428 .enable_mask = BIT(0), 1429 .hw.init = &(const struct clk_init_data) { 1430 .name = "disp_cc_mdss_pclk1_clk", 1431 .parent_hws = (const struct clk_hw*[]) { 1432 &disp_cc_mdss_pclk1_clk_src.clkr.hw, 1433 }, 1434 .num_parents = 1, 1435 .flags = CLK_SET_RATE_PARENT, 1436 .ops = &clk_branch2_ops, 1437 }, 1438 }, 1439 }; 1440 1441 static struct clk_branch disp_cc_mdss_rscc_ahb_clk = { 1442 .halt_reg = 0xc00c, 1443 .halt_check = BRANCH_HALT, 1444 .clkr = { 1445 .enable_reg = 0xc00c, 1446 .enable_mask = BIT(0), 1447 .hw.init = &(const struct clk_init_data) { 1448 .name = "disp_cc_mdss_rscc_ahb_clk", 1449 .parent_hws = (const struct clk_hw*[]) { 1450 &disp_cc_mdss_ahb_clk_src.clkr.hw, 1451 }, 1452 .num_parents = 1, 1453 .flags = CLK_SET_RATE_PARENT, 1454 .ops = &clk_branch2_ops, 1455 }, 1456 }, 1457 }; 1458 1459 static struct clk_branch disp_cc_mdss_rscc_vsync_clk = { 1460 .halt_reg = 0xc008, 1461 .halt_check = BRANCH_HALT, 1462 .clkr = { 1463 .enable_reg = 0xc008, 1464 .enable_mask = BIT(0), 1465 .hw.init = &(const struct clk_init_data) { 1466 .name = "disp_cc_mdss_rscc_vsync_clk", 1467 .parent_hws = (const struct clk_hw*[]) { 1468 &disp_cc_mdss_vsync_clk_src.clkr.hw, 1469 }, 1470 .num_parents = 1, 1471 .flags = CLK_SET_RATE_PARENT, 1472 .ops = &clk_branch2_ops, 1473 }, 1474 }, 1475 }; 1476 1477 static struct clk_branch disp_cc_mdss_vsync1_clk = { 1478 .halt_reg = 0xa01c, 1479 .halt_check = BRANCH_HALT, 1480 .clkr = { 1481 .enable_reg = 0xa01c, 1482 .enable_mask = BIT(0), 1483 .hw.init = &(const struct clk_init_data) { 1484 .name = "disp_cc_mdss_vsync1_clk", 1485 .parent_hws = (const struct clk_hw*[]) { 1486 &disp_cc_mdss_vsync_clk_src.clkr.hw, 1487 }, 1488 .num_parents = 1, 1489 .flags = CLK_SET_RATE_PARENT, 1490 .ops = &clk_branch2_ops, 1491 }, 1492 }, 1493 }; 1494 1495 static struct clk_branch disp_cc_mdss_vsync_clk = { 1496 .halt_reg = 0x8024, 1497 .halt_check = BRANCH_HALT, 1498 .clkr = { 1499 .enable_reg = 0x8024, 1500 .enable_mask = BIT(0), 1501 .hw.init = &(const struct clk_init_data) { 1502 .name = "disp_cc_mdss_vsync_clk", 1503 .parent_hws = (const struct clk_hw*[]) { 1504 &disp_cc_mdss_vsync_clk_src.clkr.hw, 1505 }, 1506 .num_parents = 1, 1507 .flags = CLK_SET_RATE_PARENT, 1508 .ops = &clk_branch2_ops, 1509 }, 1510 }, 1511 }; 1512 1513 static struct gdsc mdss_gdsc = { 1514 .gdscr = 0x9000, 1515 .en_rest_wait_val = 0x2, 1516 .en_few_wait_val = 0x2, 1517 .clk_dis_wait_val = 0xf, 1518 .pd = { 1519 .name = "mdss_gdsc", 1520 }, 1521 .pwrsts = PWRSTS_OFF_ON, 1522 .flags = HW_CTRL | RETAIN_FF_ENABLE, 1523 }; 1524 1525 static struct gdsc mdss_int2_gdsc = { 1526 .gdscr = 0xb000, 1527 .en_rest_wait_val = 0x2, 1528 .en_few_wait_val = 0x2, 1529 .clk_dis_wait_val = 0xf, 1530 .pd = { 1531 .name = "mdss_int2_gdsc", 1532 }, 1533 .pwrsts = PWRSTS_OFF_ON, 1534 .flags = HW_CTRL | RETAIN_FF_ENABLE, 1535 }; 1536 1537 static struct clk_regmap *disp_cc_x1e80100_clocks[] = { 1538 [DISP_CC_MDSS_ACCU_CLK] = &disp_cc_mdss_accu_clk.clkr, 1539 [DISP_CC_MDSS_AHB1_CLK] = &disp_cc_mdss_ahb1_clk.clkr, 1540 [DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr, 1541 [DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr, 1542 [DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr, 1543 [DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr, 1544 [DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] = &disp_cc_mdss_byte0_div_clk_src.clkr, 1545 [DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr, 1546 [DISP_CC_MDSS_BYTE1_CLK] = &disp_cc_mdss_byte1_clk.clkr, 1547 [DISP_CC_MDSS_BYTE1_CLK_SRC] = &disp_cc_mdss_byte1_clk_src.clkr, 1548 [DISP_CC_MDSS_BYTE1_DIV_CLK_SRC] = &disp_cc_mdss_byte1_div_clk_src.clkr, 1549 [DISP_CC_MDSS_BYTE1_INTF_CLK] = &disp_cc_mdss_byte1_intf_clk.clkr, 1550 [DISP_CC_MDSS_DPTX0_AUX_CLK] = &disp_cc_mdss_dptx0_aux_clk.clkr, 1551 [DISP_CC_MDSS_DPTX0_AUX_CLK_SRC] = &disp_cc_mdss_dptx0_aux_clk_src.clkr, 1552 [DISP_CC_MDSS_DPTX0_LINK_CLK] = &disp_cc_mdss_dptx0_link_clk.clkr, 1553 [DISP_CC_MDSS_DPTX0_LINK_CLK_SRC] = &disp_cc_mdss_dptx0_link_clk_src.clkr, 1554 [DISP_CC_MDSS_DPTX0_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx0_link_div_clk_src.clkr, 1555 [DISP_CC_MDSS_DPTX0_LINK_INTF_CLK] = &disp_cc_mdss_dptx0_link_intf_clk.clkr, 1556 [DISP_CC_MDSS_DPTX0_PIXEL0_CLK] = &disp_cc_mdss_dptx0_pixel0_clk.clkr, 1557 [DISP_CC_MDSS_DPTX0_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx0_pixel0_clk_src.clkr, 1558 [DISP_CC_MDSS_DPTX0_PIXEL1_CLK] = &disp_cc_mdss_dptx0_pixel1_clk.clkr, 1559 [DISP_CC_MDSS_DPTX0_PIXEL1_CLK_SRC] = &disp_cc_mdss_dptx0_pixel1_clk_src.clkr, 1560 [DISP_CC_MDSS_DPTX0_USB_ROUTER_LINK_INTF_CLK] = 1561 &disp_cc_mdss_dptx0_usb_router_link_intf_clk.clkr, 1562 [DISP_CC_MDSS_DPTX1_AUX_CLK] = &disp_cc_mdss_dptx1_aux_clk.clkr, 1563 [DISP_CC_MDSS_DPTX1_AUX_CLK_SRC] = &disp_cc_mdss_dptx1_aux_clk_src.clkr, 1564 [DISP_CC_MDSS_DPTX1_LINK_CLK] = &disp_cc_mdss_dptx1_link_clk.clkr, 1565 [DISP_CC_MDSS_DPTX1_LINK_CLK_SRC] = &disp_cc_mdss_dptx1_link_clk_src.clkr, 1566 [DISP_CC_MDSS_DPTX1_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx1_link_div_clk_src.clkr, 1567 [DISP_CC_MDSS_DPTX1_LINK_INTF_CLK] = &disp_cc_mdss_dptx1_link_intf_clk.clkr, 1568 [DISP_CC_MDSS_DPTX1_PIXEL0_CLK] = &disp_cc_mdss_dptx1_pixel0_clk.clkr, 1569 [DISP_CC_MDSS_DPTX1_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx1_pixel0_clk_src.clkr, 1570 [DISP_CC_MDSS_DPTX1_PIXEL1_CLK] = &disp_cc_mdss_dptx1_pixel1_clk.clkr, 1571 [DISP_CC_MDSS_DPTX1_PIXEL1_CLK_SRC] = &disp_cc_mdss_dptx1_pixel1_clk_src.clkr, 1572 [DISP_CC_MDSS_DPTX1_USB_ROUTER_LINK_INTF_CLK] = 1573 &disp_cc_mdss_dptx1_usb_router_link_intf_clk.clkr, 1574 [DISP_CC_MDSS_DPTX2_AUX_CLK] = &disp_cc_mdss_dptx2_aux_clk.clkr, 1575 [DISP_CC_MDSS_DPTX2_AUX_CLK_SRC] = &disp_cc_mdss_dptx2_aux_clk_src.clkr, 1576 [DISP_CC_MDSS_DPTX2_LINK_CLK] = &disp_cc_mdss_dptx2_link_clk.clkr, 1577 [DISP_CC_MDSS_DPTX2_LINK_CLK_SRC] = &disp_cc_mdss_dptx2_link_clk_src.clkr, 1578 [DISP_CC_MDSS_DPTX2_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx2_link_div_clk_src.clkr, 1579 [DISP_CC_MDSS_DPTX2_LINK_INTF_CLK] = &disp_cc_mdss_dptx2_link_intf_clk.clkr, 1580 [DISP_CC_MDSS_DPTX2_PIXEL0_CLK] = &disp_cc_mdss_dptx2_pixel0_clk.clkr, 1581 [DISP_CC_MDSS_DPTX2_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx2_pixel0_clk_src.clkr, 1582 [DISP_CC_MDSS_DPTX2_PIXEL1_CLK] = &disp_cc_mdss_dptx2_pixel1_clk.clkr, 1583 [DISP_CC_MDSS_DPTX2_PIXEL1_CLK_SRC] = &disp_cc_mdss_dptx2_pixel1_clk_src.clkr, 1584 [DISP_CC_MDSS_DPTX2_USB_ROUTER_LINK_INTF_CLK] = 1585 &disp_cc_mdss_dptx2_usb_router_link_intf_clk.clkr, 1586 [DISP_CC_MDSS_DPTX3_AUX_CLK] = &disp_cc_mdss_dptx3_aux_clk.clkr, 1587 [DISP_CC_MDSS_DPTX3_AUX_CLK_SRC] = &disp_cc_mdss_dptx3_aux_clk_src.clkr, 1588 [DISP_CC_MDSS_DPTX3_LINK_CLK] = &disp_cc_mdss_dptx3_link_clk.clkr, 1589 [DISP_CC_MDSS_DPTX3_LINK_CLK_SRC] = &disp_cc_mdss_dptx3_link_clk_src.clkr, 1590 [DISP_CC_MDSS_DPTX3_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx3_link_div_clk_src.clkr, 1591 [DISP_CC_MDSS_DPTX3_LINK_INTF_CLK] = &disp_cc_mdss_dptx3_link_intf_clk.clkr, 1592 [DISP_CC_MDSS_DPTX3_PIXEL0_CLK] = &disp_cc_mdss_dptx3_pixel0_clk.clkr, 1593 [DISP_CC_MDSS_DPTX3_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx3_pixel0_clk_src.clkr, 1594 [DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr, 1595 [DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr, 1596 [DISP_CC_MDSS_ESC1_CLK] = &disp_cc_mdss_esc1_clk.clkr, 1597 [DISP_CC_MDSS_ESC1_CLK_SRC] = &disp_cc_mdss_esc1_clk_src.clkr, 1598 [DISP_CC_MDSS_MDP1_CLK] = &disp_cc_mdss_mdp1_clk.clkr, 1599 [DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr, 1600 [DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr, 1601 [DISP_CC_MDSS_MDP_LUT1_CLK] = &disp_cc_mdss_mdp_lut1_clk.clkr, 1602 [DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr, 1603 [DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr, 1604 [DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr, 1605 [DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr, 1606 [DISP_CC_MDSS_PCLK1_CLK] = &disp_cc_mdss_pclk1_clk.clkr, 1607 [DISP_CC_MDSS_PCLK1_CLK_SRC] = &disp_cc_mdss_pclk1_clk_src.clkr, 1608 [DISP_CC_MDSS_RSCC_AHB_CLK] = &disp_cc_mdss_rscc_ahb_clk.clkr, 1609 [DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr, 1610 [DISP_CC_MDSS_VSYNC1_CLK] = &disp_cc_mdss_vsync1_clk.clkr, 1611 [DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr, 1612 [DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr, 1613 [DISP_CC_PLL0] = &disp_cc_pll0.clkr, 1614 [DISP_CC_PLL1] = &disp_cc_pll1.clkr, 1615 [DISP_CC_SLEEP_CLK_SRC] = &disp_cc_sleep_clk_src.clkr, 1616 [DISP_CC_XO_CLK_SRC] = &disp_cc_xo_clk_src.clkr, 1617 }; 1618 1619 static const struct qcom_reset_map disp_cc_x1e80100_resets[] = { 1620 [DISP_CC_MDSS_CORE_BCR] = { 0x8000 }, 1621 [DISP_CC_MDSS_CORE_INT2_BCR] = { 0xa000 }, 1622 [DISP_CC_MDSS_RSCC_BCR] = { 0xc000 }, 1623 }; 1624 1625 static struct gdsc *disp_cc_x1e80100_gdscs[] = { 1626 [MDSS_GDSC] = &mdss_gdsc, 1627 [MDSS_INT2_GDSC] = &mdss_int2_gdsc, 1628 }; 1629 1630 static const struct regmap_config disp_cc_x1e80100_regmap_config = { 1631 .reg_bits = 32, 1632 .reg_stride = 4, 1633 .val_bits = 32, 1634 .max_register = 0x11008, 1635 .fast_io = true, 1636 }; 1637 1638 static const struct qcom_cc_desc disp_cc_x1e80100_desc = { 1639 .config = &disp_cc_x1e80100_regmap_config, 1640 .clks = disp_cc_x1e80100_clocks, 1641 .num_clks = ARRAY_SIZE(disp_cc_x1e80100_clocks), 1642 .resets = disp_cc_x1e80100_resets, 1643 .num_resets = ARRAY_SIZE(disp_cc_x1e80100_resets), 1644 .gdscs = disp_cc_x1e80100_gdscs, 1645 .num_gdscs = ARRAY_SIZE(disp_cc_x1e80100_gdscs), 1646 }; 1647 1648 static const struct of_device_id disp_cc_x1e80100_match_table[] = { 1649 { .compatible = "qcom,x1e80100-dispcc" }, 1650 { } 1651 }; 1652 MODULE_DEVICE_TABLE(of, disp_cc_x1e80100_match_table); 1653 1654 static int disp_cc_x1e80100_probe(struct platform_device *pdev) 1655 { 1656 struct regmap *regmap; 1657 int ret; 1658 1659 ret = devm_pm_runtime_enable(&pdev->dev); 1660 if (ret) 1661 return ret; 1662 1663 ret = pm_runtime_resume_and_get(&pdev->dev); 1664 if (ret) 1665 return ret; 1666 1667 regmap = qcom_cc_map(pdev, &disp_cc_x1e80100_desc); 1668 if (IS_ERR(regmap)) { 1669 ret = PTR_ERR(regmap); 1670 goto err_put_rpm; 1671 } 1672 1673 clk_lucid_evo_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config); 1674 clk_lucid_evo_pll_configure(&disp_cc_pll1, regmap, &disp_cc_pll1_config); 1675 1676 /* Enable clock gating for MDP clocks */ 1677 regmap_update_bits(regmap, DISP_CC_MISC_CMD, 0x10, 0x10); 1678 1679 /* Keep clocks always enabled */ 1680 qcom_branch_set_clk_en(regmap, 0xe074); /* DISP_CC_SLEEP_CLK */ 1681 qcom_branch_set_clk_en(regmap, 0xe054); /* DISP_CC_XO_CLK */ 1682 1683 ret = qcom_cc_really_probe(&pdev->dev, &disp_cc_x1e80100_desc, regmap); 1684 if (ret) 1685 goto err_put_rpm; 1686 1687 pm_runtime_put(&pdev->dev); 1688 1689 return 0; 1690 1691 err_put_rpm: 1692 pm_runtime_put_sync(&pdev->dev); 1693 1694 return ret; 1695 } 1696 1697 static struct platform_driver disp_cc_x1e80100_driver = { 1698 .probe = disp_cc_x1e80100_probe, 1699 .driver = { 1700 .name = "dispcc-x1e80100", 1701 .of_match_table = disp_cc_x1e80100_match_table, 1702 }, 1703 }; 1704 1705 static int __init disp_cc_x1e80100_init(void) 1706 { 1707 return platform_driver_register(&disp_cc_x1e80100_driver); 1708 } 1709 subsys_initcall(disp_cc_x1e80100_init); 1710 1711 static void __exit disp_cc_x1e80100_exit(void) 1712 { 1713 platform_driver_unregister(&disp_cc_x1e80100_driver); 1714 } 1715 module_exit(disp_cc_x1e80100_exit); 1716 1717 MODULE_DESCRIPTION("QTI Display Clock Controller X1E80100 Driver"); 1718 MODULE_LICENSE("GPL"); 1719