Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (c) 2020, The Linux Foundation. All rights reserved.
   4 * Copyright (c) 2020, Martin Botka <martin.botka@somainline.org>
   5 * Copyright (c) 2020, Konrad Dybcio <konrad.dybcio@somainline.org>
   6 */
   7
   8#include <linux/kernel.h>
   9#include <linux/bitops.h>
  10#include <linux/err.h>
  11#include <linux/platform_device.h>
  12#include <linux/property.h>
  13#include <linux/module.h>
  14#include <linux/of.h>
  15#include <linux/clk-provider.h>
  16#include <linux/regmap.h>
  17#include <linux/reset-controller.h>
  18#include <linux/clk.h>
  19
  20
  21#include <dt-bindings/clock/qcom,mmcc-sdm660.h>
  22
  23#include "common.h"
  24#include "clk-regmap.h"
  25#include "clk-regmap-divider.h"
  26#include "clk-alpha-pll.h"
  27#include "clk-rcg.h"
  28#include "clk-branch.h"
  29#include "reset.h"
  30#include "gdsc.h"
  31
  32enum {
  33	P_XO,
  34	P_DSI0PLL_BYTE,
  35	P_DSI0PLL,
  36	P_DSI1PLL_BYTE,
  37	P_DSI1PLL,
  38	P_GPLL0,
  39	P_GPLL0_DIV,
  40	P_MMPLL0,
  41	P_MMPLL10,
  42	P_MMPLL3,
  43	P_MMPLL4,
  44	P_MMPLL5,
  45	P_MMPLL6,
  46	P_MMPLL7,
  47	P_MMPLL8,
  48	P_SLEEP_CLK,
  49	P_DP_PHY_PLL_LINK_CLK,
  50	P_DP_PHY_PLL_VCO_DIV,
  51};
  52
  53static const struct parent_map mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map[] = {
  54	{ P_XO, 0 },
  55	{ P_MMPLL0, 1 },
  56	{ P_MMPLL4, 2 },
  57	{ P_MMPLL7, 3 },
  58	{ P_MMPLL8, 4 },
  59	{ P_GPLL0, 5 },
  60	{ P_GPLL0_DIV, 6 },
  61};
  62
  63/* Voteable PLL */
  64static struct clk_alpha_pll mmpll0 = {
  65	.offset = 0xc000,
  66	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  67	.clkr = {
  68		.enable_reg = 0x1f0,
  69		.enable_mask = BIT(0),
  70		.hw.init = &(struct clk_init_data){
  71			.name = "mmpll0",
  72			.parent_data = &(const struct clk_parent_data){
  73				.fw_name = "xo",
  74			},
  75			.num_parents = 1,
  76			.ops = &clk_alpha_pll_ops,
  77		},
  78	},
  79};
  80
  81static struct clk_alpha_pll mmpll6 =  {
  82	.offset = 0xf0,
  83	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
  84	.clkr = {
  85		.enable_reg = 0x1f0,
  86		.enable_mask = BIT(2),
  87		.hw.init = &(struct clk_init_data){
  88			.name = "mmpll6",
  89			.parent_data = &(const struct clk_parent_data){
  90				.fw_name = "xo",
  91			},
  92			.num_parents = 1,
  93			.ops = &clk_alpha_pll_ops,
  94		},
  95	},
  96};
  97
  98/* APSS controlled PLLs */
  99static struct pll_vco vco[] = {
 100	{ 1000000000, 2000000000, 0 },
 101	{ 750000000, 1500000000, 1 },
 102	{ 500000000, 1000000000, 2 },
 103	{ 250000000, 500000000, 3 },
 104};
 105
 106static struct pll_vco mmpll3_vco[] = {
 107	{ 750000000, 1500000000, 1 },
 108};
 109
 110static const struct alpha_pll_config mmpll10_config = {
 111	.l = 0x1e,
 112	.config_ctl_val = 0x00004289,
 113	.main_output_mask = 0x1,
 114};
 115
 116static struct clk_alpha_pll mmpll10 = {
 117	.offset = 0x190,
 118	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
 119	.clkr = {
 120		.hw.init = &(struct clk_init_data){
 121			.name = "mmpll10",
 122			.parent_data = &(const struct clk_parent_data){
 123				.fw_name = "xo",
 124			},
 125			.num_parents = 1,
 126			.ops = &clk_alpha_pll_ops,
 127		},
 128	},
 129};
 130
 131static const struct alpha_pll_config mmpll3_config = {
 132	.l = 0x2e,
 133	.config_ctl_val = 0x4001055b,
 134	.vco_val = 0x1 << 20,
 135	.vco_mask = 0x3 << 20,
 136	.main_output_mask = 0x1,
 137};
 138
 139static struct clk_alpha_pll mmpll3 = {
 140	.offset = 0x0,
 141	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
 142	.vco_table = mmpll3_vco,
 143	.num_vco = ARRAY_SIZE(mmpll3_vco),
 144	.clkr = {
 145		.hw.init = &(struct clk_init_data){
 146			.name = "mmpll3",
 147			.parent_data = &(const struct clk_parent_data){
 148				.fw_name = "xo",
 149			},
 150			.num_parents = 1,
 151			.ops = &clk_alpha_pll_ops,
 152		},
 153	},
 154};
 155
 156static const struct alpha_pll_config mmpll4_config = {
 157	.l = 0x28,
 158	.config_ctl_val = 0x4001055b,
 159	.vco_val = 0x2 << 20,
 160	.vco_mask = 0x3 << 20,
 161	.main_output_mask = 0x1,
 162};
 163
 164static struct clk_alpha_pll mmpll4 = {
 165	.offset = 0x50,
 166	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
 167	.vco_table = vco,
 168	.num_vco = ARRAY_SIZE(vco),
 169	.clkr = {
 170		.hw.init = &(struct clk_init_data){
 171			.name = "mmpll4",
 172			.parent_data = &(const struct clk_parent_data){
 173				.fw_name = "xo",
 174			},
 175			.num_parents = 1,
 176			.ops = &clk_alpha_pll_ops,
 177		},
 178	},
 179};
 180
 181static const struct alpha_pll_config mmpll5_config = {
 182	.l = 0x2a,
 183	.config_ctl_val = 0x4001055b,
 184	.alpha_hi = 0xf8,
 185	.alpha_en_mask = BIT(24),
 186	.vco_val = 0x2 << 20,
 187	.vco_mask = 0x3 << 20,
 188	.main_output_mask = 0x1,
 189};
 190
 191static struct clk_alpha_pll mmpll5 = {
 192	.offset = 0xa0,
 193	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
 194	.vco_table = vco,
 195	.num_vco = ARRAY_SIZE(vco),
 196	.clkr = {
 197		.hw.init = &(struct clk_init_data){
 198			.name = "mmpll5",
 199			.parent_data = &(const struct clk_parent_data){
 200				.fw_name = "xo",
 201			},
 202			.num_parents = 1,
 203			.ops = &clk_alpha_pll_ops,
 204		},
 205	},
 206};
 207
 208static const struct alpha_pll_config mmpll7_config = {
 209	.l = 0x32,
 210	.config_ctl_val = 0x4001055b,
 211	.vco_val = 0x2 << 20,
 212	.vco_mask = 0x3 << 20,
 213	.main_output_mask = 0x1,
 214};
 215
 216static struct clk_alpha_pll mmpll7 = {
 217	.offset = 0x140,
 218	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
 219	.vco_table = vco,
 220	.num_vco = ARRAY_SIZE(vco),
 221	.clkr = {
 222		.hw.init = &(struct clk_init_data){
 223			.name = "mmpll7",
 224			.parent_data = &(const struct clk_parent_data){
 225				.fw_name = "xo",
 226			},
 227			.num_parents = 1,
 228			.ops = &clk_alpha_pll_ops,
 229		},
 230	},
 231};
 232
 233static const struct alpha_pll_config mmpll8_config = {
 234	.l = 0x30,
 235	.alpha_hi = 0x70,
 236	.alpha_en_mask = BIT(24),
 237	.config_ctl_val = 0x4001055b,
 238	.vco_val = 0x2 << 20,
 239	.vco_mask = 0x3 << 20,
 240	.main_output_mask = 0x1,
 241};
 242
 243static struct clk_alpha_pll mmpll8 = {
 244	.offset = 0x1c0,
 245	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
 246	.vco_table = vco,
 247	.num_vco = ARRAY_SIZE(vco),
 248	.clkr = {
 249		.hw.init = &(struct clk_init_data){
 250			.name = "mmpll8",
 251			.parent_data = &(const struct clk_parent_data){
 252				.fw_name = "xo",
 253			},
 254			.num_parents = 1,
 255			.ops = &clk_alpha_pll_ops,
 256		},
 257	},
 258};
 259
 260static const struct clk_parent_data mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div[] = {
 261	{ .fw_name = "xo" },
 262	{ .hw = &mmpll0.clkr.hw },
 263	{ .hw = &mmpll4.clkr.hw },
 264	{ .hw = &mmpll7.clkr.hw },
 265	{ .hw = &mmpll8.clkr.hw },
 266	{ .fw_name = "gpll0" },
 267	{ .fw_name = "gpll0_div" },
 268};
 269
 270static const struct parent_map mmcc_xo_dsibyte_map[] = {
 271	{ P_XO, 0 },
 272	{ P_DSI0PLL_BYTE, 1 },
 273	{ P_DSI1PLL_BYTE, 2 },
 274};
 275
 276static const struct clk_parent_data mmcc_xo_dsibyte[] = {
 277	{ .fw_name = "xo" },
 278	{ .fw_name = "dsi0pllbyte" },
 279	{ .fw_name = "dsi1pllbyte" },
 280};
 281
 282static const struct parent_map mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map[] = {
 283	{ P_XO, 0 },
 284	{ P_MMPLL0, 1 },
 285	{ P_MMPLL4, 2 },
 286	{ P_MMPLL7, 3 },
 287	{ P_MMPLL10, 4 },
 288	{ P_GPLL0, 5 },
 289	{ P_GPLL0_DIV, 6 },
 290};
 291
 292static const struct clk_parent_data mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div[] = {
 293	{ .fw_name = "xo" },
 294	{ .hw = &mmpll0.clkr.hw },
 295	{ .hw = &mmpll4.clkr.hw },
 296	{ .hw = &mmpll7.clkr.hw },
 297	{ .hw = &mmpll10.clkr.hw },
 298	{ .fw_name = "gpll0" },
 299	{ .fw_name = "gpll0_div" },
 300};
 301
 302static const struct parent_map mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map[] = {
 303	{ P_XO, 0 },
 304	{ P_MMPLL4, 1 },
 305	{ P_MMPLL7, 2 },
 306	{ P_MMPLL10, 3 },
 307	{ P_SLEEP_CLK, 4 },
 308	{ P_GPLL0, 5 },
 309	{ P_GPLL0_DIV, 6 },
 310};
 311
 312static const struct clk_parent_data mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div[] = {
 313	{ .fw_name = "xo" },
 314	{ .hw = &mmpll4.clkr.hw },
 315	{ .hw = &mmpll7.clkr.hw },
 316	{ .hw = &mmpll10.clkr.hw },
 317	{ .fw_name = "sleep_clk" },
 318	{ .fw_name = "gpll0" },
 319	{ .fw_name = "gpll0_div" },
 320};
 321
 322static const struct parent_map mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map[] = {
 323	{ P_XO, 0 },
 324	{ P_MMPLL0, 1 },
 325	{ P_MMPLL7, 2 },
 326	{ P_MMPLL10, 3 },
 327	{ P_SLEEP_CLK, 4 },
 328	{ P_GPLL0, 5 },
 329	{ P_GPLL0_DIV, 6 },
 330};
 331
 332static const struct clk_parent_data mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div[] = {
 333	{ .fw_name = "xo" },
 334	{ .hw = &mmpll0.clkr.hw },
 335	{ .hw = &mmpll7.clkr.hw },
 336	{ .hw = &mmpll10.clkr.hw },
 337	{ .fw_name = "sleep_clk" },
 338	{ .fw_name = "gpll0" },
 339	{ .fw_name = "gpll0_div" },
 340};
 341
 342static const struct parent_map mmcc_xo_gpll0_gpll0_div_map[] = {
 343	{ P_XO, 0 },
 344	{ P_GPLL0, 5 },
 345	{ P_GPLL0_DIV, 6 },
 346};
 347
 348static const struct clk_parent_data mmcc_xo_gpll0_gpll0_div[] = {
 349	{ .fw_name = "xo" },
 350	{ .fw_name = "gpll0" },
 351	{ .fw_name = "gpll0_div" },
 352};
 353
 354static const struct parent_map mmcc_xo_dplink_dpvco_map[] = {
 355	{ P_XO, 0 },
 356	{ P_DP_PHY_PLL_LINK_CLK, 1 },
 357	{ P_DP_PHY_PLL_VCO_DIV, 2 },
 358};
 359
 360static const struct clk_parent_data mmcc_xo_dplink_dpvco[] = {
 361	{ .fw_name = "xo" },
 362	{ .fw_name = "dp_link_2x_clk_divsel_five" },
 363	{ .fw_name = "dp_vco_divided_clk_src_mux" },
 364};
 365
 366static const struct parent_map mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div_map[] = {
 367	{ P_XO, 0 },
 368	{ P_MMPLL0, 1 },
 369	{ P_MMPLL5, 2 },
 370	{ P_MMPLL7, 3 },
 371	{ P_GPLL0, 5 },
 372	{ P_GPLL0_DIV, 6 },
 373};
 374
 375static const struct clk_parent_data mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div[] = {
 376	{ .fw_name = "xo" },
 377	{ .hw = &mmpll0.clkr.hw },
 378	{ .hw = &mmpll5.clkr.hw },
 379	{ .hw = &mmpll7.clkr.hw },
 380	{ .fw_name = "gpll0" },
 381	{ .fw_name = "gpll0_div" },
 382};
 383
 384static const struct parent_map mmcc_xo_dsi0pll_dsi1pll_map[] = {
 385	{ P_XO, 0 },
 386	{ P_DSI0PLL, 1 },
 387	{ P_DSI1PLL, 2 },
 388};
 389
 390static const struct clk_parent_data mmcc_xo_dsi0pll_dsi1pll[] = {
 391	{ .fw_name = "xo" },
 392	{ .fw_name = "dsi0pll" },
 393	{ .fw_name = "dsi1pll" },
 394};
 395
 396static const struct parent_map mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0_map[] = {
 397	{ P_XO, 0 },
 398	{ P_MMPLL0, 1 },
 399	{ P_MMPLL4, 2 },
 400	{ P_MMPLL7, 3 },
 401	{ P_MMPLL10, 4 },
 402	{ P_MMPLL6, 5 },
 403	{ P_GPLL0, 6 },
 404};
 405
 406static const struct clk_parent_data mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0[] = {
 407	{ .fw_name = "xo" },
 408	{ .hw = &mmpll0.clkr.hw },
 409	{ .hw = &mmpll4.clkr.hw },
 410	{ .hw = &mmpll7.clkr.hw },
 411	{ .hw = &mmpll10.clkr.hw },
 412	{ .hw = &mmpll6.clkr.hw },
 413	{ .fw_name = "gpll0" },
 414};
 415
 416static const struct parent_map mmcc_xo_mmpll0_gpll0_gpll0_div_map[] = {
 417	{ P_XO, 0 },
 418	{ P_MMPLL0, 1 },
 419	{ P_GPLL0, 5 },
 420	{ P_GPLL0_DIV, 6 },
 421};
 422
 423static const struct clk_parent_data mmcc_xo_mmpll0_gpll0_gpll0_div[] = {
 424	{ .fw_name = "xo" },
 425	{ .hw = &mmpll0.clkr.hw },
 426	{ .fw_name = "gpll0" },
 427	{ .fw_name = "gpll0_div" },
 428};
 429
 430static const struct parent_map mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6_map[] = {
 431	{ P_XO, 0 },
 432	{ P_MMPLL0, 1 },
 433	{ P_MMPLL4, 2 },
 434	{ P_MMPLL7, 3 },
 435	{ P_MMPLL10, 4 },
 436	{ P_GPLL0, 5 },
 437	{ P_MMPLL6, 6 },
 438};
 439
 440static const struct clk_parent_data mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6[] = {
 441	{ .fw_name = "xo" },
 442	{ .hw = &mmpll0.clkr.hw },
 443	{ .hw = &mmpll4.clkr.hw },
 444	{ .hw = &mmpll7.clkr.hw },
 445	{ .hw = &mmpll10.clkr.hw },
 446	{ .fw_name = "gpll0" },
 447	{ .hw = &mmpll6.clkr.hw },
 448};
 449
 450static const struct parent_map mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7_map[] = {
 451	{ P_XO, 0 },
 452	{ P_MMPLL0, 1 },
 453	{ P_MMPLL8, 2 },
 454	{ P_MMPLL3, 3 },
 455	{ P_MMPLL6, 4 },
 456	{ P_GPLL0, 5 },
 457	{ P_MMPLL7, 6 },
 458};
 459
 460static const struct clk_parent_data mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7[] = {
 461	{ .fw_name = "xo" },
 462	{ .hw = &mmpll0.clkr.hw },
 463	{ .hw = &mmpll8.clkr.hw },
 464	{ .hw = &mmpll3.clkr.hw },
 465	{ .hw = &mmpll6.clkr.hw },
 466	{ .fw_name = "gpll0" },
 467	{ .hw = &mmpll7.clkr.hw },
 468};
 469
 470static const struct freq_tbl ftbl_ahb_clk_src[] = {
 471	F(19200000, P_XO, 1, 0, 0),
 472	F(40000000, P_GPLL0_DIV, 7.5, 0, 0),
 473	F(80800000, P_MMPLL0, 10, 0, 0),
 474	{ }
 475};
 476
 477static struct clk_rcg2 ahb_clk_src = {
 478	.cmd_rcgr = 0x5000,
 479	.mnd_width = 0,
 480	.hid_width = 5,
 481	.parent_map = mmcc_xo_mmpll0_gpll0_gpll0_div_map,
 482	.freq_tbl = ftbl_ahb_clk_src,
 483	.clkr.hw.init = &(struct clk_init_data){
 484		.name = "ahb_clk_src",
 485		.parent_data = mmcc_xo_mmpll0_gpll0_gpll0_div,
 486		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_gpll0_gpll0_div),
 487		.ops = &clk_rcg2_ops,
 488	},
 489};
 490
 491static struct clk_rcg2 byte0_clk_src = {
 492	.cmd_rcgr = 0x2120,
 493	.mnd_width = 0,
 494	.hid_width = 5,
 495	.parent_map = mmcc_xo_dsibyte_map,
 496	.clkr.hw.init = &(struct clk_init_data){
 497		.name = "byte0_clk_src",
 498		.parent_data = mmcc_xo_dsibyte,
 499		.num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
 500		.ops = &clk_byte2_ops,
 501		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
 502	},
 503};
 504
 505static struct clk_rcg2 byte1_clk_src = {
 506	.cmd_rcgr = 0x2140,
 507	.mnd_width = 0,
 508	.hid_width = 5,
 509	.parent_map = mmcc_xo_dsibyte_map,
 510	.clkr.hw.init = &(struct clk_init_data){
 511		.name = "byte1_clk_src",
 512		.parent_data = mmcc_xo_dsibyte,
 513		.num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
 514		.ops = &clk_byte2_ops,
 515		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
 516	},
 517};
 518
 519static const struct freq_tbl ftbl_camss_gp0_clk_src[] = {
 520	F(10000, P_XO, 16, 1, 120),
 521	F(24000, P_XO, 16, 1, 50),
 522	F(6000000, P_GPLL0_DIV, 10, 1, 5),
 523	F(12000000, P_GPLL0_DIV, 10, 2, 5),
 524	F(13043478, P_GPLL0_DIV, 1, 1, 23),
 525	F(24000000, P_GPLL0_DIV, 1, 2, 25),
 526	F(50000000, P_GPLL0_DIV, 6, 0, 0),
 527	F(100000000, P_GPLL0_DIV, 3, 0, 0),
 528	F(200000000, P_GPLL0, 3, 0, 0),
 529	{ }
 530};
 531
 532static struct clk_rcg2 camss_gp0_clk_src = {
 533	.cmd_rcgr = 0x3420,
 534	.mnd_width = 8,
 535	.hid_width = 5,
 536	.parent_map = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
 537	.freq_tbl = ftbl_camss_gp0_clk_src,
 538	.clkr.hw.init = &(struct clk_init_data){
 539		.name = "camss_gp0_clk_src",
 540		.parent_data = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
 541		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
 542		.ops = &clk_rcg2_ops,
 543	},
 544};
 545
 546static struct clk_rcg2 camss_gp1_clk_src = {
 547	.cmd_rcgr = 0x3450,
 548	.mnd_width = 8,
 549	.hid_width = 5,
 550	.parent_map = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
 551	.freq_tbl = ftbl_camss_gp0_clk_src,
 552	.clkr.hw.init = &(struct clk_init_data){
 553		.name = "camss_gp1_clk_src",
 554		.parent_data = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
 555		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
 556		.ops = &clk_rcg2_ops,
 557	},
 558};
 559
 560static const struct freq_tbl ftbl_cci_clk_src[] = {
 561	F(37500000, P_GPLL0_DIV, 8, 0, 0),
 562	F(50000000, P_GPLL0_DIV, 6, 0, 0),
 563	F(100000000, P_GPLL0, 6, 0, 0),
 564	{ }
 565};
 566
 567static struct clk_rcg2 cci_clk_src = {
 568	.cmd_rcgr = 0x3300,
 569	.mnd_width = 8,
 570	.hid_width = 5,
 571	.parent_map = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
 572	.freq_tbl = ftbl_cci_clk_src,
 573	.clkr.hw.init = &(struct clk_init_data){
 574		.name = "cci_clk_src",
 575		.parent_data = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
 576		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
 577		.ops = &clk_rcg2_ops,
 578	},
 579};
 580
 581static const struct freq_tbl ftbl_cpp_clk_src[] = {
 582	F(120000000, P_GPLL0, 5, 0, 0),
 583	F(256000000, P_MMPLL4, 3, 0, 0),
 584	F(384000000, P_MMPLL4, 2, 0, 0),
 585	F(480000000, P_MMPLL7, 2, 0, 0),
 586	F(540000000, P_MMPLL6, 2, 0, 0),
 587	F(576000000, P_MMPLL10, 1, 0, 0),
 588	{ }
 589};
 590
 591static struct clk_rcg2 cpp_clk_src = {
 592	.cmd_rcgr = 0x3640,
 593	.mnd_width = 0,
 594	.hid_width = 5,
 595	.parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6_map,
 596	.freq_tbl = ftbl_cpp_clk_src,
 597	.clkr.hw.init = &(struct clk_init_data){
 598		.name = "cpp_clk_src",
 599		.parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6,
 600		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6),
 601		.ops = &clk_rcg2_ops,
 602	},
 603};
 604
 605static const struct freq_tbl ftbl_csi0_clk_src[] = {
 606	F(100000000, P_GPLL0_DIV, 3, 0, 0),
 607	F(200000000, P_GPLL0, 3, 0, 0),
 608	F(310000000, P_MMPLL8, 3, 0, 0),
 609	F(404000000, P_MMPLL0, 2, 0, 0),
 610	F(465000000, P_MMPLL8, 2, 0, 0),
 611	{ }
 612};
 613
 614static struct clk_rcg2 csi0_clk_src = {
 615	.cmd_rcgr = 0x3090,
 616	.mnd_width = 0,
 617	.hid_width = 5,
 618	.parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
 619	.freq_tbl = ftbl_csi0_clk_src,
 620	.clkr.hw.init = &(struct clk_init_data){
 621		.name = "csi0_clk_src",
 622		.parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
 623		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
 624		.ops = &clk_rcg2_ops,
 625	},
 626};
 627
 628static const struct freq_tbl ftbl_csi0phytimer_clk_src[] = {
 629	F(100000000, P_GPLL0_DIV, 3, 0, 0),
 630	F(200000000, P_GPLL0, 3, 0, 0),
 631	F(269333333, P_MMPLL0, 3, 0, 0),
 632	{ }
 633};
 634
 635static struct clk_rcg2 csi0phytimer_clk_src = {
 636	.cmd_rcgr = 0x3000,
 637	.mnd_width = 0,
 638	.hid_width = 5,
 639	.parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
 640	.freq_tbl = ftbl_csi0phytimer_clk_src,
 641	.clkr.hw.init = &(struct clk_init_data){
 642		.name = "csi0phytimer_clk_src",
 643		.parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
 644		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
 645		.ops = &clk_rcg2_ops,
 646	},
 647};
 648
 649static struct clk_rcg2 csi1_clk_src = {
 650	.cmd_rcgr = 0x3100,
 651	.mnd_width = 0,
 652	.hid_width = 5,
 653	.parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
 654	.freq_tbl = ftbl_csi0_clk_src,
 655	.clkr.hw.init = &(struct clk_init_data){
 656		.name = "csi1_clk_src",
 657		.parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
 658		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
 659		.ops = &clk_rcg2_ops,
 660	},
 661};
 662
 663static struct clk_rcg2 csi1phytimer_clk_src = {
 664	.cmd_rcgr = 0x3030,
 665	.mnd_width = 0,
 666	.hid_width = 5,
 667	.parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
 668	.freq_tbl = ftbl_csi0phytimer_clk_src,
 669	.clkr.hw.init = &(struct clk_init_data){
 670		.name = "csi1phytimer_clk_src",
 671		.parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
 672		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
 673		.ops = &clk_rcg2_ops,
 674	},
 675};
 676
 677static struct clk_rcg2 csi2_clk_src = {
 678	.cmd_rcgr = 0x3160,
 679	.mnd_width = 0,
 680	.hid_width = 5,
 681	.parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
 682	.freq_tbl = ftbl_csi0_clk_src,
 683	.clkr.hw.init = &(struct clk_init_data){
 684		.name = "csi2_clk_src",
 685		.parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
 686		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
 687		.ops = &clk_rcg2_ops,
 688	},
 689};
 690
 691static struct clk_rcg2 csi2phytimer_clk_src = {
 692	.cmd_rcgr = 0x3060,
 693	.mnd_width = 0,
 694	.hid_width = 5,
 695	.parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
 696	.freq_tbl = ftbl_csi0phytimer_clk_src,
 697	.clkr.hw.init = &(struct clk_init_data){
 698		.name = "csi2phytimer_clk_src",
 699		.parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
 700		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
 701		.ops = &clk_rcg2_ops,
 702	},
 703};
 704
 705static struct clk_rcg2 csi3_clk_src = {
 706	.cmd_rcgr = 0x31c0,
 707	.mnd_width = 0,
 708	.hid_width = 5,
 709	.parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
 710	.freq_tbl = ftbl_csi0_clk_src,
 711	.clkr.hw.init = &(struct clk_init_data){
 712		.name = "csi3_clk_src",
 713		.parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
 714		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
 715		.ops = &clk_rcg2_ops,
 716	},
 717};
 718
 719static const struct freq_tbl ftbl_csiphy_clk_src[] = {
 720	F(100000000, P_GPLL0_DIV, 3, 0, 0),
 721	F(200000000, P_GPLL0, 3, 0, 0),
 722	F(269333333, P_MMPLL0, 3, 0, 0),
 723	F(320000000, P_MMPLL7, 3, 0, 0),
 724	{ }
 725};
 726
 727static struct clk_rcg2 csiphy_clk_src = {
 728	.cmd_rcgr = 0x3800,
 729	.mnd_width = 0,
 730	.hid_width = 5,
 731	.parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div_map,
 732	.freq_tbl = ftbl_csiphy_clk_src,
 733	.clkr.hw.init = &(struct clk_init_data){
 734		.name = "csiphy_clk_src",
 735		.parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
 736		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
 737		.ops = &clk_rcg2_ops,
 738	},
 739};
 740
 741static const struct freq_tbl ftbl_dp_aux_clk_src[] = {
 742	F(19200000, P_XO, 1, 0, 0),
 743	{ }
 744};
 745
 746static struct clk_rcg2 dp_aux_clk_src = {
 747	.cmd_rcgr = 0x2260,
 748	.mnd_width = 0,
 749	.hid_width = 5,
 750	.parent_map = mmcc_xo_gpll0_gpll0_div_map,
 751	.freq_tbl = ftbl_dp_aux_clk_src,
 752	.clkr.hw.init = &(struct clk_init_data){
 753		.name = "dp_aux_clk_src",
 754		.parent_data = mmcc_xo_gpll0_gpll0_div,
 755		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_gpll0_div),
 756		.ops = &clk_rcg2_ops,
 757	},
 758};
 759
 760static const struct freq_tbl ftbl_dp_crypto_clk_src[] = {
 761	F(101250000, P_DP_PHY_PLL_VCO_DIV, 4, 0, 0),
 762	F(168750000, P_DP_PHY_PLL_VCO_DIV, 4, 0, 0),
 763	F(337500000, P_DP_PHY_PLL_VCO_DIV, 4, 0, 0),
 764	{ }
 765};
 766
 767static struct clk_rcg2 dp_crypto_clk_src = {
 768	.cmd_rcgr = 0x2220,
 769	.mnd_width = 8,
 770	.hid_width = 5,
 771	.parent_map = mmcc_xo_dplink_dpvco_map,
 772	.freq_tbl = ftbl_dp_crypto_clk_src,
 773	.clkr.hw.init = &(struct clk_init_data){
 774		.name = "dp_crypto_clk_src",
 775		.parent_data = mmcc_xo_dplink_dpvco,
 776		.num_parents = ARRAY_SIZE(mmcc_xo_dplink_dpvco),
 777		.ops = &clk_rcg2_ops,
 778	},
 779};
 780
 781static const struct freq_tbl ftbl_dp_gtc_clk_src[] = {
 782	F(40000000, P_GPLL0_DIV, 7.5, 0, 0),
 783	F(60000000, P_GPLL0, 10, 0, 0),
 784	{ }
 785};
 786
 787static struct clk_rcg2 dp_gtc_clk_src = {
 788	.cmd_rcgr = 0x2280,
 789	.mnd_width = 0,
 790	.hid_width = 5,
 791	.parent_map = mmcc_xo_gpll0_gpll0_div_map,
 792	.freq_tbl = ftbl_dp_gtc_clk_src,
 793	.clkr.hw.init = &(struct clk_init_data){
 794		.name = "dp_gtc_clk_src",
 795		.parent_data = mmcc_xo_gpll0_gpll0_div,
 796		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_gpll0_div),
 797		.ops = &clk_rcg2_ops,
 798	},
 799};
 800
 801static const struct freq_tbl ftbl_dp_link_clk_src[] = {
 802	F(162000000, P_DP_PHY_PLL_LINK_CLK, 2, 0, 0),
 803	F(270000000, P_DP_PHY_PLL_LINK_CLK, 2, 0, 0),
 804	F(540000000, P_DP_PHY_PLL_LINK_CLK, 2, 0, 0),
 805	{ }
 806};
 807
 808static struct clk_rcg2 dp_link_clk_src = {
 809	.cmd_rcgr = 0x2200,
 810	.mnd_width = 0,
 811	.hid_width = 5,
 812	.parent_map = mmcc_xo_dplink_dpvco_map,
 813	.freq_tbl = ftbl_dp_link_clk_src,
 814	.clkr.hw.init = &(struct clk_init_data){
 815		.name = "dp_link_clk_src",
 816		.parent_data = mmcc_xo_dplink_dpvco,
 817		.num_parents = ARRAY_SIZE(mmcc_xo_dplink_dpvco),
 818		.ops = &clk_rcg2_ops,
 819		.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
 820	},
 821};
 822
 823static struct clk_rcg2 dp_pixel_clk_src = {
 824	.cmd_rcgr = 0x2240,
 825	.mnd_width = 16,
 826	.hid_width = 5,
 827	.parent_map = mmcc_xo_dplink_dpvco_map,
 828	.clkr.hw.init = &(struct clk_init_data){
 829		.name = "dp_pixel_clk_src",
 830		.parent_data = mmcc_xo_dplink_dpvco,
 831		.num_parents = ARRAY_SIZE(mmcc_xo_dplink_dpvco),
 832		.ops = &clk_dp_ops,
 833		.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
 834	},
 835};
 836
 837static struct clk_rcg2 esc0_clk_src = {
 838	.cmd_rcgr = 0x2160,
 839	.mnd_width = 0,
 840	.hid_width = 5,
 841	.parent_map = mmcc_xo_dsibyte_map,
 842	.clkr.hw.init = &(struct clk_init_data){
 843		.name = "esc0_clk_src",
 844		.parent_data = mmcc_xo_dsibyte,
 845		.num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
 846		.ops = &clk_rcg2_ops,
 847	},
 848};
 849
 850static struct clk_rcg2 esc1_clk_src = {
 851	.cmd_rcgr = 0x2180,
 852	.mnd_width = 0,
 853	.hid_width = 5,
 854	.parent_map = mmcc_xo_dsibyte_map,
 855	.clkr.hw.init = &(struct clk_init_data){
 856		.name = "esc1_clk_src",
 857		.parent_data = mmcc_xo_dsibyte,
 858		.num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
 859		.ops = &clk_rcg2_ops,
 860	},
 861};
 862
 863static const struct freq_tbl ftbl_jpeg0_clk_src[] = {
 864	F(66666667, P_GPLL0_DIV, 4.5, 0, 0),
 865	F(133333333, P_GPLL0, 4.5, 0, 0),
 866	F(219428571, P_MMPLL4, 3.5, 0, 0),
 867	F(320000000, P_MMPLL7, 3, 0, 0),
 868	F(480000000, P_MMPLL7, 2, 0, 0),
 869	{ }
 870};
 871
 872static struct clk_rcg2 jpeg0_clk_src = {
 873	.cmd_rcgr = 0x3500,
 874	.mnd_width = 0,
 875	.hid_width = 5,
 876	.parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
 877	.freq_tbl = ftbl_jpeg0_clk_src,
 878	.clkr.hw.init = &(struct clk_init_data){
 879		.name = "jpeg0_clk_src",
 880		.parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
 881		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
 882		.ops = &clk_rcg2_ops,
 883	},
 884};
 885
 886static const struct freq_tbl ftbl_mclk0_clk_src[] = {
 887	F(4800000, P_XO, 4, 0, 0),
 888	F(6000000, P_GPLL0_DIV, 10, 1, 5),
 889	F(8000000, P_GPLL0_DIV, 1, 2, 75),
 890	F(9600000, P_XO, 2, 0, 0),
 891	F(16666667, P_GPLL0_DIV, 2, 1, 9),
 892	F(19200000, P_XO, 1, 0, 0),
 893	F(24000000, P_MMPLL10, 1, 1, 24),
 894	F(33333333, P_GPLL0_DIV, 1, 1, 9),
 895	F(48000000, P_GPLL0, 1, 2, 25),
 896	F(66666667, P_GPLL0, 1, 1, 9),
 897	{ }
 898};
 899
 900static struct clk_rcg2 mclk0_clk_src = {
 901	.cmd_rcgr = 0x3360,
 902	.mnd_width = 8,
 903	.hid_width = 5,
 904	.parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
 905	.freq_tbl = ftbl_mclk0_clk_src,
 906	.clkr.hw.init = &(struct clk_init_data){
 907		.name = "mclk0_clk_src",
 908		.parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
 909		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
 910		.ops = &clk_rcg2_ops,
 911	},
 912};
 913
 914static struct clk_rcg2 mclk1_clk_src = {
 915	.cmd_rcgr = 0x3390,
 916	.mnd_width = 8,
 917	.hid_width = 5,
 918	.parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
 919	.freq_tbl = ftbl_mclk0_clk_src,
 920	.clkr.hw.init = &(struct clk_init_data){
 921		.name = "mclk1_clk_src",
 922		.parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
 923		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
 924		.ops = &clk_rcg2_ops,
 925	},
 926};
 927
 928static struct clk_rcg2 mclk2_clk_src = {
 929	.cmd_rcgr = 0x33c0,
 930	.mnd_width = 8,
 931	.hid_width = 5,
 932	.parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
 933	.freq_tbl = ftbl_mclk0_clk_src,
 934	.clkr.hw.init = &(struct clk_init_data){
 935		.name = "mclk2_clk_src",
 936		.parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
 937		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
 938		.ops = &clk_rcg2_ops,
 939	},
 940};
 941
 942static struct clk_rcg2 mclk3_clk_src = {
 943	.cmd_rcgr = 0x33f0,
 944	.mnd_width = 8,
 945	.hid_width = 5,
 946	.parent_map = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div_map,
 947	.freq_tbl = ftbl_mclk0_clk_src,
 948	.clkr.hw.init = &(struct clk_init_data){
 949		.name = "mclk3_clk_src",
 950		.parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
 951		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
 952		.ops = &clk_rcg2_ops,
 953	},
 954};
 955
 956static const struct freq_tbl ftbl_mdp_clk_src[] = {
 957	F(100000000, P_GPLL0_DIV, 3, 0, 0),
 958	F(150000000, P_GPLL0_DIV, 2, 0, 0),
 959	F(171428571, P_GPLL0, 3.5, 0, 0),
 960	F(200000000, P_GPLL0, 3, 0, 0),
 961	F(275000000, P_MMPLL5, 3, 0, 0),
 962	F(300000000, P_GPLL0, 2, 0, 0),
 963	F(330000000, P_MMPLL5, 2.5, 0, 0),
 964	F(412500000, P_MMPLL5, 2, 0, 0),
 965	{ }
 966};
 967
 968static struct clk_rcg2 mdp_clk_src = {
 969	.cmd_rcgr = 0x2040,
 970	.mnd_width = 0,
 971	.hid_width = 5,
 972	.parent_map = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div_map,
 973	.freq_tbl = ftbl_mdp_clk_src,
 974	.clkr.hw.init = &(struct clk_init_data){
 975		.name = "mdp_clk_src",
 976		.parent_data = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div,
 977		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div),
 978		.ops = &clk_rcg2_ops,
 979	},
 980};
 981
 982static struct clk_rcg2 pclk0_clk_src = {
 983	.cmd_rcgr = 0x2000,
 984	.mnd_width = 8,
 985	.hid_width = 5,
 986	.parent_map = mmcc_xo_dsi0pll_dsi1pll_map,
 987	.clkr.hw.init = &(struct clk_init_data){
 988		.name = "pclk0_clk_src",
 989		.parent_data = mmcc_xo_dsi0pll_dsi1pll,
 990		.num_parents = ARRAY_SIZE(mmcc_xo_dsi0pll_dsi1pll),
 991		.ops = &clk_pixel_ops,
 992		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
 993	},
 994};
 995
 996static struct clk_rcg2 pclk1_clk_src = {
 997	.cmd_rcgr = 0x2020,
 998	.mnd_width = 8,
 999	.hid_width = 5,
1000	.parent_map = mmcc_xo_dsi0pll_dsi1pll_map,
1001	.clkr.hw.init = &(struct clk_init_data){
1002		.name = "pclk1_clk_src",
1003		.parent_data = mmcc_xo_dsi0pll_dsi1pll,
1004		.num_parents = ARRAY_SIZE(mmcc_xo_dsi0pll_dsi1pll),
1005		.ops = &clk_pixel_ops,
1006		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
1007	},
1008};
1009
1010static const struct freq_tbl ftbl_rot_clk_src[] = {
1011	F(171428571, P_GPLL0, 3.5, 0, 0),
1012	F(275000000, P_MMPLL5, 3, 0, 0),
1013	F(300000000, P_GPLL0, 2, 0, 0),
1014	F(330000000, P_MMPLL5, 2.5, 0, 0),
1015	F(412500000, P_MMPLL5, 2, 0, 0),
1016	{ }
1017};
1018
1019static struct clk_rcg2 rot_clk_src = {
1020	.cmd_rcgr = 0x21a0,
1021	.mnd_width = 0,
1022	.hid_width = 5,
1023	.parent_map = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div_map,
1024	.freq_tbl = ftbl_rot_clk_src,
1025	.clkr.hw.init = &(struct clk_init_data){
1026		.name = "rot_clk_src",
1027		.parent_data = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div,
1028		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div),
1029		.ops = &clk_rcg2_ops,
1030	},
1031};
1032
1033static const struct freq_tbl ftbl_vfe0_clk_src[] = {
1034	F(120000000, P_GPLL0, 5, 0, 0),
1035	F(200000000, P_GPLL0, 3, 0, 0),
1036	F(256000000, P_MMPLL4, 3, 0, 0),
1037	F(300000000, P_GPLL0, 2, 0, 0),
1038	F(404000000, P_MMPLL0, 2, 0, 0),
1039	F(480000000, P_MMPLL7, 2, 0, 0),
1040	F(540000000, P_MMPLL6, 2, 0, 0),
1041	F(576000000, P_MMPLL10, 1, 0, 0),
1042	{ }
1043};
1044
1045static struct clk_rcg2 vfe0_clk_src = {
1046	.cmd_rcgr = 0x3600,
1047	.mnd_width = 0,
1048	.hid_width = 5,
1049	.parent_map = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0_map,
1050	.freq_tbl = ftbl_vfe0_clk_src,
1051	.clkr.hw.init = &(struct clk_init_data){
1052		.name = "vfe0_clk_src",
1053		.parent_data = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0,
1054		.num_parents = ARRAY_SIZE(mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0),
1055		.ops = &clk_rcg2_ops,
1056	},
1057};
1058
1059static struct clk_rcg2 vfe1_clk_src = {
1060	.cmd_rcgr = 0x3620,
1061	.mnd_width = 0,
1062	.hid_width = 5,
1063	.parent_map = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0_map,
1064	.freq_tbl = ftbl_vfe0_clk_src,
1065	.clkr.hw.init = &(struct clk_init_data){
1066		.name = "vfe1_clk_src",
1067		.parent_data = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0,
1068		.num_parents = ARRAY_SIZE(mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0),
1069		.ops = &clk_rcg2_ops,
1070	},
1071};
1072
1073static const struct freq_tbl ftbl_video_core_clk_src[] = {
1074	F(133333333, P_GPLL0, 4.5, 0, 0),
1075	F(269333333, P_MMPLL0, 3, 0, 0),
1076	F(320000000, P_MMPLL7, 3, 0, 0),
1077	F(404000000, P_MMPLL0, 2, 0, 0),
1078	F(441600000, P_MMPLL3, 2, 0, 0),
1079	F(518400000, P_MMPLL3, 2, 0, 0),
1080	{ }
1081};
1082
1083static struct clk_rcg2 video_core_clk_src = {
1084	.cmd_rcgr = 0x1000,
1085	.mnd_width = 0,
1086	.hid_width = 5,
1087	.parent_map = mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7_map,
1088	.freq_tbl = ftbl_video_core_clk_src,
1089	.clkr.hw.init = &(struct clk_init_data){
1090		.name = "video_core_clk_src",
1091		.parent_data = mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7,
1092		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7),
1093		.ops = &clk_rcg2_ops,
1094		.flags = CLK_IS_CRITICAL,
1095	},
1096};
1097
1098static struct clk_rcg2 vsync_clk_src = {
1099	.cmd_rcgr = 0x2080,
1100	.mnd_width = 0,
1101	.hid_width = 5,
1102	.parent_map = mmcc_xo_gpll0_gpll0_div_map,
1103	.freq_tbl = ftbl_dp_aux_clk_src,
1104	.clkr.hw.init = &(struct clk_init_data){
1105		.name = "vsync_clk_src",
1106		.parent_data = mmcc_xo_gpll0_gpll0_div,
1107		.num_parents = ARRAY_SIZE(mmcc_xo_gpll0_gpll0_div),
1108		.ops = &clk_rcg2_ops,
1109	},
1110};
1111
1112static struct clk_branch bimc_smmu_ahb_clk = {
1113	.halt_reg = 0xe004,
1114	.halt_check = BRANCH_VOTED,
1115	.hwcg_reg = 0xe004,
1116	.hwcg_bit = 1,
1117	.clkr = {
1118		.enable_reg = 0xe004,
1119		.enable_mask = BIT(0),
1120		.hw.init = &(struct clk_init_data){
1121			.name = "bimc_smmu_ahb_clk",
1122			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1123			.num_parents = 1,
1124			.ops = &clk_branch2_ops,
1125		},
1126	},
1127};
1128
1129static struct clk_branch bimc_smmu_axi_clk = {
1130	.halt_reg = 0xe008,
1131	.halt_check = BRANCH_VOTED,
1132	.hwcg_reg = 0xe008,
1133	.hwcg_bit = 1,
1134	.clkr = {
1135		.enable_reg = 0xe008,
1136		.enable_mask = BIT(0),
1137		.hw.init = &(struct clk_init_data){
1138			.name = "bimc_smmu_axi_clk",
1139			.ops = &clk_branch2_ops,
1140		},
1141	},
1142};
1143
1144static struct clk_branch camss_ahb_clk = {
1145	.halt_reg = 0x348c,
1146	.halt_check = BRANCH_HALT,
1147	.hwcg_reg = 0x348c,
1148	.hwcg_bit = 1,
1149	.clkr = {
1150		.enable_reg = 0x348c,
1151		.enable_mask = BIT(0),
1152		.hw.init = &(struct clk_init_data){
1153			.name = "camss_ahb_clk",
1154			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1155			.num_parents = 1,
1156			.ops = &clk_branch2_ops,
1157		},
1158	},
1159};
1160
1161static struct clk_branch camss_cci_ahb_clk = {
1162	.halt_reg = 0x3348,
1163	.halt_check = BRANCH_HALT,
1164	.clkr = {
1165		.enable_reg = 0x3348,
1166		.enable_mask = BIT(0),
1167		.hw.init = &(struct clk_init_data){
1168			.name = "camss_cci_ahb_clk",
1169			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1170			.num_parents = 1,
1171			.flags = CLK_SET_RATE_PARENT,
1172			.ops = &clk_branch2_ops,
1173		},
1174	},
1175};
1176
1177static struct clk_branch camss_cci_clk = {
1178	.halt_reg = 0x3344,
1179	.halt_check = BRANCH_HALT,
1180	.clkr = {
1181		.enable_reg = 0x3344,
1182		.enable_mask = BIT(0),
1183		.hw.init = &(struct clk_init_data){
1184			.name = "camss_cci_clk",
1185			.parent_hws = (const struct clk_hw *[]){ &cci_clk_src.clkr.hw },
1186			.num_parents = 1,
1187			.flags = CLK_SET_RATE_PARENT,
1188			.ops = &clk_branch2_ops,
1189		},
1190	},
1191};
1192
1193static struct clk_branch camss_cpp_ahb_clk = {
1194	.halt_reg = 0x36b4,
1195	.halt_check = BRANCH_HALT,
1196	.clkr = {
1197		.enable_reg = 0x36b4,
1198		.enable_mask = BIT(0),
1199		.hw.init = &(struct clk_init_data){
1200			.name = "camss_cpp_ahb_clk",
1201			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1202			.num_parents = 1,
1203			.ops = &clk_branch2_ops,
1204		},
1205	},
1206};
1207
1208static struct clk_branch camss_cpp_axi_clk = {
1209	.halt_reg = 0x36c4,
1210	.halt_check = BRANCH_HALT,
1211	.clkr = {
1212		.enable_reg = 0x36c4,
1213		.enable_mask = BIT(0),
1214		.hw.init = &(struct clk_init_data){
1215			.name = "camss_cpp_axi_clk",
1216			.ops = &clk_branch2_ops,
1217		},
1218	},
1219};
1220
1221static struct clk_branch camss_cpp_clk = {
1222	.halt_reg = 0x36b0,
1223	.halt_check = BRANCH_HALT,
1224	.clkr = {
1225		.enable_reg = 0x36b0,
1226		.enable_mask = BIT(0),
1227		.hw.init = &(struct clk_init_data){
1228			.name = "camss_cpp_clk",
1229			.parent_hws = (const struct clk_hw *[]){ &cpp_clk_src.clkr.hw },
1230			.num_parents = 1,
1231			.flags = CLK_SET_RATE_PARENT,
1232			.ops = &clk_branch2_ops,
1233		},
1234	},
1235};
1236
1237static struct clk_branch camss_cpp_vbif_ahb_clk = {
1238	.halt_reg = 0x36c8,
1239	.halt_check = BRANCH_HALT,
1240	.clkr = {
1241		.enable_reg = 0x36c8,
1242		.enable_mask = BIT(0),
1243		.hw.init = &(struct clk_init_data){
1244			.name = "camss_cpp_vbif_ahb_clk",
1245			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1246			.num_parents = 1,
1247			.ops = &clk_branch2_ops,
1248		},
1249	},
1250};
1251
1252static struct clk_branch camss_csi0_ahb_clk = {
1253	.halt_reg = 0x30bc,
1254	.halt_check = BRANCH_HALT,
1255	.clkr = {
1256		.enable_reg = 0x30bc,
1257		.enable_mask = BIT(0),
1258		.hw.init = &(struct clk_init_data){
1259			.name = "camss_csi0_ahb_clk",
1260			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1261			.num_parents = 1,
1262			.ops = &clk_branch2_ops,
1263		},
1264	},
1265};
1266
1267static struct clk_branch camss_csi0_clk = {
1268	.halt_reg = 0x30b4,
1269	.halt_check = BRANCH_HALT,
1270	.clkr = {
1271		.enable_reg = 0x30b4,
1272		.enable_mask = BIT(0),
1273		.hw.init = &(struct clk_init_data){
1274			.name = "camss_csi0_clk",
1275			.parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
1276			.num_parents = 1,
1277			.flags = CLK_SET_RATE_PARENT,
1278			.ops = &clk_branch2_ops,
1279		},
1280	},
1281};
1282
1283static struct clk_branch camss_csi0phytimer_clk = {
1284	.halt_reg = 0x3024,
1285	.halt_check = BRANCH_HALT,
1286	.clkr = {
1287		.enable_reg = 0x3024,
1288		.enable_mask = BIT(0),
1289		.hw.init = &(struct clk_init_data){
1290			.name = "camss_csi0phytimer_clk",
1291			.parent_hws = (const struct clk_hw *[]){ &csi0phytimer_clk_src.clkr.hw },
1292			.num_parents = 1,
1293			.flags = CLK_SET_RATE_PARENT,
1294			.ops = &clk_branch2_ops,
1295		},
1296	},
1297};
1298
1299static struct clk_branch camss_csi0pix_clk = {
1300	.halt_reg = 0x30e4,
1301	.halt_check = BRANCH_HALT,
1302	.clkr = {
1303		.enable_reg = 0x30e4,
1304		.enable_mask = BIT(0),
1305		.hw.init = &(struct clk_init_data){
1306			.name = "camss_csi0pix_clk",
1307			.parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
1308			.num_parents = 1,
1309			.ops = &clk_branch2_ops,
1310		},
1311	},
1312};
1313
1314static struct clk_branch camss_csi0rdi_clk = {
1315	.halt_reg = 0x30d4,
1316	.halt_check = BRANCH_HALT,
1317	.clkr = {
1318		.enable_reg = 0x30d4,
1319		.enable_mask = BIT(0),
1320		.hw.init = &(struct clk_init_data){
1321			.name = "camss_csi0rdi_clk",
1322			.parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
1323			.num_parents = 1,
1324			.ops = &clk_branch2_ops,
1325		},
1326	},
1327};
1328
1329static struct clk_branch camss_csi1_ahb_clk = {
1330	.halt_reg = 0x3128,
1331	.halt_check = BRANCH_HALT,
1332	.clkr = {
1333		.enable_reg = 0x3128,
1334		.enable_mask = BIT(0),
1335		.hw.init = &(struct clk_init_data){
1336			.name = "camss_csi1_ahb_clk",
1337			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1338			.num_parents = 1,
1339			.ops = &clk_branch2_ops,
1340		},
1341	},
1342};
1343
1344static struct clk_branch camss_csi1_clk = {
1345	.halt_reg = 0x3124,
1346	.halt_check = BRANCH_HALT,
1347	.clkr = {
1348		.enable_reg = 0x3124,
1349		.enable_mask = BIT(0),
1350		.hw.init = &(struct clk_init_data){
1351			.name = "camss_csi1_clk",
1352			.parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1353			.num_parents = 1,
1354			.flags = CLK_SET_RATE_PARENT,
1355			.ops = &clk_branch2_ops,
1356		},
1357	},
1358};
1359
1360static struct clk_branch camss_csi1phytimer_clk = {
1361	.halt_reg = 0x3054,
1362	.halt_check = BRANCH_HALT,
1363	.clkr = {
1364		.enable_reg = 0x3054,
1365		.enable_mask = BIT(0),
1366		.hw.init = &(struct clk_init_data){
1367			.name = "camss_csi1phytimer_clk",
1368			.parent_hws = (const struct clk_hw *[]){ &csi1phytimer_clk_src.clkr.hw },
1369			.num_parents = 1,
1370			.flags = CLK_SET_RATE_PARENT,
1371			.ops = &clk_branch2_ops,
1372		},
1373	},
1374};
1375
1376static struct clk_branch camss_csi1pix_clk = {
1377	.halt_reg = 0x3154,
1378	.halt_check = BRANCH_HALT,
1379	.clkr = {
1380		.enable_reg = 0x3154,
1381		.enable_mask = BIT(0),
1382		.hw.init = &(struct clk_init_data){
1383			.name = "camss_csi1pix_clk",
1384			.parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1385			.num_parents = 1,
1386			.ops = &clk_branch2_ops,
1387		},
1388	},
1389};
1390
1391static struct clk_branch camss_csi1rdi_clk = {
1392	.halt_reg = 0x3144,
1393	.halt_check = BRANCH_HALT,
1394	.clkr = {
1395		.enable_reg = 0x3144,
1396		.enable_mask = BIT(0),
1397		.hw.init = &(struct clk_init_data){
1398			.name = "camss_csi1rdi_clk",
1399			.parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
1400			.num_parents = 1,
1401			.ops = &clk_branch2_ops,
1402		},
1403	},
1404};
1405
1406static struct clk_branch camss_csi2_ahb_clk = {
1407	.halt_reg = 0x3188,
1408	.halt_check = BRANCH_HALT,
1409	.clkr = {
1410		.enable_reg = 0x3188,
1411		.enable_mask = BIT(0),
1412		.hw.init = &(struct clk_init_data){
1413			.name = "camss_csi2_ahb_clk",
1414			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1415			.num_parents = 1,
1416			.ops = &clk_branch2_ops,
1417		},
1418	},
1419};
1420
1421static struct clk_branch camss_csi2_clk = {
1422	.halt_reg = 0x3184,
1423	.halt_check = BRANCH_HALT,
1424	.clkr = {
1425		.enable_reg = 0x3184,
1426		.enable_mask = BIT(0),
1427		.hw.init = &(struct clk_init_data){
1428			.name = "camss_csi2_clk",
1429			.parent_hws = (const struct clk_hw *[]){ &csi2_clk_src.clkr.hw },
1430			.num_parents = 1,
1431			.flags = CLK_SET_RATE_PARENT,
1432			.ops = &clk_branch2_ops,
1433		},
1434	},
1435};
1436
1437static struct clk_branch camss_csi2phytimer_clk = {
1438	.halt_reg = 0x3084,
1439	.halt_check = BRANCH_HALT,
1440	.clkr = {
1441		.enable_reg = 0x3084,
1442		.enable_mask = BIT(0),
1443		.hw.init = &(struct clk_init_data){
1444			.name = "camss_csi2phytimer_clk",
1445			.parent_hws = (const struct clk_hw *[]){ &csi2phytimer_clk_src.clkr.hw },
1446			.num_parents = 1,
1447			.flags = CLK_SET_RATE_PARENT,
1448			.ops = &clk_branch2_ops,
1449		},
1450	},
1451};
1452
1453static struct clk_branch camss_csi2pix_clk = {
1454	.halt_reg = 0x31b4,
1455	.halt_check = BRANCH_HALT,
1456	.clkr = {
1457		.enable_reg = 0x31b4,
1458		.enable_mask = BIT(0),
1459		.hw.init = &(struct clk_init_data){
1460			.name = "camss_csi2pix_clk",
1461			.parent_hws = (const struct clk_hw *[]){ &csi2_clk_src.clkr.hw },
1462			.num_parents = 1,
1463			.ops = &clk_branch2_ops,
1464		},
1465	},
1466};
1467
1468static struct clk_branch camss_csi2rdi_clk = {
1469	.halt_reg = 0x31a4,
1470	.halt_check = BRANCH_HALT,
1471	.clkr = {
1472		.enable_reg = 0x31a4,
1473		.enable_mask = BIT(0),
1474		.hw.init = &(struct clk_init_data){
1475			.name = "camss_csi2rdi_clk",
1476			.parent_hws = (const struct clk_hw *[]){ &csi2_clk_src.clkr.hw },
1477			.num_parents = 1,
1478			.ops = &clk_branch2_ops,
1479		},
1480	},
1481};
1482
1483static struct clk_branch camss_csi3_ahb_clk = {
1484	.halt_reg = 0x31e8,
1485	.halt_check = BRANCH_HALT,
1486	.clkr = {
1487		.enable_reg = 0x31e8,
1488		.enable_mask = BIT(0),
1489		.hw.init = &(struct clk_init_data){
1490			.name = "camss_csi3_ahb_clk",
1491			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1492			.num_parents = 1,
1493			.ops = &clk_branch2_ops,
1494		},
1495	},
1496};
1497
1498static struct clk_branch camss_csi3_clk = {
1499	.halt_reg = 0x31e4,
1500	.halt_check = BRANCH_HALT,
1501	.clkr = {
1502		.enable_reg = 0x31e4,
1503		.enable_mask = BIT(0),
1504		.hw.init = &(struct clk_init_data){
1505			.name = "camss_csi3_clk",
1506			.parent_hws = (const struct clk_hw *[]){ &csi3_clk_src.clkr.hw },
1507			.num_parents = 1,
1508			.flags = CLK_SET_RATE_PARENT,
1509			.ops = &clk_branch2_ops,
1510		},
1511	},
1512};
1513
1514static struct clk_branch camss_csi3pix_clk = {
1515	.halt_reg = 0x3214,
1516	.halt_check = BRANCH_HALT,
1517	.clkr = {
1518		.enable_reg = 0x3214,
1519		.enable_mask = BIT(0),
1520		.hw.init = &(struct clk_init_data){
1521			.name = "camss_csi3pix_clk",
1522			.parent_hws = (const struct clk_hw *[]){ &csi3_clk_src.clkr.hw },
1523			.num_parents = 1,
1524			.ops = &clk_branch2_ops,
1525		},
1526	},
1527};
1528
1529static struct clk_branch camss_csi3rdi_clk = {
1530	.halt_reg = 0x3204,
1531	.halt_check = BRANCH_HALT,
1532	.clkr = {
1533		.enable_reg = 0x3204,
1534		.enable_mask = BIT(0),
1535		.hw.init = &(struct clk_init_data){
1536			.name = "camss_csi3rdi_clk",
1537			.parent_hws = (const struct clk_hw *[]){ &csi3_clk_src.clkr.hw },
1538			.num_parents = 1,
1539			.ops = &clk_branch2_ops,
1540		},
1541	},
1542};
1543
1544static struct clk_branch camss_csi_vfe0_clk = {
1545	.halt_reg = 0x3704,
1546	.halt_check = BRANCH_HALT,
1547	.clkr = {
1548		.enable_reg = 0x3704,
1549		.enable_mask = BIT(0),
1550		.hw.init = &(struct clk_init_data){
1551			.name = "camss_csi_vfe0_clk",
1552			.parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },
1553			.num_parents = 1,
1554			.ops = &clk_branch2_ops,
1555		},
1556	},
1557};
1558
1559static struct clk_branch camss_csi_vfe1_clk = {
1560	.halt_reg = 0x3714,
1561	.halt_check = BRANCH_HALT,
1562	.clkr = {
1563		.enable_reg = 0x3714,
1564		.enable_mask = BIT(0),
1565		.hw.init = &(struct clk_init_data){
1566			.name = "camss_csi_vfe1_clk",
1567			.parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },
1568			.num_parents = 1,
1569			.ops = &clk_branch2_ops,
1570		},
1571	},
1572};
1573
1574static struct clk_branch camss_csiphy0_clk = {
1575	.halt_reg = 0x3740,
1576	.halt_check = BRANCH_HALT,
1577	.clkr = {
1578		.enable_reg = 0x3740,
1579		.enable_mask = BIT(0),
1580		.hw.init = &(struct clk_init_data){
1581			.name = "camss_csiphy0_clk",
1582			.parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },
1583			.num_parents = 1,
1584			.flags = CLK_SET_RATE_PARENT,
1585			.ops = &clk_branch2_ops,
1586		},
1587	},
1588};
1589
1590static struct clk_branch camss_csiphy1_clk = {
1591	.halt_reg = 0x3744,
1592	.halt_check = BRANCH_HALT,
1593	.clkr = {
1594		.enable_reg = 0x3744,
1595		.enable_mask = BIT(0),
1596		.hw.init = &(struct clk_init_data){
1597			.name = "camss_csiphy1_clk",
1598			.parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },
1599			.num_parents = 1,
1600			.flags = CLK_SET_RATE_PARENT,
1601			.ops = &clk_branch2_ops,
1602		},
1603	},
1604};
1605
1606static struct clk_branch camss_csiphy2_clk = {
1607	.halt_reg = 0x3748,
1608	.halt_check = BRANCH_HALT,
1609	.clkr = {
1610		.enable_reg = 0x3748,
1611		.enable_mask = BIT(0),
1612		.hw.init = &(struct clk_init_data){
1613			.name = "camss_csiphy2_clk",
1614			.parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },
1615			.num_parents = 1,
1616			.flags = CLK_SET_RATE_PARENT,
1617			.ops = &clk_branch2_ops,
1618		},
1619	},
1620};
1621
1622
1623static struct clk_branch camss_cphy_csid0_clk = {
1624	.halt_reg = 0x3730,
1625	.halt_check = BRANCH_HALT,
1626	.clkr = {
1627		.enable_reg = 0x3730,
1628		.enable_mask = BIT(0),
1629		.hw.init = &(struct clk_init_data){
1630			.name = "camss_cphy_csid0_clk",
1631			.parent_hws = (const struct clk_hw *[]){ &camss_csiphy0_clk.clkr.hw },
1632			.num_parents = 1,
1633			.flags = CLK_SET_RATE_PARENT,
1634			.ops = &clk_branch2_ops,
1635		},
1636	},
1637};
1638
1639static struct clk_branch camss_cphy_csid1_clk = {
1640	.halt_reg = 0x3734,
1641	.halt_check = BRANCH_HALT,
1642	.clkr = {
1643		.enable_reg = 0x3734,
1644		.enable_mask = BIT(0),
1645		.hw.init = &(struct clk_init_data){
1646			.name = "camss_cphy_csid1_clk",
1647			.parent_hws = (const struct clk_hw *[]){ &camss_csiphy1_clk.clkr.hw },
1648			.num_parents = 1,
1649			.flags = CLK_SET_RATE_PARENT,
1650			.ops = &clk_branch2_ops,
1651		},
1652	},
1653};
1654
1655static struct clk_branch camss_cphy_csid2_clk = {
1656	.halt_reg = 0x3738,
1657	.halt_check = BRANCH_HALT,
1658	.clkr = {
1659		.enable_reg = 0x3738,
1660		.enable_mask = BIT(0),
1661		.hw.init = &(struct clk_init_data){
1662			.name = "camss_cphy_csid2_clk",
1663			.parent_hws = (const struct clk_hw *[]){ &camss_csiphy2_clk.clkr.hw },
1664			.num_parents = 1,
1665			.flags = CLK_SET_RATE_PARENT,
1666			.ops = &clk_branch2_ops,
1667		},
1668	},
1669};
1670
1671static struct clk_branch camss_cphy_csid3_clk = {
1672	.halt_reg = 0x373c,
1673	.halt_check = BRANCH_HALT,
1674	.clkr = {
1675		.enable_reg = 0x373c,
1676		.enable_mask = BIT(0),
1677		.hw.init = &(struct clk_init_data){
1678			.name = "camss_cphy_csid3_clk",
1679			.parent_hws = (const struct clk_hw *[]){ &csiphy_clk_src.clkr.hw },
1680			.num_parents = 1,
1681			.flags = CLK_SET_RATE_PARENT,
1682			.ops = &clk_branch2_ops,
1683		},
1684	},
1685};
1686
1687static struct clk_branch camss_gp0_clk = {
1688	.halt_reg = 0x3444,
1689	.halt_check = BRANCH_HALT,
1690	.clkr = {
1691		.enable_reg = 0x3444,
1692		.enable_mask = BIT(0),
1693		.hw.init = &(struct clk_init_data){
1694			.name = "camss_gp0_clk",
1695			.parent_hws = (const struct clk_hw *[]){ &camss_gp0_clk_src.clkr.hw },
1696			.num_parents = 1,
1697			.flags = CLK_SET_RATE_PARENT,
1698			.ops = &clk_branch2_ops,
1699		},
1700	},
1701};
1702
1703static struct clk_branch camss_gp1_clk = {
1704	.halt_reg = 0x3474,
1705	.halt_check = BRANCH_HALT,
1706	.clkr = {
1707		.enable_reg = 0x3474,
1708		.enable_mask = BIT(0),
1709		.hw.init = &(struct clk_init_data){
1710			.name = "camss_gp1_clk",
1711			.parent_hws = (const struct clk_hw *[]){ &camss_gp1_clk_src.clkr.hw },
1712			.num_parents = 1,
1713			.flags = CLK_SET_RATE_PARENT,
1714			.ops = &clk_branch2_ops,
1715		},
1716	},
1717};
1718
1719static struct clk_branch camss_ispif_ahb_clk = {
1720	.halt_reg = 0x3224,
1721	.halt_check = BRANCH_HALT,
1722	.clkr = {
1723		.enable_reg = 0x3224,
1724		.enable_mask = BIT(0),
1725		.hw.init = &(struct clk_init_data){
1726			.name = "camss_ispif_ahb_clk",
1727			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1728			.num_parents = 1,
1729			.ops = &clk_branch2_ops,
1730		},
1731	},
1732};
1733
1734static struct clk_branch camss_jpeg0_clk = {
1735	.halt_reg = 0x35a8,
1736	.halt_check = BRANCH_HALT,
1737	.clkr = {
1738		.enable_reg = 0x35a8,
1739		.enable_mask = BIT(0),
1740		.hw.init = &(struct clk_init_data){
1741			.name = "camss_jpeg0_clk",
1742			.parent_hws = (const struct clk_hw *[]){ &jpeg0_clk_src.clkr.hw },
1743			.num_parents = 1,
1744			.flags = CLK_SET_RATE_PARENT,
1745			.ops = &clk_branch2_ops,
1746		},
1747	},
1748};
1749
1750static struct clk_branch camss_jpeg_ahb_clk = {
1751	.halt_reg = 0x35b4,
1752	.halt_check = BRANCH_HALT,
1753	.clkr = {
1754		.enable_reg = 0x35b4,
1755		.enable_mask = BIT(0),
1756		.hw.init = &(struct clk_init_data){
1757			.name = "camss_jpeg_ahb_clk",
1758			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1759			.num_parents = 1,
1760			.ops = &clk_branch2_ops,
1761		},
1762	},
1763};
1764
1765static struct clk_branch camss_jpeg_axi_clk = {
1766	.halt_reg = 0x35b8,
1767	.halt_check = BRANCH_HALT,
1768	.clkr = {
1769		.enable_reg = 0x35b8,
1770		.enable_mask = BIT(0),
1771		.hw.init = &(struct clk_init_data){
1772			.name = "camss_jpeg_axi_clk",
1773			.ops = &clk_branch2_ops,
1774		},
1775	},
1776};
1777
1778static struct clk_branch throttle_camss_axi_clk = {
1779	.halt_reg = 0x3c3c,
1780	.halt_check = BRANCH_HALT,
1781	.clkr = {
1782		.enable_reg = 0x3c3c,
1783		.enable_mask = BIT(0),
1784		.hw.init = &(struct clk_init_data){
1785			.name = "throttle_camss_axi_clk",
1786			.ops = &clk_branch2_ops,
1787		},
1788	},
1789};
1790
1791static struct clk_branch camss_mclk0_clk = {
1792	.halt_reg = 0x3384,
1793	.halt_check = BRANCH_HALT,
1794	.clkr = {
1795		.enable_reg = 0x3384,
1796		.enable_mask = BIT(0),
1797		.hw.init = &(struct clk_init_data){
1798			.name = "camss_mclk0_clk",
1799			.parent_hws = (const struct clk_hw *[]){ &mclk0_clk_src.clkr.hw },
1800			.num_parents = 1,
1801			.flags = CLK_SET_RATE_PARENT,
1802			.ops = &clk_branch2_ops,
1803		},
1804	},
1805};
1806
1807static struct clk_branch camss_mclk1_clk = {
1808	.halt_reg = 0x33b4,
1809	.halt_check = BRANCH_HALT,
1810	.clkr = {
1811		.enable_reg = 0x33b4,
1812		.enable_mask = BIT(0),
1813		.hw.init = &(struct clk_init_data){
1814			.name = "camss_mclk1_clk",
1815			.parent_hws = (const struct clk_hw *[]){ &mclk1_clk_src.clkr.hw },
1816			.num_parents = 1,
1817			.flags = CLK_SET_RATE_PARENT,
1818			.ops = &clk_branch2_ops,
1819		},
1820	},
1821};
1822
1823static struct clk_branch camss_mclk2_clk = {
1824	.halt_reg = 0x33e4,
1825	.halt_check = BRANCH_HALT,
1826	.clkr = {
1827		.enable_reg = 0x33e4,
1828		.enable_mask = BIT(0),
1829		.hw.init = &(struct clk_init_data){
1830			.name = "camss_mclk2_clk",
1831			.parent_hws = (const struct clk_hw *[]){ &mclk2_clk_src.clkr.hw },
1832			.num_parents = 1,
1833			.flags = CLK_SET_RATE_PARENT,
1834			.ops = &clk_branch2_ops,
1835		},
1836	},
1837};
1838
1839static struct clk_branch camss_mclk3_clk = {
1840	.halt_reg = 0x3414,
1841	.halt_check = BRANCH_HALT,
1842	.clkr = {
1843		.enable_reg = 0x3414,
1844		.enable_mask = BIT(0),
1845		.hw.init = &(struct clk_init_data){
1846			.name = "camss_mclk3_clk",
1847			.parent_hws = (const struct clk_hw *[]){ &mclk3_clk_src.clkr.hw },
1848			.num_parents = 1,
1849			.flags = CLK_SET_RATE_PARENT,
1850			.ops = &clk_branch2_ops,
1851		},
1852	},
1853};
1854
1855static struct clk_branch camss_micro_ahb_clk = {
1856	.halt_reg = 0x3494,
1857	.halt_check = BRANCH_HALT,
1858	.clkr = {
1859		.enable_reg = 0x3494,
1860		.enable_mask = BIT(0),
1861		.hw.init = &(struct clk_init_data){
1862			.name = "camss_micro_ahb_clk",
1863			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1864			.num_parents = 1,
1865			.ops = &clk_branch2_ops,
1866		},
1867	},
1868};
1869
1870static struct clk_branch camss_top_ahb_clk = {
1871	.halt_reg = 0x3484,
1872	.halt_check = BRANCH_HALT,
1873	.clkr = {
1874		.enable_reg = 0x3484,
1875		.enable_mask = BIT(0),
1876		.hw.init = &(struct clk_init_data){
1877			.name = "camss_top_ahb_clk",
1878			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1879			.num_parents = 1,
1880			.ops = &clk_branch2_ops,
1881		},
1882	},
1883};
1884
1885static struct clk_branch camss_vfe0_ahb_clk = {
1886	.halt_reg = 0x3668,
1887	.halt_check = BRANCH_HALT,
1888	.clkr = {
1889		.enable_reg = 0x3668,
1890		.enable_mask = BIT(0),
1891		.hw.init = &(struct clk_init_data){
1892			.name = "camss_vfe0_ahb_clk",
1893			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1894			.num_parents = 1,
1895			.ops = &clk_branch2_ops,
1896		},
1897	},
1898};
1899
1900static struct clk_branch camss_vfe0_clk = {
1901	.halt_reg = 0x36a8,
1902	.halt_check = BRANCH_HALT,
1903	.clkr = {
1904		.enable_reg = 0x36a8,
1905		.enable_mask = BIT(0),
1906		.hw.init = &(struct clk_init_data){
1907			.name = "camss_vfe0_clk",
1908			.parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },
1909			.num_parents = 1,
1910			.flags = CLK_SET_RATE_PARENT,
1911			.ops = &clk_branch2_ops,
1912		},
1913	},
1914};
1915
1916static struct clk_branch camss_vfe0_stream_clk = {
1917	.halt_reg = 0x3720,
1918	.halt_check = BRANCH_HALT,
1919	.clkr = {
1920		.enable_reg = 0x3720,
1921		.enable_mask = BIT(0),
1922		.hw.init = &(struct clk_init_data){
1923			.name = "camss_vfe0_stream_clk",
1924			.parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },
1925			.num_parents = 1,
1926			.ops = &clk_branch2_ops,
1927		},
1928	},
1929};
1930
1931static struct clk_branch camss_vfe1_ahb_clk = {
1932	.halt_reg = 0x3678,
1933	.halt_check = BRANCH_HALT,
1934	.clkr = {
1935		.enable_reg = 0x3678,
1936		.enable_mask = BIT(0),
1937		.hw.init = &(struct clk_init_data){
1938			.name = "camss_vfe1_ahb_clk",
1939			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1940			.num_parents = 1,
1941			.ops = &clk_branch2_ops,
1942		},
1943	},
1944};
1945
1946static struct clk_branch camss_vfe1_clk = {
1947	.halt_reg = 0x36ac,
1948	.halt_check = BRANCH_HALT,
1949	.clkr = {
1950		.enable_reg = 0x36ac,
1951		.enable_mask = BIT(0),
1952		.hw.init = &(struct clk_init_data){
1953			.name = "camss_vfe1_clk",
1954			.parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },
1955			.num_parents = 1,
1956			.flags = CLK_SET_RATE_PARENT,
1957			.ops = &clk_branch2_ops,
1958		},
1959	},
1960};
1961
1962static struct clk_branch camss_vfe1_stream_clk = {
1963	.halt_reg = 0x3724,
1964	.halt_check = BRANCH_HALT,
1965	.clkr = {
1966		.enable_reg = 0x3724,
1967		.enable_mask = BIT(0),
1968		.hw.init = &(struct clk_init_data){
1969			.name = "camss_vfe1_stream_clk",
1970			.parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },
1971			.num_parents = 1,
1972			.ops = &clk_branch2_ops,
1973		},
1974	},
1975};
1976
1977static struct clk_branch camss_vfe_vbif_ahb_clk = {
1978	.halt_reg = 0x36b8,
1979	.halt_check = BRANCH_HALT,
1980	.clkr = {
1981		.enable_reg = 0x36b8,
1982		.enable_mask = BIT(0),
1983		.hw.init = &(struct clk_init_data){
1984			.name = "camss_vfe_vbif_ahb_clk",
1985			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
1986			.num_parents = 1,
1987			.ops = &clk_branch2_ops,
1988		},
1989	},
1990};
1991
1992static struct clk_branch camss_vfe_vbif_axi_clk = {
1993	.halt_reg = 0x36bc,
1994	.halt_check = BRANCH_HALT,
1995	.clkr = {
1996		.enable_reg = 0x36bc,
1997		.enable_mask = BIT(0),
1998		.hw.init = &(struct clk_init_data){
1999			.name = "camss_vfe_vbif_axi_clk",
2000			.ops = &clk_branch2_ops,
2001		},
2002	},
2003};
2004
2005static struct clk_branch csiphy_ahb2crif_clk = {
2006	.halt_reg = 0x374c,
2007	.halt_check = BRANCH_HALT,
2008	.hwcg_reg = 0x374c,
2009	.hwcg_bit = 1,
2010	.clkr = {
2011		.enable_reg = 0x374c,
2012		.enable_mask = BIT(0),
2013		.hw.init = &(struct clk_init_data){
2014			.name = "csiphy_ahb2crif_clk",
2015			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2016			.num_parents = 1,
2017			.ops = &clk_branch2_ops,
2018		},
2019	},
2020};
2021
2022static struct clk_branch mdss_ahb_clk = {
2023	.halt_reg = 0x2308,
2024	.halt_check = BRANCH_HALT,
2025	.hwcg_reg = 0x8a004,
2026	.hwcg_bit = 1,
2027	.clkr = {
2028		.enable_reg = 0x2308,
2029		.enable_mask = BIT(0),
2030		.hw.init = &(struct clk_init_data){
2031			.name = "mdss_ahb_clk",
2032			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2033			.flags = CLK_SET_RATE_PARENT,
2034			.num_parents = 1,
2035			.ops = &clk_branch2_ops,
2036		},
2037	},
2038};
2039
2040static const struct freq_tbl ftbl_axi_clk_src[] = {
2041		F(75000000, P_GPLL0, 8, 0, 0),
2042		F(171428571, P_GPLL0, 3.5, 0, 0),
2043		F(240000000, P_GPLL0, 2.5, 0, 0),
2044		F(323200000, P_MMPLL0, 2.5, 0, 0),
2045		F(406000000, P_MMPLL0, 2, 0, 0),
2046		{ }
2047};
2048
2049/* RO to linux */
2050static struct clk_rcg2 axi_clk_src = {
2051	.cmd_rcgr = 0xd000,
2052	.hid_width = 5,
2053	.parent_map = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map,
2054	.freq_tbl = ftbl_axi_clk_src,
2055	.clkr.hw.init = &(struct clk_init_data){
2056		.name = "axi_clk_src",
2057		.parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
2058		.num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
2059		.ops = &clk_rcg2_ops,
2060	},
2061};
2062
2063static struct clk_branch mdss_axi_clk = {
2064	.halt_reg = 0x2310,
2065	.halt_check = BRANCH_HALT,
2066	.clkr = {
2067		.enable_reg = 0x2310,
2068		.enable_mask = BIT(0),
2069		.hw.init = &(struct clk_init_data){
2070			.name = "mdss_axi_clk",
2071			.parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
2072			.ops = &clk_branch2_ops,
2073		},
2074	},
2075};
2076
2077static struct clk_branch throttle_mdss_axi_clk = {
2078	.halt_reg = 0x246c,
2079	.halt_check = BRANCH_HALT,
2080	.hwcg_reg = 0x246c,
2081	.hwcg_bit = 1,
2082	.clkr = {
2083		.enable_reg = 0x246c,
2084		.enable_mask = BIT(0),
2085		.hw.init = &(struct clk_init_data){
2086			.name = "throttle_mdss_axi_clk",
2087			.ops = &clk_branch2_ops,
2088		},
2089	},
2090};
2091
2092static struct clk_branch mdss_byte0_clk = {
2093	.halt_reg = 0x233c,
2094	.halt_check = BRANCH_HALT,
2095	.clkr = {
2096		.enable_reg = 0x233c,
2097		.enable_mask = BIT(0),
2098		.hw.init = &(struct clk_init_data){
2099			.name = "mdss_byte0_clk",
2100			.parent_hws = (const struct clk_hw *[]){ &byte0_clk_src.clkr.hw },
2101			.num_parents = 1,
2102			.flags = CLK_SET_RATE_PARENT,
2103			.ops = &clk_branch2_ops,
2104		},
2105	},
2106};
2107
2108static struct clk_regmap_div mdss_byte0_intf_div_clk = {
2109	.reg = 0x237c,
2110	.shift = 0,
2111	.width = 2,
2112	/*
2113	 * NOTE: Op does not work for div-3. Current assumption is that div-3
2114	 * is not a recommended setting for this divider.
2115	 */
2116	.clkr = {
2117		.hw.init = &(struct clk_init_data){
2118			.name = "mdss_byte0_intf_div_clk",
2119			.parent_hws = (const struct clk_hw *[]){ &byte0_clk_src.clkr.hw },
2120			.num_parents = 1,
2121			.ops = &clk_regmap_div_ops,
2122			.flags = CLK_GET_RATE_NOCACHE,
2123		},
2124	},
2125};
2126
2127static struct clk_branch mdss_byte0_intf_clk = {
2128	.halt_reg = 0x2374,
2129	.halt_check = BRANCH_HALT,
2130	.clkr = {
2131		.enable_reg = 0x2374,
2132		.enable_mask = BIT(0),
2133		.hw.init = &(struct clk_init_data){
2134			.name = "mdss_byte0_intf_clk",
2135			.parent_hws = (const struct clk_hw *[]){ &mdss_byte0_intf_div_clk.clkr.hw },
2136			.num_parents = 1,
2137			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
2138			.ops = &clk_branch2_ops,
2139		},
2140	},
2141};
2142
2143static struct clk_branch mdss_byte1_clk = {
2144	.halt_reg = 0x2340,
2145	.halt_check = BRANCH_HALT,
2146	.clkr = {
2147		.enable_reg = 0x2340,
2148		.enable_mask = BIT(0),
2149		.hw.init = &(struct clk_init_data){
2150			.name = "mdss_byte1_clk",
2151			.parent_hws = (const struct clk_hw *[]){ &byte1_clk_src.clkr.hw },
2152			.num_parents = 1,
2153			.flags = CLK_SET_RATE_PARENT,
2154			.ops = &clk_branch2_ops,
2155		},
2156	},
2157};
2158
2159static struct clk_regmap_div mdss_byte1_intf_div_clk = {
2160	.reg = 0x2380,
2161	.shift = 0,
2162	.width = 2,
2163	/*
2164	 * NOTE: Op does not work for div-3. Current assumption is that div-3
2165	 * is not a recommended setting for this divider.
2166	 */
2167	.clkr = {
2168		.hw.init = &(struct clk_init_data){
2169			.name = "mdss_byte1_intf_div_clk",
2170			.parent_hws = (const struct clk_hw *[]){ &byte1_clk_src.clkr.hw },
2171			.num_parents = 1,
2172			.ops = &clk_regmap_div_ops,
2173			.flags = CLK_GET_RATE_NOCACHE,
2174		},
2175	},
2176};
2177
2178static struct clk_branch mdss_byte1_intf_clk = {
2179	.halt_reg = 0x2378,
2180	.halt_check = BRANCH_HALT,
2181	.clkr = {
2182		.enable_reg = 0x2378,
2183		.enable_mask = BIT(0),
2184		.hw.init = &(struct clk_init_data){
2185			.name = "mdss_byte1_intf_clk",
2186			.parent_hws = (const struct clk_hw *[]){ &mdss_byte1_intf_div_clk.clkr.hw },
2187			.num_parents = 1,
2188			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
2189			.ops = &clk_branch2_ops,
2190		},
2191	},
2192};
2193
2194static struct clk_branch mdss_dp_aux_clk = {
2195	.halt_reg = 0x2364,
2196	.halt_check = BRANCH_HALT,
2197	.clkr = {
2198		.enable_reg = 0x2364,
2199		.enable_mask = BIT(0),
2200		.hw.init = &(struct clk_init_data){
2201			.name = "mdss_dp_aux_clk",
2202			.parent_hws = (const struct clk_hw *[]){ &dp_aux_clk_src.clkr.hw },
2203			.num_parents = 1,
2204			.flags = CLK_SET_RATE_PARENT,
2205			.ops = &clk_branch2_ops,
2206		},
2207	},
2208};
2209
2210static struct clk_branch mdss_dp_crypto_clk = {
2211	.halt_reg = 0x235c,
2212	.halt_check = BRANCH_HALT,
2213	.clkr = {
2214		.enable_reg = 0x235c,
2215		.enable_mask = BIT(0),
2216		.hw.init = &(struct clk_init_data){
2217			.name = "mdss_dp_crypto_clk",
2218			.parent_hws = (const struct clk_hw *[]){ &dp_crypto_clk_src.clkr.hw },
2219			.num_parents = 1,
2220			.flags = CLK_SET_RATE_PARENT,
2221			.ops = &clk_branch2_ops,
2222		},
2223	},
2224};
2225
2226static struct clk_branch mdss_dp_gtc_clk = {
2227	.halt_reg = 0x2368,
2228	.halt_check = BRANCH_HALT,
2229	.clkr = {
2230		.enable_reg = 0x2368,
2231		.enable_mask = BIT(0),
2232		.hw.init = &(struct clk_init_data){
2233			.name = "mdss_dp_gtc_clk",
2234			.parent_hws = (const struct clk_hw *[]){ &dp_gtc_clk_src.clkr.hw },
2235			.num_parents = 1,
2236			.flags = CLK_SET_RATE_PARENT,
2237			.ops = &clk_branch2_ops,
2238		},
2239	},
2240};
2241
2242static struct clk_branch mdss_dp_link_clk = {
2243	.halt_reg = 0x2354,
2244	.halt_check = BRANCH_HALT,
2245	.clkr = {
2246		.enable_reg = 0x2354,
2247		.enable_mask = BIT(0),
2248		.hw.init = &(struct clk_init_data){
2249			.name = "mdss_dp_link_clk",
2250			.parent_hws = (const struct clk_hw *[]){ &dp_link_clk_src.clkr.hw },
2251			.num_parents = 1,
2252			.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
2253			.ops = &clk_branch2_ops,
2254		},
2255	},
2256};
2257
2258/* Reset state of MDSS_DP_LINK_INTF_DIV is 0x3 (div-4) */
2259static struct clk_branch mdss_dp_link_intf_clk = {
2260	.halt_reg = 0x2358,
2261	.halt_check = BRANCH_HALT,
2262	.clkr = {
2263		.enable_reg = 0x2358,
2264		.enable_mask = BIT(0),
2265		.hw.init = &(struct clk_init_data){
2266			.name = "mdss_dp_link_intf_clk",
2267			.parent_hws = (const struct clk_hw *[]){ &dp_link_clk_src.clkr.hw },
2268			.num_parents = 1,
2269			.ops = &clk_branch2_ops,
2270		},
2271	},
2272};
2273
2274static struct clk_branch mdss_dp_pixel_clk = {
2275	.halt_reg = 0x2360,
2276	.halt_check = BRANCH_HALT,
2277	.clkr = {
2278		.enable_reg = 0x2360,
2279		.enable_mask = BIT(0),
2280		.hw.init = &(struct clk_init_data){
2281			.name = "mdss_dp_pixel_clk",
2282			.parent_hws = (const struct clk_hw *[]){ &dp_pixel_clk_src.clkr.hw },
2283			.num_parents = 1,
2284			.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
2285			.ops = &clk_branch2_ops,
2286		},
2287	},
2288};
2289
2290static struct clk_branch mdss_esc0_clk = {
2291	.halt_reg = 0x2344,
2292	.halt_check = BRANCH_HALT,
2293	.clkr = {
2294		.enable_reg = 0x2344,
2295		.enable_mask = BIT(0),
2296		.hw.init = &(struct clk_init_data){
2297			.name = "mdss_esc0_clk",
2298			.parent_hws = (const struct clk_hw *[]){ &esc0_clk_src.clkr.hw },
2299			.num_parents = 1,
2300			.flags = CLK_SET_RATE_PARENT,
2301			.ops = &clk_branch2_ops,
2302		},
2303	},
2304};
2305
2306static struct clk_branch mdss_esc1_clk = {
2307	.halt_reg = 0x2348,
2308	.halt_check = BRANCH_HALT,
2309	.clkr = {
2310		.enable_reg = 0x2348,
2311		.enable_mask = BIT(0),
2312		.hw.init = &(struct clk_init_data){
2313			.name = "mdss_esc1_clk",
2314			.parent_hws = (const struct clk_hw *[]){ &esc1_clk_src.clkr.hw },
2315			.num_parents = 1,
2316			.flags = CLK_SET_RATE_PARENT,
2317			.ops = &clk_branch2_ops,
2318		},
2319	},
2320};
2321
2322static struct clk_branch mdss_hdmi_dp_ahb_clk = {
2323	.halt_reg = 0x230c,
2324	.halt_check = BRANCH_HALT,
2325	.clkr = {
2326		.enable_reg = 0x230c,
2327		.enable_mask = BIT(0),
2328		.hw.init = &(struct clk_init_data){
2329			.name = "mdss_hdmi_dp_ahb_clk",
2330			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2331			.num_parents = 1,
2332			.ops = &clk_branch2_ops,
2333		},
2334	},
2335};
2336
2337static struct clk_branch mdss_mdp_clk = {
2338	.halt_reg = 0x231c,
2339	.halt_check = BRANCH_HALT,
2340	.clkr = {
2341		.enable_reg = 0x231c,
2342		.enable_mask = BIT(0),
2343		.hw.init = &(struct clk_init_data){
2344			.name = "mdss_mdp_clk",
2345			.parent_hws = (const struct clk_hw *[]){ &mdp_clk_src.clkr.hw },
2346			.num_parents = 1,
2347			.flags = CLK_SET_RATE_PARENT,
2348			.ops = &clk_branch2_ops,
2349		},
2350	},
2351};
2352
2353static struct clk_branch mdss_pclk0_clk = {
2354	.halt_reg = 0x2314,
2355	.halt_check = BRANCH_HALT,
2356	.clkr = {
2357		.enable_reg = 0x2314,
2358		.enable_mask = BIT(0),
2359		.hw.init = &(struct clk_init_data){
2360			.name = "mdss_pclk0_clk",
2361			.parent_hws = (const struct clk_hw *[]){ &pclk0_clk_src.clkr.hw },
2362			.num_parents = 1,
2363			.flags = CLK_SET_RATE_PARENT,
2364			.ops = &clk_branch2_ops,
2365		},
2366	},
2367};
2368
2369static struct clk_branch mdss_pclk1_clk = {
2370	.halt_reg = 0x2318,
2371	.halt_check = BRANCH_HALT,
2372	.clkr = {
2373		.enable_reg = 0x2318,
2374		.enable_mask = BIT(0),
2375		.hw.init = &(struct clk_init_data){
2376			.name = "mdss_pclk1_clk",
2377			.parent_hws = (const struct clk_hw *[]){ &pclk1_clk_src.clkr.hw },
2378			.num_parents = 1,
2379			.flags = CLK_SET_RATE_PARENT,
2380			.ops = &clk_branch2_ops,
2381		},
2382	},
2383};
2384
2385static struct clk_branch mdss_rot_clk = {
2386	.halt_reg = 0x2350,
2387	.halt_check = BRANCH_HALT,
2388	.clkr = {
2389		.enable_reg = 0x2350,
2390		.enable_mask = BIT(0),
2391		.hw.init = &(struct clk_init_data){
2392			.name = "mdss_rot_clk",
2393			.parent_hws = (const struct clk_hw *[]){ &rot_clk_src.clkr.hw },
2394			.num_parents = 1,
2395			.flags = CLK_SET_RATE_PARENT,
2396			.ops = &clk_branch2_ops,
2397		},
2398	},
2399};
2400
2401static struct clk_branch mdss_vsync_clk = {
2402	.halt_reg = 0x2328,
2403	.halt_check = BRANCH_HALT,
2404	.clkr = {
2405		.enable_reg = 0x2328,
2406		.enable_mask = BIT(0),
2407		.hw.init = &(struct clk_init_data){
2408			.name = "mdss_vsync_clk",
2409			.parent_hws = (const struct clk_hw *[]){ &vsync_clk_src.clkr.hw },
2410			.num_parents = 1,
2411			.flags = CLK_SET_RATE_PARENT,
2412			.ops = &clk_branch2_ops,
2413		},
2414	},
2415};
2416
2417static struct clk_branch mnoc_ahb_clk = {
2418	.halt_reg = 0x5024,
2419	.halt_check = BRANCH_VOTED,
2420	.clkr = {
2421		.enable_reg = 0x5024,
2422		.enable_mask = BIT(0),
2423		.hw.init = &(struct clk_init_data){
2424			.name = "mnoc_ahb_clk",
2425			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2426			.num_parents = 1,
2427			.flags = CLK_SET_RATE_PARENT,
2428			.ops = &clk_branch2_ops,
2429		},
2430	},
2431};
2432
2433static struct clk_branch misc_ahb_clk = {
2434	.halt_reg = 0x328,
2435	.halt_check = BRANCH_HALT,
2436	.hwcg_reg = 0x328,
2437	.hwcg_bit = 1,
2438	.clkr = {
2439		.enable_reg = 0x328,
2440		.enable_mask = BIT(0),
2441		.hw.init = &(struct clk_init_data){
2442			.name = "misc_ahb_clk",
2443			/*
2444			 * Dependency to be enabled before the branch is
2445			 * enabled.
2446			 */
2447			.parent_hws = (const struct clk_hw *[]){ &mnoc_ahb_clk.clkr.hw },
2448			.num_parents = 1,
2449			.ops = &clk_branch2_ops,
2450		},
2451	},
2452};
2453
2454static struct clk_branch misc_cxo_clk = {
2455	.halt_reg = 0x324,
2456	.halt_check = BRANCH_HALT,
2457	.clkr = {
2458		.enable_reg = 0x324,
2459		.enable_mask = BIT(0),
2460		.hw.init = &(struct clk_init_data){
2461			.name = "misc_cxo_clk",
2462			.parent_data = &(const struct clk_parent_data){
2463				.fw_name = "xo",
2464			},
2465			.num_parents = 1,
2466			.ops = &clk_branch2_ops,
2467		},
2468	},
2469};
2470
2471static struct clk_branch snoc_dvm_axi_clk = {
2472	.halt_reg = 0xe040,
2473	.halt_check = BRANCH_HALT,
2474	.clkr = {
2475		.enable_reg = 0xe040,
2476		.enable_mask = BIT(0),
2477		.hw.init = &(struct clk_init_data){
2478			.name = "snoc_dvm_axi_clk",
2479			.ops = &clk_branch2_ops,
2480		},
2481	},
2482};
2483
2484static struct clk_branch video_ahb_clk = {
2485	.halt_reg = 0x1030,
2486	.halt_check = BRANCH_HALT,
2487	.hwcg_reg = 0x1030,
2488	.hwcg_bit = 1,
2489	.clkr = {
2490		.enable_reg = 0x1030,
2491		.enable_mask = BIT(0),
2492		.hw.init = &(struct clk_init_data){
2493			.name = "video_ahb_clk",
2494			.parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
2495			.num_parents = 1,
2496			.ops = &clk_branch2_ops,
2497		},
2498	},
2499};
2500
2501static struct clk_branch video_axi_clk = {
2502	.halt_reg = 0x1034,
2503	.halt_check = BRANCH_HALT,
2504	.clkr = {
2505		.enable_reg = 0x1034,
2506		.enable_mask = BIT(0),
2507		.hw.init = &(struct clk_init_data){
2508			.name = "video_axi_clk",
2509			.ops = &clk_branch2_ops,
2510		},
2511	},
2512};
2513
2514static struct clk_branch throttle_video_axi_clk = {
2515	.halt_reg = 0x118c,
2516	.halt_check = BRANCH_HALT,
2517	.hwcg_reg = 0x118c,
2518	.hwcg_bit = 1,
2519	.clkr = {
2520		.enable_reg = 0x118c,
2521		.enable_mask = BIT(0),
2522		.hw.init = &(struct clk_init_data){
2523			.name = "throttle_video_axi_clk",
2524			.ops = &clk_branch2_ops,
2525		},
2526	},
2527};
2528
2529static struct clk_branch video_core_clk = {
2530	.halt_reg = 0x1028,
2531	.halt_check = BRANCH_HALT,
2532	.clkr = {
2533		.enable_reg = 0x1028,
2534		.enable_mask = BIT(0),
2535		.hw.init = &(struct clk_init_data){
2536			.name = "video_core_clk",
2537			.parent_hws = (const struct clk_hw *[]){ &video_core_clk_src.clkr.hw },
2538			.num_parents = 1,
2539			.flags = CLK_SET_RATE_PARENT,
2540			.ops = &clk_branch2_ops,
2541		},
2542	},
2543};
2544
2545static struct clk_branch video_subcore0_clk = {
2546	.halt_reg = 0x1048,
2547	.halt_check = BRANCH_HALT,
2548	.clkr = {
2549		.enable_reg = 0x1048,
2550		.enable_mask = BIT(0),
2551		.hw.init = &(struct clk_init_data){
2552			.name = "video_subcore0_clk",
2553			.parent_hws = (const struct clk_hw *[]){ &video_core_clk_src.clkr.hw },
2554			.num_parents = 1,
2555			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
2556			.ops = &clk_branch2_ops,
2557		},
2558	},
2559};
2560
2561static struct gdsc venus_gdsc = {
2562	.gdscr = 0x1024,
2563	.cxcs = (unsigned int[]){ 0x1028, 0x1034, 0x1048 },
2564	.cxc_count = 3,
2565	.pd = {
2566		.name = "venus",
2567	},
2568	.pwrsts = PWRSTS_OFF_ON,
2569};
2570
2571static struct gdsc venus_core0_gdsc = {
2572	.gdscr = 0x1040,
2573	.pd = {
2574		.name = "venus_core0",
2575	},
2576	.parent = &venus_gdsc.pd,
2577	.pwrsts = PWRSTS_OFF_ON,
2578	.flags = HW_CTRL,
2579};
2580
2581static struct gdsc mdss_gdsc = {
2582	.gdscr = 0x2304,
2583	.pd = {
2584		.name = "mdss",
2585	},
2586	.cxcs = (unsigned int []){ 0x2040 },
2587	.cxc_count = 1,
2588	.pwrsts = PWRSTS_OFF_ON,
2589};
2590
2591static struct gdsc camss_top_gdsc = {
2592	.gdscr = 0x34a0,
2593	.pd = {
2594		.name = "camss_top",
2595	},
2596	.pwrsts = PWRSTS_OFF_ON,
2597};
2598
2599static struct gdsc camss_vfe0_gdsc = {
2600	.gdscr = 0x3664,
2601	.pd = {
2602		.name = "camss_vfe0",
2603	},
2604	.parent = &camss_top_gdsc.pd,
2605	.pwrsts = PWRSTS_OFF_ON,
2606};
2607
2608static struct gdsc camss_vfe1_gdsc = {
2609	.gdscr = 0x3674,
2610	.pd = {
2611		.name = "camss_vfe1_gdsc",
2612	},
2613	.parent = &camss_top_gdsc.pd,
2614	.pwrsts = PWRSTS_OFF_ON,
2615};
2616
2617static struct gdsc camss_cpp_gdsc = {
2618	.gdscr = 0x36d4,
2619	.pd = {
2620		.name = "camss_cpp",
2621	},
2622	.parent = &camss_top_gdsc.pd,
2623	.pwrsts = PWRSTS_OFF_ON,
2624};
2625
2626/* This GDSC seems to hang the whole multimedia subsystem.
2627static struct gdsc bimc_smmu_gdsc = {
2628	.gdscr = 0xe020,
2629	.gds_hw_ctrl = 0xe024,
2630	.pd = {
2631		.name = "bimc_smmu",
2632	},
2633	.pwrsts = PWRSTS_OFF_ON,
2634	.parent = &bimc_smmu_gdsc.pd,
2635	.flags = HW_CTRL,
2636};
2637*/
2638
2639static struct clk_regmap *mmcc_660_clocks[] = {
2640	[AHB_CLK_SRC] = &ahb_clk_src.clkr,
2641	[BYTE0_CLK_SRC] = &byte0_clk_src.clkr,
2642	[BYTE1_CLK_SRC] = &byte1_clk_src.clkr,
2643	[CAMSS_GP0_CLK_SRC] = &camss_gp0_clk_src.clkr,
2644	[CAMSS_GP1_CLK_SRC] = &camss_gp1_clk_src.clkr,
2645	[CCI_CLK_SRC] = &cci_clk_src.clkr,
2646	[CPP_CLK_SRC] = &cpp_clk_src.clkr,
2647	[CSI0_CLK_SRC] = &csi0_clk_src.clkr,
2648	[CSI0PHYTIMER_CLK_SRC] = &csi0phytimer_clk_src.clkr,
2649	[CSI1_CLK_SRC] = &csi1_clk_src.clkr,
2650	[CSI1PHYTIMER_CLK_SRC] = &csi1phytimer_clk_src.clkr,
2651	[CSI2_CLK_SRC] = &csi2_clk_src.clkr,
2652	[CSI2PHYTIMER_CLK_SRC] = &csi2phytimer_clk_src.clkr,
2653	[CSI3_CLK_SRC] = &csi3_clk_src.clkr,
2654	[CSIPHY_CLK_SRC] = &csiphy_clk_src.clkr,
2655	[DP_AUX_CLK_SRC] = &dp_aux_clk_src.clkr,
2656	[DP_CRYPTO_CLK_SRC] = &dp_crypto_clk_src.clkr,
2657	[DP_GTC_CLK_SRC] = &dp_gtc_clk_src.clkr,
2658	[DP_LINK_CLK_SRC] = &dp_link_clk_src.clkr,
2659	[DP_PIXEL_CLK_SRC] = &dp_pixel_clk_src.clkr,
2660	[ESC0_CLK_SRC] = &esc0_clk_src.clkr,
2661	[ESC1_CLK_SRC] = &esc1_clk_src.clkr,
2662	[JPEG0_CLK_SRC] = &jpeg0_clk_src.clkr,
2663	[MCLK0_CLK_SRC] = &mclk0_clk_src.clkr,
2664	[MCLK1_CLK_SRC] = &mclk1_clk_src.clkr,
2665	[MCLK2_CLK_SRC] = &mclk2_clk_src.clkr,
2666	[MCLK3_CLK_SRC] = &mclk3_clk_src.clkr,
2667	[MDP_CLK_SRC] = &mdp_clk_src.clkr,
2668	[MMPLL0_PLL] = &mmpll0.clkr,
2669	[MMPLL10_PLL] = &mmpll10.clkr,
2670	[MMPLL3_PLL] = &mmpll3.clkr,
2671	[MMPLL4_PLL] = &mmpll4.clkr,
2672	[MMPLL5_PLL] = &mmpll5.clkr,
2673	[MMPLL6_PLL] = &mmpll6.clkr,
2674	[MMPLL7_PLL] = &mmpll7.clkr,
2675	[MMPLL8_PLL] = &mmpll8.clkr,
2676	[BIMC_SMMU_AHB_CLK] = &bimc_smmu_ahb_clk.clkr,
2677	[BIMC_SMMU_AXI_CLK] = &bimc_smmu_axi_clk.clkr,
2678	[CAMSS_AHB_CLK] = &camss_ahb_clk.clkr,
2679	[CAMSS_CCI_AHB_CLK] = &camss_cci_ahb_clk.clkr,
2680	[CAMSS_CCI_CLK] = &camss_cci_clk.clkr,
2681	[CAMSS_CPHY_CSID0_CLK] = &camss_cphy_csid0_clk.clkr,
2682	[CAMSS_CPHY_CSID1_CLK] = &camss_cphy_csid1_clk.clkr,
2683	[CAMSS_CPHY_CSID2_CLK] = &camss_cphy_csid2_clk.clkr,
2684	[CAMSS_CPHY_CSID3_CLK] = &camss_cphy_csid3_clk.clkr,
2685	[CAMSS_CPP_AHB_CLK] = &camss_cpp_ahb_clk.clkr,
2686	[CAMSS_CPP_AXI_CLK] = &camss_cpp_axi_clk.clkr,
2687	[CAMSS_CPP_CLK] = &camss_cpp_clk.clkr,
2688	[CAMSS_CPP_VBIF_AHB_CLK] = &camss_cpp_vbif_ahb_clk.clkr,
2689	[CAMSS_CSI0_AHB_CLK] = &camss_csi0_ahb_clk.clkr,
2690	[CAMSS_CSI0_CLK] = &camss_csi0_clk.clkr,
2691	[CAMSS_CSI0PHYTIMER_CLK] = &camss_csi0phytimer_clk.clkr,
2692	[CAMSS_CSI0PIX_CLK] = &camss_csi0pix_clk.clkr,
2693	[CAMSS_CSI0RDI_CLK] = &camss_csi0rdi_clk.clkr,
2694	[CAMSS_CSI1_AHB_CLK] = &camss_csi1_ahb_clk.clkr,
2695	[CAMSS_CSI1_CLK] = &camss_csi1_clk.clkr,
2696	[CAMSS_CSI1PHYTIMER_CLK] = &camss_csi1phytimer_clk.clkr,
2697	[CAMSS_CSI1PIX_CLK] = &camss_csi1pix_clk.clkr,
2698	[CAMSS_CSI1RDI_CLK] = &camss_csi1rdi_clk.clkr,
2699	[CAMSS_CSI2_AHB_CLK] = &camss_csi2_ahb_clk.clkr,
2700	[CAMSS_CSI2_CLK] = &camss_csi2_clk.clkr,
2701	[CAMSS_CSI2PHYTIMER_CLK] = &camss_csi2phytimer_clk.clkr,
2702	[CAMSS_CSI2PIX_CLK] = &camss_csi2pix_clk.clkr,
2703	[CAMSS_CSI2RDI_CLK] = &camss_csi2rdi_clk.clkr,
2704	[CAMSS_CSI3_AHB_CLK] = &camss_csi3_ahb_clk.clkr,
2705	[CAMSS_CSI3_CLK] = &camss_csi3_clk.clkr,
2706	[CAMSS_CSI3PIX_CLK] = &camss_csi3pix_clk.clkr,
2707	[CAMSS_CSI3RDI_CLK] = &camss_csi3rdi_clk.clkr,
2708	[CAMSS_CSI_VFE0_CLK] = &camss_csi_vfe0_clk.clkr,
2709	[CAMSS_CSI_VFE1_CLK] = &camss_csi_vfe1_clk.clkr,
2710	[CAMSS_CSIPHY0_CLK] = &camss_csiphy0_clk.clkr,
2711	[CAMSS_CSIPHY1_CLK] = &camss_csiphy1_clk.clkr,
2712	[CAMSS_CSIPHY2_CLK] = &camss_csiphy2_clk.clkr,
2713	[CAMSS_GP0_CLK] = &camss_gp0_clk.clkr,
2714	[CAMSS_GP1_CLK] = &camss_gp1_clk.clkr,
2715	[CAMSS_ISPIF_AHB_CLK] = &camss_ispif_ahb_clk.clkr,
2716	[CAMSS_JPEG0_CLK] = &camss_jpeg0_clk.clkr,
2717	[CAMSS_JPEG_AHB_CLK] = &camss_jpeg_ahb_clk.clkr,
2718	[CAMSS_JPEG_AXI_CLK] = &camss_jpeg_axi_clk.clkr,
2719	[CAMSS_MCLK0_CLK] = &camss_mclk0_clk.clkr,
2720	[CAMSS_MCLK1_CLK] = &camss_mclk1_clk.clkr,
2721	[CAMSS_MCLK2_CLK] = &camss_mclk2_clk.clkr,
2722	[CAMSS_MCLK3_CLK] = &camss_mclk3_clk.clkr,
2723	[CAMSS_MICRO_AHB_CLK] = &camss_micro_ahb_clk.clkr,
2724	[CAMSS_TOP_AHB_CLK] = &camss_top_ahb_clk.clkr,
2725	[CAMSS_VFE0_AHB_CLK] = &camss_vfe0_ahb_clk.clkr,
2726	[CAMSS_VFE0_CLK] = &camss_vfe0_clk.clkr,
2727	[CAMSS_VFE0_STREAM_CLK] = &camss_vfe0_stream_clk.clkr,
2728	[CAMSS_VFE1_AHB_CLK] = &camss_vfe1_ahb_clk.clkr,
2729	[CAMSS_VFE1_CLK] = &camss_vfe1_clk.clkr,
2730	[CAMSS_VFE1_STREAM_CLK] = &camss_vfe1_stream_clk.clkr,
2731	[CAMSS_VFE_VBIF_AHB_CLK] = &camss_vfe_vbif_ahb_clk.clkr,
2732	[CAMSS_VFE_VBIF_AXI_CLK] = &camss_vfe_vbif_axi_clk.clkr,
2733	[CSIPHY_AHB2CRIF_CLK] = &csiphy_ahb2crif_clk.clkr,
2734	[MDSS_AHB_CLK] = &mdss_ahb_clk.clkr,
2735	[MDSS_AXI_CLK] = &mdss_axi_clk.clkr,
2736	[MDSS_BYTE0_CLK] = &mdss_byte0_clk.clkr,
2737	[MDSS_BYTE0_INTF_CLK] = &mdss_byte0_intf_clk.clkr,
2738	[MDSS_BYTE0_INTF_DIV_CLK] = &mdss_byte0_intf_div_clk.clkr,
2739	[MDSS_BYTE1_CLK] = &mdss_byte1_clk.clkr,
2740	[MDSS_BYTE1_INTF_CLK] = &mdss_byte1_intf_clk.clkr,
2741	[MDSS_DP_AUX_CLK] = &mdss_dp_aux_clk.clkr,
2742	[MDSS_DP_CRYPTO_CLK] = &mdss_dp_crypto_clk.clkr,
2743	[MDSS_DP_GTC_CLK] = &mdss_dp_gtc_clk.clkr,
2744	[MDSS_DP_LINK_CLK] = &mdss_dp_link_clk.clkr,
2745	[MDSS_DP_LINK_INTF_CLK] = &mdss_dp_link_intf_clk.clkr,
2746	[MDSS_DP_PIXEL_CLK] = &mdss_dp_pixel_clk.clkr,
2747	[MDSS_ESC0_CLK] = &mdss_esc0_clk.clkr,
2748	[MDSS_ESC1_CLK] = &mdss_esc1_clk.clkr,
2749	[MDSS_HDMI_DP_AHB_CLK] = &mdss_hdmi_dp_ahb_clk.clkr,
2750	[MDSS_MDP_CLK] = &mdss_mdp_clk.clkr,
2751	[MDSS_PCLK0_CLK] = &mdss_pclk0_clk.clkr,
2752	[MDSS_PCLK1_CLK] = &mdss_pclk1_clk.clkr,
2753	[MDSS_ROT_CLK] = &mdss_rot_clk.clkr,
2754	[MDSS_VSYNC_CLK] = &mdss_vsync_clk.clkr,
2755	[MISC_AHB_CLK] = &misc_ahb_clk.clkr,
2756	[MISC_CXO_CLK] = &misc_cxo_clk.clkr,
2757	[MNOC_AHB_CLK] = &mnoc_ahb_clk.clkr,
2758	[SNOC_DVM_AXI_CLK] = &snoc_dvm_axi_clk.clkr,
2759	[THROTTLE_CAMSS_AXI_CLK] = &throttle_camss_axi_clk.clkr,
2760	[THROTTLE_MDSS_AXI_CLK] = &throttle_mdss_axi_clk.clkr,
2761	[THROTTLE_VIDEO_AXI_CLK] = &throttle_video_axi_clk.clkr,
2762	[VIDEO_AHB_CLK] = &video_ahb_clk.clkr,
2763	[VIDEO_AXI_CLK] = &video_axi_clk.clkr,
2764	[VIDEO_CORE_CLK] = &video_core_clk.clkr,
2765	[VIDEO_SUBCORE0_CLK] = &video_subcore0_clk.clkr,
2766	[PCLK0_CLK_SRC] = &pclk0_clk_src.clkr,
2767	[PCLK1_CLK_SRC] = &pclk1_clk_src.clkr,
2768	[ROT_CLK_SRC] = &rot_clk_src.clkr,
2769	[VFE0_CLK_SRC] = &vfe0_clk_src.clkr,
2770	[VFE1_CLK_SRC] = &vfe1_clk_src.clkr,
2771	[VIDEO_CORE_CLK_SRC] = &video_core_clk_src.clkr,
2772	[VSYNC_CLK_SRC] = &vsync_clk_src.clkr,
2773	[MDSS_BYTE1_INTF_DIV_CLK] = &mdss_byte1_intf_div_clk.clkr,
2774	[AXI_CLK_SRC] = &axi_clk_src.clkr,
2775};
2776
2777static struct gdsc *mmcc_sdm660_gdscs[] = {
2778	[VENUS_GDSC] = &venus_gdsc,
2779	[VENUS_CORE0_GDSC] = &venus_core0_gdsc,
2780	[MDSS_GDSC] = &mdss_gdsc,
2781	[CAMSS_TOP_GDSC] = &camss_top_gdsc,
2782	[CAMSS_VFE0_GDSC] = &camss_vfe0_gdsc,
2783	[CAMSS_VFE1_GDSC] = &camss_vfe1_gdsc,
2784	[CAMSS_CPP_GDSC] = &camss_cpp_gdsc,
2785};
2786
2787static const struct qcom_reset_map mmcc_660_resets[] = {
2788	[CAMSS_MICRO_BCR] = { 0x3490 },
2789};
2790
2791static const struct regmap_config mmcc_660_regmap_config = {
2792	.reg_bits	= 32,
2793	.reg_stride	= 4,
2794	.val_bits	= 32,
2795	.max_register	= 0x40000,
2796	.fast_io	= true,
2797};
2798
2799static const struct qcom_cc_desc mmcc_660_desc = {
2800	.config = &mmcc_660_regmap_config,
2801	.clks = mmcc_660_clocks,
2802	.num_clks = ARRAY_SIZE(mmcc_660_clocks),
2803	.resets = mmcc_660_resets,
2804	.num_resets = ARRAY_SIZE(mmcc_660_resets),
2805	.gdscs = mmcc_sdm660_gdscs,
2806	.num_gdscs = ARRAY_SIZE(mmcc_sdm660_gdscs),
2807};
2808
2809static const struct of_device_id mmcc_660_match_table[] = {
2810	{ .compatible = "qcom,mmcc-sdm660" },
2811	{ .compatible = "qcom,mmcc-sdm630", .data = (void *)1UL },
2812	{ }
2813};
2814MODULE_DEVICE_TABLE(of, mmcc_660_match_table);
2815
2816static void sdm630_clock_override(void)
2817{
2818	/* SDM630 has only one DSI */
2819	mmcc_660_desc.clks[BYTE1_CLK_SRC] = NULL;
2820	mmcc_660_desc.clks[MDSS_BYTE1_CLK] = NULL;
2821	mmcc_660_desc.clks[MDSS_BYTE1_INTF_DIV_CLK] = NULL;
2822	mmcc_660_desc.clks[MDSS_BYTE1_INTF_CLK] = NULL;
2823	mmcc_660_desc.clks[ESC1_CLK_SRC] = NULL;
2824	mmcc_660_desc.clks[MDSS_ESC1_CLK] = NULL;
2825	mmcc_660_desc.clks[PCLK1_CLK_SRC] = NULL;
2826	mmcc_660_desc.clks[MDSS_PCLK1_CLK] = NULL;
2827}
2828
2829static int mmcc_660_probe(struct platform_device *pdev)
2830{
2831	struct regmap *regmap;
2832	bool is_sdm630;
2833
2834	is_sdm630 = !!device_get_match_data(&pdev->dev);
2835
2836	regmap = qcom_cc_map(pdev, &mmcc_660_desc);
2837	if (IS_ERR(regmap))
2838		return PTR_ERR(regmap);
2839
2840	if (is_sdm630)
2841		sdm630_clock_override();
2842
2843	clk_alpha_pll_configure(&mmpll3, regmap, &mmpll3_config);
2844	clk_alpha_pll_configure(&mmpll4, regmap, &mmpll4_config);
2845	clk_alpha_pll_configure(&mmpll5, regmap, &mmpll5_config);
2846	clk_alpha_pll_configure(&mmpll7, regmap, &mmpll7_config);
2847	clk_alpha_pll_configure(&mmpll8, regmap, &mmpll8_config);
2848	clk_alpha_pll_configure(&mmpll10, regmap, &mmpll10_config);
2849
2850	return qcom_cc_really_probe(pdev, &mmcc_660_desc, regmap);
2851}
2852
2853static struct platform_driver mmcc_660_driver = {
2854	.probe		= mmcc_660_probe,
2855	.driver		= {
2856		.name	= "mmcc-sdm660",
2857		.of_match_table = mmcc_660_match_table,
2858	},
2859};
2860module_platform_driver(mmcc_660_driver);
2861
2862MODULE_DESCRIPTION("Qualcomm SDM630/SDM660 MMCC driver");
2863MODULE_LICENSE("GPL v2");