brintos

brintos / linux-shallow public Read only

0
0
Text · 52.3 KiB · 39033a6 Raw
2062 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Copyright (c) 2018, 2021, The Linux Foundation. All rights reserved.4 * Copyright (c) 2024, Danila Tikhonov <danila@jiaxyga.com>5 */6 7#include <linux/clk-provider.h>8#include <linux/mod_devicetable.h>9#include <linux/module.h>10#include <linux/of.h>11#include <linux/platform_device.h>12#include <linux/regmap.h>13 14#include <dt-bindings/clock/qcom,sm7150-camcc.h>15 16#include "clk-alpha-pll.h"17#include "clk-branch.h"18#include "clk-rcg.h"19#include "clk-regmap.h"20#include "common.h"21#include "gdsc.h"22 23enum {24	DT_BI_TCXO,25	DT_BI_TCXO_AO,26	DT_CHIP_SLEEP_CLK,27};28 29enum {30	P_BI_TCXO,31	P_BI_TCXO_MX,32	P_CAMCC_PLL0_OUT_EVEN,33	P_CAMCC_PLL0_OUT_MAIN,34	P_CAMCC_PLL0_OUT_ODD,35	P_CAMCC_PLL1_OUT_EVEN,36	P_CAMCC_PLL2_OUT_AUX,37	P_CAMCC_PLL2_OUT_EARLY,38	P_CAMCC_PLL2_OUT_MAIN,39	P_CAMCC_PLL3_OUT_EVEN,40	P_CAMCC_PLL4_OUT_EVEN,41	P_CHIP_SLEEP_CLK,42};43 44static const struct pll_vco fabia_vco[] = {45	{ 249600000, 2000000000, 0 },46};47 48/* 1200MHz configuration */49static const struct alpha_pll_config camcc_pll0_config = {50	.l = 0x3e,51	.alpha = 0x8000,52	.post_div_mask = 0xff << 8,53	.post_div_val = 0x31 << 8,54	.test_ctl_val = 0x40000000,55};56 57static struct clk_alpha_pll camcc_pll0 = {58	.offset = 0x0,59	.vco_table = fabia_vco,60	.num_vco = ARRAY_SIZE(fabia_vco),61	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],62	.clkr = {63		.hw.init = &(const struct clk_init_data) {64			.name = "camcc_pll0",65			.parent_data = &(const struct clk_parent_data) {66				.index = DT_BI_TCXO,67			},68			.num_parents = 1,69			.ops = &clk_alpha_pll_fabia_ops,70		},71	},72};73 74static struct clk_fixed_factor camcc_pll0_out_even = {75	.mult = 1,76	.div = 2,77	.hw.init = &(const struct clk_init_data) {78		.name = "camcc_pll0_out_even",79		.parent_hws = (const struct clk_hw*[]) {80			&camcc_pll0.clkr.hw,81		},82		.num_parents = 1,83		.ops = &clk_fixed_factor_ops,84	},85};86 87static struct clk_fixed_factor camcc_pll0_out_odd = {88	.mult = 1,89	.div = 3,90	.hw.init = &(const struct clk_init_data) {91		.name = "camcc_pll0_out_odd",92		.parent_hws = (const struct clk_hw*[]) {93			&camcc_pll0.clkr.hw,94		},95		.num_parents = 1,96		.ops = &clk_fixed_factor_ops,97	},98};99 100/* 680MHz configuration */101static const struct alpha_pll_config camcc_pll1_config = {102	.l = 0x23,103	.alpha = 0x6aaa,104	.post_div_mask = 0xf << 8,105	.post_div_val = 0x1 << 8,106	.test_ctl_val = 0x40000000,107};108 109static struct clk_alpha_pll camcc_pll1 = {110	.offset = 0x1000,111	.vco_table = fabia_vco,112	.num_vco = ARRAY_SIZE(fabia_vco),113	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],114	.clkr = {115		.hw.init = &(const struct clk_init_data) {116			.name = "camcc_pll1",117			.parent_data = &(const struct clk_parent_data) {118				.index = DT_BI_TCXO,119			},120			.num_parents = 1,121			.ops = &clk_alpha_pll_fabia_ops,122		},123	},124};125 126static struct clk_fixed_factor camcc_pll1_out_even = {127	.mult = 1,128	.div = 2,129	.hw.init = &(const struct clk_init_data) {130		.name = "camcc_pll1_out_even",131		.parent_hws = (const struct clk_hw*[]) {132			&camcc_pll1.clkr.hw,133		},134		.num_parents = 1,135		.flags = CLK_SET_RATE_PARENT,136		.ops = &clk_fixed_factor_ops,137	},138};139 140/* 1920MHz configuration */141static const struct alpha_pll_config camcc_pll2_config = {142	.l = 0x64,143	.post_div_val = 0x3 << 8,144	.post_div_mask = 0x3 << 8,145	.early_output_mask = BIT(3),146	.aux_output_mask = BIT(1),147	.main_output_mask = BIT(0),148	.config_ctl_hi_val = 0x400003d6,149	.config_ctl_val = 0x20000954,150};151 152static struct clk_alpha_pll camcc_pll2 = {153	.offset = 0x2000,154	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],155	.clkr = {156		.hw.init = &(const struct clk_init_data) {157			.name = "camcc_pll2",158			.parent_data = &(const struct clk_parent_data) {159				.index = DT_BI_TCXO,160			},161			.num_parents = 1,162			.ops = &clk_alpha_pll_agera_ops,163		},164	},165};166 167static struct clk_fixed_factor camcc_pll2_out_early = {168	.mult = 1,169	.div = 2,170	.hw.init = &(const struct clk_init_data) {171		.name = "camcc_pll2_out_early",172		.parent_hws = (const struct clk_hw*[]) {173			&camcc_pll2.clkr.hw,174		},175		.num_parents = 1,176		.ops = &clk_fixed_factor_ops,177	},178};179 180static struct clk_alpha_pll_postdiv camcc_pll2_out_aux = {181	.offset = 0x2000,182	.post_div_shift = 8,183	.width = 2,184	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],185	.clkr.hw.init = &(const struct clk_init_data) {186		.name = "camcc_pll2_out_aux",187		.parent_hws = (const struct clk_hw*[]) {188			&camcc_pll2.clkr.hw,189		},190		.num_parents = 1,191		.flags = CLK_SET_RATE_PARENT,192		.ops = &clk_alpha_pll_postdiv_ops,193	},194};195 196static struct clk_alpha_pll_postdiv camcc_pll2_out_main = {197	.offset = 0x2000,198	.post_div_shift = 8,199	.width = 2,200	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],201	.clkr.hw.init = &(const struct clk_init_data) {202		.name = "camcc_pll2_out_main",203		.parent_hws = (const struct clk_hw*[]) {204			&camcc_pll2.clkr.hw,205		},206		.num_parents = 1,207		.flags = CLK_SET_RATE_PARENT,208		.ops = &clk_alpha_pll_postdiv_ops,209	},210};211 212/* 760MHz configuration */213static const struct alpha_pll_config camcc_pll3_config = {214	.l = 0x27,215	.alpha = 0x9555,216	.post_div_mask = 0xf << 8,217	.post_div_val = 0x1 << 8,218	.test_ctl_val = 0x40000000,219};220 221static struct clk_alpha_pll camcc_pll3 = {222	.offset = 0x3000,223	.vco_table = fabia_vco,224	.num_vco = ARRAY_SIZE(fabia_vco),225	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],226	.clkr = {227		.hw.init = &(const struct clk_init_data) {228			.name = "camcc_pll3",229			.parent_data = &(const struct clk_parent_data) {230				.index = DT_BI_TCXO,231			},232			.num_parents = 1,233			.ops = &clk_alpha_pll_fabia_ops,234		},235	},236};237 238static struct clk_fixed_factor camcc_pll3_out_even = {239	.mult = 1,240	.div = 2,241	.hw.init = &(const struct clk_init_data) {242		.name = "camcc_pll3_out_even",243		.parent_hws = (const struct clk_hw*[]) {244			&camcc_pll3.clkr.hw,245		},246		.num_parents = 1,247		.flags = CLK_SET_RATE_PARENT,248		.ops = &clk_fixed_factor_ops,249	},250};251 252static struct clk_alpha_pll camcc_pll4 = {253	.offset = 0x4000,254	.vco_table = fabia_vco,255	.num_vco = ARRAY_SIZE(fabia_vco),256	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],257	.clkr = {258		.hw.init = &(const struct clk_init_data) {259			.name = "camcc_pll4",260			.parent_data = &(const struct clk_parent_data) {261				.index = DT_BI_TCXO,262			},263			.num_parents = 1,264			.ops = &clk_alpha_pll_fabia_ops,265		},266	},267};268 269static struct clk_fixed_factor camcc_pll4_out_even = {270	.mult = 1,271	.div = 2,272	.hw.init = &(const struct clk_init_data) {273		.name = "camcc_pll4_out_even",274		.parent_hws = (const struct clk_hw*[]) {275			&camcc_pll4.clkr.hw,276		},277		.num_parents = 1,278		.flags = CLK_SET_RATE_PARENT,279		.ops = &clk_fixed_factor_ops,280	},281};282 283static const struct parent_map camcc_parent_map_0[] = {284	{ P_BI_TCXO, 0 },285	{ P_CAMCC_PLL0_OUT_MAIN, 1 },286	{ P_CAMCC_PLL0_OUT_EVEN, 2 },287	{ P_CAMCC_PLL0_OUT_ODD, 3 },288	{ P_CAMCC_PLL2_OUT_MAIN, 5 },289};290 291static const struct clk_parent_data camcc_parent_data_0[] = {292	{ .index = DT_BI_TCXO },293	{ .hw = &camcc_pll0.clkr.hw },294	{ .hw = &camcc_pll0_out_even.hw },295	{ .hw = &camcc_pll0_out_odd.hw },296	{ .hw = &camcc_pll2_out_main.clkr.hw },297};298 299static const struct parent_map camcc_parent_map_1[] = {300	{ P_BI_TCXO, 0 },301	{ P_CAMCC_PLL0_OUT_MAIN, 1 },302	{ P_CAMCC_PLL0_OUT_EVEN, 2 },303	{ P_CAMCC_PLL0_OUT_ODD, 3 },304	{ P_CAMCC_PLL1_OUT_EVEN, 4 },305	{ P_CAMCC_PLL2_OUT_EARLY, 5 },306};307 308static const struct clk_parent_data camcc_parent_data_1[] = {309	{ .index = DT_BI_TCXO },310	{ .hw = &camcc_pll0.clkr.hw },311	{ .hw = &camcc_pll0_out_even.hw },312	{ .hw = &camcc_pll0_out_odd.hw },313	{ .hw = &camcc_pll1_out_even.hw },314	{ .hw = &camcc_pll2_out_early.hw },315};316 317static const struct parent_map camcc_parent_map_2[] = {318	{ P_BI_TCXO_MX, 0 },319	{ P_CAMCC_PLL2_OUT_AUX, 5 },320};321 322static const struct clk_parent_data camcc_parent_data_2[] = {323	{ .index = DT_BI_TCXO },324	{ .hw = &camcc_pll2_out_aux.clkr.hw },325};326 327static const struct parent_map camcc_parent_map_3[] = {328	{ P_BI_TCXO, 0 },329	{ P_CAMCC_PLL0_OUT_MAIN, 1 },330	{ P_CAMCC_PLL0_OUT_EVEN, 2 },331	{ P_CAMCC_PLL0_OUT_ODD, 3 },332	{ P_CAMCC_PLL2_OUT_EARLY, 5 },333	{ P_CAMCC_PLL4_OUT_EVEN, 6 },334};335 336static const struct clk_parent_data camcc_parent_data_3[] = {337	{ .index = DT_BI_TCXO },338	{ .hw = &camcc_pll0.clkr.hw },339	{ .hw = &camcc_pll0_out_even.hw },340	{ .hw = &camcc_pll0_out_odd.hw },341	{ .hw = &camcc_pll2_out_early.hw },342	{ .hw = &camcc_pll4_out_even.hw },343};344 345static const struct parent_map camcc_parent_map_4[] = {346	{ P_BI_TCXO, 0 },347	{ P_CAMCC_PLL3_OUT_EVEN, 6 },348};349 350static const struct clk_parent_data camcc_parent_data_4[] = {351	{ .index = DT_BI_TCXO },352	{ .hw = &camcc_pll3_out_even.hw },353};354 355static const struct parent_map camcc_parent_map_5[] = {356	{ P_BI_TCXO, 0 },357	{ P_CAMCC_PLL4_OUT_EVEN, 6 },358};359 360static const struct clk_parent_data camcc_parent_data_5[] = {361	{ .index = DT_BI_TCXO },362	{ .hw = &camcc_pll4_out_even.hw },363};364 365static const struct parent_map camcc_parent_map_6[] = {366	{ P_BI_TCXO, 0 },367	{ P_CAMCC_PLL1_OUT_EVEN, 4 },368};369 370static const struct clk_parent_data camcc_parent_data_6[] = {371	{ .index = DT_BI_TCXO },372	{ .hw = &camcc_pll1_out_even.hw },373};374 375static const struct parent_map camcc_parent_map_7[] = {376	{ P_CHIP_SLEEP_CLK, 0 },377};378 379static const struct clk_parent_data camcc_parent_data_7[] = {380	{ .index = DT_CHIP_SLEEP_CLK },381};382 383static const struct parent_map camcc_parent_map_8[] = {384	{ P_BI_TCXO, 0 },385	{ P_CAMCC_PLL0_OUT_ODD, 3 },386};387 388static const struct clk_parent_data camcc_parent_data_8[] = {389	{ .index = DT_BI_TCXO },390	{ .hw = &camcc_pll0_out_odd.hw },391};392 393static const struct parent_map camcc_parent_map_9[] = {394	{ P_BI_TCXO, 0 },395};396 397static const struct clk_parent_data camcc_parent_data_9[] = {398	{ .index = DT_BI_TCXO_AO },399};400 401static const struct freq_tbl ftbl_camcc_bps_clk_src[] = {402	F(19200000, P_BI_TCXO, 1, 0, 0),403	F(100000000, P_CAMCC_PLL0_OUT_EVEN, 6, 0, 0),404	F(200000000, P_CAMCC_PLL0_OUT_ODD, 2, 0, 0),405	F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0),406	F(480000000, P_CAMCC_PLL2_OUT_MAIN, 1, 0, 0),407	F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0),408	{ }409};410 411static struct clk_rcg2 camcc_bps_clk_src = {412	.cmd_rcgr = 0x7010,413	.mnd_width = 0,414	.hid_width = 5,415	.parent_map = camcc_parent_map_0,416	.freq_tbl = ftbl_camcc_bps_clk_src,417	.clkr.hw.init = &(const struct clk_init_data) {418		.name = "camcc_bps_clk_src",419		.parent_data = camcc_parent_data_0,420		.num_parents = ARRAY_SIZE(camcc_parent_data_0),421		.ops = &clk_rcg2_shared_ops,422	},423};424 425static const struct freq_tbl ftbl_camcc_camnoc_axi_clk_src[] = {426	F(19200000, P_BI_TCXO, 1, 0, 0),427	F(150000000, P_CAMCC_PLL0_OUT_EVEN, 4, 0, 0),428	F(240000000, P_CAMCC_PLL2_OUT_MAIN, 2, 0, 0),429	F(320000000, P_CAMCC_PLL2_OUT_MAIN, 1.5, 0, 0),430	F(400000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0),431	F(480000000, P_CAMCC_PLL2_OUT_MAIN, 1, 0, 0),432	{ }433};434 435static struct clk_rcg2 camcc_camnoc_axi_clk_src = {436	.cmd_rcgr = 0xc12c,437	.mnd_width = 0,438	.hid_width = 5,439	.parent_map = camcc_parent_map_0,440	.freq_tbl = ftbl_camcc_camnoc_axi_clk_src,441	.clkr.hw.init = &(const struct clk_init_data) {442		.name = "camcc_camnoc_axi_clk_src",443		.parent_data = camcc_parent_data_0,444		.num_parents = ARRAY_SIZE(camcc_parent_data_0),445		.ops = &clk_rcg2_shared_ops,446	},447};448 449static const struct freq_tbl ftbl_camcc_cci_0_clk_src[] = {450	F(19200000, P_BI_TCXO, 1, 0, 0),451	F(37500000, P_CAMCC_PLL0_OUT_EVEN, 16, 0, 0),452	{ }453};454 455static struct clk_rcg2 camcc_cci_0_clk_src = {456	.cmd_rcgr = 0xc0c4,457	.mnd_width = 8,458	.hid_width = 5,459	.parent_map = camcc_parent_map_0,460	.freq_tbl = ftbl_camcc_cci_0_clk_src,461	.clkr.hw.init = &(const struct clk_init_data) {462		.name = "camcc_cci_0_clk_src",463		.parent_data = camcc_parent_data_0,464		.num_parents = ARRAY_SIZE(camcc_parent_data_0),465		.ops = &clk_rcg2_ops,466	},467};468 469static struct clk_rcg2 camcc_cci_1_clk_src = {470	.cmd_rcgr = 0xc0e0,471	.mnd_width = 8,472	.hid_width = 5,473	.parent_map = camcc_parent_map_0,474	.freq_tbl = ftbl_camcc_cci_0_clk_src,475	.clkr.hw.init = &(const struct clk_init_data) {476		.name = "camcc_cci_1_clk_src",477		.parent_data = camcc_parent_data_0,478		.num_parents = ARRAY_SIZE(camcc_parent_data_0),479		.ops = &clk_rcg2_ops,480	},481};482 483static const struct freq_tbl ftbl_camcc_cphy_rx_clk_src[] = {484	F(19200000, P_BI_TCXO, 1, 0, 0),485	F(300000000, P_CAMCC_PLL0_OUT_EVEN, 2, 0, 0),486	F(384000000, P_CAMCC_PLL2_OUT_EARLY, 2.5, 0, 0),487	F(400000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0),488	{ }489};490 491static struct clk_rcg2 camcc_cphy_rx_clk_src = {492	.cmd_rcgr = 0xa064,493	.mnd_width = 0,494	.hid_width = 5,495	.parent_map = camcc_parent_map_1,496	.freq_tbl = ftbl_camcc_cphy_rx_clk_src,497	.clkr.hw.init = &(const struct clk_init_data) {498		.name = "camcc_cphy_rx_clk_src",499		.parent_data = camcc_parent_data_1,500		.num_parents = ARRAY_SIZE(camcc_parent_data_1),501		.ops = &clk_rcg2_ops,502	},503};504 505static const struct freq_tbl ftbl_camcc_csi0phytimer_clk_src[] = {506	F(19200000, P_BI_TCXO, 1, 0, 0),507	F(300000000, P_CAMCC_PLL0_OUT_EVEN, 2, 0, 0),508	{ }509};510 511static struct clk_rcg2 camcc_csi0phytimer_clk_src = {512	.cmd_rcgr = 0x6004,513	.mnd_width = 0,514	.hid_width = 5,515	.parent_map = camcc_parent_map_0,516	.freq_tbl = ftbl_camcc_csi0phytimer_clk_src,517	.clkr.hw.init = &(const struct clk_init_data) {518		.name = "camcc_csi0phytimer_clk_src",519		.parent_data = camcc_parent_data_0,520		.num_parents = ARRAY_SIZE(camcc_parent_data_0),521		.ops = &clk_rcg2_ops,522	},523};524 525static struct clk_rcg2 camcc_csi1phytimer_clk_src = {526	.cmd_rcgr = 0x6028,527	.mnd_width = 0,528	.hid_width = 5,529	.parent_map = camcc_parent_map_0,530	.freq_tbl = ftbl_camcc_csi0phytimer_clk_src,531	.clkr.hw.init = &(const struct clk_init_data) {532		.name = "camcc_csi1phytimer_clk_src",533		.parent_data = camcc_parent_data_0,534		.num_parents = ARRAY_SIZE(camcc_parent_data_0),535		.ops = &clk_rcg2_ops,536	},537};538 539static struct clk_rcg2 camcc_csi2phytimer_clk_src = {540	.cmd_rcgr = 0x604c,541	.mnd_width = 0,542	.hid_width = 5,543	.parent_map = camcc_parent_map_0,544	.freq_tbl = ftbl_camcc_csi0phytimer_clk_src,545	.clkr.hw.init = &(const struct clk_init_data) {546		.name = "camcc_csi2phytimer_clk_src",547		.parent_data = camcc_parent_data_0,548		.num_parents = ARRAY_SIZE(camcc_parent_data_0),549		.ops = &clk_rcg2_ops,550	},551};552 553static struct clk_rcg2 camcc_csi3phytimer_clk_src = {554	.cmd_rcgr = 0x6070,555	.mnd_width = 0,556	.hid_width = 5,557	.parent_map = camcc_parent_map_0,558	.freq_tbl = ftbl_camcc_csi0phytimer_clk_src,559	.clkr.hw.init = &(const struct clk_init_data) {560		.name = "camcc_csi3phytimer_clk_src",561		.parent_data = camcc_parent_data_0,562		.num_parents = ARRAY_SIZE(camcc_parent_data_0),563		.ops = &clk_rcg2_ops,564	},565};566 567static const struct freq_tbl ftbl_camcc_fast_ahb_clk_src[] = {568	F(19200000, P_BI_TCXO, 1, 0, 0),569	F(50000000, P_CAMCC_PLL0_OUT_EVEN, 12, 0, 0),570	F(100000000, P_CAMCC_PLL0_OUT_EVEN, 6, 0, 0),571	F(200000000, P_CAMCC_PLL0_OUT_EVEN, 3, 0, 0),572	F(300000000, P_CAMCC_PLL0_OUT_MAIN, 4, 0, 0),573	F(400000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0),574	{ }575};576 577static struct clk_rcg2 camcc_fast_ahb_clk_src = {578	.cmd_rcgr = 0x703c,579	.mnd_width = 0,580	.hid_width = 5,581	.parent_map = camcc_parent_map_0,582	.freq_tbl = ftbl_camcc_fast_ahb_clk_src,583	.clkr.hw.init = &(const struct clk_init_data) {584		.name = "camcc_fast_ahb_clk_src",585		.parent_data = camcc_parent_data_0,586		.num_parents = ARRAY_SIZE(camcc_parent_data_0),587		.ops = &clk_rcg2_ops,588	},589};590 591static const struct freq_tbl ftbl_camcc_fd_core_clk_src[] = {592	F(19200000, P_BI_TCXO, 1, 0, 0),593	F(380000000, P_CAMCC_PLL4_OUT_EVEN, 1, 0, 0),594	F(384000000, P_CAMCC_PLL2_OUT_EARLY, 2.5, 0, 0),595	F(400000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0),596	F(480000000, P_CAMCC_PLL2_OUT_EARLY, 2, 0, 0),597	F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0),598	{ }599};600 601static struct clk_rcg2 camcc_fd_core_clk_src = {602	.cmd_rcgr = 0xc09c,603	.mnd_width = 0,604	.hid_width = 5,605	.parent_map = camcc_parent_map_3,606	.freq_tbl = ftbl_camcc_fd_core_clk_src,607	.clkr.hw.init = &(const struct clk_init_data) {608		.name = "camcc_fd_core_clk_src",609		.parent_data = camcc_parent_data_3,610		.num_parents = ARRAY_SIZE(camcc_parent_data_3),611		.flags = CLK_SET_RATE_PARENT,612		.ops = &clk_rcg2_shared_ops,613	},614};615 616static const struct freq_tbl ftbl_camcc_icp_clk_src[] = {617	F(19200000, P_BI_TCXO, 1, 0, 0),618	F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0),619	F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0),620	{ }621};622 623static struct clk_rcg2 camcc_icp_clk_src = {624	.cmd_rcgr = 0xc074,625	.mnd_width = 0,626	.hid_width = 5,627	.parent_map = camcc_parent_map_0,628	.freq_tbl = ftbl_camcc_icp_clk_src,629	.clkr.hw.init = &(const struct clk_init_data) {630		.name = "camcc_icp_clk_src",631		.parent_data = camcc_parent_data_0,632		.num_parents = ARRAY_SIZE(camcc_parent_data_0),633		.ops = &clk_rcg2_shared_ops,634	},635};636 637static const struct freq_tbl ftbl_camcc_ife_0_clk_src[] = {638	F(19200000, P_BI_TCXO, 1, 0, 0),639	F(380000000, P_CAMCC_PLL3_OUT_EVEN, 1, 0, 0),640	F(510000000, P_CAMCC_PLL3_OUT_EVEN, 1, 0, 0),641	F(637000000, P_CAMCC_PLL3_OUT_EVEN, 1, 0, 0),642	F(760000000, P_CAMCC_PLL3_OUT_EVEN, 1, 0, 0),643	{ }644};645 646static struct clk_rcg2 camcc_ife_0_clk_src = {647	.cmd_rcgr = 0xa010,648	.mnd_width = 0,649	.hid_width = 5,650	.parent_map = camcc_parent_map_4,651	.freq_tbl = ftbl_camcc_ife_0_clk_src,652	.clkr.hw.init = &(const struct clk_init_data) {653		.name = "camcc_ife_0_clk_src",654		.parent_data = camcc_parent_data_4,655		.num_parents = ARRAY_SIZE(camcc_parent_data_4),656		.flags = CLK_SET_RATE_PARENT,657		.ops = &clk_rcg2_shared_ops,658	},659};660 661static const struct freq_tbl ftbl_camcc_ife_0_csid_clk_src[] = {662	F(19200000, P_BI_TCXO, 1, 0, 0),663	F(75000000, P_CAMCC_PLL0_OUT_EVEN, 8, 0, 0),664	F(300000000, P_CAMCC_PLL0_OUT_EVEN, 2, 0, 0),665	F(384000000, P_CAMCC_PLL2_OUT_EARLY, 2.5, 0, 0),666	F(400000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0),667	{ }668};669 670static struct clk_rcg2 camcc_ife_0_csid_clk_src = {671	.cmd_rcgr = 0xa03c,672	.mnd_width = 0,673	.hid_width = 5,674	.parent_map = camcc_parent_map_1,675	.freq_tbl = ftbl_camcc_ife_0_csid_clk_src,676	.clkr.hw.init = &(const struct clk_init_data) {677		.name = "camcc_ife_0_csid_clk_src",678		.parent_data = camcc_parent_data_1,679		.num_parents = ARRAY_SIZE(camcc_parent_data_1),680		.ops = &clk_rcg2_shared_ops,681	},682};683 684static const struct freq_tbl ftbl_camcc_ife_1_clk_src[] = {685	F(19200000, P_BI_TCXO, 1, 0, 0),686	F(380000000, P_CAMCC_PLL4_OUT_EVEN, 1, 0, 0),687	F(510000000, P_CAMCC_PLL4_OUT_EVEN, 1, 0, 0),688	F(637000000, P_CAMCC_PLL4_OUT_EVEN, 1, 0, 0),689	F(760000000, P_CAMCC_PLL4_OUT_EVEN, 1, 0, 0),690	{ }691};692 693static struct clk_rcg2 camcc_ife_1_clk_src = {694	.cmd_rcgr = 0xb010,695	.mnd_width = 0,696	.hid_width = 5,697	.parent_map = camcc_parent_map_5,698	.freq_tbl = ftbl_camcc_ife_1_clk_src,699	.clkr.hw.init = &(const struct clk_init_data) {700		.name = "camcc_ife_1_clk_src",701		.parent_data = camcc_parent_data_5,702		.num_parents = ARRAY_SIZE(camcc_parent_data_5),703		.flags = CLK_SET_RATE_PARENT,704		.ops = &clk_rcg2_shared_ops,705	},706};707 708static struct clk_rcg2 camcc_ife_1_csid_clk_src = {709	.cmd_rcgr = 0xb034,710	.mnd_width = 0,711	.hid_width = 5,712	.parent_map = camcc_parent_map_1,713	.freq_tbl = ftbl_camcc_ife_0_csid_clk_src,714	.clkr.hw.init = &(const struct clk_init_data) {715		.name = "camcc_ife_1_csid_clk_src",716		.parent_data = camcc_parent_data_1,717		.num_parents = ARRAY_SIZE(camcc_parent_data_1),718		.ops = &clk_rcg2_shared_ops,719	},720};721 722static const struct freq_tbl ftbl_camcc_ife_lite_clk_src[] = {723	F(19200000, P_BI_TCXO, 1, 0, 0),724	F(320000000, P_CAMCC_PLL2_OUT_MAIN, 1.5, 0, 0),725	F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0),726	F(480000000, P_CAMCC_PLL2_OUT_MAIN, 1, 0, 0),727	F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0),728	{ }729};730 731static struct clk_rcg2 camcc_ife_lite_clk_src = {732	.cmd_rcgr = 0xc004,733	.mnd_width = 0,734	.hid_width = 5,735	.parent_map = camcc_parent_map_0,736	.freq_tbl = ftbl_camcc_ife_lite_clk_src,737	.clkr.hw.init = &(const struct clk_init_data) {738		.name = "camcc_ife_lite_clk_src",739		.parent_data = camcc_parent_data_0,740		.num_parents = ARRAY_SIZE(camcc_parent_data_0),741		.ops = &clk_rcg2_ops,742	},743};744 745static struct clk_rcg2 camcc_ife_lite_csid_clk_src = {746	.cmd_rcgr = 0xc020,747	.mnd_width = 0,748	.hid_width = 5,749	.parent_map = camcc_parent_map_1,750	.freq_tbl = ftbl_camcc_cphy_rx_clk_src,751	.clkr.hw.init = &(const struct clk_init_data) {752		.name = "camcc_ife_lite_csid_clk_src",753		.parent_data = camcc_parent_data_1,754		.num_parents = ARRAY_SIZE(camcc_parent_data_1),755		.ops = &clk_rcg2_shared_ops,756	},757};758 759static const struct freq_tbl ftbl_camcc_ipe_0_clk_src[] = {760	F(19200000, P_BI_TCXO, 1, 0, 0),761	F(340000000, P_CAMCC_PLL1_OUT_EVEN, 1, 0, 0),762	F(430000000, P_CAMCC_PLL1_OUT_EVEN, 1, 0, 0),763	F(520000000, P_CAMCC_PLL1_OUT_EVEN, 1, 0, 0),764	F(600000000, P_CAMCC_PLL1_OUT_EVEN, 1, 0, 0),765	{ }766};767 768static struct clk_rcg2 camcc_ipe_0_clk_src = {769	.cmd_rcgr = 0x8010,770	.mnd_width = 0,771	.hid_width = 5,772	.parent_map = camcc_parent_map_6,773	.freq_tbl = ftbl_camcc_ipe_0_clk_src,774	.clkr.hw.init = &(const struct clk_init_data) {775		.name = "camcc_ipe_0_clk_src",776		.parent_data = camcc_parent_data_6,777		.num_parents = ARRAY_SIZE(camcc_parent_data_6),778		.flags = CLK_SET_RATE_PARENT,779		.ops = &clk_rcg2_shared_ops,780	},781};782 783static struct clk_rcg2 camcc_jpeg_clk_src = {784	.cmd_rcgr = 0xc048,785	.mnd_width = 0,786	.hid_width = 5,787	.parent_map = camcc_parent_map_0,788	.freq_tbl = ftbl_camcc_bps_clk_src,789	.clkr.hw.init = &(const struct clk_init_data) {790		.name = "camcc_jpeg_clk_src",791		.parent_data = camcc_parent_data_0,792		.num_parents = ARRAY_SIZE(camcc_parent_data_0),793		.ops = &clk_rcg2_shared_ops,794	},795};796 797static const struct freq_tbl ftbl_camcc_lrme_clk_src[] = {798	F(19200000, P_BI_TCXO, 1, 0, 0),799	F(100000000, P_CAMCC_PLL0_OUT_EVEN, 6, 0, 0),800	F(240000000, P_CAMCC_PLL2_OUT_MAIN, 2, 0, 0),801	F(300000000, P_CAMCC_PLL0_OUT_EVEN, 2, 0, 0),802	F(320000000, P_CAMCC_PLL2_OUT_MAIN, 1.5, 0, 0),803	F(400000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0),804	{ }805};806 807static struct clk_rcg2 camcc_lrme_clk_src = {808	.cmd_rcgr = 0xc100,809	.mnd_width = 0,810	.hid_width = 5,811	.parent_map = camcc_parent_map_0,812	.freq_tbl = ftbl_camcc_lrme_clk_src,813	.clkr.hw.init = &(const struct clk_init_data) {814		.name = "camcc_lrme_clk_src",815		.parent_data = camcc_parent_data_0,816		.num_parents = ARRAY_SIZE(camcc_parent_data_0),817		.ops = &clk_rcg2_shared_ops,818	},819};820 821static const struct freq_tbl ftbl_camcc_mclk0_clk_src[] = {822	F(19200000, P_BI_TCXO_MX, 1, 0, 0),823	F(24000000, P_CAMCC_PLL2_OUT_AUX, 1, 1, 20),824	F(34285714, P_CAMCC_PLL2_OUT_AUX, 14, 0, 0),825	{ }826};827 828static struct clk_rcg2 camcc_mclk0_clk_src = {829	.cmd_rcgr = 0x5004,830	.mnd_width = 8,831	.hid_width = 5,832	.parent_map = camcc_parent_map_2,833	.freq_tbl = ftbl_camcc_mclk0_clk_src,834	.clkr.hw.init = &(const struct clk_init_data) {835		.name = "camcc_mclk0_clk_src",836		.parent_data = camcc_parent_data_2,837		.num_parents = ARRAY_SIZE(camcc_parent_data_2),838		.ops = &clk_rcg2_ops,839	},840};841 842static struct clk_rcg2 camcc_mclk1_clk_src = {843	.cmd_rcgr = 0x5024,844	.mnd_width = 8,845	.hid_width = 5,846	.parent_map = camcc_parent_map_2,847	.freq_tbl = ftbl_camcc_mclk0_clk_src,848	.clkr.hw.init = &(const struct clk_init_data) {849		.name = "camcc_mclk1_clk_src",850		.parent_data = camcc_parent_data_2,851		.num_parents = ARRAY_SIZE(camcc_parent_data_2),852		.ops = &clk_rcg2_ops,853	},854};855 856static struct clk_rcg2 camcc_mclk2_clk_src = {857	.cmd_rcgr = 0x5044,858	.mnd_width = 8,859	.hid_width = 5,860	.parent_map = camcc_parent_map_2,861	.freq_tbl = ftbl_camcc_mclk0_clk_src,862	.clkr.hw.init = &(const struct clk_init_data) {863		.name = "camcc_mclk2_clk_src",864		.parent_data = camcc_parent_data_2,865		.num_parents = ARRAY_SIZE(camcc_parent_data_2),866		.ops = &clk_rcg2_ops,867	},868};869 870static struct clk_rcg2 camcc_mclk3_clk_src = {871	.cmd_rcgr = 0x5064,872	.mnd_width = 8,873	.hid_width = 5,874	.parent_map = camcc_parent_map_2,875	.freq_tbl = ftbl_camcc_mclk0_clk_src,876	.clkr.hw.init = &(const struct clk_init_data) {877		.name = "camcc_mclk3_clk_src",878		.parent_data = camcc_parent_data_2,879		.num_parents = ARRAY_SIZE(camcc_parent_data_2),880		.ops = &clk_rcg2_ops,881	},882};883 884static const struct freq_tbl ftbl_camcc_sleep_clk_src[] = {885	F(32000, P_CHIP_SLEEP_CLK, 1, 0, 0),886	{ }887};888 889static struct clk_rcg2 camcc_sleep_clk_src = {890	.cmd_rcgr = 0xc1a4,891	.mnd_width = 0,892	.hid_width = 5,893	.parent_map = camcc_parent_map_7,894	.freq_tbl = ftbl_camcc_sleep_clk_src,895	.clkr.hw.init = &(const struct clk_init_data) {896		.name = "camcc_sleep_clk_src",897		.parent_data = camcc_parent_data_7,898		.num_parents = ARRAY_SIZE(camcc_parent_data_7),899		.ops = &clk_rcg2_ops,900	},901};902 903static const struct freq_tbl ftbl_camcc_slow_ahb_clk_src[] = {904	F(19200000, P_BI_TCXO, 1, 0, 0),905	F(80000000, P_CAMCC_PLL0_OUT_ODD, 5, 0, 0),906	{ }907};908 909static struct clk_rcg2 camcc_slow_ahb_clk_src = {910	.cmd_rcgr = 0x7058,911	.mnd_width = 0,912	.hid_width = 5,913	.parent_map = camcc_parent_map_8,914	.freq_tbl = ftbl_camcc_slow_ahb_clk_src,915	.clkr.hw.init = &(const struct clk_init_data) {916		.name = "camcc_slow_ahb_clk_src",917		.parent_data = camcc_parent_data_8,918		.num_parents = ARRAY_SIZE(camcc_parent_data_8),919		.ops = &clk_rcg2_shared_ops,920	},921};922 923static const struct freq_tbl ftbl_camcc_xo_clk_src[] = {924	F(19200000, P_BI_TCXO, 1, 0, 0),925	{ }926};927 928static struct clk_rcg2 camcc_xo_clk_src = {929	.cmd_rcgr = 0xc188,930	.mnd_width = 0,931	.hid_width = 5,932	.parent_map = camcc_parent_map_9,933	.freq_tbl = ftbl_camcc_xo_clk_src,934	.clkr.hw.init = &(const struct clk_init_data) {935		.name = "camcc_xo_clk_src",936		.parent_data = camcc_parent_data_9,937		.num_parents = ARRAY_SIZE(camcc_parent_data_9),938		.ops = &clk_rcg2_ops,939	},940};941 942static struct clk_branch camcc_bps_ahb_clk = {943	.halt_reg = 0x7070,944	.halt_check = BRANCH_HALT,945	.clkr = {946		.enable_reg = 0x7070,947		.enable_mask = BIT(0),948		.hw.init = &(const struct clk_init_data) {949			.name = "camcc_bps_ahb_clk",950			.parent_hws = (const struct clk_hw*[]) {951				&camcc_slow_ahb_clk_src.clkr.hw,952			},953			.num_parents = 1,954			.flags = CLK_SET_RATE_PARENT,955			.ops = &clk_branch2_ops,956		},957	},958};959 960static struct clk_branch camcc_bps_areg_clk = {961	.halt_reg = 0x7054,962	.halt_check = BRANCH_HALT,963	.clkr = {964		.enable_reg = 0x7054,965		.enable_mask = BIT(0),966		.hw.init = &(const struct clk_init_data) {967			.name = "camcc_bps_areg_clk",968			.parent_hws = (const struct clk_hw*[]) {969				&camcc_fast_ahb_clk_src.clkr.hw,970			},971			.num_parents = 1,972			.flags = CLK_SET_RATE_PARENT,973			.ops = &clk_branch2_ops,974		},975	},976};977 978static struct clk_branch camcc_bps_axi_clk = {979	.halt_reg = 0x7038,980	.halt_check = BRANCH_HALT,981	.clkr = {982		.enable_reg = 0x7038,983		.enable_mask = BIT(0),984		.hw.init = &(const struct clk_init_data) {985			.name = "camcc_bps_axi_clk",986			.parent_hws = (const struct clk_hw*[]) {987				&camcc_camnoc_axi_clk_src.clkr.hw,988			},989			.num_parents = 1,990			.flags = CLK_SET_RATE_PARENT,991			.ops = &clk_branch2_ops,992		},993	},994};995 996static struct clk_branch camcc_bps_clk = {997	.halt_reg = 0x7028,998	.halt_check = BRANCH_HALT,999	.clkr = {1000		.enable_reg = 0x7028,1001		.enable_mask = BIT(0),1002		.hw.init = &(const struct clk_init_data) {1003			.name = "camcc_bps_clk",1004			.parent_hws = (const struct clk_hw*[]) {1005				&camcc_bps_clk_src.clkr.hw,1006			},1007			.num_parents = 1,1008			.flags = CLK_SET_RATE_PARENT,1009			.ops = &clk_branch2_ops,1010		},1011	},1012};1013 1014static struct clk_branch camcc_camnoc_axi_clk = {1015	.halt_reg = 0xc148,1016	.halt_check = BRANCH_HALT,1017	.clkr = {1018		.enable_reg = 0xc148,1019		.enable_mask = BIT(0),1020		.hw.init = &(const struct clk_init_data) {1021			.name = "camcc_camnoc_axi_clk",1022			.parent_hws = (const struct clk_hw*[]) {1023				&camcc_camnoc_axi_clk_src.clkr.hw,1024			},1025			.num_parents = 1,1026			.flags = CLK_SET_RATE_PARENT,1027			.ops = &clk_branch2_ops,1028		},1029	},1030};1031 1032static struct clk_branch camcc_camnoc_dcd_xo_clk = {1033	.halt_reg = 0xc150,1034	.halt_check = BRANCH_HALT,1035	.clkr = {1036		.enable_reg = 0xc150,1037		.enable_mask = BIT(0),1038		.hw.init = &(const struct clk_init_data) {1039			.name = "camcc_camnoc_dcd_xo_clk",1040			.parent_hws = (const struct clk_hw*[]) {1041				&camcc_xo_clk_src.clkr.hw,1042			},1043			.num_parents = 1,1044			.flags = CLK_SET_RATE_PARENT,1045			.ops = &clk_branch2_ops,1046		},1047	},1048};1049 1050static struct clk_branch camcc_cci_0_clk = {1051	.halt_reg = 0xc0dc,1052	.halt_check = BRANCH_HALT,1053	.clkr = {1054		.enable_reg = 0xc0dc,1055		.enable_mask = BIT(0),1056		.hw.init = &(const struct clk_init_data) {1057			.name = "camcc_cci_0_clk",1058			.parent_hws = (const struct clk_hw*[]) {1059				&camcc_cci_0_clk_src.clkr.hw,1060			},1061			.num_parents = 1,1062			.flags = CLK_SET_RATE_PARENT,1063			.ops = &clk_branch2_ops,1064		},1065	},1066};1067 1068static struct clk_branch camcc_cci_1_clk = {1069	.halt_reg = 0xc0f8,1070	.halt_check = BRANCH_HALT,1071	.clkr = {1072		.enable_reg = 0xc0f8,1073		.enable_mask = BIT(0),1074		.hw.init = &(const struct clk_init_data) {1075			.name = "camcc_cci_1_clk",1076			.parent_hws = (const struct clk_hw*[]) {1077				&camcc_cci_1_clk_src.clkr.hw,1078			},1079			.num_parents = 1,1080			.flags = CLK_SET_RATE_PARENT,1081			.ops = &clk_branch2_ops,1082		},1083	},1084};1085 1086static struct clk_branch camcc_core_ahb_clk = {1087	.halt_reg = 0xc184,1088	.halt_check = BRANCH_HALT_DELAY,1089	.clkr = {1090		.enable_reg = 0xc184,1091		.enable_mask = BIT(0),1092		.hw.init = &(const struct clk_init_data) {1093			.name = "camcc_core_ahb_clk",1094			.parent_hws = (const struct clk_hw*[]) {1095				&camcc_slow_ahb_clk_src.clkr.hw,1096			},1097			.num_parents = 1,1098			.flags = CLK_SET_RATE_PARENT,1099			.ops = &clk_branch2_ops,1100		},1101	},1102};1103 1104static struct clk_branch camcc_cpas_ahb_clk = {1105	.halt_reg = 0xc124,1106	.halt_check = BRANCH_HALT,1107	.clkr = {1108		.enable_reg = 0xc124,1109		.enable_mask = BIT(0),1110		.hw.init = &(const struct clk_init_data) {1111			.name = "camcc_cpas_ahb_clk",1112			.parent_hws = (const struct clk_hw*[]) {1113				&camcc_slow_ahb_clk_src.clkr.hw,1114			},1115			.num_parents = 1,1116			.flags = CLK_SET_RATE_PARENT,1117			.ops = &clk_branch2_ops,1118		},1119	},1120};1121 1122static struct clk_branch camcc_csi0phytimer_clk = {1123	.halt_reg = 0x601c,1124	.halt_check = BRANCH_HALT,1125	.clkr = {1126		.enable_reg = 0x601c,1127		.enable_mask = BIT(0),1128		.hw.init = &(const struct clk_init_data) {1129			.name = "camcc_csi0phytimer_clk",1130			.parent_hws = (const struct clk_hw*[]) {1131				&camcc_csi0phytimer_clk_src.clkr.hw,1132			},1133			.num_parents = 1,1134			.flags = CLK_SET_RATE_PARENT,1135			.ops = &clk_branch2_ops,1136		},1137	},1138};1139 1140static struct clk_branch camcc_csi1phytimer_clk = {1141	.halt_reg = 0x6040,1142	.halt_check = BRANCH_HALT,1143	.clkr = {1144		.enable_reg = 0x6040,1145		.enable_mask = BIT(0),1146		.hw.init = &(const struct clk_init_data) {1147			.name = "camcc_csi1phytimer_clk",1148			.parent_hws = (const struct clk_hw*[]) {1149				&camcc_csi1phytimer_clk_src.clkr.hw,1150			},1151			.num_parents = 1,1152			.flags = CLK_SET_RATE_PARENT,1153			.ops = &clk_branch2_ops,1154		},1155	},1156};1157 1158static struct clk_branch camcc_csi2phytimer_clk = {1159	.halt_reg = 0x6064,1160	.halt_check = BRANCH_HALT,1161	.clkr = {1162		.enable_reg = 0x6064,1163		.enable_mask = BIT(0),1164		.hw.init = &(const struct clk_init_data) {1165			.name = "camcc_csi2phytimer_clk",1166			.parent_hws = (const struct clk_hw*[]) {1167				&camcc_csi2phytimer_clk_src.clkr.hw,1168			},1169			.num_parents = 1,1170			.flags = CLK_SET_RATE_PARENT,1171			.ops = &clk_branch2_ops,1172		},1173	},1174};1175 1176static struct clk_branch camcc_csi3phytimer_clk = {1177	.halt_reg = 0x6088,1178	.halt_check = BRANCH_HALT,1179	.clkr = {1180		.enable_reg = 0x6088,1181		.enable_mask = BIT(0),1182		.hw.init = &(const struct clk_init_data) {1183			.name = "camcc_csi3phytimer_clk",1184			.parent_hws = (const struct clk_hw*[]) {1185				&camcc_csi3phytimer_clk_src.clkr.hw,1186			},1187			.num_parents = 1,1188			.flags = CLK_SET_RATE_PARENT,1189			.ops = &clk_branch2_ops,1190		},1191	},1192};1193 1194static struct clk_branch camcc_csiphy0_clk = {1195	.halt_reg = 0x6020,1196	.halt_check = BRANCH_HALT,1197	.clkr = {1198		.enable_reg = 0x6020,1199		.enable_mask = BIT(0),1200		.hw.init = &(const struct clk_init_data) {1201			.name = "camcc_csiphy0_clk",1202			.parent_hws = (const struct clk_hw*[]) {1203				&camcc_cphy_rx_clk_src.clkr.hw,1204			},1205			.num_parents = 1,1206			.flags = CLK_SET_RATE_PARENT,1207			.ops = &clk_branch2_ops,1208		},1209	},1210};1211 1212static struct clk_branch camcc_csiphy1_clk = {1213	.halt_reg = 0x6044,1214	.halt_check = BRANCH_HALT,1215	.clkr = {1216		.enable_reg = 0x6044,1217		.enable_mask = BIT(0),1218		.hw.init = &(const struct clk_init_data) {1219			.name = "camcc_csiphy1_clk",1220			.parent_hws = (const struct clk_hw*[]) {1221				&camcc_cphy_rx_clk_src.clkr.hw,1222			},1223			.num_parents = 1,1224			.flags = CLK_SET_RATE_PARENT,1225			.ops = &clk_branch2_ops,1226		},1227	},1228};1229 1230static struct clk_branch camcc_csiphy2_clk = {1231	.halt_reg = 0x6068,1232	.halt_check = BRANCH_HALT,1233	.clkr = {1234		.enable_reg = 0x6068,1235		.enable_mask = BIT(0),1236		.hw.init = &(const struct clk_init_data) {1237			.name = "camcc_csiphy2_clk",1238			.parent_hws = (const struct clk_hw*[]) {1239				&camcc_cphy_rx_clk_src.clkr.hw,1240			},1241			.num_parents = 1,1242			.flags = CLK_SET_RATE_PARENT,1243			.ops = &clk_branch2_ops,1244		},1245	},1246};1247 1248static struct clk_branch camcc_csiphy3_clk = {1249	.halt_reg = 0x608c,1250	.halt_check = BRANCH_HALT,1251	.clkr = {1252		.enable_reg = 0x608c,1253		.enable_mask = BIT(0),1254		.hw.init = &(const struct clk_init_data) {1255			.name = "camcc_csiphy3_clk",1256			.parent_hws = (const struct clk_hw*[]) {1257				&camcc_cphy_rx_clk_src.clkr.hw,1258			},1259			.num_parents = 1,1260			.flags = CLK_SET_RATE_PARENT,1261			.ops = &clk_branch2_ops,1262		},1263	},1264};1265 1266static struct clk_branch camcc_fd_core_clk = {1267	.halt_reg = 0xc0b4,1268	.halt_check = BRANCH_HALT,1269	.clkr = {1270		.enable_reg = 0xc0b4,1271		.enable_mask = BIT(0),1272		.hw.init = &(const struct clk_init_data) {1273			.name = "camcc_fd_core_clk",1274			.parent_hws = (const struct clk_hw*[]) {1275				&camcc_fd_core_clk_src.clkr.hw,1276			},1277			.num_parents = 1,1278			.flags = CLK_SET_RATE_PARENT,1279			.ops = &clk_branch2_ops,1280		},1281	},1282};1283 1284static struct clk_branch camcc_fd_core_uar_clk = {1285	.halt_reg = 0xc0bc,1286	.halt_check = BRANCH_HALT,1287	.clkr = {1288		.enable_reg = 0xc0bc,1289		.enable_mask = BIT(0),1290		.hw.init = &(const struct clk_init_data) {1291			.name = "camcc_fd_core_uar_clk",1292			.parent_hws = (const struct clk_hw*[]) {1293				&camcc_fd_core_clk_src.clkr.hw,1294			},1295			.num_parents = 1,1296			.flags = CLK_SET_RATE_PARENT,1297			.ops = &clk_branch2_ops,1298		},1299	},1300};1301 1302static struct clk_branch camcc_icp_ahb_clk = {1303	.halt_reg = 0xc094,1304	.halt_check = BRANCH_HALT,1305	.clkr = {1306		.enable_reg = 0xc094,1307		.enable_mask = BIT(0),1308		.hw.init = &(const struct clk_init_data) {1309			.name = "camcc_icp_ahb_clk",1310			.parent_hws = (const struct clk_hw*[]) {1311				&camcc_slow_ahb_clk_src.clkr.hw,1312			},1313			.num_parents = 1,1314			.flags = CLK_SET_RATE_PARENT,1315			.ops = &clk_branch2_ops,1316		},1317	},1318};1319 1320static struct clk_branch camcc_icp_clk = {1321	.halt_reg = 0xc08c,1322	.halt_check = BRANCH_HALT,1323	.clkr = {1324		.enable_reg = 0xc08c,1325		.enable_mask = BIT(0),1326		.hw.init = &(const struct clk_init_data) {1327			.name = "camcc_icp_clk",1328			.parent_hws = (const struct clk_hw*[]) {1329				&camcc_icp_clk_src.clkr.hw,1330			},1331			.num_parents = 1,1332			.flags = CLK_SET_RATE_PARENT,1333			.ops = &clk_branch2_ops,1334		},1335	},1336};1337 1338static struct clk_branch camcc_ife_0_axi_clk = {1339	.halt_reg = 0xa080,1340	.halt_check = BRANCH_HALT,1341	.clkr = {1342		.enable_reg = 0xa080,1343		.enable_mask = BIT(0),1344		.hw.init = &(const struct clk_init_data) {1345			.name = "camcc_ife_0_axi_clk",1346			.parent_hws = (const struct clk_hw*[]) {1347				&camcc_camnoc_axi_clk_src.clkr.hw,1348			},1349			.num_parents = 1,1350			.flags = CLK_SET_RATE_PARENT,1351			.ops = &clk_branch2_ops,1352		},1353	},1354};1355 1356static struct clk_branch camcc_ife_0_clk = {1357	.halt_reg = 0xa028,1358	.halt_check = BRANCH_HALT,1359	.clkr = {1360		.enable_reg = 0xa028,1361		.enable_mask = BIT(0),1362		.hw.init = &(const struct clk_init_data) {1363			.name = "camcc_ife_0_clk",1364			.parent_hws = (const struct clk_hw*[]) {1365				&camcc_ife_0_clk_src.clkr.hw,1366			},1367			.num_parents = 1,1368			.flags = CLK_SET_RATE_PARENT,1369			.ops = &clk_branch2_ops,1370		},1371	},1372};1373 1374static struct clk_branch camcc_ife_0_cphy_rx_clk = {1375	.halt_reg = 0xa07c,1376	.halt_check = BRANCH_HALT,1377	.clkr = {1378		.enable_reg = 0xa07c,1379		.enable_mask = BIT(0),1380		.hw.init = &(const struct clk_init_data) {1381			.name = "camcc_ife_0_cphy_rx_clk",1382			.parent_hws = (const struct clk_hw*[]) {1383				&camcc_cphy_rx_clk_src.clkr.hw,1384			},1385			.num_parents = 1,1386			.flags = CLK_SET_RATE_PARENT,1387			.ops = &clk_branch2_ops,1388		},1389	},1390};1391 1392static struct clk_branch camcc_ife_0_csid_clk = {1393	.halt_reg = 0xa054,1394	.halt_check = BRANCH_HALT,1395	.clkr = {1396		.enable_reg = 0xa054,1397		.enable_mask = BIT(0),1398		.hw.init = &(const struct clk_init_data) {1399			.name = "camcc_ife_0_csid_clk",1400			.parent_hws = (const struct clk_hw*[]) {1401				&camcc_ife_0_csid_clk_src.clkr.hw,1402			},1403			.num_parents = 1,1404			.flags = CLK_SET_RATE_PARENT,1405			.ops = &clk_branch2_ops,1406		},1407	},1408};1409 1410static struct clk_branch camcc_ife_0_dsp_clk = {1411	.halt_reg = 0xa038,1412	.halt_check = BRANCH_HALT,1413	.clkr = {1414		.enable_reg = 0xa038,1415		.enable_mask = BIT(0),1416		.hw.init = &(const struct clk_init_data) {1417			.name = "camcc_ife_0_dsp_clk",1418			.parent_hws = (const struct clk_hw*[]) {1419				&camcc_ife_0_clk_src.clkr.hw,1420			},1421			.num_parents = 1,1422			.flags = CLK_SET_RATE_PARENT,1423			.ops = &clk_branch2_ops,1424		},1425	},1426};1427 1428static struct clk_branch camcc_ife_1_axi_clk = {1429	.halt_reg = 0xb058,1430	.halt_check = BRANCH_HALT,1431	.clkr = {1432		.enable_reg = 0xb058,1433		.enable_mask = BIT(0),1434		.hw.init = &(const struct clk_init_data) {1435			.name = "camcc_ife_1_axi_clk",1436			.parent_hws = (const struct clk_hw*[]) {1437				&camcc_camnoc_axi_clk_src.clkr.hw,1438			},1439			.num_parents = 1,1440			.flags = CLK_SET_RATE_PARENT,1441			.ops = &clk_branch2_ops,1442		},1443	},1444};1445 1446static struct clk_branch camcc_ife_1_clk = {1447	.halt_reg = 0xb028,1448	.halt_check = BRANCH_HALT,1449	.clkr = {1450		.enable_reg = 0xb028,1451		.enable_mask = BIT(0),1452		.hw.init = &(const struct clk_init_data) {1453			.name = "camcc_ife_1_clk",1454			.parent_hws = (const struct clk_hw*[]) {1455				&camcc_ife_1_clk_src.clkr.hw,1456			},1457			.num_parents = 1,1458			.flags = CLK_SET_RATE_PARENT,1459			.ops = &clk_branch2_ops,1460		},1461	},1462};1463 1464static struct clk_branch camcc_ife_1_cphy_rx_clk = {1465	.halt_reg = 0xb054,1466	.halt_check = BRANCH_HALT,1467	.clkr = {1468		.enable_reg = 0xb054,1469		.enable_mask = BIT(0),1470		.hw.init = &(const struct clk_init_data) {1471			.name = "camcc_ife_1_cphy_rx_clk",1472			.parent_hws = (const struct clk_hw*[]) {1473				&camcc_cphy_rx_clk_src.clkr.hw,1474			},1475			.num_parents = 1,1476			.flags = CLK_SET_RATE_PARENT,1477			.ops = &clk_branch2_ops,1478		},1479	},1480};1481 1482static struct clk_branch camcc_ife_1_csid_clk = {1483	.halt_reg = 0xb04c,1484	.halt_check = BRANCH_HALT,1485	.clkr = {1486		.enable_reg = 0xb04c,1487		.enable_mask = BIT(0),1488		.hw.init = &(const struct clk_init_data) {1489			.name = "camcc_ife_1_csid_clk",1490			.parent_hws = (const struct clk_hw*[]) {1491				&camcc_ife_1_csid_clk_src.clkr.hw,1492			},1493			.num_parents = 1,1494			.flags = CLK_SET_RATE_PARENT,1495			.ops = &clk_branch2_ops,1496		},1497	},1498};1499 1500static struct clk_branch camcc_ife_1_dsp_clk = {1501	.halt_reg = 0xb030,1502	.halt_check = BRANCH_HALT,1503	.clkr = {1504		.enable_reg = 0xb030,1505		.enable_mask = BIT(0),1506		.hw.init = &(const struct clk_init_data) {1507			.name = "camcc_ife_1_dsp_clk",1508			.parent_hws = (const struct clk_hw*[]) {1509				&camcc_ife_1_clk_src.clkr.hw,1510			},1511			.num_parents = 1,1512			.flags = CLK_SET_RATE_PARENT,1513			.ops = &clk_branch2_ops,1514		},1515	},1516};1517 1518static struct clk_branch camcc_ife_lite_clk = {1519	.halt_reg = 0xc01c,1520	.halt_check = BRANCH_HALT,1521	.clkr = {1522		.enable_reg = 0xc01c,1523		.enable_mask = BIT(0),1524		.hw.init = &(const struct clk_init_data) {1525			.name = "camcc_ife_lite_clk",1526			.parent_hws = (const struct clk_hw*[]) {1527				&camcc_ife_lite_clk_src.clkr.hw,1528			},1529			.num_parents = 1,1530			.flags = CLK_SET_RATE_PARENT,1531			.ops = &clk_branch2_ops,1532		},1533	},1534};1535 1536static struct clk_branch camcc_ife_lite_cphy_rx_clk = {1537	.halt_reg = 0xc040,1538	.halt_check = BRANCH_HALT,1539	.clkr = {1540		.enable_reg = 0xc040,1541		.enable_mask = BIT(0),1542		.hw.init = &(const struct clk_init_data) {1543			.name = "camcc_ife_lite_cphy_rx_clk",1544			.parent_hws = (const struct clk_hw*[]) {1545				&camcc_cphy_rx_clk_src.clkr.hw,1546			},1547			.num_parents = 1,1548			.flags = CLK_SET_RATE_PARENT,1549			.ops = &clk_branch2_ops,1550		},1551	},1552};1553 1554static struct clk_branch camcc_ife_lite_csid_clk = {1555	.halt_reg = 0xc038,1556	.halt_check = BRANCH_HALT,1557	.clkr = {1558		.enable_reg = 0xc038,1559		.enable_mask = BIT(0),1560		.hw.init = &(const struct clk_init_data) {1561			.name = "camcc_ife_lite_csid_clk",1562			.parent_hws = (const struct clk_hw*[]) {1563				&camcc_ife_lite_csid_clk_src.clkr.hw,1564			},1565			.num_parents = 1,1566			.flags = CLK_SET_RATE_PARENT,1567			.ops = &clk_branch2_ops,1568		},1569	},1570};1571 1572static struct clk_branch camcc_ipe_0_ahb_clk = {1573	.halt_reg = 0x8040,1574	.halt_check = BRANCH_HALT,1575	.clkr = {1576		.enable_reg = 0x8040,1577		.enable_mask = BIT(0),1578		.hw.init = &(const struct clk_init_data) {1579			.name = "camcc_ipe_0_ahb_clk",1580			.parent_hws = (const struct clk_hw*[]) {1581				&camcc_slow_ahb_clk_src.clkr.hw,1582			},1583			.num_parents = 1,1584			.flags = CLK_SET_RATE_PARENT,1585			.ops = &clk_branch2_ops,1586		},1587	},1588};1589 1590static struct clk_branch camcc_ipe_0_areg_clk = {1591	.halt_reg = 0x803c,1592	.halt_check = BRANCH_HALT,1593	.clkr = {1594		.enable_reg = 0x803c,1595		.enable_mask = BIT(0),1596		.hw.init = &(const struct clk_init_data) {1597			.name = "camcc_ipe_0_areg_clk",1598			.parent_hws = (const struct clk_hw*[]) {1599				&camcc_fast_ahb_clk_src.clkr.hw,1600			},1601			.num_parents = 1,1602			.flags = CLK_SET_RATE_PARENT,1603			.ops = &clk_branch2_ops,1604		},1605	},1606};1607 1608static struct clk_branch camcc_ipe_0_axi_clk = {1609	.halt_reg = 0x8038,1610	.halt_check = BRANCH_HALT,1611	.clkr = {1612		.enable_reg = 0x8038,1613		.enable_mask = BIT(0),1614		.hw.init = &(const struct clk_init_data) {1615			.name = "camcc_ipe_0_axi_clk",1616			.parent_hws = (const struct clk_hw*[]) {1617				&camcc_camnoc_axi_clk_src.clkr.hw,1618			},1619			.num_parents = 1,1620			.flags = CLK_SET_RATE_PARENT,1621			.ops = &clk_branch2_ops,1622		},1623	},1624};1625 1626static struct clk_branch camcc_ipe_0_clk = {1627	.halt_reg = 0x8028,1628	.halt_check = BRANCH_HALT,1629	.clkr = {1630		.enable_reg = 0x8028,1631		.enable_mask = BIT(0),1632		.hw.init = &(const struct clk_init_data) {1633			.name = "camcc_ipe_0_clk",1634			.parent_hws = (const struct clk_hw*[]) {1635				&camcc_ipe_0_clk_src.clkr.hw,1636			},1637			.num_parents = 1,1638			.flags = CLK_SET_RATE_PARENT,1639			.ops = &clk_branch2_ops,1640		},1641	},1642};1643 1644static struct clk_branch camcc_ipe_1_ahb_clk = {1645	.halt_reg = 0x9028,1646	.halt_check = BRANCH_HALT,1647	.clkr = {1648		.enable_reg = 0x9028,1649		.enable_mask = BIT(0),1650		.hw.init = &(const struct clk_init_data) {1651			.name = "camcc_ipe_1_ahb_clk",1652			.parent_hws = (const struct clk_hw*[]) {1653				&camcc_slow_ahb_clk_src.clkr.hw,1654			},1655			.num_parents = 1,1656			.flags = CLK_SET_RATE_PARENT,1657			.ops = &clk_branch2_ops,1658		},1659	},1660};1661 1662static struct clk_branch camcc_ipe_1_areg_clk = {1663	.halt_reg = 0x9024,1664	.halt_check = BRANCH_HALT,1665	.clkr = {1666		.enable_reg = 0x9024,1667		.enable_mask = BIT(0),1668		.hw.init = &(const struct clk_init_data) {1669			.name = "camcc_ipe_1_areg_clk",1670			.parent_hws = (const struct clk_hw*[]) {1671				&camcc_fast_ahb_clk_src.clkr.hw,1672			},1673			.num_parents = 1,1674			.flags = CLK_SET_RATE_PARENT,1675			.ops = &clk_branch2_ops,1676		},1677	},1678};1679 1680static struct clk_branch camcc_ipe_1_axi_clk = {1681	.halt_reg = 0x9020,1682	.halt_check = BRANCH_HALT,1683	.clkr = {1684		.enable_reg = 0x9020,1685		.enable_mask = BIT(0),1686		.hw.init = &(const struct clk_init_data) {1687			.name = "camcc_ipe_1_axi_clk",1688			.parent_hws = (const struct clk_hw*[]) {1689				&camcc_camnoc_axi_clk_src.clkr.hw,1690			},1691			.num_parents = 1,1692			.flags = CLK_SET_RATE_PARENT,1693			.ops = &clk_branch2_ops,1694		},1695	},1696};1697 1698static struct clk_branch camcc_ipe_1_clk = {1699	.halt_reg = 0x9010,1700	.halt_check = BRANCH_HALT,1701	.clkr = {1702		.enable_reg = 0x9010,1703		.enable_mask = BIT(0),1704		.hw.init = &(const struct clk_init_data) {1705			.name = "camcc_ipe_1_clk",1706			.parent_hws = (const struct clk_hw*[]) {1707				&camcc_ipe_0_clk_src.clkr.hw,1708			},1709			.num_parents = 1,1710			.flags = CLK_SET_RATE_PARENT,1711			.ops = &clk_branch2_ops,1712		},1713	},1714};1715 1716static struct clk_branch camcc_jpeg_clk = {1717	.halt_reg = 0xc060,1718	.halt_check = BRANCH_HALT,1719	.clkr = {1720		.enable_reg = 0xc060,1721		.enable_mask = BIT(0),1722		.hw.init = &(const struct clk_init_data) {1723			.name = "camcc_jpeg_clk",1724			.parent_hws = (const struct clk_hw*[]) {1725				&camcc_jpeg_clk_src.clkr.hw,1726			},1727			.num_parents = 1,1728			.flags = CLK_SET_RATE_PARENT,1729			.ops = &clk_branch2_ops,1730		},1731	},1732};1733 1734static struct clk_branch camcc_lrme_clk = {1735	.halt_reg = 0xc118,1736	.halt_check = BRANCH_HALT,1737	.clkr = {1738		.enable_reg = 0xc118,1739		.enable_mask = BIT(0),1740		.hw.init = &(const struct clk_init_data) {1741			.name = "camcc_lrme_clk",1742			.parent_hws = (const struct clk_hw*[]) {1743				&camcc_lrme_clk_src.clkr.hw,1744			},1745			.num_parents = 1,1746			.flags = CLK_SET_RATE_PARENT,1747			.ops = &clk_branch2_ops,1748		},1749	},1750};1751 1752static struct clk_branch camcc_mclk0_clk = {1753	.halt_reg = 0x501c,1754	.halt_check = BRANCH_HALT,1755	.clkr = {1756		.enable_reg = 0x501c,1757		.enable_mask = BIT(0),1758		.hw.init = &(const struct clk_init_data) {1759			.name = "camcc_mclk0_clk",1760			.parent_hws = (const struct clk_hw*[]) {1761				&camcc_mclk0_clk_src.clkr.hw,1762			},1763			.num_parents = 1,1764			.flags = CLK_SET_RATE_PARENT,1765			.ops = &clk_branch2_ops,1766		},1767	},1768};1769 1770static struct clk_branch camcc_mclk1_clk = {1771	.halt_reg = 0x503c,1772	.halt_check = BRANCH_HALT,1773	.clkr = {1774		.enable_reg = 0x503c,1775		.enable_mask = BIT(0),1776		.hw.init = &(const struct clk_init_data) {1777			.name = "camcc_mclk1_clk",1778			.parent_hws = (const struct clk_hw*[]) {1779				&camcc_mclk1_clk_src.clkr.hw,1780			},1781			.num_parents = 1,1782			.flags = CLK_SET_RATE_PARENT,1783			.ops = &clk_branch2_ops,1784		},1785	},1786};1787 1788static struct clk_branch camcc_mclk2_clk = {1789	.halt_reg = 0x505c,1790	.halt_check = BRANCH_HALT,1791	.clkr = {1792		.enable_reg = 0x505c,1793		.enable_mask = BIT(0),1794		.hw.init = &(const struct clk_init_data) {1795			.name = "camcc_mclk2_clk",1796			.parent_hws = (const struct clk_hw*[]) {1797				&camcc_mclk2_clk_src.clkr.hw,1798			},1799			.num_parents = 1,1800			.flags = CLK_SET_RATE_PARENT,1801			.ops = &clk_branch2_ops,1802		},1803	},1804};1805 1806static struct clk_branch camcc_mclk3_clk = {1807	.halt_reg = 0x507c,1808	.halt_check = BRANCH_HALT,1809	.clkr = {1810		.enable_reg = 0x507c,1811		.enable_mask = BIT(0),1812		.hw.init = &(const struct clk_init_data) {1813			.name = "camcc_mclk3_clk",1814			.parent_hws = (const struct clk_hw*[]) {1815				&camcc_mclk3_clk_src.clkr.hw,1816			},1817			.num_parents = 1,1818			.flags = CLK_SET_RATE_PARENT,1819			.ops = &clk_branch2_ops,1820		},1821	},1822};1823 1824static struct clk_branch camcc_sleep_clk = {1825	.halt_reg = 0xc1bc,1826	.halt_check = BRANCH_HALT,1827	.clkr = {1828		.enable_reg = 0xc1bc,1829		.enable_mask = BIT(0),1830		.hw.init = &(const struct clk_init_data) {1831			.name = "camcc_sleep_clk",1832			.parent_hws = (const struct clk_hw*[]) {1833				&camcc_sleep_clk_src.clkr.hw,1834			},1835			.num_parents = 1,1836			.flags = CLK_SET_RATE_PARENT,1837			.ops = &clk_branch2_ops,1838		},1839	},1840};1841 1842static struct gdsc camcc_titan_top_gdsc;1843 1844static struct gdsc camcc_bps_gdsc = {1845	.gdscr = 0x7004,1846	.pd = {1847		.name = "camcc_bps_gdsc",1848	},1849	.flags = HW_CTRL | POLL_CFG_GDSCR,1850	.pwrsts = PWRSTS_OFF_ON,1851};1852 1853static struct gdsc camcc_ife_0_gdsc = {1854	.gdscr = 0xa004,1855	.pd = {1856		.name = "camcc_ife_0_gdsc",1857	},1858	.flags = POLL_CFG_GDSCR,1859	.parent = &camcc_titan_top_gdsc.pd,1860	.pwrsts = PWRSTS_OFF_ON,1861};1862 1863static struct gdsc camcc_ife_1_gdsc = {1864	.gdscr = 0xb004,1865	.pd = {1866		.name = "camcc_ife_1_gdsc",1867	},1868	.flags = POLL_CFG_GDSCR,1869	.parent = &camcc_titan_top_gdsc.pd,1870	.pwrsts = PWRSTS_OFF_ON,1871};1872 1873static struct gdsc camcc_ipe_0_gdsc = {1874	.gdscr = 0x8004,1875	.pd = {1876		.name = "camcc_ipe_0_gdsc",1877	},1878	.flags = HW_CTRL | POLL_CFG_GDSCR,1879	.pwrsts = PWRSTS_OFF_ON,1880};1881 1882static struct gdsc camcc_ipe_1_gdsc = {1883	.gdscr = 0x9004,1884	.pd = {1885		.name = "camcc_ipe_1_gdsc",1886	},1887	.flags = HW_CTRL | POLL_CFG_GDSCR,1888	.pwrsts = PWRSTS_OFF_ON,1889};1890 1891static struct gdsc camcc_titan_top_gdsc = {1892	.gdscr = 0xc1c4,1893	.pd = {1894		.name = "camcc_titan_top_gdsc",1895	},1896	.flags = POLL_CFG_GDSCR,1897	.pwrsts = PWRSTS_OFF_ON,1898};1899 1900struct clk_hw *camcc_sm7150_hws[] = {1901	[CAMCC_PLL0_OUT_EVEN] = &camcc_pll0_out_even.hw,1902	[CAMCC_PLL0_OUT_ODD] = &camcc_pll0_out_odd.hw,1903	[CAMCC_PLL1_OUT_EVEN] = &camcc_pll1_out_even.hw,1904	[CAMCC_PLL2_OUT_EARLY] = &camcc_pll2_out_early.hw,1905	[CAMCC_PLL3_OUT_EVEN] = &camcc_pll3_out_even.hw,1906	[CAMCC_PLL4_OUT_EVEN] = &camcc_pll4_out_even.hw,1907};1908 1909static struct clk_regmap *camcc_sm7150_clocks[] = {1910	[CAMCC_BPS_AHB_CLK] = &camcc_bps_ahb_clk.clkr,1911	[CAMCC_BPS_AREG_CLK] = &camcc_bps_areg_clk.clkr,1912	[CAMCC_BPS_AXI_CLK] = &camcc_bps_axi_clk.clkr,1913	[CAMCC_BPS_CLK] = &camcc_bps_clk.clkr,1914	[CAMCC_BPS_CLK_SRC] = &camcc_bps_clk_src.clkr,1915	[CAMCC_CAMNOC_AXI_CLK] = &camcc_camnoc_axi_clk.clkr,1916	[CAMCC_CAMNOC_AXI_CLK_SRC] = &camcc_camnoc_axi_clk_src.clkr,1917	[CAMCC_CAMNOC_DCD_XO_CLK] = &camcc_camnoc_dcd_xo_clk.clkr,1918	[CAMCC_CCI_0_CLK] = &camcc_cci_0_clk.clkr,1919	[CAMCC_CCI_0_CLK_SRC] = &camcc_cci_0_clk_src.clkr,1920	[CAMCC_CCI_1_CLK] = &camcc_cci_1_clk.clkr,1921	[CAMCC_CCI_1_CLK_SRC] = &camcc_cci_1_clk_src.clkr,1922	[CAMCC_CORE_AHB_CLK] = &camcc_core_ahb_clk.clkr,1923	[CAMCC_CPAS_AHB_CLK] = &camcc_cpas_ahb_clk.clkr,1924	[CAMCC_CPHY_RX_CLK_SRC] = &camcc_cphy_rx_clk_src.clkr,1925	[CAMCC_CSI0PHYTIMER_CLK] = &camcc_csi0phytimer_clk.clkr,1926	[CAMCC_CSI0PHYTIMER_CLK_SRC] = &camcc_csi0phytimer_clk_src.clkr,1927	[CAMCC_CSI1PHYTIMER_CLK] = &camcc_csi1phytimer_clk.clkr,1928	[CAMCC_CSI1PHYTIMER_CLK_SRC] = &camcc_csi1phytimer_clk_src.clkr,1929	[CAMCC_CSI2PHYTIMER_CLK] = &camcc_csi2phytimer_clk.clkr,1930	[CAMCC_CSI2PHYTIMER_CLK_SRC] = &camcc_csi2phytimer_clk_src.clkr,1931	[CAMCC_CSI3PHYTIMER_CLK] = &camcc_csi3phytimer_clk.clkr,1932	[CAMCC_CSI3PHYTIMER_CLK_SRC] = &camcc_csi3phytimer_clk_src.clkr,1933	[CAMCC_CSIPHY0_CLK] = &camcc_csiphy0_clk.clkr,1934	[CAMCC_CSIPHY1_CLK] = &camcc_csiphy1_clk.clkr,1935	[CAMCC_CSIPHY2_CLK] = &camcc_csiphy2_clk.clkr,1936	[CAMCC_CSIPHY3_CLK] = &camcc_csiphy3_clk.clkr,1937	[CAMCC_FAST_AHB_CLK_SRC] = &camcc_fast_ahb_clk_src.clkr,1938	[CAMCC_FD_CORE_CLK] = &camcc_fd_core_clk.clkr,1939	[CAMCC_FD_CORE_CLK_SRC] = &camcc_fd_core_clk_src.clkr,1940	[CAMCC_FD_CORE_UAR_CLK] = &camcc_fd_core_uar_clk.clkr,1941	[CAMCC_ICP_AHB_CLK] = &camcc_icp_ahb_clk.clkr,1942	[CAMCC_ICP_CLK] = &camcc_icp_clk.clkr,1943	[CAMCC_ICP_CLK_SRC] = &camcc_icp_clk_src.clkr,1944	[CAMCC_IFE_0_AXI_CLK] = &camcc_ife_0_axi_clk.clkr,1945	[CAMCC_IFE_0_CLK] = &camcc_ife_0_clk.clkr,1946	[CAMCC_IFE_0_CLK_SRC] = &camcc_ife_0_clk_src.clkr,1947	[CAMCC_IFE_0_CPHY_RX_CLK] = &camcc_ife_0_cphy_rx_clk.clkr,1948	[CAMCC_IFE_0_CSID_CLK] = &camcc_ife_0_csid_clk.clkr,1949	[CAMCC_IFE_0_CSID_CLK_SRC] = &camcc_ife_0_csid_clk_src.clkr,1950	[CAMCC_IFE_0_DSP_CLK] = &camcc_ife_0_dsp_clk.clkr,1951	[CAMCC_IFE_1_AXI_CLK] = &camcc_ife_1_axi_clk.clkr,1952	[CAMCC_IFE_1_CLK] = &camcc_ife_1_clk.clkr,1953	[CAMCC_IFE_1_CLK_SRC] = &camcc_ife_1_clk_src.clkr,1954	[CAMCC_IFE_1_CPHY_RX_CLK] = &camcc_ife_1_cphy_rx_clk.clkr,1955	[CAMCC_IFE_1_CSID_CLK] = &camcc_ife_1_csid_clk.clkr,1956	[CAMCC_IFE_1_CSID_CLK_SRC] = &camcc_ife_1_csid_clk_src.clkr,1957	[CAMCC_IFE_1_DSP_CLK] = &camcc_ife_1_dsp_clk.clkr,1958	[CAMCC_IFE_LITE_CLK] = &camcc_ife_lite_clk.clkr,1959	[CAMCC_IFE_LITE_CLK_SRC] = &camcc_ife_lite_clk_src.clkr,1960	[CAMCC_IFE_LITE_CPHY_RX_CLK] = &camcc_ife_lite_cphy_rx_clk.clkr,1961	[CAMCC_IFE_LITE_CSID_CLK] = &camcc_ife_lite_csid_clk.clkr,1962	[CAMCC_IFE_LITE_CSID_CLK_SRC] = &camcc_ife_lite_csid_clk_src.clkr,1963	[CAMCC_IPE_0_AHB_CLK] = &camcc_ipe_0_ahb_clk.clkr,1964	[CAMCC_IPE_0_AREG_CLK] = &camcc_ipe_0_areg_clk.clkr,1965	[CAMCC_IPE_0_AXI_CLK] = &camcc_ipe_0_axi_clk.clkr,1966	[CAMCC_IPE_0_CLK] = &camcc_ipe_0_clk.clkr,1967	[CAMCC_IPE_0_CLK_SRC] = &camcc_ipe_0_clk_src.clkr,1968	[CAMCC_IPE_1_AHB_CLK] = &camcc_ipe_1_ahb_clk.clkr,1969	[CAMCC_IPE_1_AREG_CLK] = &camcc_ipe_1_areg_clk.clkr,1970	[CAMCC_IPE_1_AXI_CLK] = &camcc_ipe_1_axi_clk.clkr,1971	[CAMCC_IPE_1_CLK] = &camcc_ipe_1_clk.clkr,1972	[CAMCC_JPEG_CLK] = &camcc_jpeg_clk.clkr,1973	[CAMCC_JPEG_CLK_SRC] = &camcc_jpeg_clk_src.clkr,1974	[CAMCC_LRME_CLK] = &camcc_lrme_clk.clkr,1975	[CAMCC_LRME_CLK_SRC] = &camcc_lrme_clk_src.clkr,1976	[CAMCC_MCLK0_CLK] = &camcc_mclk0_clk.clkr,1977	[CAMCC_MCLK0_CLK_SRC] = &camcc_mclk0_clk_src.clkr,1978	[CAMCC_MCLK1_CLK] = &camcc_mclk1_clk.clkr,1979	[CAMCC_MCLK1_CLK_SRC] = &camcc_mclk1_clk_src.clkr,1980	[CAMCC_MCLK2_CLK] = &camcc_mclk2_clk.clkr,1981	[CAMCC_MCLK2_CLK_SRC] = &camcc_mclk2_clk_src.clkr,1982	[CAMCC_MCLK3_CLK] = &camcc_mclk3_clk.clkr,1983	[CAMCC_MCLK3_CLK_SRC] = &camcc_mclk3_clk_src.clkr,1984	[CAMCC_PLL0] = &camcc_pll0.clkr,1985	[CAMCC_PLL1] = &camcc_pll1.clkr,1986	[CAMCC_PLL2] = &camcc_pll2.clkr,1987	[CAMCC_PLL2_OUT_AUX] = &camcc_pll2_out_aux.clkr,1988	[CAMCC_PLL2_OUT_MAIN] = &camcc_pll2_out_main.clkr,1989	[CAMCC_PLL3] = &camcc_pll3.clkr,1990	[CAMCC_PLL4] = &camcc_pll4.clkr,1991	[CAMCC_SLEEP_CLK] = &camcc_sleep_clk.clkr,1992	[CAMCC_SLEEP_CLK_SRC] = &camcc_sleep_clk_src.clkr,1993	[CAMCC_SLOW_AHB_CLK_SRC] = &camcc_slow_ahb_clk_src.clkr,1994	[CAMCC_XO_CLK_SRC] = &camcc_xo_clk_src.clkr,1995};1996 1997static struct gdsc *camcc_sm7150_gdscs[] = {1998	[BPS_GDSC] = &camcc_bps_gdsc,1999	[IFE_0_GDSC] = &camcc_ife_0_gdsc,2000	[IFE_1_GDSC] = &camcc_ife_1_gdsc,2001	[IPE_0_GDSC] = &camcc_ipe_0_gdsc,2002	[IPE_1_GDSC] = &camcc_ipe_1_gdsc,2003	[TITAN_TOP_GDSC] = &camcc_titan_top_gdsc,2004};2005 2006static const struct regmap_config camcc_sm7150_regmap_config = {2007	.reg_bits	= 32,2008	.reg_stride	= 4,2009	.val_bits	= 32,2010	.max_register	= 0xd024,2011	.fast_io	= true,2012};2013 2014static const struct qcom_cc_desc camcc_sm7150_desc = {2015	.config = &camcc_sm7150_regmap_config,2016	.clk_hws = camcc_sm7150_hws,2017	.num_clk_hws = ARRAY_SIZE(camcc_sm7150_hws),2018	.clks = camcc_sm7150_clocks,2019	.num_clks = ARRAY_SIZE(camcc_sm7150_clocks),2020	.gdscs = camcc_sm7150_gdscs,2021	.num_gdscs = ARRAY_SIZE(camcc_sm7150_gdscs),2022};2023 2024static const struct of_device_id camcc_sm7150_match_table[] = {2025	{ .compatible = "qcom,sm7150-camcc" },2026	{ }2027};2028MODULE_DEVICE_TABLE(of, camcc_sm7150_match_table);2029 2030static int camcc_sm7150_probe(struct platform_device *pdev)2031{2032	struct regmap *regmap;2033 2034	regmap = qcom_cc_map(pdev, &camcc_sm7150_desc);2035	if (IS_ERR(regmap))2036		return PTR_ERR(regmap);2037 2038	clk_fabia_pll_configure(&camcc_pll0, regmap, &camcc_pll0_config);2039	clk_fabia_pll_configure(&camcc_pll1, regmap, &camcc_pll1_config);2040	clk_agera_pll_configure(&camcc_pll2, regmap, &camcc_pll2_config);2041	clk_fabia_pll_configure(&camcc_pll3, regmap, &camcc_pll3_config);2042	clk_fabia_pll_configure(&camcc_pll4, regmap, &camcc_pll3_config);2043 2044	/* Keep some clocks always-on */2045	qcom_branch_set_clk_en(regmap, 0xc1a0); /* CAMCC_GDSC_CLK */2046 2047	return qcom_cc_really_probe(&pdev->dev, &camcc_sm7150_desc, regmap);2048}2049 2050static struct platform_driver camcc_sm7150_driver = {2051	.probe = camcc_sm7150_probe,2052	.driver = {2053		.name = "camcc-sm7150",2054		.of_match_table = camcc_sm7150_match_table,2055	},2056};2057 2058module_platform_driver(camcc_sm7150_driver);2059 2060MODULE_DESCRIPTION("Qualcomm SM7150 Camera Clock Controller");2061MODULE_LICENSE("GPL");2062