1*3e7b0080SImran Shaik // SPDX-License-Identifier: GPL-2.0-only
2*3e7b0080SImran Shaik /*
3*3e7b0080SImran Shaik * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
4*3e7b0080SImran Shaik */
5*3e7b0080SImran Shaik
6*3e7b0080SImran Shaik #include <linux/clk-provider.h>
7*3e7b0080SImran Shaik #include <linux/module.h>
8*3e7b0080SImran Shaik #include <linux/platform_device.h>
9*3e7b0080SImran Shaik #include <linux/regmap.h>
10*3e7b0080SImran Shaik
11*3e7b0080SImran Shaik #include <dt-bindings/clock/qcom,shikra-audiocorecc.h>
12*3e7b0080SImran Shaik
13*3e7b0080SImran Shaik #include "clk-alpha-pll.h"
14*3e7b0080SImran Shaik #include "clk-branch.h"
15*3e7b0080SImran Shaik #include "clk-pll.h"
16*3e7b0080SImran Shaik #include "clk-rcg.h"
17*3e7b0080SImran Shaik #include "clk-regmap.h"
18*3e7b0080SImran Shaik #include "clk-regmap-divider.h"
19*3e7b0080SImran Shaik #include "clk-regmap-mux.h"
20*3e7b0080SImran Shaik #include "common.h"
21*3e7b0080SImran Shaik #include "reset.h"
22*3e7b0080SImran Shaik
23*3e7b0080SImran Shaik enum {
24*3e7b0080SImran Shaik DT_BI_TCXO,
25*3e7b0080SImran Shaik DT_SLEEP_CLK,
26*3e7b0080SImran Shaik DT_AUD_REF_CLK_SRC,
27*3e7b0080SImran Shaik };
28*3e7b0080SImran Shaik
29*3e7b0080SImran Shaik enum {
30*3e7b0080SImran Shaik P_AUD_REF_CLK_SRC,
31*3e7b0080SImran Shaik P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX,
32*3e7b0080SImran Shaik P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX2,
33*3e7b0080SImran Shaik P_BI_TCXO,
34*3e7b0080SImran Shaik P_SLEEP_CLK,
35*3e7b0080SImran Shaik };
36*3e7b0080SImran Shaik
37*3e7b0080SImran Shaik static const struct pll_vco spark_vco[] = {
38*3e7b0080SImran Shaik { 500000000, 1000000000, 2 },
39*3e7b0080SImran Shaik };
40*3e7b0080SImran Shaik
41*3e7b0080SImran Shaik /* 614.4 MHz Configuration */
42*3e7b0080SImran Shaik static const struct alpha_pll_config audio_core_cc_dig_pll_config = {
43*3e7b0080SImran Shaik .l = 0x20,
44*3e7b0080SImran Shaik .alpha = 0x0,
45*3e7b0080SImran Shaik .vco_val = BIT(21),
46*3e7b0080SImran Shaik .post_div_val = 0x28100,
47*3e7b0080SImran Shaik .post_div_mask = GENMASK(17, 8),
48*3e7b0080SImran Shaik .vco_mask = GENMASK(21, 20),
49*3e7b0080SImran Shaik .main_output_mask = BIT(0),
50*3e7b0080SImran Shaik .aux_output_mask = BIT(1),
51*3e7b0080SImran Shaik .aux2_output_mask = BIT(2),
52*3e7b0080SImran Shaik .config_ctl_val = 0x4001055b,
53*3e7b0080SImran Shaik .test_ctl_hi_val = 0x1,
54*3e7b0080SImran Shaik .test_ctl_hi_mask = 0x1,
55*3e7b0080SImran Shaik };
56*3e7b0080SImran Shaik
57*3e7b0080SImran Shaik static struct clk_alpha_pll audio_core_cc_dig_pll = {
58*3e7b0080SImran Shaik .offset = 0x0,
59*3e7b0080SImran Shaik .config = &audio_core_cc_dig_pll_config,
60*3e7b0080SImran Shaik .vco_table = spark_vco,
61*3e7b0080SImran Shaik .num_vco = ARRAY_SIZE(spark_vco),
62*3e7b0080SImran Shaik .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
63*3e7b0080SImran Shaik .clkr = {
64*3e7b0080SImran Shaik .hw.init = &(const struct clk_init_data) {
65*3e7b0080SImran Shaik .name = "audio_core_cc_dig_pll",
66*3e7b0080SImran Shaik .parent_data = &(const struct clk_parent_data) {
67*3e7b0080SImran Shaik .index = DT_BI_TCXO,
68*3e7b0080SImran Shaik },
69*3e7b0080SImran Shaik .num_parents = 1,
70*3e7b0080SImran Shaik .ops = &clk_alpha_pll_fixed_ops,
71*3e7b0080SImran Shaik },
72*3e7b0080SImran Shaik },
73*3e7b0080SImran Shaik };
74*3e7b0080SImran Shaik
75*3e7b0080SImran Shaik static struct clk_fixed_factor audio_core_cc_dig_pll_out_aux = {
76*3e7b0080SImran Shaik .mult = 1,
77*3e7b0080SImran Shaik .div = 5,
78*3e7b0080SImran Shaik .hw.init = &(struct clk_init_data) {
79*3e7b0080SImran Shaik .name = "audio_core_cc_dig_pll_out_aux",
80*3e7b0080SImran Shaik .parent_data = &(const struct clk_parent_data) {
81*3e7b0080SImran Shaik .hw = &audio_core_cc_dig_pll.clkr.hw,
82*3e7b0080SImran Shaik },
83*3e7b0080SImran Shaik .num_parents = 1,
84*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
85*3e7b0080SImran Shaik .ops = &clk_fixed_factor_ops,
86*3e7b0080SImran Shaik },
87*3e7b0080SImran Shaik };
88*3e7b0080SImran Shaik
89*3e7b0080SImran Shaik static struct clk_fixed_factor audio_core_cc_dig_pll_out_aux2 = {
90*3e7b0080SImran Shaik .mult = 1,
91*3e7b0080SImran Shaik .div = 2,
92*3e7b0080SImran Shaik .hw.init = &(struct clk_init_data) {
93*3e7b0080SImran Shaik .name = "audio_core_cc_dig_pll_out_aux2",
94*3e7b0080SImran Shaik .parent_data = &(const struct clk_parent_data) {
95*3e7b0080SImran Shaik .hw = &audio_core_cc_dig_pll.clkr.hw,
96*3e7b0080SImran Shaik },
97*3e7b0080SImran Shaik .num_parents = 1,
98*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
99*3e7b0080SImran Shaik .ops = &clk_fixed_factor_ops,
100*3e7b0080SImran Shaik },
101*3e7b0080SImran Shaik };
102*3e7b0080SImran Shaik
103*3e7b0080SImran Shaik static const struct parent_map audio_core_cc_parent_map_0[] = {
104*3e7b0080SImran Shaik { P_BI_TCXO, 0 },
105*3e7b0080SImran Shaik { P_AUD_REF_CLK_SRC, 1 },
106*3e7b0080SImran Shaik { P_SLEEP_CLK, 2 },
107*3e7b0080SImran Shaik { P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 4 },
108*3e7b0080SImran Shaik { P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX2, 6 },
109*3e7b0080SImran Shaik };
110*3e7b0080SImran Shaik
111*3e7b0080SImran Shaik static const struct clk_parent_data audio_core_cc_parent_data_0[] = {
112*3e7b0080SImran Shaik { .index = DT_BI_TCXO },
113*3e7b0080SImran Shaik { .index = DT_AUD_REF_CLK_SRC },
114*3e7b0080SImran Shaik { .index = DT_SLEEP_CLK },
115*3e7b0080SImran Shaik { .hw = &audio_core_cc_dig_pll_out_aux.hw },
116*3e7b0080SImran Shaik { .hw = &audio_core_cc_dig_pll_out_aux2.hw },
117*3e7b0080SImran Shaik };
118*3e7b0080SImran Shaik
119*3e7b0080SImran Shaik static const struct freq_tbl ftbl_audio_core_cc_aif_if0_clk_src[] = {
120*3e7b0080SImran Shaik F(240000, P_BI_TCXO, 10, 1, 8),
121*3e7b0080SImran Shaik F(256000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 15, 1, 32),
122*3e7b0080SImran Shaik F(512000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 15, 1, 16),
123*3e7b0080SImran Shaik F(768000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 10, 1, 16),
124*3e7b0080SImran Shaik F(1024000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 15, 1, 8),
125*3e7b0080SImran Shaik F(1536000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 10, 1, 8),
126*3e7b0080SImran Shaik F(2048000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 15, 1, 4),
127*3e7b0080SImran Shaik F(3072000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 10, 1, 4),
128*3e7b0080SImran Shaik F(4096000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 15, 1, 2),
129*3e7b0080SImran Shaik F(6144000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 10, 1, 2),
130*3e7b0080SImran Shaik F(8192000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 15, 0, 0),
131*3e7b0080SImran Shaik F(9600000, P_BI_TCXO, 2, 0, 0),
132*3e7b0080SImran Shaik F(12288000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 10, 0, 0),
133*3e7b0080SImran Shaik F(19200000, P_BI_TCXO, 1, 0, 0),
134*3e7b0080SImran Shaik F(24576000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 5, 0, 0),
135*3e7b0080SImran Shaik { }
136*3e7b0080SImran Shaik };
137*3e7b0080SImran Shaik
138*3e7b0080SImran Shaik static struct clk_rcg2 audio_core_cc_aif_if0_clk_src = {
139*3e7b0080SImran Shaik .cmd_rcgr = 0x104c,
140*3e7b0080SImran Shaik .mnd_width = 16,
141*3e7b0080SImran Shaik .hid_width = 5,
142*3e7b0080SImran Shaik .parent_map = audio_core_cc_parent_map_0,
143*3e7b0080SImran Shaik .freq_tbl = ftbl_audio_core_cc_aif_if0_clk_src,
144*3e7b0080SImran Shaik .hw_clk_ctrl = true,
145*3e7b0080SImran Shaik .clkr.hw.init = &(const struct clk_init_data) {
146*3e7b0080SImran Shaik .name = "audio_core_cc_aif_if0_clk_src",
147*3e7b0080SImran Shaik .parent_data = audio_core_cc_parent_data_0,
148*3e7b0080SImran Shaik .num_parents = ARRAY_SIZE(audio_core_cc_parent_data_0),
149*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
150*3e7b0080SImran Shaik .ops = &clk_rcg2_shared_ops,
151*3e7b0080SImran Shaik },
152*3e7b0080SImran Shaik };
153*3e7b0080SImran Shaik
154*3e7b0080SImran Shaik static struct clk_rcg2 audio_core_cc_aif_if1_clk_src = {
155*3e7b0080SImran Shaik .cmd_rcgr = 0x10b0,
156*3e7b0080SImran Shaik .mnd_width = 16,
157*3e7b0080SImran Shaik .hid_width = 5,
158*3e7b0080SImran Shaik .parent_map = audio_core_cc_parent_map_0,
159*3e7b0080SImran Shaik .freq_tbl = ftbl_audio_core_cc_aif_if0_clk_src,
160*3e7b0080SImran Shaik .hw_clk_ctrl = true,
161*3e7b0080SImran Shaik .clkr.hw.init = &(const struct clk_init_data) {
162*3e7b0080SImran Shaik .name = "audio_core_cc_aif_if1_clk_src",
163*3e7b0080SImran Shaik .parent_data = audio_core_cc_parent_data_0,
164*3e7b0080SImran Shaik .num_parents = ARRAY_SIZE(audio_core_cc_parent_data_0),
165*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
166*3e7b0080SImran Shaik .ops = &clk_rcg2_shared_ops,
167*3e7b0080SImran Shaik },
168*3e7b0080SImran Shaik };
169*3e7b0080SImran Shaik
170*3e7b0080SImran Shaik static struct clk_rcg2 audio_core_cc_aif_if2_clk_src = {
171*3e7b0080SImran Shaik .cmd_rcgr = 0x1114,
172*3e7b0080SImran Shaik .mnd_width = 16,
173*3e7b0080SImran Shaik .hid_width = 5,
174*3e7b0080SImran Shaik .parent_map = audio_core_cc_parent_map_0,
175*3e7b0080SImran Shaik .freq_tbl = ftbl_audio_core_cc_aif_if0_clk_src,
176*3e7b0080SImran Shaik .hw_clk_ctrl = true,
177*3e7b0080SImran Shaik .clkr.hw.init = &(const struct clk_init_data) {
178*3e7b0080SImran Shaik .name = "audio_core_cc_aif_if2_clk_src",
179*3e7b0080SImran Shaik .parent_data = audio_core_cc_parent_data_0,
180*3e7b0080SImran Shaik .num_parents = ARRAY_SIZE(audio_core_cc_parent_data_0),
181*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
182*3e7b0080SImran Shaik .ops = &clk_rcg2_shared_ops,
183*3e7b0080SImran Shaik },
184*3e7b0080SImran Shaik };
185*3e7b0080SImran Shaik
186*3e7b0080SImran Shaik static const struct freq_tbl ftbl_audio_core_cc_aif_if3_clk_src[] = {
187*3e7b0080SImran Shaik F(240000, P_BI_TCXO, 10, 1, 8),
188*3e7b0080SImran Shaik F(256000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 15, 1, 32),
189*3e7b0080SImran Shaik F(512000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 15, 1, 16),
190*3e7b0080SImran Shaik F(768000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 10, 1, 16),
191*3e7b0080SImran Shaik F(1024000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 15, 1, 8),
192*3e7b0080SImran Shaik F(1536000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 10, 1, 8),
193*3e7b0080SImran Shaik F(2048000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 15, 1, 4),
194*3e7b0080SImran Shaik F(3072000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 10, 1, 4),
195*3e7b0080SImran Shaik F(4096000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 15, 1, 2),
196*3e7b0080SImran Shaik F(6144000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 10, 1, 2),
197*3e7b0080SImran Shaik F(8192000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 15, 0, 0),
198*3e7b0080SImran Shaik F(9600000, P_BI_TCXO, 2, 0, 0),
199*3e7b0080SImran Shaik F(12288000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 10, 0, 0),
200*3e7b0080SImran Shaik F(19200000, P_BI_TCXO, 1, 0, 0),
201*3e7b0080SImran Shaik F(24576000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 5, 0, 0),
202*3e7b0080SImran Shaik F(49152000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 2.5, 0, 0),
203*3e7b0080SImran Shaik { }
204*3e7b0080SImran Shaik };
205*3e7b0080SImran Shaik
206*3e7b0080SImran Shaik static struct clk_rcg2 audio_core_cc_aif_if3_clk_src = {
207*3e7b0080SImran Shaik .cmd_rcgr = 0x1178,
208*3e7b0080SImran Shaik .mnd_width = 16,
209*3e7b0080SImran Shaik .hid_width = 5,
210*3e7b0080SImran Shaik .parent_map = audio_core_cc_parent_map_0,
211*3e7b0080SImran Shaik .freq_tbl = ftbl_audio_core_cc_aif_if3_clk_src,
212*3e7b0080SImran Shaik .hw_clk_ctrl = true,
213*3e7b0080SImran Shaik .clkr.hw.init = &(const struct clk_init_data) {
214*3e7b0080SImran Shaik .name = "audio_core_cc_aif_if3_clk_src",
215*3e7b0080SImran Shaik .parent_data = audio_core_cc_parent_data_0,
216*3e7b0080SImran Shaik .num_parents = ARRAY_SIZE(audio_core_cc_parent_data_0),
217*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
218*3e7b0080SImran Shaik .ops = &clk_rcg2_shared_ops,
219*3e7b0080SImran Shaik },
220*3e7b0080SImran Shaik };
221*3e7b0080SImran Shaik
222*3e7b0080SImran Shaik static const struct freq_tbl ftbl_audio_core_cc_aud_dma_clk_src[] = {
223*3e7b0080SImran Shaik F(38400000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX2, 8, 0, 0),
224*3e7b0080SImran Shaik F(102400000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX2, 3, 0, 0),
225*3e7b0080SImran Shaik F(153600000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX2, 2, 0, 0),
226*3e7b0080SImran Shaik F(307200000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX2, 1, 0, 0),
227*3e7b0080SImran Shaik { }
228*3e7b0080SImran Shaik };
229*3e7b0080SImran Shaik
230*3e7b0080SImran Shaik static struct clk_rcg2 audio_core_cc_aud_dma_clk_src = {
231*3e7b0080SImran Shaik .cmd_rcgr = 0x1028,
232*3e7b0080SImran Shaik .mnd_width = 0,
233*3e7b0080SImran Shaik .hid_width = 5,
234*3e7b0080SImran Shaik .parent_map = audio_core_cc_parent_map_0,
235*3e7b0080SImran Shaik .freq_tbl = ftbl_audio_core_cc_aud_dma_clk_src,
236*3e7b0080SImran Shaik .hw_clk_ctrl = true,
237*3e7b0080SImran Shaik .clkr.hw.init = &(const struct clk_init_data) {
238*3e7b0080SImran Shaik .name = "audio_core_cc_aud_dma_clk_src",
239*3e7b0080SImran Shaik .parent_data = audio_core_cc_parent_data_0,
240*3e7b0080SImran Shaik .num_parents = ARRAY_SIZE(audio_core_cc_parent_data_0),
241*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
242*3e7b0080SImran Shaik .ops = &clk_rcg2_shared_ops,
243*3e7b0080SImran Shaik },
244*3e7b0080SImran Shaik };
245*3e7b0080SImran Shaik
246*3e7b0080SImran Shaik static const struct freq_tbl ftbl_audio_core_cc_bus_clk_src[] = {
247*3e7b0080SImran Shaik F(38400000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX2, 8, 0, 0),
248*3e7b0080SImran Shaik F(76800000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX2, 4, 0, 0),
249*3e7b0080SImran Shaik { }
250*3e7b0080SImran Shaik };
251*3e7b0080SImran Shaik
252*3e7b0080SImran Shaik static struct clk_rcg2 audio_core_cc_bus_clk_src = {
253*3e7b0080SImran Shaik .cmd_rcgr = 0x1008,
254*3e7b0080SImran Shaik .mnd_width = 0,
255*3e7b0080SImran Shaik .hid_width = 5,
256*3e7b0080SImran Shaik .parent_map = audio_core_cc_parent_map_0,
257*3e7b0080SImran Shaik .freq_tbl = ftbl_audio_core_cc_bus_clk_src,
258*3e7b0080SImran Shaik .hw_clk_ctrl = true,
259*3e7b0080SImran Shaik .clkr.hw.init = &(const struct clk_init_data) {
260*3e7b0080SImran Shaik .name = "audio_core_cc_bus_clk_src",
261*3e7b0080SImran Shaik .parent_data = audio_core_cc_parent_data_0,
262*3e7b0080SImran Shaik .num_parents = ARRAY_SIZE(audio_core_cc_parent_data_0),
263*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
264*3e7b0080SImran Shaik .ops = &clk_rcg2_shared_ops,
265*3e7b0080SImran Shaik },
266*3e7b0080SImran Shaik };
267*3e7b0080SImran Shaik
268*3e7b0080SImran Shaik static struct clk_rcg2 audio_core_cc_ext_mclka_clk_src = {
269*3e7b0080SImran Shaik .cmd_rcgr = 0x123c,
270*3e7b0080SImran Shaik .mnd_width = 8,
271*3e7b0080SImran Shaik .hid_width = 5,
272*3e7b0080SImran Shaik .parent_map = audio_core_cc_parent_map_0,
273*3e7b0080SImran Shaik .freq_tbl = ftbl_audio_core_cc_aif_if0_clk_src,
274*3e7b0080SImran Shaik .hw_clk_ctrl = true,
275*3e7b0080SImran Shaik .clkr.hw.init = &(const struct clk_init_data) {
276*3e7b0080SImran Shaik .name = "audio_core_cc_ext_mclka_clk_src",
277*3e7b0080SImran Shaik .parent_data = audio_core_cc_parent_data_0,
278*3e7b0080SImran Shaik .num_parents = ARRAY_SIZE(audio_core_cc_parent_data_0),
279*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
280*3e7b0080SImran Shaik .ops = &clk_rcg2_shared_ops,
281*3e7b0080SImran Shaik },
282*3e7b0080SImran Shaik };
283*3e7b0080SImran Shaik
284*3e7b0080SImran Shaik static struct clk_rcg2 audio_core_cc_ext_mclkb_clk_src = {
285*3e7b0080SImran Shaik .cmd_rcgr = 0x125c,
286*3e7b0080SImran Shaik .mnd_width = 8,
287*3e7b0080SImran Shaik .hid_width = 5,
288*3e7b0080SImran Shaik .parent_map = audio_core_cc_parent_map_0,
289*3e7b0080SImran Shaik .freq_tbl = ftbl_audio_core_cc_aif_if0_clk_src,
290*3e7b0080SImran Shaik .hw_clk_ctrl = true,
291*3e7b0080SImran Shaik .clkr.hw.init = &(const struct clk_init_data) {
292*3e7b0080SImran Shaik .name = "audio_core_cc_ext_mclkb_clk_src",
293*3e7b0080SImran Shaik .parent_data = audio_core_cc_parent_data_0,
294*3e7b0080SImran Shaik .num_parents = ARRAY_SIZE(audio_core_cc_parent_data_0),
295*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
296*3e7b0080SImran Shaik .ops = &clk_rcg2_shared_ops,
297*3e7b0080SImran Shaik },
298*3e7b0080SImran Shaik };
299*3e7b0080SImran Shaik
300*3e7b0080SImran Shaik static const struct freq_tbl ftbl_audio_core_cc_lpaif_pcmoe_clk_src[] = {
301*3e7b0080SImran Shaik F(9600000, P_BI_TCXO, 2, 0, 0),
302*3e7b0080SImran Shaik F(15360000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 8, 0, 0),
303*3e7b0080SImran Shaik F(30720000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 4, 0, 0),
304*3e7b0080SImran Shaik F(61440000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 2, 0, 0),
305*3e7b0080SImran Shaik { }
306*3e7b0080SImran Shaik };
307*3e7b0080SImran Shaik
308*3e7b0080SImran Shaik static struct clk_rcg2 audio_core_cc_lpaif_pcmoe_clk_src = {
309*3e7b0080SImran Shaik .cmd_rcgr = 0x12ac,
310*3e7b0080SImran Shaik .mnd_width = 8,
311*3e7b0080SImran Shaik .hid_width = 5,
312*3e7b0080SImran Shaik .parent_map = audio_core_cc_parent_map_0,
313*3e7b0080SImran Shaik .freq_tbl = ftbl_audio_core_cc_lpaif_pcmoe_clk_src,
314*3e7b0080SImran Shaik .hw_clk_ctrl = true,
315*3e7b0080SImran Shaik .clkr.hw.init = &(const struct clk_init_data) {
316*3e7b0080SImran Shaik .name = "audio_core_cc_lpaif_pcmoe_clk_src",
317*3e7b0080SImran Shaik .parent_data = audio_core_cc_parent_data_0,
318*3e7b0080SImran Shaik .num_parents = ARRAY_SIZE(audio_core_cc_parent_data_0),
319*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
320*3e7b0080SImran Shaik .ops = &clk_rcg2_shared_ops,
321*3e7b0080SImran Shaik },
322*3e7b0080SImran Shaik };
323*3e7b0080SImran Shaik
324*3e7b0080SImran Shaik static const struct freq_tbl ftbl_audio_core_cc_tx_mclk_rcg_clk_src[] = {
325*3e7b0080SImran Shaik F(19200000, P_BI_TCXO, 1, 0, 0),
326*3e7b0080SImran Shaik F(24576000, P_AUDIO_CORE_CC_DIG_PLL_OUT_AUX, 5, 0, 0),
327*3e7b0080SImran Shaik { }
328*3e7b0080SImran Shaik };
329*3e7b0080SImran Shaik
330*3e7b0080SImran Shaik static struct clk_rcg2 audio_core_cc_tx_mclk_rcg_clk_src = {
331*3e7b0080SImran Shaik .cmd_rcgr = 0x127c,
332*3e7b0080SImran Shaik .mnd_width = 8,
333*3e7b0080SImran Shaik .hid_width = 5,
334*3e7b0080SImran Shaik .parent_map = audio_core_cc_parent_map_0,
335*3e7b0080SImran Shaik .freq_tbl = ftbl_audio_core_cc_tx_mclk_rcg_clk_src,
336*3e7b0080SImran Shaik .hw_clk_ctrl = true,
337*3e7b0080SImran Shaik .clkr.hw.init = &(const struct clk_init_data) {
338*3e7b0080SImran Shaik .name = "audio_core_cc_tx_mclk_rcg_clk_src",
339*3e7b0080SImran Shaik .parent_data = audio_core_cc_parent_data_0,
340*3e7b0080SImran Shaik .num_parents = ARRAY_SIZE(audio_core_cc_parent_data_0),
341*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
342*3e7b0080SImran Shaik .ops = &clk_rcg2_shared_ops,
343*3e7b0080SImran Shaik },
344*3e7b0080SImran Shaik };
345*3e7b0080SImran Shaik
346*3e7b0080SImran Shaik static struct clk_regmap_div audio_core_cc_cdiv_tx_mclk_div_clk_src = {
347*3e7b0080SImran Shaik .reg = 0x129c,
348*3e7b0080SImran Shaik .shift = 0,
349*3e7b0080SImran Shaik .width = 4,
350*3e7b0080SImran Shaik .clkr.hw.init = &(const struct clk_init_data) {
351*3e7b0080SImran Shaik .name = "audio_core_cc_cdiv_tx_mclk_div_clk_src",
352*3e7b0080SImran Shaik .parent_hws = (const struct clk_hw*[]) {
353*3e7b0080SImran Shaik &audio_core_cc_tx_mclk_rcg_clk_src.clkr.hw,
354*3e7b0080SImran Shaik },
355*3e7b0080SImran Shaik .num_parents = 1,
356*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
357*3e7b0080SImran Shaik .ops = &clk_regmap_div_ro_ops,
358*3e7b0080SImran Shaik },
359*3e7b0080SImran Shaik };
360*3e7b0080SImran Shaik
361*3e7b0080SImran Shaik static struct clk_branch audio_core_cc_aif_if0_ebit_clk = {
362*3e7b0080SImran Shaik .halt_reg = 0x1068,
363*3e7b0080SImran Shaik .halt_check = BRANCH_HALT_DELAY,
364*3e7b0080SImran Shaik .clkr = {
365*3e7b0080SImran Shaik .enable_reg = 0x1068,
366*3e7b0080SImran Shaik .enable_mask = BIT(0),
367*3e7b0080SImran Shaik .hw.init = &(const struct clk_init_data) {
368*3e7b0080SImran Shaik .name = "audio_core_cc_aif_if0_ebit_clk",
369*3e7b0080SImran Shaik .ops = &clk_branch2_ops,
370*3e7b0080SImran Shaik },
371*3e7b0080SImran Shaik },
372*3e7b0080SImran Shaik };
373*3e7b0080SImran Shaik
374*3e7b0080SImran Shaik static struct clk_branch audio_core_cc_aif_if0_ibit_clk = {
375*3e7b0080SImran Shaik .halt_reg = 0x1064,
376*3e7b0080SImran Shaik .halt_check = BRANCH_HALT,
377*3e7b0080SImran Shaik .clkr = {
378*3e7b0080SImran Shaik .enable_reg = 0x1064,
379*3e7b0080SImran Shaik .enable_mask = BIT(0),
380*3e7b0080SImran Shaik .hw.init = &(const struct clk_init_data) {
381*3e7b0080SImran Shaik .name = "audio_core_cc_aif_if0_ibit_clk",
382*3e7b0080SImran Shaik .parent_hws = (const struct clk_hw*[]) {
383*3e7b0080SImran Shaik &audio_core_cc_aif_if0_clk_src.clkr.hw,
384*3e7b0080SImran Shaik },
385*3e7b0080SImran Shaik .num_parents = 1,
386*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
387*3e7b0080SImran Shaik .ops = &clk_branch2_ops,
388*3e7b0080SImran Shaik },
389*3e7b0080SImran Shaik },
390*3e7b0080SImran Shaik };
391*3e7b0080SImran Shaik
392*3e7b0080SImran Shaik static struct clk_branch audio_core_cc_aif_if1_ebit_clk = {
393*3e7b0080SImran Shaik .halt_reg = 0x10cc,
394*3e7b0080SImran Shaik .halt_check = BRANCH_HALT_DELAY,
395*3e7b0080SImran Shaik .clkr = {
396*3e7b0080SImran Shaik .enable_reg = 0x10cc,
397*3e7b0080SImran Shaik .enable_mask = BIT(0),
398*3e7b0080SImran Shaik .hw.init = &(const struct clk_init_data) {
399*3e7b0080SImran Shaik .name = "audio_core_cc_aif_if1_ebit_clk",
400*3e7b0080SImran Shaik .ops = &clk_branch2_ops,
401*3e7b0080SImran Shaik },
402*3e7b0080SImran Shaik },
403*3e7b0080SImran Shaik };
404*3e7b0080SImran Shaik
405*3e7b0080SImran Shaik static struct clk_branch audio_core_cc_aif_if1_ibit_clk = {
406*3e7b0080SImran Shaik .halt_reg = 0x10c8,
407*3e7b0080SImran Shaik .halt_check = BRANCH_HALT,
408*3e7b0080SImran Shaik .clkr = {
409*3e7b0080SImran Shaik .enable_reg = 0x10c8,
410*3e7b0080SImran Shaik .enable_mask = BIT(0),
411*3e7b0080SImran Shaik .hw.init = &(const struct clk_init_data) {
412*3e7b0080SImran Shaik .name = "audio_core_cc_aif_if1_ibit_clk",
413*3e7b0080SImran Shaik .parent_hws = (const struct clk_hw*[]) {
414*3e7b0080SImran Shaik &audio_core_cc_aif_if1_clk_src.clkr.hw,
415*3e7b0080SImran Shaik },
416*3e7b0080SImran Shaik .num_parents = 1,
417*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
418*3e7b0080SImran Shaik .ops = &clk_branch2_ops,
419*3e7b0080SImran Shaik },
420*3e7b0080SImran Shaik },
421*3e7b0080SImran Shaik };
422*3e7b0080SImran Shaik
423*3e7b0080SImran Shaik static struct clk_branch audio_core_cc_aif_if2_ebit_clk = {
424*3e7b0080SImran Shaik .halt_reg = 0x1130,
425*3e7b0080SImran Shaik .halt_check = BRANCH_HALT_DELAY,
426*3e7b0080SImran Shaik .clkr = {
427*3e7b0080SImran Shaik .enable_reg = 0x1130,
428*3e7b0080SImran Shaik .enable_mask = BIT(0),
429*3e7b0080SImran Shaik .hw.init = &(const struct clk_init_data) {
430*3e7b0080SImran Shaik .name = "audio_core_cc_aif_if2_ebit_clk",
431*3e7b0080SImran Shaik .ops = &clk_branch2_ops,
432*3e7b0080SImran Shaik },
433*3e7b0080SImran Shaik },
434*3e7b0080SImran Shaik };
435*3e7b0080SImran Shaik
436*3e7b0080SImran Shaik static struct clk_branch audio_core_cc_aif_if2_ibit_clk = {
437*3e7b0080SImran Shaik .halt_reg = 0x112c,
438*3e7b0080SImran Shaik .halt_check = BRANCH_HALT,
439*3e7b0080SImran Shaik .clkr = {
440*3e7b0080SImran Shaik .enable_reg = 0x112c,
441*3e7b0080SImran Shaik .enable_mask = BIT(0),
442*3e7b0080SImran Shaik .hw.init = &(const struct clk_init_data) {
443*3e7b0080SImran Shaik .name = "audio_core_cc_aif_if2_ibit_clk",
444*3e7b0080SImran Shaik .parent_hws = (const struct clk_hw*[]) {
445*3e7b0080SImran Shaik &audio_core_cc_aif_if2_clk_src.clkr.hw,
446*3e7b0080SImran Shaik },
447*3e7b0080SImran Shaik .num_parents = 1,
448*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
449*3e7b0080SImran Shaik .ops = &clk_branch2_ops,
450*3e7b0080SImran Shaik },
451*3e7b0080SImran Shaik },
452*3e7b0080SImran Shaik };
453*3e7b0080SImran Shaik
454*3e7b0080SImran Shaik static struct clk_branch audio_core_cc_aif_if3_ebit_clk = {
455*3e7b0080SImran Shaik .halt_reg = 0x1194,
456*3e7b0080SImran Shaik .halt_check = BRANCH_HALT_DELAY,
457*3e7b0080SImran Shaik .clkr = {
458*3e7b0080SImran Shaik .enable_reg = 0x1194,
459*3e7b0080SImran Shaik .enable_mask = BIT(0),
460*3e7b0080SImran Shaik .hw.init = &(const struct clk_init_data) {
461*3e7b0080SImran Shaik .name = "audio_core_cc_aif_if3_ebit_clk",
462*3e7b0080SImran Shaik .ops = &clk_branch2_ops,
463*3e7b0080SImran Shaik },
464*3e7b0080SImran Shaik },
465*3e7b0080SImran Shaik };
466*3e7b0080SImran Shaik
467*3e7b0080SImran Shaik static struct clk_branch audio_core_cc_aif_if3_ibit_clk = {
468*3e7b0080SImran Shaik .halt_reg = 0x1190,
469*3e7b0080SImran Shaik .halt_check = BRANCH_HALT,
470*3e7b0080SImran Shaik .clkr = {
471*3e7b0080SImran Shaik .enable_reg = 0x1190,
472*3e7b0080SImran Shaik .enable_mask = BIT(0),
473*3e7b0080SImran Shaik .hw.init = &(const struct clk_init_data) {
474*3e7b0080SImran Shaik .name = "audio_core_cc_aif_if3_ibit_clk",
475*3e7b0080SImran Shaik .parent_hws = (const struct clk_hw*[]) {
476*3e7b0080SImran Shaik &audio_core_cc_aif_if3_clk_src.clkr.hw,
477*3e7b0080SImran Shaik },
478*3e7b0080SImran Shaik .num_parents = 1,
479*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
480*3e7b0080SImran Shaik .ops = &clk_branch2_ops,
481*3e7b0080SImran Shaik },
482*3e7b0080SImran Shaik },
483*3e7b0080SImran Shaik };
484*3e7b0080SImran Shaik
485*3e7b0080SImran Shaik static struct clk_branch audio_core_cc_aud_dma_clk = {
486*3e7b0080SImran Shaik .halt_reg = 0x1040,
487*3e7b0080SImran Shaik .halt_check = BRANCH_HALT,
488*3e7b0080SImran Shaik .hwcg_reg = 0x1040,
489*3e7b0080SImran Shaik .hwcg_bit = 1,
490*3e7b0080SImran Shaik .clkr = {
491*3e7b0080SImran Shaik .enable_reg = 0x1040,
492*3e7b0080SImran Shaik .enable_mask = BIT(0),
493*3e7b0080SImran Shaik .hw.init = &(const struct clk_init_data) {
494*3e7b0080SImran Shaik .name = "audio_core_cc_aud_dma_clk",
495*3e7b0080SImran Shaik .parent_hws = (const struct clk_hw*[]) {
496*3e7b0080SImran Shaik &audio_core_cc_aud_dma_clk_src.clkr.hw,
497*3e7b0080SImran Shaik },
498*3e7b0080SImran Shaik .num_parents = 1,
499*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
500*3e7b0080SImran Shaik .ops = &clk_branch2_ops,
501*3e7b0080SImran Shaik },
502*3e7b0080SImran Shaik },
503*3e7b0080SImran Shaik };
504*3e7b0080SImran Shaik
505*3e7b0080SImran Shaik static struct clk_branch audio_core_cc_aud_dma_mem_clk = {
506*3e7b0080SImran Shaik .halt_reg = 0x1044,
507*3e7b0080SImran Shaik .halt_check = BRANCH_HALT,
508*3e7b0080SImran Shaik .hwcg_reg = 0x1044,
509*3e7b0080SImran Shaik .hwcg_bit = 1,
510*3e7b0080SImran Shaik .clkr = {
511*3e7b0080SImran Shaik .enable_reg = 0x1044,
512*3e7b0080SImran Shaik .enable_mask = BIT(0),
513*3e7b0080SImran Shaik .hw.init = &(const struct clk_init_data) {
514*3e7b0080SImran Shaik .name = "audio_core_cc_aud_dma_mem_clk",
515*3e7b0080SImran Shaik .parent_hws = (const struct clk_hw*[]) {
516*3e7b0080SImran Shaik &audio_core_cc_aud_dma_clk_src.clkr.hw,
517*3e7b0080SImran Shaik },
518*3e7b0080SImran Shaik .num_parents = 1,
519*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
520*3e7b0080SImran Shaik .ops = &clk_branch2_ops,
521*3e7b0080SImran Shaik },
522*3e7b0080SImran Shaik },
523*3e7b0080SImran Shaik };
524*3e7b0080SImran Shaik
525*3e7b0080SImran Shaik static struct clk_branch audio_core_cc_bus_clk = {
526*3e7b0080SImran Shaik .halt_reg = 0x1020,
527*3e7b0080SImran Shaik .halt_check = BRANCH_HALT_VOTED,
528*3e7b0080SImran Shaik .clkr = {
529*3e7b0080SImran Shaik .enable_reg = 0x1020,
530*3e7b0080SImran Shaik .enable_mask = BIT(0),
531*3e7b0080SImran Shaik .hw.init = &(const struct clk_init_data) {
532*3e7b0080SImran Shaik .name = "audio_core_cc_bus_clk",
533*3e7b0080SImran Shaik .parent_hws = (const struct clk_hw*[]) {
534*3e7b0080SImran Shaik &audio_core_cc_bus_clk_src.clkr.hw,
535*3e7b0080SImran Shaik },
536*3e7b0080SImran Shaik .num_parents = 1,
537*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
538*3e7b0080SImran Shaik .ops = &clk_branch2_aon_ops,
539*3e7b0080SImran Shaik },
540*3e7b0080SImran Shaik },
541*3e7b0080SImran Shaik };
542*3e7b0080SImran Shaik
543*3e7b0080SImran Shaik static struct clk_branch audio_core_cc_ext_mclka_out_clk = {
544*3e7b0080SImran Shaik .halt_reg = 0x1254,
545*3e7b0080SImran Shaik .halt_check = BRANCH_HALT,
546*3e7b0080SImran Shaik .clkr = {
547*3e7b0080SImran Shaik .enable_reg = 0x1254,
548*3e7b0080SImran Shaik .enable_mask = BIT(0),
549*3e7b0080SImran Shaik .hw.init = &(const struct clk_init_data) {
550*3e7b0080SImran Shaik .name = "audio_core_cc_ext_mclka_out_clk",
551*3e7b0080SImran Shaik .parent_hws = (const struct clk_hw*[]) {
552*3e7b0080SImran Shaik &audio_core_cc_ext_mclka_clk_src.clkr.hw,
553*3e7b0080SImran Shaik },
554*3e7b0080SImran Shaik .num_parents = 1,
555*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
556*3e7b0080SImran Shaik .ops = &clk_branch2_ops,
557*3e7b0080SImran Shaik },
558*3e7b0080SImran Shaik },
559*3e7b0080SImran Shaik };
560*3e7b0080SImran Shaik
561*3e7b0080SImran Shaik static struct clk_branch audio_core_cc_ext_mclkb_out_clk = {
562*3e7b0080SImran Shaik .halt_reg = 0x1274,
563*3e7b0080SImran Shaik .halt_check = BRANCH_HALT,
564*3e7b0080SImran Shaik .clkr = {
565*3e7b0080SImran Shaik .enable_reg = 0x1274,
566*3e7b0080SImran Shaik .enable_mask = BIT(0),
567*3e7b0080SImran Shaik .hw.init = &(const struct clk_init_data) {
568*3e7b0080SImran Shaik .name = "audio_core_cc_ext_mclkb_out_clk",
569*3e7b0080SImran Shaik .parent_hws = (const struct clk_hw*[]) {
570*3e7b0080SImran Shaik &audio_core_cc_ext_mclkb_clk_src.clkr.hw,
571*3e7b0080SImran Shaik },
572*3e7b0080SImran Shaik .num_parents = 1,
573*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
574*3e7b0080SImran Shaik .ops = &clk_branch2_ops,
575*3e7b0080SImran Shaik },
576*3e7b0080SImran Shaik },
577*3e7b0080SImran Shaik };
578*3e7b0080SImran Shaik
579*3e7b0080SImran Shaik static struct clk_branch audio_core_cc_im_sleep_clk = {
580*3e7b0080SImran Shaik .halt_reg = 0x12cc,
581*3e7b0080SImran Shaik .halt_check = BRANCH_HALT,
582*3e7b0080SImran Shaik .clkr = {
583*3e7b0080SImran Shaik .enable_reg = 0x12cc,
584*3e7b0080SImran Shaik .enable_mask = BIT(0),
585*3e7b0080SImran Shaik .hw.init = &(const struct clk_init_data) {
586*3e7b0080SImran Shaik .name = "audio_core_cc_im_sleep_clk",
587*3e7b0080SImran Shaik .ops = &clk_branch2_ops,
588*3e7b0080SImran Shaik },
589*3e7b0080SImran Shaik },
590*3e7b0080SImran Shaik };
591*3e7b0080SImran Shaik
592*3e7b0080SImran Shaik static struct clk_branch audio_core_cc_lpaif_pcmoe_clk = {
593*3e7b0080SImran Shaik .halt_reg = 0x12c4,
594*3e7b0080SImran Shaik .halt_check = BRANCH_HALT,
595*3e7b0080SImran Shaik .clkr = {
596*3e7b0080SImran Shaik .enable_reg = 0x12c4,
597*3e7b0080SImran Shaik .enable_mask = BIT(0),
598*3e7b0080SImran Shaik .hw.init = &(const struct clk_init_data) {
599*3e7b0080SImran Shaik .name = "audio_core_cc_lpaif_pcmoe_clk",
600*3e7b0080SImran Shaik .parent_hws = (const struct clk_hw*[]) {
601*3e7b0080SImran Shaik &audio_core_cc_lpaif_pcmoe_clk_src.clkr.hw,
602*3e7b0080SImran Shaik },
603*3e7b0080SImran Shaik .num_parents = 1,
604*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
605*3e7b0080SImran Shaik .ops = &clk_branch2_ops,
606*3e7b0080SImran Shaik },
607*3e7b0080SImran Shaik },
608*3e7b0080SImran Shaik };
609*3e7b0080SImran Shaik
610*3e7b0080SImran Shaik static struct clk_branch audio_core_cc_rx_mclk_2x_clk = {
611*3e7b0080SImran Shaik .halt_reg = 0x1298,
612*3e7b0080SImran Shaik .halt_check = BRANCH_HALT,
613*3e7b0080SImran Shaik .clkr = {
614*3e7b0080SImran Shaik .enable_reg = 0x1298,
615*3e7b0080SImran Shaik .enable_mask = BIT(0),
616*3e7b0080SImran Shaik .hw.init = &(const struct clk_init_data) {
617*3e7b0080SImran Shaik .name = "audio_core_cc_rx_mclk_2x_clk",
618*3e7b0080SImran Shaik .parent_hws = (const struct clk_hw*[]) {
619*3e7b0080SImran Shaik &audio_core_cc_tx_mclk_rcg_clk_src.clkr.hw,
620*3e7b0080SImran Shaik },
621*3e7b0080SImran Shaik .num_parents = 1,
622*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
623*3e7b0080SImran Shaik .ops = &clk_branch2_ops,
624*3e7b0080SImran Shaik },
625*3e7b0080SImran Shaik },
626*3e7b0080SImran Shaik };
627*3e7b0080SImran Shaik
628*3e7b0080SImran Shaik static struct clk_branch audio_core_cc_rx_mclk_clk = {
629*3e7b0080SImran Shaik .halt_reg = 0x12a4,
630*3e7b0080SImran Shaik .halt_check = BRANCH_HALT,
631*3e7b0080SImran Shaik .clkr = {
632*3e7b0080SImran Shaik .enable_reg = 0x12a4,
633*3e7b0080SImran Shaik .enable_mask = BIT(0),
634*3e7b0080SImran Shaik .hw.init = &(const struct clk_init_data) {
635*3e7b0080SImran Shaik .name = "audio_core_cc_rx_mclk_clk",
636*3e7b0080SImran Shaik .parent_hws = (const struct clk_hw*[]) {
637*3e7b0080SImran Shaik &audio_core_cc_cdiv_tx_mclk_div_clk_src.clkr.hw,
638*3e7b0080SImran Shaik },
639*3e7b0080SImran Shaik .num_parents = 1,
640*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
641*3e7b0080SImran Shaik .ops = &clk_branch2_ops,
642*3e7b0080SImran Shaik },
643*3e7b0080SImran Shaik },
644*3e7b0080SImran Shaik };
645*3e7b0080SImran Shaik
646*3e7b0080SImran Shaik static struct clk_branch audio_core_cc_sampling_clk = {
647*3e7b0080SImran Shaik .halt_reg = 0x1000,
648*3e7b0080SImran Shaik .halt_check = BRANCH_HALT,
649*3e7b0080SImran Shaik .clkr = {
650*3e7b0080SImran Shaik .enable_reg = 0x1000,
651*3e7b0080SImran Shaik .enable_mask = BIT(0),
652*3e7b0080SImran Shaik .hw.init = &(const struct clk_init_data) {
653*3e7b0080SImran Shaik .name = "audio_core_cc_sampling_clk",
654*3e7b0080SImran Shaik .ops = &clk_branch2_ops,
655*3e7b0080SImran Shaik },
656*3e7b0080SImran Shaik },
657*3e7b0080SImran Shaik };
658*3e7b0080SImran Shaik
659*3e7b0080SImran Shaik static struct clk_branch audio_core_cc_tx_mclk_2x_clk = {
660*3e7b0080SImran Shaik .halt_reg = 0x1294,
661*3e7b0080SImran Shaik .halt_check = BRANCH_HALT,
662*3e7b0080SImran Shaik .clkr = {
663*3e7b0080SImran Shaik .enable_reg = 0x1294,
664*3e7b0080SImran Shaik .enable_mask = BIT(0),
665*3e7b0080SImran Shaik .hw.init = &(const struct clk_init_data) {
666*3e7b0080SImran Shaik .name = "audio_core_cc_tx_mclk_2x_clk",
667*3e7b0080SImran Shaik .parent_hws = (const struct clk_hw*[]) {
668*3e7b0080SImran Shaik &audio_core_cc_tx_mclk_rcg_clk_src.clkr.hw,
669*3e7b0080SImran Shaik },
670*3e7b0080SImran Shaik .num_parents = 1,
671*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
672*3e7b0080SImran Shaik .ops = &clk_branch2_ops,
673*3e7b0080SImran Shaik },
674*3e7b0080SImran Shaik },
675*3e7b0080SImran Shaik };
676*3e7b0080SImran Shaik
677*3e7b0080SImran Shaik static struct clk_branch audio_core_cc_tx_mclk_clk = {
678*3e7b0080SImran Shaik .halt_reg = 0x12a0,
679*3e7b0080SImran Shaik .halt_check = BRANCH_HALT,
680*3e7b0080SImran Shaik .clkr = {
681*3e7b0080SImran Shaik .enable_reg = 0x12a0,
682*3e7b0080SImran Shaik .enable_mask = BIT(0),
683*3e7b0080SImran Shaik .hw.init = &(const struct clk_init_data) {
684*3e7b0080SImran Shaik .name = "audio_core_cc_tx_mclk_clk",
685*3e7b0080SImran Shaik .parent_hws = (const struct clk_hw*[]) {
686*3e7b0080SImran Shaik &audio_core_cc_cdiv_tx_mclk_div_clk_src.clkr.hw,
687*3e7b0080SImran Shaik },
688*3e7b0080SImran Shaik .num_parents = 1,
689*3e7b0080SImran Shaik .flags = CLK_SET_RATE_PARENT,
690*3e7b0080SImran Shaik .ops = &clk_branch2_ops,
691*3e7b0080SImran Shaik },
692*3e7b0080SImran Shaik },
693*3e7b0080SImran Shaik };
694*3e7b0080SImran Shaik
695*3e7b0080SImran Shaik static struct clk_hw *audio_core_cc_shikra_hws[] = {
696*3e7b0080SImran Shaik [AUDIO_CORE_CC_DIG_PLL_OUT_AUX] = &audio_core_cc_dig_pll_out_aux.hw,
697*3e7b0080SImran Shaik [AUDIO_CORE_CC_DIG_PLL_OUT_AUX2] = &audio_core_cc_dig_pll_out_aux2.hw,
698*3e7b0080SImran Shaik };
699*3e7b0080SImran Shaik
700*3e7b0080SImran Shaik static struct clk_regmap *audio_core_cc_shikra_clocks[] = {
701*3e7b0080SImran Shaik [AUDIO_CORE_CC_AIF_IF0_CLK_SRC] = &audio_core_cc_aif_if0_clk_src.clkr,
702*3e7b0080SImran Shaik [AUDIO_CORE_CC_AIF_IF0_EBIT_CLK] = &audio_core_cc_aif_if0_ebit_clk.clkr,
703*3e7b0080SImran Shaik [AUDIO_CORE_CC_AIF_IF0_IBIT_CLK] = &audio_core_cc_aif_if0_ibit_clk.clkr,
704*3e7b0080SImran Shaik [AUDIO_CORE_CC_AIF_IF1_CLK_SRC] = &audio_core_cc_aif_if1_clk_src.clkr,
705*3e7b0080SImran Shaik [AUDIO_CORE_CC_AIF_IF1_EBIT_CLK] = &audio_core_cc_aif_if1_ebit_clk.clkr,
706*3e7b0080SImran Shaik [AUDIO_CORE_CC_AIF_IF1_IBIT_CLK] = &audio_core_cc_aif_if1_ibit_clk.clkr,
707*3e7b0080SImran Shaik [AUDIO_CORE_CC_AIF_IF2_CLK_SRC] = &audio_core_cc_aif_if2_clk_src.clkr,
708*3e7b0080SImran Shaik [AUDIO_CORE_CC_AIF_IF2_EBIT_CLK] = &audio_core_cc_aif_if2_ebit_clk.clkr,
709*3e7b0080SImran Shaik [AUDIO_CORE_CC_AIF_IF2_IBIT_CLK] = &audio_core_cc_aif_if2_ibit_clk.clkr,
710*3e7b0080SImran Shaik [AUDIO_CORE_CC_AIF_IF3_CLK_SRC] = &audio_core_cc_aif_if3_clk_src.clkr,
711*3e7b0080SImran Shaik [AUDIO_CORE_CC_AIF_IF3_EBIT_CLK] = &audio_core_cc_aif_if3_ebit_clk.clkr,
712*3e7b0080SImran Shaik [AUDIO_CORE_CC_AIF_IF3_IBIT_CLK] = &audio_core_cc_aif_if3_ibit_clk.clkr,
713*3e7b0080SImran Shaik [AUDIO_CORE_CC_AUD_DMA_CLK] = &audio_core_cc_aud_dma_clk.clkr,
714*3e7b0080SImran Shaik [AUDIO_CORE_CC_AUD_DMA_CLK_SRC] = &audio_core_cc_aud_dma_clk_src.clkr,
715*3e7b0080SImran Shaik [AUDIO_CORE_CC_AUD_DMA_MEM_CLK] = &audio_core_cc_aud_dma_mem_clk.clkr,
716*3e7b0080SImran Shaik [AUDIO_CORE_CC_BUS_CLK] = &audio_core_cc_bus_clk.clkr,
717*3e7b0080SImran Shaik [AUDIO_CORE_CC_BUS_CLK_SRC] = &audio_core_cc_bus_clk_src.clkr,
718*3e7b0080SImran Shaik [AUDIO_CORE_CC_CDIV_TX_MCLK_DIV_CLK_SRC] = &audio_core_cc_cdiv_tx_mclk_div_clk_src.clkr,
719*3e7b0080SImran Shaik [AUDIO_CORE_CC_DIG_PLL] = &audio_core_cc_dig_pll.clkr,
720*3e7b0080SImran Shaik [AUDIO_CORE_CC_EXT_MCLKA_CLK_SRC] = &audio_core_cc_ext_mclka_clk_src.clkr,
721*3e7b0080SImran Shaik [AUDIO_CORE_CC_EXT_MCLKA_OUT_CLK] = &audio_core_cc_ext_mclka_out_clk.clkr,
722*3e7b0080SImran Shaik [AUDIO_CORE_CC_EXT_MCLKB_CLK_SRC] = &audio_core_cc_ext_mclkb_clk_src.clkr,
723*3e7b0080SImran Shaik [AUDIO_CORE_CC_EXT_MCLKB_OUT_CLK] = &audio_core_cc_ext_mclkb_out_clk.clkr,
724*3e7b0080SImran Shaik [AUDIO_CORE_CC_IM_SLEEP_CLK] = &audio_core_cc_im_sleep_clk.clkr,
725*3e7b0080SImran Shaik [AUDIO_CORE_CC_LPAIF_PCMOE_CLK] = &audio_core_cc_lpaif_pcmoe_clk.clkr,
726*3e7b0080SImran Shaik [AUDIO_CORE_CC_LPAIF_PCMOE_CLK_SRC] = &audio_core_cc_lpaif_pcmoe_clk_src.clkr,
727*3e7b0080SImran Shaik [AUDIO_CORE_CC_RX_MCLK_2X_CLK] = &audio_core_cc_rx_mclk_2x_clk.clkr,
728*3e7b0080SImran Shaik [AUDIO_CORE_CC_RX_MCLK_CLK] = &audio_core_cc_rx_mclk_clk.clkr,
729*3e7b0080SImran Shaik [AUDIO_CORE_CC_SAMPLING_CLK] = &audio_core_cc_sampling_clk.clkr,
730*3e7b0080SImran Shaik [AUDIO_CORE_CC_TX_MCLK_2X_CLK] = &audio_core_cc_tx_mclk_2x_clk.clkr,
731*3e7b0080SImran Shaik [AUDIO_CORE_CC_TX_MCLK_CLK] = &audio_core_cc_tx_mclk_clk.clkr,
732*3e7b0080SImran Shaik [AUDIO_CORE_CC_TX_MCLK_RCG_CLK_SRC] = &audio_core_cc_tx_mclk_rcg_clk_src.clkr,
733*3e7b0080SImran Shaik };
734*3e7b0080SImran Shaik
735*3e7b0080SImran Shaik static struct clk_alpha_pll *audio_core_cc_shikra_plls[] = {
736*3e7b0080SImran Shaik &audio_core_cc_dig_pll,
737*3e7b0080SImran Shaik };
738*3e7b0080SImran Shaik
739*3e7b0080SImran Shaik static const struct qcom_cc_driver_data audio_core_cc_shikra_driver_data = {
740*3e7b0080SImran Shaik .alpha_plls = audio_core_cc_shikra_plls,
741*3e7b0080SImran Shaik .num_alpha_plls = ARRAY_SIZE(audio_core_cc_shikra_plls),
742*3e7b0080SImran Shaik };
743*3e7b0080SImran Shaik
744*3e7b0080SImran Shaik static const struct regmap_config audio_core_cc_shikra_regmap_config = {
745*3e7b0080SImran Shaik .reg_bits = 32,
746*3e7b0080SImran Shaik .reg_stride = 4,
747*3e7b0080SImran Shaik .val_bits = 32,
748*3e7b0080SImran Shaik .max_register = 0x305c,
749*3e7b0080SImran Shaik .fast_io = true,
750*3e7b0080SImran Shaik };
751*3e7b0080SImran Shaik
752*3e7b0080SImran Shaik static const struct qcom_reset_map audio_core_csr_shikra_resets[] = {
753*3e7b0080SImran Shaik [AUDIO_CORE_CSR_RX_SWR_CGCR] = { 0x1c, 1 },
754*3e7b0080SImran Shaik [AUDIO_CORE_CSR_TX_SWR_CGCR] = { 0x30, 1 },
755*3e7b0080SImran Shaik };
756*3e7b0080SImran Shaik
757*3e7b0080SImran Shaik static const struct regmap_config audio_core_csr_shikra_regmap_config = {
758*3e7b0080SImran Shaik .name = "audio_core_cc_shikra_reset",
759*3e7b0080SImran Shaik .reg_bits = 32,
760*3e7b0080SImran Shaik .reg_stride = 4,
761*3e7b0080SImran Shaik .val_bits = 32,
762*3e7b0080SImran Shaik .fast_io = true,
763*3e7b0080SImran Shaik .max_register = 0x34,
764*3e7b0080SImran Shaik };
765*3e7b0080SImran Shaik
766*3e7b0080SImran Shaik static const struct qcom_cc_desc audio_core_csr_shikra_desc = {
767*3e7b0080SImran Shaik .config = &audio_core_csr_shikra_regmap_config,
768*3e7b0080SImran Shaik .resets = audio_core_csr_shikra_resets,
769*3e7b0080SImran Shaik .num_resets = ARRAY_SIZE(audio_core_csr_shikra_resets),
770*3e7b0080SImran Shaik };
771*3e7b0080SImran Shaik
772*3e7b0080SImran Shaik static const struct qcom_cc_desc audio_core_cc_shikra_desc = {
773*3e7b0080SImran Shaik .config = &audio_core_cc_shikra_regmap_config,
774*3e7b0080SImran Shaik .clk_hws = audio_core_cc_shikra_hws,
775*3e7b0080SImran Shaik .num_clk_hws = ARRAY_SIZE(audio_core_cc_shikra_hws),
776*3e7b0080SImran Shaik .clks = audio_core_cc_shikra_clocks,
777*3e7b0080SImran Shaik .num_clks = ARRAY_SIZE(audio_core_cc_shikra_clocks),
778*3e7b0080SImran Shaik .driver_data = &audio_core_cc_shikra_driver_data,
779*3e7b0080SImran Shaik };
780*3e7b0080SImran Shaik
781*3e7b0080SImran Shaik static const struct of_device_id audio_core_cc_shikra_match_table[] = {
782*3e7b0080SImran Shaik { .compatible = "qcom,shikra-audiocorecc", .data = &audio_core_cc_shikra_desc },
783*3e7b0080SImran Shaik { .compatible = "qcom,shikra-audiocore-csr", .data = &audio_core_csr_shikra_desc },
784*3e7b0080SImran Shaik { }
785*3e7b0080SImran Shaik };
786*3e7b0080SImran Shaik MODULE_DEVICE_TABLE(of, audio_core_cc_shikra_match_table);
787*3e7b0080SImran Shaik
audio_core_cc_shikra_probe(struct platform_device * pdev)788*3e7b0080SImran Shaik static int audio_core_cc_shikra_probe(struct platform_device *pdev)
789*3e7b0080SImran Shaik {
790*3e7b0080SImran Shaik const struct qcom_cc_desc *desc;
791*3e7b0080SImran Shaik
792*3e7b0080SImran Shaik desc = device_get_match_data(&pdev->dev);
793*3e7b0080SImran Shaik if (!desc)
794*3e7b0080SImran Shaik return -EINVAL;
795*3e7b0080SImran Shaik
796*3e7b0080SImran Shaik return qcom_cc_probe(pdev, desc);
797*3e7b0080SImran Shaik }
798*3e7b0080SImran Shaik
799*3e7b0080SImran Shaik static struct platform_driver audio_core_cc_shikra_driver = {
800*3e7b0080SImran Shaik .probe = audio_core_cc_shikra_probe,
801*3e7b0080SImran Shaik .driver = {
802*3e7b0080SImran Shaik .name = "audiocorecc-shikra",
803*3e7b0080SImran Shaik .of_match_table = audio_core_cc_shikra_match_table,
804*3e7b0080SImran Shaik },
805*3e7b0080SImran Shaik };
806*3e7b0080SImran Shaik
807*3e7b0080SImran Shaik module_platform_driver(audio_core_cc_shikra_driver);
808*3e7b0080SImran Shaik
809*3e7b0080SImran Shaik MODULE_DESCRIPTION("QTI AUDIOCORECC Shikra Driver");
810*3e7b0080SImran Shaik MODULE_LICENSE("GPL");
811