brintos

brintos / linux-shallow public Read only

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