xref: /linux/sound/soc/mediatek/mt8196/mt8196-afe-clk.c (revision efe86f088f48f18c27b648e5724048947f3b7fb4)
1*7384ecabSDarren Ye // SPDX-License-Identifier: GPL-2.0
2*7384ecabSDarren Ye /*
3*7384ecabSDarren Ye  *  mt8196-afe-clk.c  --  Mediatek 8196 afe clock ctrl
4*7384ecabSDarren Ye  *
5*7384ecabSDarren Ye  *  Copyright (c) 2025 MediaTek Inc.
6*7384ecabSDarren Ye  *  Author: Darren Ye <darren.ye@mediatek.com>
7*7384ecabSDarren Ye  */
8*7384ecabSDarren Ye 
9*7384ecabSDarren Ye #include <linux/clk.h>
10*7384ecabSDarren Ye #include <linux/regmap.h>
11*7384ecabSDarren Ye #include <linux/mfd/syscon.h>
12*7384ecabSDarren Ye 
13*7384ecabSDarren Ye #include "mt8196-afe-clk.h"
14*7384ecabSDarren Ye #include "mt8196-afe-common.h"
15*7384ecabSDarren Ye 
16*7384ecabSDarren Ye static const char *aud_clks[MT8196_CLK_NUM] = {
17*7384ecabSDarren Ye 	/* vlp clk */
18*7384ecabSDarren Ye 	[MT8196_CLK_VLP_MUX_AUDIOINTBUS] = "top_aud_intbus",
19*7384ecabSDarren Ye 	[MT8196_CLK_VLP_MUX_AUD_ENG1] = "top_aud_eng1",
20*7384ecabSDarren Ye 	[MT8196_CLK_VLP_MUX_AUD_ENG2] = "top_aud_eng2",
21*7384ecabSDarren Ye 	[MT8196_CLK_VLP_MUX_AUDIO_H] = "top_aud_h",
22*7384ecabSDarren Ye 	/* pll */
23*7384ecabSDarren Ye 	[MT8196_CLK_TOP_APLL1_CK] = "apll1",
24*7384ecabSDarren Ye 	[MT8196_CLK_TOP_APLL2_CK] = "apll2",
25*7384ecabSDarren Ye 	/* divider */
26*7384ecabSDarren Ye 	[MT8196_CLK_TOP_APLL12_DIV_I2SIN0] = "apll12_div_i2sin0",
27*7384ecabSDarren Ye 	[MT8196_CLK_TOP_APLL12_DIV_I2SIN1] = "apll12_div_i2sin1",
28*7384ecabSDarren Ye 	[MT8196_CLK_TOP_APLL12_DIV_FMI2S] = "apll12_div_fmi2s",
29*7384ecabSDarren Ye 	[MT8196_CLK_TOP_APLL12_DIV_TDMOUT_M] = "apll12_div_tdmout_m",
30*7384ecabSDarren Ye 	[MT8196_CLK_TOP_APLL12_DIV_TDMOUT_B] = "apll12_div_tdmout_b",
31*7384ecabSDarren Ye 	/* mux */
32*7384ecabSDarren Ye 	[MT8196_CLK_TOP_ADSP_SEL] = "top_adsp",
33*7384ecabSDarren Ye };
34*7384ecabSDarren Ye 
35*7384ecabSDarren Ye int mt8196_afe_enable_clk(struct mtk_base_afe *afe, struct clk *clk)
36*7384ecabSDarren Ye {
37*7384ecabSDarren Ye 	int ret;
38*7384ecabSDarren Ye 
39*7384ecabSDarren Ye 	ret = clk_prepare_enable(clk);
40*7384ecabSDarren Ye 	if (ret) {
41*7384ecabSDarren Ye 		dev_err(afe->dev, "failed to enable clk\n");
42*7384ecabSDarren Ye 		return ret;
43*7384ecabSDarren Ye 	}
44*7384ecabSDarren Ye 
45*7384ecabSDarren Ye 	return 0;
46*7384ecabSDarren Ye }
47*7384ecabSDarren Ye EXPORT_SYMBOL_GPL(mt8196_afe_enable_clk);
48*7384ecabSDarren Ye 
49*7384ecabSDarren Ye void mt8196_afe_disable_clk(struct mtk_base_afe *afe, struct clk *clk)
50*7384ecabSDarren Ye {
51*7384ecabSDarren Ye 	if (clk)
52*7384ecabSDarren Ye 		clk_disable_unprepare(clk);
53*7384ecabSDarren Ye 	else
54*7384ecabSDarren Ye 		dev_err(afe->dev, "NULL clk\n");
55*7384ecabSDarren Ye }
56*7384ecabSDarren Ye EXPORT_SYMBOL_GPL(mt8196_afe_disable_clk);
57*7384ecabSDarren Ye 
58*7384ecabSDarren Ye static int mt8196_afe_set_clk_rate(struct mtk_base_afe *afe, struct clk *clk,
59*7384ecabSDarren Ye 				   unsigned int rate)
60*7384ecabSDarren Ye {
61*7384ecabSDarren Ye 	int ret;
62*7384ecabSDarren Ye 
63*7384ecabSDarren Ye 	if (clk) {
64*7384ecabSDarren Ye 		ret = clk_set_rate(clk, rate);
65*7384ecabSDarren Ye 		if (ret) {
66*7384ecabSDarren Ye 			dev_err(afe->dev, "failed to set clk rate\n");
67*7384ecabSDarren Ye 			return ret;
68*7384ecabSDarren Ye 		}
69*7384ecabSDarren Ye 	}
70*7384ecabSDarren Ye 
71*7384ecabSDarren Ye 	return 0;
72*7384ecabSDarren Ye }
73*7384ecabSDarren Ye 
74*7384ecabSDarren Ye static unsigned int get_top_cg_reg(unsigned int cg_type)
75*7384ecabSDarren Ye {
76*7384ecabSDarren Ye 	switch (cg_type) {
77*7384ecabSDarren Ye 	case MT8196_AUDIO_26M_EN_ON:
78*7384ecabSDarren Ye 	case MT8196_AUDIO_F3P25M_EN_ON:
79*7384ecabSDarren Ye 	case MT8196_AUDIO_APLL1_EN_ON:
80*7384ecabSDarren Ye 	case MT8196_AUDIO_APLL2_EN_ON:
81*7384ecabSDarren Ye 		return AUDIO_ENGEN_CON0;
82*7384ecabSDarren Ye 	case MT8196_CG_AUDIO_HOPPING_CK:
83*7384ecabSDarren Ye 	case MT8196_CG_AUDIO_F26M_CK:
84*7384ecabSDarren Ye 	case MT8196_CG_APLL1_CK:
85*7384ecabSDarren Ye 	case MT8196_CG_APLL2_CK:
86*7384ecabSDarren Ye 	case MT8196_PDN_APLL_TUNER2:
87*7384ecabSDarren Ye 	case MT8196_PDN_APLL_TUNER1:
88*7384ecabSDarren Ye 		return AUDIO_TOP_CON4;
89*7384ecabSDarren Ye 	default:
90*7384ecabSDarren Ye 		return 0;
91*7384ecabSDarren Ye 	}
92*7384ecabSDarren Ye }
93*7384ecabSDarren Ye 
94*7384ecabSDarren Ye static unsigned int get_top_cg_mask(unsigned int cg_type)
95*7384ecabSDarren Ye {
96*7384ecabSDarren Ye 	switch (cg_type) {
97*7384ecabSDarren Ye 	case MT8196_AUDIO_26M_EN_ON:
98*7384ecabSDarren Ye 		return AUDIO_26M_EN_ON_MASK_SFT;
99*7384ecabSDarren Ye 	case MT8196_AUDIO_F3P25M_EN_ON:
100*7384ecabSDarren Ye 		return AUDIO_F3P25M_EN_ON_MASK_SFT;
101*7384ecabSDarren Ye 	case MT8196_AUDIO_APLL1_EN_ON:
102*7384ecabSDarren Ye 		return AUDIO_APLL1_EN_ON_MASK_SFT;
103*7384ecabSDarren Ye 	case MT8196_AUDIO_APLL2_EN_ON:
104*7384ecabSDarren Ye 		return AUDIO_APLL2_EN_ON_MASK_SFT;
105*7384ecabSDarren Ye 	case MT8196_CG_AUDIO_HOPPING_CK:
106*7384ecabSDarren Ye 		return CG_AUDIO_HOPPING_CK_MASK_SFT;
107*7384ecabSDarren Ye 	case MT8196_CG_AUDIO_F26M_CK:
108*7384ecabSDarren Ye 		return CG_AUDIO_F26M_CK_MASK_SFT;
109*7384ecabSDarren Ye 	case MT8196_CG_APLL1_CK:
110*7384ecabSDarren Ye 		return CG_APLL1_CK_MASK_SFT;
111*7384ecabSDarren Ye 	case MT8196_CG_APLL2_CK:
112*7384ecabSDarren Ye 		return CG_APLL2_CK_MASK_SFT;
113*7384ecabSDarren Ye 	case MT8196_PDN_APLL_TUNER2:
114*7384ecabSDarren Ye 		return PDN_APLL_TUNER2_MASK_SFT;
115*7384ecabSDarren Ye 	case MT8196_PDN_APLL_TUNER1:
116*7384ecabSDarren Ye 		return PDN_APLL_TUNER1_MASK_SFT;
117*7384ecabSDarren Ye 	default:
118*7384ecabSDarren Ye 		return 0;
119*7384ecabSDarren Ye 	}
120*7384ecabSDarren Ye }
121*7384ecabSDarren Ye 
122*7384ecabSDarren Ye static unsigned int get_top_cg_on_val(unsigned int cg_type)
123*7384ecabSDarren Ye {
124*7384ecabSDarren Ye 	switch (cg_type) {
125*7384ecabSDarren Ye 	case MT8196_AUDIO_26M_EN_ON:
126*7384ecabSDarren Ye 	case MT8196_AUDIO_F3P25M_EN_ON:
127*7384ecabSDarren Ye 	case MT8196_AUDIO_APLL1_EN_ON:
128*7384ecabSDarren Ye 	case MT8196_AUDIO_APLL2_EN_ON:
129*7384ecabSDarren Ye 		return get_top_cg_mask(cg_type);
130*7384ecabSDarren Ye 	case MT8196_CG_AUDIO_HOPPING_CK:
131*7384ecabSDarren Ye 	case MT8196_CG_AUDIO_F26M_CK:
132*7384ecabSDarren Ye 	case MT8196_CG_APLL1_CK:
133*7384ecabSDarren Ye 	case MT8196_CG_APLL2_CK:
134*7384ecabSDarren Ye 	case MT8196_PDN_APLL_TUNER2:
135*7384ecabSDarren Ye 	case MT8196_PDN_APLL_TUNER1:
136*7384ecabSDarren Ye 		return 0;
137*7384ecabSDarren Ye 	default:
138*7384ecabSDarren Ye 		return 0;
139*7384ecabSDarren Ye 	}
140*7384ecabSDarren Ye }
141*7384ecabSDarren Ye 
142*7384ecabSDarren Ye static unsigned int get_top_cg_off_val(unsigned int cg_type)
143*7384ecabSDarren Ye {
144*7384ecabSDarren Ye 	switch (cg_type) {
145*7384ecabSDarren Ye 	case MT8196_AUDIO_26M_EN_ON:
146*7384ecabSDarren Ye 	case MT8196_AUDIO_F3P25M_EN_ON:
147*7384ecabSDarren Ye 	case MT8196_AUDIO_APLL1_EN_ON:
148*7384ecabSDarren Ye 	case MT8196_AUDIO_APLL2_EN_ON:
149*7384ecabSDarren Ye 		return 0;
150*7384ecabSDarren Ye 	case MT8196_CG_AUDIO_HOPPING_CK:
151*7384ecabSDarren Ye 	case MT8196_CG_AUDIO_F26M_CK:
152*7384ecabSDarren Ye 	case MT8196_CG_APLL1_CK:
153*7384ecabSDarren Ye 	case MT8196_CG_APLL2_CK:
154*7384ecabSDarren Ye 	case MT8196_PDN_APLL_TUNER2:
155*7384ecabSDarren Ye 	case MT8196_PDN_APLL_TUNER1:
156*7384ecabSDarren Ye 		return get_top_cg_mask(cg_type);
157*7384ecabSDarren Ye 	default:
158*7384ecabSDarren Ye 		return get_top_cg_mask(cg_type);
159*7384ecabSDarren Ye 	}
160*7384ecabSDarren Ye }
161*7384ecabSDarren Ye 
162*7384ecabSDarren Ye static int mt8196_afe_enable_top_cg(struct mtk_base_afe *afe, unsigned int cg_type)
163*7384ecabSDarren Ye {
164*7384ecabSDarren Ye 	int ret;
165*7384ecabSDarren Ye 	unsigned int reg = get_top_cg_reg(cg_type);
166*7384ecabSDarren Ye 	unsigned int mask = get_top_cg_mask(cg_type);
167*7384ecabSDarren Ye 	unsigned int val = get_top_cg_on_val(cg_type);
168*7384ecabSDarren Ye 
169*7384ecabSDarren Ye 	if (!afe->regmap) {
170*7384ecabSDarren Ye 		dev_err(afe->dev, "afe regmap is null !!!\n");
171*7384ecabSDarren Ye 		return 0;
172*7384ecabSDarren Ye 	}
173*7384ecabSDarren Ye 
174*7384ecabSDarren Ye 	dev_dbg(afe->dev, "reg: 0x%x, mask: 0x%x, val: 0x%x\n", reg, mask, val);
175*7384ecabSDarren Ye 
176*7384ecabSDarren Ye 	ret = regmap_update_bits(afe->regmap, reg, mask, val);
177*7384ecabSDarren Ye 	if (ret)
178*7384ecabSDarren Ye 		dev_err(afe->dev, "regmap_update_bits failed: %d\n", ret);
179*7384ecabSDarren Ye 
180*7384ecabSDarren Ye 	return ret;
181*7384ecabSDarren Ye }
182*7384ecabSDarren Ye 
183*7384ecabSDarren Ye static int mt8196_afe_disable_top_cg(struct mtk_base_afe *afe, unsigned int cg_type)
184*7384ecabSDarren Ye {
185*7384ecabSDarren Ye 	int ret;
186*7384ecabSDarren Ye 	unsigned int reg = get_top_cg_reg(cg_type);
187*7384ecabSDarren Ye 	unsigned int mask = get_top_cg_mask(cg_type);
188*7384ecabSDarren Ye 	unsigned int val = get_top_cg_off_val(cg_type);
189*7384ecabSDarren Ye 
190*7384ecabSDarren Ye 	if (!afe->regmap) {
191*7384ecabSDarren Ye 		dev_err(afe->dev, "afe regmap is null !!!\n");
192*7384ecabSDarren Ye 		return 0;
193*7384ecabSDarren Ye 	}
194*7384ecabSDarren Ye 
195*7384ecabSDarren Ye 	dev_dbg(afe->dev, "reg: 0x%x, mask: 0x%x, val: 0x%x\n", reg, mask, val);
196*7384ecabSDarren Ye 
197*7384ecabSDarren Ye 	ret = regmap_update_bits(afe->regmap, reg, mask, val);
198*7384ecabSDarren Ye 	if (ret)
199*7384ecabSDarren Ye 		dev_err(afe->dev, "regmap_update_bits failed: %d\n", ret);
200*7384ecabSDarren Ye 
201*7384ecabSDarren Ye 	return ret;
202*7384ecabSDarren Ye }
203*7384ecabSDarren Ye 
204*7384ecabSDarren Ye static int apll1_mux_setting(struct mtk_base_afe *afe, bool enable)
205*7384ecabSDarren Ye {
206*7384ecabSDarren Ye 	struct mt8196_afe_private *afe_priv = afe->platform_priv;
207*7384ecabSDarren Ye 	int apll_rate;
208*7384ecabSDarren Ye 	int ret;
209*7384ecabSDarren Ye 
210*7384ecabSDarren Ye 	dev_dbg(afe->dev, "enable: %d\n", enable);
211*7384ecabSDarren Ye 
212*7384ecabSDarren Ye 	if (enable) {
213*7384ecabSDarren Ye 		apll_rate = mt8196_get_apll_rate(afe, MT8196_APLL1);
214*7384ecabSDarren Ye 
215*7384ecabSDarren Ye 		/* 180.6336 / 4 = 45.1584MHz */
216*7384ecabSDarren Ye 		ret = mt8196_afe_enable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUD_ENG1]);
217*7384ecabSDarren Ye 		if (ret)
218*7384ecabSDarren Ye 			return ret;
219*7384ecabSDarren Ye 
220*7384ecabSDarren Ye 		ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUD_ENG1],
221*7384ecabSDarren Ye 					      MT8196_AUD_ENG1_CLK);
222*7384ecabSDarren Ye 		if (ret)
223*7384ecabSDarren Ye 			return ret;
224*7384ecabSDarren Ye 
225*7384ecabSDarren Ye 		ret = mt8196_afe_enable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H]);
226*7384ecabSDarren Ye 		if (ret)
227*7384ecabSDarren Ye 			return ret;
228*7384ecabSDarren Ye 
229*7384ecabSDarren Ye 		ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H],
230*7384ecabSDarren Ye 					      apll_rate);
231*7384ecabSDarren Ye 		if (ret)
232*7384ecabSDarren Ye 			return ret;
233*7384ecabSDarren Ye 	} else {
234*7384ecabSDarren Ye 		ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUD_ENG1],
235*7384ecabSDarren Ye 					      MT8196_AFE_26M);
236*7384ecabSDarren Ye 		if (ret)
237*7384ecabSDarren Ye 			return ret;
238*7384ecabSDarren Ye 
239*7384ecabSDarren Ye 		mt8196_afe_disable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUD_ENG1]);
240*7384ecabSDarren Ye 
241*7384ecabSDarren Ye 		ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H],
242*7384ecabSDarren Ye 					      MT8196_AFE_26M);
243*7384ecabSDarren Ye 		if (ret)
244*7384ecabSDarren Ye 			return ret;
245*7384ecabSDarren Ye 
246*7384ecabSDarren Ye 		mt8196_afe_disable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H]);
247*7384ecabSDarren Ye 	}
248*7384ecabSDarren Ye 
249*7384ecabSDarren Ye 	return 0;
250*7384ecabSDarren Ye }
251*7384ecabSDarren Ye 
252*7384ecabSDarren Ye static int apll2_mux_setting(struct mtk_base_afe *afe, bool enable)
253*7384ecabSDarren Ye {
254*7384ecabSDarren Ye 	struct mt8196_afe_private *afe_priv = afe->platform_priv;
255*7384ecabSDarren Ye 	int apll_rate;
256*7384ecabSDarren Ye 	int ret;
257*7384ecabSDarren Ye 
258*7384ecabSDarren Ye 	dev_dbg(afe->dev, "enable: %d\n", enable);
259*7384ecabSDarren Ye 
260*7384ecabSDarren Ye 	if (enable) {
261*7384ecabSDarren Ye 		apll_rate = mt8196_get_apll_rate(afe, MT8196_APLL2);
262*7384ecabSDarren Ye 
263*7384ecabSDarren Ye 		/* 196.608 / 4 = 49.152MHz */
264*7384ecabSDarren Ye 		ret = mt8196_afe_enable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUD_ENG2]);
265*7384ecabSDarren Ye 		if (ret)
266*7384ecabSDarren Ye 			return ret;
267*7384ecabSDarren Ye 
268*7384ecabSDarren Ye 		ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUD_ENG2],
269*7384ecabSDarren Ye 					      MT8196_AUD_ENG2_CLK);
270*7384ecabSDarren Ye 		if (ret)
271*7384ecabSDarren Ye 			return ret;
272*7384ecabSDarren Ye 
273*7384ecabSDarren Ye 		ret = mt8196_afe_enable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H]);
274*7384ecabSDarren Ye 		if (ret)
275*7384ecabSDarren Ye 			return ret;
276*7384ecabSDarren Ye 
277*7384ecabSDarren Ye 		ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H],
278*7384ecabSDarren Ye 					      apll_rate);
279*7384ecabSDarren Ye 		if (ret)
280*7384ecabSDarren Ye 			return ret;
281*7384ecabSDarren Ye 	} else {
282*7384ecabSDarren Ye 		ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUD_ENG2],
283*7384ecabSDarren Ye 					      MT8196_AFE_26M);
284*7384ecabSDarren Ye 		if (ret)
285*7384ecabSDarren Ye 			return ret;
286*7384ecabSDarren Ye 
287*7384ecabSDarren Ye 		mt8196_afe_disable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUD_ENG2]);
288*7384ecabSDarren Ye 
289*7384ecabSDarren Ye 		ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H],
290*7384ecabSDarren Ye 					      MT8196_AFE_26M);
291*7384ecabSDarren Ye 		if (ret)
292*7384ecabSDarren Ye 			return ret;
293*7384ecabSDarren Ye 
294*7384ecabSDarren Ye 		mt8196_afe_disable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H]);
295*7384ecabSDarren Ye 	}
296*7384ecabSDarren Ye 
297*7384ecabSDarren Ye 	return 0;
298*7384ecabSDarren Ye }
299*7384ecabSDarren Ye 
300*7384ecabSDarren Ye int mt8196_apll1_enable(struct mtk_base_afe *afe)
301*7384ecabSDarren Ye {
302*7384ecabSDarren Ye 	int ret;
303*7384ecabSDarren Ye 
304*7384ecabSDarren Ye 	/* setting for APLL */
305*7384ecabSDarren Ye 	apll1_mux_setting(afe, true);
306*7384ecabSDarren Ye 
307*7384ecabSDarren Ye 	ret = mt8196_afe_enable_top_cg(afe, MT8196_CG_APLL1_CK);
308*7384ecabSDarren Ye 	if (ret)
309*7384ecabSDarren Ye 		goto err_clk_apll1;
310*7384ecabSDarren Ye 
311*7384ecabSDarren Ye 	ret = mt8196_afe_enable_top_cg(afe, MT8196_PDN_APLL_TUNER1);
312*7384ecabSDarren Ye 	if (ret)
313*7384ecabSDarren Ye 		goto err_clk_apll1_tuner;
314*7384ecabSDarren Ye 
315*7384ecabSDarren Ye 	/* sel 44.1kHz:1, apll_div:7, upper bound:3 */
316*7384ecabSDarren Ye 	regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG,
317*7384ecabSDarren Ye 			   XTAL_EN_128FS_SEL_MASK_SFT | APLL_DIV_MASK_SFT | UPPER_BOUND_MASK_SFT,
318*7384ecabSDarren Ye 			   (0x1 << XTAL_EN_128FS_SEL_SFT) | (7 << APLL_DIV_SFT) |
319*7384ecabSDarren Ye 			   (3 << UPPER_BOUND_SFT));
320*7384ecabSDarren Ye 
321*7384ecabSDarren Ye 	/* apll1 freq tuner enable */
322*7384ecabSDarren Ye 	regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG,
323*7384ecabSDarren Ye 			   FREQ_TUNER_EN_MASK_SFT,
324*7384ecabSDarren Ye 			   0x1 << FREQ_TUNER_EN_SFT);
325*7384ecabSDarren Ye 
326*7384ecabSDarren Ye 	/* audio apll1 on */
327*7384ecabSDarren Ye 	mt8196_afe_enable_top_cg(afe, MT8196_AUDIO_APLL1_EN_ON);
328*7384ecabSDarren Ye 
329*7384ecabSDarren Ye 	return 0;
330*7384ecabSDarren Ye 
331*7384ecabSDarren Ye err_clk_apll1_tuner:
332*7384ecabSDarren Ye 	mt8196_afe_disable_top_cg(afe, MT8196_PDN_APLL_TUNER1);
333*7384ecabSDarren Ye err_clk_apll1:
334*7384ecabSDarren Ye 	mt8196_afe_disable_top_cg(afe, MT8196_CG_APLL1_CK);
335*7384ecabSDarren Ye 	return ret;
336*7384ecabSDarren Ye }
337*7384ecabSDarren Ye 
338*7384ecabSDarren Ye void mt8196_apll1_disable(struct mtk_base_afe *afe)
339*7384ecabSDarren Ye {
340*7384ecabSDarren Ye 	/* audio apll1 off */
341*7384ecabSDarren Ye 	mt8196_afe_disable_top_cg(afe, MT8196_AUDIO_APLL1_EN_ON);
342*7384ecabSDarren Ye 
343*7384ecabSDarren Ye 	/* apll1 freq tuner disable */
344*7384ecabSDarren Ye 	regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG,
345*7384ecabSDarren Ye 			   FREQ_TUNER_EN_MASK_SFT,
346*7384ecabSDarren Ye 			   0x0);
347*7384ecabSDarren Ye 
348*7384ecabSDarren Ye 	mt8196_afe_disable_top_cg(afe, MT8196_PDN_APLL_TUNER1);
349*7384ecabSDarren Ye 	mt8196_afe_disable_top_cg(afe, MT8196_CG_APLL1_CK);
350*7384ecabSDarren Ye 	apll1_mux_setting(afe, false);
351*7384ecabSDarren Ye }
352*7384ecabSDarren Ye 
353*7384ecabSDarren Ye int mt8196_apll2_enable(struct mtk_base_afe *afe)
354*7384ecabSDarren Ye {
355*7384ecabSDarren Ye 	int ret;
356*7384ecabSDarren Ye 
357*7384ecabSDarren Ye 	/* setting for APLL */
358*7384ecabSDarren Ye 	apll2_mux_setting(afe, true);
359*7384ecabSDarren Ye 
360*7384ecabSDarren Ye 	ret = mt8196_afe_enable_top_cg(afe, MT8196_CG_APLL2_CK);
361*7384ecabSDarren Ye 	if (ret)
362*7384ecabSDarren Ye 		goto err_clk_apll2;
363*7384ecabSDarren Ye 
364*7384ecabSDarren Ye 	ret = mt8196_afe_enable_top_cg(afe, MT8196_PDN_APLL_TUNER2);
365*7384ecabSDarren Ye 	if (ret)
366*7384ecabSDarren Ye 		goto err_clk_apll2_tuner;
367*7384ecabSDarren Ye 
368*7384ecabSDarren Ye 	/* sel 48kHz: 2, apll_div: 7, upper bound: 3*/
369*7384ecabSDarren Ye 	regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG,
370*7384ecabSDarren Ye 			   XTAL_EN_128FS_SEL_MASK_SFT | APLL_DIV_MASK_SFT | UPPER_BOUND_MASK_SFT,
371*7384ecabSDarren Ye 			   (0x2 << XTAL_EN_128FS_SEL_SFT) | (7 << APLL_DIV_SFT) |
372*7384ecabSDarren Ye 			   (3 << UPPER_BOUND_SFT));
373*7384ecabSDarren Ye 
374*7384ecabSDarren Ye 	/* apll2 freq tuner enable */
375*7384ecabSDarren Ye 	regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG,
376*7384ecabSDarren Ye 			   FREQ_TUNER_EN_MASK_SFT,
377*7384ecabSDarren Ye 			   0x1 << FREQ_TUNER_EN_SFT);
378*7384ecabSDarren Ye 
379*7384ecabSDarren Ye 	/* audio apll2 on */
380*7384ecabSDarren Ye 	mt8196_afe_enable_top_cg(afe, MT8196_AUDIO_APLL2_EN_ON);
381*7384ecabSDarren Ye 	return 0;
382*7384ecabSDarren Ye 
383*7384ecabSDarren Ye err_clk_apll2_tuner:
384*7384ecabSDarren Ye 	mt8196_afe_disable_top_cg(afe, MT8196_PDN_APLL_TUNER2);
385*7384ecabSDarren Ye err_clk_apll2:
386*7384ecabSDarren Ye 	mt8196_afe_disable_top_cg(afe, MT8196_CG_APLL2_CK);
387*7384ecabSDarren Ye 	return 0;
388*7384ecabSDarren Ye }
389*7384ecabSDarren Ye 
390*7384ecabSDarren Ye void mt8196_apll2_disable(struct mtk_base_afe *afe)
391*7384ecabSDarren Ye {
392*7384ecabSDarren Ye 	/* audio apll2 off */
393*7384ecabSDarren Ye 	mt8196_afe_disable_top_cg(afe, MT8196_AUDIO_APLL2_EN_ON);
394*7384ecabSDarren Ye 
395*7384ecabSDarren Ye 	/* apll2 freq tuner disable */
396*7384ecabSDarren Ye 	regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG,
397*7384ecabSDarren Ye 			   FREQ_TUNER_EN_MASK_SFT,
398*7384ecabSDarren Ye 			   0x0);
399*7384ecabSDarren Ye 
400*7384ecabSDarren Ye 	mt8196_afe_disable_top_cg(afe, MT8196_PDN_APLL_TUNER2);
401*7384ecabSDarren Ye 	mt8196_afe_disable_top_cg(afe, MT8196_CG_APLL2_CK);
402*7384ecabSDarren Ye 	apll2_mux_setting(afe, false);
403*7384ecabSDarren Ye }
404*7384ecabSDarren Ye 
405*7384ecabSDarren Ye int mt8196_get_apll_rate(struct mtk_base_afe *afe, int apll)
406*7384ecabSDarren Ye {
407*7384ecabSDarren Ye 	struct mt8196_afe_private *afe_priv = afe->platform_priv;
408*7384ecabSDarren Ye 	int clk_id = 0;
409*7384ecabSDarren Ye 
410*7384ecabSDarren Ye 	if (apll < MT8196_APLL1 || apll > MT8196_APLL2) {
411*7384ecabSDarren Ye 		dev_warn(afe->dev, "invalid clk id %d\n", apll);
412*7384ecabSDarren Ye 		return 0;
413*7384ecabSDarren Ye 	}
414*7384ecabSDarren Ye 
415*7384ecabSDarren Ye 	if (apll == MT8196_APLL1)
416*7384ecabSDarren Ye 		clk_id = MT8196_CLK_TOP_APLL1_CK;
417*7384ecabSDarren Ye 	else
418*7384ecabSDarren Ye 		clk_id = MT8196_CLK_TOP_APLL2_CK;
419*7384ecabSDarren Ye 
420*7384ecabSDarren Ye 	return clk_get_rate(afe_priv->clk[clk_id]);
421*7384ecabSDarren Ye }
422*7384ecabSDarren Ye 
423*7384ecabSDarren Ye /* 48K: select APLL2; 44.1k: select APLL1 */
424*7384ecabSDarren Ye int mt8196_get_apll_by_rate(struct mtk_base_afe *afe, int rate)
425*7384ecabSDarren Ye {
426*7384ecabSDarren Ye 	return (rate % 8000) ? MT8196_APLL1 : MT8196_APLL2;
427*7384ecabSDarren Ye }
428*7384ecabSDarren Ye 
429*7384ecabSDarren Ye int mt8196_get_apll_by_name(struct mtk_base_afe *afe, const char *name)
430*7384ecabSDarren Ye {
431*7384ecabSDarren Ye 	if (strcmp(name, APLL1_W_NAME) == 0)
432*7384ecabSDarren Ye 		return MT8196_APLL1;
433*7384ecabSDarren Ye 
434*7384ecabSDarren Ye 	return MT8196_APLL2;
435*7384ecabSDarren Ye }
436*7384ecabSDarren Ye 
437*7384ecabSDarren Ye static const int mck_div[MT8196_MCK_NUM] = {
438*7384ecabSDarren Ye 	[MT8196_I2SIN0_MCK] = MT8196_CLK_TOP_APLL12_DIV_I2SIN0,
439*7384ecabSDarren Ye 	[MT8196_I2SIN1_MCK] = MT8196_CLK_TOP_APLL12_DIV_I2SIN1,
440*7384ecabSDarren Ye 	[MT8196_FMI2S_MCK] = MT8196_CLK_TOP_APLL12_DIV_FMI2S,
441*7384ecabSDarren Ye 	[MT8196_TDMOUT_MCK] = MT8196_CLK_TOP_APLL12_DIV_TDMOUT_M,
442*7384ecabSDarren Ye 	[MT8196_TDMOUT_BCK] = MT8196_CLK_TOP_APLL12_DIV_TDMOUT_B,
443*7384ecabSDarren Ye };
444*7384ecabSDarren Ye 
445*7384ecabSDarren Ye int mt8196_mck_enable(struct mtk_base_afe *afe, int mck_id, int rate)
446*7384ecabSDarren Ye {
447*7384ecabSDarren Ye 	struct mt8196_afe_private *afe_priv = afe->platform_priv;
448*7384ecabSDarren Ye 	int div_clk_id;
449*7384ecabSDarren Ye 	int ret;
450*7384ecabSDarren Ye 
451*7384ecabSDarren Ye 	dev_dbg(afe->dev, "mck_id: %d, rate: %d\n", mck_id, rate);
452*7384ecabSDarren Ye 
453*7384ecabSDarren Ye 	if (mck_id >= MT8196_MCK_NUM || mck_id < 0)
454*7384ecabSDarren Ye 		return -EINVAL;
455*7384ecabSDarren Ye 
456*7384ecabSDarren Ye 	div_clk_id = mck_div[mck_id];
457*7384ecabSDarren Ye 
458*7384ecabSDarren Ye 	/* enable div, set rate */
459*7384ecabSDarren Ye 	if (div_clk_id < 0) {
460*7384ecabSDarren Ye 		dev_err(afe->dev, "invalid div_clk_id %d\n", div_clk_id);
461*7384ecabSDarren Ye 		return -EINVAL;
462*7384ecabSDarren Ye 	}
463*7384ecabSDarren Ye 
464*7384ecabSDarren Ye 	if (div_clk_id == MT8196_CLK_TOP_APLL12_DIV_TDMOUT_B)
465*7384ecabSDarren Ye 		rate *= 16;
466*7384ecabSDarren Ye 
467*7384ecabSDarren Ye 	ret = mt8196_afe_enable_clk(afe, afe_priv->clk[div_clk_id]);
468*7384ecabSDarren Ye 	if (ret)
469*7384ecabSDarren Ye 		return ret;
470*7384ecabSDarren Ye 
471*7384ecabSDarren Ye 	ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[div_clk_id], rate);
472*7384ecabSDarren Ye 	if (ret)
473*7384ecabSDarren Ye 		return ret;
474*7384ecabSDarren Ye 
475*7384ecabSDarren Ye 	return 0;
476*7384ecabSDarren Ye }
477*7384ecabSDarren Ye 
478*7384ecabSDarren Ye int mt8196_mck_disable(struct mtk_base_afe *afe, int mck_id)
479*7384ecabSDarren Ye {
480*7384ecabSDarren Ye 	struct mt8196_afe_private *afe_priv = afe->platform_priv;
481*7384ecabSDarren Ye 	int div_clk_id;
482*7384ecabSDarren Ye 	int ret;
483*7384ecabSDarren Ye 
484*7384ecabSDarren Ye 	dev_dbg(afe->dev, "mck_id: %d.\n", mck_id);
485*7384ecabSDarren Ye 
486*7384ecabSDarren Ye 	if (mck_id < 0) {
487*7384ecabSDarren Ye 		dev_err(afe->dev, "mck_id = %d < 0\n", mck_id);
488*7384ecabSDarren Ye 		return -EINVAL;
489*7384ecabSDarren Ye 	}
490*7384ecabSDarren Ye 
491*7384ecabSDarren Ye 	div_clk_id = mck_div[mck_id];
492*7384ecabSDarren Ye 
493*7384ecabSDarren Ye 	if (div_clk_id < 0) {
494*7384ecabSDarren Ye 		dev_err(afe->dev, "div_clk_id = %d < 0\n",
495*7384ecabSDarren Ye 			div_clk_id);
496*7384ecabSDarren Ye 		return -EINVAL;
497*7384ecabSDarren Ye 	}
498*7384ecabSDarren Ye 
499*7384ecabSDarren Ye 	ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[div_clk_id], MT8196_AFE_26M);
500*7384ecabSDarren Ye 	if (ret)
501*7384ecabSDarren Ye 		return ret;
502*7384ecabSDarren Ye 
503*7384ecabSDarren Ye 	mt8196_afe_disable_clk(afe, afe_priv->clk[div_clk_id]);
504*7384ecabSDarren Ye 
505*7384ecabSDarren Ye 	return 0;
506*7384ecabSDarren Ye }
507*7384ecabSDarren Ye 
508*7384ecabSDarren Ye int mt8196_afe_enable_reg_rw_clk(struct mtk_base_afe *afe)
509*7384ecabSDarren Ye {
510*7384ecabSDarren Ye 	struct mt8196_afe_private *afe_priv = afe->platform_priv;
511*7384ecabSDarren Ye 	int ret;
512*7384ecabSDarren Ye 
513*7384ecabSDarren Ye 	/* bus clock for AFE external access, like DRAM */
514*7384ecabSDarren Ye 	mt8196_afe_enable_clk(afe, afe_priv->clk[MT8196_CLK_TOP_ADSP_SEL]);
515*7384ecabSDarren Ye 
516*7384ecabSDarren Ye 	/* bus clock for AFE internal access, like AFE SRAM */
517*7384ecabSDarren Ye 	mt8196_afe_enable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIOINTBUS]);
518*7384ecabSDarren Ye 	ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIOINTBUS],
519*7384ecabSDarren Ye 				      MT8196_AFE_26M);
520*7384ecabSDarren Ye 	if (ret)
521*7384ecabSDarren Ye 		return ret;
522*7384ecabSDarren Ye 
523*7384ecabSDarren Ye 	/* enable audio h clock */
524*7384ecabSDarren Ye 	mt8196_afe_enable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H]);
525*7384ecabSDarren Ye 	ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H],
526*7384ecabSDarren Ye 				      MT8196_AFE_26M);
527*7384ecabSDarren Ye 	if (ret)
528*7384ecabSDarren Ye 		return ret;
529*7384ecabSDarren Ye 
530*7384ecabSDarren Ye 	/* AFE hw clock */
531*7384ecabSDarren Ye 	/* IPM2.0: USE HOPPING & 26M */
532*7384ecabSDarren Ye 	/* set in the regmap_register_patch */
533*7384ecabSDarren Ye 	return 0;
534*7384ecabSDarren Ye }
535*7384ecabSDarren Ye 
536*7384ecabSDarren Ye int mt8196_afe_disable_reg_rw_clk(struct mtk_base_afe *afe)
537*7384ecabSDarren Ye {
538*7384ecabSDarren Ye 	struct mt8196_afe_private *afe_priv = afe->platform_priv;
539*7384ecabSDarren Ye 
540*7384ecabSDarren Ye 	/* IPM2.0: Use HOPPING & 26M */
541*7384ecabSDarren Ye 	/* set in the regmap_register_patch */
542*7384ecabSDarren Ye 
543*7384ecabSDarren Ye 	mt8196_afe_disable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H]);
544*7384ecabSDarren Ye 	mt8196_afe_disable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIOINTBUS]);
545*7384ecabSDarren Ye 	mt8196_afe_disable_clk(afe, afe_priv->clk[MT8196_CLK_TOP_ADSP_SEL]);
546*7384ecabSDarren Ye 	return 0;
547*7384ecabSDarren Ye }
548*7384ecabSDarren Ye 
549*7384ecabSDarren Ye int mt8196_afe_enable_main_clock(struct mtk_base_afe *afe)
550*7384ecabSDarren Ye {
551*7384ecabSDarren Ye 	mt8196_afe_enable_top_cg(afe, MT8196_AUDIO_26M_EN_ON);
552*7384ecabSDarren Ye 	return 0;
553*7384ecabSDarren Ye }
554*7384ecabSDarren Ye 
555*7384ecabSDarren Ye int mt8196_afe_disable_main_clock(struct mtk_base_afe *afe)
556*7384ecabSDarren Ye {
557*7384ecabSDarren Ye 	mt8196_afe_disable_top_cg(afe, MT8196_AUDIO_26M_EN_ON);
558*7384ecabSDarren Ye 	return 0;
559*7384ecabSDarren Ye }
560*7384ecabSDarren Ye 
561*7384ecabSDarren Ye int mt8196_init_clock(struct mtk_base_afe *afe)
562*7384ecabSDarren Ye {
563*7384ecabSDarren Ye 	struct mt8196_afe_private *afe_priv = afe->platform_priv;
564*7384ecabSDarren Ye 	int i;
565*7384ecabSDarren Ye 
566*7384ecabSDarren Ye 	afe_priv->clk = devm_kcalloc(afe->dev, MT8196_CLK_NUM, sizeof(*afe_priv->clk),
567*7384ecabSDarren Ye 				     GFP_KERNEL);
568*7384ecabSDarren Ye 	if (!afe_priv->clk)
569*7384ecabSDarren Ye 		return -ENOMEM;
570*7384ecabSDarren Ye 
571*7384ecabSDarren Ye 	for (i = 0; i < MT8196_CLK_NUM; i++) {
572*7384ecabSDarren Ye 		afe_priv->clk[i] = devm_clk_get(afe->dev, aud_clks[i]);
573*7384ecabSDarren Ye 		if (IS_ERR(afe_priv->clk[i])) {
574*7384ecabSDarren Ye 			dev_err(afe->dev, "devm_clk_get %s fail\n", aud_clks[i]);
575*7384ecabSDarren Ye 			return PTR_ERR(afe_priv->clk[i]);
576*7384ecabSDarren Ye 		}
577*7384ecabSDarren Ye 	}
578*7384ecabSDarren Ye 
579*7384ecabSDarren Ye 	return 0;
580*7384ecabSDarren Ye }
581*7384ecabSDarren Ye 
582