root/drivers/clk/qcom/dispcc-sdm845.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. disp_cc_sdm845_probe
  2. disp_cc_sdm845_init
  3. disp_cc_sdm845_exit

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * Copyright (c) 2018, 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 #include <linux/reset-controller.h>
  11 
  12 #include <dt-bindings/clock/qcom,dispcc-sdm845.h>
  13 
  14 #include "clk-alpha-pll.h"
  15 #include "clk-branch.h"
  16 #include "clk-rcg.h"
  17 #include "clk-regmap-divider.h"
  18 #include "common.h"
  19 #include "gdsc.h"
  20 #include "reset.h"
  21 
  22 enum {
  23         P_BI_TCXO,
  24         P_CORE_BI_PLL_TEST_SE,
  25         P_DISP_CC_PLL0_OUT_MAIN,
  26         P_DSI0_PHY_PLL_OUT_BYTECLK,
  27         P_DSI0_PHY_PLL_OUT_DSICLK,
  28         P_DSI1_PHY_PLL_OUT_BYTECLK,
  29         P_DSI1_PHY_PLL_OUT_DSICLK,
  30         P_GPLL0_OUT_MAIN,
  31         P_GPLL0_OUT_MAIN_DIV,
  32 };
  33 
  34 static const struct parent_map disp_cc_parent_map_0[] = {
  35         { P_BI_TCXO, 0 },
  36         { P_DSI0_PHY_PLL_OUT_BYTECLK, 1 },
  37         { P_DSI1_PHY_PLL_OUT_BYTECLK, 2 },
  38         { P_CORE_BI_PLL_TEST_SE, 7 },
  39 };
  40 
  41 static const char * const disp_cc_parent_names_0[] = {
  42         "bi_tcxo",
  43         "dsi0_phy_pll_out_byteclk",
  44         "dsi1_phy_pll_out_byteclk",
  45         "core_bi_pll_test_se",
  46 };
  47 
  48 static const struct parent_map disp_cc_parent_map_2[] = {
  49         { P_BI_TCXO, 0 },
  50         { P_CORE_BI_PLL_TEST_SE, 7 },
  51 };
  52 
  53 static const char * const disp_cc_parent_names_2[] = {
  54         "bi_tcxo",
  55         "core_bi_pll_test_se",
  56 };
  57 
  58 static const struct parent_map disp_cc_parent_map_3[] = {
  59         { P_BI_TCXO, 0 },
  60         { P_DISP_CC_PLL0_OUT_MAIN, 1 },
  61         { P_GPLL0_OUT_MAIN, 4 },
  62         { P_GPLL0_OUT_MAIN_DIV, 5 },
  63         { P_CORE_BI_PLL_TEST_SE, 7 },
  64 };
  65 
  66 static const char * const disp_cc_parent_names_3[] = {
  67         "bi_tcxo",
  68         "disp_cc_pll0",
  69         "gcc_disp_gpll0_clk_src",
  70         "gcc_disp_gpll0_div_clk_src",
  71         "core_bi_pll_test_se",
  72 };
  73 
  74 static const struct parent_map disp_cc_parent_map_4[] = {
  75         { P_BI_TCXO, 0 },
  76         { P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
  77         { P_DSI1_PHY_PLL_OUT_DSICLK, 2 },
  78         { P_CORE_BI_PLL_TEST_SE, 7 },
  79 };
  80 
  81 static const char * const disp_cc_parent_names_4[] = {
  82         "bi_tcxo",
  83         "dsi0_phy_pll_out_dsiclk",
  84         "dsi1_phy_pll_out_dsiclk",
  85         "core_bi_pll_test_se",
  86 };
  87 
  88 static struct clk_alpha_pll disp_cc_pll0 = {
  89         .offset = 0x0,
  90         .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
  91         .clkr = {
  92                 .hw.init = &(struct clk_init_data){
  93                         .name = "disp_cc_pll0",
  94                         .parent_names = (const char *[]){ "bi_tcxo" },
  95                         .num_parents = 1,
  96                         .ops = &clk_alpha_pll_fabia_ops,
  97                 },
  98         },
  99 };
 100 
 101 /* Return the HW recalc rate for idle use case */
 102 static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
 103         .cmd_rcgr = 0x20d0,
 104         .mnd_width = 0,
 105         .hid_width = 5,
 106         .parent_map = disp_cc_parent_map_0,
 107         .clkr.hw.init = &(struct clk_init_data){
 108                 .name = "disp_cc_mdss_byte0_clk_src",
 109                 .parent_names = disp_cc_parent_names_0,
 110                 .num_parents = 4,
 111                 .flags = CLK_SET_RATE_PARENT,
 112                 .ops = &clk_byte2_ops,
 113         },
 114 };
 115 
 116 /* Return the HW recalc rate for idle use case */
 117 static struct clk_rcg2 disp_cc_mdss_byte1_clk_src = {
 118         .cmd_rcgr = 0x20ec,
 119         .mnd_width = 0,
 120         .hid_width = 5,
 121         .parent_map = disp_cc_parent_map_0,
 122         .clkr.hw.init = &(struct clk_init_data){
 123                 .name = "disp_cc_mdss_byte1_clk_src",
 124                 .parent_names = disp_cc_parent_names_0,
 125                 .num_parents = 4,
 126                 .flags = CLK_SET_RATE_PARENT,
 127                 .ops = &clk_byte2_ops,
 128         },
 129 };
 130 
 131 static const struct freq_tbl ftbl_disp_cc_mdss_esc0_clk_src[] = {
 132         F(19200000, P_BI_TCXO, 1, 0, 0),
 133         { }
 134 };
 135 
 136 static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
 137         .cmd_rcgr = 0x2108,
 138         .mnd_width = 0,
 139         .hid_width = 5,
 140         .parent_map = disp_cc_parent_map_0,
 141         .freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src,
 142         .clkr.hw.init = &(struct clk_init_data){
 143                 .name = "disp_cc_mdss_esc0_clk_src",
 144                 .parent_names = disp_cc_parent_names_0,
 145                 .num_parents = 4,
 146                 .ops = &clk_rcg2_ops,
 147         },
 148 };
 149 
 150 static struct clk_rcg2 disp_cc_mdss_esc1_clk_src = {
 151         .cmd_rcgr = 0x2120,
 152         .mnd_width = 0,
 153         .hid_width = 5,
 154         .parent_map = disp_cc_parent_map_0,
 155         .freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src,
 156         .clkr.hw.init = &(struct clk_init_data){
 157                 .name = "disp_cc_mdss_esc1_clk_src",
 158                 .parent_names = disp_cc_parent_names_0,
 159                 .num_parents = 4,
 160                 .ops = &clk_rcg2_ops,
 161         },
 162 };
 163 
 164 static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = {
 165         F(19200000, P_BI_TCXO, 1, 0, 0),
 166         F(85714286, P_GPLL0_OUT_MAIN, 7, 0, 0),
 167         F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0),
 168         F(150000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
 169         F(171428571, P_GPLL0_OUT_MAIN, 3.5, 0, 0),
 170         F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
 171         F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
 172         F(344000000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
 173         F(430000000, P_DISP_CC_PLL0_OUT_MAIN, 2, 0, 0),
 174         { }
 175 };
 176 
 177 static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
 178         .cmd_rcgr = 0x2088,
 179         .mnd_width = 0,
 180         .hid_width = 5,
 181         .parent_map = disp_cc_parent_map_3,
 182         .freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
 183         .clkr.hw.init = &(struct clk_init_data){
 184                 .name = "disp_cc_mdss_mdp_clk_src",
 185                 .parent_names = disp_cc_parent_names_3,
 186                 .num_parents = 5,
 187                 .ops = &clk_rcg2_shared_ops,
 188         },
 189 };
 190 
 191 /* Return the HW recalc rate for idle use case */
 192 static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
 193         .cmd_rcgr = 0x2058,
 194         .mnd_width = 8,
 195         .hid_width = 5,
 196         .parent_map = disp_cc_parent_map_4,
 197         .clkr.hw.init = &(struct clk_init_data){
 198                 .name = "disp_cc_mdss_pclk0_clk_src",
 199                 .parent_names = disp_cc_parent_names_4,
 200                 .num_parents = 4,
 201                 .flags = CLK_SET_RATE_PARENT,
 202                 .ops = &clk_pixel_ops,
 203         },
 204 };
 205 
 206 /* Return the HW recalc rate for idle use case */
 207 static struct clk_rcg2 disp_cc_mdss_pclk1_clk_src = {
 208         .cmd_rcgr = 0x2070,
 209         .mnd_width = 8,
 210         .hid_width = 5,
 211         .parent_map = disp_cc_parent_map_4,
 212         .clkr.hw.init = &(struct clk_init_data){
 213                 .name = "disp_cc_mdss_pclk1_clk_src",
 214                 .parent_names = disp_cc_parent_names_4,
 215                 .num_parents = 4,
 216                 .flags = CLK_SET_RATE_PARENT,
 217                 .ops = &clk_pixel_ops,
 218         },
 219 };
 220 
 221 static const struct freq_tbl ftbl_disp_cc_mdss_rot_clk_src[] = {
 222         F(19200000, P_BI_TCXO, 1, 0, 0),
 223         F(171428571, P_GPLL0_OUT_MAIN, 3.5, 0, 0),
 224         F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
 225         F(344000000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
 226         F(430000000, P_DISP_CC_PLL0_OUT_MAIN, 2, 0, 0),
 227         { }
 228 };
 229 
 230 static struct clk_rcg2 disp_cc_mdss_rot_clk_src = {
 231         .cmd_rcgr = 0x20a0,
 232         .mnd_width = 0,
 233         .hid_width = 5,
 234         .parent_map = disp_cc_parent_map_3,
 235         .freq_tbl = ftbl_disp_cc_mdss_rot_clk_src,
 236         .clkr.hw.init = &(struct clk_init_data){
 237                 .name = "disp_cc_mdss_rot_clk_src",
 238                 .parent_names = disp_cc_parent_names_3,
 239                 .num_parents = 5,
 240                 .ops = &clk_rcg2_shared_ops,
 241         },
 242 };
 243 
 244 static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
 245         .cmd_rcgr = 0x20b8,
 246         .mnd_width = 0,
 247         .hid_width = 5,
 248         .parent_map = disp_cc_parent_map_2,
 249         .freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src,
 250         .clkr.hw.init = &(struct clk_init_data){
 251                 .name = "disp_cc_mdss_vsync_clk_src",
 252                 .parent_names = disp_cc_parent_names_2,
 253                 .num_parents = 2,
 254                 .ops = &clk_rcg2_ops,
 255         },
 256 };
 257 
 258 static struct clk_branch disp_cc_mdss_ahb_clk = {
 259         .halt_reg = 0x4004,
 260         .halt_check = BRANCH_HALT,
 261         .clkr = {
 262                 .enable_reg = 0x4004,
 263                 .enable_mask = BIT(0),
 264                 .hw.init = &(struct clk_init_data){
 265                         .name = "disp_cc_mdss_ahb_clk",
 266                         .ops = &clk_branch2_ops,
 267                 },
 268         },
 269 };
 270 
 271 static struct clk_branch disp_cc_mdss_axi_clk = {
 272         .halt_reg = 0x4008,
 273         .halt_check = BRANCH_HALT,
 274         .clkr = {
 275                 .enable_reg = 0x4008,
 276                 .enable_mask = BIT(0),
 277                 .hw.init = &(struct clk_init_data){
 278                         .name = "disp_cc_mdss_axi_clk",
 279                         .ops = &clk_branch2_ops,
 280                 },
 281         },
 282 };
 283 
 284 /* Return the HW recalc rate for idle use case */
 285 static struct clk_branch disp_cc_mdss_byte0_clk = {
 286         .halt_reg = 0x2028,
 287         .halt_check = BRANCH_HALT,
 288         .clkr = {
 289                 .enable_reg = 0x2028,
 290                 .enable_mask = BIT(0),
 291                 .hw.init = &(struct clk_init_data){
 292                         .name = "disp_cc_mdss_byte0_clk",
 293                         .parent_names = (const char *[]){
 294                                 "disp_cc_mdss_byte0_clk_src",
 295                         },
 296                         .num_parents = 1,
 297                         .flags = CLK_SET_RATE_PARENT,
 298                         .ops = &clk_branch2_ops,
 299                 },
 300         },
 301 };
 302 
 303 /* Return the HW recalc rate for idle use case */
 304 static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
 305         .reg = 0x20e8,
 306         .shift = 0,
 307         .width = 2,
 308         .clkr = {
 309                 .hw.init = &(struct clk_init_data){
 310                         .name = "disp_cc_mdss_byte0_div_clk_src",
 311                         .parent_names = (const char *[]){
 312                                 "disp_cc_mdss_byte0_clk_src",
 313                         },
 314                         .num_parents = 1,
 315                         .ops = &clk_regmap_div_ops,
 316                 },
 317         },
 318 };
 319 
 320 /* Return the HW recalc rate for idle use case */
 321 static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
 322         .halt_reg = 0x202c,
 323         .halt_check = BRANCH_HALT,
 324         .clkr = {
 325                 .enable_reg = 0x202c,
 326                 .enable_mask = BIT(0),
 327                 .hw.init = &(struct clk_init_data){
 328                         .name = "disp_cc_mdss_byte0_intf_clk",
 329                         .parent_names = (const char *[]){
 330                                 "disp_cc_mdss_byte0_div_clk_src",
 331                         },
 332                         .num_parents = 1,
 333                         .flags = CLK_SET_RATE_PARENT,
 334                         .ops = &clk_branch2_ops,
 335                 },
 336         },
 337 };
 338 
 339 /* Return the HW recalc rate for idle use case */
 340 static struct clk_branch disp_cc_mdss_byte1_clk = {
 341         .halt_reg = 0x2030,
 342         .halt_check = BRANCH_HALT,
 343         .clkr = {
 344                 .enable_reg = 0x2030,
 345                 .enable_mask = BIT(0),
 346                 .hw.init = &(struct clk_init_data){
 347                         .name = "disp_cc_mdss_byte1_clk",
 348                         .parent_names = (const char *[]){
 349                                 "disp_cc_mdss_byte1_clk_src",
 350                         },
 351                         .num_parents = 1,
 352                         .flags = CLK_SET_RATE_PARENT,
 353                         .ops = &clk_branch2_ops,
 354                 },
 355         },
 356 };
 357 
 358 /* Return the HW recalc rate for idle use case */
 359 static struct clk_regmap_div disp_cc_mdss_byte1_div_clk_src = {
 360         .reg = 0x2104,
 361         .shift = 0,
 362         .width = 2,
 363         .clkr = {
 364                 .hw.init = &(struct clk_init_data){
 365                         .name = "disp_cc_mdss_byte1_div_clk_src",
 366                         .parent_names = (const char *[]){
 367                                 "disp_cc_mdss_byte1_clk_src",
 368                         },
 369                         .num_parents = 1,
 370                         .ops = &clk_regmap_div_ops,
 371                 },
 372         },
 373 };
 374 
 375 /* Return the HW recalc rate for idle use case */
 376 static struct clk_branch disp_cc_mdss_byte1_intf_clk = {
 377         .halt_reg = 0x2034,
 378         .halt_check = BRANCH_HALT,
 379         .clkr = {
 380                 .enable_reg = 0x2034,
 381                 .enable_mask = BIT(0),
 382                 .hw.init = &(struct clk_init_data){
 383                         .name = "disp_cc_mdss_byte1_intf_clk",
 384                         .parent_names = (const char *[]){
 385                                 "disp_cc_mdss_byte1_div_clk_src",
 386                         },
 387                         .num_parents = 1,
 388                         .flags = CLK_SET_RATE_PARENT,
 389                         .ops = &clk_branch2_ops,
 390                 },
 391         },
 392 };
 393 
 394 static struct clk_branch disp_cc_mdss_esc0_clk = {
 395         .halt_reg = 0x2038,
 396         .halt_check = BRANCH_HALT,
 397         .clkr = {
 398                 .enable_reg = 0x2038,
 399                 .enable_mask = BIT(0),
 400                 .hw.init = &(struct clk_init_data){
 401                         .name = "disp_cc_mdss_esc0_clk",
 402                         .parent_names = (const char *[]){
 403                                 "disp_cc_mdss_esc0_clk_src",
 404                         },
 405                         .num_parents = 1,
 406                         .flags = CLK_SET_RATE_PARENT,
 407                         .ops = &clk_branch2_ops,
 408                 },
 409         },
 410 };
 411 
 412 static struct clk_branch disp_cc_mdss_esc1_clk = {
 413         .halt_reg = 0x203c,
 414         .halt_check = BRANCH_HALT,
 415         .clkr = {
 416                 .enable_reg = 0x203c,
 417                 .enable_mask = BIT(0),
 418                 .hw.init = &(struct clk_init_data){
 419                         .name = "disp_cc_mdss_esc1_clk",
 420                         .parent_names = (const char *[]){
 421                                 "disp_cc_mdss_esc1_clk_src",
 422                         },
 423                         .num_parents = 1,
 424                         .flags = CLK_SET_RATE_PARENT,
 425                         .ops = &clk_branch2_ops,
 426                 },
 427         },
 428 };
 429 
 430 static struct clk_branch disp_cc_mdss_mdp_clk = {
 431         .halt_reg = 0x200c,
 432         .halt_check = BRANCH_HALT,
 433         .clkr = {
 434                 .enable_reg = 0x200c,
 435                 .enable_mask = BIT(0),
 436                 .hw.init = &(struct clk_init_data){
 437                         .name = "disp_cc_mdss_mdp_clk",
 438                         .parent_names = (const char *[]){
 439                                 "disp_cc_mdss_mdp_clk_src",
 440                         },
 441                         .num_parents = 1,
 442                         .flags = CLK_SET_RATE_PARENT,
 443                         .ops = &clk_branch2_ops,
 444                 },
 445         },
 446 };
 447 
 448 static struct clk_branch disp_cc_mdss_mdp_lut_clk = {
 449         .halt_reg = 0x201c,
 450         .halt_check = BRANCH_HALT,
 451         .clkr = {
 452                 .enable_reg = 0x201c,
 453                 .enable_mask = BIT(0),
 454                 .hw.init = &(struct clk_init_data){
 455                         .name = "disp_cc_mdss_mdp_lut_clk",
 456                         .parent_names = (const char *[]){
 457                                 "disp_cc_mdss_mdp_clk_src",
 458                         },
 459                         .num_parents = 1,
 460                         .ops = &clk_branch2_ops,
 461                 },
 462         },
 463 };
 464 
 465 /* Return the HW recalc rate for idle use case */
 466 static struct clk_branch disp_cc_mdss_pclk0_clk = {
 467         .halt_reg = 0x2004,
 468         .halt_check = BRANCH_HALT,
 469         .clkr = {
 470                 .enable_reg = 0x2004,
 471                 .enable_mask = BIT(0),
 472                 .hw.init = &(struct clk_init_data){
 473                         .name = "disp_cc_mdss_pclk0_clk",
 474                         .parent_names = (const char *[]){
 475                                 "disp_cc_mdss_pclk0_clk_src",
 476                         },
 477                         .num_parents = 1,
 478                         .flags = CLK_SET_RATE_PARENT,
 479                         .ops = &clk_branch2_ops,
 480                 },
 481         },
 482 };
 483 
 484 /* Return the HW recalc rate for idle use case */
 485 static struct clk_branch disp_cc_mdss_pclk1_clk = {
 486         .halt_reg = 0x2008,
 487         .halt_check = BRANCH_HALT,
 488         .clkr = {
 489                 .enable_reg = 0x2008,
 490                 .enable_mask = BIT(0),
 491                 .hw.init = &(struct clk_init_data){
 492                         .name = "disp_cc_mdss_pclk1_clk",
 493                         .parent_names = (const char *[]){
 494                                 "disp_cc_mdss_pclk1_clk_src",
 495                         },
 496                         .num_parents = 1,
 497                         .flags = CLK_SET_RATE_PARENT,
 498                         .ops = &clk_branch2_ops,
 499                 },
 500         },
 501 };
 502 
 503 static struct clk_branch disp_cc_mdss_rot_clk = {
 504         .halt_reg = 0x2014,
 505         .halt_check = BRANCH_HALT,
 506         .clkr = {
 507                 .enable_reg = 0x2014,
 508                 .enable_mask = BIT(0),
 509                 .hw.init = &(struct clk_init_data){
 510                         .name = "disp_cc_mdss_rot_clk",
 511                         .parent_names = (const char *[]){
 512                                 "disp_cc_mdss_rot_clk_src",
 513                         },
 514                         .num_parents = 1,
 515                         .flags = CLK_SET_RATE_PARENT,
 516                         .ops = &clk_branch2_ops,
 517                 },
 518         },
 519 };
 520 
 521 static struct clk_branch disp_cc_mdss_rscc_ahb_clk = {
 522         .halt_reg = 0x5004,
 523         .halt_check = BRANCH_HALT,
 524         .clkr = {
 525                 .enable_reg = 0x5004,
 526                 .enable_mask = BIT(0),
 527                 .hw.init = &(struct clk_init_data){
 528                         .name = "disp_cc_mdss_rscc_ahb_clk",
 529                         .ops = &clk_branch2_ops,
 530                 },
 531         },
 532 };
 533 
 534 static struct clk_branch disp_cc_mdss_rscc_vsync_clk = {
 535         .halt_reg = 0x5008,
 536         .halt_check = BRANCH_HALT,
 537         .clkr = {
 538                 .enable_reg = 0x5008,
 539                 .enable_mask = BIT(0),
 540                 .hw.init = &(struct clk_init_data){
 541                         .name = "disp_cc_mdss_rscc_vsync_clk",
 542                         .parent_names = (const char *[]){
 543                                 "disp_cc_mdss_vsync_clk_src",
 544                         },
 545                         .num_parents = 1,
 546                         .flags = CLK_SET_RATE_PARENT,
 547                         .ops = &clk_branch2_ops,
 548                 },
 549         },
 550 };
 551 
 552 static struct clk_branch disp_cc_mdss_vsync_clk = {
 553         .halt_reg = 0x2024,
 554         .halt_check = BRANCH_HALT,
 555         .clkr = {
 556                 .enable_reg = 0x2024,
 557                 .enable_mask = BIT(0),
 558                 .hw.init = &(struct clk_init_data){
 559                         .name = "disp_cc_mdss_vsync_clk",
 560                         .parent_names = (const char *[]){
 561                                 "disp_cc_mdss_vsync_clk_src",
 562                         },
 563                         .num_parents = 1,
 564                         .flags = CLK_SET_RATE_PARENT,
 565                         .ops = &clk_branch2_ops,
 566                 },
 567         },
 568 };
 569 
 570 static struct gdsc mdss_gdsc = {
 571         .gdscr = 0x3000,
 572         .pd = {
 573                 .name = "mdss_gdsc",
 574         },
 575         .pwrsts = PWRSTS_OFF_ON,
 576         .flags = HW_CTRL | POLL_CFG_GDSCR,
 577 };
 578 
 579 static struct clk_regmap *disp_cc_sdm845_clocks[] = {
 580         [DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr,
 581         [DISP_CC_MDSS_AXI_CLK] = &disp_cc_mdss_axi_clk.clkr,
 582         [DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr,
 583         [DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr,
 584         [DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr,
 585         [DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] =
 586                                         &disp_cc_mdss_byte0_div_clk_src.clkr,
 587         [DISP_CC_MDSS_BYTE1_CLK] = &disp_cc_mdss_byte1_clk.clkr,
 588         [DISP_CC_MDSS_BYTE1_CLK_SRC] = &disp_cc_mdss_byte1_clk_src.clkr,
 589         [DISP_CC_MDSS_BYTE1_INTF_CLK] = &disp_cc_mdss_byte1_intf_clk.clkr,
 590         [DISP_CC_MDSS_BYTE1_DIV_CLK_SRC] =
 591                                         &disp_cc_mdss_byte1_div_clk_src.clkr,
 592         [DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr,
 593         [DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr,
 594         [DISP_CC_MDSS_ESC1_CLK] = &disp_cc_mdss_esc1_clk.clkr,
 595         [DISP_CC_MDSS_ESC1_CLK_SRC] = &disp_cc_mdss_esc1_clk_src.clkr,
 596         [DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr,
 597         [DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr,
 598         [DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr,
 599         [DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr,
 600         [DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr,
 601         [DISP_CC_MDSS_PCLK1_CLK] = &disp_cc_mdss_pclk1_clk.clkr,
 602         [DISP_CC_MDSS_PCLK1_CLK_SRC] = &disp_cc_mdss_pclk1_clk_src.clkr,
 603         [DISP_CC_MDSS_ROT_CLK] = &disp_cc_mdss_rot_clk.clkr,
 604         [DISP_CC_MDSS_ROT_CLK_SRC] = &disp_cc_mdss_rot_clk_src.clkr,
 605         [DISP_CC_MDSS_RSCC_AHB_CLK] = &disp_cc_mdss_rscc_ahb_clk.clkr,
 606         [DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr,
 607         [DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr,
 608         [DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr,
 609         [DISP_CC_PLL0] = &disp_cc_pll0.clkr,
 610 };
 611 
 612 static const struct qcom_reset_map disp_cc_sdm845_resets[] = {
 613         [DISP_CC_MDSS_RSCC_BCR] = { 0x5000 },
 614 };
 615 
 616 static struct gdsc *disp_cc_sdm845_gdscs[] = {
 617         [MDSS_GDSC] = &mdss_gdsc,
 618 };
 619 
 620 static const struct regmap_config disp_cc_sdm845_regmap_config = {
 621         .reg_bits       = 32,
 622         .reg_stride     = 4,
 623         .val_bits       = 32,
 624         .max_register   = 0x10000,
 625         .fast_io        = true,
 626 };
 627 
 628 static const struct qcom_cc_desc disp_cc_sdm845_desc = {
 629         .config = &disp_cc_sdm845_regmap_config,
 630         .clks = disp_cc_sdm845_clocks,
 631         .num_clks = ARRAY_SIZE(disp_cc_sdm845_clocks),
 632         .resets = disp_cc_sdm845_resets,
 633         .num_resets = ARRAY_SIZE(disp_cc_sdm845_resets),
 634         .gdscs = disp_cc_sdm845_gdscs,
 635         .num_gdscs = ARRAY_SIZE(disp_cc_sdm845_gdscs),
 636 };
 637 
 638 static const struct of_device_id disp_cc_sdm845_match_table[] = {
 639         { .compatible = "qcom,sdm845-dispcc" },
 640         { }
 641 };
 642 MODULE_DEVICE_TABLE(of, disp_cc_sdm845_match_table);
 643 
 644 static int disp_cc_sdm845_probe(struct platform_device *pdev)
 645 {
 646         struct regmap *regmap;
 647         struct alpha_pll_config disp_cc_pll0_config = {};
 648 
 649         regmap = qcom_cc_map(pdev, &disp_cc_sdm845_desc);
 650         if (IS_ERR(regmap))
 651                 return PTR_ERR(regmap);
 652 
 653         disp_cc_pll0_config.l = 0x2c;
 654         disp_cc_pll0_config.alpha = 0xcaaa;
 655 
 656         clk_fabia_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
 657 
 658         /* Enable hardware clock gating for DSI and MDP clocks */
 659         regmap_update_bits(regmap, 0x8000, 0x7f0, 0x7f0);
 660 
 661         return qcom_cc_really_probe(pdev, &disp_cc_sdm845_desc, regmap);
 662 }
 663 
 664 static struct platform_driver disp_cc_sdm845_driver = {
 665         .probe          = disp_cc_sdm845_probe,
 666         .driver         = {
 667                 .name   = "disp_cc-sdm845",
 668                 .of_match_table = disp_cc_sdm845_match_table,
 669         },
 670 };
 671 
 672 static int __init disp_cc_sdm845_init(void)
 673 {
 674         return platform_driver_register(&disp_cc_sdm845_driver);
 675 }
 676 subsys_initcall(disp_cc_sdm845_init);
 677 
 678 static void __exit disp_cc_sdm845_exit(void)
 679 {
 680         platform_driver_unregister(&disp_cc_sdm845_driver);
 681 }
 682 module_exit(disp_cc_sdm845_exit);
 683 
 684 MODULE_LICENSE("GPL v2");
 685 MODULE_DESCRIPTION("QTI DISPCC SDM845 Driver");

/* [<][>][^][v][top][bottom][index][help] */