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