Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
   4 * Copyright (c) BayLibre, SAS.
   5 * Author : Neil Armstrong <narmstrong@baylibre.com>
   6 */
   7
   8#include <linux/kernel.h>
   9#include <linux/bitops.h>
  10#include <linux/err.h>
  11#include <linux/platform_device.h>
  12#include <linux/module.h>
  13#include <linux/of.h>
  14#include <linux/clk-provider.h>
  15#include <linux/regmap.h>
  16#include <linux/reset-controller.h>
  17
  18#include <dt-bindings/clock/qcom,gcc-mdm9615.h>
  19#include <dt-bindings/reset/qcom,gcc-mdm9615.h>
  20
  21#include "common.h"
  22#include "clk-regmap.h"
  23#include "clk-pll.h"
  24#include "clk-rcg.h"
  25#include "clk-branch.h"
  26#include "reset.h"
  27
  28enum {
  29	DT_CXO,
  30	DT_PLL4,
  31};
  32
  33enum {
  34	P_CXO,
  35	P_PLL8,
  36	P_PLL14,
  37};
  38
  39static const struct parent_map gcc_cxo_map[] = {
  40	{ P_CXO, 0 },
  41};
  42
  43static const struct clk_parent_data gcc_cxo[] = {
  44	{ .index = DT_CXO, .name = "cxo_board" },
  45};
  46
  47static struct clk_pll pll0 = {
  48	.l_reg = 0x30c4,
  49	.m_reg = 0x30c8,
  50	.n_reg = 0x30cc,
  51	.config_reg = 0x30d4,
  52	.mode_reg = 0x30c0,
  53	.status_reg = 0x30d8,
  54	.status_bit = 16,
  55	.clkr.hw.init = &(struct clk_init_data){
  56		.name = "pll0",
  57		.parent_data = gcc_cxo,
  58		.num_parents = ARRAY_SIZE(gcc_cxo),
  59		.ops = &clk_pll_ops,
  60	},
  61};
  62
  63static struct clk_regmap pll0_vote = {
  64	.enable_reg = 0x34c0,
  65	.enable_mask = BIT(0),
  66	.hw.init = &(struct clk_init_data){
  67		.name = "pll0_vote",
  68		.parent_hws = (const struct clk_hw*[]) {
  69			&pll0.clkr.hw,
  70		},
  71		.num_parents = 1,
  72		.ops = &clk_pll_vote_ops,
  73	},
  74};
  75
  76static struct clk_regmap pll4_vote = {
  77	.enable_reg = 0x34c0,
  78	.enable_mask = BIT(4),
  79	.hw.init = &(struct clk_init_data){
  80		.name = "pll4_vote",
  81		.parent_data = &(const struct clk_parent_data) {
  82			.index = DT_PLL4, .name = "pll4",
  83		},
  84		.num_parents = 1,
  85		.ops = &clk_pll_vote_ops,
  86	},
  87};
  88
  89static struct clk_pll pll8 = {
  90	.l_reg = 0x3144,
  91	.m_reg = 0x3148,
  92	.n_reg = 0x314c,
  93	.config_reg = 0x3154,
  94	.mode_reg = 0x3140,
  95	.status_reg = 0x3158,
  96	.status_bit = 16,
  97	.clkr.hw.init = &(struct clk_init_data){
  98		.name = "pll8",
  99		.parent_data = gcc_cxo,
 100		.num_parents = ARRAY_SIZE(gcc_cxo),
 101		.ops = &clk_pll_ops,
 102	},
 103};
 104
 105static struct clk_regmap pll8_vote = {
 106	.enable_reg = 0x34c0,
 107	.enable_mask = BIT(8),
 108	.hw.init = &(struct clk_init_data){
 109		.name = "pll8_vote",
 110		.parent_hws = (const struct clk_hw*[]) {
 111			&pll8.clkr.hw,
 112		},
 113		.num_parents = 1,
 114		.ops = &clk_pll_vote_ops,
 115	},
 116};
 117
 118static struct clk_pll pll14 = {
 119	.l_reg = 0x31c4,
 120	.m_reg = 0x31c8,
 121	.n_reg = 0x31cc,
 122	.config_reg = 0x31d4,
 123	.mode_reg = 0x31c0,
 124	.status_reg = 0x31d8,
 125	.status_bit = 16,
 126	.clkr.hw.init = &(struct clk_init_data){
 127		.name = "pll14",
 128		.parent_data = gcc_cxo,
 129		.num_parents = ARRAY_SIZE(gcc_cxo),
 130		.ops = &clk_pll_ops,
 131	},
 132};
 133
 134static struct clk_regmap pll14_vote = {
 135	.enable_reg = 0x34c0,
 136	.enable_mask = BIT(11),
 137	.hw.init = &(struct clk_init_data){
 138		.name = "pll14_vote",
 139		.parent_hws = (const struct clk_hw*[]) {
 140			&pll14.clkr.hw,
 141		},
 142		.num_parents = 1,
 143		.ops = &clk_pll_vote_ops,
 144	},
 145};
 146
 147static const struct parent_map gcc_cxo_pll8_map[] = {
 148	{ P_CXO, 0 },
 149	{ P_PLL8, 3 }
 150};
 151
 152static const struct clk_parent_data gcc_cxo_pll8[] = {
 153	{ .index = DT_CXO, .name = "cxo_board" },
 154	{ .hw = &pll8_vote.hw },
 155};
 156
 157static const struct parent_map gcc_cxo_pll14_map[] = {
 158	{ P_CXO, 0 },
 159	{ P_PLL14, 4 }
 160};
 161
 162static const struct clk_parent_data gcc_cxo_pll14[] = {
 163	{ .index = DT_CXO, .name = "cxo_board" },
 164	{ .hw = &pll14_vote.hw },
 165};
 166
 167static struct freq_tbl clk_tbl_gsbi_uart[] = {
 168	{  1843200, P_PLL8, 2,  6, 625 },
 169	{  3686400, P_PLL8, 2, 12, 625 },
 170	{  7372800, P_PLL8, 2, 24, 625 },
 171	{ 14745600, P_PLL8, 2, 48, 625 },
 172	{ 16000000, P_PLL8, 4,  1,   6 },
 173	{ 24000000, P_PLL8, 4,  1,   4 },
 174	{ 32000000, P_PLL8, 4,  1,   3 },
 175	{ 40000000, P_PLL8, 1,  5,  48 },
 176	{ 46400000, P_PLL8, 1, 29, 240 },
 177	{ 48000000, P_PLL8, 4,  1,   2 },
 178	{ 51200000, P_PLL8, 1,  2,  15 },
 179	{ 56000000, P_PLL8, 1,  7,  48 },
 180	{ 58982400, P_PLL8, 1, 96, 625 },
 181	{ 64000000, P_PLL8, 2,  1,   3 },
 182	{ }
 183};
 184
 185static struct clk_rcg gsbi1_uart_src = {
 186	.ns_reg = 0x29d4,
 187	.md_reg = 0x29d0,
 188	.mn = {
 189		.mnctr_en_bit = 8,
 190		.mnctr_reset_bit = 7,
 191		.mnctr_mode_shift = 5,
 192		.n_val_shift = 16,
 193		.m_val_shift = 16,
 194		.width = 16,
 195	},
 196	.p = {
 197		.pre_div_shift = 3,
 198		.pre_div_width = 2,
 199	},
 200	.s = {
 201		.src_sel_shift = 0,
 202		.parent_map = gcc_cxo_pll8_map,
 203	},
 204	.freq_tbl = clk_tbl_gsbi_uart,
 205	.clkr = {
 206		.enable_reg = 0x29d4,
 207		.enable_mask = BIT(11),
 208		.hw.init = &(struct clk_init_data){
 209			.name = "gsbi1_uart_src",
 210			.parent_data = gcc_cxo_pll8,
 211			.num_parents = ARRAY_SIZE(gcc_cxo_pll8),
 212			.ops = &clk_rcg_ops,
 213			.flags = CLK_SET_PARENT_GATE,
 214		},
 215	},
 216};
 217
 218static struct clk_branch gsbi1_uart_clk = {
 219	.halt_reg = 0x2fcc,
 220	.halt_bit = 10,
 221	.clkr = {
 222		.enable_reg = 0x29d4,
 223		.enable_mask = BIT(9),
 224		.hw.init = &(struct clk_init_data){
 225			.name = "gsbi1_uart_clk",
 226			.parent_hws = (const struct clk_hw*[]) {
 227				&gsbi1_uart_src.clkr.hw,
 228			},
 229			.num_parents = 1,
 230			.ops = &clk_branch_ops,
 231			.flags = CLK_SET_RATE_PARENT,
 232		},
 233	},
 234};
 235
 236static struct clk_rcg gsbi2_uart_src = {
 237	.ns_reg = 0x29f4,
 238	.md_reg = 0x29f0,
 239	.mn = {
 240		.mnctr_en_bit = 8,
 241		.mnctr_reset_bit = 7,
 242		.mnctr_mode_shift = 5,
 243		.n_val_shift = 16,
 244		.m_val_shift = 16,
 245		.width = 16,
 246	},
 247	.p = {
 248		.pre_div_shift = 3,
 249		.pre_div_width = 2,
 250	},
 251	.s = {
 252		.src_sel_shift = 0,
 253		.parent_map = gcc_cxo_pll8_map,
 254	},
 255	.freq_tbl = clk_tbl_gsbi_uart,
 256	.clkr = {
 257		.enable_reg = 0x29f4,
 258		.enable_mask = BIT(11),
 259		.hw.init = &(struct clk_init_data){
 260			.name = "gsbi2_uart_src",
 261			.parent_data = gcc_cxo_pll8,
 262			.num_parents = ARRAY_SIZE(gcc_cxo_pll8),
 263			.ops = &clk_rcg_ops,
 264			.flags = CLK_SET_PARENT_GATE,
 265		},
 266	},
 267};
 268
 269static struct clk_branch gsbi2_uart_clk = {
 270	.halt_reg = 0x2fcc,
 271	.halt_bit = 6,
 272	.clkr = {
 273		.enable_reg = 0x29f4,
 274		.enable_mask = BIT(9),
 275		.hw.init = &(struct clk_init_data){
 276			.name = "gsbi2_uart_clk",
 277			.parent_hws = (const struct clk_hw*[]) {
 278				&gsbi2_uart_src.clkr.hw,
 279			},
 280			.num_parents = 1,
 281			.ops = &clk_branch_ops,
 282			.flags = CLK_SET_RATE_PARENT,
 283		},
 284	},
 285};
 286
 287static struct clk_rcg gsbi3_uart_src = {
 288	.ns_reg = 0x2a14,
 289	.md_reg = 0x2a10,
 290	.mn = {
 291		.mnctr_en_bit = 8,
 292		.mnctr_reset_bit = 7,
 293		.mnctr_mode_shift = 5,
 294		.n_val_shift = 16,
 295		.m_val_shift = 16,
 296		.width = 16,
 297	},
 298	.p = {
 299		.pre_div_shift = 3,
 300		.pre_div_width = 2,
 301	},
 302	.s = {
 303		.src_sel_shift = 0,
 304		.parent_map = gcc_cxo_pll8_map,
 305	},
 306	.freq_tbl = clk_tbl_gsbi_uart,
 307	.clkr = {
 308		.enable_reg = 0x2a14,
 309		.enable_mask = BIT(11),
 310		.hw.init = &(struct clk_init_data){
 311			.name = "gsbi3_uart_src",
 312			.parent_data = gcc_cxo_pll8,
 313			.num_parents = ARRAY_SIZE(gcc_cxo_pll8),
 314			.ops = &clk_rcg_ops,
 315			.flags = CLK_SET_PARENT_GATE,
 316		},
 317	},
 318};
 319
 320static struct clk_branch gsbi3_uart_clk = {
 321	.halt_reg = 0x2fcc,
 322	.halt_bit = 2,
 323	.clkr = {
 324		.enable_reg = 0x2a14,
 325		.enable_mask = BIT(9),
 326		.hw.init = &(struct clk_init_data){
 327			.name = "gsbi3_uart_clk",
 328			.parent_hws = (const struct clk_hw*[]) {
 329				&gsbi3_uart_src.clkr.hw,
 330			},
 331			.num_parents = 1,
 332			.ops = &clk_branch_ops,
 333			.flags = CLK_SET_RATE_PARENT,
 334		},
 335	},
 336};
 337
 338static struct clk_rcg gsbi4_uart_src = {
 339	.ns_reg = 0x2a34,
 340	.md_reg = 0x2a30,
 341	.mn = {
 342		.mnctr_en_bit = 8,
 343		.mnctr_reset_bit = 7,
 344		.mnctr_mode_shift = 5,
 345		.n_val_shift = 16,
 346		.m_val_shift = 16,
 347		.width = 16,
 348	},
 349	.p = {
 350		.pre_div_shift = 3,
 351		.pre_div_width = 2,
 352	},
 353	.s = {
 354		.src_sel_shift = 0,
 355		.parent_map = gcc_cxo_pll8_map,
 356	},
 357	.freq_tbl = clk_tbl_gsbi_uart,
 358	.clkr = {
 359		.enable_reg = 0x2a34,
 360		.enable_mask = BIT(11),
 361		.hw.init = &(struct clk_init_data){
 362			.name = "gsbi4_uart_src",
 363			.parent_data = gcc_cxo_pll8,
 364			.num_parents = ARRAY_SIZE(gcc_cxo_pll8),
 365			.ops = &clk_rcg_ops,
 366			.flags = CLK_SET_PARENT_GATE,
 367		},
 368	},
 369};
 370
 371static struct clk_branch gsbi4_uart_clk = {
 372	.halt_reg = 0x2fd0,
 373	.halt_bit = 26,
 374	.clkr = {
 375		.enable_reg = 0x2a34,
 376		.enable_mask = BIT(9),
 377		.hw.init = &(struct clk_init_data){
 378			.name = "gsbi4_uart_clk",
 379			.parent_hws = (const struct clk_hw*[]) {
 380				&gsbi4_uart_src.clkr.hw,
 381			},
 382			.num_parents = 1,
 383			.ops = &clk_branch_ops,
 384			.flags = CLK_SET_RATE_PARENT,
 385		},
 386	},
 387};
 388
 389static struct clk_rcg gsbi5_uart_src = {
 390	.ns_reg = 0x2a54,
 391	.md_reg = 0x2a50,
 392	.mn = {
 393		.mnctr_en_bit = 8,
 394		.mnctr_reset_bit = 7,
 395		.mnctr_mode_shift = 5,
 396		.n_val_shift = 16,
 397		.m_val_shift = 16,
 398		.width = 16,
 399	},
 400	.p = {
 401		.pre_div_shift = 3,
 402		.pre_div_width = 2,
 403	},
 404	.s = {
 405		.src_sel_shift = 0,
 406		.parent_map = gcc_cxo_pll8_map,
 407	},
 408	.freq_tbl = clk_tbl_gsbi_uart,
 409	.clkr = {
 410		.enable_reg = 0x2a54,
 411		.enable_mask = BIT(11),
 412		.hw.init = &(struct clk_init_data){
 413			.name = "gsbi5_uart_src",
 414			.parent_data = gcc_cxo_pll8,
 415			.num_parents = ARRAY_SIZE(gcc_cxo_pll8),
 416			.ops = &clk_rcg_ops,
 417			.flags = CLK_SET_PARENT_GATE,
 418		},
 419	},
 420};
 421
 422static struct clk_branch gsbi5_uart_clk = {
 423	.halt_reg = 0x2fd0,
 424	.halt_bit = 22,
 425	.clkr = {
 426		.enable_reg = 0x2a54,
 427		.enable_mask = BIT(9),
 428		.hw.init = &(struct clk_init_data){
 429			.name = "gsbi5_uart_clk",
 430			.parent_hws = (const struct clk_hw*[]) {
 431				&gsbi5_uart_src.clkr.hw,
 432			},
 433			.num_parents = 1,
 434			.ops = &clk_branch_ops,
 435			.flags = CLK_SET_RATE_PARENT,
 436		},
 437	},
 438};
 439
 440static struct freq_tbl clk_tbl_gsbi_qup[] = {
 441	{   960000, P_CXO,  4, 1,  5 },
 442	{  4800000, P_CXO,  4, 0,  1 },
 443	{  9600000, P_CXO,  2, 0,  1 },
 444	{ 15060000, P_PLL8, 1, 2, 51 },
 445	{ 24000000, P_PLL8, 4, 1,  4 },
 446	{ 25600000, P_PLL8, 1, 1, 15 },
 447	{ 48000000, P_PLL8, 4, 1,  2 },
 448	{ 51200000, P_PLL8, 1, 2, 15 },
 449	{ }
 450};
 451
 452static struct clk_rcg gsbi1_qup_src = {
 453	.ns_reg = 0x29cc,
 454	.md_reg = 0x29c8,
 455	.mn = {
 456		.mnctr_en_bit = 8,
 457		.mnctr_reset_bit = 7,
 458		.mnctr_mode_shift = 5,
 459		.n_val_shift = 16,
 460		.m_val_shift = 16,
 461		.width = 8,
 462	},
 463	.p = {
 464		.pre_div_shift = 3,
 465		.pre_div_width = 2,
 466	},
 467	.s = {
 468		.src_sel_shift = 0,
 469		.parent_map = gcc_cxo_pll8_map,
 470	},
 471	.freq_tbl = clk_tbl_gsbi_qup,
 472	.clkr = {
 473		.enable_reg = 0x29cc,
 474		.enable_mask = BIT(11),
 475		.hw.init = &(struct clk_init_data){
 476			.name = "gsbi1_qup_src",
 477			.parent_data = gcc_cxo_pll8,
 478			.num_parents = ARRAY_SIZE(gcc_cxo_pll8),
 479			.ops = &clk_rcg_ops,
 480			.flags = CLK_SET_PARENT_GATE,
 481		},
 482	},
 483};
 484
 485static struct clk_branch gsbi1_qup_clk = {
 486	.halt_reg = 0x2fcc,
 487	.halt_bit = 9,
 488	.clkr = {
 489		.enable_reg = 0x29cc,
 490		.enable_mask = BIT(9),
 491		.hw.init = &(struct clk_init_data){
 492			.name = "gsbi1_qup_clk",
 493			.parent_hws = (const struct clk_hw*[]) {
 494				&gsbi1_qup_src.clkr.hw,
 495			},
 496			.num_parents = 1,
 497			.ops = &clk_branch_ops,
 498			.flags = CLK_SET_RATE_PARENT,
 499		},
 500	},
 501};
 502
 503static struct clk_rcg gsbi2_qup_src = {
 504	.ns_reg = 0x29ec,
 505	.md_reg = 0x29e8,
 506	.mn = {
 507		.mnctr_en_bit = 8,
 508		.mnctr_reset_bit = 7,
 509		.mnctr_mode_shift = 5,
 510		.n_val_shift = 16,
 511		.m_val_shift = 16,
 512		.width = 8,
 513	},
 514	.p = {
 515		.pre_div_shift = 3,
 516		.pre_div_width = 2,
 517	},
 518	.s = {
 519		.src_sel_shift = 0,
 520		.parent_map = gcc_cxo_pll8_map,
 521	},
 522	.freq_tbl = clk_tbl_gsbi_qup,
 523	.clkr = {
 524		.enable_reg = 0x29ec,
 525		.enable_mask = BIT(11),
 526		.hw.init = &(struct clk_init_data){
 527			.name = "gsbi2_qup_src",
 528			.parent_data = gcc_cxo_pll8,
 529			.num_parents = ARRAY_SIZE(gcc_cxo_pll8),
 530			.ops = &clk_rcg_ops,
 531			.flags = CLK_SET_PARENT_GATE,
 532		},
 533	},
 534};
 535
 536static struct clk_branch gsbi2_qup_clk = {
 537	.halt_reg = 0x2fcc,
 538	.halt_bit = 4,
 539	.clkr = {
 540		.enable_reg = 0x29ec,
 541		.enable_mask = BIT(9),
 542		.hw.init = &(struct clk_init_data){
 543			.name = "gsbi2_qup_clk",
 544			.parent_hws = (const struct clk_hw*[]) {
 545				&gsbi2_qup_src.clkr.hw,
 546			},
 547			.num_parents = 1,
 548			.ops = &clk_branch_ops,
 549			.flags = CLK_SET_RATE_PARENT,
 550		},
 551	},
 552};
 553
 554static struct clk_rcg gsbi3_qup_src = {
 555	.ns_reg = 0x2a0c,
 556	.md_reg = 0x2a08,
 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 = 8,
 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_cxo_pll8_map,
 572	},
 573	.freq_tbl = clk_tbl_gsbi_qup,
 574	.clkr = {
 575		.enable_reg = 0x2a0c,
 576		.enable_mask = BIT(11),
 577		.hw.init = &(struct clk_init_data){
 578			.name = "gsbi3_qup_src",
 579			.parent_data = gcc_cxo_pll8,
 580			.num_parents = ARRAY_SIZE(gcc_cxo_pll8),
 581			.ops = &clk_rcg_ops,
 582			.flags = CLK_SET_PARENT_GATE,
 583		},
 584	},
 585};
 586
 587static struct clk_branch gsbi3_qup_clk = {
 588	.halt_reg = 0x2fcc,
 589	.halt_bit = 0,
 590	.clkr = {
 591		.enable_reg = 0x2a0c,
 592		.enable_mask = BIT(9),
 593		.hw.init = &(struct clk_init_data){
 594			.name = "gsbi3_qup_clk",
 595			.parent_hws = (const struct clk_hw*[]) {
 596				&gsbi3_qup_src.clkr.hw,
 597			},
 598			.num_parents = 1,
 599			.ops = &clk_branch_ops,
 600			.flags = CLK_SET_RATE_PARENT,
 601		},
 602	},
 603};
 604
 605static struct clk_rcg gsbi4_qup_src = {
 606	.ns_reg = 0x2a2c,
 607	.md_reg = 0x2a28,
 608	.mn = {
 609		.mnctr_en_bit = 8,
 610		.mnctr_reset_bit = 7,
 611		.mnctr_mode_shift = 5,
 612		.n_val_shift = 16,
 613		.m_val_shift = 16,
 614		.width = 8,
 615	},
 616	.p = {
 617		.pre_div_shift = 3,
 618		.pre_div_width = 2,
 619	},
 620	.s = {
 621		.src_sel_shift = 0,
 622		.parent_map = gcc_cxo_pll8_map,
 623	},
 624	.freq_tbl = clk_tbl_gsbi_qup,
 625	.clkr = {
 626		.enable_reg = 0x2a2c,
 627		.enable_mask = BIT(11),
 628		.hw.init = &(struct clk_init_data){
 629			.name = "gsbi4_qup_src",
 630			.parent_data = gcc_cxo_pll8,
 631			.num_parents = ARRAY_SIZE(gcc_cxo_pll8),
 632			.ops = &clk_rcg_ops,
 633			.flags = CLK_SET_PARENT_GATE,
 634		},
 635	},
 636};
 637
 638static struct clk_branch gsbi4_qup_clk = {
 639	.halt_reg = 0x2fd0,
 640	.halt_bit = 24,
 641	.clkr = {
 642		.enable_reg = 0x2a2c,
 643		.enable_mask = BIT(9),
 644		.hw.init = &(struct clk_init_data){
 645			.name = "gsbi4_qup_clk",
 646			.parent_hws = (const struct clk_hw*[]) {
 647				&gsbi4_qup_src.clkr.hw,
 648			},
 649			.num_parents = 1,
 650			.ops = &clk_branch_ops,
 651			.flags = CLK_SET_RATE_PARENT,
 652		},
 653	},
 654};
 655
 656static struct clk_rcg gsbi5_qup_src = {
 657	.ns_reg = 0x2a4c,
 658	.md_reg = 0x2a48,
 659	.mn = {
 660		.mnctr_en_bit = 8,
 661		.mnctr_reset_bit = 7,
 662		.mnctr_mode_shift = 5,
 663		.n_val_shift = 16,
 664		.m_val_shift = 16,
 665		.width = 8,
 666	},
 667	.p = {
 668		.pre_div_shift = 3,
 669		.pre_div_width = 2,
 670	},
 671	.s = {
 672		.src_sel_shift = 0,
 673		.parent_map = gcc_cxo_pll8_map,
 674	},
 675	.freq_tbl = clk_tbl_gsbi_qup,
 676	.clkr = {
 677		.enable_reg = 0x2a4c,
 678		.enable_mask = BIT(11),
 679		.hw.init = &(struct clk_init_data){
 680			.name = "gsbi5_qup_src",
 681			.parent_data = gcc_cxo_pll8,
 682			.num_parents = ARRAY_SIZE(gcc_cxo_pll8),
 683			.ops = &clk_rcg_ops,
 684			.flags = CLK_SET_PARENT_GATE,
 685		},
 686	},
 687};
 688
 689static struct clk_branch gsbi5_qup_clk = {
 690	.halt_reg = 0x2fd0,
 691	.halt_bit = 20,
 692	.clkr = {
 693		.enable_reg = 0x2a4c,
 694		.enable_mask = BIT(9),
 695		.hw.init = &(struct clk_init_data){
 696			.name = "gsbi5_qup_clk",
 697			.parent_hws = (const struct clk_hw*[]) {
 698				&gsbi5_qup_src.clkr.hw,
 699			},
 700			.num_parents = 1,
 701			.ops = &clk_branch_ops,
 702			.flags = CLK_SET_RATE_PARENT,
 703		},
 704	},
 705};
 706
 707static const struct freq_tbl clk_tbl_gp[] = {
 708	{ 9600000, P_CXO,  2, 0, 0 },
 709	{ 19200000, P_CXO,  1, 0, 0 },
 710	{ }
 711};
 712
 713static struct clk_rcg gp0_src = {
 714	.ns_reg = 0x2d24,
 715	.md_reg = 0x2d00,
 716	.mn = {
 717		.mnctr_en_bit = 8,
 718		.mnctr_reset_bit = 7,
 719		.mnctr_mode_shift = 5,
 720		.n_val_shift = 16,
 721		.m_val_shift = 16,
 722		.width = 8,
 723	},
 724	.p = {
 725		.pre_div_shift = 3,
 726		.pre_div_width = 2,
 727	},
 728	.s = {
 729		.src_sel_shift = 0,
 730		.parent_map = gcc_cxo_map,
 731	},
 732	.freq_tbl = clk_tbl_gp,
 733	.clkr = {
 734		.enable_reg = 0x2d24,
 735		.enable_mask = BIT(11),
 736		.hw.init = &(struct clk_init_data){
 737			.name = "gp0_src",
 738			.parent_data = gcc_cxo,
 739			.num_parents = ARRAY_SIZE(gcc_cxo),
 740			.ops = &clk_rcg_ops,
 741			.flags = CLK_SET_PARENT_GATE,
 742		},
 743	}
 744};
 745
 746static struct clk_branch gp0_clk = {
 747	.halt_reg = 0x2fd8,
 748	.halt_bit = 7,
 749	.clkr = {
 750		.enable_reg = 0x2d24,
 751		.enable_mask = BIT(9),
 752		.hw.init = &(struct clk_init_data){
 753			.name = "gp0_clk",
 754			.parent_hws = (const struct clk_hw*[]) {
 755				&gp0_src.clkr.hw,
 756			},
 757			.num_parents = 1,
 758			.ops = &clk_branch_ops,
 759			.flags = CLK_SET_RATE_PARENT,
 760		},
 761	},
 762};
 763
 764static struct clk_rcg gp1_src = {
 765	.ns_reg = 0x2d44,
 766	.md_reg = 0x2d40,
 767	.mn = {
 768		.mnctr_en_bit = 8,
 769		.mnctr_reset_bit = 7,
 770		.mnctr_mode_shift = 5,
 771		.n_val_shift = 16,
 772		.m_val_shift = 16,
 773		.width = 8,
 774	},
 775	.p = {
 776		.pre_div_shift = 3,
 777		.pre_div_width = 2,
 778	},
 779	.s = {
 780		.src_sel_shift = 0,
 781		.parent_map = gcc_cxo_map,
 782	},
 783	.freq_tbl = clk_tbl_gp,
 784	.clkr = {
 785		.enable_reg = 0x2d44,
 786		.enable_mask = BIT(11),
 787		.hw.init = &(struct clk_init_data){
 788			.name = "gp1_src",
 789			.parent_data = gcc_cxo,
 790			.num_parents = ARRAY_SIZE(gcc_cxo),
 791			.ops = &clk_rcg_ops,
 792			.flags = CLK_SET_RATE_GATE,
 793		},
 794	}
 795};
 796
 797static struct clk_branch gp1_clk = {
 798	.halt_reg = 0x2fd8,
 799	.halt_bit = 6,
 800	.clkr = {
 801		.enable_reg = 0x2d44,
 802		.enable_mask = BIT(9),
 803		.hw.init = &(struct clk_init_data){
 804			.name = "gp1_clk",
 805			.parent_hws = (const struct clk_hw*[]) {
 806				&gp1_src.clkr.hw,
 807			},
 808			.num_parents = 1,
 809			.ops = &clk_branch_ops,
 810			.flags = CLK_SET_RATE_PARENT,
 811		},
 812	},
 813};
 814
 815static struct clk_rcg gp2_src = {
 816	.ns_reg = 0x2d64,
 817	.md_reg = 0x2d60,
 818	.mn = {
 819		.mnctr_en_bit = 8,
 820		.mnctr_reset_bit = 7,
 821		.mnctr_mode_shift = 5,
 822		.n_val_shift = 16,
 823		.m_val_shift = 16,
 824		.width = 8,
 825	},
 826	.p = {
 827		.pre_div_shift = 3,
 828		.pre_div_width = 2,
 829	},
 830	.s = {
 831		.src_sel_shift = 0,
 832		.parent_map = gcc_cxo_map,
 833	},
 834	.freq_tbl = clk_tbl_gp,
 835	.clkr = {
 836		.enable_reg = 0x2d64,
 837		.enable_mask = BIT(11),
 838		.hw.init = &(struct clk_init_data){
 839			.name = "gp2_src",
 840			.parent_data = gcc_cxo,
 841			.num_parents = ARRAY_SIZE(gcc_cxo),
 842			.ops = &clk_rcg_ops,
 843			.flags = CLK_SET_RATE_GATE,
 844		},
 845	}
 846};
 847
 848static struct clk_branch gp2_clk = {
 849	.halt_reg = 0x2fd8,
 850	.halt_bit = 5,
 851	.clkr = {
 852		.enable_reg = 0x2d64,
 853		.enable_mask = BIT(9),
 854		.hw.init = &(struct clk_init_data){
 855			.name = "gp2_clk",
 856			.parent_hws = (const struct clk_hw*[]) {
 857				&gp2_src.clkr.hw,
 858			},
 859			.num_parents = 1,
 860			.ops = &clk_branch_ops,
 861			.flags = CLK_SET_RATE_PARENT,
 862		},
 863	},
 864};
 865
 866static struct clk_branch pmem_clk = {
 867	.hwcg_reg = 0x25a0,
 868	.hwcg_bit = 6,
 869	.halt_reg = 0x2fc8,
 870	.halt_bit = 20,
 871	.clkr = {
 872		.enable_reg = 0x25a0,
 873		.enable_mask = BIT(4),
 874		.hw.init = &(struct clk_init_data){
 875			.name = "pmem_clk",
 876			.ops = &clk_branch_ops,
 877		},
 878	},
 879};
 880
 881static struct clk_rcg prng_src = {
 882	.ns_reg = 0x2e80,
 883	.p = {
 884		.pre_div_shift = 3,
 885		.pre_div_width = 4,
 886	},
 887	.s = {
 888		.src_sel_shift = 0,
 889		.parent_map = gcc_cxo_pll8_map,
 890	},
 891	.clkr = {
 892		.hw.init = &(struct clk_init_data){
 893			.name = "prng_src",
 894			.parent_data = gcc_cxo_pll8,
 895			.num_parents = ARRAY_SIZE(gcc_cxo_pll8),
 896			.ops = &clk_rcg_ops,
 897		},
 898	},
 899};
 900
 901static struct clk_branch prng_clk = {
 902	.halt_reg = 0x2fd8,
 903	.halt_check = BRANCH_HALT_VOTED,
 904	.halt_bit = 10,
 905	.clkr = {
 906		.enable_reg = 0x3080,
 907		.enable_mask = BIT(10),
 908		.hw.init = &(struct clk_init_data){
 909			.name = "prng_clk",
 910			.parent_hws = (const struct clk_hw*[]) {
 911				&prng_src.clkr.hw,
 912			},
 913			.num_parents = 1,
 914			.ops = &clk_branch_ops,
 915		},
 916	},
 917};
 918
 919static const struct freq_tbl clk_tbl_sdc[] = {
 920	{    144000, P_CXO,   1, 1, 133 },
 921	{    400000, P_PLL8,  4, 1, 240 },
 922	{  16000000, P_PLL8,  4, 1,   6 },
 923	{  17070000, P_PLL8,  1, 2,  45 },
 924	{  20210000, P_PLL8,  1, 1,  19 },
 925	{  24000000, P_PLL8,  4, 1,   4 },
 926	{  38400000, P_PLL8,  2, 1,   5 },
 927	{  48000000, P_PLL8,  4, 1,   2 },
 928	{  64000000, P_PLL8,  3, 1,   2 },
 929	{  76800000, P_PLL8,  1, 1,   5 },
 930	{ }
 931};
 932
 933static struct clk_rcg sdc1_src = {
 934	.ns_reg = 0x282c,
 935	.md_reg = 0x2828,
 936	.mn = {
 937		.mnctr_en_bit = 8,
 938		.mnctr_reset_bit = 7,
 939		.mnctr_mode_shift = 5,
 940		.n_val_shift = 16,
 941		.m_val_shift = 16,
 942		.width = 8,
 943	},
 944	.p = {
 945		.pre_div_shift = 3,
 946		.pre_div_width = 2,
 947	},
 948	.s = {
 949		.src_sel_shift = 0,
 950		.parent_map = gcc_cxo_pll8_map,
 951	},
 952	.freq_tbl = clk_tbl_sdc,
 953	.clkr = {
 954		.enable_reg = 0x282c,
 955		.enable_mask = BIT(11),
 956		.hw.init = &(struct clk_init_data){
 957			.name = "sdc1_src",
 958			.parent_data = gcc_cxo_pll8,
 959			.num_parents = ARRAY_SIZE(gcc_cxo_pll8),
 960			.ops = &clk_rcg_ops,
 961		},
 962	}
 963};
 964
 965static struct clk_branch sdc1_clk = {
 966	.halt_reg = 0x2fc8,
 967	.halt_bit = 6,
 968	.clkr = {
 969		.enable_reg = 0x282c,
 970		.enable_mask = BIT(9),
 971		.hw.init = &(struct clk_init_data){
 972			.name = "sdc1_clk",
 973			.parent_hws = (const struct clk_hw*[]) {
 974				&sdc1_src.clkr.hw,
 975			},
 976			.num_parents = 1,
 977			.ops = &clk_branch_ops,
 978			.flags = CLK_SET_RATE_PARENT,
 979		},
 980	},
 981};
 982
 983static struct clk_rcg sdc2_src = {
 984	.ns_reg = 0x284c,
 985	.md_reg = 0x2848,
 986	.mn = {
 987		.mnctr_en_bit = 8,
 988		.mnctr_reset_bit = 7,
 989		.mnctr_mode_shift = 5,
 990		.n_val_shift = 16,
 991		.m_val_shift = 16,
 992		.width = 8,
 993	},
 994	.p = {
 995		.pre_div_shift = 3,
 996		.pre_div_width = 2,
 997	},
 998	.s = {
 999		.src_sel_shift = 0,
1000		.parent_map = gcc_cxo_pll8_map,
1001	},
1002	.freq_tbl = clk_tbl_sdc,
1003	.clkr = {
1004		.enable_reg = 0x284c,
1005		.enable_mask = BIT(11),
1006		.hw.init = &(struct clk_init_data){
1007			.name = "sdc2_src",
1008			.parent_data = gcc_cxo_pll8,
1009			.num_parents = ARRAY_SIZE(gcc_cxo_pll8),
1010			.ops = &clk_rcg_ops,
1011		},
1012	}
1013};
1014
1015static struct clk_branch sdc2_clk = {
1016	.halt_reg = 0x2fc8,
1017	.halt_bit = 5,
1018	.clkr = {
1019		.enable_reg = 0x284c,
1020		.enable_mask = BIT(9),
1021		.hw.init = &(struct clk_init_data){
1022			.name = "sdc2_clk",
1023			.parent_hws = (const struct clk_hw*[]) {
1024				&sdc2_src.clkr.hw,
1025			},
1026			.num_parents = 1,
1027			.ops = &clk_branch_ops,
1028			.flags = CLK_SET_RATE_PARENT,
1029		},
1030	},
1031};
1032
1033static const struct freq_tbl clk_tbl_usb[] = {
1034	{ 60000000, P_PLL8, 1, 5, 32 },
1035	{ }
1036};
1037
1038static struct clk_rcg usb_hs1_xcvr_src = {
1039	.ns_reg = 0x290c,
1040	.md_reg = 0x2908,
1041	.mn = {
1042		.mnctr_en_bit = 8,
1043		.mnctr_reset_bit = 7,
1044		.mnctr_mode_shift = 5,
1045		.n_val_shift = 16,
1046		.m_val_shift = 16,
1047		.width = 8,
1048	},
1049	.p = {
1050		.pre_div_shift = 3,
1051		.pre_div_width = 2,
1052	},
1053	.s = {
1054		.src_sel_shift = 0,
1055		.parent_map = gcc_cxo_pll8_map,
1056	},
1057	.freq_tbl = clk_tbl_usb,
1058	.clkr = {
1059		.enable_reg = 0x290c,
1060		.enable_mask = BIT(11),
1061		.hw.init = &(struct clk_init_data){
1062			.name = "usb_hs1_xcvr_src",
1063			.parent_data = gcc_cxo_pll8,
1064			.num_parents = ARRAY_SIZE(gcc_cxo_pll8),
1065			.ops = &clk_rcg_ops,
1066			.flags = CLK_SET_RATE_GATE,
1067		},
1068	}
1069};
1070
1071static struct clk_branch usb_hs1_xcvr_clk = {
1072	.halt_reg = 0x2fc8,
1073	.halt_bit = 0,
1074	.clkr = {
1075		.enable_reg = 0x290c,
1076		.enable_mask = BIT(9),
1077		.hw.init = &(struct clk_init_data){
1078			.name = "usb_hs1_xcvr_clk",
1079			.parent_hws = (const struct clk_hw*[]) {
1080				&usb_hs1_xcvr_src.clkr.hw,
1081			},
1082			.num_parents = 1,
1083			.ops = &clk_branch_ops,
1084			.flags = CLK_SET_RATE_PARENT,
1085		},
1086	},
1087};
1088
1089static struct clk_rcg usb_hsic_xcvr_fs_src = {
1090	.ns_reg = 0x2928,
1091	.md_reg = 0x2924,
1092	.mn = {
1093		.mnctr_en_bit = 8,
1094		.mnctr_reset_bit = 7,
1095		.mnctr_mode_shift = 5,
1096		.n_val_shift = 16,
1097		.m_val_shift = 16,
1098		.width = 8,
1099	},
1100	.p = {
1101		.pre_div_shift = 3,
1102		.pre_div_width = 2,
1103	},
1104	.s = {
1105		.src_sel_shift = 0,
1106		.parent_map = gcc_cxo_pll8_map,
1107	},
1108	.freq_tbl = clk_tbl_usb,
1109	.clkr = {
1110		.enable_reg = 0x2928,
1111		.enable_mask = BIT(11),
1112		.hw.init = &(struct clk_init_data){
1113			.name = "usb_hsic_xcvr_fs_src",
1114			.parent_data = gcc_cxo_pll8,
1115			.num_parents = ARRAY_SIZE(gcc_cxo_pll8),
1116			.ops = &clk_rcg_ops,
1117			.flags = CLK_SET_RATE_GATE,
1118		},
1119	}
1120};
1121
1122static struct clk_branch usb_hsic_xcvr_fs_clk = {
1123	.halt_reg = 0x2fc8,
1124	.halt_bit = 9,
1125	.clkr = {
1126		.enable_reg = 0x2928,
1127		.enable_mask = BIT(9),
1128		.hw.init = &(struct clk_init_data){
1129			.name = "usb_hsic_xcvr_fs_clk",
1130			.parent_hws = (const struct clk_hw*[]) {
1131				&usb_hsic_xcvr_fs_src.clkr.hw,
1132			},
1133			.num_parents = 1,
1134			.ops = &clk_branch_ops,
1135			.flags = CLK_SET_RATE_PARENT,
1136		},
1137	},
1138};
1139
1140static const struct freq_tbl clk_tbl_usb_hs1_system[] = {
1141	{ 60000000, P_PLL8, 1, 5, 32 },
1142	{ }
1143};
1144
1145static struct clk_rcg usb_hs1_system_src = {
1146	.ns_reg = 0x36a4,
1147	.md_reg = 0x36a0,
1148	.mn = {
1149		.mnctr_en_bit = 8,
1150		.mnctr_reset_bit = 7,
1151		.mnctr_mode_shift = 5,
1152		.n_val_shift = 16,
1153		.m_val_shift = 16,
1154		.width = 8,
1155	},
1156	.p = {
1157		.pre_div_shift = 3,
1158		.pre_div_width = 2,
1159	},
1160	.s = {
1161		.src_sel_shift = 0,
1162		.parent_map = gcc_cxo_pll8_map,
1163	},
1164	.freq_tbl = clk_tbl_usb_hs1_system,
1165	.clkr = {
1166		.enable_reg = 0x36a4,
1167		.enable_mask = BIT(11),
1168		.hw.init = &(struct clk_init_data){
1169			.name = "usb_hs1_system_src",
1170			.parent_data = gcc_cxo_pll8,
1171			.num_parents = ARRAY_SIZE(gcc_cxo_pll8),
1172			.ops = &clk_rcg_ops,
1173			.flags = CLK_SET_RATE_GATE,
1174		},
1175	}
1176};
1177
1178static struct clk_branch usb_hs1_system_clk = {
1179	.halt_reg = 0x2fc8,
1180	.halt_bit = 4,
1181	.clkr = {
1182		.enable_reg = 0x36a4,
1183		.enable_mask = BIT(9),
1184		.hw.init = &(struct clk_init_data){
1185			.parent_hws = (const struct clk_hw*[]) {
1186				&usb_hs1_system_src.clkr.hw,
1187			},
1188			.num_parents = 1,
1189			.name = "usb_hs1_system_clk",
1190			.ops = &clk_branch_ops,
1191			.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
1192		},
1193	},
1194};
1195
1196static const struct freq_tbl clk_tbl_usb_hsic_system[] = {
1197	{ 64000000, P_PLL8, 1, 1, 6 },
1198	{ }
1199};
1200
1201static struct clk_rcg usb_hsic_system_src = {
1202	.ns_reg = 0x2b58,
1203	.md_reg = 0x2b54,
1204	.mn = {
1205		.mnctr_en_bit = 8,
1206		.mnctr_reset_bit = 7,
1207		.mnctr_mode_shift = 5,
1208		.n_val_shift = 16,
1209		.m_val_shift = 16,
1210		.width = 8,
1211	},
1212	.p = {
1213		.pre_div_shift = 3,
1214		.pre_div_width = 2,
1215	},
1216	.s = {
1217		.src_sel_shift = 0,
1218		.parent_map = gcc_cxo_pll8_map,
1219	},
1220	.freq_tbl = clk_tbl_usb_hsic_system,
1221	.clkr = {
1222		.enable_reg = 0x2b58,
1223		.enable_mask = BIT(11),
1224		.hw.init = &(struct clk_init_data){
1225			.name = "usb_hsic_system_src",
1226			.parent_data = gcc_cxo_pll8,
1227			.num_parents = ARRAY_SIZE(gcc_cxo_pll8),
1228			.ops = &clk_rcg_ops,
1229			.flags = CLK_SET_RATE_GATE,
1230		},
1231	}
1232};
1233
1234static struct clk_branch usb_hsic_system_clk = {
1235	.halt_reg = 0x2fc8,
1236	.halt_bit = 7,
1237	.clkr = {
1238		.enable_reg = 0x2b58,
1239		.enable_mask = BIT(9),
1240		.hw.init = &(struct clk_init_data){
1241			.parent_hws = (const struct clk_hw*[]) {
1242				&usb_hsic_system_src.clkr.hw,
1243			},
1244			.num_parents = 1,
1245			.name = "usb_hsic_system_clk",
1246			.ops = &clk_branch_ops,
1247			.flags = CLK_SET_RATE_PARENT,
1248		},
1249	},
1250};
1251
1252static const struct freq_tbl clk_tbl_usb_hsic_hsic[] = {
1253	{ 48000000, P_PLL14, 1, 0, 0 },
1254	{ }
1255};
1256
1257static struct clk_rcg usb_hsic_hsic_src = {
1258	.ns_reg = 0x2b50,
1259	.md_reg = 0x2b4c,
1260	.mn = {
1261		.mnctr_en_bit = 8,
1262		.mnctr_reset_bit = 7,
1263		.mnctr_mode_shift = 5,
1264		.n_val_shift = 16,
1265		.m_val_shift = 16,
1266		.width = 8,
1267	},
1268	.p = {
1269		.pre_div_shift = 3,
1270		.pre_div_width = 2,
1271	},
1272	.s = {
1273		.src_sel_shift = 0,
1274		.parent_map = gcc_cxo_pll14_map,
1275	},
1276	.freq_tbl = clk_tbl_usb_hsic_hsic,
1277	.clkr = {
1278		.enable_reg = 0x2b50,
1279		.enable_mask = BIT(11),
1280		.hw.init = &(struct clk_init_data){
1281			.name = "usb_hsic_hsic_src",
1282			.parent_data = gcc_cxo_pll14,
1283			.num_parents = ARRAY_SIZE(gcc_cxo_pll14),
1284			.ops = &clk_rcg_ops,
1285			.flags = CLK_SET_RATE_GATE,
1286		},
1287	}
1288};
1289
1290static struct clk_branch usb_hsic_hsic_clk = {
1291	.halt_check = BRANCH_HALT_DELAY,
1292	.clkr = {
1293		.enable_reg = 0x2b50,
1294		.enable_mask = BIT(9),
1295		.hw.init = &(struct clk_init_data){
1296			.parent_hws = (const struct clk_hw*[]) {
1297				&usb_hsic_hsic_src.clkr.hw,
1298			},
1299			.num_parents = 1,
1300			.name = "usb_hsic_hsic_clk",
1301			.ops = &clk_branch_ops,
1302			.flags = CLK_SET_RATE_PARENT,
1303		},
1304	},
1305};
1306
1307static struct clk_branch usb_hsic_hsio_cal_clk = {
1308	.halt_reg = 0x2fc8,
1309	.halt_bit = 8,
1310	.clkr = {
1311		.enable_reg = 0x2b48,
1312		.enable_mask = BIT(0),
1313		.hw.init = &(struct clk_init_data){
1314			.parent_data = gcc_cxo,
1315			.num_parents = ARRAY_SIZE(gcc_cxo),
1316			.name = "usb_hsic_hsio_cal_clk",
1317			.ops = &clk_branch_ops,
1318		},
1319	},
1320};
1321
1322static struct clk_branch ce1_core_clk = {
1323	.hwcg_reg = 0x2724,
1324	.hwcg_bit = 6,
1325	.halt_reg = 0x2fd4,
1326	.halt_bit = 27,
1327	.clkr = {
1328		.enable_reg = 0x2724,
1329		.enable_mask = BIT(4),
1330		.hw.init = &(struct clk_init_data){
1331			.name = "ce1_core_clk",
1332			.ops = &clk_branch_ops,
1333		},
1334	},
1335};
1336
1337static struct clk_branch ce1_h_clk = {
1338	.halt_reg = 0x2fd4,
1339	.halt_bit = 1,
1340	.clkr = {
1341		.enable_reg = 0x2720,
1342		.enable_mask = BIT(4),
1343		.hw.init = &(struct clk_init_data){
1344			.name = "ce1_h_clk",
1345			.ops = &clk_branch_ops,
1346		},
1347	},
1348};
1349
1350static struct clk_branch dma_bam_h_clk = {
1351	.hwcg_reg = 0x25c0,
1352	.hwcg_bit = 6,
1353	.halt_reg = 0x2fc8,
1354	.halt_bit = 12,
1355	.clkr = {
1356		.enable_reg = 0x25c0,
1357		.enable_mask = BIT(4),
1358		.hw.init = &(struct clk_init_data){
1359			.name = "dma_bam_h_clk",
1360			.ops = &clk_branch_ops,
1361		},
1362	},
1363};
1364
1365static struct clk_branch gsbi1_h_clk = {
1366	.hwcg_reg = 0x29c0,
1367	.hwcg_bit = 6,
1368	.halt_reg = 0x2fcc,
1369	.halt_bit = 11,
1370	.clkr = {
1371		.enable_reg = 0x29c0,
1372		.enable_mask = BIT(4),
1373		.hw.init = &(struct clk_init_data){
1374			.name = "gsbi1_h_clk",
1375			.ops = &clk_branch_ops,
1376		},
1377	},
1378};
1379
1380static struct clk_branch gsbi2_h_clk = {
1381	.hwcg_reg = 0x29e0,
1382	.hwcg_bit = 6,
1383	.halt_reg = 0x2fcc,
1384	.halt_bit = 7,
1385	.clkr = {
1386		.enable_reg = 0x29e0,
1387		.enable_mask = BIT(4),
1388		.hw.init = &(struct clk_init_data){
1389			.name = "gsbi2_h_clk",
1390			.ops = &clk_branch_ops,
1391		},
1392	},
1393};
1394
1395static struct clk_branch gsbi3_h_clk = {
1396	.hwcg_reg = 0x2a00,
1397	.hwcg_bit = 6,
1398	.halt_reg = 0x2fcc,
1399	.halt_bit = 3,
1400	.clkr = {
1401		.enable_reg = 0x2a00,
1402		.enable_mask = BIT(4),
1403		.hw.init = &(struct clk_init_data){
1404			.name = "gsbi3_h_clk",
1405			.ops = &clk_branch_ops,
1406		},
1407	},
1408};
1409
1410static struct clk_branch gsbi4_h_clk = {
1411	.hwcg_reg = 0x2a20,
1412	.hwcg_bit = 6,
1413	.halt_reg = 0x2fd0,
1414	.halt_bit = 27,
1415	.clkr = {
1416		.enable_reg = 0x2a20,
1417		.enable_mask = BIT(4),
1418		.hw.init = &(struct clk_init_data){
1419			.name = "gsbi4_h_clk",
1420			.ops = &clk_branch_ops,
1421		},
1422	},
1423};
1424
1425static struct clk_branch gsbi5_h_clk = {
1426	.hwcg_reg = 0x2a40,
1427	.hwcg_bit = 6,
1428	.halt_reg = 0x2fd0,
1429	.halt_bit = 23,
1430	.clkr = {
1431		.enable_reg = 0x2a40,
1432		.enable_mask = BIT(4),
1433		.hw.init = &(struct clk_init_data){
1434			.name = "gsbi5_h_clk",
1435			.ops = &clk_branch_ops,
1436		},
1437	},
1438};
1439
1440static struct clk_branch usb_hs1_h_clk = {
1441	.hwcg_reg = 0x2900,
1442	.hwcg_bit = 6,
1443	.halt_reg = 0x2fc8,
1444	.halt_bit = 1,
1445	.clkr = {
1446		.enable_reg = 0x2900,
1447		.enable_mask = BIT(4),
1448		.hw.init = &(struct clk_init_data){
1449			.name = "usb_hs1_h_clk",
1450			.ops = &clk_branch_ops,
1451		},
1452	},
1453};
1454
1455static struct clk_branch usb_hsic_h_clk = {
1456	.halt_reg = 0x2fcc,
1457	.halt_bit = 28,
1458	.clkr = {
1459		.enable_reg = 0x2920,
1460		.enable_mask = BIT(4),
1461		.hw.init = &(struct clk_init_data){
1462			.name = "usb_hsic_h_clk",
1463			.ops = &clk_branch_ops,
1464		},
1465	},
1466};
1467
1468static struct clk_branch sdc1_h_clk = {
1469	.hwcg_reg = 0x2820,
1470	.hwcg_bit = 6,
1471	.halt_reg = 0x2fc8,
1472	.halt_bit = 11,
1473	.clkr = {
1474		.enable_reg = 0x2820,
1475		.enable_mask = BIT(4),
1476		.hw.init = &(struct clk_init_data){
1477			.name = "sdc1_h_clk",
1478			.ops = &clk_branch_ops,
1479		},
1480	},
1481};
1482
1483static struct clk_branch sdc2_h_clk = {
1484	.hwcg_reg = 0x2840,
1485	.hwcg_bit = 6,
1486	.halt_reg = 0x2fc8,
1487	.halt_bit = 10,
1488	.clkr = {
1489		.enable_reg = 0x2840,
1490		.enable_mask = BIT(4),
1491		.hw.init = &(struct clk_init_data){
1492			.name = "sdc2_h_clk",
1493			.ops = &clk_branch_ops,
1494		},
1495	},
1496};
1497
1498static struct clk_branch adm0_clk = {
1499	.halt_reg = 0x2fdc,
1500	.halt_check = BRANCH_HALT_VOTED,
1501	.halt_bit = 14,
1502	.clkr = {
1503		.enable_reg = 0x3080,
1504		.enable_mask = BIT(2),
1505		.hw.init = &(struct clk_init_data){
1506			.name = "adm0_clk",
1507			.ops = &clk_branch_ops,
1508		},
1509	},
1510};
1511
1512static struct clk_branch adm0_pbus_clk = {
1513	.hwcg_reg = 0x2208,
1514	.hwcg_bit = 6,
1515	.halt_reg = 0x2fdc,
1516	.halt_check = BRANCH_HALT_VOTED,
1517	.halt_bit = 13,
1518	.clkr = {
1519		.enable_reg = 0x3080,
1520		.enable_mask = BIT(3),
1521		.hw.init = &(struct clk_init_data){
1522			.name = "adm0_pbus_clk",
1523			.ops = &clk_branch_ops,
1524		},
1525	},
1526};
1527
1528static struct clk_branch pmic_arb0_h_clk = {
1529	.halt_reg = 0x2fd8,
1530	.halt_check = BRANCH_HALT_VOTED,
1531	.halt_bit = 22,
1532	.clkr = {
1533		.enable_reg = 0x3080,
1534		.enable_mask = BIT(8),
1535		.hw.init = &(struct clk_init_data){
1536			.name = "pmic_arb0_h_clk",
1537			.ops = &clk_branch_ops,
1538		},
1539	},
1540};
1541
1542static struct clk_branch pmic_arb1_h_clk = {
1543	.halt_reg = 0x2fd8,
1544	.halt_check = BRANCH_HALT_VOTED,
1545	.halt_bit = 21,
1546	.clkr = {
1547		.enable_reg = 0x3080,
1548		.enable_mask = BIT(9),
1549		.hw.init = &(struct clk_init_data){
1550			.name = "pmic_arb1_h_clk",
1551			.ops = &clk_branch_ops,
1552		},
1553	},
1554};
1555
1556static struct clk_branch pmic_ssbi2_clk = {
1557	.halt_reg = 0x2fd8,
1558	.halt_check = BRANCH_HALT_VOTED,
1559	.halt_bit = 23,
1560	.clkr = {
1561		.enable_reg = 0x3080,
1562		.enable_mask = BIT(7),
1563		.hw.init = &(struct clk_init_data){
1564			.name = "pmic_ssbi2_clk",
1565			.ops = &clk_branch_ops,
1566		},
1567	},
1568};
1569
1570static struct clk_branch rpm_msg_ram_h_clk = {
1571	.hwcg_reg = 0x27e0,
1572	.hwcg_bit = 6,
1573	.halt_reg = 0x2fd8,
1574	.halt_check = BRANCH_HALT_VOTED,
1575	.halt_bit = 12,
1576	.clkr = {
1577		.enable_reg = 0x3080,
1578		.enable_mask = BIT(6),
1579		.hw.init = &(struct clk_init_data){
1580			.name = "rpm_msg_ram_h_clk",
1581			.ops = &clk_branch_ops,
1582		},
1583	},
1584};
1585
1586static struct clk_branch ebi2_clk = {
1587	.hwcg_reg = 0x2664,
1588	.hwcg_bit = 6,
1589	.halt_reg = 0x2fcc,
1590	.halt_bit = 24,
1591	.clkr = {
1592		.enable_reg = 0x2664,
1593		.enable_mask = BIT(6) | BIT(4),
1594		.hw.init = &(struct clk_init_data){
1595			.name = "ebi2_clk",
1596			.ops = &clk_branch_ops,
1597		},
1598	},
1599};
1600
1601static struct clk_branch ebi2_aon_clk = {
1602	.halt_reg = 0x2fcc,
1603	.halt_bit = 23,
1604	.clkr = {
1605		.enable_reg = 0x2664,
1606		.enable_mask = BIT(8),
1607		.hw.init = &(struct clk_init_data){
1608			.name = "ebi2_aon_clk",
1609			.ops = &clk_branch_ops,
1610		},
1611	},
1612};
1613
1614static struct clk_regmap *gcc_mdm9615_clks[] = {
1615	[PLL0] = &pll0.clkr,
1616	[PLL0_VOTE] = &pll0_vote,
1617	[PLL4_VOTE] = &pll4_vote,
1618	[PLL8] = &pll8.clkr,
1619	[PLL8_VOTE] = &pll8_vote,
1620	[PLL14] = &pll14.clkr,
1621	[PLL14_VOTE] = &pll14_vote,
1622	[GSBI1_UART_SRC] = &gsbi1_uart_src.clkr,
1623	[GSBI1_UART_CLK] = &gsbi1_uart_clk.clkr,
1624	[GSBI2_UART_SRC] = &gsbi2_uart_src.clkr,
1625	[GSBI2_UART_CLK] = &gsbi2_uart_clk.clkr,
1626	[GSBI3_UART_SRC] = &gsbi3_uart_src.clkr,
1627	[GSBI3_UART_CLK] = &gsbi3_uart_clk.clkr,
1628	[GSBI4_UART_SRC] = &gsbi4_uart_src.clkr,
1629	[GSBI4_UART_CLK] = &gsbi4_uart_clk.clkr,
1630	[GSBI5_UART_SRC] = &gsbi5_uart_src.clkr,
1631	[GSBI5_UART_CLK] = &gsbi5_uart_clk.clkr,
1632	[GSBI1_QUP_SRC] = &gsbi1_qup_src.clkr,
1633	[GSBI1_QUP_CLK] = &gsbi1_qup_clk.clkr,
1634	[GSBI2_QUP_SRC] = &gsbi2_qup_src.clkr,
1635	[GSBI2_QUP_CLK] = &gsbi2_qup_clk.clkr,
1636	[GSBI3_QUP_SRC] = &gsbi3_qup_src.clkr,
1637	[GSBI3_QUP_CLK] = &gsbi3_qup_clk.clkr,
1638	[GSBI4_QUP_SRC] = &gsbi4_qup_src.clkr,
1639	[GSBI4_QUP_CLK] = &gsbi4_qup_clk.clkr,
1640	[GSBI5_QUP_SRC] = &gsbi5_qup_src.clkr,
1641	[GSBI5_QUP_CLK] = &gsbi5_qup_clk.clkr,
1642	[GP0_SRC] = &gp0_src.clkr,
1643	[GP0_CLK] = &gp0_clk.clkr,
1644	[GP1_SRC] = &gp1_src.clkr,
1645	[GP1_CLK] = &gp1_clk.clkr,
1646	[GP2_SRC] = &gp2_src.clkr,
1647	[GP2_CLK] = &gp2_clk.clkr,
1648	[PMEM_A_CLK] = &pmem_clk.clkr,
1649	[PRNG_SRC] = &prng_src.clkr,
1650	[PRNG_CLK] = &prng_clk.clkr,
1651	[SDC1_SRC] = &sdc1_src.clkr,
1652	[SDC1_CLK] = &sdc1_clk.clkr,
1653	[SDC2_SRC] = &sdc2_src.clkr,
1654	[SDC2_CLK] = &sdc2_clk.clkr,
1655	[USB_HS1_XCVR_SRC] = &usb_hs1_xcvr_src.clkr,
1656	[USB_HS1_XCVR_CLK] = &usb_hs1_xcvr_clk.clkr,
1657	[USB_HS1_SYSTEM_CLK_SRC] = &usb_hs1_system_src.clkr,
1658	[USB_HS1_SYSTEM_CLK] = &usb_hs1_system_clk.clkr,
1659	[USB_HSIC_XCVR_FS_SRC] = &usb_hsic_xcvr_fs_src.clkr,
1660	[USB_HSIC_XCVR_FS_CLK] = &usb_hsic_xcvr_fs_clk.clkr,
1661	[USB_HSIC_SYSTEM_CLK_SRC] = &usb_hsic_system_src.clkr,
1662	[USB_HSIC_SYSTEM_CLK] = &usb_hsic_system_clk.clkr,
1663	[USB_HSIC_HSIC_CLK_SRC] = &usb_hsic_hsic_src.clkr,
1664	[USB_HSIC_HSIC_CLK] = &usb_hsic_hsic_clk.clkr,
1665	[USB_HSIC_HSIO_CAL_CLK] = &usb_hsic_hsio_cal_clk.clkr,
1666	[CE1_CORE_CLK] = &ce1_core_clk.clkr,
1667	[CE1_H_CLK] = &ce1_h_clk.clkr,
1668	[DMA_BAM_H_CLK] = &dma_bam_h_clk.clkr,
1669	[GSBI1_H_CLK] = &gsbi1_h_clk.clkr,
1670	[GSBI2_H_CLK] = &gsbi2_h_clk.clkr,
1671	[GSBI3_H_CLK] = &gsbi3_h_clk.clkr,
1672	[GSBI4_H_CLK] = &gsbi4_h_clk.clkr,
1673	[GSBI5_H_CLK] = &gsbi5_h_clk.clkr,
1674	[USB_HS1_H_CLK] = &usb_hs1_h_clk.clkr,
1675	[USB_HSIC_H_CLK] = &usb_hsic_h_clk.clkr,
1676	[SDC1_H_CLK] = &sdc1_h_clk.clkr,
1677	[SDC2_H_CLK] = &sdc2_h_clk.clkr,
1678	[ADM0_CLK] = &adm0_clk.clkr,
1679	[ADM0_PBUS_CLK] = &adm0_pbus_clk.clkr,
1680	[PMIC_ARB0_H_CLK] = &pmic_arb0_h_clk.clkr,
1681	[PMIC_ARB1_H_CLK] = &pmic_arb1_h_clk.clkr,
1682	[PMIC_SSBI2_CLK] = &pmic_ssbi2_clk.clkr,
1683	[RPM_MSG_RAM_H_CLK] = &rpm_msg_ram_h_clk.clkr,
1684	[EBI2_CLK] = &ebi2_clk.clkr,
1685	[EBI2_AON_CLK] = &ebi2_aon_clk.clkr,
1686};
1687
1688static const struct qcom_reset_map gcc_mdm9615_resets[] = {
1689	[DMA_BAM_RESET] = { 0x25c0, 7 },
1690	[CE1_H_RESET] = { 0x2720, 7 },
1691	[CE1_CORE_RESET] = { 0x2724, 7 },
1692	[SDC1_RESET] = { 0x2830 },
1693	[SDC2_RESET] = { 0x2850 },
1694	[ADM0_C2_RESET] = { 0x220c, 4 },
1695	[ADM0_C1_RESET] = { 0x220c, 3 },
1696	[ADM0_C0_RESET] = { 0x220c, 2 },
1697	[ADM0_PBUS_RESET] = { 0x220c, 1 },
1698	[ADM0_RESET] = { 0x220c },
1699	[USB_HS1_RESET] = { 0x2910 },
1700	[USB_HSIC_RESET] = { 0x2934 },
1701	[GSBI1_RESET] = { 0x29dc },
1702	[GSBI2_RESET] = { 0x29fc },
1703	[GSBI3_RESET] = { 0x2a1c },
1704	[GSBI4_RESET] = { 0x2a3c },
1705	[GSBI5_RESET] = { 0x2a5c },
1706	[PDM_RESET] = { 0x2CC0, 12 },
1707};
1708
1709static const struct regmap_config gcc_mdm9615_regmap_config = {
1710	.reg_bits	= 32,
1711	.reg_stride	= 4,
1712	.val_bits	= 32,
1713	.max_register	= 0x3660,
1714	.fast_io	= true,
1715};
1716
1717static const struct qcom_cc_desc gcc_mdm9615_desc = {
1718	.config = &gcc_mdm9615_regmap_config,
1719	.clks = gcc_mdm9615_clks,
1720	.num_clks = ARRAY_SIZE(gcc_mdm9615_clks),
1721	.resets = gcc_mdm9615_resets,
1722	.num_resets = ARRAY_SIZE(gcc_mdm9615_resets),
1723};
1724
1725static const struct of_device_id gcc_mdm9615_match_table[] = {
1726	{ .compatible = "qcom,gcc-mdm9615" },
1727	{ }
1728};
1729MODULE_DEVICE_TABLE(of, gcc_mdm9615_match_table);
1730
1731static int gcc_mdm9615_probe(struct platform_device *pdev)
1732{
1733	struct regmap *regmap;
1734
1735	regmap = qcom_cc_map(pdev, &gcc_mdm9615_desc);
1736	if (IS_ERR(regmap))
1737		return PTR_ERR(regmap);
1738
1739	return qcom_cc_really_probe(pdev, &gcc_mdm9615_desc, regmap);
1740}
1741
1742static struct platform_driver gcc_mdm9615_driver = {
1743	.probe		= gcc_mdm9615_probe,
1744	.driver		= {
1745		.name	= "gcc-mdm9615",
1746		.of_match_table = gcc_mdm9615_match_table,
1747	},
1748};
1749
1750static int __init gcc_mdm9615_init(void)
1751{
1752	return platform_driver_register(&gcc_mdm9615_driver);
1753}
1754core_initcall(gcc_mdm9615_init);
1755
1756static void __exit gcc_mdm9615_exit(void)
1757{
1758	platform_driver_unregister(&gcc_mdm9615_driver);
1759}
1760module_exit(gcc_mdm9615_exit);
1761
1762MODULE_DESCRIPTION("QCOM GCC MDM9615 Driver");
1763MODULE_LICENSE("GPL v2");
1764MODULE_ALIAS("platform:gcc-mdm9615");