Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

clk: qcom: Add dispcc clock driver for x1e80100

Add the dispcc clock driver for x1e80100.

Signed-off-by: Rajendra Nayak <quic_rjendra@quicinc.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
Link: https://lore.kernel.org/r/20240202-x1e80100-clock-controllers-v4-7-7fb08c861c7c@linaro.org
Signed-off-by: Bjorn Andersson <andersson@kernel.org>

authored by

Rajendra Nayak and committed by
Bjorn Andersson
ee3f0739 c32f4f4a

+1729
+10
drivers/clk/qcom/Kconfig
··· 20 20 21 21 if COMMON_CLK_QCOM 22 22 23 + config CLK_X1E80100_DISPCC 24 + tristate "X1E80100 Display Clock Controller" 25 + depends on ARM64 || COMPILE_TEST 26 + select CLK_X1E80100_GCC 27 + help 28 + Support for the two display clock controllers on Qualcomm 29 + Technologies, Inc. X1E80100 devices. 30 + Say Y if you want to support display devices and functionality such as 31 + splash screen. 32 + 23 33 config CLK_X1E80100_GCC 24 34 tristate "X1E80100 Global Clock Controller" 25 35 depends on ARM64 || COMPILE_TEST
+1
drivers/clk/qcom/Makefile
··· 21 21 obj-$(CONFIG_APQ_GCC_8084) += gcc-apq8084.o 22 22 obj-$(CONFIG_APQ_MMCC_8084) += mmcc-apq8084.o 23 23 obj-$(CONFIG_CLK_GFM_LPASS_SM8250) += lpass-gfm-sm8250.o 24 + obj-$(CONFIG_CLK_X1E80100_DISPCC) += dispcc-x1e80100.o 24 25 obj-$(CONFIG_CLK_X1E80100_GCC) += gcc-x1e80100.o 25 26 obj-$(CONFIG_IPQ_APSS_PLL) += apss-ipq-pll.o 26 27 obj-$(CONFIG_IPQ_APSS_6018) += apss-ipq6018.o
+1718
drivers/clk/qcom/dispcc-x1e80100.c
··· 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 + regmap_update_bits(regmap, 0xe074, BIT(0), BIT(0)); /* disp_cc_sleep_clk */ 1681 + regmap_update_bits(regmap, 0xe054, BIT(0), BIT(0)); /* disp_cc_xo_clk */ 1682 + 1683 + ret = qcom_cc_really_probe(pdev, &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");