gcc-sdx65.c (42439B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Copyright (c) 2021, 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/module.h> 10#include <linux/of_device.h> 11#include <linux/of.h> 12#include <linux/regmap.h> 13 14#include <dt-bindings/clock/qcom,gcc-sdx65.h> 15 16#include "clk-alpha-pll.h" 17#include "clk-branch.h" 18#include "clk-rcg.h" 19#include "clk-regmap.h" 20#include "clk-regmap-divider.h" 21#include "clk-regmap-mux.h" 22#include "common.h" 23#include "gdsc.h" 24#include "reset.h" 25 26enum { 27 P_BI_TCXO, 28 P_GPLL0_OUT_EVEN, 29 P_GPLL0_OUT_MAIN, 30 P_PCIE_PIPE_CLK, 31 P_SLEEP_CLK, 32 P_USB3_PHY_WRAPPER_GCC_USB30_PIPE_CLK, 33}; 34 35static struct clk_alpha_pll gpll0 = { 36 .offset = 0x0, 37 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO], 38 .clkr = { 39 .enable_reg = 0x6d000, 40 .enable_mask = BIT(0), 41 .hw.init = &(struct clk_init_data){ 42 .name = "gpll0", 43 .parent_data = &(const struct clk_parent_data){ 44 .fw_name = "bi_tcxo", 45 }, 46 .num_parents = 1, 47 .ops = &clk_alpha_pll_fixed_lucid_evo_ops, 48 }, 49 }, 50}; 51 52static const struct clk_div_table post_div_table_gpll0_out_even[] = { 53 { 0x1, 2 }, 54 { } 55}; 56 57static struct clk_alpha_pll_postdiv gpll0_out_even = { 58 .offset = 0x0, 59 .post_div_shift = 10, 60 .post_div_table = post_div_table_gpll0_out_even, 61 .num_post_div = ARRAY_SIZE(post_div_table_gpll0_out_even), 62 .width = 4, 63 .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO], 64 .clkr.hw.init = &(struct clk_init_data){ 65 .name = "gpll0_out_even", 66 .parent_hws = (const struct clk_hw *[]){ &gpll0.clkr.hw }, 67 .num_parents = 1, 68 .ops = &clk_alpha_pll_postdiv_lucid_evo_ops, 69 }, 70}; 71 72static const struct parent_map gcc_parent_map_0[] = { 73 { P_BI_TCXO, 0 }, 74 { P_GPLL0_OUT_MAIN, 1 }, 75 { P_GPLL0_OUT_EVEN, 6 }, 76}; 77 78static const struct clk_parent_data gcc_parent_data_0[] = { 79 { .fw_name = "bi_tcxo" }, 80 { .hw = &gpll0.clkr.hw }, 81 { .hw = &gpll0_out_even.clkr.hw }, 82}; 83 84static const struct clk_parent_data gcc_parent_data_0_ao[] = { 85 { .fw_name = "bi_tcxo_ao" }, 86 { .hw = &gpll0.clkr.hw }, 87 { .hw = &gpll0_out_even.clkr.hw }, 88}; 89 90static const struct parent_map gcc_parent_map_2[] = { 91 { P_BI_TCXO, 0 }, 92 { P_GPLL0_OUT_MAIN, 1 }, 93 { P_SLEEP_CLK, 5 }, 94 { P_GPLL0_OUT_EVEN, 6 }, 95}; 96 97static const struct clk_parent_data gcc_parent_data_2[] = { 98 { .fw_name = "bi_tcxo" }, 99 { .hw = &gpll0.clkr.hw }, 100 { .fw_name = "sleep_clk" }, 101 { .hw = &gpll0_out_even.clkr.hw }, 102}; 103 104static const struct parent_map gcc_parent_map_3[] = { 105 { P_BI_TCXO, 0 }, 106 { P_SLEEP_CLK, 5 }, 107}; 108 109static const struct clk_parent_data gcc_parent_data_3[] = { 110 { .fw_name = "bi_tcxo" }, 111 { .fw_name = "sleep_clk" }, 112}; 113 114static const struct parent_map gcc_parent_map_4[] = { 115 { P_BI_TCXO, 2 }, 116}; 117 118static const struct parent_map gcc_parent_map_5[] = { 119 { P_PCIE_PIPE_CLK, 0 }, 120 { P_BI_TCXO, 2 }, 121}; 122 123static const struct clk_parent_data gcc_parent_data_5[] = { 124 { .fw_name = "pcie_pipe_clk"}, 125 { .fw_name = "bi_tcxo"}, 126}; 127 128static const struct parent_map gcc_parent_map_6[] = { 129 { P_USB3_PHY_WRAPPER_GCC_USB30_PIPE_CLK, 0 }, 130 { P_BI_TCXO, 2 }, 131}; 132 133static const struct clk_parent_data gcc_parent_data_6[] = { 134 { .fw_name = "usb3_phy_wrapper_gcc_usb30_pipe_clk"}, 135 { .fw_name = "bi_tcxo"}, 136}; 137 138static struct clk_regmap_mux gcc_pcie_aux_clk_src = { 139 .reg = 0x43060, 140 .shift = 0, 141 .width = 2, 142 .parent_map = gcc_parent_map_4, 143 .clkr = { 144 .hw.init = &(struct clk_init_data){ 145 .name = "gcc_pcie_aux_clk_src", 146 .parent_data = &(const struct clk_parent_data){ 147 .fw_name = "bi_tcxo", 148 }, 149 .num_parents = 1, 150 .ops = &clk_regmap_mux_closest_ops, 151 }, 152 }, 153}; 154 155static struct clk_regmap_mux gcc_pcie_pipe_clk_src = { 156 .reg = 0x43044, 157 .shift = 0, 158 .width = 2, 159 .parent_map = gcc_parent_map_5, 160 .clkr = { 161 .hw.init = &(struct clk_init_data){ 162 .name = "gcc_pcie_pipe_clk_src", 163 .parent_data = gcc_parent_data_5, 164 .num_parents = 2, 165 .ops = &clk_regmap_mux_closest_ops, 166 }, 167 }, 168}; 169 170static struct clk_regmap_mux gcc_usb3_phy_pipe_clk_src = { 171 .reg = 0x1706c, 172 .shift = 0, 173 .width = 2, 174 .parent_map = gcc_parent_map_6, 175 .clkr = { 176 .hw.init = &(struct clk_init_data){ 177 .name = "gcc_usb3_phy_pipe_clk_src", 178 .parent_data = gcc_parent_data_6, 179 .num_parents = 2, 180 .ops = &clk_regmap_mux_closest_ops, 181 }, 182 }, 183}; 184 185static const struct freq_tbl ftbl_gcc_blsp1_qup1_i2c_apps_clk_src[] = { 186 F(9600000, P_BI_TCXO, 2, 0, 0), 187 F(19200000, P_BI_TCXO, 1, 0, 0), 188 F(50000000, P_GPLL0_OUT_MAIN, 12, 0, 0), 189 { } 190}; 191 192static struct clk_rcg2 gcc_blsp1_qup1_i2c_apps_clk_src = { 193 .cmd_rcgr = 0x1c024, 194 .mnd_width = 8, 195 .hid_width = 5, 196 .parent_map = gcc_parent_map_0, 197 .freq_tbl = ftbl_gcc_blsp1_qup1_i2c_apps_clk_src, 198 .clkr.hw.init = &(struct clk_init_data){ 199 .name = "gcc_blsp1_qup1_i2c_apps_clk_src", 200 .parent_data = gcc_parent_data_0, 201 .num_parents = 3, 202 .flags = CLK_SET_RATE_PARENT, 203 .ops = &clk_rcg2_ops, 204 }, 205}; 206 207static const struct freq_tbl ftbl_gcc_blsp1_qup1_spi_apps_clk_src[] = { 208 F(960000, P_BI_TCXO, 10, 1, 2), 209 F(4800000, P_BI_TCXO, 4, 0, 0), 210 F(9600000, P_BI_TCXO, 2, 0, 0), 211 F(15000000, P_GPLL0_OUT_EVEN, 5, 1, 4), 212 F(19200000, P_BI_TCXO, 1, 0, 0), 213 F(24000000, P_GPLL0_OUT_MAIN, 12.5, 1, 2), 214 F(25000000, P_GPLL0_OUT_MAIN, 12, 1, 2), 215 F(50000000, P_GPLL0_OUT_MAIN, 12, 0, 0), 216 { } 217}; 218 219static struct clk_rcg2 gcc_blsp1_qup1_spi_apps_clk_src = { 220 .cmd_rcgr = 0x1c00c, 221 .mnd_width = 8, 222 .hid_width = 5, 223 .parent_map = gcc_parent_map_0, 224 .freq_tbl = ftbl_gcc_blsp1_qup1_spi_apps_clk_src, 225 .clkr.hw.init = &(struct clk_init_data){ 226 .name = "gcc_blsp1_qup1_spi_apps_clk_src", 227 .parent_data = gcc_parent_data_0, 228 .num_parents = 3, 229 .flags = CLK_SET_RATE_PARENT, 230 .ops = &clk_rcg2_ops, 231 }, 232}; 233 234static struct clk_rcg2 gcc_blsp1_qup2_i2c_apps_clk_src = { 235 .cmd_rcgr = 0x1e024, 236 .mnd_width = 8, 237 .hid_width = 5, 238 .parent_map = gcc_parent_map_0, 239 .freq_tbl = ftbl_gcc_blsp1_qup1_i2c_apps_clk_src, 240 .clkr.hw.init = &(struct clk_init_data){ 241 .name = "gcc_blsp1_qup2_i2c_apps_clk_src", 242 .parent_data = gcc_parent_data_0, 243 .num_parents = 3, 244 .flags = CLK_SET_RATE_PARENT, 245 .ops = &clk_rcg2_ops, 246 }, 247}; 248 249static struct clk_rcg2 gcc_blsp1_qup2_spi_apps_clk_src = { 250 .cmd_rcgr = 0x1e00c, 251 .mnd_width = 8, 252 .hid_width = 5, 253 .parent_map = gcc_parent_map_0, 254 .freq_tbl = ftbl_gcc_blsp1_qup1_spi_apps_clk_src, 255 .clkr.hw.init = &(struct clk_init_data){ 256 .name = "gcc_blsp1_qup2_spi_apps_clk_src", 257 .parent_data = gcc_parent_data_0, 258 .num_parents = 3, 259 .flags = CLK_SET_RATE_PARENT, 260 .ops = &clk_rcg2_ops, 261 }, 262}; 263 264static struct clk_rcg2 gcc_blsp1_qup3_i2c_apps_clk_src = { 265 .cmd_rcgr = 0x20024, 266 .mnd_width = 8, 267 .hid_width = 5, 268 .parent_map = gcc_parent_map_0, 269 .freq_tbl = ftbl_gcc_blsp1_qup1_i2c_apps_clk_src, 270 .clkr.hw.init = &(struct clk_init_data){ 271 .name = "gcc_blsp1_qup3_i2c_apps_clk_src", 272 .parent_data = gcc_parent_data_0, 273 .num_parents = 3, 274 .flags = CLK_SET_RATE_PARENT, 275 .ops = &clk_rcg2_ops, 276 }, 277}; 278 279static struct clk_rcg2 gcc_blsp1_qup3_spi_apps_clk_src = { 280 .cmd_rcgr = 0x2000c, 281 .mnd_width = 8, 282 .hid_width = 5, 283 .parent_map = gcc_parent_map_0, 284 .freq_tbl = ftbl_gcc_blsp1_qup1_spi_apps_clk_src, 285 .clkr.hw.init = &(struct clk_init_data){ 286 .name = "gcc_blsp1_qup3_spi_apps_clk_src", 287 .parent_data = gcc_parent_data_0, 288 .num_parents = 3, 289 .flags = CLK_SET_RATE_PARENT, 290 .ops = &clk_rcg2_ops, 291 }, 292}; 293 294static struct clk_rcg2 gcc_blsp1_qup4_i2c_apps_clk_src = { 295 .cmd_rcgr = 0x22024, 296 .mnd_width = 8, 297 .hid_width = 5, 298 .parent_map = gcc_parent_map_0, 299 .freq_tbl = ftbl_gcc_blsp1_qup1_i2c_apps_clk_src, 300 .clkr.hw.init = &(struct clk_init_data){ 301 .name = "gcc_blsp1_qup4_i2c_apps_clk_src", 302 .parent_data = gcc_parent_data_0, 303 .num_parents = 3, 304 .flags = CLK_SET_RATE_PARENT, 305 .ops = &clk_rcg2_ops, 306 }, 307}; 308 309static struct clk_rcg2 gcc_blsp1_qup4_spi_apps_clk_src = { 310 .cmd_rcgr = 0x2200c, 311 .mnd_width = 8, 312 .hid_width = 5, 313 .parent_map = gcc_parent_map_0, 314 .freq_tbl = ftbl_gcc_blsp1_qup1_spi_apps_clk_src, 315 .clkr.hw.init = &(struct clk_init_data){ 316 .name = "gcc_blsp1_qup4_spi_apps_clk_src", 317 .parent_data = gcc_parent_data_0, 318 .num_parents = 3, 319 .flags = CLK_SET_RATE_PARENT, 320 .ops = &clk_rcg2_ops, 321 }, 322}; 323 324static const struct freq_tbl ftbl_gcc_blsp1_uart1_apps_clk_src[] = { 325 F(3686400, P_GPLL0_OUT_EVEN, 1, 192, 15625), 326 F(7372800, P_GPLL0_OUT_EVEN, 1, 384, 15625), 327 F(9600000, P_BI_TCXO, 2, 0, 0), 328 F(14745600, P_GPLL0_OUT_EVEN, 1, 768, 15625), 329 F(16000000, P_GPLL0_OUT_EVEN, 1, 4, 75), 330 F(19200000, P_BI_TCXO, 1, 0, 0), 331 F(19354839, P_GPLL0_OUT_MAIN, 15.5, 1, 2), 332 F(20000000, P_GPLL0_OUT_MAIN, 15, 1, 2), 333 F(20689655, P_GPLL0_OUT_MAIN, 14.5, 1, 2), 334 F(21428571, P_GPLL0_OUT_MAIN, 14, 1, 2), 335 F(22222222, P_GPLL0_OUT_MAIN, 13.5, 1, 2), 336 F(23076923, P_GPLL0_OUT_MAIN, 13, 1, 2), 337 F(24000000, P_GPLL0_OUT_MAIN, 5, 1, 5), 338 F(25000000, P_GPLL0_OUT_MAIN, 12, 1, 2), 339 F(26086957, P_GPLL0_OUT_MAIN, 11.5, 1, 2), 340 F(27272727, P_GPLL0_OUT_MAIN, 11, 1, 2), 341 F(28571429, P_GPLL0_OUT_MAIN, 10.5, 1, 2), 342 F(32000000, P_GPLL0_OUT_MAIN, 1, 4, 75), 343 F(40000000, P_GPLL0_OUT_MAIN, 15, 0, 0), 344 F(46400000, P_GPLL0_OUT_MAIN, 1, 29, 375), 345 F(48000000, P_GPLL0_OUT_MAIN, 12.5, 0, 0), 346 F(51200000, P_GPLL0_OUT_MAIN, 1, 32, 375), 347 F(56000000, P_GPLL0_OUT_MAIN, 1, 7, 75), 348 F(58982400, P_GPLL0_OUT_MAIN, 1, 1536, 15625), 349 F(60000000, P_GPLL0_OUT_MAIN, 10, 0, 0), 350 F(63157895, P_GPLL0_OUT_MAIN, 9.5, 0, 0), 351 { } 352}; 353 354static struct clk_rcg2 gcc_blsp1_uart1_apps_clk_src = { 355 .cmd_rcgr = 0x1d00c, 356 .mnd_width = 16, 357 .hid_width = 5, 358 .parent_map = gcc_parent_map_0, 359 .freq_tbl = ftbl_gcc_blsp1_uart1_apps_clk_src, 360 .clkr.hw.init = &(struct clk_init_data){ 361 .name = "gcc_blsp1_uart1_apps_clk_src", 362 .parent_data = gcc_parent_data_0, 363 .num_parents = 3, 364 .flags = CLK_SET_RATE_PARENT, 365 .ops = &clk_rcg2_ops, 366 }, 367}; 368 369static struct clk_rcg2 gcc_blsp1_uart2_apps_clk_src = { 370 .cmd_rcgr = 0x1f00c, 371 .mnd_width = 16, 372 .hid_width = 5, 373 .parent_map = gcc_parent_map_0, 374 .freq_tbl = ftbl_gcc_blsp1_uart1_apps_clk_src, 375 .clkr.hw.init = &(struct clk_init_data){ 376 .name = "gcc_blsp1_uart2_apps_clk_src", 377 .parent_data = gcc_parent_data_0, 378 .num_parents = 3, 379 .flags = CLK_SET_RATE_PARENT, 380 .ops = &clk_rcg2_ops, 381 }, 382}; 383 384static struct clk_rcg2 gcc_blsp1_uart3_apps_clk_src = { 385 .cmd_rcgr = 0x2100c, 386 .mnd_width = 16, 387 .hid_width = 5, 388 .parent_map = gcc_parent_map_0, 389 .freq_tbl = ftbl_gcc_blsp1_uart1_apps_clk_src, 390 .clkr.hw.init = &(struct clk_init_data){ 391 .name = "gcc_blsp1_uart3_apps_clk_src", 392 .parent_data = gcc_parent_data_0, 393 .num_parents = 3, 394 .flags = CLK_SET_RATE_PARENT, 395 .ops = &clk_rcg2_ops, 396 }, 397}; 398 399static struct clk_rcg2 gcc_blsp1_uart4_apps_clk_src = { 400 .cmd_rcgr = 0x2300c, 401 .mnd_width = 16, 402 .hid_width = 5, 403 .parent_map = gcc_parent_map_0, 404 .freq_tbl = ftbl_gcc_blsp1_uart1_apps_clk_src, 405 .clkr.hw.init = &(struct clk_init_data){ 406 .name = "gcc_blsp1_uart4_apps_clk_src", 407 .parent_data = gcc_parent_data_0, 408 .num_parents = 3, 409 .flags = CLK_SET_RATE_PARENT, 410 .ops = &clk_rcg2_ops, 411 }, 412}; 413 414static const struct freq_tbl ftbl_gcc_cpuss_ahb_clk_src[] = { 415 F(19200000, P_BI_TCXO, 1, 0, 0), 416 F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0), 417 F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 418 F(133333333, P_GPLL0_OUT_MAIN, 4.5, 0, 0), 419 { } 420}; 421 422static struct clk_rcg2 gcc_cpuss_ahb_clk_src = { 423 .cmd_rcgr = 0x3000c, 424 .mnd_width = 0, 425 .hid_width = 5, 426 .parent_map = gcc_parent_map_0, 427 .freq_tbl = ftbl_gcc_cpuss_ahb_clk_src, 428 .clkr.hw.init = &(struct clk_init_data){ 429 .name = "gcc_cpuss_ahb_clk_src", 430 .parent_data = gcc_parent_data_0_ao, 431 .num_parents = 3, 432 .flags = CLK_SET_RATE_PARENT, 433 .ops = &clk_rcg2_ops, 434 }, 435}; 436 437static const struct freq_tbl ftbl_gcc_gp1_clk_src[] = { 438 F(19200000, P_BI_TCXO, 1, 0, 0), 439 F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0), 440 F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 441 F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 442 { } 443}; 444 445static struct clk_rcg2 gcc_gp1_clk_src = { 446 .cmd_rcgr = 0x37004, 447 .mnd_width = 16, 448 .hid_width = 5, 449 .parent_map = gcc_parent_map_2, 450 .freq_tbl = ftbl_gcc_gp1_clk_src, 451 .clkr.hw.init = &(struct clk_init_data){ 452 .name = "gcc_gp1_clk_src", 453 .parent_data = gcc_parent_data_2, 454 .num_parents = 4, 455 .flags = CLK_SET_RATE_PARENT, 456 .ops = &clk_rcg2_ops, 457 }, 458}; 459 460static struct clk_rcg2 gcc_gp2_clk_src = { 461 .cmd_rcgr = 0x38004, 462 .mnd_width = 16, 463 .hid_width = 5, 464 .parent_map = gcc_parent_map_2, 465 .freq_tbl = ftbl_gcc_gp1_clk_src, 466 .clkr.hw.init = &(struct clk_init_data){ 467 .name = "gcc_gp2_clk_src", 468 .parent_data = gcc_parent_data_2, 469 .num_parents = 4, 470 .flags = CLK_SET_RATE_PARENT, 471 .ops = &clk_rcg2_ops, 472 }, 473}; 474 475static struct clk_rcg2 gcc_gp3_clk_src = { 476 .cmd_rcgr = 0x39004, 477 .mnd_width = 16, 478 .hid_width = 5, 479 .parent_map = gcc_parent_map_2, 480 .freq_tbl = ftbl_gcc_gp1_clk_src, 481 .clkr.hw.init = &(struct clk_init_data){ 482 .name = "gcc_gp3_clk_src", 483 .parent_data = gcc_parent_data_2, 484 .num_parents = 4, 485 .flags = CLK_SET_RATE_PARENT, 486 .ops = &clk_rcg2_ops, 487 }, 488}; 489 490static const struct freq_tbl ftbl_gcc_pcie_aux_phy_clk_src[] = { 491 F(19200000, P_BI_TCXO, 1, 0, 0), 492 { } 493}; 494 495static struct clk_rcg2 gcc_pcie_aux_phy_clk_src = { 496 .cmd_rcgr = 0x43048, 497 .mnd_width = 16, 498 .hid_width = 5, 499 .parent_map = gcc_parent_map_3, 500 .freq_tbl = ftbl_gcc_pcie_aux_phy_clk_src, 501 .clkr.hw.init = &(struct clk_init_data){ 502 .name = "gcc_pcie_aux_phy_clk_src", 503 .parent_data = gcc_parent_data_3, 504 .num_parents = 2, 505 .flags = CLK_SET_RATE_PARENT, 506 .ops = &clk_rcg2_ops, 507 }, 508}; 509 510static const struct freq_tbl ftbl_gcc_pcie_rchng_phy_clk_src[] = { 511 F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0), 512 { } 513}; 514 515static struct clk_rcg2 gcc_pcie_rchng_phy_clk_src = { 516 .cmd_rcgr = 0x43064, 517 .mnd_width = 0, 518 .hid_width = 5, 519 .parent_map = gcc_parent_map_2, 520 .freq_tbl = ftbl_gcc_pcie_rchng_phy_clk_src, 521 .clkr.hw.init = &(struct clk_init_data){ 522 .name = "gcc_pcie_rchng_phy_clk_src", 523 .parent_data = gcc_parent_data_2, 524 .num_parents = 4, 525 .flags = CLK_SET_RATE_PARENT, 526 .ops = &clk_rcg2_ops, 527 }, 528}; 529 530static const struct freq_tbl ftbl_gcc_pdm2_clk_src[] = { 531 F(19200000, P_BI_TCXO, 1, 0, 0), 532 F(60000000, P_GPLL0_OUT_MAIN, 10, 0, 0), 533 { } 534}; 535 536static struct clk_rcg2 gcc_pdm2_clk_src = { 537 .cmd_rcgr = 0x24010, 538 .mnd_width = 0, 539 .hid_width = 5, 540 .parent_map = gcc_parent_map_0, 541 .freq_tbl = ftbl_gcc_pdm2_clk_src, 542 .clkr.hw.init = &(struct clk_init_data){ 543 .name = "gcc_pdm2_clk_src", 544 .parent_data = gcc_parent_data_0, 545 .num_parents = 3, 546 .flags = CLK_SET_RATE_PARENT, 547 .ops = &clk_rcg2_ops, 548 }, 549}; 550 551static const struct freq_tbl ftbl_gcc_sdcc1_apps_clk_src[] = { 552 F(400000, P_BI_TCXO, 12, 1, 4), 553 F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0), 554 F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0), 555 F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 556 F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 557 { } 558}; 559 560static struct clk_rcg2 gcc_sdcc1_apps_clk_src = { 561 .cmd_rcgr = 0x1a010, 562 .mnd_width = 8, 563 .hid_width = 5, 564 .parent_map = gcc_parent_map_0, 565 .freq_tbl = ftbl_gcc_sdcc1_apps_clk_src, 566 .clkr.hw.init = &(struct clk_init_data){ 567 .name = "gcc_sdcc1_apps_clk_src", 568 .parent_data = gcc_parent_data_0, 569 .num_parents = 3, 570 .flags = CLK_SET_RATE_PARENT, 571 .ops = &clk_rcg2_ops, 572 }, 573}; 574 575static const struct freq_tbl ftbl_gcc_usb30_master_clk_src[] = { 576 F(200000000, P_GPLL0_OUT_EVEN, 1.5, 0, 0), 577 { } 578}; 579 580static struct clk_rcg2 gcc_usb30_master_clk_src = { 581 .cmd_rcgr = 0x17030, 582 .mnd_width = 8, 583 .hid_width = 5, 584 .parent_map = gcc_parent_map_0, 585 .freq_tbl = ftbl_gcc_usb30_master_clk_src, 586 .clkr.hw.init = &(struct clk_init_data){ 587 .name = "gcc_usb30_master_clk_src", 588 .parent_data = gcc_parent_data_0, 589 .num_parents = 3, 590 .flags = CLK_SET_RATE_PARENT, 591 .ops = &clk_rcg2_ops, 592 }, 593}; 594 595static struct clk_rcg2 gcc_usb30_mock_utmi_clk_src = { 596 .cmd_rcgr = 0x17048, 597 .mnd_width = 0, 598 .hid_width = 5, 599 .parent_map = gcc_parent_map_0, 600 .freq_tbl = ftbl_gcc_pcie_aux_phy_clk_src, 601 .clkr.hw.init = &(struct clk_init_data){ 602 .name = "gcc_usb30_mock_utmi_clk_src", 603 .parent_data = gcc_parent_data_0, 604 .num_parents = 3, 605 .flags = CLK_SET_RATE_PARENT, 606 .ops = &clk_rcg2_ops, 607 }, 608}; 609 610static const struct freq_tbl ftbl_gcc_usb3_phy_aux_clk_src[] = { 611 F(1000000, P_BI_TCXO, 1, 5, 96), 612 F(19200000, P_BI_TCXO, 1, 0, 0), 613 { } 614}; 615 616static struct clk_rcg2 gcc_usb3_phy_aux_clk_src = { 617 .cmd_rcgr = 0x17070, 618 .mnd_width = 16, 619 .hid_width = 5, 620 .parent_map = gcc_parent_map_3, 621 .freq_tbl = ftbl_gcc_usb3_phy_aux_clk_src, 622 .clkr.hw.init = &(struct clk_init_data){ 623 .name = "gcc_usb3_phy_aux_clk_src", 624 .parent_data = gcc_parent_data_3, 625 .num_parents = 2, 626 .flags = CLK_SET_RATE_PARENT, 627 .ops = &clk_rcg2_ops, 628 }, 629}; 630 631static struct clk_regmap_div gcc_cpuss_ahb_postdiv_clk_src = { 632 .reg = 0x30024, 633 .shift = 0, 634 .width = 4, 635 .clkr.hw.init = &(struct clk_init_data) { 636 .name = "gcc_cpuss_ahb_postdiv_clk_src", 637 .parent_data = &(const struct clk_parent_data){ 638 .hw = &gcc_cpuss_ahb_clk_src.clkr.hw, 639 }, 640 .num_parents = 1, 641 .flags = CLK_SET_RATE_PARENT, 642 .ops = &clk_regmap_div_ro_ops, 643 }, 644}; 645 646static struct clk_regmap_div gcc_usb30_mock_utmi_postdiv_clk_src = { 647 .reg = 0x17060, 648 .shift = 0, 649 .width = 4, 650 .clkr.hw.init = &(struct clk_init_data) { 651 .name = "gcc_usb30_mock_utmi_postdiv_clk_src", 652 .parent_data = &(const struct clk_parent_data){ 653 .hw = &gcc_usb30_mock_utmi_clk_src.clkr.hw, 654 }, 655 .num_parents = 1, 656 .flags = CLK_SET_RATE_PARENT, 657 .ops = &clk_regmap_div_ro_ops, 658 }, 659}; 660 661static struct clk_branch gcc_ahb_pcie_link_clk = { 662 .halt_reg = 0x2e004, 663 .halt_check = BRANCH_HALT, 664 .clkr = { 665 .enable_reg = 0x2e004, 666 .enable_mask = BIT(0), 667 .hw.init = &(struct clk_init_data){ 668 .name = "gcc_ahb_pcie_link_clk", 669 .ops = &clk_branch2_ops, 670 }, 671 }, 672}; 673 674static struct clk_branch gcc_blsp1_ahb_clk = { 675 .halt_reg = 0x1b004, 676 .halt_check = BRANCH_HALT_VOTED, 677 .clkr = { 678 .enable_reg = 0x6d008, 679 .enable_mask = BIT(14), 680 .hw.init = &(struct clk_init_data){ 681 .name = "gcc_blsp1_ahb_clk", 682 .ops = &clk_branch2_ops, 683 }, 684 }, 685}; 686 687static struct clk_branch gcc_blsp1_qup1_i2c_apps_clk = { 688 .halt_reg = 0x1c008, 689 .halt_check = BRANCH_HALT, 690 .clkr = { 691 .enable_reg = 0x1c008, 692 .enable_mask = BIT(0), 693 .hw.init = &(struct clk_init_data){ 694 .name = "gcc_blsp1_qup1_i2c_apps_clk", 695 .parent_data = &(const struct clk_parent_data){ 696 .hw = &gcc_blsp1_qup1_i2c_apps_clk_src.clkr.hw, 697 }, 698 .num_parents = 1, 699 .flags = CLK_SET_RATE_PARENT, 700 .ops = &clk_branch2_ops, 701 }, 702 }, 703}; 704 705static struct clk_branch gcc_blsp1_qup1_spi_apps_clk = { 706 .halt_reg = 0x1c004, 707 .halt_check = BRANCH_HALT, 708 .clkr = { 709 .enable_reg = 0x1c004, 710 .enable_mask = BIT(0), 711 .hw.init = &(struct clk_init_data){ 712 .name = "gcc_blsp1_qup1_spi_apps_clk", 713 .parent_data = &(const struct clk_parent_data){ 714 .hw = &gcc_blsp1_qup1_spi_apps_clk_src.clkr.hw, 715 }, 716 .num_parents = 1, 717 .flags = CLK_SET_RATE_PARENT, 718 .ops = &clk_branch2_ops, 719 }, 720 }, 721}; 722 723static struct clk_branch gcc_blsp1_qup2_i2c_apps_clk = { 724 .halt_reg = 0x1e008, 725 .halt_check = BRANCH_HALT, 726 .clkr = { 727 .enable_reg = 0x1e008, 728 .enable_mask = BIT(0), 729 .hw.init = &(struct clk_init_data){ 730 .name = "gcc_blsp1_qup2_i2c_apps_clk", 731 .parent_data = &(const struct clk_parent_data){ 732 .hw = &gcc_blsp1_qup2_i2c_apps_clk_src.clkr.hw, 733 }, 734 .num_parents = 1, 735 .flags = CLK_SET_RATE_PARENT, 736 .ops = &clk_branch2_ops, 737 }, 738 }, 739}; 740 741static struct clk_branch gcc_blsp1_qup2_spi_apps_clk = { 742 .halt_reg = 0x1e004, 743 .halt_check = BRANCH_HALT, 744 .clkr = { 745 .enable_reg = 0x1e004, 746 .enable_mask = BIT(0), 747 .hw.init = &(struct clk_init_data){ 748 .name = "gcc_blsp1_qup2_spi_apps_clk", 749 .parent_data = &(const struct clk_parent_data){ 750 .hw = &gcc_blsp1_qup2_spi_apps_clk_src.clkr.hw, 751 }, 752 .num_parents = 1, 753 .flags = CLK_SET_RATE_PARENT, 754 .ops = &clk_branch2_ops, 755 }, 756 }, 757}; 758 759static struct clk_branch gcc_blsp1_qup3_i2c_apps_clk = { 760 .halt_reg = 0x20008, 761 .halt_check = BRANCH_HALT, 762 .clkr = { 763 .enable_reg = 0x20008, 764 .enable_mask = BIT(0), 765 .hw.init = &(struct clk_init_data){ 766 .name = "gcc_blsp1_qup3_i2c_apps_clk", 767 .parent_data = &(const struct clk_parent_data){ 768 .hw = &gcc_blsp1_qup3_i2c_apps_clk_src.clkr.hw, 769 }, 770 .num_parents = 1, 771 .flags = CLK_SET_RATE_PARENT, 772 .ops = &clk_branch2_ops, 773 }, 774 }, 775}; 776 777static struct clk_branch gcc_blsp1_qup3_spi_apps_clk = { 778 .halt_reg = 0x20004, 779 .halt_check = BRANCH_HALT, 780 .clkr = { 781 .enable_reg = 0x20004, 782 .enable_mask = BIT(0), 783 .hw.init = &(struct clk_init_data){ 784 .name = "gcc_blsp1_qup3_spi_apps_clk", 785 .parent_data = &(const struct clk_parent_data){ 786 .hw = &gcc_blsp1_qup3_spi_apps_clk_src.clkr.hw, 787 }, 788 .num_parents = 1, 789 .flags = CLK_SET_RATE_PARENT, 790 .ops = &clk_branch2_ops, 791 }, 792 }, 793}; 794 795static struct clk_branch gcc_blsp1_qup4_i2c_apps_clk = { 796 .halt_reg = 0x22008, 797 .halt_check = BRANCH_HALT, 798 .clkr = { 799 .enable_reg = 0x22008, 800 .enable_mask = BIT(0), 801 .hw.init = &(struct clk_init_data){ 802 .name = "gcc_blsp1_qup4_i2c_apps_clk", 803 .parent_data = &(const struct clk_parent_data){ 804 .hw = &gcc_blsp1_qup4_i2c_apps_clk_src.clkr.hw, 805 }, 806 .num_parents = 1, 807 .flags = CLK_SET_RATE_PARENT, 808 .ops = &clk_branch2_ops, 809 }, 810 }, 811}; 812 813static struct clk_branch gcc_blsp1_qup4_spi_apps_clk = { 814 .halt_reg = 0x22004, 815 .halt_check = BRANCH_HALT, 816 .clkr = { 817 .enable_reg = 0x22004, 818 .enable_mask = BIT(0), 819 .hw.init = &(struct clk_init_data){ 820 .name = "gcc_blsp1_qup4_spi_apps_clk", 821 .parent_data = &(const struct clk_parent_data){ 822 .hw = &gcc_blsp1_qup4_spi_apps_clk_src.clkr.hw, 823 }, 824 .num_parents = 1, 825 .flags = CLK_SET_RATE_PARENT, 826 .ops = &clk_branch2_ops, 827 }, 828 }, 829}; 830 831static struct clk_branch gcc_blsp1_sleep_clk = { 832 .halt_reg = 0x1b00c, 833 .halt_check = BRANCH_HALT_VOTED, 834 .clkr = { 835 .enable_reg = 0x6d008, 836 .enable_mask = BIT(15), 837 .hw.init = &(struct clk_init_data){ 838 .name = "gcc_blsp1_sleep_clk", 839 .ops = &clk_branch2_ops, 840 }, 841 }, 842}; 843 844static struct clk_branch gcc_blsp1_uart1_apps_clk = { 845 .halt_reg = 0x1d004, 846 .halt_check = BRANCH_HALT, 847 .clkr = { 848 .enable_reg = 0x1d004, 849 .enable_mask = BIT(0), 850 .hw.init = &(struct clk_init_data){ 851 .name = "gcc_blsp1_uart1_apps_clk", 852 .parent_data = &(const struct clk_parent_data){ 853 .hw = &gcc_blsp1_uart1_apps_clk_src.clkr.hw, 854 }, 855 .num_parents = 1, 856 .flags = CLK_SET_RATE_PARENT, 857 .ops = &clk_branch2_ops, 858 }, 859 }, 860}; 861 862static struct clk_branch gcc_blsp1_uart2_apps_clk = { 863 .halt_reg = 0x1f004, 864 .halt_check = BRANCH_HALT, 865 .clkr = { 866 .enable_reg = 0x1f004, 867 .enable_mask = BIT(0), 868 .hw.init = &(struct clk_init_data){ 869 .name = "gcc_blsp1_uart2_apps_clk", 870 .parent_data = &(const struct clk_parent_data){ 871 .hw = &gcc_blsp1_uart2_apps_clk_src.clkr.hw, 872 }, 873 .num_parents = 1, 874 .flags = CLK_SET_RATE_PARENT, 875 .ops = &clk_branch2_ops, 876 }, 877 }, 878}; 879 880static struct clk_branch gcc_blsp1_uart3_apps_clk = { 881 .halt_reg = 0x21004, 882 .halt_check = BRANCH_HALT, 883 .clkr = { 884 .enable_reg = 0x21004, 885 .enable_mask = BIT(0), 886 .hw.init = &(struct clk_init_data){ 887 .name = "gcc_blsp1_uart3_apps_clk", 888 .parent_data = &(const struct clk_parent_data){ 889 .hw = &gcc_blsp1_uart3_apps_clk_src.clkr.hw, 890 }, 891 .num_parents = 1, 892 .flags = CLK_SET_RATE_PARENT, 893 .ops = &clk_branch2_ops, 894 }, 895 }, 896}; 897 898static struct clk_branch gcc_blsp1_uart4_apps_clk = { 899 .halt_reg = 0x23004, 900 .halt_check = BRANCH_HALT, 901 .clkr = { 902 .enable_reg = 0x23004, 903 .enable_mask = BIT(0), 904 .hw.init = &(struct clk_init_data){ 905 .name = "gcc_blsp1_uart4_apps_clk", 906 .parent_data = &(const struct clk_parent_data){ 907 .hw = &gcc_blsp1_uart4_apps_clk_src.clkr.hw, 908 }, 909 .num_parents = 1, 910 .flags = CLK_SET_RATE_PARENT, 911 .ops = &clk_branch2_ops, 912 }, 913 }, 914}; 915 916static struct clk_branch gcc_boot_rom_ahb_clk = { 917 .halt_reg = 0x27004, 918 .halt_check = BRANCH_HALT_VOTED, 919 .hwcg_reg = 0x27004, 920 .hwcg_bit = 1, 921 .clkr = { 922 .enable_reg = 0x6d008, 923 .enable_mask = BIT(10), 924 .hw.init = &(struct clk_init_data){ 925 .name = "gcc_boot_rom_ahb_clk", 926 .ops = &clk_branch2_ops, 927 }, 928 }, 929}; 930 931static struct clk_branch gcc_gp1_clk = { 932 .halt_reg = 0x37000, 933 .halt_check = BRANCH_HALT, 934 .clkr = { 935 .enable_reg = 0x37000, 936 .enable_mask = BIT(0), 937 .hw.init = &(struct clk_init_data){ 938 .name = "gcc_gp1_clk", 939 .parent_data = &(const struct clk_parent_data){ 940 .hw = &gcc_gp1_clk_src.clkr.hw, 941 }, 942 .num_parents = 1, 943 .flags = CLK_SET_RATE_PARENT, 944 .ops = &clk_branch2_ops, 945 }, 946 }, 947}; 948 949static struct clk_branch gcc_gp2_clk = { 950 .halt_reg = 0x38000, 951 .halt_check = BRANCH_HALT, 952 .clkr = { 953 .enable_reg = 0x38000, 954 .enable_mask = BIT(0), 955 .hw.init = &(struct clk_init_data){ 956 .name = "gcc_gp2_clk", 957 .parent_data = &(const struct clk_parent_data){ 958 .hw = &gcc_gp2_clk_src.clkr.hw, 959 }, 960 .num_parents = 1, 961 .flags = CLK_SET_RATE_PARENT, 962 .ops = &clk_branch2_ops, 963 }, 964 }, 965}; 966 967static struct clk_branch gcc_gp3_clk = { 968 .halt_reg = 0x39000, 969 .halt_check = BRANCH_HALT, 970 .clkr = { 971 .enable_reg = 0x39000, 972 .enable_mask = BIT(0), 973 .hw.init = &(struct clk_init_data){ 974 .name = "gcc_gp3_clk", 975 .parent_data = &(const struct clk_parent_data){ 976 .hw = &gcc_gp3_clk_src.clkr.hw, 977 }, 978 .num_parents = 1, 979 .flags = CLK_SET_RATE_PARENT, 980 .ops = &clk_branch2_ops, 981 }, 982 }, 983}; 984 985static struct clk_branch gcc_pcie_0_clkref_en = { 986 .halt_reg = 0x88004, 987 /* 988 * The clock controller does not handle the status bit for 989 * the clocks with gdscs(powerdomains) in hw controlled mode 990 * and hence avoid checking for the status bit of those clocks 991 * by setting the BRANCH_HALT_DELAY flag 992 */ 993 .halt_check = BRANCH_HALT_DELAY, 994 .clkr = { 995 .enable_reg = 0x88004, 996 .enable_mask = BIT(0), 997 .hw.init = &(struct clk_init_data){ 998 .name = "gcc_pcie_0_clkref_en", 999 .ops = &clk_branch2_ops, 1000 }, 1001 }, 1002}; 1003 1004static struct clk_branch gcc_pcie_aux_clk = { 1005 .halt_reg = 0x43034, 1006 /* 1007 * The clock controller does not handle the status bit for 1008 * the clocks with gdscs(powerdomains) in hw controlled mode 1009 * and hence avoid checking for the status bit of those clocks 1010 * by setting the BRANCH_HALT_DELAY flag 1011 */ 1012 .halt_check = BRANCH_HALT_DELAY, 1013 .hwcg_reg = 0x43034, 1014 .hwcg_bit = 1, 1015 .clkr = { 1016 .enable_reg = 0x6d010, 1017 .enable_mask = BIT(3), 1018 .hw.init = &(struct clk_init_data){ 1019 .name = "gcc_pcie_aux_clk", 1020 .parent_data = &(const struct clk_parent_data){ 1021 .hw = &gcc_pcie_aux_clk_src.clkr.hw, 1022 }, 1023 .num_parents = 1, 1024 .flags = CLK_SET_RATE_PARENT, 1025 .ops = &clk_branch2_ops, 1026 }, 1027 }, 1028}; 1029 1030static struct clk_branch gcc_pcie_cfg_ahb_clk = { 1031 .halt_reg = 0x4302c, 1032 .halt_check = BRANCH_HALT_VOTED, 1033 .hwcg_reg = 0x4302c, 1034 .hwcg_bit = 1, 1035 .clkr = { 1036 .enable_reg = 0x6d010, 1037 .enable_mask = BIT(2), 1038 .hw.init = &(struct clk_init_data){ 1039 .name = "gcc_pcie_cfg_ahb_clk", 1040 .ops = &clk_branch2_ops, 1041 }, 1042 }, 1043}; 1044 1045static struct clk_branch gcc_pcie_mstr_axi_clk = { 1046 .halt_reg = 0x43024, 1047 .halt_check = BRANCH_HALT_VOTED, 1048 .hwcg_reg = 0x43024, 1049 .hwcg_bit = 1, 1050 .clkr = { 1051 .enable_reg = 0x6d010, 1052 .enable_mask = BIT(1), 1053 .hw.init = &(struct clk_init_data){ 1054 .name = "gcc_pcie_mstr_axi_clk", 1055 .ops = &clk_branch2_ops, 1056 }, 1057 }, 1058}; 1059 1060static struct clk_branch gcc_pcie_pipe_clk = { 1061 .halt_reg = 0x4303c, 1062 /* 1063 * The clock controller does not handle the status bit for 1064 * the clocks with gdscs(powerdomains) in hw controlled mode 1065 * and hence avoid checking for the status bit of those clocks 1066 * by setting the BRANCH_HALT_DELAY flag 1067 */ 1068 .halt_check = BRANCH_HALT_DELAY, 1069 .hwcg_reg = 0x4303c, 1070 .hwcg_bit = 1, 1071 .clkr = { 1072 .enable_reg = 0x6d010, 1073 .enable_mask = BIT(4), 1074 .hw.init = &(struct clk_init_data){ 1075 .name = "gcc_pcie_pipe_clk", 1076 .parent_data = &(const struct clk_parent_data){ 1077 .hw = &gcc_pcie_pipe_clk_src.clkr.hw, 1078 }, 1079 .num_parents = 1, 1080 .flags = CLK_SET_RATE_PARENT, 1081 .ops = &clk_branch2_ops, 1082 }, 1083 }, 1084}; 1085 1086static struct clk_branch gcc_pcie_rchng_phy_clk = { 1087 .halt_reg = 0x43030, 1088 .halt_check = BRANCH_HALT_VOTED, 1089 .hwcg_reg = 0x43030, 1090 .hwcg_bit = 1, 1091 .clkr = { 1092 .enable_reg = 0x6d010, 1093 .enable_mask = BIT(7), 1094 .hw.init = &(struct clk_init_data){ 1095 .name = "gcc_pcie_rchng_phy_clk", 1096 .parent_data = &(const struct clk_parent_data){ 1097 .hw = &gcc_pcie_rchng_phy_clk_src.clkr.hw, 1098 }, 1099 .num_parents = 1, 1100 .flags = CLK_SET_RATE_PARENT, 1101 .ops = &clk_branch2_ops, 1102 }, 1103 }, 1104}; 1105 1106static struct clk_branch gcc_pcie_sleep_clk = { 1107 .halt_reg = 0x43038, 1108 .halt_check = BRANCH_HALT_VOTED, 1109 .hwcg_reg = 0x43038, 1110 .hwcg_bit = 1, 1111 .clkr = { 1112 .enable_reg = 0x6d010, 1113 .enable_mask = BIT(6), 1114 .hw.init = &(struct clk_init_data){ 1115 .name = "gcc_pcie_sleep_clk", 1116 .parent_data = &(const struct clk_parent_data){ 1117 .hw = &gcc_pcie_aux_phy_clk_src.clkr.hw, 1118 }, 1119 .num_parents = 1, 1120 .flags = CLK_SET_RATE_PARENT, 1121 .ops = &clk_branch2_ops, 1122 }, 1123 }, 1124}; 1125 1126static struct clk_branch gcc_pcie_slv_axi_clk = { 1127 .halt_reg = 0x4301c, 1128 .halt_check = BRANCH_HALT_VOTED, 1129 .hwcg_reg = 0x4301c, 1130 .hwcg_bit = 1, 1131 .clkr = { 1132 .enable_reg = 0x6d010, 1133 .enable_mask = BIT(0), 1134 .hw.init = &(struct clk_init_data){ 1135 .name = "gcc_pcie_slv_axi_clk", 1136 .ops = &clk_branch2_ops, 1137 }, 1138 }, 1139}; 1140 1141static struct clk_branch gcc_pcie_slv_q2a_axi_clk = { 1142 .halt_reg = 0x43018, 1143 .halt_check = BRANCH_HALT_VOTED, 1144 .hwcg_reg = 0x43018, 1145 .hwcg_bit = 1, 1146 .clkr = { 1147 .enable_reg = 0x6d010, 1148 .enable_mask = BIT(5), 1149 .hw.init = &(struct clk_init_data){ 1150 .name = "gcc_pcie_slv_q2a_axi_clk", 1151 .ops = &clk_branch2_ops, 1152 }, 1153 }, 1154}; 1155 1156static struct clk_branch gcc_pdm2_clk = { 1157 .halt_reg = 0x2400c, 1158 .halt_check = BRANCH_HALT, 1159 .clkr = { 1160 .enable_reg = 0x2400c, 1161 .enable_mask = BIT(0), 1162 .hw.init = &(struct clk_init_data){ 1163 .name = "gcc_pdm2_clk", 1164 .parent_data = &(const struct clk_parent_data){ 1165 .hw = &gcc_pdm2_clk_src.clkr.hw, 1166 }, 1167 .num_parents = 1, 1168 .flags = CLK_SET_RATE_PARENT, 1169 .ops = &clk_branch2_ops, 1170 }, 1171 }, 1172}; 1173 1174static struct clk_branch gcc_pdm_ahb_clk = { 1175 .halt_reg = 0x24004, 1176 .halt_check = BRANCH_HALT, 1177 .hwcg_reg = 0x24004, 1178 .hwcg_bit = 1, 1179 .clkr = { 1180 .enable_reg = 0x24004, 1181 .enable_mask = BIT(0), 1182 .hw.init = &(struct clk_init_data){ 1183 .name = "gcc_pdm_ahb_clk", 1184 .ops = &clk_branch2_ops, 1185 }, 1186 }, 1187}; 1188 1189static struct clk_branch gcc_pdm_xo4_clk = { 1190 .halt_reg = 0x24008, 1191 .halt_check = BRANCH_HALT, 1192 .clkr = { 1193 .enable_reg = 0x24008, 1194 .enable_mask = BIT(0), 1195 .hw.init = &(struct clk_init_data){ 1196 .name = "gcc_pdm_xo4_clk", 1197 .ops = &clk_branch2_ops, 1198 }, 1199 }, 1200}; 1201 1202static struct clk_branch gcc_rx1_usb2_clkref_en = { 1203 .halt_reg = 0x88008, 1204 .halt_check = BRANCH_HALT, 1205 .clkr = { 1206 .enable_reg = 0x88008, 1207 .enable_mask = BIT(0), 1208 .hw.init = &(struct clk_init_data){ 1209 .name = "gcc_rx1_usb2_clkref_en", 1210 .ops = &clk_branch2_ops, 1211 }, 1212 }, 1213}; 1214 1215static struct clk_branch gcc_sdcc1_ahb_clk = { 1216 .halt_reg = 0x1a00c, 1217 .halt_check = BRANCH_HALT, 1218 .clkr = { 1219 .enable_reg = 0x1a00c, 1220 .enable_mask = BIT(0), 1221 .hw.init = &(struct clk_init_data){ 1222 .name = "gcc_sdcc1_ahb_clk", 1223 .ops = &clk_branch2_ops, 1224 }, 1225 }, 1226}; 1227 1228static struct clk_branch gcc_sdcc1_apps_clk = { 1229 .halt_reg = 0x1a004, 1230 .halt_check = BRANCH_HALT, 1231 .clkr = { 1232 .enable_reg = 0x1a004, 1233 .enable_mask = BIT(0), 1234 .hw.init = &(struct clk_init_data){ 1235 .name = "gcc_sdcc1_apps_clk", 1236 .parent_data = &(const struct clk_parent_data){ 1237 .hw = &gcc_sdcc1_apps_clk_src.clkr.hw, 1238 }, 1239 .num_parents = 1, 1240 .flags = CLK_SET_RATE_PARENT, 1241 .ops = &clk_branch2_ops, 1242 }, 1243 }, 1244}; 1245 1246static struct clk_branch gcc_usb30_master_clk = { 1247 .halt_reg = 0x17018, 1248 .halt_check = BRANCH_HALT, 1249 .clkr = { 1250 .enable_reg = 0x17018, 1251 .enable_mask = BIT(0), 1252 .hw.init = &(struct clk_init_data){ 1253 .name = "gcc_usb30_master_clk", 1254 .parent_data = &(const struct clk_parent_data){ 1255 .hw = &gcc_usb30_master_clk_src.clkr.hw, 1256 }, 1257 .num_parents = 1, 1258 .flags = CLK_SET_RATE_PARENT, 1259 .ops = &clk_branch2_ops, 1260 }, 1261 }, 1262}; 1263 1264static struct clk_branch gcc_usb30_mock_utmi_clk = { 1265 .halt_reg = 0x1702c, 1266 .halt_check = BRANCH_HALT, 1267 .clkr = { 1268 .enable_reg = 0x1702c, 1269 .enable_mask = BIT(0), 1270 .hw.init = &(struct clk_init_data){ 1271 .name = "gcc_usb30_mock_utmi_clk", 1272 .parent_data = &(const struct clk_parent_data){ 1273 .hw = 1274 &gcc_usb30_mock_utmi_postdiv_clk_src.clkr.hw, 1275 }, 1276 .num_parents = 1, 1277 .flags = CLK_SET_RATE_PARENT, 1278 .ops = &clk_branch2_ops, 1279 }, 1280 }, 1281}; 1282 1283static struct clk_branch gcc_usb30_mstr_axi_clk = { 1284 .halt_reg = 0x17020, 1285 .halt_check = BRANCH_HALT, 1286 .clkr = { 1287 .enable_reg = 0x17020, 1288 .enable_mask = BIT(0), 1289 .hw.init = &(struct clk_init_data){ 1290 .name = "gcc_usb30_mstr_axi_clk", 1291 .ops = &clk_branch2_ops, 1292 }, 1293 }, 1294}; 1295 1296static struct clk_branch gcc_usb30_sleep_clk = { 1297 .halt_reg = 0x17028, 1298 .halt_check = BRANCH_HALT, 1299 .clkr = { 1300 .enable_reg = 0x17028, 1301 .enable_mask = BIT(0), 1302 .hw.init = &(struct clk_init_data){ 1303 .name = "gcc_usb30_sleep_clk", 1304 .ops = &clk_branch2_ops, 1305 }, 1306 }, 1307}; 1308 1309static struct clk_branch gcc_usb30_slv_ahb_clk = { 1310 .halt_reg = 0x17024, 1311 .halt_check = BRANCH_HALT, 1312 .clkr = { 1313 .enable_reg = 0x17024, 1314 .enable_mask = BIT(0), 1315 .hw.init = &(struct clk_init_data){ 1316 .name = "gcc_usb30_slv_ahb_clk", 1317 .ops = &clk_branch2_ops, 1318 }, 1319 }, 1320}; 1321 1322static struct clk_branch gcc_usb3_phy_aux_clk = { 1323 .halt_reg = 0x17064, 1324 .halt_check = BRANCH_HALT, 1325 .clkr = { 1326 .enable_reg = 0x17064, 1327 .enable_mask = BIT(0), 1328 .hw.init = &(struct clk_init_data){ 1329 .name = "gcc_usb3_phy_aux_clk", 1330 .parent_data = &(const struct clk_parent_data){ 1331 .hw = &gcc_usb3_phy_aux_clk_src.clkr.hw, 1332 }, 1333 .num_parents = 1, 1334 .flags = CLK_SET_RATE_PARENT, 1335 .ops = &clk_branch2_ops, 1336 }, 1337 }, 1338}; 1339 1340static struct gdsc usb30_gdsc = { 1341 .gdscr = 0x17004, 1342 .pd = { 1343 .name = "usb30_gdsc", 1344 }, 1345 .pwrsts = PWRSTS_OFF_ON, 1346}; 1347 1348static struct gdsc pcie_gdsc = { 1349 .gdscr = 0x43004, 1350 .pd = { 1351 .name = "pcie_gdsc", 1352 }, 1353 .pwrsts = PWRSTS_OFF_ON, 1354}; 1355 1356static struct clk_branch gcc_usb3_phy_pipe_clk = { 1357 .halt_reg = 0x17068, 1358 /* 1359 * The clock controller does not handle the status bit for 1360 * the clocks with gdscs(powerdomains) in hw controlled mode 1361 * and hence avoid checking for the status bit of those clocks 1362 * by setting the BRANCH_HALT_DELAY flag 1363 */ 1364 .halt_check = BRANCH_HALT_DELAY, 1365 .hwcg_reg = 0x17068, 1366 .hwcg_bit = 1, 1367 .clkr = { 1368 .enable_reg = 0x17068, 1369 .enable_mask = BIT(0), 1370 .hw.init = &(struct clk_init_data){ 1371 .name = "gcc_usb3_phy_pipe_clk", 1372 .parent_data = &(const struct clk_parent_data){ 1373 .hw = &gcc_usb3_phy_pipe_clk_src.clkr.hw, 1374 }, 1375 .num_parents = 1, 1376 .flags = CLK_SET_RATE_PARENT, 1377 .ops = &clk_branch2_ops, 1378 }, 1379 }, 1380}; 1381 1382static struct clk_branch gcc_usb3_prim_clkref_en = { 1383 .halt_reg = 0x88000, 1384 .halt_check = BRANCH_HALT, 1385 .clkr = { 1386 .enable_reg = 0x88000, 1387 .enable_mask = BIT(0), 1388 .hw.init = &(struct clk_init_data){ 1389 .name = "gcc_usb3_prim_clkref_en", 1390 .ops = &clk_branch2_ops, 1391 }, 1392 }, 1393}; 1394 1395static struct clk_branch gcc_usb_phy_cfg_ahb2phy_clk = { 1396 .halt_reg = 0x19008, 1397 .halt_check = BRANCH_HALT, 1398 .hwcg_reg = 0x19008, 1399 .hwcg_bit = 1, 1400 .clkr = { 1401 .enable_reg = 0x19008, 1402 .enable_mask = BIT(0), 1403 .hw.init = &(struct clk_init_data){ 1404 .name = "gcc_usb_phy_cfg_ahb2phy_clk", 1405 .ops = &clk_branch2_ops, 1406 }, 1407 }, 1408}; 1409 1410static struct clk_branch gcc_xo_div4_clk = { 1411 .halt_reg = 0x2e010, 1412 .halt_check = BRANCH_HALT, 1413 .clkr = { 1414 .enable_reg = 0x2e010, 1415 .enable_mask = BIT(0), 1416 .hw.init = &(struct clk_init_data){ 1417 .name = "gcc_xo_div4_clk", 1418 .ops = &clk_branch2_ops, 1419 }, 1420 }, 1421}; 1422 1423static struct clk_branch gcc_xo_pcie_link_clk = { 1424 .halt_reg = 0x2e008, 1425 .halt_check = BRANCH_HALT, 1426 .hwcg_reg = 0x2e008, 1427 .hwcg_bit = 1, 1428 .clkr = { 1429 .enable_reg = 0x2e008, 1430 .enable_mask = BIT(0), 1431 .hw.init = &(struct clk_init_data){ 1432 .name = "gcc_xo_pcie_link_clk", 1433 .ops = &clk_branch2_ops, 1434 }, 1435 }, 1436}; 1437 1438static struct clk_regmap *gcc_sdx65_clocks[] = { 1439 [GCC_AHB_PCIE_LINK_CLK] = &gcc_ahb_pcie_link_clk.clkr, 1440 [GCC_BLSP1_AHB_CLK] = &gcc_blsp1_ahb_clk.clkr, 1441 [GCC_BLSP1_QUP1_I2C_APPS_CLK] = &gcc_blsp1_qup1_i2c_apps_clk.clkr, 1442 [GCC_BLSP1_QUP1_I2C_APPS_CLK_SRC] = &gcc_blsp1_qup1_i2c_apps_clk_src.clkr, 1443 [GCC_BLSP1_QUP1_SPI_APPS_CLK] = &gcc_blsp1_qup1_spi_apps_clk.clkr, 1444 [GCC_BLSP1_QUP1_SPI_APPS_CLK_SRC] = &gcc_blsp1_qup1_spi_apps_clk_src.clkr, 1445 [GCC_BLSP1_QUP2_I2C_APPS_CLK] = &gcc_blsp1_qup2_i2c_apps_clk.clkr, 1446 [GCC_BLSP1_QUP2_I2C_APPS_CLK_SRC] = &gcc_blsp1_qup2_i2c_apps_clk_src.clkr, 1447 [GCC_BLSP1_QUP2_SPI_APPS_CLK] = &gcc_blsp1_qup2_spi_apps_clk.clkr, 1448 [GCC_BLSP1_QUP2_SPI_APPS_CLK_SRC] = &gcc_blsp1_qup2_spi_apps_clk_src.clkr, 1449 [GCC_BLSP1_QUP3_I2C_APPS_CLK] = &gcc_blsp1_qup3_i2c_apps_clk.clkr, 1450 [GCC_BLSP1_QUP3_I2C_APPS_CLK_SRC] = &gcc_blsp1_qup3_i2c_apps_clk_src.clkr, 1451 [GCC_BLSP1_QUP3_SPI_APPS_CLK] = &gcc_blsp1_qup3_spi_apps_clk.clkr, 1452 [GCC_BLSP1_QUP3_SPI_APPS_CLK_SRC] = &gcc_blsp1_qup3_spi_apps_clk_src.clkr, 1453 [GCC_BLSP1_QUP4_I2C_APPS_CLK] = &gcc_blsp1_qup4_i2c_apps_clk.clkr, 1454 [GCC_BLSP1_QUP4_I2C_APPS_CLK_SRC] = &gcc_blsp1_qup4_i2c_apps_clk_src.clkr, 1455 [GCC_BLSP1_QUP4_SPI_APPS_CLK] = &gcc_blsp1_qup4_spi_apps_clk.clkr, 1456 [GCC_BLSP1_QUP4_SPI_APPS_CLK_SRC] = &gcc_blsp1_qup4_spi_apps_clk_src.clkr, 1457 [GCC_BLSP1_SLEEP_CLK] = &gcc_blsp1_sleep_clk.clkr, 1458 [GCC_BLSP1_UART1_APPS_CLK] = &gcc_blsp1_uart1_apps_clk.clkr, 1459 [GCC_BLSP1_UART1_APPS_CLK_SRC] = &gcc_blsp1_uart1_apps_clk_src.clkr, 1460 [GCC_BLSP1_UART2_APPS_CLK] = &gcc_blsp1_uart2_apps_clk.clkr, 1461 [GCC_BLSP1_UART2_APPS_CLK_SRC] = &gcc_blsp1_uart2_apps_clk_src.clkr, 1462 [GCC_BLSP1_UART3_APPS_CLK] = &gcc_blsp1_uart3_apps_clk.clkr, 1463 [GCC_BLSP1_UART3_APPS_CLK_SRC] = &gcc_blsp1_uart3_apps_clk_src.clkr, 1464 [GCC_BLSP1_UART4_APPS_CLK] = &gcc_blsp1_uart4_apps_clk.clkr, 1465 [GCC_BLSP1_UART4_APPS_CLK_SRC] = &gcc_blsp1_uart4_apps_clk_src.clkr, 1466 [GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr, 1467 [GCC_CPUSS_AHB_CLK_SRC] = &gcc_cpuss_ahb_clk_src.clkr, 1468 [GCC_CPUSS_AHB_POSTDIV_CLK_SRC] = &gcc_cpuss_ahb_postdiv_clk_src.clkr, 1469 [GCC_GP1_CLK] = &gcc_gp1_clk.clkr, 1470 [GCC_GP1_CLK_SRC] = &gcc_gp1_clk_src.clkr, 1471 [GCC_GP2_CLK] = &gcc_gp2_clk.clkr, 1472 [GCC_GP2_CLK_SRC] = &gcc_gp2_clk_src.clkr, 1473 [GCC_GP3_CLK] = &gcc_gp3_clk.clkr, 1474 [GCC_GP3_CLK_SRC] = &gcc_gp3_clk_src.clkr, 1475 [GCC_PCIE_0_CLKREF_EN] = &gcc_pcie_0_clkref_en.clkr, 1476 [GCC_PCIE_AUX_CLK] = &gcc_pcie_aux_clk.clkr, 1477 [GCC_PCIE_AUX_CLK_SRC] = &gcc_pcie_aux_clk_src.clkr, 1478 [GCC_PCIE_AUX_PHY_CLK_SRC] = &gcc_pcie_aux_phy_clk_src.clkr, 1479 [GCC_PCIE_CFG_AHB_CLK] = &gcc_pcie_cfg_ahb_clk.clkr, 1480 [GCC_PCIE_MSTR_AXI_CLK] = &gcc_pcie_mstr_axi_clk.clkr, 1481 [GCC_PCIE_PIPE_CLK] = &gcc_pcie_pipe_clk.clkr, 1482 [GCC_PCIE_PIPE_CLK_SRC] = &gcc_pcie_pipe_clk_src.clkr, 1483 [GCC_PCIE_RCHNG_PHY_CLK] = &gcc_pcie_rchng_phy_clk.clkr, 1484 [GCC_PCIE_RCHNG_PHY_CLK_SRC] = &gcc_pcie_rchng_phy_clk_src.clkr, 1485 [GCC_PCIE_SLEEP_CLK] = &gcc_pcie_sleep_clk.clkr, 1486 [GCC_PCIE_SLV_AXI_CLK] = &gcc_pcie_slv_axi_clk.clkr, 1487 [GCC_PCIE_SLV_Q2A_AXI_CLK] = &gcc_pcie_slv_q2a_axi_clk.clkr, 1488 [GCC_PDM2_CLK] = &gcc_pdm2_clk.clkr, 1489 [GCC_PDM2_CLK_SRC] = &gcc_pdm2_clk_src.clkr, 1490 [GCC_PDM_AHB_CLK] = &gcc_pdm_ahb_clk.clkr, 1491 [GCC_PDM_XO4_CLK] = &gcc_pdm_xo4_clk.clkr, 1492 [GCC_RX1_USB2_CLKREF_EN] = &gcc_rx1_usb2_clkref_en.clkr, 1493 [GCC_SDCC1_AHB_CLK] = &gcc_sdcc1_ahb_clk.clkr, 1494 [GCC_SDCC1_APPS_CLK] = &gcc_sdcc1_apps_clk.clkr, 1495 [GCC_SDCC1_APPS_CLK_SRC] = &gcc_sdcc1_apps_clk_src.clkr, 1496 [GCC_USB30_MASTER_CLK] = &gcc_usb30_master_clk.clkr, 1497 [GCC_USB30_MASTER_CLK_SRC] = &gcc_usb30_master_clk_src.clkr, 1498 [GCC_USB30_MOCK_UTMI_CLK] = &gcc_usb30_mock_utmi_clk.clkr, 1499 [GCC_USB30_MOCK_UTMI_CLK_SRC] = &gcc_usb30_mock_utmi_clk_src.clkr, 1500 [GCC_USB30_MOCK_UTMI_POSTDIV_CLK_SRC] = &gcc_usb30_mock_utmi_postdiv_clk_src.clkr, 1501 [GCC_USB30_MSTR_AXI_CLK] = &gcc_usb30_mstr_axi_clk.clkr, 1502 [GCC_USB30_SLEEP_CLK] = &gcc_usb30_sleep_clk.clkr, 1503 [GCC_USB30_SLV_AHB_CLK] = &gcc_usb30_slv_ahb_clk.clkr, 1504 [GCC_USB3_PHY_AUX_CLK] = &gcc_usb3_phy_aux_clk.clkr, 1505 [GCC_USB3_PHY_AUX_CLK_SRC] = &gcc_usb3_phy_aux_clk_src.clkr, 1506 [GCC_USB3_PHY_PIPE_CLK] = &gcc_usb3_phy_pipe_clk.clkr, 1507 [GCC_USB3_PHY_PIPE_CLK_SRC] = &gcc_usb3_phy_pipe_clk_src.clkr, 1508 [GCC_USB3_PRIM_CLKREF_EN] = &gcc_usb3_prim_clkref_en.clkr, 1509 [GCC_USB_PHY_CFG_AHB2PHY_CLK] = &gcc_usb_phy_cfg_ahb2phy_clk.clkr, 1510 [GCC_XO_DIV4_CLK] = &gcc_xo_div4_clk.clkr, 1511 [GCC_XO_PCIE_LINK_CLK] = &gcc_xo_pcie_link_clk.clkr, 1512 [GPLL0] = &gpll0.clkr, 1513 [GPLL0_OUT_EVEN] = &gpll0_out_even.clkr, 1514}; 1515 1516static const struct qcom_reset_map gcc_sdx65_resets[] = { 1517 [GCC_BLSP1_QUP1_BCR] = { 0x1c000 }, 1518 [GCC_BLSP1_QUP2_BCR] = { 0x1e000 }, 1519 [GCC_BLSP1_QUP3_BCR] = { 0x20000 }, 1520 [GCC_BLSP1_QUP4_BCR] = { 0x22000 }, 1521 [GCC_BLSP1_UART1_BCR] = { 0x1d000 }, 1522 [GCC_BLSP1_UART2_BCR] = { 0x1f000 }, 1523 [GCC_BLSP1_UART3_BCR] = { 0x21000 }, 1524 [GCC_BLSP1_UART4_BCR] = { 0x23000 }, 1525 [GCC_PCIE_BCR] = { 0x43000 }, 1526 [GCC_PCIE_LINK_DOWN_BCR] = { 0x77000 }, 1527 [GCC_PCIE_NOCSR_COM_PHY_BCR] = { 0x78008 }, 1528 [GCC_PCIE_PHY_BCR] = { 0x44000 }, 1529 [GCC_PCIE_PHY_CFG_AHB_BCR] = { 0x78000 }, 1530 [GCC_PCIE_PHY_COM_BCR] = { 0x78004 }, 1531 [GCC_PCIE_PHY_NOCSR_COM_PHY_BCR] = { 0x7800c }, 1532 [GCC_PDM_BCR] = { 0x24000 }, 1533 [GCC_QUSB2PHY_BCR] = { 0x19000 }, 1534 [GCC_SDCC1_BCR] = { 0x1a000 }, 1535 [GCC_TCSR_PCIE_BCR] = { 0x57000 }, 1536 [GCC_USB30_BCR] = { 0x17000 }, 1537 [GCC_USB3_PHY_BCR] = { 0x18000 }, 1538 [GCC_USB3PHY_PHY_BCR] = { 0x18004 }, 1539 [GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x19004 }, 1540}; 1541 1542static struct gdsc *gcc_sdx65_gdscs[] = { 1543 [USB30_GDSC] = &usb30_gdsc, 1544 [PCIE_GDSC] = &pcie_gdsc, 1545}; 1546 1547static const struct regmap_config gcc_sdx65_regmap_config = { 1548 .reg_bits = 32, 1549 .reg_stride = 4, 1550 .val_bits = 32, 1551 .max_register = 0x1f101c, 1552 .fast_io = true, 1553}; 1554 1555static const struct qcom_cc_desc gcc_sdx65_desc = { 1556 .config = &gcc_sdx65_regmap_config, 1557 .clks = gcc_sdx65_clocks, 1558 .num_clks = ARRAY_SIZE(gcc_sdx65_clocks), 1559 .resets = gcc_sdx65_resets, 1560 .num_resets = ARRAY_SIZE(gcc_sdx65_resets), 1561 .gdscs = gcc_sdx65_gdscs, 1562 .num_gdscs = ARRAY_SIZE(gcc_sdx65_gdscs), 1563}; 1564 1565static const struct of_device_id gcc_sdx65_match_table[] = { 1566 { .compatible = "qcom,gcc-sdx65" }, 1567 { } 1568}; 1569MODULE_DEVICE_TABLE(of, gcc_sdx65_match_table); 1570 1571static int gcc_sdx65_probe(struct platform_device *pdev) 1572{ 1573 struct regmap *regmap; 1574 1575 regmap = qcom_cc_map(pdev, &gcc_sdx65_desc); 1576 if (IS_ERR(regmap)) 1577 return PTR_ERR(regmap); 1578 /* 1579 * Keep the clocks always-ON as they are critical to the functioning 1580 * of the system: 1581 * GCC_SYS_NOC_CPUSS_AHB_CLK, GCC_CPUSS_AHB_CLK, GCC_CPUSS_GNOC_CLK 1582 */ 1583 regmap_update_bits(regmap, 0x6d008, BIT(0), BIT(0)); 1584 regmap_update_bits(regmap, 0x6d008, BIT(21), BIT(21)); 1585 regmap_update_bits(regmap, 0x6d008, BIT(22), BIT(22)); 1586 1587 return qcom_cc_really_probe(pdev, &gcc_sdx65_desc, regmap); 1588} 1589 1590static struct platform_driver gcc_sdx65_driver = { 1591 .probe = gcc_sdx65_probe, 1592 .driver = { 1593 .name = "gcc-sdx65", 1594 .of_match_table = gcc_sdx65_match_table, 1595 }, 1596}; 1597 1598static int __init gcc_sdx65_init(void) 1599{ 1600 return platform_driver_register(&gcc_sdx65_driver); 1601} 1602subsys_initcall(gcc_sdx65_init); 1603 1604static void __exit gcc_sdx65_exit(void) 1605{ 1606 platform_driver_unregister(&gcc_sdx65_driver); 1607} 1608module_exit(gcc_sdx65_exit); 1609 1610MODULE_DESCRIPTION("QTI GCC SDX65 Driver"); 1611MODULE_LICENSE("GPL v2");