linux/drivers/clk/qcom/dispcc-sc7280.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (c) 2021, The Linux Foundation. All rights reserved.
   4 */
   5
   6#include <linux/clk-provider.h>
   7#include <linux/module.h>
   8#include <linux/platform_device.h>
   9#include <linux/regmap.h>
  10
  11#include <dt-bindings/clock/qcom,dispcc-sc7280.h>
  12
  13#include "clk-alpha-pll.h"
  14#include "clk-branch.h"
  15#include "clk-rcg.h"
  16#include "clk-regmap-divider.h"
  17#include "common.h"
  18#include "gdsc.h"
  19
  20enum {
  21        P_BI_TCXO,
  22        P_DISP_CC_PLL0_OUT_EVEN,
  23        P_DISP_CC_PLL0_OUT_MAIN,
  24        P_DP_PHY_PLL_LINK_CLK,
  25        P_DP_PHY_PLL_VCO_DIV_CLK,
  26        P_DSI0_PHY_PLL_OUT_BYTECLK,
  27        P_DSI0_PHY_PLL_OUT_DSICLK,
  28        P_EDP_PHY_PLL_LINK_CLK,
  29        P_EDP_PHY_PLL_VCO_DIV_CLK,
  30        P_GCC_DISP_GPLL0_CLK,
  31};
  32
  33static const struct pll_vco lucid_vco[] = {
  34        { 249600000, 2000000000, 0 },
  35};
  36
  37/* 1520MHz Configuration*/
  38static const struct alpha_pll_config disp_cc_pll0_config = {
  39        .l = 0x4F,
  40        .alpha = 0x2AAA,
  41        .config_ctl_val = 0x20485699,
  42        .config_ctl_hi_val = 0x00002261,
  43        .config_ctl_hi1_val = 0x329A299C,
  44        .user_ctl_val = 0x00000001,
  45        .user_ctl_hi_val = 0x00000805,
  46        .user_ctl_hi1_val = 0x00000000,
  47};
  48
  49static struct clk_alpha_pll disp_cc_pll0 = {
  50        .offset = 0x0,
  51        .vco_table = lucid_vco,
  52        .num_vco = ARRAY_SIZE(lucid_vco),
  53        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
  54        .clkr = {
  55                .hw.init = &(struct clk_init_data){
  56                        .name = "disp_cc_pll0",
  57                        .parent_data = &(const struct clk_parent_data){
  58                                .fw_name = "bi_tcxo",
  59                        },
  60                        .num_parents = 1,
  61                        .ops = &clk_alpha_pll_lucid_ops,
  62                },
  63        },
  64};
  65
  66static const struct parent_map disp_cc_parent_map_0[] = {
  67        { P_BI_TCXO, 0 },
  68};
  69
  70static const struct clk_parent_data disp_cc_parent_data_0[] = {
  71        { .fw_name = "bi_tcxo" },
  72};
  73
  74static const struct parent_map disp_cc_parent_map_1[] = {
  75        { P_BI_TCXO, 0 },
  76        { P_DP_PHY_PLL_LINK_CLK, 1 },
  77        { P_DP_PHY_PLL_VCO_DIV_CLK, 2 },
  78};
  79
  80static const struct clk_parent_data disp_cc_parent_data_1[] = {
  81        { .fw_name = "bi_tcxo" },
  82        { .fw_name = "dp_phy_pll_link_clk" },
  83        { .fw_name = "dp_phy_pll_vco_div_clk" },
  84};
  85
  86static const struct parent_map disp_cc_parent_map_2[] = {
  87        { P_BI_TCXO, 0 },
  88        { P_DSI0_PHY_PLL_OUT_BYTECLK, 1 },
  89};
  90
  91static const struct clk_parent_data disp_cc_parent_data_2[] = {
  92        { .fw_name = "bi_tcxo" },
  93        { .fw_name = "dsi0_phy_pll_out_byteclk" },
  94};
  95
  96static const struct parent_map disp_cc_parent_map_3[] = {
  97        { P_BI_TCXO, 0 },
  98        { P_EDP_PHY_PLL_LINK_CLK, 1 },
  99        { P_EDP_PHY_PLL_VCO_DIV_CLK, 2 },
 100};
 101
 102static const struct clk_parent_data disp_cc_parent_data_3[] = {
 103        { .fw_name = "bi_tcxo" },
 104        { .fw_name = "edp_phy_pll_link_clk" },
 105        { .fw_name = "edp_phy_pll_vco_div_clk" },
 106};
 107
 108static const struct parent_map disp_cc_parent_map_4[] = {
 109        { P_BI_TCXO, 0 },
 110        { P_DISP_CC_PLL0_OUT_MAIN, 1 },
 111        { P_GCC_DISP_GPLL0_CLK, 4 },
 112        { P_DISP_CC_PLL0_OUT_EVEN, 5 },
 113};
 114
 115static const struct clk_parent_data disp_cc_parent_data_4[] = {
 116        { .fw_name = "bi_tcxo" },
 117        { .hw = &disp_cc_pll0.clkr.hw },
 118        { .fw_name = "gcc_disp_gpll0_clk" },
 119        { .hw = &disp_cc_pll0.clkr.hw },
 120};
 121
 122static const struct parent_map disp_cc_parent_map_5[] = {
 123        { P_BI_TCXO, 0 },
 124        { P_GCC_DISP_GPLL0_CLK, 4 },
 125};
 126
 127static const struct clk_parent_data disp_cc_parent_data_5[] = {
 128        { .fw_name = "bi_tcxo" },
 129        { .fw_name = "gcc_disp_gpll0_clk" },
 130};
 131
 132static const struct parent_map disp_cc_parent_map_6[] = {
 133        { P_BI_TCXO, 0 },
 134        { P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
 135};
 136
 137static const struct clk_parent_data disp_cc_parent_data_6[] = {
 138        { .fw_name = "bi_tcxo" },
 139        { .fw_name = "dsi0_phy_pll_out_dsiclk" },
 140};
 141
 142static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = {
 143        F(19200000, P_BI_TCXO, 1, 0, 0),
 144        F(37500000, P_GCC_DISP_GPLL0_CLK, 16, 0, 0),
 145        F(75000000, P_GCC_DISP_GPLL0_CLK, 8, 0, 0),
 146        { }
 147};
 148
 149static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = {
 150        .cmd_rcgr = 0x1170,
 151        .mnd_width = 0,
 152        .hid_width = 5,
 153        .parent_map = disp_cc_parent_map_5,
 154        .freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src,
 155        .clkr.hw.init = &(struct clk_init_data){
 156                .name = "disp_cc_mdss_ahb_clk_src",
 157                .parent_data = disp_cc_parent_data_5,
 158                .num_parents = ARRAY_SIZE(disp_cc_parent_data_5),
 159                .ops = &clk_rcg2_shared_ops,
 160        },
 161};
 162
 163static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
 164        .cmd_rcgr = 0x10d8,
 165        .mnd_width = 0,
 166        .hid_width = 5,
 167        .parent_map = disp_cc_parent_map_2,
 168        .clkr.hw.init = &(struct clk_init_data){
 169                .name = "disp_cc_mdss_byte0_clk_src",
 170                .parent_data = disp_cc_parent_data_2,
 171                .num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
 172                .flags = CLK_SET_RATE_PARENT,
 173                .ops = &clk_byte2_ops,
 174        },
 175};
 176
 177static const struct freq_tbl ftbl_disp_cc_mdss_dp_aux_clk_src[] = {
 178        F(19200000, P_BI_TCXO, 1, 0, 0),
 179        { }
 180};
 181
 182static struct clk_rcg2 disp_cc_mdss_dp_aux_clk_src = {
 183        .cmd_rcgr = 0x1158,
 184        .mnd_width = 0,
 185        .hid_width = 5,
 186        .parent_map = disp_cc_parent_map_0,
 187        .freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
 188        .clkr.hw.init = &(struct clk_init_data){
 189                .name = "disp_cc_mdss_dp_aux_clk_src",
 190                .parent_data = disp_cc_parent_data_0,
 191                .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
 192                .ops = &clk_rcg2_ops,
 193        },
 194};
 195
 196static struct clk_rcg2 disp_cc_mdss_dp_crypto_clk_src = {
 197        .cmd_rcgr = 0x1128,
 198        .mnd_width = 0,
 199        .hid_width = 5,
 200        .parent_map = disp_cc_parent_map_1,
 201        .clkr.hw.init = &(struct clk_init_data){
 202                .name = "disp_cc_mdss_dp_crypto_clk_src",
 203                .parent_data = disp_cc_parent_data_1,
 204                .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
 205                .ops = &clk_byte2_ops,
 206        },
 207};
 208
 209static struct clk_rcg2 disp_cc_mdss_dp_link_clk_src = {
 210        .cmd_rcgr = 0x110c,
 211        .mnd_width = 0,
 212        .hid_width = 5,
 213        .parent_map = disp_cc_parent_map_1,
 214        .clkr.hw.init = &(struct clk_init_data){
 215                .name = "disp_cc_mdss_dp_link_clk_src",
 216                .parent_data = disp_cc_parent_data_1,
 217                .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
 218                .ops = &clk_byte2_ops,
 219        },
 220};
 221
 222static struct clk_rcg2 disp_cc_mdss_dp_pixel_clk_src = {
 223        .cmd_rcgr = 0x1140,
 224        .mnd_width = 16,
 225        .hid_width = 5,
 226        .parent_map = disp_cc_parent_map_1,
 227        .clkr.hw.init = &(struct clk_init_data){
 228                .name = "disp_cc_mdss_dp_pixel_clk_src",
 229                .parent_data = disp_cc_parent_data_1,
 230                .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
 231                .ops = &clk_dp_ops,
 232        },
 233};
 234
 235static struct clk_rcg2 disp_cc_mdss_edp_aux_clk_src = {
 236        .cmd_rcgr = 0x11d0,
 237        .mnd_width = 0,
 238        .hid_width = 5,
 239        .parent_map = disp_cc_parent_map_0,
 240        .freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
 241        .clkr.hw.init = &(struct clk_init_data){
 242                .name = "disp_cc_mdss_edp_aux_clk_src",
 243                .parent_data = disp_cc_parent_data_0,
 244                .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
 245                .ops = &clk_rcg2_ops,
 246        },
 247};
 248
 249static struct clk_rcg2 disp_cc_mdss_edp_link_clk_src = {
 250        .cmd_rcgr = 0x11a0,
 251        .mnd_width = 0,
 252        .hid_width = 5,
 253        .parent_map = disp_cc_parent_map_3,
 254        .clkr.hw.init = &(struct clk_init_data){
 255                .name = "disp_cc_mdss_edp_link_clk_src",
 256                .parent_data = disp_cc_parent_data_3,
 257                .num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
 258                .flags = CLK_SET_RATE_PARENT,
 259                .ops = &clk_byte2_ops,
 260        },
 261};
 262
 263static struct clk_rcg2 disp_cc_mdss_edp_pixel_clk_src = {
 264        .cmd_rcgr = 0x1188,
 265        .mnd_width = 16,
 266        .hid_width = 5,
 267        .parent_map = disp_cc_parent_map_3,
 268        .clkr.hw.init = &(struct clk_init_data){
 269                .name = "disp_cc_mdss_edp_pixel_clk_src",
 270                .parent_data = disp_cc_parent_data_3,
 271                .num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
 272                .ops = &clk_dp_ops,
 273        },
 274};
 275
 276static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
 277        .cmd_rcgr = 0x10f4,
 278        .mnd_width = 0,
 279        .hid_width = 5,
 280        .parent_map = disp_cc_parent_map_2,
 281        .freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
 282        .clkr.hw.init = &(struct clk_init_data){
 283                .name = "disp_cc_mdss_esc0_clk_src",
 284                .parent_data = disp_cc_parent_data_2,
 285                .num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
 286                .ops = &clk_rcg2_ops,
 287        },
 288};
 289
 290static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = {
 291        F(200000000, P_GCC_DISP_GPLL0_CLK, 3, 0, 0),
 292        F(300000000, P_GCC_DISP_GPLL0_CLK, 2, 0, 0),
 293        F(380000000, P_DISP_CC_PLL0_OUT_MAIN, 4, 0, 0),
 294        F(506666667, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
 295        F(608000000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
 296        { }
 297};
 298
 299static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
 300        .cmd_rcgr = 0x1090,
 301        .mnd_width = 0,
 302        .hid_width = 5,
 303        .parent_map = disp_cc_parent_map_4,
 304        .freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
 305        .clkr.hw.init = &(struct clk_init_data){
 306                .name = "disp_cc_mdss_mdp_clk_src",
 307                .parent_data = disp_cc_parent_data_4,
 308                .num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
 309                .ops = &clk_rcg2_shared_ops,
 310        },
 311};
 312
 313static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
 314        .cmd_rcgr = 0x1078,
 315        .mnd_width = 8,
 316        .hid_width = 5,
 317        .parent_map = disp_cc_parent_map_6,
 318        .clkr.hw.init = &(struct clk_init_data){
 319                .name = "disp_cc_mdss_pclk0_clk_src",
 320                .parent_data = disp_cc_parent_data_6,
 321                .num_parents = ARRAY_SIZE(disp_cc_parent_data_6),
 322                .flags = CLK_SET_RATE_PARENT,
 323                .ops = &clk_pixel_ops,
 324        },
 325};
 326
 327static struct clk_rcg2 disp_cc_mdss_rot_clk_src = {
 328        .cmd_rcgr = 0x10a8,
 329        .mnd_width = 0,
 330        .hid_width = 5,
 331        .parent_map = disp_cc_parent_map_4,
 332        .freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
 333        .clkr.hw.init = &(struct clk_init_data){
 334                .name = "disp_cc_mdss_rot_clk_src",
 335                .parent_data = disp_cc_parent_data_4,
 336                .num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
 337                .ops = &clk_rcg2_shared_ops,
 338        },
 339};
 340
 341static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
 342        .cmd_rcgr = 0x10c0,
 343        .mnd_width = 0,
 344        .hid_width = 5,
 345        .parent_map = disp_cc_parent_map_0,
 346        .freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
 347        .clkr.hw.init = &(struct clk_init_data){
 348                .name = "disp_cc_mdss_vsync_clk_src",
 349                .parent_data = disp_cc_parent_data_0,
 350                .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
 351                .ops = &clk_rcg2_ops,
 352        },
 353};
 354
 355static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
 356        .reg = 0x10f0,
 357        .shift = 0,
 358        .width = 4,
 359        .clkr.hw.init = &(struct clk_init_data) {
 360                .name = "disp_cc_mdss_byte0_div_clk_src",
 361                .parent_hws = (const struct clk_hw*[]){
 362                        &disp_cc_mdss_byte0_clk_src.clkr.hw,
 363                },
 364                .num_parents = 1,
 365                .ops = &clk_regmap_div_ops,
 366        },
 367};
 368
 369static struct clk_regmap_div disp_cc_mdss_dp_link_div_clk_src = {
 370        .reg = 0x1124,
 371        .shift = 0,
 372        .width = 4,
 373        .clkr.hw.init = &(struct clk_init_data) {
 374                .name = "disp_cc_mdss_dp_link_div_clk_src",
 375                .parent_hws = (const struct clk_hw*[]){
 376                        &disp_cc_mdss_dp_link_clk_src.clkr.hw,
 377                },
 378                .num_parents = 1,
 379                .ops = &clk_regmap_div_ro_ops,
 380        },
 381};
 382
 383static struct clk_regmap_div disp_cc_mdss_edp_link_div_clk_src = {
 384        .reg = 0x11b8,
 385        .shift = 0,
 386        .width = 4,
 387        .clkr.hw.init = &(struct clk_init_data) {
 388                .name = "disp_cc_mdss_edp_link_div_clk_src",
 389                .parent_hws = (const struct clk_hw*[]){
 390                        &disp_cc_mdss_edp_link_clk_src.clkr.hw,
 391                },
 392                .num_parents = 1,
 393                .ops = &clk_regmap_div_ro_ops,
 394        },
 395};
 396
 397static struct clk_branch disp_cc_mdss_ahb_clk = {
 398        .halt_reg = 0x1050,
 399        .halt_check = BRANCH_HALT,
 400        .clkr = {
 401                .enable_reg = 0x1050,
 402                .enable_mask = BIT(0),
 403                .hw.init = &(struct clk_init_data){
 404                        .name = "disp_cc_mdss_ahb_clk",
 405                        .parent_hws = (const struct clk_hw*[]){
 406                                &disp_cc_mdss_ahb_clk_src.clkr.hw,
 407                        },
 408                        .num_parents = 1,
 409                        .flags = CLK_SET_RATE_PARENT,
 410                        .ops = &clk_branch2_ops,
 411                },
 412        },
 413};
 414
 415static struct clk_branch disp_cc_mdss_byte0_clk = {
 416        .halt_reg = 0x1030,
 417        .halt_check = BRANCH_HALT,
 418        .clkr = {
 419                .enable_reg = 0x1030,
 420                .enable_mask = BIT(0),
 421                .hw.init = &(struct clk_init_data){
 422                        .name = "disp_cc_mdss_byte0_clk",
 423                        .parent_hws = (const struct clk_hw*[]){
 424                                &disp_cc_mdss_byte0_clk_src.clkr.hw,
 425                        },
 426                        .num_parents = 1,
 427                        .flags = CLK_SET_RATE_PARENT,
 428                        .ops = &clk_branch2_ops,
 429                },
 430        },
 431};
 432
 433static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
 434        .halt_reg = 0x1034,
 435        .halt_check = BRANCH_HALT,
 436        .clkr = {
 437                .enable_reg = 0x1034,
 438                .enable_mask = BIT(0),
 439                .hw.init = &(struct clk_init_data){
 440                        .name = "disp_cc_mdss_byte0_intf_clk",
 441                        .parent_hws = (const struct clk_hw*[]){
 442                                &disp_cc_mdss_byte0_div_clk_src.clkr.hw,
 443                        },
 444                        .num_parents = 1,
 445                        .flags = CLK_SET_RATE_PARENT,
 446                        .ops = &clk_branch2_ops,
 447                },
 448        },
 449};
 450
 451static struct clk_branch disp_cc_mdss_dp_aux_clk = {
 452        .halt_reg = 0x104c,
 453        .halt_check = BRANCH_HALT,
 454        .clkr = {
 455                .enable_reg = 0x104c,
 456                .enable_mask = BIT(0),
 457                .hw.init = &(struct clk_init_data){
 458                        .name = "disp_cc_mdss_dp_aux_clk",
 459                        .parent_hws = (const struct clk_hw*[]){
 460                                &disp_cc_mdss_dp_aux_clk_src.clkr.hw,
 461                        },
 462                        .num_parents = 1,
 463                        .flags = CLK_SET_RATE_PARENT,
 464                        .ops = &clk_branch2_ops,
 465                },
 466        },
 467};
 468
 469static struct clk_branch disp_cc_mdss_dp_crypto_clk = {
 470        .halt_reg = 0x1044,
 471        .halt_check = BRANCH_HALT,
 472        .clkr = {
 473                .enable_reg = 0x1044,
 474                .enable_mask = BIT(0),
 475                .hw.init = &(struct clk_init_data){
 476                        .name = "disp_cc_mdss_dp_crypto_clk",
 477                        .parent_hws = (const struct clk_hw*[]){
 478                                &disp_cc_mdss_dp_crypto_clk_src.clkr.hw,
 479                        },
 480                        .num_parents = 1,
 481                        .flags = CLK_SET_RATE_PARENT,
 482                        .ops = &clk_branch2_ops,
 483                },
 484        },
 485};
 486
 487static struct clk_branch disp_cc_mdss_dp_link_clk = {
 488        .halt_reg = 0x103c,
 489        .halt_check = BRANCH_HALT,
 490        .clkr = {
 491                .enable_reg = 0x103c,
 492                .enable_mask = BIT(0),
 493                .hw.init = &(struct clk_init_data){
 494                        .name = "disp_cc_mdss_dp_link_clk",
 495                        .parent_hws = (const struct clk_hw*[]){
 496                                &disp_cc_mdss_dp_link_clk_src.clkr.hw,
 497                        },
 498                        .num_parents = 1,
 499                        .flags = CLK_SET_RATE_PARENT,
 500                        .ops = &clk_branch2_ops,
 501                },
 502        },
 503};
 504
 505static struct clk_branch disp_cc_mdss_dp_link_intf_clk = {
 506        .halt_reg = 0x1040,
 507        .halt_check = BRANCH_HALT,
 508        .clkr = {
 509                .enable_reg = 0x1040,
 510                .enable_mask = BIT(0),
 511                .hw.init = &(struct clk_init_data){
 512                        .name = "disp_cc_mdss_dp_link_intf_clk",
 513                        .parent_hws = (const struct clk_hw*[]){
 514                                &disp_cc_mdss_dp_link_div_clk_src.clkr.hw,
 515                        },
 516                        .num_parents = 1,
 517                        .flags = CLK_SET_RATE_PARENT,
 518                        .ops = &clk_branch2_ops,
 519                },
 520        },
 521};
 522
 523static struct clk_branch disp_cc_mdss_dp_pixel_clk = {
 524        .halt_reg = 0x1048,
 525        .halt_check = BRANCH_HALT,
 526        .clkr = {
 527                .enable_reg = 0x1048,
 528                .enable_mask = BIT(0),
 529                .hw.init = &(struct clk_init_data){
 530                        .name = "disp_cc_mdss_dp_pixel_clk",
 531                        .parent_hws = (const struct clk_hw*[]){
 532                                &disp_cc_mdss_dp_pixel_clk_src.clkr.hw,
 533                        },
 534                        .num_parents = 1,
 535                        .flags = CLK_SET_RATE_PARENT,
 536                        .ops = &clk_branch2_ops,
 537                },
 538        },
 539};
 540
 541static struct clk_branch disp_cc_mdss_edp_aux_clk = {
 542        .halt_reg = 0x1060,
 543        .halt_check = BRANCH_HALT,
 544        .clkr = {
 545                .enable_reg = 0x1060,
 546                .enable_mask = BIT(0),
 547                .hw.init = &(struct clk_init_data){
 548                        .name = "disp_cc_mdss_edp_aux_clk",
 549                        .parent_hws = (const struct clk_hw*[]){
 550                                &disp_cc_mdss_edp_aux_clk_src.clkr.hw,
 551                        },
 552                        .num_parents = 1,
 553                        .flags = CLK_SET_RATE_PARENT,
 554                        .ops = &clk_branch2_ops,
 555                },
 556        },
 557};
 558
 559static struct clk_branch disp_cc_mdss_edp_link_clk = {
 560        .halt_reg = 0x1058,
 561        .halt_check = BRANCH_HALT,
 562        .clkr = {
 563                .enable_reg = 0x1058,
 564                .enable_mask = BIT(0),
 565                .hw.init = &(struct clk_init_data){
 566                        .name = "disp_cc_mdss_edp_link_clk",
 567                        .parent_hws = (const struct clk_hw*[]){
 568                                &disp_cc_mdss_edp_link_clk_src.clkr.hw,
 569                        },
 570                        .num_parents = 1,
 571                        .flags = CLK_SET_RATE_PARENT,
 572                        .ops = &clk_branch2_ops,
 573                },
 574        },
 575};
 576
 577static struct clk_branch disp_cc_mdss_edp_link_intf_clk = {
 578        .halt_reg = 0x105c,
 579        .halt_check = BRANCH_HALT,
 580        .clkr = {
 581                .enable_reg = 0x105c,
 582                .enable_mask = BIT(0),
 583                .hw.init = &(struct clk_init_data){
 584                        .name = "disp_cc_mdss_edp_link_intf_clk",
 585                        .parent_hws = (const struct clk_hw*[]){
 586                                &disp_cc_mdss_edp_link_div_clk_src.clkr.hw
 587                        },
 588                        .num_parents = 1,
 589                        .flags = CLK_SET_RATE_PARENT,
 590                        .ops = &clk_branch2_ops,
 591                },
 592        },
 593};
 594
 595static struct clk_branch disp_cc_mdss_edp_pixel_clk = {
 596        .halt_reg = 0x1054,
 597        .halt_check = BRANCH_HALT,
 598        .clkr = {
 599                .enable_reg = 0x1054,
 600                .enable_mask = BIT(0),
 601                .hw.init = &(struct clk_init_data){
 602                        .name = "disp_cc_mdss_edp_pixel_clk",
 603                        .parent_hws = (const struct clk_hw*[]){
 604                                &disp_cc_mdss_edp_pixel_clk_src.clkr.hw,
 605                        },
 606                        .num_parents = 1,
 607                        .flags = CLK_SET_RATE_PARENT,
 608                        .ops = &clk_branch2_ops,
 609                },
 610        },
 611};
 612
 613static struct clk_branch disp_cc_mdss_esc0_clk = {
 614        .halt_reg = 0x1038,
 615        .halt_check = BRANCH_HALT,
 616        .clkr = {
 617                .enable_reg = 0x1038,
 618                .enable_mask = BIT(0),
 619                .hw.init = &(struct clk_init_data){
 620                        .name = "disp_cc_mdss_esc0_clk",
 621                        .parent_hws = (const struct clk_hw*[]){
 622                                &disp_cc_mdss_esc0_clk_src.clkr.hw,
 623                        },
 624                        .num_parents = 1,
 625                        .flags = CLK_SET_RATE_PARENT,
 626                        .ops = &clk_branch2_ops,
 627                },
 628        },
 629};
 630
 631static struct clk_branch disp_cc_mdss_mdp_clk = {
 632        .halt_reg = 0x1014,
 633        .halt_check = BRANCH_HALT,
 634        .clkr = {
 635                .enable_reg = 0x1014,
 636                .enable_mask = BIT(0),
 637                .hw.init = &(struct clk_init_data){
 638                        .name = "disp_cc_mdss_mdp_clk",
 639                        .parent_hws = (const struct clk_hw*[]){
 640                                &disp_cc_mdss_mdp_clk_src.clkr.hw,
 641                        },
 642                        .num_parents = 1,
 643                        .flags = CLK_SET_RATE_PARENT,
 644                        .ops = &clk_branch2_ops,
 645                },
 646        },
 647};
 648
 649static struct clk_branch disp_cc_mdss_mdp_lut_clk = {
 650        .halt_reg = 0x1024,
 651        .halt_check = BRANCH_HALT_VOTED,
 652        .clkr = {
 653                .enable_reg = 0x1024,
 654                .enable_mask = BIT(0),
 655                .hw.init = &(struct clk_init_data){
 656                        .name = "disp_cc_mdss_mdp_lut_clk",
 657                        .parent_hws = (const struct clk_hw*[]){
 658                                &disp_cc_mdss_mdp_clk_src.clkr.hw,
 659                        },
 660                        .num_parents = 1,
 661                        .flags = CLK_SET_RATE_PARENT,
 662                        .ops = &clk_branch2_ops,
 663                },
 664        },
 665};
 666
 667static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = {
 668        .halt_reg = 0x2004,
 669        .halt_check = BRANCH_HALT_VOTED,
 670        .clkr = {
 671                .enable_reg = 0x2004,
 672                .enable_mask = BIT(0),
 673                .hw.init = &(struct clk_init_data){
 674                        .name = "disp_cc_mdss_non_gdsc_ahb_clk",
 675                        .parent_hws = (const struct clk_hw*[]){
 676                                &disp_cc_mdss_ahb_clk_src.clkr.hw,
 677                        },
 678                        .num_parents = 1,
 679                        .flags = CLK_SET_RATE_PARENT,
 680                        .ops = &clk_branch2_ops,
 681                },
 682        },
 683};
 684
 685static struct clk_branch disp_cc_mdss_pclk0_clk = {
 686        .halt_reg = 0x1010,
 687        .halt_check = BRANCH_HALT,
 688        .clkr = {
 689                .enable_reg = 0x1010,
 690                .enable_mask = BIT(0),
 691                .hw.init = &(struct clk_init_data){
 692                        .name = "disp_cc_mdss_pclk0_clk",
 693                        .parent_hws = (const struct clk_hw*[]){
 694                                &disp_cc_mdss_pclk0_clk_src.clkr.hw,
 695                        },
 696                        .num_parents = 1,
 697                        .flags = CLK_SET_RATE_PARENT,
 698                        .ops = &clk_branch2_ops,
 699                },
 700        },
 701};
 702
 703static struct clk_branch disp_cc_mdss_rot_clk = {
 704        .halt_reg = 0x101c,
 705        .halt_check = BRANCH_HALT,
 706        .clkr = {
 707                .enable_reg = 0x101c,
 708                .enable_mask = BIT(0),
 709                .hw.init = &(struct clk_init_data){
 710                        .name = "disp_cc_mdss_rot_clk",
 711                        .parent_hws = (const struct clk_hw*[]){
 712                                &disp_cc_mdss_rot_clk_src.clkr.hw,
 713                        },
 714                        .num_parents = 1,
 715                        .flags = CLK_SET_RATE_PARENT,
 716                        .ops = &clk_branch2_ops,
 717                },
 718        },
 719};
 720
 721static struct clk_branch disp_cc_mdss_rscc_ahb_clk = {
 722        .halt_reg = 0x200c,
 723        .halt_check = BRANCH_HALT,
 724        .clkr = {
 725                .enable_reg = 0x200c,
 726                .enable_mask = BIT(0),
 727                .hw.init = &(struct clk_init_data){
 728                        .name = "disp_cc_mdss_rscc_ahb_clk",
 729                        .parent_hws = (const struct clk_hw*[]){
 730                                &disp_cc_mdss_ahb_clk_src.clkr.hw,
 731                        },
 732                        .num_parents = 1,
 733                        .flags = CLK_SET_RATE_PARENT,
 734                        .ops = &clk_branch2_ops,
 735                },
 736        },
 737};
 738
 739static struct clk_branch disp_cc_mdss_rscc_vsync_clk = {
 740        .halt_reg = 0x2008,
 741        .halt_check = BRANCH_HALT,
 742        .clkr = {
 743                .enable_reg = 0x2008,
 744                .enable_mask = BIT(0),
 745                .hw.init = &(struct clk_init_data){
 746                        .name = "disp_cc_mdss_rscc_vsync_clk",
 747                        .parent_hws = (const struct clk_hw*[]){
 748                                &disp_cc_mdss_vsync_clk_src.clkr.hw,
 749                        },
 750                        .num_parents = 1,
 751                        .flags = CLK_SET_RATE_PARENT,
 752                        .ops = &clk_branch2_ops,
 753                },
 754        },
 755};
 756
 757static struct clk_branch disp_cc_mdss_vsync_clk = {
 758        .halt_reg = 0x102c,
 759        .halt_check = BRANCH_HALT,
 760        .clkr = {
 761                .enable_reg = 0x102c,
 762                .enable_mask = BIT(0),
 763                .hw.init = &(struct clk_init_data){
 764                        .name = "disp_cc_mdss_vsync_clk",
 765                        .parent_hws = (const struct clk_hw*[]){
 766                                &disp_cc_mdss_vsync_clk_src.clkr.hw,
 767                        },
 768                        .num_parents = 1,
 769                        .flags = CLK_SET_RATE_PARENT,
 770                        .ops = &clk_branch2_ops,
 771                },
 772        },
 773};
 774
 775static struct clk_branch disp_cc_sleep_clk = {
 776        .halt_reg = 0x5004,
 777        .halt_check = BRANCH_HALT,
 778        .clkr = {
 779                .enable_reg = 0x5004,
 780                .enable_mask = BIT(0),
 781                .hw.init = &(struct clk_init_data){
 782                        .name = "disp_cc_sleep_clk",
 783                        .ops = &clk_branch2_ops,
 784                },
 785        },
 786};
 787
 788static struct gdsc disp_cc_mdss_core_gdsc = {
 789        .gdscr = 0x1004,
 790        .pd = {
 791                .name = "disp_cc_mdss_core_gdsc",
 792        },
 793        .pwrsts = PWRSTS_OFF_ON,
 794        .flags = HW_CTRL | RETAIN_FF_ENABLE,
 795};
 796
 797static struct clk_regmap *disp_cc_sc7280_clocks[] = {
 798        [DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr,
 799        [DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr,
 800        [DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr,
 801        [DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr,
 802        [DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] = &disp_cc_mdss_byte0_div_clk_src.clkr,
 803        [DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr,
 804        [DISP_CC_MDSS_DP_AUX_CLK] = &disp_cc_mdss_dp_aux_clk.clkr,
 805        [DISP_CC_MDSS_DP_AUX_CLK_SRC] = &disp_cc_mdss_dp_aux_clk_src.clkr,
 806        [DISP_CC_MDSS_DP_CRYPTO_CLK] = &disp_cc_mdss_dp_crypto_clk.clkr,
 807        [DISP_CC_MDSS_DP_CRYPTO_CLK_SRC] = &disp_cc_mdss_dp_crypto_clk_src.clkr,
 808        [DISP_CC_MDSS_DP_LINK_CLK] = &disp_cc_mdss_dp_link_clk.clkr,
 809        [DISP_CC_MDSS_DP_LINK_CLK_SRC] = &disp_cc_mdss_dp_link_clk_src.clkr,
 810        [DISP_CC_MDSS_DP_LINK_DIV_CLK_SRC] =
 811                &disp_cc_mdss_dp_link_div_clk_src.clkr,
 812        [DISP_CC_MDSS_DP_LINK_INTF_CLK] = &disp_cc_mdss_dp_link_intf_clk.clkr,
 813        [DISP_CC_MDSS_DP_PIXEL_CLK] = &disp_cc_mdss_dp_pixel_clk.clkr,
 814        [DISP_CC_MDSS_DP_PIXEL_CLK_SRC] = &disp_cc_mdss_dp_pixel_clk_src.clkr,
 815        [DISP_CC_MDSS_EDP_AUX_CLK] = &disp_cc_mdss_edp_aux_clk.clkr,
 816        [DISP_CC_MDSS_EDP_AUX_CLK_SRC] = &disp_cc_mdss_edp_aux_clk_src.clkr,
 817        [DISP_CC_MDSS_EDP_LINK_CLK] = &disp_cc_mdss_edp_link_clk.clkr,
 818        [DISP_CC_MDSS_EDP_LINK_CLK_SRC] = &disp_cc_mdss_edp_link_clk_src.clkr,
 819        [DISP_CC_MDSS_EDP_LINK_DIV_CLK_SRC] =
 820                &disp_cc_mdss_edp_link_div_clk_src.clkr,
 821        [DISP_CC_MDSS_EDP_LINK_INTF_CLK] = &disp_cc_mdss_edp_link_intf_clk.clkr,
 822        [DISP_CC_MDSS_EDP_PIXEL_CLK] = &disp_cc_mdss_edp_pixel_clk.clkr,
 823        [DISP_CC_MDSS_EDP_PIXEL_CLK_SRC] = &disp_cc_mdss_edp_pixel_clk_src.clkr,
 824        [DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr,
 825        [DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr,
 826        [DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr,
 827        [DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr,
 828        [DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr,
 829        [DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr,
 830        [DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr,
 831        [DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr,
 832        [DISP_CC_MDSS_ROT_CLK] = &disp_cc_mdss_rot_clk.clkr,
 833        [DISP_CC_MDSS_ROT_CLK_SRC] = &disp_cc_mdss_rot_clk_src.clkr,
 834        [DISP_CC_MDSS_RSCC_AHB_CLK] = &disp_cc_mdss_rscc_ahb_clk.clkr,
 835        [DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr,
 836        [DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr,
 837        [DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr,
 838        [DISP_CC_PLL0] = &disp_cc_pll0.clkr,
 839        [DISP_CC_SLEEP_CLK] = &disp_cc_sleep_clk.clkr,
 840};
 841
 842static struct gdsc *disp_cc_sc7280_gdscs[] = {
 843        [DISP_CC_MDSS_CORE_GDSC] = &disp_cc_mdss_core_gdsc,
 844};
 845
 846static const struct regmap_config disp_cc_sc7280_regmap_config = {
 847        .reg_bits = 32,
 848        .reg_stride = 4,
 849        .val_bits = 32,
 850        .max_register = 0x10000,
 851        .fast_io = true,
 852};
 853
 854static const struct qcom_cc_desc disp_cc_sc7280_desc = {
 855        .config = &disp_cc_sc7280_regmap_config,
 856        .clks = disp_cc_sc7280_clocks,
 857        .num_clks = ARRAY_SIZE(disp_cc_sc7280_clocks),
 858        .gdscs = disp_cc_sc7280_gdscs,
 859        .num_gdscs = ARRAY_SIZE(disp_cc_sc7280_gdscs),
 860};
 861
 862static const struct of_device_id disp_cc_sc7280_match_table[] = {
 863        { .compatible = "qcom,sc7280-dispcc" },
 864        { }
 865};
 866MODULE_DEVICE_TABLE(of, disp_cc_sc7280_match_table);
 867
 868static int disp_cc_sc7280_probe(struct platform_device *pdev)
 869{
 870        struct regmap *regmap;
 871
 872        regmap = qcom_cc_map(pdev, &disp_cc_sc7280_desc);
 873        if (IS_ERR(regmap))
 874                return PTR_ERR(regmap);
 875
 876        clk_lucid_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
 877
 878        /*
 879         * Keep the clocks always-ON
 880         * DISP_CC_XO_CLK
 881         */
 882        regmap_update_bits(regmap, 0x5008, BIT(0), BIT(0));
 883
 884        return qcom_cc_really_probe(pdev, &disp_cc_sc7280_desc, regmap);
 885}
 886
 887static struct platform_driver disp_cc_sc7280_driver = {
 888        .probe = disp_cc_sc7280_probe,
 889        .driver = {
 890                .name = "disp_cc-sc7280",
 891                .of_match_table = disp_cc_sc7280_match_table,
 892        },
 893};
 894
 895static int __init disp_cc_sc7280_init(void)
 896{
 897        return platform_driver_register(&disp_cc_sc7280_driver);
 898}
 899subsys_initcall(disp_cc_sc7280_init);
 900
 901static void __exit disp_cc_sc7280_exit(void)
 902{
 903        platform_driver_unregister(&disp_cc_sc7280_driver);
 904}
 905module_exit(disp_cc_sc7280_exit);
 906
 907MODULE_DESCRIPTION("QTI DISP_CC sc7280 Driver");
 908MODULE_LICENSE("GPL v2");
 909