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

clk: qcom: Add support for MSM8960's global clock controller (GCC)

Add a driver for the global clock controller found on MSM8960
based platforms. This should allow most non-multimedia device
drivers to probe and control their clocks.

Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Signed-off-by: Mike Turquette <mturquette@linaro.org>

authored by

Stephen Boyd and committed by
Mike Turquette
2ec94130 b36ba30c

+3434
+8
drivers/clk/qcom/Kconfig
··· 3 3 depends on OF 4 4 select REGMAP_MMIO 5 5 select RESET_CONTROLLER 6 + 7 + config MSM_GCC_8960 8 + tristate "MSM8960 Global Clock Controller" 9 + depends on COMMON_CLK_QCOM 10 + help 11 + Support for the global clock controller on msm8960 devices. 12 + Say Y if you want to use peripheral devices such as UART, SPI, 13 + i2c, USB, SD/eMMC, SATA, PCIe, etc.
+2
drivers/clk/qcom/Makefile
··· 6 6 clk-qcom-$(CONFIG_COMMON_CLK_QCOM) += clk-rcg2.o 7 7 clk-qcom-$(CONFIG_COMMON_CLK_QCOM) += clk-branch.o 8 8 clk-qcom-$(CONFIG_COMMON_CLK_QCOM) += reset.o 9 + 10 + obj-$(CONFIG_MSM_GCC_8960) += gcc-msm8960.o
+2993
drivers/clk/qcom/gcc-msm8960.c
··· 1 + /* 2 + * Copyright (c) 2013, The Linux Foundation. All rights reserved. 3 + * 4 + * This software is licensed under the terms of the GNU General Public 5 + * License version 2, as published by the Free Software Foundation, and 6 + * may be copied, distributed, and modified under those terms. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + */ 13 + 14 + #include <linux/kernel.h> 15 + #include <linux/bitops.h> 16 + #include <linux/err.h> 17 + #include <linux/platform_device.h> 18 + #include <linux/module.h> 19 + #include <linux/of.h> 20 + #include <linux/of_device.h> 21 + #include <linux/clk-provider.h> 22 + #include <linux/regmap.h> 23 + #include <linux/reset-controller.h> 24 + 25 + #include <dt-bindings/clock/qcom,gcc-msm8960.h> 26 + #include <dt-bindings/reset/qcom,gcc-msm8960.h> 27 + 28 + #include "clk-regmap.h" 29 + #include "clk-pll.h" 30 + #include "clk-rcg.h" 31 + #include "clk-branch.h" 32 + #include "reset.h" 33 + 34 + static struct clk_pll pll3 = { 35 + .l_reg = 0x3164, 36 + .m_reg = 0x3168, 37 + .n_reg = 0x316c, 38 + .config_reg = 0x3174, 39 + .mode_reg = 0x3160, 40 + .status_reg = 0x3178, 41 + .status_bit = 16, 42 + .clkr.hw.init = &(struct clk_init_data){ 43 + .name = "pll3", 44 + .parent_names = (const char *[]){ "pxo" }, 45 + .num_parents = 1, 46 + .ops = &clk_pll_ops, 47 + }, 48 + }; 49 + 50 + static struct clk_pll pll8 = { 51 + .l_reg = 0x3144, 52 + .m_reg = 0x3148, 53 + .n_reg = 0x314c, 54 + .config_reg = 0x3154, 55 + .mode_reg = 0x3140, 56 + .status_reg = 0x3158, 57 + .status_bit = 16, 58 + .clkr.hw.init = &(struct clk_init_data){ 59 + .name = "pll8", 60 + .parent_names = (const char *[]){ "pxo" }, 61 + .num_parents = 1, 62 + .ops = &clk_pll_ops, 63 + }, 64 + }; 65 + 66 + static struct clk_regmap pll8_vote = { 67 + .enable_reg = 0x34c0, 68 + .enable_mask = BIT(8), 69 + .hw.init = &(struct clk_init_data){ 70 + .name = "pll8_vote", 71 + .parent_names = (const char *[]){ "pll8" }, 72 + .num_parents = 1, 73 + .ops = &clk_pll_vote_ops, 74 + }, 75 + }; 76 + 77 + static struct clk_pll pll14 = { 78 + .l_reg = 0x31c4, 79 + .m_reg = 0x31c8, 80 + .n_reg = 0x31cc, 81 + .config_reg = 0x31d4, 82 + .mode_reg = 0x31c0, 83 + .status_reg = 0x31d8, 84 + .status_bit = 16, 85 + .clkr.hw.init = &(struct clk_init_data){ 86 + .name = "pll14", 87 + .parent_names = (const char *[]){ "pxo" }, 88 + .num_parents = 1, 89 + .ops = &clk_pll_ops, 90 + }, 91 + }; 92 + 93 + static struct clk_regmap pll14_vote = { 94 + .enable_reg = 0x34c0, 95 + .enable_mask = BIT(14), 96 + .hw.init = &(struct clk_init_data){ 97 + .name = "pll14_vote", 98 + .parent_names = (const char *[]){ "pll14" }, 99 + .num_parents = 1, 100 + .ops = &clk_pll_vote_ops, 101 + }, 102 + }; 103 + 104 + #define P_PXO 0 105 + #define P_PLL8 1 106 + #define P_CXO 2 107 + 108 + static const u8 gcc_pxo_pll8_map[] = { 109 + [P_PXO] = 0, 110 + [P_PLL8] = 3, 111 + }; 112 + 113 + static const char *gcc_pxo_pll8[] = { 114 + "pxo", 115 + "pll8_vote", 116 + }; 117 + 118 + static const u8 gcc_pxo_pll8_cxo_map[] = { 119 + [P_PXO] = 0, 120 + [P_PLL8] = 3, 121 + [P_CXO] = 5, 122 + }; 123 + 124 + static const char *gcc_pxo_pll8_cxo[] = { 125 + "pxo", 126 + "pll8_vote", 127 + "cxo", 128 + }; 129 + 130 + static struct freq_tbl clk_tbl_gsbi_uart[] = { 131 + { 1843200, P_PLL8, 2, 6, 625 }, 132 + { 3686400, P_PLL8, 2, 12, 625 }, 133 + { 7372800, P_PLL8, 2, 24, 625 }, 134 + { 14745600, P_PLL8, 2, 48, 625 }, 135 + { 16000000, P_PLL8, 4, 1, 6 }, 136 + { 24000000, P_PLL8, 4, 1, 4 }, 137 + { 32000000, P_PLL8, 4, 1, 3 }, 138 + { 40000000, P_PLL8, 1, 5, 48 }, 139 + { 46400000, P_PLL8, 1, 29, 240 }, 140 + { 48000000, P_PLL8, 4, 1, 2 }, 141 + { 51200000, P_PLL8, 1, 2, 15 }, 142 + { 56000000, P_PLL8, 1, 7, 48 }, 143 + { 58982400, P_PLL8, 1, 96, 625 }, 144 + { 64000000, P_PLL8, 2, 1, 3 }, 145 + { } 146 + }; 147 + 148 + static struct clk_rcg gsbi1_uart_src = { 149 + .ns_reg = 0x29d4, 150 + .md_reg = 0x29d0, 151 + .mn = { 152 + .mnctr_en_bit = 8, 153 + .mnctr_reset_bit = 7, 154 + .mnctr_mode_shift = 5, 155 + .n_val_shift = 16, 156 + .m_val_shift = 16, 157 + .width = 16, 158 + }, 159 + .p = { 160 + .pre_div_shift = 3, 161 + .pre_div_width = 2, 162 + }, 163 + .s = { 164 + .src_sel_shift = 0, 165 + .parent_map = gcc_pxo_pll8_map, 166 + }, 167 + .freq_tbl = clk_tbl_gsbi_uart, 168 + .clkr = { 169 + .enable_reg = 0x29d4, 170 + .enable_mask = BIT(11), 171 + .hw.init = &(struct clk_init_data){ 172 + .name = "gsbi1_uart_src", 173 + .parent_names = gcc_pxo_pll8, 174 + .num_parents = 2, 175 + .ops = &clk_rcg_ops, 176 + .flags = CLK_SET_PARENT_GATE, 177 + }, 178 + }, 179 + }; 180 + 181 + static struct clk_branch gsbi1_uart_clk = { 182 + .halt_reg = 0x2fcc, 183 + .halt_bit = 10, 184 + .clkr = { 185 + .enable_reg = 0x29d4, 186 + .enable_mask = BIT(9), 187 + .hw.init = &(struct clk_init_data){ 188 + .name = "gsbi1_uart_clk", 189 + .parent_names = (const char *[]){ 190 + "gsbi1_uart_src", 191 + }, 192 + .num_parents = 1, 193 + .ops = &clk_branch_ops, 194 + .flags = CLK_SET_RATE_PARENT, 195 + }, 196 + }, 197 + }; 198 + 199 + static struct clk_rcg gsbi2_uart_src = { 200 + .ns_reg = 0x29f4, 201 + .md_reg = 0x29f0, 202 + .mn = { 203 + .mnctr_en_bit = 8, 204 + .mnctr_reset_bit = 7, 205 + .mnctr_mode_shift = 5, 206 + .n_val_shift = 16, 207 + .m_val_shift = 16, 208 + .width = 16, 209 + }, 210 + .p = { 211 + .pre_div_shift = 3, 212 + .pre_div_width = 2, 213 + }, 214 + .s = { 215 + .src_sel_shift = 0, 216 + .parent_map = gcc_pxo_pll8_map, 217 + }, 218 + .freq_tbl = clk_tbl_gsbi_uart, 219 + .clkr = { 220 + .enable_reg = 0x29f4, 221 + .enable_mask = BIT(11), 222 + .hw.init = &(struct clk_init_data){ 223 + .name = "gsbi2_uart_src", 224 + .parent_names = gcc_pxo_pll8, 225 + .num_parents = 2, 226 + .ops = &clk_rcg_ops, 227 + .flags = CLK_SET_PARENT_GATE, 228 + }, 229 + }, 230 + }; 231 + 232 + static struct clk_branch gsbi2_uart_clk = { 233 + .halt_reg = 0x2fcc, 234 + .halt_bit = 6, 235 + .clkr = { 236 + .enable_reg = 0x29f4, 237 + .enable_mask = BIT(9), 238 + .hw.init = &(struct clk_init_data){ 239 + .name = "gsbi2_uart_clk", 240 + .parent_names = (const char *[]){ 241 + "gsbi2_uart_src", 242 + }, 243 + .num_parents = 1, 244 + .ops = &clk_branch_ops, 245 + .flags = CLK_SET_RATE_PARENT, 246 + }, 247 + }, 248 + }; 249 + 250 + static struct clk_rcg gsbi3_uart_src = { 251 + .ns_reg = 0x2a14, 252 + .md_reg = 0x2a10, 253 + .mn = { 254 + .mnctr_en_bit = 8, 255 + .mnctr_reset_bit = 7, 256 + .mnctr_mode_shift = 5, 257 + .n_val_shift = 16, 258 + .m_val_shift = 16, 259 + .width = 16, 260 + }, 261 + .p = { 262 + .pre_div_shift = 3, 263 + .pre_div_width = 2, 264 + }, 265 + .s = { 266 + .src_sel_shift = 0, 267 + .parent_map = gcc_pxo_pll8_map, 268 + }, 269 + .freq_tbl = clk_tbl_gsbi_uart, 270 + .clkr = { 271 + .enable_reg = 0x2a14, 272 + .enable_mask = BIT(11), 273 + .hw.init = &(struct clk_init_data){ 274 + .name = "gsbi3_uart_src", 275 + .parent_names = gcc_pxo_pll8, 276 + .num_parents = 2, 277 + .ops = &clk_rcg_ops, 278 + .flags = CLK_SET_PARENT_GATE, 279 + }, 280 + }, 281 + }; 282 + 283 + static struct clk_branch gsbi3_uart_clk = { 284 + .halt_reg = 0x2fcc, 285 + .halt_bit = 2, 286 + .clkr = { 287 + .enable_reg = 0x2a14, 288 + .enable_mask = BIT(9), 289 + .hw.init = &(struct clk_init_data){ 290 + .name = "gsbi3_uart_clk", 291 + .parent_names = (const char *[]){ 292 + "gsbi3_uart_src", 293 + }, 294 + .num_parents = 1, 295 + .ops = &clk_branch_ops, 296 + .flags = CLK_SET_RATE_PARENT, 297 + }, 298 + }, 299 + }; 300 + 301 + static struct clk_rcg gsbi4_uart_src = { 302 + .ns_reg = 0x2a34, 303 + .md_reg = 0x2a30, 304 + .mn = { 305 + .mnctr_en_bit = 8, 306 + .mnctr_reset_bit = 7, 307 + .mnctr_mode_shift = 5, 308 + .n_val_shift = 16, 309 + .m_val_shift = 16, 310 + .width = 16, 311 + }, 312 + .p = { 313 + .pre_div_shift = 3, 314 + .pre_div_width = 2, 315 + }, 316 + .s = { 317 + .src_sel_shift = 0, 318 + .parent_map = gcc_pxo_pll8_map, 319 + }, 320 + .freq_tbl = clk_tbl_gsbi_uart, 321 + .clkr = { 322 + .enable_reg = 0x2a34, 323 + .enable_mask = BIT(11), 324 + .hw.init = &(struct clk_init_data){ 325 + .name = "gsbi4_uart_src", 326 + .parent_names = gcc_pxo_pll8, 327 + .num_parents = 2, 328 + .ops = &clk_rcg_ops, 329 + .flags = CLK_SET_PARENT_GATE, 330 + }, 331 + }, 332 + }; 333 + 334 + static struct clk_branch gsbi4_uart_clk = { 335 + .halt_reg = 0x2fd0, 336 + .halt_bit = 26, 337 + .clkr = { 338 + .enable_reg = 0x2a34, 339 + .enable_mask = BIT(9), 340 + .hw.init = &(struct clk_init_data){ 341 + .name = "gsbi4_uart_clk", 342 + .parent_names = (const char *[]){ 343 + "gsbi4_uart_src", 344 + }, 345 + .num_parents = 1, 346 + .ops = &clk_branch_ops, 347 + .flags = CLK_SET_RATE_PARENT, 348 + }, 349 + }, 350 + }; 351 + 352 + static struct clk_rcg gsbi5_uart_src = { 353 + .ns_reg = 0x2a54, 354 + .md_reg = 0x2a50, 355 + .mn = { 356 + .mnctr_en_bit = 8, 357 + .mnctr_reset_bit = 7, 358 + .mnctr_mode_shift = 5, 359 + .n_val_shift = 16, 360 + .m_val_shift = 16, 361 + .width = 16, 362 + }, 363 + .p = { 364 + .pre_div_shift = 3, 365 + .pre_div_width = 2, 366 + }, 367 + .s = { 368 + .src_sel_shift = 0, 369 + .parent_map = gcc_pxo_pll8_map, 370 + }, 371 + .freq_tbl = clk_tbl_gsbi_uart, 372 + .clkr = { 373 + .enable_reg = 0x2a54, 374 + .enable_mask = BIT(11), 375 + .hw.init = &(struct clk_init_data){ 376 + .name = "gsbi5_uart_src", 377 + .parent_names = gcc_pxo_pll8, 378 + .num_parents = 2, 379 + .ops = &clk_rcg_ops, 380 + .flags = CLK_SET_PARENT_GATE, 381 + }, 382 + }, 383 + }; 384 + 385 + static struct clk_branch gsbi5_uart_clk = { 386 + .halt_reg = 0x2fd0, 387 + .halt_bit = 22, 388 + .clkr = { 389 + .enable_reg = 0x2a54, 390 + .enable_mask = BIT(9), 391 + .hw.init = &(struct clk_init_data){ 392 + .name = "gsbi5_uart_clk", 393 + .parent_names = (const char *[]){ 394 + "gsbi5_uart_src", 395 + }, 396 + .num_parents = 1, 397 + .ops = &clk_branch_ops, 398 + .flags = CLK_SET_RATE_PARENT, 399 + }, 400 + }, 401 + }; 402 + 403 + static struct clk_rcg gsbi6_uart_src = { 404 + .ns_reg = 0x2a74, 405 + .md_reg = 0x2a70, 406 + .mn = { 407 + .mnctr_en_bit = 8, 408 + .mnctr_reset_bit = 7, 409 + .mnctr_mode_shift = 5, 410 + .n_val_shift = 16, 411 + .m_val_shift = 16, 412 + .width = 16, 413 + }, 414 + .p = { 415 + .pre_div_shift = 3, 416 + .pre_div_width = 2, 417 + }, 418 + .s = { 419 + .src_sel_shift = 0, 420 + .parent_map = gcc_pxo_pll8_map, 421 + }, 422 + .freq_tbl = clk_tbl_gsbi_uart, 423 + .clkr = { 424 + .enable_reg = 0x2a74, 425 + .enable_mask = BIT(11), 426 + .hw.init = &(struct clk_init_data){ 427 + .name = "gsbi6_uart_src", 428 + .parent_names = gcc_pxo_pll8, 429 + .num_parents = 2, 430 + .ops = &clk_rcg_ops, 431 + .flags = CLK_SET_PARENT_GATE, 432 + }, 433 + }, 434 + }; 435 + 436 + static struct clk_branch gsbi6_uart_clk = { 437 + .halt_reg = 0x2fd0, 438 + .halt_bit = 18, 439 + .clkr = { 440 + .enable_reg = 0x2a74, 441 + .enable_mask = BIT(9), 442 + .hw.init = &(struct clk_init_data){ 443 + .name = "gsbi6_uart_clk", 444 + .parent_names = (const char *[]){ 445 + "gsbi6_uart_src", 446 + }, 447 + .num_parents = 1, 448 + .ops = &clk_branch_ops, 449 + .flags = CLK_SET_RATE_PARENT, 450 + }, 451 + }, 452 + }; 453 + 454 + static struct clk_rcg gsbi7_uart_src = { 455 + .ns_reg = 0x2a94, 456 + .md_reg = 0x2a90, 457 + .mn = { 458 + .mnctr_en_bit = 8, 459 + .mnctr_reset_bit = 7, 460 + .mnctr_mode_shift = 5, 461 + .n_val_shift = 16, 462 + .m_val_shift = 16, 463 + .width = 16, 464 + }, 465 + .p = { 466 + .pre_div_shift = 3, 467 + .pre_div_width = 2, 468 + }, 469 + .s = { 470 + .src_sel_shift = 0, 471 + .parent_map = gcc_pxo_pll8_map, 472 + }, 473 + .freq_tbl = clk_tbl_gsbi_uart, 474 + .clkr = { 475 + .enable_reg = 0x2a94, 476 + .enable_mask = BIT(11), 477 + .hw.init = &(struct clk_init_data){ 478 + .name = "gsbi7_uart_src", 479 + .parent_names = gcc_pxo_pll8, 480 + .num_parents = 2, 481 + .ops = &clk_rcg_ops, 482 + .flags = CLK_SET_PARENT_GATE, 483 + }, 484 + }, 485 + }; 486 + 487 + static struct clk_branch gsbi7_uart_clk = { 488 + .halt_reg = 0x2fd0, 489 + .halt_bit = 14, 490 + .clkr = { 491 + .enable_reg = 0x2a94, 492 + .enable_mask = BIT(9), 493 + .hw.init = &(struct clk_init_data){ 494 + .name = "gsbi7_uart_clk", 495 + .parent_names = (const char *[]){ 496 + "gsbi7_uart_src", 497 + }, 498 + .num_parents = 1, 499 + .ops = &clk_branch_ops, 500 + .flags = CLK_SET_RATE_PARENT, 501 + }, 502 + }, 503 + }; 504 + 505 + static struct clk_rcg gsbi8_uart_src = { 506 + .ns_reg = 0x2ab4, 507 + .md_reg = 0x2ab0, 508 + .mn = { 509 + .mnctr_en_bit = 8, 510 + .mnctr_reset_bit = 7, 511 + .mnctr_mode_shift = 5, 512 + .n_val_shift = 16, 513 + .m_val_shift = 16, 514 + .width = 16, 515 + }, 516 + .p = { 517 + .pre_div_shift = 3, 518 + .pre_div_width = 2, 519 + }, 520 + .s = { 521 + .src_sel_shift = 0, 522 + .parent_map = gcc_pxo_pll8_map, 523 + }, 524 + .freq_tbl = clk_tbl_gsbi_uart, 525 + .clkr = { 526 + .enable_reg = 0x2ab4, 527 + .enable_mask = BIT(11), 528 + .hw.init = &(struct clk_init_data){ 529 + .name = "gsbi8_uart_src", 530 + .parent_names = gcc_pxo_pll8, 531 + .num_parents = 2, 532 + .ops = &clk_rcg_ops, 533 + .flags = CLK_SET_PARENT_GATE, 534 + }, 535 + }, 536 + }; 537 + 538 + static struct clk_branch gsbi8_uart_clk = { 539 + .halt_reg = 0x2fd0, 540 + .halt_bit = 10, 541 + .clkr = { 542 + .enable_reg = 0x2ab4, 543 + .enable_mask = BIT(9), 544 + .hw.init = &(struct clk_init_data){ 545 + .name = "gsbi8_uart_clk", 546 + .parent_names = (const char *[]){ "gsbi8_uart_src" }, 547 + .num_parents = 1, 548 + .ops = &clk_branch_ops, 549 + .flags = CLK_SET_RATE_PARENT, 550 + }, 551 + }, 552 + }; 553 + 554 + static struct clk_rcg gsbi9_uart_src = { 555 + .ns_reg = 0x2ad4, 556 + .md_reg = 0x2ad0, 557 + .mn = { 558 + .mnctr_en_bit = 8, 559 + .mnctr_reset_bit = 7, 560 + .mnctr_mode_shift = 5, 561 + .n_val_shift = 16, 562 + .m_val_shift = 16, 563 + .width = 16, 564 + }, 565 + .p = { 566 + .pre_div_shift = 3, 567 + .pre_div_width = 2, 568 + }, 569 + .s = { 570 + .src_sel_shift = 0, 571 + .parent_map = gcc_pxo_pll8_map, 572 + }, 573 + .freq_tbl = clk_tbl_gsbi_uart, 574 + .clkr = { 575 + .enable_reg = 0x2ad4, 576 + .enable_mask = BIT(11), 577 + .hw.init = &(struct clk_init_data){ 578 + .name = "gsbi9_uart_src", 579 + .parent_names = gcc_pxo_pll8, 580 + .num_parents = 2, 581 + .ops = &clk_rcg_ops, 582 + .flags = CLK_SET_PARENT_GATE, 583 + }, 584 + }, 585 + }; 586 + 587 + static struct clk_branch gsbi9_uart_clk = { 588 + .halt_reg = 0x2fd0, 589 + .halt_bit = 6, 590 + .clkr = { 591 + .enable_reg = 0x2ad4, 592 + .enable_mask = BIT(9), 593 + .hw.init = &(struct clk_init_data){ 594 + .name = "gsbi9_uart_clk", 595 + .parent_names = (const char *[]){ "gsbi9_uart_src" }, 596 + .num_parents = 1, 597 + .ops = &clk_branch_ops, 598 + .flags = CLK_SET_RATE_PARENT, 599 + }, 600 + }, 601 + }; 602 + 603 + static struct clk_rcg gsbi10_uart_src = { 604 + .ns_reg = 0x2af4, 605 + .md_reg = 0x2af0, 606 + .mn = { 607 + .mnctr_en_bit = 8, 608 + .mnctr_reset_bit = 7, 609 + .mnctr_mode_shift = 5, 610 + .n_val_shift = 16, 611 + .m_val_shift = 16, 612 + .width = 16, 613 + }, 614 + .p = { 615 + .pre_div_shift = 3, 616 + .pre_div_width = 2, 617 + }, 618 + .s = { 619 + .src_sel_shift = 0, 620 + .parent_map = gcc_pxo_pll8_map, 621 + }, 622 + .freq_tbl = clk_tbl_gsbi_uart, 623 + .clkr = { 624 + .enable_reg = 0x2af4, 625 + .enable_mask = BIT(11), 626 + .hw.init = &(struct clk_init_data){ 627 + .name = "gsbi10_uart_src", 628 + .parent_names = gcc_pxo_pll8, 629 + .num_parents = 2, 630 + .ops = &clk_rcg_ops, 631 + .flags = CLK_SET_PARENT_GATE, 632 + }, 633 + }, 634 + }; 635 + 636 + static struct clk_branch gsbi10_uart_clk = { 637 + .halt_reg = 0x2fd0, 638 + .halt_bit = 2, 639 + .clkr = { 640 + .enable_reg = 0x2af4, 641 + .enable_mask = BIT(9), 642 + .hw.init = &(struct clk_init_data){ 643 + .name = "gsbi10_uart_clk", 644 + .parent_names = (const char *[]){ "gsbi10_uart_src" }, 645 + .num_parents = 1, 646 + .ops = &clk_branch_ops, 647 + .flags = CLK_SET_RATE_PARENT, 648 + }, 649 + }, 650 + }; 651 + 652 + static struct clk_rcg gsbi11_uart_src = { 653 + .ns_reg = 0x2b14, 654 + .md_reg = 0x2b10, 655 + .mn = { 656 + .mnctr_en_bit = 8, 657 + .mnctr_reset_bit = 7, 658 + .mnctr_mode_shift = 5, 659 + .n_val_shift = 16, 660 + .m_val_shift = 16, 661 + .width = 16, 662 + }, 663 + .p = { 664 + .pre_div_shift = 3, 665 + .pre_div_width = 2, 666 + }, 667 + .s = { 668 + .src_sel_shift = 0, 669 + .parent_map = gcc_pxo_pll8_map, 670 + }, 671 + .freq_tbl = clk_tbl_gsbi_uart, 672 + .clkr = { 673 + .enable_reg = 0x2b14, 674 + .enable_mask = BIT(11), 675 + .hw.init = &(struct clk_init_data){ 676 + .name = "gsbi11_uart_src", 677 + .parent_names = gcc_pxo_pll8, 678 + .num_parents = 2, 679 + .ops = &clk_rcg_ops, 680 + .flags = CLK_SET_PARENT_GATE, 681 + }, 682 + }, 683 + }; 684 + 685 + static struct clk_branch gsbi11_uart_clk = { 686 + .halt_reg = 0x2fd4, 687 + .halt_bit = 17, 688 + .clkr = { 689 + .enable_reg = 0x2b14, 690 + .enable_mask = BIT(9), 691 + .hw.init = &(struct clk_init_data){ 692 + .name = "gsbi11_uart_clk", 693 + .parent_names = (const char *[]){ "gsbi11_uart_src" }, 694 + .num_parents = 1, 695 + .ops = &clk_branch_ops, 696 + .flags = CLK_SET_RATE_PARENT, 697 + }, 698 + }, 699 + }; 700 + 701 + static struct clk_rcg gsbi12_uart_src = { 702 + .ns_reg = 0x2b34, 703 + .md_reg = 0x2b30, 704 + .mn = { 705 + .mnctr_en_bit = 8, 706 + .mnctr_reset_bit = 7, 707 + .mnctr_mode_shift = 5, 708 + .n_val_shift = 16, 709 + .m_val_shift = 16, 710 + .width = 16, 711 + }, 712 + .p = { 713 + .pre_div_shift = 3, 714 + .pre_div_width = 2, 715 + }, 716 + .s = { 717 + .src_sel_shift = 0, 718 + .parent_map = gcc_pxo_pll8_map, 719 + }, 720 + .freq_tbl = clk_tbl_gsbi_uart, 721 + .clkr = { 722 + .enable_reg = 0x2b34, 723 + .enable_mask = BIT(11), 724 + .hw.init = &(struct clk_init_data){ 725 + .name = "gsbi12_uart_src", 726 + .parent_names = gcc_pxo_pll8, 727 + .num_parents = 2, 728 + .ops = &clk_rcg_ops, 729 + .flags = CLK_SET_PARENT_GATE, 730 + }, 731 + }, 732 + }; 733 + 734 + static struct clk_branch gsbi12_uart_clk = { 735 + .halt_reg = 0x2fd4, 736 + .halt_bit = 13, 737 + .clkr = { 738 + .enable_reg = 0x2b34, 739 + .enable_mask = BIT(9), 740 + .hw.init = &(struct clk_init_data){ 741 + .name = "gsbi12_uart_clk", 742 + .parent_names = (const char *[]){ "gsbi12_uart_src" }, 743 + .num_parents = 1, 744 + .ops = &clk_branch_ops, 745 + .flags = CLK_SET_RATE_PARENT, 746 + }, 747 + }, 748 + }; 749 + 750 + static struct freq_tbl clk_tbl_gsbi_qup[] = { 751 + { 1100000, P_PXO, 1, 2, 49 }, 752 + { 5400000, P_PXO, 1, 1, 5 }, 753 + { 10800000, P_PXO, 1, 2, 5 }, 754 + { 15060000, P_PLL8, 1, 2, 51 }, 755 + { 24000000, P_PLL8, 4, 1, 4 }, 756 + { 25600000, P_PLL8, 1, 1, 15 }, 757 + { 27000000, P_PXO, 1, 0, 0 }, 758 + { 48000000, P_PLL8, 4, 1, 2 }, 759 + { 51200000, P_PLL8, 1, 2, 15 }, 760 + { } 761 + }; 762 + 763 + static struct clk_rcg gsbi1_qup_src = { 764 + .ns_reg = 0x29cc, 765 + .md_reg = 0x29c8, 766 + .mn = { 767 + .mnctr_en_bit = 8, 768 + .mnctr_reset_bit = 7, 769 + .mnctr_mode_shift = 5, 770 + .n_val_shift = 16, 771 + .m_val_shift = 16, 772 + .width = 8, 773 + }, 774 + .p = { 775 + .pre_div_shift = 3, 776 + .pre_div_width = 2, 777 + }, 778 + .s = { 779 + .src_sel_shift = 0, 780 + .parent_map = gcc_pxo_pll8_map, 781 + }, 782 + .freq_tbl = clk_tbl_gsbi_qup, 783 + .clkr = { 784 + .enable_reg = 0x29cc, 785 + .enable_mask = BIT(11), 786 + .hw.init = &(struct clk_init_data){ 787 + .name = "gsbi1_qup_src", 788 + .parent_names = gcc_pxo_pll8, 789 + .num_parents = 2, 790 + .ops = &clk_rcg_ops, 791 + .flags = CLK_SET_PARENT_GATE, 792 + }, 793 + }, 794 + }; 795 + 796 + static struct clk_branch gsbi1_qup_clk = { 797 + .halt_reg = 0x2fcc, 798 + .halt_bit = 9, 799 + .clkr = { 800 + .enable_reg = 0x29cc, 801 + .enable_mask = BIT(9), 802 + .hw.init = &(struct clk_init_data){ 803 + .name = "gsbi1_qup_clk", 804 + .parent_names = (const char *[]){ "gsbi1_qup_src" }, 805 + .num_parents = 1, 806 + .ops = &clk_branch_ops, 807 + .flags = CLK_SET_RATE_PARENT, 808 + }, 809 + }, 810 + }; 811 + 812 + static struct clk_rcg gsbi2_qup_src = { 813 + .ns_reg = 0x29ec, 814 + .md_reg = 0x29e8, 815 + .mn = { 816 + .mnctr_en_bit = 8, 817 + .mnctr_reset_bit = 7, 818 + .mnctr_mode_shift = 5, 819 + .n_val_shift = 16, 820 + .m_val_shift = 16, 821 + .width = 8, 822 + }, 823 + .p = { 824 + .pre_div_shift = 3, 825 + .pre_div_width = 2, 826 + }, 827 + .s = { 828 + .src_sel_shift = 0, 829 + .parent_map = gcc_pxo_pll8_map, 830 + }, 831 + .freq_tbl = clk_tbl_gsbi_qup, 832 + .clkr = { 833 + .enable_reg = 0x29ec, 834 + .enable_mask = BIT(11), 835 + .hw.init = &(struct clk_init_data){ 836 + .name = "gsbi2_qup_src", 837 + .parent_names = gcc_pxo_pll8, 838 + .num_parents = 2, 839 + .ops = &clk_rcg_ops, 840 + .flags = CLK_SET_PARENT_GATE, 841 + }, 842 + }, 843 + }; 844 + 845 + static struct clk_branch gsbi2_qup_clk = { 846 + .halt_reg = 0x2fcc, 847 + .halt_bit = 4, 848 + .clkr = { 849 + .enable_reg = 0x29ec, 850 + .enable_mask = BIT(9), 851 + .hw.init = &(struct clk_init_data){ 852 + .name = "gsbi2_qup_clk", 853 + .parent_names = (const char *[]){ "gsbi2_qup_src" }, 854 + .num_parents = 1, 855 + .ops = &clk_branch_ops, 856 + .flags = CLK_SET_RATE_PARENT, 857 + }, 858 + }, 859 + }; 860 + 861 + static struct clk_rcg gsbi3_qup_src = { 862 + .ns_reg = 0x2a0c, 863 + .md_reg = 0x2a08, 864 + .mn = { 865 + .mnctr_en_bit = 8, 866 + .mnctr_reset_bit = 7, 867 + .mnctr_mode_shift = 5, 868 + .n_val_shift = 16, 869 + .m_val_shift = 16, 870 + .width = 8, 871 + }, 872 + .p = { 873 + .pre_div_shift = 3, 874 + .pre_div_width = 2, 875 + }, 876 + .s = { 877 + .src_sel_shift = 0, 878 + .parent_map = gcc_pxo_pll8_map, 879 + }, 880 + .freq_tbl = clk_tbl_gsbi_qup, 881 + .clkr = { 882 + .enable_reg = 0x2a0c, 883 + .enable_mask = BIT(11), 884 + .hw.init = &(struct clk_init_data){ 885 + .name = "gsbi3_qup_src", 886 + .parent_names = gcc_pxo_pll8, 887 + .num_parents = 2, 888 + .ops = &clk_rcg_ops, 889 + .flags = CLK_SET_PARENT_GATE, 890 + }, 891 + }, 892 + }; 893 + 894 + static struct clk_branch gsbi3_qup_clk = { 895 + .halt_reg = 0x2fcc, 896 + .halt_bit = 0, 897 + .clkr = { 898 + .enable_reg = 0x2a0c, 899 + .enable_mask = BIT(9), 900 + .hw.init = &(struct clk_init_data){ 901 + .name = "gsbi3_qup_clk", 902 + .parent_names = (const char *[]){ "gsbi3_qup_src" }, 903 + .num_parents = 1, 904 + .ops = &clk_branch_ops, 905 + .flags = CLK_SET_RATE_PARENT, 906 + }, 907 + }, 908 + }; 909 + 910 + static struct clk_rcg gsbi4_qup_src = { 911 + .ns_reg = 0x2a2c, 912 + .md_reg = 0x2a28, 913 + .mn = { 914 + .mnctr_en_bit = 8, 915 + .mnctr_reset_bit = 7, 916 + .mnctr_mode_shift = 5, 917 + .n_val_shift = 16, 918 + .m_val_shift = 16, 919 + .width = 8, 920 + }, 921 + .p = { 922 + .pre_div_shift = 3, 923 + .pre_div_width = 2, 924 + }, 925 + .s = { 926 + .src_sel_shift = 0, 927 + .parent_map = gcc_pxo_pll8_map, 928 + }, 929 + .freq_tbl = clk_tbl_gsbi_qup, 930 + .clkr = { 931 + .enable_reg = 0x2a2c, 932 + .enable_mask = BIT(11), 933 + .hw.init = &(struct clk_init_data){ 934 + .name = "gsbi4_qup_src", 935 + .parent_names = gcc_pxo_pll8, 936 + .num_parents = 2, 937 + .ops = &clk_rcg_ops, 938 + .flags = CLK_SET_PARENT_GATE, 939 + }, 940 + }, 941 + }; 942 + 943 + static struct clk_branch gsbi4_qup_clk = { 944 + .halt_reg = 0x2fd0, 945 + .halt_bit = 24, 946 + .clkr = { 947 + .enable_reg = 0x2a2c, 948 + .enable_mask = BIT(9), 949 + .hw.init = &(struct clk_init_data){ 950 + .name = "gsbi4_qup_clk", 951 + .parent_names = (const char *[]){ "gsbi4_qup_src" }, 952 + .num_parents = 1, 953 + .ops = &clk_branch_ops, 954 + .flags = CLK_SET_RATE_PARENT, 955 + }, 956 + }, 957 + }; 958 + 959 + static struct clk_rcg gsbi5_qup_src = { 960 + .ns_reg = 0x2a4c, 961 + .md_reg = 0x2a48, 962 + .mn = { 963 + .mnctr_en_bit = 8, 964 + .mnctr_reset_bit = 7, 965 + .mnctr_mode_shift = 5, 966 + .n_val_shift = 16, 967 + .m_val_shift = 16, 968 + .width = 8, 969 + }, 970 + .p = { 971 + .pre_div_shift = 3, 972 + .pre_div_width = 2, 973 + }, 974 + .s = { 975 + .src_sel_shift = 0, 976 + .parent_map = gcc_pxo_pll8_map, 977 + }, 978 + .freq_tbl = clk_tbl_gsbi_qup, 979 + .clkr = { 980 + .enable_reg = 0x2a4c, 981 + .enable_mask = BIT(11), 982 + .hw.init = &(struct clk_init_data){ 983 + .name = "gsbi5_qup_src", 984 + .parent_names = gcc_pxo_pll8, 985 + .num_parents = 2, 986 + .ops = &clk_rcg_ops, 987 + .flags = CLK_SET_PARENT_GATE, 988 + }, 989 + }, 990 + }; 991 + 992 + static struct clk_branch gsbi5_qup_clk = { 993 + .halt_reg = 0x2fd0, 994 + .halt_bit = 20, 995 + .clkr = { 996 + .enable_reg = 0x2a4c, 997 + .enable_mask = BIT(9), 998 + .hw.init = &(struct clk_init_data){ 999 + .name = "gsbi5_qup_clk", 1000 + .parent_names = (const char *[]){ "gsbi5_qup_src" }, 1001 + .num_parents = 1, 1002 + .ops = &clk_branch_ops, 1003 + .flags = CLK_SET_RATE_PARENT, 1004 + }, 1005 + }, 1006 + }; 1007 + 1008 + static struct clk_rcg gsbi6_qup_src = { 1009 + .ns_reg = 0x2a6c, 1010 + .md_reg = 0x2a68, 1011 + .mn = { 1012 + .mnctr_en_bit = 8, 1013 + .mnctr_reset_bit = 7, 1014 + .mnctr_mode_shift = 5, 1015 + .n_val_shift = 16, 1016 + .m_val_shift = 16, 1017 + .width = 8, 1018 + }, 1019 + .p = { 1020 + .pre_div_shift = 3, 1021 + .pre_div_width = 2, 1022 + }, 1023 + .s = { 1024 + .src_sel_shift = 0, 1025 + .parent_map = gcc_pxo_pll8_map, 1026 + }, 1027 + .freq_tbl = clk_tbl_gsbi_qup, 1028 + .clkr = { 1029 + .enable_reg = 0x2a6c, 1030 + .enable_mask = BIT(11), 1031 + .hw.init = &(struct clk_init_data){ 1032 + .name = "gsbi6_qup_src", 1033 + .parent_names = gcc_pxo_pll8, 1034 + .num_parents = 2, 1035 + .ops = &clk_rcg_ops, 1036 + .flags = CLK_SET_PARENT_GATE, 1037 + }, 1038 + }, 1039 + }; 1040 + 1041 + static struct clk_branch gsbi6_qup_clk = { 1042 + .halt_reg = 0x2fd0, 1043 + .halt_bit = 16, 1044 + .clkr = { 1045 + .enable_reg = 0x2a6c, 1046 + .enable_mask = BIT(9), 1047 + .hw.init = &(struct clk_init_data){ 1048 + .name = "gsbi6_qup_clk", 1049 + .parent_names = (const char *[]){ "gsbi6_qup_src" }, 1050 + .num_parents = 1, 1051 + .ops = &clk_branch_ops, 1052 + .flags = CLK_SET_RATE_PARENT, 1053 + }, 1054 + }, 1055 + }; 1056 + 1057 + static struct clk_rcg gsbi7_qup_src = { 1058 + .ns_reg = 0x2a8c, 1059 + .md_reg = 0x2a88, 1060 + .mn = { 1061 + .mnctr_en_bit = 8, 1062 + .mnctr_reset_bit = 7, 1063 + .mnctr_mode_shift = 5, 1064 + .n_val_shift = 16, 1065 + .m_val_shift = 16, 1066 + .width = 8, 1067 + }, 1068 + .p = { 1069 + .pre_div_shift = 3, 1070 + .pre_div_width = 2, 1071 + }, 1072 + .s = { 1073 + .src_sel_shift = 0, 1074 + .parent_map = gcc_pxo_pll8_map, 1075 + }, 1076 + .freq_tbl = clk_tbl_gsbi_qup, 1077 + .clkr = { 1078 + .enable_reg = 0x2a8c, 1079 + .enable_mask = BIT(11), 1080 + .hw.init = &(struct clk_init_data){ 1081 + .name = "gsbi7_qup_src", 1082 + .parent_names = gcc_pxo_pll8, 1083 + .num_parents = 2, 1084 + .ops = &clk_rcg_ops, 1085 + .flags = CLK_SET_PARENT_GATE, 1086 + }, 1087 + }, 1088 + }; 1089 + 1090 + static struct clk_branch gsbi7_qup_clk = { 1091 + .halt_reg = 0x2fd0, 1092 + .halt_bit = 12, 1093 + .clkr = { 1094 + .enable_reg = 0x2a8c, 1095 + .enable_mask = BIT(9), 1096 + .hw.init = &(struct clk_init_data){ 1097 + .name = "gsbi7_qup_clk", 1098 + .parent_names = (const char *[]){ "gsbi7_qup_src" }, 1099 + .num_parents = 1, 1100 + .ops = &clk_branch_ops, 1101 + .flags = CLK_SET_RATE_PARENT, 1102 + }, 1103 + }, 1104 + }; 1105 + 1106 + static struct clk_rcg gsbi8_qup_src = { 1107 + .ns_reg = 0x2aac, 1108 + .md_reg = 0x2aa8, 1109 + .mn = { 1110 + .mnctr_en_bit = 8, 1111 + .mnctr_reset_bit = 7, 1112 + .mnctr_mode_shift = 5, 1113 + .n_val_shift = 16, 1114 + .m_val_shift = 16, 1115 + .width = 8, 1116 + }, 1117 + .p = { 1118 + .pre_div_shift = 3, 1119 + .pre_div_width = 2, 1120 + }, 1121 + .s = { 1122 + .src_sel_shift = 0, 1123 + .parent_map = gcc_pxo_pll8_map, 1124 + }, 1125 + .freq_tbl = clk_tbl_gsbi_qup, 1126 + .clkr = { 1127 + .enable_reg = 0x2aac, 1128 + .enable_mask = BIT(11), 1129 + .hw.init = &(struct clk_init_data){ 1130 + .name = "gsbi8_qup_src", 1131 + .parent_names = gcc_pxo_pll8, 1132 + .num_parents = 2, 1133 + .ops = &clk_rcg_ops, 1134 + .flags = CLK_SET_PARENT_GATE, 1135 + }, 1136 + }, 1137 + }; 1138 + 1139 + static struct clk_branch gsbi8_qup_clk = { 1140 + .halt_reg = 0x2fd0, 1141 + .halt_bit = 8, 1142 + .clkr = { 1143 + .enable_reg = 0x2aac, 1144 + .enable_mask = BIT(9), 1145 + .hw.init = &(struct clk_init_data){ 1146 + .name = "gsbi8_qup_clk", 1147 + .parent_names = (const char *[]){ "gsbi8_qup_src" }, 1148 + .num_parents = 1, 1149 + .ops = &clk_branch_ops, 1150 + .flags = CLK_SET_RATE_PARENT, 1151 + }, 1152 + }, 1153 + }; 1154 + 1155 + static struct clk_rcg gsbi9_qup_src = { 1156 + .ns_reg = 0x2acc, 1157 + .md_reg = 0x2ac8, 1158 + .mn = { 1159 + .mnctr_en_bit = 8, 1160 + .mnctr_reset_bit = 7, 1161 + .mnctr_mode_shift = 5, 1162 + .n_val_shift = 16, 1163 + .m_val_shift = 16, 1164 + .width = 8, 1165 + }, 1166 + .p = { 1167 + .pre_div_shift = 3, 1168 + .pre_div_width = 2, 1169 + }, 1170 + .s = { 1171 + .src_sel_shift = 0, 1172 + .parent_map = gcc_pxo_pll8_map, 1173 + }, 1174 + .freq_tbl = clk_tbl_gsbi_qup, 1175 + .clkr = { 1176 + .enable_reg = 0x2acc, 1177 + .enable_mask = BIT(11), 1178 + .hw.init = &(struct clk_init_data){ 1179 + .name = "gsbi9_qup_src", 1180 + .parent_names = gcc_pxo_pll8, 1181 + .num_parents = 2, 1182 + .ops = &clk_rcg_ops, 1183 + .flags = CLK_SET_PARENT_GATE, 1184 + }, 1185 + }, 1186 + }; 1187 + 1188 + static struct clk_branch gsbi9_qup_clk = { 1189 + .halt_reg = 0x2fd0, 1190 + .halt_bit = 4, 1191 + .clkr = { 1192 + .enable_reg = 0x2acc, 1193 + .enable_mask = BIT(9), 1194 + .hw.init = &(struct clk_init_data){ 1195 + .name = "gsbi9_qup_clk", 1196 + .parent_names = (const char *[]){ "gsbi9_qup_src" }, 1197 + .num_parents = 1, 1198 + .ops = &clk_branch_ops, 1199 + .flags = CLK_SET_RATE_PARENT, 1200 + }, 1201 + }, 1202 + }; 1203 + 1204 + static struct clk_rcg gsbi10_qup_src = { 1205 + .ns_reg = 0x2aec, 1206 + .md_reg = 0x2ae8, 1207 + .mn = { 1208 + .mnctr_en_bit = 8, 1209 + .mnctr_reset_bit = 7, 1210 + .mnctr_mode_shift = 5, 1211 + .n_val_shift = 16, 1212 + .m_val_shift = 16, 1213 + .width = 8, 1214 + }, 1215 + .p = { 1216 + .pre_div_shift = 3, 1217 + .pre_div_width = 2, 1218 + }, 1219 + .s = { 1220 + .src_sel_shift = 0, 1221 + .parent_map = gcc_pxo_pll8_map, 1222 + }, 1223 + .freq_tbl = clk_tbl_gsbi_qup, 1224 + .clkr = { 1225 + .enable_reg = 0x2aec, 1226 + .enable_mask = BIT(11), 1227 + .hw.init = &(struct clk_init_data){ 1228 + .name = "gsbi10_qup_src", 1229 + .parent_names = gcc_pxo_pll8, 1230 + .num_parents = 2, 1231 + .ops = &clk_rcg_ops, 1232 + .flags = CLK_SET_PARENT_GATE, 1233 + }, 1234 + }, 1235 + }; 1236 + 1237 + static struct clk_branch gsbi10_qup_clk = { 1238 + .halt_reg = 0x2fd0, 1239 + .halt_bit = 0, 1240 + .clkr = { 1241 + .enable_reg = 0x2aec, 1242 + .enable_mask = BIT(9), 1243 + .hw.init = &(struct clk_init_data){ 1244 + .name = "gsbi10_qup_clk", 1245 + .parent_names = (const char *[]){ "gsbi10_qup_src" }, 1246 + .num_parents = 1, 1247 + .ops = &clk_branch_ops, 1248 + .flags = CLK_SET_RATE_PARENT, 1249 + }, 1250 + }, 1251 + }; 1252 + 1253 + static struct clk_rcg gsbi11_qup_src = { 1254 + .ns_reg = 0x2b0c, 1255 + .md_reg = 0x2b08, 1256 + .mn = { 1257 + .mnctr_en_bit = 8, 1258 + .mnctr_reset_bit = 7, 1259 + .mnctr_mode_shift = 5, 1260 + .n_val_shift = 16, 1261 + .m_val_shift = 16, 1262 + .width = 8, 1263 + }, 1264 + .p = { 1265 + .pre_div_shift = 3, 1266 + .pre_div_width = 2, 1267 + }, 1268 + .s = { 1269 + .src_sel_shift = 0, 1270 + .parent_map = gcc_pxo_pll8_map, 1271 + }, 1272 + .freq_tbl = clk_tbl_gsbi_qup, 1273 + .clkr = { 1274 + .enable_reg = 0x2b0c, 1275 + .enable_mask = BIT(11), 1276 + .hw.init = &(struct clk_init_data){ 1277 + .name = "gsbi11_qup_src", 1278 + .parent_names = gcc_pxo_pll8, 1279 + .num_parents = 2, 1280 + .ops = &clk_rcg_ops, 1281 + .flags = CLK_SET_PARENT_GATE, 1282 + }, 1283 + }, 1284 + }; 1285 + 1286 + static struct clk_branch gsbi11_qup_clk = { 1287 + .halt_reg = 0x2fd4, 1288 + .halt_bit = 15, 1289 + .clkr = { 1290 + .enable_reg = 0x2b0c, 1291 + .enable_mask = BIT(9), 1292 + .hw.init = &(struct clk_init_data){ 1293 + .name = "gsbi11_qup_clk", 1294 + .parent_names = (const char *[]){ "gsbi11_qup_src" }, 1295 + .num_parents = 1, 1296 + .ops = &clk_branch_ops, 1297 + .flags = CLK_SET_RATE_PARENT, 1298 + }, 1299 + }, 1300 + }; 1301 + 1302 + static struct clk_rcg gsbi12_qup_src = { 1303 + .ns_reg = 0x2b2c, 1304 + .md_reg = 0x2b28, 1305 + .mn = { 1306 + .mnctr_en_bit = 8, 1307 + .mnctr_reset_bit = 7, 1308 + .mnctr_mode_shift = 5, 1309 + .n_val_shift = 16, 1310 + .m_val_shift = 16, 1311 + .width = 8, 1312 + }, 1313 + .p = { 1314 + .pre_div_shift = 3, 1315 + .pre_div_width = 2, 1316 + }, 1317 + .s = { 1318 + .src_sel_shift = 0, 1319 + .parent_map = gcc_pxo_pll8_map, 1320 + }, 1321 + .freq_tbl = clk_tbl_gsbi_qup, 1322 + .clkr = { 1323 + .enable_reg = 0x2b2c, 1324 + .enable_mask = BIT(11), 1325 + .hw.init = &(struct clk_init_data){ 1326 + .name = "gsbi12_qup_src", 1327 + .parent_names = gcc_pxo_pll8, 1328 + .num_parents = 2, 1329 + .ops = &clk_rcg_ops, 1330 + .flags = CLK_SET_PARENT_GATE, 1331 + }, 1332 + }, 1333 + }; 1334 + 1335 + static struct clk_branch gsbi12_qup_clk = { 1336 + .halt_reg = 0x2fd4, 1337 + .halt_bit = 11, 1338 + .clkr = { 1339 + .enable_reg = 0x2b2c, 1340 + .enable_mask = BIT(9), 1341 + .hw.init = &(struct clk_init_data){ 1342 + .name = "gsbi12_qup_clk", 1343 + .parent_names = (const char *[]){ "gsbi12_qup_src" }, 1344 + .num_parents = 1, 1345 + .ops = &clk_branch_ops, 1346 + .flags = CLK_SET_RATE_PARENT, 1347 + }, 1348 + }, 1349 + }; 1350 + 1351 + static const struct freq_tbl clk_tbl_gp[] = { 1352 + { 9600000, P_CXO, 2, 0, 0 }, 1353 + { 13500000, P_PXO, 2, 0, 0 }, 1354 + { 19200000, P_CXO, 1, 0, 0 }, 1355 + { 27000000, P_PXO, 1, 0, 0 }, 1356 + { 64000000, P_PLL8, 2, 1, 3 }, 1357 + { 76800000, P_PLL8, 1, 1, 5 }, 1358 + { 96000000, P_PLL8, 4, 0, 0 }, 1359 + { 128000000, P_PLL8, 3, 0, 0 }, 1360 + { 192000000, P_PLL8, 2, 0, 0 }, 1361 + { } 1362 + }; 1363 + 1364 + static struct clk_rcg gp0_src = { 1365 + .ns_reg = 0x2d24, 1366 + .md_reg = 0x2d00, 1367 + .mn = { 1368 + .mnctr_en_bit = 8, 1369 + .mnctr_reset_bit = 7, 1370 + .mnctr_mode_shift = 5, 1371 + .n_val_shift = 16, 1372 + .m_val_shift = 16, 1373 + .width = 8, 1374 + }, 1375 + .p = { 1376 + .pre_div_shift = 3, 1377 + .pre_div_width = 2, 1378 + }, 1379 + .s = { 1380 + .src_sel_shift = 0, 1381 + .parent_map = gcc_pxo_pll8_cxo_map, 1382 + }, 1383 + .freq_tbl = clk_tbl_gp, 1384 + .clkr = { 1385 + .enable_reg = 0x2d24, 1386 + .enable_mask = BIT(11), 1387 + .hw.init = &(struct clk_init_data){ 1388 + .name = "gp0_src", 1389 + .parent_names = gcc_pxo_pll8_cxo, 1390 + .num_parents = 3, 1391 + .ops = &clk_rcg_ops, 1392 + .flags = CLK_SET_PARENT_GATE, 1393 + }, 1394 + } 1395 + }; 1396 + 1397 + static struct clk_branch gp0_clk = { 1398 + .halt_reg = 0x2fd8, 1399 + .halt_bit = 7, 1400 + .clkr = { 1401 + .enable_reg = 0x2d24, 1402 + .enable_mask = BIT(9), 1403 + .hw.init = &(struct clk_init_data){ 1404 + .name = "gp0_clk", 1405 + .parent_names = (const char *[]){ "gp0_src" }, 1406 + .num_parents = 1, 1407 + .ops = &clk_branch_ops, 1408 + .flags = CLK_SET_RATE_PARENT, 1409 + }, 1410 + }, 1411 + }; 1412 + 1413 + static struct clk_rcg gp1_src = { 1414 + .ns_reg = 0x2d44, 1415 + .md_reg = 0x2d40, 1416 + .mn = { 1417 + .mnctr_en_bit = 8, 1418 + .mnctr_reset_bit = 7, 1419 + .mnctr_mode_shift = 5, 1420 + .n_val_shift = 16, 1421 + .m_val_shift = 16, 1422 + .width = 8, 1423 + }, 1424 + .p = { 1425 + .pre_div_shift = 3, 1426 + .pre_div_width = 2, 1427 + }, 1428 + .s = { 1429 + .src_sel_shift = 0, 1430 + .parent_map = gcc_pxo_pll8_cxo_map, 1431 + }, 1432 + .freq_tbl = clk_tbl_gp, 1433 + .clkr = { 1434 + .enable_reg = 0x2d44, 1435 + .enable_mask = BIT(11), 1436 + .hw.init = &(struct clk_init_data){ 1437 + .name = "gp1_src", 1438 + .parent_names = gcc_pxo_pll8_cxo, 1439 + .num_parents = 3, 1440 + .ops = &clk_rcg_ops, 1441 + .flags = CLK_SET_RATE_GATE, 1442 + }, 1443 + } 1444 + }; 1445 + 1446 + static struct clk_branch gp1_clk = { 1447 + .halt_reg = 0x2fd8, 1448 + .halt_bit = 6, 1449 + .clkr = { 1450 + .enable_reg = 0x2d44, 1451 + .enable_mask = BIT(9), 1452 + .hw.init = &(struct clk_init_data){ 1453 + .name = "gp1_clk", 1454 + .parent_names = (const char *[]){ "gp1_src" }, 1455 + .num_parents = 1, 1456 + .ops = &clk_branch_ops, 1457 + .flags = CLK_SET_RATE_PARENT, 1458 + }, 1459 + }, 1460 + }; 1461 + 1462 + static struct clk_rcg gp2_src = { 1463 + .ns_reg = 0x2d64, 1464 + .md_reg = 0x2d60, 1465 + .mn = { 1466 + .mnctr_en_bit = 8, 1467 + .mnctr_reset_bit = 7, 1468 + .mnctr_mode_shift = 5, 1469 + .n_val_shift = 16, 1470 + .m_val_shift = 16, 1471 + .width = 8, 1472 + }, 1473 + .p = { 1474 + .pre_div_shift = 3, 1475 + .pre_div_width = 2, 1476 + }, 1477 + .s = { 1478 + .src_sel_shift = 0, 1479 + .parent_map = gcc_pxo_pll8_cxo_map, 1480 + }, 1481 + .freq_tbl = clk_tbl_gp, 1482 + .clkr = { 1483 + .enable_reg = 0x2d64, 1484 + .enable_mask = BIT(11), 1485 + .hw.init = &(struct clk_init_data){ 1486 + .name = "gp2_src", 1487 + .parent_names = gcc_pxo_pll8_cxo, 1488 + .num_parents = 3, 1489 + .ops = &clk_rcg_ops, 1490 + .flags = CLK_SET_RATE_GATE, 1491 + }, 1492 + } 1493 + }; 1494 + 1495 + static struct clk_branch gp2_clk = { 1496 + .halt_reg = 0x2fd8, 1497 + .halt_bit = 5, 1498 + .clkr = { 1499 + .enable_reg = 0x2d64, 1500 + .enable_mask = BIT(9), 1501 + .hw.init = &(struct clk_init_data){ 1502 + .name = "gp2_clk", 1503 + .parent_names = (const char *[]){ "gp2_src" }, 1504 + .num_parents = 1, 1505 + .ops = &clk_branch_ops, 1506 + .flags = CLK_SET_RATE_PARENT, 1507 + }, 1508 + }, 1509 + }; 1510 + 1511 + static struct clk_branch pmem_clk = { 1512 + .hwcg_reg = 0x25a0, 1513 + .hwcg_bit = 6, 1514 + .halt_reg = 0x2fc8, 1515 + .halt_bit = 20, 1516 + .clkr = { 1517 + .enable_reg = 0x25a0, 1518 + .enable_mask = BIT(4), 1519 + .hw.init = &(struct clk_init_data){ 1520 + .name = "pmem_clk", 1521 + .ops = &clk_branch_ops, 1522 + .flags = CLK_IS_ROOT, 1523 + }, 1524 + }, 1525 + }; 1526 + 1527 + static struct clk_rcg prng_src = { 1528 + .ns_reg = 0x2e80, 1529 + .p = { 1530 + .pre_div_shift = 3, 1531 + .pre_div_width = 4, 1532 + }, 1533 + .s = { 1534 + .src_sel_shift = 0, 1535 + .parent_map = gcc_pxo_pll8_map, 1536 + }, 1537 + .clkr = { 1538 + .hw.init = &(struct clk_init_data){ 1539 + .name = "prng_src", 1540 + .parent_names = gcc_pxo_pll8, 1541 + .num_parents = 2, 1542 + .ops = &clk_rcg_ops, 1543 + }, 1544 + }, 1545 + }; 1546 + 1547 + static struct clk_branch prng_clk = { 1548 + .halt_reg = 0x2fd8, 1549 + .halt_check = BRANCH_HALT_VOTED, 1550 + .halt_bit = 10, 1551 + .clkr = { 1552 + .enable_reg = 0x3080, 1553 + .enable_mask = BIT(10), 1554 + .hw.init = &(struct clk_init_data){ 1555 + .name = "prng_clk", 1556 + .parent_names = (const char *[]){ "prng_src" }, 1557 + .num_parents = 1, 1558 + .ops = &clk_branch_ops, 1559 + }, 1560 + }, 1561 + }; 1562 + 1563 + static const struct freq_tbl clk_tbl_sdc[] = { 1564 + { 144000, P_PXO, 3, 2, 125 }, 1565 + { 400000, P_PLL8, 4, 1, 240 }, 1566 + { 16000000, P_PLL8, 4, 1, 6 }, 1567 + { 17070000, P_PLL8, 1, 2, 45 }, 1568 + { 20210000, P_PLL8, 1, 1, 19 }, 1569 + { 24000000, P_PLL8, 4, 1, 4 }, 1570 + { 48000000, P_PLL8, 4, 1, 2 }, 1571 + { 64000000, P_PLL8, 3, 1, 2 }, 1572 + { 96000000, P_PLL8, 4, 0, 0 }, 1573 + { 192000000, P_PLL8, 2, 0, 0 }, 1574 + { } 1575 + }; 1576 + 1577 + static struct clk_rcg sdc1_src = { 1578 + .ns_reg = 0x282c, 1579 + .md_reg = 0x2828, 1580 + .mn = { 1581 + .mnctr_en_bit = 8, 1582 + .mnctr_reset_bit = 7, 1583 + .mnctr_mode_shift = 5, 1584 + .n_val_shift = 16, 1585 + .m_val_shift = 16, 1586 + .width = 8, 1587 + }, 1588 + .p = { 1589 + .pre_div_shift = 3, 1590 + .pre_div_width = 2, 1591 + }, 1592 + .s = { 1593 + .src_sel_shift = 0, 1594 + .parent_map = gcc_pxo_pll8_map, 1595 + }, 1596 + .freq_tbl = clk_tbl_sdc, 1597 + .clkr = { 1598 + .enable_reg = 0x282c, 1599 + .enable_mask = BIT(11), 1600 + .hw.init = &(struct clk_init_data){ 1601 + .name = "sdc1_src", 1602 + .parent_names = gcc_pxo_pll8, 1603 + .num_parents = 2, 1604 + .ops = &clk_rcg_ops, 1605 + .flags = CLK_SET_RATE_GATE, 1606 + }, 1607 + } 1608 + }; 1609 + 1610 + static struct clk_branch sdc1_clk = { 1611 + .halt_reg = 0x2fc8, 1612 + .halt_bit = 6, 1613 + .clkr = { 1614 + .enable_reg = 0x282c, 1615 + .enable_mask = BIT(9), 1616 + .hw.init = &(struct clk_init_data){ 1617 + .name = "sdc1_clk", 1618 + .parent_names = (const char *[]){ "sdc1_src" }, 1619 + .num_parents = 1, 1620 + .ops = &clk_branch_ops, 1621 + .flags = CLK_SET_RATE_PARENT, 1622 + }, 1623 + }, 1624 + }; 1625 + 1626 + static struct clk_rcg sdc2_src = { 1627 + .ns_reg = 0x284c, 1628 + .md_reg = 0x2848, 1629 + .mn = { 1630 + .mnctr_en_bit = 8, 1631 + .mnctr_reset_bit = 7, 1632 + .mnctr_mode_shift = 5, 1633 + .n_val_shift = 16, 1634 + .m_val_shift = 16, 1635 + .width = 8, 1636 + }, 1637 + .p = { 1638 + .pre_div_shift = 3, 1639 + .pre_div_width = 2, 1640 + }, 1641 + .s = { 1642 + .src_sel_shift = 0, 1643 + .parent_map = gcc_pxo_pll8_map, 1644 + }, 1645 + .freq_tbl = clk_tbl_sdc, 1646 + .clkr = { 1647 + .enable_reg = 0x284c, 1648 + .enable_mask = BIT(11), 1649 + .hw.init = &(struct clk_init_data){ 1650 + .name = "sdc2_src", 1651 + .parent_names = gcc_pxo_pll8, 1652 + .num_parents = 2, 1653 + .ops = &clk_rcg_ops, 1654 + .flags = CLK_SET_RATE_GATE, 1655 + }, 1656 + } 1657 + }; 1658 + 1659 + static struct clk_branch sdc2_clk = { 1660 + .halt_reg = 0x2fc8, 1661 + .halt_bit = 5, 1662 + .clkr = { 1663 + .enable_reg = 0x284c, 1664 + .enable_mask = BIT(9), 1665 + .hw.init = &(struct clk_init_data){ 1666 + .name = "sdc2_clk", 1667 + .parent_names = (const char *[]){ "sdc2_src" }, 1668 + .num_parents = 1, 1669 + .ops = &clk_branch_ops, 1670 + .flags = CLK_SET_RATE_PARENT, 1671 + }, 1672 + }, 1673 + }; 1674 + 1675 + static struct clk_rcg sdc3_src = { 1676 + .ns_reg = 0x286c, 1677 + .md_reg = 0x2868, 1678 + .mn = { 1679 + .mnctr_en_bit = 8, 1680 + .mnctr_reset_bit = 7, 1681 + .mnctr_mode_shift = 5, 1682 + .n_val_shift = 16, 1683 + .m_val_shift = 16, 1684 + .width = 8, 1685 + }, 1686 + .p = { 1687 + .pre_div_shift = 3, 1688 + .pre_div_width = 2, 1689 + }, 1690 + .s = { 1691 + .src_sel_shift = 0, 1692 + .parent_map = gcc_pxo_pll8_map, 1693 + }, 1694 + .freq_tbl = clk_tbl_sdc, 1695 + .clkr = { 1696 + .enable_reg = 0x286c, 1697 + .enable_mask = BIT(11), 1698 + .hw.init = &(struct clk_init_data){ 1699 + .name = "sdc3_src", 1700 + .parent_names = gcc_pxo_pll8, 1701 + .num_parents = 2, 1702 + .ops = &clk_rcg_ops, 1703 + .flags = CLK_SET_RATE_GATE, 1704 + }, 1705 + } 1706 + }; 1707 + 1708 + static struct clk_branch sdc3_clk = { 1709 + .halt_reg = 0x2fc8, 1710 + .halt_bit = 4, 1711 + .clkr = { 1712 + .enable_reg = 0x286c, 1713 + .enable_mask = BIT(9), 1714 + .hw.init = &(struct clk_init_data){ 1715 + .name = "sdc3_clk", 1716 + .parent_names = (const char *[]){ "sdc3_src" }, 1717 + .num_parents = 1, 1718 + .ops = &clk_branch_ops, 1719 + .flags = CLK_SET_RATE_PARENT, 1720 + }, 1721 + }, 1722 + }; 1723 + 1724 + static struct clk_rcg sdc4_src = { 1725 + .ns_reg = 0x288c, 1726 + .md_reg = 0x2888, 1727 + .mn = { 1728 + .mnctr_en_bit = 8, 1729 + .mnctr_reset_bit = 7, 1730 + .mnctr_mode_shift = 5, 1731 + .n_val_shift = 16, 1732 + .m_val_shift = 16, 1733 + .width = 8, 1734 + }, 1735 + .p = { 1736 + .pre_div_shift = 3, 1737 + .pre_div_width = 2, 1738 + }, 1739 + .s = { 1740 + .src_sel_shift = 0, 1741 + .parent_map = gcc_pxo_pll8_map, 1742 + }, 1743 + .freq_tbl = clk_tbl_sdc, 1744 + .clkr = { 1745 + .enable_reg = 0x288c, 1746 + .enable_mask = BIT(11), 1747 + .hw.init = &(struct clk_init_data){ 1748 + .name = "sdc4_src", 1749 + .parent_names = gcc_pxo_pll8, 1750 + .num_parents = 2, 1751 + .ops = &clk_rcg_ops, 1752 + .flags = CLK_SET_RATE_GATE, 1753 + }, 1754 + } 1755 + }; 1756 + 1757 + static struct clk_branch sdc4_clk = { 1758 + .halt_reg = 0x2fc8, 1759 + .halt_bit = 3, 1760 + .clkr = { 1761 + .enable_reg = 0x288c, 1762 + .enable_mask = BIT(9), 1763 + .hw.init = &(struct clk_init_data){ 1764 + .name = "sdc4_clk", 1765 + .parent_names = (const char *[]){ "sdc4_src" }, 1766 + .num_parents = 1, 1767 + .ops = &clk_branch_ops, 1768 + .flags = CLK_SET_RATE_PARENT, 1769 + }, 1770 + }, 1771 + }; 1772 + 1773 + static struct clk_rcg sdc5_src = { 1774 + .ns_reg = 0x28ac, 1775 + .md_reg = 0x28a8, 1776 + .mn = { 1777 + .mnctr_en_bit = 8, 1778 + .mnctr_reset_bit = 7, 1779 + .mnctr_mode_shift = 5, 1780 + .n_val_shift = 16, 1781 + .m_val_shift = 16, 1782 + .width = 8, 1783 + }, 1784 + .p = { 1785 + .pre_div_shift = 3, 1786 + .pre_div_width = 2, 1787 + }, 1788 + .s = { 1789 + .src_sel_shift = 0, 1790 + .parent_map = gcc_pxo_pll8_map, 1791 + }, 1792 + .freq_tbl = clk_tbl_sdc, 1793 + .clkr = { 1794 + .enable_reg = 0x28ac, 1795 + .enable_mask = BIT(11), 1796 + .hw.init = &(struct clk_init_data){ 1797 + .name = "sdc5_src", 1798 + .parent_names = gcc_pxo_pll8, 1799 + .num_parents = 2, 1800 + .ops = &clk_rcg_ops, 1801 + .flags = CLK_SET_RATE_GATE, 1802 + }, 1803 + } 1804 + }; 1805 + 1806 + static struct clk_branch sdc5_clk = { 1807 + .halt_reg = 0x2fc8, 1808 + .halt_bit = 2, 1809 + .clkr = { 1810 + .enable_reg = 0x28ac, 1811 + .enable_mask = BIT(9), 1812 + .hw.init = &(struct clk_init_data){ 1813 + .name = "sdc5_clk", 1814 + .parent_names = (const char *[]){ "sdc5_src" }, 1815 + .num_parents = 1, 1816 + .ops = &clk_branch_ops, 1817 + .flags = CLK_SET_RATE_PARENT, 1818 + }, 1819 + }, 1820 + }; 1821 + 1822 + static const struct freq_tbl clk_tbl_tsif_ref[] = { 1823 + { 105000, P_PXO, 1, 1, 256 }, 1824 + { } 1825 + }; 1826 + 1827 + static struct clk_rcg tsif_ref_src = { 1828 + .ns_reg = 0x2710, 1829 + .md_reg = 0x270c, 1830 + .mn = { 1831 + .mnctr_en_bit = 8, 1832 + .mnctr_reset_bit = 7, 1833 + .mnctr_mode_shift = 5, 1834 + .n_val_shift = 16, 1835 + .m_val_shift = 16, 1836 + .width = 16, 1837 + }, 1838 + .p = { 1839 + .pre_div_shift = 3, 1840 + .pre_div_width = 2, 1841 + }, 1842 + .s = { 1843 + .src_sel_shift = 0, 1844 + .parent_map = gcc_pxo_pll8_map, 1845 + }, 1846 + .freq_tbl = clk_tbl_tsif_ref, 1847 + .clkr = { 1848 + .enable_reg = 0x2710, 1849 + .enable_mask = BIT(11), 1850 + .hw.init = &(struct clk_init_data){ 1851 + .name = "tsif_ref_src", 1852 + .parent_names = gcc_pxo_pll8, 1853 + .num_parents = 2, 1854 + .ops = &clk_rcg_ops, 1855 + .flags = CLK_SET_RATE_GATE, 1856 + }, 1857 + } 1858 + }; 1859 + 1860 + static struct clk_branch tsif_ref_clk = { 1861 + .halt_reg = 0x2fd4, 1862 + .halt_bit = 5, 1863 + .clkr = { 1864 + .enable_reg = 0x2710, 1865 + .enable_mask = BIT(9), 1866 + .hw.init = &(struct clk_init_data){ 1867 + .name = "tsif_ref_clk", 1868 + .parent_names = (const char *[]){ "tsif_ref_src" }, 1869 + .num_parents = 1, 1870 + .ops = &clk_branch_ops, 1871 + .flags = CLK_SET_RATE_PARENT, 1872 + }, 1873 + }, 1874 + }; 1875 + 1876 + static const struct freq_tbl clk_tbl_usb[] = { 1877 + { 60000000, P_PLL8, 1, 5, 32 }, 1878 + { } 1879 + }; 1880 + 1881 + static struct clk_rcg usb_hs1_xcvr_src = { 1882 + .ns_reg = 0x290c, 1883 + .md_reg = 0x2908, 1884 + .mn = { 1885 + .mnctr_en_bit = 8, 1886 + .mnctr_reset_bit = 7, 1887 + .mnctr_mode_shift = 5, 1888 + .n_val_shift = 16, 1889 + .m_val_shift = 16, 1890 + .width = 8, 1891 + }, 1892 + .p = { 1893 + .pre_div_shift = 3, 1894 + .pre_div_width = 2, 1895 + }, 1896 + .s = { 1897 + .src_sel_shift = 0, 1898 + .parent_map = gcc_pxo_pll8_map, 1899 + }, 1900 + .freq_tbl = clk_tbl_usb, 1901 + .clkr = { 1902 + .enable_reg = 0x290c, 1903 + .enable_mask = BIT(11), 1904 + .hw.init = &(struct clk_init_data){ 1905 + .name = "usb_hs1_xcvr_src", 1906 + .parent_names = gcc_pxo_pll8, 1907 + .num_parents = 2, 1908 + .ops = &clk_rcg_ops, 1909 + .flags = CLK_SET_RATE_GATE, 1910 + }, 1911 + } 1912 + }; 1913 + 1914 + static struct clk_branch usb_hs1_xcvr_clk = { 1915 + .halt_reg = 0x2fc8, 1916 + .halt_bit = 0, 1917 + .clkr = { 1918 + .enable_reg = 0x290c, 1919 + .enable_mask = BIT(9), 1920 + .hw.init = &(struct clk_init_data){ 1921 + .name = "usb_hs1_xcvr_clk", 1922 + .parent_names = (const char *[]){ "usb_hs1_xcvr_src" }, 1923 + .num_parents = 1, 1924 + .ops = &clk_branch_ops, 1925 + .flags = CLK_SET_RATE_PARENT, 1926 + }, 1927 + }, 1928 + }; 1929 + 1930 + static struct clk_rcg usb_hsic_xcvr_fs_src = { 1931 + .ns_reg = 0x2928, 1932 + .md_reg = 0x2924, 1933 + .mn = { 1934 + .mnctr_en_bit = 8, 1935 + .mnctr_reset_bit = 7, 1936 + .mnctr_mode_shift = 5, 1937 + .n_val_shift = 16, 1938 + .m_val_shift = 16, 1939 + .width = 8, 1940 + }, 1941 + .p = { 1942 + .pre_div_shift = 3, 1943 + .pre_div_width = 2, 1944 + }, 1945 + .s = { 1946 + .src_sel_shift = 0, 1947 + .parent_map = gcc_pxo_pll8_map, 1948 + }, 1949 + .freq_tbl = clk_tbl_usb, 1950 + .clkr = { 1951 + .enable_reg = 0x2928, 1952 + .enable_mask = BIT(11), 1953 + .hw.init = &(struct clk_init_data){ 1954 + .name = "usb_hsic_xcvr_fs_src", 1955 + .parent_names = gcc_pxo_pll8, 1956 + .num_parents = 2, 1957 + .ops = &clk_rcg_ops, 1958 + .flags = CLK_SET_RATE_GATE, 1959 + }, 1960 + } 1961 + }; 1962 + 1963 + static const char *usb_hsic_xcvr_fs_src_p[] = { "usb_hsic_xcvr_fs_src" }; 1964 + 1965 + static struct clk_branch usb_hsic_xcvr_fs_clk = { 1966 + .halt_reg = 0x2fc8, 1967 + .halt_bit = 2, 1968 + .clkr = { 1969 + .enable_reg = 0x2928, 1970 + .enable_mask = BIT(9), 1971 + .hw.init = &(struct clk_init_data){ 1972 + .name = "usb_hsic_xcvr_fs_clk", 1973 + .parent_names = usb_hsic_xcvr_fs_src_p, 1974 + .num_parents = 1, 1975 + .ops = &clk_branch_ops, 1976 + .flags = CLK_SET_RATE_PARENT, 1977 + }, 1978 + }, 1979 + }; 1980 + 1981 + static struct clk_branch usb_hsic_system_clk = { 1982 + .halt_reg = 0x2fcc, 1983 + .halt_bit = 24, 1984 + .clkr = { 1985 + .enable_reg = 0x292c, 1986 + .enable_mask = BIT(4), 1987 + .hw.init = &(struct clk_init_data){ 1988 + .parent_names = usb_hsic_xcvr_fs_src_p, 1989 + .num_parents = 1, 1990 + .name = "usb_hsic_system_clk", 1991 + .ops = &clk_branch_ops, 1992 + .flags = CLK_SET_RATE_PARENT, 1993 + }, 1994 + }, 1995 + }; 1996 + 1997 + static struct clk_branch usb_hsic_hsic_clk = { 1998 + .halt_reg = 0x2fcc, 1999 + .halt_bit = 19, 2000 + .clkr = { 2001 + .enable_reg = 0x2b44, 2002 + .enable_mask = BIT(0), 2003 + .hw.init = &(struct clk_init_data){ 2004 + .parent_names = (const char *[]){ "pll14_vote" }, 2005 + .num_parents = 1, 2006 + .name = "usb_hsic_hsic_clk", 2007 + .ops = &clk_branch_ops, 2008 + }, 2009 + }, 2010 + }; 2011 + 2012 + static struct clk_branch usb_hsic_hsio_cal_clk = { 2013 + .halt_reg = 0x2fcc, 2014 + .halt_bit = 23, 2015 + .clkr = { 2016 + .enable_reg = 0x2b48, 2017 + .enable_mask = BIT(0), 2018 + .hw.init = &(struct clk_init_data){ 2019 + .name = "usb_hsic_hsio_cal_clk", 2020 + .ops = &clk_branch_ops, 2021 + .flags = CLK_IS_ROOT, 2022 + }, 2023 + }, 2024 + }; 2025 + 2026 + static struct clk_rcg usb_fs1_xcvr_fs_src = { 2027 + .ns_reg = 0x2968, 2028 + .md_reg = 0x2964, 2029 + .mn = { 2030 + .mnctr_en_bit = 8, 2031 + .mnctr_reset_bit = 7, 2032 + .mnctr_mode_shift = 5, 2033 + .n_val_shift = 16, 2034 + .m_val_shift = 16, 2035 + .width = 8, 2036 + }, 2037 + .p = { 2038 + .pre_div_shift = 3, 2039 + .pre_div_width = 2, 2040 + }, 2041 + .s = { 2042 + .src_sel_shift = 0, 2043 + .parent_map = gcc_pxo_pll8_map, 2044 + }, 2045 + .freq_tbl = clk_tbl_usb, 2046 + .clkr = { 2047 + .enable_reg = 0x2968, 2048 + .enable_mask = BIT(11), 2049 + .hw.init = &(struct clk_init_data){ 2050 + .name = "usb_fs1_xcvr_fs_src", 2051 + .parent_names = gcc_pxo_pll8, 2052 + .num_parents = 2, 2053 + .ops = &clk_rcg_ops, 2054 + .flags = CLK_SET_RATE_GATE, 2055 + }, 2056 + } 2057 + }; 2058 + 2059 + static const char *usb_fs1_xcvr_fs_src_p[] = { "usb_fs1_xcvr_fs_src" }; 2060 + 2061 + static struct clk_branch usb_fs1_xcvr_fs_clk = { 2062 + .halt_reg = 0x2fcc, 2063 + .halt_bit = 15, 2064 + .clkr = { 2065 + .enable_reg = 0x2968, 2066 + .enable_mask = BIT(9), 2067 + .hw.init = &(struct clk_init_data){ 2068 + .name = "usb_fs1_xcvr_fs_clk", 2069 + .parent_names = usb_fs1_xcvr_fs_src_p, 2070 + .num_parents = 1, 2071 + .ops = &clk_branch_ops, 2072 + .flags = CLK_SET_RATE_PARENT, 2073 + }, 2074 + }, 2075 + }; 2076 + 2077 + static struct clk_branch usb_fs1_system_clk = { 2078 + .halt_reg = 0x2fcc, 2079 + .halt_bit = 16, 2080 + .clkr = { 2081 + .enable_reg = 0x296c, 2082 + .enable_mask = BIT(4), 2083 + .hw.init = &(struct clk_init_data){ 2084 + .parent_names = usb_fs1_xcvr_fs_src_p, 2085 + .num_parents = 1, 2086 + .name = "usb_fs1_system_clk", 2087 + .ops = &clk_branch_ops, 2088 + .flags = CLK_SET_RATE_PARENT, 2089 + }, 2090 + }, 2091 + }; 2092 + 2093 + static struct clk_rcg usb_fs2_xcvr_fs_src = { 2094 + .ns_reg = 0x2988, 2095 + .md_reg = 0x2984, 2096 + .mn = { 2097 + .mnctr_en_bit = 8, 2098 + .mnctr_reset_bit = 7, 2099 + .mnctr_mode_shift = 5, 2100 + .n_val_shift = 16, 2101 + .m_val_shift = 16, 2102 + .width = 8, 2103 + }, 2104 + .p = { 2105 + .pre_div_shift = 3, 2106 + .pre_div_width = 2, 2107 + }, 2108 + .s = { 2109 + .src_sel_shift = 0, 2110 + .parent_map = gcc_pxo_pll8_map, 2111 + }, 2112 + .freq_tbl = clk_tbl_usb, 2113 + .clkr = { 2114 + .enable_reg = 0x2988, 2115 + .enable_mask = BIT(11), 2116 + .hw.init = &(struct clk_init_data){ 2117 + .name = "usb_fs2_xcvr_fs_src", 2118 + .parent_names = gcc_pxo_pll8, 2119 + .num_parents = 2, 2120 + .ops = &clk_rcg_ops, 2121 + .flags = CLK_SET_RATE_GATE, 2122 + }, 2123 + } 2124 + }; 2125 + 2126 + static const char *usb_fs2_xcvr_fs_src_p[] = { "usb_fs2_xcvr_fs_src" }; 2127 + 2128 + static struct clk_branch usb_fs2_xcvr_fs_clk = { 2129 + .halt_reg = 0x2fcc, 2130 + .halt_bit = 12, 2131 + .clkr = { 2132 + .enable_reg = 0x2988, 2133 + .enable_mask = BIT(9), 2134 + .hw.init = &(struct clk_init_data){ 2135 + .name = "usb_fs2_xcvr_fs_clk", 2136 + .parent_names = usb_fs2_xcvr_fs_src_p, 2137 + .num_parents = 1, 2138 + .ops = &clk_branch_ops, 2139 + .flags = CLK_SET_RATE_PARENT, 2140 + }, 2141 + }, 2142 + }; 2143 + 2144 + static struct clk_branch usb_fs2_system_clk = { 2145 + .halt_reg = 0x2fcc, 2146 + .halt_bit = 13, 2147 + .clkr = { 2148 + .enable_reg = 0x298c, 2149 + .enable_mask = BIT(4), 2150 + .hw.init = &(struct clk_init_data){ 2151 + .name = "usb_fs2_system_clk", 2152 + .parent_names = usb_fs2_xcvr_fs_src_p, 2153 + .num_parents = 1, 2154 + .ops = &clk_branch_ops, 2155 + .flags = CLK_SET_RATE_PARENT, 2156 + }, 2157 + }, 2158 + }; 2159 + 2160 + static struct clk_branch ce1_core_clk = { 2161 + .hwcg_reg = 0x2724, 2162 + .hwcg_bit = 6, 2163 + .halt_reg = 0x2fd4, 2164 + .halt_bit = 27, 2165 + .clkr = { 2166 + .enable_reg = 0x2724, 2167 + .enable_mask = BIT(4), 2168 + .hw.init = &(struct clk_init_data){ 2169 + .name = "ce1_core_clk", 2170 + .ops = &clk_branch_ops, 2171 + .flags = CLK_IS_ROOT, 2172 + }, 2173 + }, 2174 + }; 2175 + 2176 + static struct clk_branch ce1_h_clk = { 2177 + .halt_reg = 0x2fd4, 2178 + .halt_bit = 1, 2179 + .clkr = { 2180 + .enable_reg = 0x2720, 2181 + .enable_mask = BIT(4), 2182 + .hw.init = &(struct clk_init_data){ 2183 + .name = "ce1_h_clk", 2184 + .ops = &clk_branch_ops, 2185 + .flags = CLK_IS_ROOT, 2186 + }, 2187 + }, 2188 + }; 2189 + 2190 + static struct clk_branch dma_bam_h_clk = { 2191 + .hwcg_reg = 0x25c0, 2192 + .hwcg_bit = 6, 2193 + .halt_reg = 0x2fc8, 2194 + .halt_bit = 12, 2195 + .clkr = { 2196 + .enable_reg = 0x25c0, 2197 + .enable_mask = BIT(4), 2198 + .hw.init = &(struct clk_init_data){ 2199 + .name = "dma_bam_h_clk", 2200 + .ops = &clk_branch_ops, 2201 + .flags = CLK_IS_ROOT, 2202 + }, 2203 + }, 2204 + }; 2205 + 2206 + static struct clk_branch gsbi1_h_clk = { 2207 + .hwcg_reg = 0x29c0, 2208 + .hwcg_bit = 6, 2209 + .halt_reg = 0x2fcc, 2210 + .halt_bit = 11, 2211 + .clkr = { 2212 + .enable_reg = 0x29c0, 2213 + .enable_mask = BIT(4), 2214 + .hw.init = &(struct clk_init_data){ 2215 + .name = "gsbi1_h_clk", 2216 + .ops = &clk_branch_ops, 2217 + .flags = CLK_IS_ROOT, 2218 + }, 2219 + }, 2220 + }; 2221 + 2222 + static struct clk_branch gsbi2_h_clk = { 2223 + .hwcg_reg = 0x29e0, 2224 + .hwcg_bit = 6, 2225 + .halt_reg = 0x2fcc, 2226 + .halt_bit = 7, 2227 + .clkr = { 2228 + .enable_reg = 0x29e0, 2229 + .enable_mask = BIT(4), 2230 + .hw.init = &(struct clk_init_data){ 2231 + .name = "gsbi2_h_clk", 2232 + .ops = &clk_branch_ops, 2233 + .flags = CLK_IS_ROOT, 2234 + }, 2235 + }, 2236 + }; 2237 + 2238 + static struct clk_branch gsbi3_h_clk = { 2239 + .hwcg_reg = 0x2a00, 2240 + .hwcg_bit = 6, 2241 + .halt_reg = 0x2fcc, 2242 + .halt_bit = 3, 2243 + .clkr = { 2244 + .enable_reg = 0x2a00, 2245 + .enable_mask = BIT(4), 2246 + .hw.init = &(struct clk_init_data){ 2247 + .name = "gsbi3_h_clk", 2248 + .ops = &clk_branch_ops, 2249 + .flags = CLK_IS_ROOT, 2250 + }, 2251 + }, 2252 + }; 2253 + 2254 + static struct clk_branch gsbi4_h_clk = { 2255 + .hwcg_reg = 0x2a20, 2256 + .hwcg_bit = 6, 2257 + .halt_reg = 0x2fd0, 2258 + .halt_bit = 27, 2259 + .clkr = { 2260 + .enable_reg = 0x2a20, 2261 + .enable_mask = BIT(4), 2262 + .hw.init = &(struct clk_init_data){ 2263 + .name = "gsbi4_h_clk", 2264 + .ops = &clk_branch_ops, 2265 + .flags = CLK_IS_ROOT, 2266 + }, 2267 + }, 2268 + }; 2269 + 2270 + static struct clk_branch gsbi5_h_clk = { 2271 + .hwcg_reg = 0x2a40, 2272 + .hwcg_bit = 6, 2273 + .halt_reg = 0x2fd0, 2274 + .halt_bit = 23, 2275 + .clkr = { 2276 + .enable_reg = 0x2a40, 2277 + .enable_mask = BIT(4), 2278 + .hw.init = &(struct clk_init_data){ 2279 + .name = "gsbi5_h_clk", 2280 + .ops = &clk_branch_ops, 2281 + .flags = CLK_IS_ROOT, 2282 + }, 2283 + }, 2284 + }; 2285 + 2286 + static struct clk_branch gsbi6_h_clk = { 2287 + .hwcg_reg = 0x2a60, 2288 + .hwcg_bit = 6, 2289 + .halt_reg = 0x2fd0, 2290 + .halt_bit = 19, 2291 + .clkr = { 2292 + .enable_reg = 0x2a60, 2293 + .enable_mask = BIT(4), 2294 + .hw.init = &(struct clk_init_data){ 2295 + .name = "gsbi6_h_clk", 2296 + .ops = &clk_branch_ops, 2297 + .flags = CLK_IS_ROOT, 2298 + }, 2299 + }, 2300 + }; 2301 + 2302 + static struct clk_branch gsbi7_h_clk = { 2303 + .hwcg_reg = 0x2a80, 2304 + .hwcg_bit = 6, 2305 + .halt_reg = 0x2fd0, 2306 + .halt_bit = 15, 2307 + .clkr = { 2308 + .enable_reg = 0x2a80, 2309 + .enable_mask = BIT(4), 2310 + .hw.init = &(struct clk_init_data){ 2311 + .name = "gsbi7_h_clk", 2312 + .ops = &clk_branch_ops, 2313 + .flags = CLK_IS_ROOT, 2314 + }, 2315 + }, 2316 + }; 2317 + 2318 + static struct clk_branch gsbi8_h_clk = { 2319 + .hwcg_reg = 0x2aa0, 2320 + .hwcg_bit = 6, 2321 + .halt_reg = 0x2fd0, 2322 + .halt_bit = 11, 2323 + .clkr = { 2324 + .enable_reg = 0x2aa0, 2325 + .enable_mask = BIT(4), 2326 + .hw.init = &(struct clk_init_data){ 2327 + .name = "gsbi8_h_clk", 2328 + .ops = &clk_branch_ops, 2329 + .flags = CLK_IS_ROOT, 2330 + }, 2331 + }, 2332 + }; 2333 + 2334 + static struct clk_branch gsbi9_h_clk = { 2335 + .hwcg_reg = 0x2ac0, 2336 + .hwcg_bit = 6, 2337 + .halt_reg = 0x2fd0, 2338 + .halt_bit = 7, 2339 + .clkr = { 2340 + .enable_reg = 0x2ac0, 2341 + .enable_mask = BIT(4), 2342 + .hw.init = &(struct clk_init_data){ 2343 + .name = "gsbi9_h_clk", 2344 + .ops = &clk_branch_ops, 2345 + .flags = CLK_IS_ROOT, 2346 + }, 2347 + }, 2348 + }; 2349 + 2350 + static struct clk_branch gsbi10_h_clk = { 2351 + .hwcg_reg = 0x2ae0, 2352 + .hwcg_bit = 6, 2353 + .halt_reg = 0x2fd0, 2354 + .halt_bit = 3, 2355 + .clkr = { 2356 + .enable_reg = 0x2ae0, 2357 + .enable_mask = BIT(4), 2358 + .hw.init = &(struct clk_init_data){ 2359 + .name = "gsbi10_h_clk", 2360 + .ops = &clk_branch_ops, 2361 + .flags = CLK_IS_ROOT, 2362 + }, 2363 + }, 2364 + }; 2365 + 2366 + static struct clk_branch gsbi11_h_clk = { 2367 + .hwcg_reg = 0x2b00, 2368 + .hwcg_bit = 6, 2369 + .halt_reg = 0x2fd4, 2370 + .halt_bit = 18, 2371 + .clkr = { 2372 + .enable_reg = 0x2b00, 2373 + .enable_mask = BIT(4), 2374 + .hw.init = &(struct clk_init_data){ 2375 + .name = "gsbi11_h_clk", 2376 + .ops = &clk_branch_ops, 2377 + .flags = CLK_IS_ROOT, 2378 + }, 2379 + }, 2380 + }; 2381 + 2382 + static struct clk_branch gsbi12_h_clk = { 2383 + .hwcg_reg = 0x2b20, 2384 + .hwcg_bit = 6, 2385 + .halt_reg = 0x2fd4, 2386 + .halt_bit = 14, 2387 + .clkr = { 2388 + .enable_reg = 0x2b20, 2389 + .enable_mask = BIT(4), 2390 + .hw.init = &(struct clk_init_data){ 2391 + .name = "gsbi12_h_clk", 2392 + .ops = &clk_branch_ops, 2393 + .flags = CLK_IS_ROOT, 2394 + }, 2395 + }, 2396 + }; 2397 + 2398 + static struct clk_branch tsif_h_clk = { 2399 + .hwcg_reg = 0x2700, 2400 + .hwcg_bit = 6, 2401 + .halt_reg = 0x2fd4, 2402 + .halt_bit = 7, 2403 + .clkr = { 2404 + .enable_reg = 0x2700, 2405 + .enable_mask = BIT(4), 2406 + .hw.init = &(struct clk_init_data){ 2407 + .name = "tsif_h_clk", 2408 + .ops = &clk_branch_ops, 2409 + .flags = CLK_IS_ROOT, 2410 + }, 2411 + }, 2412 + }; 2413 + 2414 + static struct clk_branch usb_fs1_h_clk = { 2415 + .halt_reg = 0x2fcc, 2416 + .halt_bit = 17, 2417 + .clkr = { 2418 + .enable_reg = 0x2960, 2419 + .enable_mask = BIT(4), 2420 + .hw.init = &(struct clk_init_data){ 2421 + .name = "usb_fs1_h_clk", 2422 + .ops = &clk_branch_ops, 2423 + .flags = CLK_IS_ROOT, 2424 + }, 2425 + }, 2426 + }; 2427 + 2428 + static struct clk_branch usb_fs2_h_clk = { 2429 + .halt_reg = 0x2fcc, 2430 + .halt_bit = 14, 2431 + .clkr = { 2432 + .enable_reg = 0x2980, 2433 + .enable_mask = BIT(4), 2434 + .hw.init = &(struct clk_init_data){ 2435 + .name = "usb_fs2_h_clk", 2436 + .ops = &clk_branch_ops, 2437 + .flags = CLK_IS_ROOT, 2438 + }, 2439 + }, 2440 + }; 2441 + 2442 + static struct clk_branch usb_hs1_h_clk = { 2443 + .hwcg_reg = 0x2900, 2444 + .hwcg_bit = 6, 2445 + .halt_reg = 0x2fc8, 2446 + .halt_bit = 1, 2447 + .clkr = { 2448 + .enable_reg = 0x2900, 2449 + .enable_mask = BIT(4), 2450 + .hw.init = &(struct clk_init_data){ 2451 + .name = "usb_hs1_h_clk", 2452 + .ops = &clk_branch_ops, 2453 + .flags = CLK_IS_ROOT, 2454 + }, 2455 + }, 2456 + }; 2457 + 2458 + static struct clk_branch usb_hsic_h_clk = { 2459 + .halt_reg = 0x2fcc, 2460 + .halt_bit = 28, 2461 + .clkr = { 2462 + .enable_reg = 0x2920, 2463 + .enable_mask = BIT(4), 2464 + .hw.init = &(struct clk_init_data){ 2465 + .name = "usb_hsic_h_clk", 2466 + .ops = &clk_branch_ops, 2467 + .flags = CLK_IS_ROOT, 2468 + }, 2469 + }, 2470 + }; 2471 + 2472 + static struct clk_branch sdc1_h_clk = { 2473 + .hwcg_reg = 0x2820, 2474 + .hwcg_bit = 6, 2475 + .halt_reg = 0x2fc8, 2476 + .halt_bit = 11, 2477 + .clkr = { 2478 + .enable_reg = 0x2820, 2479 + .enable_mask = BIT(4), 2480 + .hw.init = &(struct clk_init_data){ 2481 + .name = "sdc1_h_clk", 2482 + .ops = &clk_branch_ops, 2483 + .flags = CLK_IS_ROOT, 2484 + }, 2485 + }, 2486 + }; 2487 + 2488 + static struct clk_branch sdc2_h_clk = { 2489 + .hwcg_reg = 0x2840, 2490 + .hwcg_bit = 6, 2491 + .halt_reg = 0x2fc8, 2492 + .halt_bit = 10, 2493 + .clkr = { 2494 + .enable_reg = 0x2840, 2495 + .enable_mask = BIT(4), 2496 + .hw.init = &(struct clk_init_data){ 2497 + .name = "sdc2_h_clk", 2498 + .ops = &clk_branch_ops, 2499 + .flags = CLK_IS_ROOT, 2500 + }, 2501 + }, 2502 + }; 2503 + 2504 + static struct clk_branch sdc3_h_clk = { 2505 + .hwcg_reg = 0x2860, 2506 + .hwcg_bit = 6, 2507 + .halt_reg = 0x2fc8, 2508 + .halt_bit = 9, 2509 + .clkr = { 2510 + .enable_reg = 0x2860, 2511 + .enable_mask = BIT(4), 2512 + .hw.init = &(struct clk_init_data){ 2513 + .name = "sdc3_h_clk", 2514 + .ops = &clk_branch_ops, 2515 + .flags = CLK_IS_ROOT, 2516 + }, 2517 + }, 2518 + }; 2519 + 2520 + static struct clk_branch sdc4_h_clk = { 2521 + .hwcg_reg = 0x2880, 2522 + .hwcg_bit = 6, 2523 + .halt_reg = 0x2fc8, 2524 + .halt_bit = 8, 2525 + .clkr = { 2526 + .enable_reg = 0x2880, 2527 + .enable_mask = BIT(4), 2528 + .hw.init = &(struct clk_init_data){ 2529 + .name = "sdc4_h_clk", 2530 + .ops = &clk_branch_ops, 2531 + .flags = CLK_IS_ROOT, 2532 + }, 2533 + }, 2534 + }; 2535 + 2536 + static struct clk_branch sdc5_h_clk = { 2537 + .hwcg_reg = 0x28a0, 2538 + .hwcg_bit = 6, 2539 + .halt_reg = 0x2fc8, 2540 + .halt_bit = 7, 2541 + .clkr = { 2542 + .enable_reg = 0x28a0, 2543 + .enable_mask = BIT(4), 2544 + .hw.init = &(struct clk_init_data){ 2545 + .name = "sdc5_h_clk", 2546 + .ops = &clk_branch_ops, 2547 + .flags = CLK_IS_ROOT, 2548 + }, 2549 + }, 2550 + }; 2551 + 2552 + static struct clk_branch adm0_clk = { 2553 + .halt_reg = 0x2fdc, 2554 + .halt_check = BRANCH_HALT_VOTED, 2555 + .halt_bit = 14, 2556 + .clkr = { 2557 + .enable_reg = 0x3080, 2558 + .enable_mask = BIT(2), 2559 + .hw.init = &(struct clk_init_data){ 2560 + .name = "adm0_clk", 2561 + .ops = &clk_branch_ops, 2562 + .flags = CLK_IS_ROOT, 2563 + }, 2564 + }, 2565 + }; 2566 + 2567 + static struct clk_branch adm0_pbus_clk = { 2568 + .hwcg_reg = 0x2208, 2569 + .hwcg_bit = 6, 2570 + .halt_reg = 0x2fdc, 2571 + .halt_check = BRANCH_HALT_VOTED, 2572 + .halt_bit = 13, 2573 + .clkr = { 2574 + .enable_reg = 0x3080, 2575 + .enable_mask = BIT(3), 2576 + .hw.init = &(struct clk_init_data){ 2577 + .name = "adm0_pbus_clk", 2578 + .ops = &clk_branch_ops, 2579 + .flags = CLK_IS_ROOT, 2580 + }, 2581 + }, 2582 + }; 2583 + 2584 + static struct clk_branch pmic_arb0_h_clk = { 2585 + .halt_reg = 0x2fd8, 2586 + .halt_check = BRANCH_HALT_VOTED, 2587 + .halt_bit = 22, 2588 + .clkr = { 2589 + .enable_reg = 0x3080, 2590 + .enable_mask = BIT(8), 2591 + .hw.init = &(struct clk_init_data){ 2592 + .name = "pmic_arb0_h_clk", 2593 + .ops = &clk_branch_ops, 2594 + .flags = CLK_IS_ROOT, 2595 + }, 2596 + }, 2597 + }; 2598 + 2599 + static struct clk_branch pmic_arb1_h_clk = { 2600 + .halt_reg = 0x2fd8, 2601 + .halt_check = BRANCH_HALT_VOTED, 2602 + .halt_bit = 21, 2603 + .clkr = { 2604 + .enable_reg = 0x3080, 2605 + .enable_mask = BIT(9), 2606 + .hw.init = &(struct clk_init_data){ 2607 + .name = "pmic_arb1_h_clk", 2608 + .ops = &clk_branch_ops, 2609 + .flags = CLK_IS_ROOT, 2610 + }, 2611 + }, 2612 + }; 2613 + 2614 + static struct clk_branch pmic_ssbi2_clk = { 2615 + .halt_reg = 0x2fd8, 2616 + .halt_check = BRANCH_HALT_VOTED, 2617 + .halt_bit = 23, 2618 + .clkr = { 2619 + .enable_reg = 0x3080, 2620 + .enable_mask = BIT(7), 2621 + .hw.init = &(struct clk_init_data){ 2622 + .name = "pmic_ssbi2_clk", 2623 + .ops = &clk_branch_ops, 2624 + .flags = CLK_IS_ROOT, 2625 + }, 2626 + }, 2627 + }; 2628 + 2629 + static struct clk_branch rpm_msg_ram_h_clk = { 2630 + .hwcg_reg = 0x27e0, 2631 + .hwcg_bit = 6, 2632 + .halt_reg = 0x2fd8, 2633 + .halt_check = BRANCH_HALT_VOTED, 2634 + .halt_bit = 12, 2635 + .clkr = { 2636 + .enable_reg = 0x3080, 2637 + .enable_mask = BIT(6), 2638 + .hw.init = &(struct clk_init_data){ 2639 + .name = "rpm_msg_ram_h_clk", 2640 + .ops = &clk_branch_ops, 2641 + .flags = CLK_IS_ROOT, 2642 + }, 2643 + }, 2644 + }; 2645 + 2646 + static struct clk_regmap *gcc_msm8960_clks[] = { 2647 + [PLL3] = &pll3.clkr, 2648 + [PLL8] = &pll8.clkr, 2649 + [PLL8_VOTE] = &pll8_vote, 2650 + [PLL14] = &pll14.clkr, 2651 + [PLL14_VOTE] = &pll14_vote, 2652 + [GSBI1_UART_SRC] = &gsbi1_uart_src.clkr, 2653 + [GSBI1_UART_CLK] = &gsbi1_uart_clk.clkr, 2654 + [GSBI2_UART_SRC] = &gsbi2_uart_src.clkr, 2655 + [GSBI2_UART_CLK] = &gsbi2_uart_clk.clkr, 2656 + [GSBI3_UART_SRC] = &gsbi3_uart_src.clkr, 2657 + [GSBI3_UART_CLK] = &gsbi3_uart_clk.clkr, 2658 + [GSBI4_UART_SRC] = &gsbi4_uart_src.clkr, 2659 + [GSBI4_UART_CLK] = &gsbi4_uart_clk.clkr, 2660 + [GSBI5_UART_SRC] = &gsbi5_uart_src.clkr, 2661 + [GSBI5_UART_CLK] = &gsbi5_uart_clk.clkr, 2662 + [GSBI6_UART_SRC] = &gsbi6_uart_src.clkr, 2663 + [GSBI6_UART_CLK] = &gsbi6_uart_clk.clkr, 2664 + [GSBI7_UART_SRC] = &gsbi7_uart_src.clkr, 2665 + [GSBI7_UART_CLK] = &gsbi7_uart_clk.clkr, 2666 + [GSBI8_UART_SRC] = &gsbi8_uart_src.clkr, 2667 + [GSBI8_UART_CLK] = &gsbi8_uart_clk.clkr, 2668 + [GSBI9_UART_SRC] = &gsbi9_uart_src.clkr, 2669 + [GSBI9_UART_CLK] = &gsbi9_uart_clk.clkr, 2670 + [GSBI10_UART_SRC] = &gsbi10_uart_src.clkr, 2671 + [GSBI10_UART_CLK] = &gsbi10_uart_clk.clkr, 2672 + [GSBI11_UART_SRC] = &gsbi11_uart_src.clkr, 2673 + [GSBI11_UART_CLK] = &gsbi11_uart_clk.clkr, 2674 + [GSBI12_UART_SRC] = &gsbi12_uart_src.clkr, 2675 + [GSBI12_UART_CLK] = &gsbi12_uart_clk.clkr, 2676 + [GSBI1_QUP_SRC] = &gsbi1_qup_src.clkr, 2677 + [GSBI1_QUP_CLK] = &gsbi1_qup_clk.clkr, 2678 + [GSBI2_QUP_SRC] = &gsbi2_qup_src.clkr, 2679 + [GSBI2_QUP_CLK] = &gsbi2_qup_clk.clkr, 2680 + [GSBI3_QUP_SRC] = &gsbi3_qup_src.clkr, 2681 + [GSBI3_QUP_CLK] = &gsbi3_qup_clk.clkr, 2682 + [GSBI4_QUP_SRC] = &gsbi4_qup_src.clkr, 2683 + [GSBI4_QUP_CLK] = &gsbi4_qup_clk.clkr, 2684 + [GSBI5_QUP_SRC] = &gsbi5_qup_src.clkr, 2685 + [GSBI5_QUP_CLK] = &gsbi5_qup_clk.clkr, 2686 + [GSBI6_QUP_SRC] = &gsbi6_qup_src.clkr, 2687 + [GSBI6_QUP_CLK] = &gsbi6_qup_clk.clkr, 2688 + [GSBI7_QUP_SRC] = &gsbi7_qup_src.clkr, 2689 + [GSBI7_QUP_CLK] = &gsbi7_qup_clk.clkr, 2690 + [GSBI8_QUP_SRC] = &gsbi8_qup_src.clkr, 2691 + [GSBI8_QUP_CLK] = &gsbi8_qup_clk.clkr, 2692 + [GSBI9_QUP_SRC] = &gsbi9_qup_src.clkr, 2693 + [GSBI9_QUP_CLK] = &gsbi9_qup_clk.clkr, 2694 + [GSBI10_QUP_SRC] = &gsbi10_qup_src.clkr, 2695 + [GSBI10_QUP_CLK] = &gsbi10_qup_clk.clkr, 2696 + [GSBI11_QUP_SRC] = &gsbi11_qup_src.clkr, 2697 + [GSBI11_QUP_CLK] = &gsbi11_qup_clk.clkr, 2698 + [GSBI12_QUP_SRC] = &gsbi12_qup_src.clkr, 2699 + [GSBI12_QUP_CLK] = &gsbi12_qup_clk.clkr, 2700 + [GP0_SRC] = &gp0_src.clkr, 2701 + [GP0_CLK] = &gp0_clk.clkr, 2702 + [GP1_SRC] = &gp1_src.clkr, 2703 + [GP1_CLK] = &gp1_clk.clkr, 2704 + [GP2_SRC] = &gp2_src.clkr, 2705 + [GP2_CLK] = &gp2_clk.clkr, 2706 + [PMEM_A_CLK] = &pmem_clk.clkr, 2707 + [PRNG_SRC] = &prng_src.clkr, 2708 + [PRNG_CLK] = &prng_clk.clkr, 2709 + [SDC1_SRC] = &sdc1_src.clkr, 2710 + [SDC1_CLK] = &sdc1_clk.clkr, 2711 + [SDC2_SRC] = &sdc2_src.clkr, 2712 + [SDC2_CLK] = &sdc2_clk.clkr, 2713 + [SDC3_SRC] = &sdc3_src.clkr, 2714 + [SDC3_CLK] = &sdc3_clk.clkr, 2715 + [SDC4_SRC] = &sdc4_src.clkr, 2716 + [SDC4_CLK] = &sdc4_clk.clkr, 2717 + [SDC5_SRC] = &sdc5_src.clkr, 2718 + [SDC5_CLK] = &sdc5_clk.clkr, 2719 + [TSIF_REF_SRC] = &tsif_ref_src.clkr, 2720 + [TSIF_REF_CLK] = &tsif_ref_clk.clkr, 2721 + [USB_HS1_XCVR_SRC] = &usb_hs1_xcvr_src.clkr, 2722 + [USB_HS1_XCVR_CLK] = &usb_hs1_xcvr_clk.clkr, 2723 + [USB_HSIC_XCVR_FS_SRC] = &usb_hsic_xcvr_fs_src.clkr, 2724 + [USB_HSIC_XCVR_FS_CLK] = &usb_hsic_xcvr_fs_clk.clkr, 2725 + [USB_HSIC_SYSTEM_CLK] = &usb_hsic_system_clk.clkr, 2726 + [USB_HSIC_HSIC_CLK] = &usb_hsic_hsic_clk.clkr, 2727 + [USB_HSIC_HSIO_CAL_CLK] = &usb_hsic_hsio_cal_clk.clkr, 2728 + [USB_FS1_XCVR_FS_SRC] = &usb_fs1_xcvr_fs_src.clkr, 2729 + [USB_FS1_XCVR_FS_CLK] = &usb_fs1_xcvr_fs_clk.clkr, 2730 + [USB_FS1_SYSTEM_CLK] = &usb_fs1_system_clk.clkr, 2731 + [USB_FS2_XCVR_FS_SRC] = &usb_fs2_xcvr_fs_src.clkr, 2732 + [USB_FS2_XCVR_FS_CLK] = &usb_fs2_xcvr_fs_clk.clkr, 2733 + [USB_FS2_SYSTEM_CLK] = &usb_fs2_system_clk.clkr, 2734 + [CE1_CORE_CLK] = &ce1_core_clk.clkr, 2735 + [CE1_H_CLK] = &ce1_h_clk.clkr, 2736 + [DMA_BAM_H_CLK] = &dma_bam_h_clk.clkr, 2737 + [GSBI1_H_CLK] = &gsbi1_h_clk.clkr, 2738 + [GSBI2_H_CLK] = &gsbi2_h_clk.clkr, 2739 + [GSBI3_H_CLK] = &gsbi3_h_clk.clkr, 2740 + [GSBI4_H_CLK] = &gsbi4_h_clk.clkr, 2741 + [GSBI5_H_CLK] = &gsbi5_h_clk.clkr, 2742 + [GSBI6_H_CLK] = &gsbi6_h_clk.clkr, 2743 + [GSBI7_H_CLK] = &gsbi7_h_clk.clkr, 2744 + [GSBI8_H_CLK] = &gsbi8_h_clk.clkr, 2745 + [GSBI9_H_CLK] = &gsbi9_h_clk.clkr, 2746 + [GSBI10_H_CLK] = &gsbi10_h_clk.clkr, 2747 + [GSBI11_H_CLK] = &gsbi11_h_clk.clkr, 2748 + [GSBI12_H_CLK] = &gsbi12_h_clk.clkr, 2749 + [TSIF_H_CLK] = &tsif_h_clk.clkr, 2750 + [USB_FS1_H_CLK] = &usb_fs1_h_clk.clkr, 2751 + [USB_FS2_H_CLK] = &usb_fs2_h_clk.clkr, 2752 + [USB_HS1_H_CLK] = &usb_hs1_h_clk.clkr, 2753 + [USB_HSIC_H_CLK] = &usb_hsic_h_clk.clkr, 2754 + [SDC1_H_CLK] = &sdc1_h_clk.clkr, 2755 + [SDC2_H_CLK] = &sdc2_h_clk.clkr, 2756 + [SDC3_H_CLK] = &sdc3_h_clk.clkr, 2757 + [SDC4_H_CLK] = &sdc4_h_clk.clkr, 2758 + [SDC5_H_CLK] = &sdc5_h_clk.clkr, 2759 + [ADM0_CLK] = &adm0_clk.clkr, 2760 + [ADM0_PBUS_CLK] = &adm0_pbus_clk.clkr, 2761 + [PMIC_ARB0_H_CLK] = &pmic_arb0_h_clk.clkr, 2762 + [PMIC_ARB1_H_CLK] = &pmic_arb1_h_clk.clkr, 2763 + [PMIC_SSBI2_CLK] = &pmic_ssbi2_clk.clkr, 2764 + [RPM_MSG_RAM_H_CLK] = &rpm_msg_ram_h_clk.clkr, 2765 + }; 2766 + 2767 + static const struct qcom_reset_map gcc_msm8960_resets[] = { 2768 + [SFAB_MSS_Q6_SW_RESET] = { 0x2040, 7 }, 2769 + [SFAB_MSS_Q6_FW_RESET] = { 0x2044, 7 }, 2770 + [QDSS_STM_RESET] = { 0x2060, 6 }, 2771 + [AFAB_SMPSS_S_RESET] = { 0x20b8, 2 }, 2772 + [AFAB_SMPSS_M1_RESET] = { 0x20b8, 1 }, 2773 + [AFAB_SMPSS_M0_RESET] = { 0x20b8 }, 2774 + [AFAB_EBI1_CH0_RESET] = { 0x20c0, 7 }, 2775 + [AFAB_EBI1_CH1_RESET] = { 0x20c4, 7}, 2776 + [SFAB_ADM0_M0_RESET] = { 0x21e0, 7 }, 2777 + [SFAB_ADM0_M1_RESET] = { 0x21e4, 7 }, 2778 + [SFAB_ADM0_M2_RESET] = { 0x21e8, 7 }, 2779 + [ADM0_C2_RESET] = { 0x220c, 4}, 2780 + [ADM0_C1_RESET] = { 0x220c, 3}, 2781 + [ADM0_C0_RESET] = { 0x220c, 2}, 2782 + [ADM0_PBUS_RESET] = { 0x220c, 1 }, 2783 + [ADM0_RESET] = { 0x220c }, 2784 + [QDSS_CLKS_SW_RESET] = { 0x2260, 5 }, 2785 + [QDSS_POR_RESET] = { 0x2260, 4 }, 2786 + [QDSS_TSCTR_RESET] = { 0x2260, 3 }, 2787 + [QDSS_HRESET_RESET] = { 0x2260, 2 }, 2788 + [QDSS_AXI_RESET] = { 0x2260, 1 }, 2789 + [QDSS_DBG_RESET] = { 0x2260 }, 2790 + [PCIE_A_RESET] = { 0x22c0, 7 }, 2791 + [PCIE_AUX_RESET] = { 0x22c8, 7 }, 2792 + [PCIE_H_RESET] = { 0x22d0, 7 }, 2793 + [SFAB_PCIE_M_RESET] = { 0x22d4, 1 }, 2794 + [SFAB_PCIE_S_RESET] = { 0x22d4 }, 2795 + [SFAB_MSS_M_RESET] = { 0x2340, 7 }, 2796 + [SFAB_USB3_M_RESET] = { 0x2360, 7 }, 2797 + [SFAB_RIVA_M_RESET] = { 0x2380, 7 }, 2798 + [SFAB_LPASS_RESET] = { 0x23a0, 7 }, 2799 + [SFAB_AFAB_M_RESET] = { 0x23e0, 7 }, 2800 + [AFAB_SFAB_M0_RESET] = { 0x2420, 7 }, 2801 + [AFAB_SFAB_M1_RESET] = { 0x2424, 7 }, 2802 + [SFAB_SATA_S_RESET] = { 0x2480, 7 }, 2803 + [SFAB_DFAB_M_RESET] = { 0x2500, 7 }, 2804 + [DFAB_SFAB_M_RESET] = { 0x2520, 7 }, 2805 + [DFAB_SWAY0_RESET] = { 0x2540, 7 }, 2806 + [DFAB_SWAY1_RESET] = { 0x2544, 7 }, 2807 + [DFAB_ARB0_RESET] = { 0x2560, 7 }, 2808 + [DFAB_ARB1_RESET] = { 0x2564, 7 }, 2809 + [PPSS_PROC_RESET] = { 0x2594, 1 }, 2810 + [PPSS_RESET] = { 0x2594}, 2811 + [DMA_BAM_RESET] = { 0x25c0, 7 }, 2812 + [SIC_TIC_RESET] = { 0x2600, 7 }, 2813 + [SLIMBUS_H_RESET] = { 0x2620, 7 }, 2814 + [SFAB_CFPB_M_RESET] = { 0x2680, 7 }, 2815 + [SFAB_CFPB_S_RESET] = { 0x26c0, 7 }, 2816 + [TSIF_H_RESET] = { 0x2700, 7 }, 2817 + [CE1_H_RESET] = { 0x2720, 7 }, 2818 + [CE1_CORE_RESET] = { 0x2724, 7 }, 2819 + [CE1_SLEEP_RESET] = { 0x2728, 7 }, 2820 + [CE2_H_RESET] = { 0x2740, 7 }, 2821 + [CE2_CORE_RESET] = { 0x2744, 7 }, 2822 + [SFAB_SFPB_M_RESET] = { 0x2780, 7 }, 2823 + [SFAB_SFPB_S_RESET] = { 0x27a0, 7 }, 2824 + [RPM_PROC_RESET] = { 0x27c0, 7 }, 2825 + [PMIC_SSBI2_RESET] = { 0x270c, 12 }, 2826 + [SDC1_RESET] = { 0x2830 }, 2827 + [SDC2_RESET] = { 0x2850 }, 2828 + [SDC3_RESET] = { 0x2870 }, 2829 + [SDC4_RESET] = { 0x2890 }, 2830 + [SDC5_RESET] = { 0x28b0 }, 2831 + [DFAB_A2_RESET] = { 0x28c0, 7 }, 2832 + [USB_HS1_RESET] = { 0x2910 }, 2833 + [USB_HSIC_RESET] = { 0x2934 }, 2834 + [USB_FS1_XCVR_RESET] = { 0x2974, 1 }, 2835 + [USB_FS1_RESET] = { 0x2974 }, 2836 + [USB_FS2_XCVR_RESET] = { 0x2994, 1 }, 2837 + [USB_FS2_RESET] = { 0x2994 }, 2838 + [GSBI1_RESET] = { 0x29dc }, 2839 + [GSBI2_RESET] = { 0x29fc }, 2840 + [GSBI3_RESET] = { 0x2a1c }, 2841 + [GSBI4_RESET] = { 0x2a3c }, 2842 + [GSBI5_RESET] = { 0x2a5c }, 2843 + [GSBI6_RESET] = { 0x2a7c }, 2844 + [GSBI7_RESET] = { 0x2a9c }, 2845 + [GSBI8_RESET] = { 0x2abc }, 2846 + [GSBI9_RESET] = { 0x2adc }, 2847 + [GSBI10_RESET] = { 0x2afc }, 2848 + [GSBI11_RESET] = { 0x2b1c }, 2849 + [GSBI12_RESET] = { 0x2b3c }, 2850 + [SPDM_RESET] = { 0x2b6c }, 2851 + [TLMM_H_RESET] = { 0x2ba0, 7 }, 2852 + [SFAB_MSS_S_RESET] = { 0x2c00, 7 }, 2853 + [MSS_SLP_RESET] = { 0x2c60, 7 }, 2854 + [MSS_Q6SW_JTAG_RESET] = { 0x2c68, 7 }, 2855 + [MSS_Q6FW_JTAG_RESET] = { 0x2c6c, 7 }, 2856 + [MSS_RESET] = { 0x2c64 }, 2857 + [SATA_H_RESET] = { 0x2c80, 7 }, 2858 + [SATA_RXOOB_RESE] = { 0x2c8c, 7 }, 2859 + [SATA_PMALIVE_RESET] = { 0x2c90, 7 }, 2860 + [SATA_SFAB_M_RESET] = { 0x2c98, 7 }, 2861 + [TSSC_RESET] = { 0x2ca0, 7 }, 2862 + [PDM_RESET] = { 0x2cc0, 12 }, 2863 + [MPM_H_RESET] = { 0x2da0, 7 }, 2864 + [MPM_RESET] = { 0x2da4 }, 2865 + [SFAB_SMPSS_S_RESET] = { 0x2e00, 7 }, 2866 + [PRNG_RESET] = { 0x2e80, 12 }, 2867 + [RIVA_RESET] = { 0x35e0 }, 2868 + }; 2869 + 2870 + static const struct regmap_config gcc_msm8960_regmap_config = { 2871 + .reg_bits = 32, 2872 + .reg_stride = 4, 2873 + .val_bits = 32, 2874 + .max_register = 0x3660, 2875 + .fast_io = true, 2876 + }; 2877 + 2878 + static const struct of_device_id gcc_msm8960_match_table[] = { 2879 + { .compatible = "qcom,gcc-msm8960" }, 2880 + { } 2881 + }; 2882 + MODULE_DEVICE_TABLE(of, gcc_msm8960_match_table); 2883 + 2884 + struct qcom_cc { 2885 + struct qcom_reset_controller reset; 2886 + struct clk_onecell_data data; 2887 + struct clk *clks[]; 2888 + }; 2889 + 2890 + static int gcc_msm8960_probe(struct platform_device *pdev) 2891 + { 2892 + void __iomem *base; 2893 + struct resource *res; 2894 + int i, ret; 2895 + struct device *dev = &pdev->dev; 2896 + struct clk *clk; 2897 + struct clk_onecell_data *data; 2898 + struct clk **clks; 2899 + struct regmap *regmap; 2900 + size_t num_clks; 2901 + struct qcom_reset_controller *reset; 2902 + struct qcom_cc *cc; 2903 + 2904 + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 2905 + base = devm_ioremap_resource(dev, res); 2906 + if (IS_ERR(base)) 2907 + return PTR_ERR(base); 2908 + 2909 + regmap = devm_regmap_init_mmio(dev, base, &gcc_msm8960_regmap_config); 2910 + if (IS_ERR(regmap)) 2911 + return PTR_ERR(regmap); 2912 + 2913 + num_clks = ARRAY_SIZE(gcc_msm8960_clks); 2914 + cc = devm_kzalloc(dev, sizeof(*cc) + sizeof(*clks) * num_clks, 2915 + GFP_KERNEL); 2916 + if (!cc) 2917 + return -ENOMEM; 2918 + 2919 + clks = cc->clks; 2920 + data = &cc->data; 2921 + data->clks = clks; 2922 + data->clk_num = num_clks; 2923 + 2924 + /* Temporary until RPM clocks supported */ 2925 + clk = clk_register_fixed_rate(dev, "cxo", NULL, CLK_IS_ROOT, 19200000); 2926 + if (IS_ERR(clk)) 2927 + return PTR_ERR(clk); 2928 + 2929 + clk = clk_register_fixed_rate(dev, "pxo", NULL, CLK_IS_ROOT, 27000000); 2930 + if (IS_ERR(clk)) 2931 + return PTR_ERR(clk); 2932 + 2933 + for (i = 0; i < num_clks; i++) { 2934 + if (!gcc_msm8960_clks[i]) 2935 + continue; 2936 + clk = devm_clk_register_regmap(dev, gcc_msm8960_clks[i]); 2937 + if (IS_ERR(clk)) 2938 + return PTR_ERR(clk); 2939 + clks[i] = clk; 2940 + } 2941 + 2942 + ret = of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, data); 2943 + if (ret) 2944 + return ret; 2945 + 2946 + reset = &cc->reset; 2947 + reset->rcdev.of_node = dev->of_node; 2948 + reset->rcdev.ops = &qcom_reset_ops, 2949 + reset->rcdev.owner = THIS_MODULE, 2950 + reset->rcdev.nr_resets = ARRAY_SIZE(gcc_msm8960_resets), 2951 + reset->regmap = regmap; 2952 + reset->reset_map = gcc_msm8960_resets, 2953 + platform_set_drvdata(pdev, &reset->rcdev); 2954 + 2955 + ret = reset_controller_register(&reset->rcdev); 2956 + if (ret) 2957 + of_clk_del_provider(dev->of_node); 2958 + 2959 + return ret; 2960 + } 2961 + 2962 + static int gcc_msm8960_remove(struct platform_device *pdev) 2963 + { 2964 + of_clk_del_provider(pdev->dev.of_node); 2965 + reset_controller_unregister(platform_get_drvdata(pdev)); 2966 + return 0; 2967 + } 2968 + 2969 + static struct platform_driver gcc_msm8960_driver = { 2970 + .probe = gcc_msm8960_probe, 2971 + .remove = gcc_msm8960_remove, 2972 + .driver = { 2973 + .name = "gcc-msm8960", 2974 + .owner = THIS_MODULE, 2975 + .of_match_table = gcc_msm8960_match_table, 2976 + }, 2977 + }; 2978 + 2979 + static int __init gcc_msm8960_init(void) 2980 + { 2981 + return platform_driver_register(&gcc_msm8960_driver); 2982 + } 2983 + core_initcall(gcc_msm8960_init); 2984 + 2985 + static void __exit gcc_msm8960_exit(void) 2986 + { 2987 + platform_driver_unregister(&gcc_msm8960_driver); 2988 + } 2989 + module_exit(gcc_msm8960_exit); 2990 + 2991 + MODULE_DESCRIPTION("QCOM GCC MSM8960 Driver"); 2992 + MODULE_LICENSE("GPL v2"); 2993 + MODULE_ALIAS("platform:gcc-msm8960");
+313
include/dt-bindings/clock/qcom,gcc-msm8960.h
··· 1 + /* 2 + * Copyright (c) 2013, The Linux Foundation. All rights reserved. 3 + * 4 + * This software is licensed under the terms of the GNU General Public 5 + * License version 2, as published by the Free Software Foundation, and 6 + * may be copied, distributed, and modified under those terms. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + */ 13 + 14 + #ifndef _DT_BINDINGS_CLK_MSM_GCC_8960_H 15 + #define _DT_BINDINGS_CLK_MSM_GCC_8960_H 16 + 17 + #define AFAB_CLK_SRC 0 18 + #define AFAB_CORE_CLK 1 19 + #define SFAB_MSS_Q6_SW_A_CLK 2 20 + #define SFAB_MSS_Q6_FW_A_CLK 3 21 + #define QDSS_STM_CLK 4 22 + #define SCSS_A_CLK 5 23 + #define SCSS_H_CLK 6 24 + #define SCSS_XO_SRC_CLK 7 25 + #define AFAB_EBI1_CH0_A_CLK 8 26 + #define AFAB_EBI1_CH1_A_CLK 9 27 + #define AFAB_AXI_S0_FCLK 10 28 + #define AFAB_AXI_S1_FCLK 11 29 + #define AFAB_AXI_S2_FCLK 12 30 + #define AFAB_AXI_S3_FCLK 13 31 + #define AFAB_AXI_S4_FCLK 14 32 + #define SFAB_CORE_CLK 15 33 + #define SFAB_AXI_S0_FCLK 16 34 + #define SFAB_AXI_S1_FCLK 17 35 + #define SFAB_AXI_S2_FCLK 18 36 + #define SFAB_AXI_S3_FCLK 19 37 + #define SFAB_AXI_S4_FCLK 20 38 + #define SFAB_AHB_S0_FCLK 21 39 + #define SFAB_AHB_S1_FCLK 22 40 + #define SFAB_AHB_S2_FCLK 23 41 + #define SFAB_AHB_S3_FCLK 24 42 + #define SFAB_AHB_S4_FCLK 25 43 + #define SFAB_AHB_S5_FCLK 26 44 + #define SFAB_AHB_S6_FCLK 27 45 + #define SFAB_AHB_S7_FCLK 28 46 + #define QDSS_AT_CLK_SRC 29 47 + #define QDSS_AT_CLK 30 48 + #define QDSS_TRACECLKIN_CLK_SRC 31 49 + #define QDSS_TRACECLKIN_CLK 32 50 + #define QDSS_TSCTR_CLK_SRC 33 51 + #define QDSS_TSCTR_CLK 34 52 + #define SFAB_ADM0_M0_A_CLK 35 53 + #define SFAB_ADM0_M1_A_CLK 36 54 + #define SFAB_ADM0_M2_A_CLK 37 55 + #define ADM0_CLK 38 56 + #define ADM0_PBUS_CLK 39 57 + #define MSS_XPU_CLK 40 58 + #define IMEM0_A_CLK 41 59 + #define QDSS_H_CLK 42 60 + #define PCIE_A_CLK 43 61 + #define PCIE_AUX_CLK 44 62 + #define PCIE_PHY_REF_CLK 45 63 + #define PCIE_H_CLK 46 64 + #define SFAB_CLK_SRC 47 65 + #define MAHB0_CLK 48 66 + #define Q6SW_CLK_SRC 49 67 + #define Q6SW_CLK 50 68 + #define Q6FW_CLK_SRC 51 69 + #define Q6FW_CLK 52 70 + #define SFAB_MSS_M_A_CLK 53 71 + #define SFAB_USB3_M_A_CLK 54 72 + #define SFAB_LPASS_Q6_A_CLK 55 73 + #define SFAB_AFAB_M_A_CLK 56 74 + #define AFAB_SFAB_M0_A_CLK 57 75 + #define AFAB_SFAB_M1_A_CLK 58 76 + #define SFAB_SATA_S_H_CLK 59 77 + #define DFAB_CLK_SRC 60 78 + #define DFAB_CLK 61 79 + #define SFAB_DFAB_M_A_CLK 62 80 + #define DFAB_SFAB_M_A_CLK 63 81 + #define DFAB_SWAY0_H_CLK 64 82 + #define DFAB_SWAY1_H_CLK 65 83 + #define DFAB_ARB0_H_CLK 66 84 + #define DFAB_ARB1_H_CLK 67 85 + #define PPSS_H_CLK 68 86 + #define PPSS_PROC_CLK 69 87 + #define PPSS_TIMER0_CLK 70 88 + #define PPSS_TIMER1_CLK 71 89 + #define PMEM_A_CLK 72 90 + #define DMA_BAM_H_CLK 73 91 + #define SIC_H_CLK 74 92 + #define SPS_TIC_H_CLK 75 93 + #define SLIMBUS_H_CLK 76 94 + #define SLIMBUS_XO_SRC_CLK 77 95 + #define CFPB_2X_CLK_SRC 78 96 + #define CFPB_CLK 79 97 + #define CFPB0_H_CLK 80 98 + #define CFPB1_H_CLK 81 99 + #define CFPB2_H_CLK 82 100 + #define SFAB_CFPB_M_H_CLK 83 101 + #define CFPB_MASTER_H_CLK 84 102 + #define SFAB_CFPB_S_HCLK 85 103 + #define CFPB_SPLITTER_H_CLK 86 104 + #define TSIF_H_CLK 87 105 + #define TSIF_INACTIVITY_TIMERS_CLK 88 106 + #define TSIF_REF_SRC 89 107 + #define TSIF_REF_CLK 90 108 + #define CE1_H_CLK 91 109 + #define CE1_CORE_CLK 92 110 + #define CE1_SLEEP_CLK 93 111 + #define CE2_H_CLK 94 112 + #define CE2_CORE_CLK 95 113 + #define CE2_SLEEP_CLK 96 114 + #define SFPB_H_CLK_SRC 97 115 + #define SFPB_H_CLK 98 116 + #define SFAB_SFPB_M_H_CLK 99 117 + #define SFAB_SFPB_S_H_CLK 100 118 + #define RPM_PROC_CLK 101 119 + #define RPM_BUS_H_CLK 102 120 + #define RPM_SLEEP_CLK 103 121 + #define RPM_TIMER_CLK 104 122 + #define RPM_MSG_RAM_H_CLK 105 123 + #define PMIC_ARB0_H_CLK 106 124 + #define PMIC_ARB1_H_CLK 107 125 + #define PMIC_SSBI2_SRC 108 126 + #define PMIC_SSBI2_CLK 109 127 + #define SDC1_H_CLK 110 128 + #define SDC2_H_CLK 111 129 + #define SDC3_H_CLK 112 130 + #define SDC4_H_CLK 113 131 + #define SDC5_H_CLK 114 132 + #define SDC1_SRC 115 133 + #define SDC2_SRC 116 134 + #define SDC3_SRC 117 135 + #define SDC4_SRC 118 136 + #define SDC5_SRC 119 137 + #define SDC1_CLK 120 138 + #define SDC2_CLK 121 139 + #define SDC3_CLK 122 140 + #define SDC4_CLK 123 141 + #define SDC5_CLK 124 142 + #define DFAB_A2_H_CLK 125 143 + #define USB_HS1_H_CLK 126 144 + #define USB_HS1_XCVR_SRC 127 145 + #define USB_HS1_XCVR_CLK 128 146 + #define USB_HSIC_H_CLK 129 147 + #define USB_HSIC_XCVR_FS_SRC 130 148 + #define USB_HSIC_XCVR_FS_CLK 131 149 + #define USB_HSIC_SYSTEM_CLK_SRC 132 150 + #define USB_HSIC_SYSTEM_CLK 133 151 + #define CFPB0_C0_H_CLK 134 152 + #define CFPB0_C1_H_CLK 135 153 + #define CFPB0_D0_H_CLK 136 154 + #define CFPB0_D1_H_CLK 137 155 + #define USB_FS1_H_CLK 138 156 + #define USB_FS1_XCVR_FS_SRC 139 157 + #define USB_FS1_XCVR_FS_CLK 140 158 + #define USB_FS1_SYSTEM_CLK 141 159 + #define USB_FS2_H_CLK 142 160 + #define USB_FS2_XCVR_FS_SRC 143 161 + #define USB_FS2_XCVR_FS_CLK 144 162 + #define USB_FS2_SYSTEM_CLK 145 163 + #define GSBI_COMMON_SIM_SRC 146 164 + #define GSBI1_H_CLK 147 165 + #define GSBI2_H_CLK 148 166 + #define GSBI3_H_CLK 149 167 + #define GSBI4_H_CLK 150 168 + #define GSBI5_H_CLK 151 169 + #define GSBI6_H_CLK 152 170 + #define GSBI7_H_CLK 153 171 + #define GSBI8_H_CLK 154 172 + #define GSBI9_H_CLK 155 173 + #define GSBI10_H_CLK 156 174 + #define GSBI11_H_CLK 157 175 + #define GSBI12_H_CLK 158 176 + #define GSBI1_UART_SRC 159 177 + #define GSBI1_UART_CLK 160 178 + #define GSBI2_UART_SRC 161 179 + #define GSBI2_UART_CLK 162 180 + #define GSBI3_UART_SRC 163 181 + #define GSBI3_UART_CLK 164 182 + #define GSBI4_UART_SRC 165 183 + #define GSBI4_UART_CLK 166 184 + #define GSBI5_UART_SRC 167 185 + #define GSBI5_UART_CLK 168 186 + #define GSBI6_UART_SRC 169 187 + #define GSBI6_UART_CLK 170 188 + #define GSBI7_UART_SRC 171 189 + #define GSBI7_UART_CLK 172 190 + #define GSBI8_UART_SRC 173 191 + #define GSBI8_UART_CLK 174 192 + #define GSBI9_UART_SRC 175 193 + #define GSBI9_UART_CLK 176 194 + #define GSBI10_UART_SRC 177 195 + #define GSBI10_UART_CLK 178 196 + #define GSBI11_UART_SRC 179 197 + #define GSBI11_UART_CLK 180 198 + #define GSBI12_UART_SRC 181 199 + #define GSBI12_UART_CLK 182 200 + #define GSBI1_QUP_SRC 183 201 + #define GSBI1_QUP_CLK 184 202 + #define GSBI2_QUP_SRC 185 203 + #define GSBI2_QUP_CLK 186 204 + #define GSBI3_QUP_SRC 187 205 + #define GSBI3_QUP_CLK 188 206 + #define GSBI4_QUP_SRC 189 207 + #define GSBI4_QUP_CLK 190 208 + #define GSBI5_QUP_SRC 191 209 + #define GSBI5_QUP_CLK 192 210 + #define GSBI6_QUP_SRC 193 211 + #define GSBI6_QUP_CLK 194 212 + #define GSBI7_QUP_SRC 195 213 + #define GSBI7_QUP_CLK 196 214 + #define GSBI8_QUP_SRC 197 215 + #define GSBI8_QUP_CLK 198 216 + #define GSBI9_QUP_SRC 199 217 + #define GSBI9_QUP_CLK 200 218 + #define GSBI10_QUP_SRC 201 219 + #define GSBI10_QUP_CLK 202 220 + #define GSBI11_QUP_SRC 203 221 + #define GSBI11_QUP_CLK 204 222 + #define GSBI12_QUP_SRC 205 223 + #define GSBI12_QUP_CLK 206 224 + #define GSBI1_SIM_CLK 207 225 + #define GSBI2_SIM_CLK 208 226 + #define GSBI3_SIM_CLK 209 227 + #define GSBI4_SIM_CLK 210 228 + #define GSBI5_SIM_CLK 211 229 + #define GSBI6_SIM_CLK 212 230 + #define GSBI7_SIM_CLK 213 231 + #define GSBI8_SIM_CLK 214 232 + #define GSBI9_SIM_CLK 215 233 + #define GSBI10_SIM_CLK 216 234 + #define GSBI11_SIM_CLK 217 235 + #define GSBI12_SIM_CLK 218 236 + #define USB_HSIC_HSIC_CLK_SRC 219 237 + #define USB_HSIC_HSIC_CLK 220 238 + #define USB_HSIC_HSIO_CAL_CLK 221 239 + #define SPDM_CFG_H_CLK 222 240 + #define SPDM_MSTR_H_CLK 223 241 + #define SPDM_FF_CLK_SRC 224 242 + #define SPDM_FF_CLK 225 243 + #define SEC_CTRL_CLK 226 244 + #define SEC_CTRL_ACC_CLK_SRC 227 245 + #define SEC_CTRL_ACC_CLK 228 246 + #define TLMM_H_CLK 229 247 + #define TLMM_CLK 230 248 + #define SFAB_MSS_S_H_CLK 231 249 + #define MSS_SLP_CLK 232 250 + #define MSS_Q6SW_JTAG_CLK 233 251 + #define MSS_Q6FW_JTAG_CLK 234 252 + #define MSS_S_H_CLK 235 253 + #define MSS_CXO_SRC_CLK 236 254 + #define SATA_H_CLK 237 255 + #define SATA_SRC_CLK 238 256 + #define SATA_RXOOB_CLK 239 257 + #define SATA_PMALIVE_CLK 240 258 + #define SATA_PHY_REF_CLK 241 259 + #define TSSC_CLK_SRC 242 260 + #define TSSC_CLK 243 261 + #define PDM_SRC 244 262 + #define PDM_CLK 245 263 + #define GP0_SRC 246 264 + #define GP0_CLK 247 265 + #define GP1_SRC 248 266 + #define GP1_CLK 249 267 + #define GP2_SRC 250 268 + #define GP2_CLK 251 269 + #define MPM_CLK 252 270 + #define EBI1_CLK_SRC 253 271 + #define EBI1_CH0_CLK 254 272 + #define EBI1_CH1_CLK 255 273 + #define EBI1_2X_CLK 256 274 + #define EBI1_CH0_DQ_CLK 257 275 + #define EBI1_CH1_DQ_CLK 258 276 + #define EBI1_CH0_CA_CLK 259 277 + #define EBI1_CH1_CA_CLK 260 278 + #define EBI1_XO_CLK 261 279 + #define SFAB_SMPSS_S_H_CLK 262 280 + #define PRNG_SRC 263 281 + #define PRNG_CLK 264 282 + #define PXO_SRC 265 283 + #define LPASS_CXO_CLK 266 284 + #define LPASS_PXO_CLK 267 285 + #define SPDM_CY_PORT0_CLK 268 286 + #define SPDM_CY_PORT1_CLK 269 287 + #define SPDM_CY_PORT2_CLK 270 288 + #define SPDM_CY_PORT3_CLK 271 289 + #define SPDM_CY_PORT4_CLK 272 290 + #define SPDM_CY_PORT5_CLK 273 291 + #define SPDM_CY_PORT6_CLK 274 292 + #define SPDM_CY_PORT7_CLK 275 293 + #define PLL0 276 294 + #define PLL0_VOTE 277 295 + #define PLL3 278 296 + #define PLL3_VOTE 279 297 + #define PLL4_VOTE 280 298 + #define PLL5 281 299 + #define PLL5_VOTE 282 300 + #define PLL6 283 301 + #define PLL6_VOTE 284 302 + #define PLL7_VOTE 285 303 + #define PLL8 286 304 + #define PLL8_VOTE 287 305 + #define PLL9 288 306 + #define PLL10 289 307 + #define PLL11 290 308 + #define PLL12 291 309 + #define PLL13 292 310 + #define PLL14 293 311 + #define PLL14_VOTE 294 312 + 313 + #endif
+118
include/dt-bindings/reset/qcom,gcc-msm8960.h
··· 1 + /* 2 + * Copyright (c) 2013, The Linux Foundation. All rights reserved. 3 + * 4 + * This software is licensed under the terms of the GNU General Public 5 + * License version 2, as published by the Free Software Foundation, and 6 + * may be copied, distributed, and modified under those terms. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + */ 13 + 14 + #ifndef _DT_BINDINGS_RESET_MSM_GCC_8960_H 15 + #define _DT_BINDINGS_RESET_MSM_GCC_8960_H 16 + 17 + #define SFAB_MSS_Q6_SW_RESET 0 18 + #define SFAB_MSS_Q6_FW_RESET 1 19 + #define QDSS_STM_RESET 2 20 + #define AFAB_SMPSS_S_RESET 3 21 + #define AFAB_SMPSS_M1_RESET 4 22 + #define AFAB_SMPSS_M0_RESET 5 23 + #define AFAB_EBI1_CH0_RESET 6 24 + #define AFAB_EBI1_CH1_RESET 7 25 + #define SFAB_ADM0_M0_RESET 8 26 + #define SFAB_ADM0_M1_RESET 9 27 + #define SFAB_ADM0_M2_RESET 10 28 + #define ADM0_C2_RESET 11 29 + #define ADM0_C1_RESET 12 30 + #define ADM0_C0_RESET 13 31 + #define ADM0_PBUS_RESET 14 32 + #define ADM0_RESET 15 33 + #define QDSS_CLKS_SW_RESET 16 34 + #define QDSS_POR_RESET 17 35 + #define QDSS_TSCTR_RESET 18 36 + #define QDSS_HRESET_RESET 19 37 + #define QDSS_AXI_RESET 20 38 + #define QDSS_DBG_RESET 21 39 + #define PCIE_A_RESET 22 40 + #define PCIE_AUX_RESET 23 41 + #define PCIE_H_RESET 24 42 + #define SFAB_PCIE_M_RESET 25 43 + #define SFAB_PCIE_S_RESET 26 44 + #define SFAB_MSS_M_RESET 27 45 + #define SFAB_USB3_M_RESET 28 46 + #define SFAB_RIVA_M_RESET 29 47 + #define SFAB_LPASS_RESET 30 48 + #define SFAB_AFAB_M_RESET 31 49 + #define AFAB_SFAB_M0_RESET 32 50 + #define AFAB_SFAB_M1_RESET 33 51 + #define SFAB_SATA_S_RESET 34 52 + #define SFAB_DFAB_M_RESET 35 53 + #define DFAB_SFAB_M_RESET 36 54 + #define DFAB_SWAY0_RESET 37 55 + #define DFAB_SWAY1_RESET 38 56 + #define DFAB_ARB0_RESET 39 57 + #define DFAB_ARB1_RESET 40 58 + #define PPSS_PROC_RESET 41 59 + #define PPSS_RESET 42 60 + #define DMA_BAM_RESET 43 61 + #define SIC_TIC_RESET 44 62 + #define SLIMBUS_H_RESET 45 63 + #define SFAB_CFPB_M_RESET 46 64 + #define SFAB_CFPB_S_RESET 47 65 + #define TSIF_H_RESET 48 66 + #define CE1_H_RESET 49 67 + #define CE1_CORE_RESET 50 68 + #define CE1_SLEEP_RESET 51 69 + #define CE2_H_RESET 52 70 + #define CE2_CORE_RESET 53 71 + #define SFAB_SFPB_M_RESET 54 72 + #define SFAB_SFPB_S_RESET 55 73 + #define RPM_PROC_RESET 56 74 + #define PMIC_SSBI2_RESET 57 75 + #define SDC1_RESET 58 76 + #define SDC2_RESET 59 77 + #define SDC3_RESET 60 78 + #define SDC4_RESET 61 79 + #define SDC5_RESET 62 80 + #define DFAB_A2_RESET 63 81 + #define USB_HS1_RESET 64 82 + #define USB_HSIC_RESET 65 83 + #define USB_FS1_XCVR_RESET 66 84 + #define USB_FS1_RESET 67 85 + #define USB_FS2_XCVR_RESET 68 86 + #define USB_FS2_RESET 69 87 + #define GSBI1_RESET 70 88 + #define GSBI2_RESET 71 89 + #define GSBI3_RESET 72 90 + #define GSBI4_RESET 73 91 + #define GSBI5_RESET 74 92 + #define GSBI6_RESET 75 93 + #define GSBI7_RESET 76 94 + #define GSBI8_RESET 77 95 + #define GSBI9_RESET 78 96 + #define GSBI10_RESET 79 97 + #define GSBI11_RESET 80 98 + #define GSBI12_RESET 81 99 + #define SPDM_RESET 82 100 + #define TLMM_H_RESET 83 101 + #define SFAB_MSS_S_RESET 84 102 + #define MSS_SLP_RESET 85 103 + #define MSS_Q6SW_JTAG_RESET 86 104 + #define MSS_Q6FW_JTAG_RESET 87 105 + #define MSS_RESET 88 106 + #define SATA_H_RESET 89 107 + #define SATA_RXOOB_RESE 90 108 + #define SATA_PMALIVE_RESET 91 109 + #define SATA_SFAB_M_RESET 92 110 + #define TSSC_RESET 93 111 + #define PDM_RESET 94 112 + #define MPM_H_RESET 95 113 + #define MPM_RESET 96 114 + #define SFAB_SMPSS_S_RESET 97 115 + #define PRNG_RESET 98 116 + #define RIVA_RESET 99 117 + 118 + #endif