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