Linux Audio

Check our new training course

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