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