1*55b423d5SJiaxin Yu // SPDX-License-Identifier: GPL-2.0
2*55b423d5SJiaxin Yu //
3*55b423d5SJiaxin Yu // mt8186-afe-clk.c  --  Mediatek 8186 afe clock ctrl
4*55b423d5SJiaxin Yu //
5*55b423d5SJiaxin Yu // Copyright (c) 2022 MediaTek Inc.
6*55b423d5SJiaxin Yu // Author: Jiaxin Yu <jiaxin.yu@mediatek.com>
7*55b423d5SJiaxin Yu 
8*55b423d5SJiaxin Yu #include <linux/clk.h>
9*55b423d5SJiaxin Yu #include <linux/regmap.h>
10*55b423d5SJiaxin Yu #include <linux/mfd/syscon.h>
11*55b423d5SJiaxin Yu 
12*55b423d5SJiaxin Yu #include "mt8186-afe-common.h"
13*55b423d5SJiaxin Yu #include "mt8186-afe-clk.h"
14*55b423d5SJiaxin Yu #include "mt8186-audsys-clk.h"
15*55b423d5SJiaxin Yu 
16*55b423d5SJiaxin Yu static const char *aud_clks[CLK_NUM] = {
17*55b423d5SJiaxin Yu 	[CLK_AFE] = "aud_afe_clk",
18*55b423d5SJiaxin Yu 	[CLK_DAC] = "aud_dac_clk",
19*55b423d5SJiaxin Yu 	[CLK_DAC_PREDIS] = "aud_dac_predis_clk",
20*55b423d5SJiaxin Yu 	[CLK_ADC] = "aud_adc_clk",
21*55b423d5SJiaxin Yu 	[CLK_TML] = "aud_tml_clk",
22*55b423d5SJiaxin Yu 	[CLK_APLL22M] = "aud_apll22m_clk",
23*55b423d5SJiaxin Yu 	[CLK_APLL24M] = "aud_apll24m_clk",
24*55b423d5SJiaxin Yu 	[CLK_APLL1_TUNER] = "aud_apll_tuner_clk",
25*55b423d5SJiaxin Yu 	[CLK_APLL2_TUNER] = "aud_apll2_tuner_clk",
26*55b423d5SJiaxin Yu 	[CLK_TDM] = "aud_tdm_clk",
27*55b423d5SJiaxin Yu 	[CLK_NLE] = "aud_nle_clk",
28*55b423d5SJiaxin Yu 	[CLK_DAC_HIRES] = "aud_dac_hires_clk",
29*55b423d5SJiaxin Yu 	[CLK_ADC_HIRES] = "aud_adc_hires_clk",
30*55b423d5SJiaxin Yu 	[CLK_I2S1_BCLK] = "aud_i2s1_bclk",
31*55b423d5SJiaxin Yu 	[CLK_I2S2_BCLK] = "aud_i2s2_bclk",
32*55b423d5SJiaxin Yu 	[CLK_I2S3_BCLK] = "aud_i2s3_bclk",
33*55b423d5SJiaxin Yu 	[CLK_I2S4_BCLK] = "aud_i2s4_bclk",
34*55b423d5SJiaxin Yu 	[CLK_CONNSYS_I2S_ASRC] = "aud_connsys_i2s_asrc",
35*55b423d5SJiaxin Yu 	[CLK_GENERAL1_ASRC] = "aud_general1_asrc",
36*55b423d5SJiaxin Yu 	[CLK_GENERAL2_ASRC] = "aud_general2_asrc",
37*55b423d5SJiaxin Yu 	[CLK_ADC_HIRES_TML] = "aud_adc_hires_tml",
38*55b423d5SJiaxin Yu 	[CLK_ADDA6_ADC] = "aud_adda6_adc",
39*55b423d5SJiaxin Yu 	[CLK_ADDA6_ADC_HIRES] = "aud_adda6_adc_hires",
40*55b423d5SJiaxin Yu 	[CLK_3RD_DAC] = "aud_3rd_dac",
41*55b423d5SJiaxin Yu 	[CLK_3RD_DAC_PREDIS] = "aud_3rd_dac_predis",
42*55b423d5SJiaxin Yu 	[CLK_3RD_DAC_TML] = "aud_3rd_dac_tml",
43*55b423d5SJiaxin Yu 	[CLK_3RD_DAC_HIRES] = "aud_3rd_dac_hires",
44*55b423d5SJiaxin Yu 	[CLK_ETDM_IN1_BCLK] = "aud_etdm_in1_bclk",
45*55b423d5SJiaxin Yu 	[CLK_ETDM_OUT1_BCLK] = "aud_etdm_out1_bclk",
46*55b423d5SJiaxin Yu 	[CLK_INFRA_SYS_AUDIO] = "aud_infra_clk",
47*55b423d5SJiaxin Yu 	[CLK_INFRA_AUDIO_26M] = "mtkaif_26m_clk",
48*55b423d5SJiaxin Yu 	[CLK_MUX_AUDIO] = "top_mux_audio",
49*55b423d5SJiaxin Yu 	[CLK_MUX_AUDIOINTBUS] = "top_mux_audio_int",
50*55b423d5SJiaxin Yu 	[CLK_TOP_MAINPLL_D2_D4] = "top_mainpll_d2_d4",
51*55b423d5SJiaxin Yu 	[CLK_TOP_MUX_AUD_1] = "top_mux_aud_1",
52*55b423d5SJiaxin Yu 	[CLK_TOP_APLL1_CK] = "top_apll1_ck",
53*55b423d5SJiaxin Yu 	[CLK_TOP_MUX_AUD_2] = "top_mux_aud_2",
54*55b423d5SJiaxin Yu 	[CLK_TOP_APLL2_CK] = "top_apll2_ck",
55*55b423d5SJiaxin Yu 	[CLK_TOP_MUX_AUD_ENG1] = "top_mux_aud_eng1",
56*55b423d5SJiaxin Yu 	[CLK_TOP_APLL1_D8] = "top_apll1_d8",
57*55b423d5SJiaxin Yu 	[CLK_TOP_MUX_AUD_ENG2] = "top_mux_aud_eng2",
58*55b423d5SJiaxin Yu 	[CLK_TOP_APLL2_D8] = "top_apll2_d8",
59*55b423d5SJiaxin Yu 	[CLK_TOP_MUX_AUDIO_H] = "top_mux_audio_h",
60*55b423d5SJiaxin Yu 	[CLK_TOP_I2S0_M_SEL] = "top_i2s0_m_sel",
61*55b423d5SJiaxin Yu 	[CLK_TOP_I2S1_M_SEL] = "top_i2s1_m_sel",
62*55b423d5SJiaxin Yu 	[CLK_TOP_I2S2_M_SEL] = "top_i2s2_m_sel",
63*55b423d5SJiaxin Yu 	[CLK_TOP_I2S4_M_SEL] = "top_i2s4_m_sel",
64*55b423d5SJiaxin Yu 	[CLK_TOP_TDM_M_SEL] = "top_tdm_m_sel",
65*55b423d5SJiaxin Yu 	[CLK_TOP_APLL12_DIV0] = "top_apll12_div0",
66*55b423d5SJiaxin Yu 	[CLK_TOP_APLL12_DIV1] = "top_apll12_div1",
67*55b423d5SJiaxin Yu 	[CLK_TOP_APLL12_DIV2] = "top_apll12_div2",
68*55b423d5SJiaxin Yu 	[CLK_TOP_APLL12_DIV4] = "top_apll12_div4",
69*55b423d5SJiaxin Yu 	[CLK_TOP_APLL12_DIV_TDM] = "top_apll12_div_tdm",
70*55b423d5SJiaxin Yu 	[CLK_CLK26M] = "top_clk26m_clk",
71*55b423d5SJiaxin Yu };
72*55b423d5SJiaxin Yu 
mt8186_set_audio_int_bus_parent(struct mtk_base_afe * afe,int clk_id)73*55b423d5SJiaxin Yu int mt8186_set_audio_int_bus_parent(struct mtk_base_afe *afe,
74*55b423d5SJiaxin Yu 				    int clk_id)
75*55b423d5SJiaxin Yu {
76*55b423d5SJiaxin Yu 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
77*55b423d5SJiaxin Yu 	int ret;
78*55b423d5SJiaxin Yu 
79*55b423d5SJiaxin Yu 	ret = clk_set_parent(afe_priv->clk[CLK_MUX_AUDIOINTBUS],
80*55b423d5SJiaxin Yu 			     afe_priv->clk[clk_id]);
81*55b423d5SJiaxin Yu 	if (ret) {
82*55b423d5SJiaxin Yu 		dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
83*55b423d5SJiaxin Yu 			__func__, aud_clks[CLK_MUX_AUDIOINTBUS],
84*55b423d5SJiaxin Yu 			aud_clks[clk_id], ret);
85*55b423d5SJiaxin Yu 		return ret;
86*55b423d5SJiaxin Yu 	}
87*55b423d5SJiaxin Yu 
88*55b423d5SJiaxin Yu 	return 0;
89*55b423d5SJiaxin Yu }
90*55b423d5SJiaxin Yu 
apll1_mux_setting(struct mtk_base_afe * afe,bool enable)91*55b423d5SJiaxin Yu static int apll1_mux_setting(struct mtk_base_afe *afe, bool enable)
92*55b423d5SJiaxin Yu {
93*55b423d5SJiaxin Yu 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
94*55b423d5SJiaxin Yu 	int ret;
95*55b423d5SJiaxin Yu 
96*55b423d5SJiaxin Yu 	if (enable) {
97*55b423d5SJiaxin Yu 		ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_1]);
98*55b423d5SJiaxin Yu 		if (ret) {
99*55b423d5SJiaxin Yu 			dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
100*55b423d5SJiaxin Yu 				__func__, aud_clks[CLK_TOP_MUX_AUD_1], ret);
101*55b423d5SJiaxin Yu 			return ret;
102*55b423d5SJiaxin Yu 		}
103*55b423d5SJiaxin Yu 		ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_1],
104*55b423d5SJiaxin Yu 				     afe_priv->clk[CLK_TOP_APLL1_CK]);
105*55b423d5SJiaxin Yu 		if (ret) {
106*55b423d5SJiaxin Yu 			dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
107*55b423d5SJiaxin Yu 				__func__, aud_clks[CLK_TOP_MUX_AUD_1],
108*55b423d5SJiaxin Yu 				aud_clks[CLK_TOP_APLL1_CK], ret);
109*55b423d5SJiaxin Yu 			return ret;
110*55b423d5SJiaxin Yu 		}
111*55b423d5SJiaxin Yu 
112*55b423d5SJiaxin Yu 		/* 180.6336 / 8 = 22.5792MHz */
113*55b423d5SJiaxin Yu 		ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1]);
114*55b423d5SJiaxin Yu 		if (ret) {
115*55b423d5SJiaxin Yu 			dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
116*55b423d5SJiaxin Yu 				__func__, aud_clks[CLK_TOP_MUX_AUD_ENG1], ret);
117*55b423d5SJiaxin Yu 			return ret;
118*55b423d5SJiaxin Yu 		}
119*55b423d5SJiaxin Yu 		ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1],
120*55b423d5SJiaxin Yu 				     afe_priv->clk[CLK_TOP_APLL1_D8]);
121*55b423d5SJiaxin Yu 		if (ret) {
122*55b423d5SJiaxin Yu 			dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
123*55b423d5SJiaxin Yu 				__func__, aud_clks[CLK_TOP_MUX_AUD_ENG1],
124*55b423d5SJiaxin Yu 				aud_clks[CLK_TOP_APLL1_D8], ret);
125*55b423d5SJiaxin Yu 			return ret;
126*55b423d5SJiaxin Yu 		}
127*55b423d5SJiaxin Yu 	} else {
128*55b423d5SJiaxin Yu 		ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1],
129*55b423d5SJiaxin Yu 				     afe_priv->clk[CLK_CLK26M]);
130*55b423d5SJiaxin Yu 		if (ret) {
131*55b423d5SJiaxin Yu 			dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
132*55b423d5SJiaxin Yu 				__func__, aud_clks[CLK_TOP_MUX_AUD_ENG1],
133*55b423d5SJiaxin Yu 				aud_clks[CLK_CLK26M], ret);
134*55b423d5SJiaxin Yu 			return ret;
135*55b423d5SJiaxin Yu 		}
136*55b423d5SJiaxin Yu 		clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_ENG1]);
137*55b423d5SJiaxin Yu 
138*55b423d5SJiaxin Yu 		ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_1],
139*55b423d5SJiaxin Yu 				     afe_priv->clk[CLK_CLK26M]);
140*55b423d5SJiaxin Yu 		if (ret) {
141*55b423d5SJiaxin Yu 			dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
142*55b423d5SJiaxin Yu 				__func__, aud_clks[CLK_TOP_MUX_AUD_1],
143*55b423d5SJiaxin Yu 				aud_clks[CLK_CLK26M], ret);
144*55b423d5SJiaxin Yu 			return ret;
145*55b423d5SJiaxin Yu 		}
146*55b423d5SJiaxin Yu 		clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_1]);
147*55b423d5SJiaxin Yu 	}
148*55b423d5SJiaxin Yu 
149*55b423d5SJiaxin Yu 	return 0;
150*55b423d5SJiaxin Yu }
151*55b423d5SJiaxin Yu 
apll2_mux_setting(struct mtk_base_afe * afe,bool enable)152*55b423d5SJiaxin Yu static int apll2_mux_setting(struct mtk_base_afe *afe, bool enable)
153*55b423d5SJiaxin Yu {
154*55b423d5SJiaxin Yu 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
155*55b423d5SJiaxin Yu 	int ret;
156*55b423d5SJiaxin Yu 
157*55b423d5SJiaxin Yu 	if (enable) {
158*55b423d5SJiaxin Yu 		ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_2]);
159*55b423d5SJiaxin Yu 		if (ret) {
160*55b423d5SJiaxin Yu 			dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
161*55b423d5SJiaxin Yu 				__func__, aud_clks[CLK_TOP_MUX_AUD_2], ret);
162*55b423d5SJiaxin Yu 			return ret;
163*55b423d5SJiaxin Yu 		}
164*55b423d5SJiaxin Yu 		ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_2],
165*55b423d5SJiaxin Yu 				     afe_priv->clk[CLK_TOP_APLL2_CK]);
166*55b423d5SJiaxin Yu 		if (ret) {
167*55b423d5SJiaxin Yu 			dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
168*55b423d5SJiaxin Yu 				__func__, aud_clks[CLK_TOP_MUX_AUD_2],
169*55b423d5SJiaxin Yu 				aud_clks[CLK_TOP_APLL2_CK], ret);
170*55b423d5SJiaxin Yu 			return ret;
171*55b423d5SJiaxin Yu 		}
172*55b423d5SJiaxin Yu 
173*55b423d5SJiaxin Yu 		/* 196.608 / 8 = 24.576MHz */
174*55b423d5SJiaxin Yu 		ret = clk_prepare_enable(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2]);
175*55b423d5SJiaxin Yu 		if (ret) {
176*55b423d5SJiaxin Yu 			dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
177*55b423d5SJiaxin Yu 				__func__, aud_clks[CLK_TOP_MUX_AUD_ENG2], ret);
178*55b423d5SJiaxin Yu 			return ret;
179*55b423d5SJiaxin Yu 		}
180*55b423d5SJiaxin Yu 		ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2],
181*55b423d5SJiaxin Yu 				     afe_priv->clk[CLK_TOP_APLL2_D8]);
182*55b423d5SJiaxin Yu 		if (ret) {
183*55b423d5SJiaxin Yu 			dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
184*55b423d5SJiaxin Yu 				__func__, aud_clks[CLK_TOP_MUX_AUD_ENG2],
185*55b423d5SJiaxin Yu 				aud_clks[CLK_TOP_APLL2_D8], ret);
186*55b423d5SJiaxin Yu 			return ret;
187*55b423d5SJiaxin Yu 		}
188*55b423d5SJiaxin Yu 	} else {
189*55b423d5SJiaxin Yu 		ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2],
190*55b423d5SJiaxin Yu 				     afe_priv->clk[CLK_CLK26M]);
191*55b423d5SJiaxin Yu 		if (ret) {
192*55b423d5SJiaxin Yu 			dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
193*55b423d5SJiaxin Yu 				__func__, aud_clks[CLK_TOP_MUX_AUD_ENG2],
194*55b423d5SJiaxin Yu 				aud_clks[CLK_CLK26M], ret);
195*55b423d5SJiaxin Yu 			return ret;
196*55b423d5SJiaxin Yu 		}
197*55b423d5SJiaxin Yu 		clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_ENG2]);
198*55b423d5SJiaxin Yu 
199*55b423d5SJiaxin Yu 		ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUD_2],
200*55b423d5SJiaxin Yu 				     afe_priv->clk[CLK_CLK26M]);
201*55b423d5SJiaxin Yu 		if (ret) {
202*55b423d5SJiaxin Yu 			dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
203*55b423d5SJiaxin Yu 				__func__, aud_clks[CLK_TOP_MUX_AUD_2],
204*55b423d5SJiaxin Yu 				aud_clks[CLK_CLK26M], ret);
205*55b423d5SJiaxin Yu 			return ret;
206*55b423d5SJiaxin Yu 		}
207*55b423d5SJiaxin Yu 		clk_disable_unprepare(afe_priv->clk[CLK_TOP_MUX_AUD_2]);
208*55b423d5SJiaxin Yu 	}
209*55b423d5SJiaxin Yu 
210*55b423d5SJiaxin Yu 	return 0;
211*55b423d5SJiaxin Yu }
212*55b423d5SJiaxin Yu 
mt8186_afe_enable_cgs(struct mtk_base_afe * afe)213*55b423d5SJiaxin Yu int mt8186_afe_enable_cgs(struct mtk_base_afe *afe)
214*55b423d5SJiaxin Yu {
215*55b423d5SJiaxin Yu 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
216*55b423d5SJiaxin Yu 	int ret = 0;
217*55b423d5SJiaxin Yu 	int i;
218*55b423d5SJiaxin Yu 
219*55b423d5SJiaxin Yu 	for (i = CLK_I2S1_BCLK; i <= CLK_ETDM_OUT1_BCLK; i++) {
220*55b423d5SJiaxin Yu 		ret = clk_prepare_enable(afe_priv->clk[i]);
221*55b423d5SJiaxin Yu 		if (ret) {
222*55b423d5SJiaxin Yu 			dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
223*55b423d5SJiaxin Yu 				__func__, aud_clks[i], ret);
224*55b423d5SJiaxin Yu 			return ret;
225*55b423d5SJiaxin Yu 		}
226*55b423d5SJiaxin Yu 	}
227*55b423d5SJiaxin Yu 
228*55b423d5SJiaxin Yu 	return 0;
229*55b423d5SJiaxin Yu }
230*55b423d5SJiaxin Yu 
mt8186_afe_disable_cgs(struct mtk_base_afe * afe)231*55b423d5SJiaxin Yu void mt8186_afe_disable_cgs(struct mtk_base_afe *afe)
232*55b423d5SJiaxin Yu {
233*55b423d5SJiaxin Yu 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
234*55b423d5SJiaxin Yu 	int i;
235*55b423d5SJiaxin Yu 
236*55b423d5SJiaxin Yu 	for (i = CLK_I2S1_BCLK; i <= CLK_ETDM_OUT1_BCLK; i++)
237*55b423d5SJiaxin Yu 		clk_disable_unprepare(afe_priv->clk[i]);
238*55b423d5SJiaxin Yu }
239*55b423d5SJiaxin Yu 
mt8186_afe_enable_clock(struct mtk_base_afe * afe)240*55b423d5SJiaxin Yu int mt8186_afe_enable_clock(struct mtk_base_afe *afe)
241*55b423d5SJiaxin Yu {
242*55b423d5SJiaxin Yu 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
243*55b423d5SJiaxin Yu 	int ret = 0;
244*55b423d5SJiaxin Yu 
245*55b423d5SJiaxin Yu 	ret = clk_prepare_enable(afe_priv->clk[CLK_INFRA_SYS_AUDIO]);
246*55b423d5SJiaxin Yu 	if (ret) {
247*55b423d5SJiaxin Yu 		dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
248*55b423d5SJiaxin Yu 			__func__, aud_clks[CLK_INFRA_SYS_AUDIO], ret);
249*55b423d5SJiaxin Yu 		goto clk_infra_sys_audio_err;
250*55b423d5SJiaxin Yu 	}
251*55b423d5SJiaxin Yu 
252*55b423d5SJiaxin Yu 	ret = clk_prepare_enable(afe_priv->clk[CLK_INFRA_AUDIO_26M]);
253*55b423d5SJiaxin Yu 	if (ret) {
254*55b423d5SJiaxin Yu 		dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
255*55b423d5SJiaxin Yu 			__func__, aud_clks[CLK_INFRA_AUDIO_26M], ret);
256*55b423d5SJiaxin Yu 		goto clk_infra_audio_26m_err;
257*55b423d5SJiaxin Yu 	}
258*55b423d5SJiaxin Yu 
259*55b423d5SJiaxin Yu 	ret = clk_prepare_enable(afe_priv->clk[CLK_MUX_AUDIO]);
260*55b423d5SJiaxin Yu 	if (ret) {
261*55b423d5SJiaxin Yu 		dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
262*55b423d5SJiaxin Yu 			__func__, aud_clks[CLK_MUX_AUDIO], ret);
263*55b423d5SJiaxin Yu 		goto clk_mux_audio_err;
264*55b423d5SJiaxin Yu 	}
265*55b423d5SJiaxin Yu 	ret = clk_set_parent(afe_priv->clk[CLK_MUX_AUDIO],
266*55b423d5SJiaxin Yu 			     afe_priv->clk[CLK_CLK26M]);
267*55b423d5SJiaxin Yu 	if (ret) {
268*55b423d5SJiaxin Yu 		dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
269*55b423d5SJiaxin Yu 			__func__, aud_clks[CLK_MUX_AUDIO],
270*55b423d5SJiaxin Yu 			aud_clks[CLK_CLK26M], ret);
271*55b423d5SJiaxin Yu 		goto clk_mux_audio_err;
272*55b423d5SJiaxin Yu 	}
273*55b423d5SJiaxin Yu 
274*55b423d5SJiaxin Yu 	ret = clk_prepare_enable(afe_priv->clk[CLK_MUX_AUDIOINTBUS]);
275*55b423d5SJiaxin Yu 	if (ret) {
276*55b423d5SJiaxin Yu 		dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
277*55b423d5SJiaxin Yu 			__func__, aud_clks[CLK_MUX_AUDIOINTBUS], ret);
278*55b423d5SJiaxin Yu 		goto clk_mux_audio_intbus_err;
279*55b423d5SJiaxin Yu 	}
280*55b423d5SJiaxin Yu 	ret = mt8186_set_audio_int_bus_parent(afe,
281*55b423d5SJiaxin Yu 					      CLK_TOP_MAINPLL_D2_D4);
282*55b423d5SJiaxin Yu 	if (ret)
283*55b423d5SJiaxin Yu 		goto clk_mux_audio_intbus_parent_err;
284*55b423d5SJiaxin Yu 
285*55b423d5SJiaxin Yu 	ret = clk_set_parent(afe_priv->clk[CLK_TOP_MUX_AUDIO_H],
286*55b423d5SJiaxin Yu 			     afe_priv->clk[CLK_TOP_APLL2_CK]);
287*55b423d5SJiaxin Yu 	if (ret) {
288*55b423d5SJiaxin Yu 		dev_err(afe->dev, "%s clk_set_parent %s-%s fail %d\n",
289*55b423d5SJiaxin Yu 			__func__, aud_clks[CLK_TOP_MUX_AUDIO_H],
290*55b423d5SJiaxin Yu 			aud_clks[CLK_TOP_APLL2_CK], ret);
291*55b423d5SJiaxin Yu 		goto clk_mux_audio_h_parent_err;
292*55b423d5SJiaxin Yu 	}
293*55b423d5SJiaxin Yu 
294*55b423d5SJiaxin Yu 	ret = clk_prepare_enable(afe_priv->clk[CLK_AFE]);
295*55b423d5SJiaxin Yu 	if (ret) {
296*55b423d5SJiaxin Yu 		dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
297*55b423d5SJiaxin Yu 			__func__, aud_clks[CLK_AFE], ret);
298*55b423d5SJiaxin Yu 		goto clk_afe_err;
299*55b423d5SJiaxin Yu 	}
300*55b423d5SJiaxin Yu 
301*55b423d5SJiaxin Yu 	return 0;
302*55b423d5SJiaxin Yu 
303*55b423d5SJiaxin Yu clk_afe_err:
304*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[CLK_AFE]);
305*55b423d5SJiaxin Yu clk_mux_audio_h_parent_err:
306*55b423d5SJiaxin Yu clk_mux_audio_intbus_parent_err:
307*55b423d5SJiaxin Yu 	mt8186_set_audio_int_bus_parent(afe, CLK_CLK26M);
308*55b423d5SJiaxin Yu clk_mux_audio_intbus_err:
309*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIOINTBUS]);
310*55b423d5SJiaxin Yu clk_mux_audio_err:
311*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIO]);
312*55b423d5SJiaxin Yu clk_infra_sys_audio_err:
313*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[CLK_INFRA_SYS_AUDIO]);
314*55b423d5SJiaxin Yu clk_infra_audio_26m_err:
315*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[CLK_INFRA_AUDIO_26M]);
316*55b423d5SJiaxin Yu 
317*55b423d5SJiaxin Yu 	return ret;
318*55b423d5SJiaxin Yu }
319*55b423d5SJiaxin Yu 
mt8186_afe_disable_clock(struct mtk_base_afe * afe)320*55b423d5SJiaxin Yu void mt8186_afe_disable_clock(struct mtk_base_afe *afe)
321*55b423d5SJiaxin Yu {
322*55b423d5SJiaxin Yu 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
323*55b423d5SJiaxin Yu 
324*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[CLK_AFE]);
325*55b423d5SJiaxin Yu 	mt8186_set_audio_int_bus_parent(afe, CLK_CLK26M);
326*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIOINTBUS]);
327*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIO]);
328*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[CLK_INFRA_AUDIO_26M]);
329*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[CLK_INFRA_SYS_AUDIO]);
330*55b423d5SJiaxin Yu }
331*55b423d5SJiaxin Yu 
mt8186_afe_suspend_clock(struct mtk_base_afe * afe)332*55b423d5SJiaxin Yu int mt8186_afe_suspend_clock(struct mtk_base_afe *afe)
333*55b423d5SJiaxin Yu {
334*55b423d5SJiaxin Yu 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
335*55b423d5SJiaxin Yu 	int ret;
336*55b423d5SJiaxin Yu 
337*55b423d5SJiaxin Yu 	/* set audio int bus to 26M */
338*55b423d5SJiaxin Yu 	ret = clk_prepare_enable(afe_priv->clk[CLK_MUX_AUDIOINTBUS]);
339*55b423d5SJiaxin Yu 	if (ret) {
340*55b423d5SJiaxin Yu 		dev_info(afe->dev, "%s clk_prepare_enable %s fail %d\n",
341*55b423d5SJiaxin Yu 			 __func__, aud_clks[CLK_MUX_AUDIOINTBUS], ret);
342*55b423d5SJiaxin Yu 		goto clk_mux_audio_intbus_err;
343*55b423d5SJiaxin Yu 	}
344*55b423d5SJiaxin Yu 	ret = mt8186_set_audio_int_bus_parent(afe, CLK_CLK26M);
345*55b423d5SJiaxin Yu 	if (ret)
346*55b423d5SJiaxin Yu 		goto clk_mux_audio_intbus_parent_err;
347*55b423d5SJiaxin Yu 
348*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIOINTBUS]);
349*55b423d5SJiaxin Yu 
350*55b423d5SJiaxin Yu 	return 0;
351*55b423d5SJiaxin Yu 
352*55b423d5SJiaxin Yu clk_mux_audio_intbus_parent_err:
353*55b423d5SJiaxin Yu 	mt8186_set_audio_int_bus_parent(afe, CLK_TOP_MAINPLL_D2_D4);
354*55b423d5SJiaxin Yu clk_mux_audio_intbus_err:
355*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIOINTBUS]);
356*55b423d5SJiaxin Yu 	return ret;
357*55b423d5SJiaxin Yu }
358*55b423d5SJiaxin Yu 
mt8186_afe_resume_clock(struct mtk_base_afe * afe)359*55b423d5SJiaxin Yu int mt8186_afe_resume_clock(struct mtk_base_afe *afe)
360*55b423d5SJiaxin Yu {
361*55b423d5SJiaxin Yu 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
362*55b423d5SJiaxin Yu 	int ret;
363*55b423d5SJiaxin Yu 
364*55b423d5SJiaxin Yu 	/* set audio int bus to normal working clock */
365*55b423d5SJiaxin Yu 	ret = clk_prepare_enable(afe_priv->clk[CLK_MUX_AUDIOINTBUS]);
366*55b423d5SJiaxin Yu 	if (ret) {
367*55b423d5SJiaxin Yu 		dev_info(afe->dev, "%s clk_prepare_enable %s fail %d\n",
368*55b423d5SJiaxin Yu 			 __func__, aud_clks[CLK_MUX_AUDIOINTBUS], ret);
369*55b423d5SJiaxin Yu 		goto clk_mux_audio_intbus_err;
370*55b423d5SJiaxin Yu 	}
371*55b423d5SJiaxin Yu 	ret = mt8186_set_audio_int_bus_parent(afe,
372*55b423d5SJiaxin Yu 					      CLK_TOP_MAINPLL_D2_D4);
373*55b423d5SJiaxin Yu 	if (ret)
374*55b423d5SJiaxin Yu 		goto clk_mux_audio_intbus_parent_err;
375*55b423d5SJiaxin Yu 
376*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIOINTBUS]);
377*55b423d5SJiaxin Yu 
378*55b423d5SJiaxin Yu 	return 0;
379*55b423d5SJiaxin Yu 
380*55b423d5SJiaxin Yu clk_mux_audio_intbus_parent_err:
381*55b423d5SJiaxin Yu 	mt8186_set_audio_int_bus_parent(afe, CLK_CLK26M);
382*55b423d5SJiaxin Yu clk_mux_audio_intbus_err:
383*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[CLK_MUX_AUDIOINTBUS]);
384*55b423d5SJiaxin Yu 	return ret;
385*55b423d5SJiaxin Yu }
386*55b423d5SJiaxin Yu 
mt8186_apll1_enable(struct mtk_base_afe * afe)387*55b423d5SJiaxin Yu int mt8186_apll1_enable(struct mtk_base_afe *afe)
388*55b423d5SJiaxin Yu {
389*55b423d5SJiaxin Yu 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
390*55b423d5SJiaxin Yu 	int ret;
391*55b423d5SJiaxin Yu 
392*55b423d5SJiaxin Yu 	/* setting for APLL */
393*55b423d5SJiaxin Yu 	apll1_mux_setting(afe, true);
394*55b423d5SJiaxin Yu 
395*55b423d5SJiaxin Yu 	ret = clk_prepare_enable(afe_priv->clk[CLK_APLL22M]);
396*55b423d5SJiaxin Yu 	if (ret) {
397*55b423d5SJiaxin Yu 		dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
398*55b423d5SJiaxin Yu 			__func__, aud_clks[CLK_APLL22M], ret);
399*55b423d5SJiaxin Yu 		goto err_clk_apll22m;
400*55b423d5SJiaxin Yu 	}
401*55b423d5SJiaxin Yu 
402*55b423d5SJiaxin Yu 	ret = clk_prepare_enable(afe_priv->clk[CLK_APLL1_TUNER]);
403*55b423d5SJiaxin Yu 	if (ret) {
404*55b423d5SJiaxin Yu 		dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
405*55b423d5SJiaxin Yu 			__func__, aud_clks[CLK_APLL1_TUNER], ret);
406*55b423d5SJiaxin Yu 		goto err_clk_apll1_tuner;
407*55b423d5SJiaxin Yu 	}
408*55b423d5SJiaxin Yu 
409*55b423d5SJiaxin Yu 	regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG, 0xfff7, 0x832);
410*55b423d5SJiaxin Yu 	regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG, 0x1, 0x1);
411*55b423d5SJiaxin Yu 
412*55b423d5SJiaxin Yu 	regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,
413*55b423d5SJiaxin Yu 			   AFE_22M_ON_MASK_SFT, BIT(AFE_22M_ON_SFT));
414*55b423d5SJiaxin Yu 
415*55b423d5SJiaxin Yu 	return 0;
416*55b423d5SJiaxin Yu 
417*55b423d5SJiaxin Yu err_clk_apll1_tuner:
418*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[CLK_APLL1_TUNER]);
419*55b423d5SJiaxin Yu err_clk_apll22m:
420*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[CLK_APLL22M]);
421*55b423d5SJiaxin Yu 
422*55b423d5SJiaxin Yu 	return ret;
423*55b423d5SJiaxin Yu }
424*55b423d5SJiaxin Yu 
mt8186_apll1_disable(struct mtk_base_afe * afe)425*55b423d5SJiaxin Yu void mt8186_apll1_disable(struct mtk_base_afe *afe)
426*55b423d5SJiaxin Yu {
427*55b423d5SJiaxin Yu 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
428*55b423d5SJiaxin Yu 
429*55b423d5SJiaxin Yu 	regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,
430*55b423d5SJiaxin Yu 			   AFE_22M_ON_MASK_SFT, 0);
431*55b423d5SJiaxin Yu 
432*55b423d5SJiaxin Yu 	regmap_update_bits(afe->regmap, AFE_APLL1_TUNER_CFG, 0x1, 0);
433*55b423d5SJiaxin Yu 
434*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[CLK_APLL1_TUNER]);
435*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[CLK_APLL22M]);
436*55b423d5SJiaxin Yu 
437*55b423d5SJiaxin Yu 	apll1_mux_setting(afe, false);
438*55b423d5SJiaxin Yu }
439*55b423d5SJiaxin Yu 
mt8186_apll2_enable(struct mtk_base_afe * afe)440*55b423d5SJiaxin Yu int mt8186_apll2_enable(struct mtk_base_afe *afe)
441*55b423d5SJiaxin Yu {
442*55b423d5SJiaxin Yu 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
443*55b423d5SJiaxin Yu 	int ret;
444*55b423d5SJiaxin Yu 
445*55b423d5SJiaxin Yu 	/* setting for APLL */
446*55b423d5SJiaxin Yu 	apll2_mux_setting(afe, true);
447*55b423d5SJiaxin Yu 
448*55b423d5SJiaxin Yu 	ret = clk_prepare_enable(afe_priv->clk[CLK_APLL24M]);
449*55b423d5SJiaxin Yu 	if (ret) {
450*55b423d5SJiaxin Yu 		dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
451*55b423d5SJiaxin Yu 			__func__, aud_clks[CLK_APLL24M], ret);
452*55b423d5SJiaxin Yu 		goto err_clk_apll24m;
453*55b423d5SJiaxin Yu 	}
454*55b423d5SJiaxin Yu 
455*55b423d5SJiaxin Yu 	ret = clk_prepare_enable(afe_priv->clk[CLK_APLL2_TUNER]);
456*55b423d5SJiaxin Yu 	if (ret) {
457*55b423d5SJiaxin Yu 		dev_err(afe->dev, "%s clk_prepare_enable %s fail %d\n",
458*55b423d5SJiaxin Yu 			__func__, aud_clks[CLK_APLL2_TUNER], ret);
459*55b423d5SJiaxin Yu 		goto err_clk_apll2_tuner;
460*55b423d5SJiaxin Yu 	}
461*55b423d5SJiaxin Yu 
462*55b423d5SJiaxin Yu 	regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG, 0xfff7, 0x634);
463*55b423d5SJiaxin Yu 	regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG, 0x1, 0x1);
464*55b423d5SJiaxin Yu 
465*55b423d5SJiaxin Yu 	regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,
466*55b423d5SJiaxin Yu 			   AFE_24M_ON_MASK_SFT, BIT(AFE_24M_ON_SFT));
467*55b423d5SJiaxin Yu 
468*55b423d5SJiaxin Yu 	return 0;
469*55b423d5SJiaxin Yu 
470*55b423d5SJiaxin Yu err_clk_apll2_tuner:
471*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[CLK_APLL2_TUNER]);
472*55b423d5SJiaxin Yu err_clk_apll24m:
473*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[CLK_APLL24M]);
474*55b423d5SJiaxin Yu 
475*55b423d5SJiaxin Yu 	return ret;
476*55b423d5SJiaxin Yu }
477*55b423d5SJiaxin Yu 
mt8186_apll2_disable(struct mtk_base_afe * afe)478*55b423d5SJiaxin Yu void mt8186_apll2_disable(struct mtk_base_afe *afe)
479*55b423d5SJiaxin Yu {
480*55b423d5SJiaxin Yu 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
481*55b423d5SJiaxin Yu 
482*55b423d5SJiaxin Yu 	regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,
483*55b423d5SJiaxin Yu 			   AFE_24M_ON_MASK_SFT, 0);
484*55b423d5SJiaxin Yu 
485*55b423d5SJiaxin Yu 	regmap_update_bits(afe->regmap, AFE_APLL2_TUNER_CFG, 0x1, 0);
486*55b423d5SJiaxin Yu 
487*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[CLK_APLL2_TUNER]);
488*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[CLK_APLL24M]);
489*55b423d5SJiaxin Yu 
490*55b423d5SJiaxin Yu 	apll2_mux_setting(afe, false);
491*55b423d5SJiaxin Yu }
492*55b423d5SJiaxin Yu 
mt8186_get_apll_rate(struct mtk_base_afe * afe,int apll)493*55b423d5SJiaxin Yu int mt8186_get_apll_rate(struct mtk_base_afe *afe, int apll)
494*55b423d5SJiaxin Yu {
495*55b423d5SJiaxin Yu 	return (apll == MT8186_APLL1) ? 180633600 : 196608000;
496*55b423d5SJiaxin Yu }
497*55b423d5SJiaxin Yu 
mt8186_get_apll_by_rate(struct mtk_base_afe * afe,int rate)498*55b423d5SJiaxin Yu int mt8186_get_apll_by_rate(struct mtk_base_afe *afe, int rate)
499*55b423d5SJiaxin Yu {
500*55b423d5SJiaxin Yu 	return ((rate % 8000) == 0) ? MT8186_APLL2 : MT8186_APLL1;
501*55b423d5SJiaxin Yu }
502*55b423d5SJiaxin Yu 
mt8186_get_apll_by_name(struct mtk_base_afe * afe,const char * name)503*55b423d5SJiaxin Yu int mt8186_get_apll_by_name(struct mtk_base_afe *afe, const char *name)
504*55b423d5SJiaxin Yu {
505*55b423d5SJiaxin Yu 	if (strcmp(name, APLL1_W_NAME) == 0)
506*55b423d5SJiaxin Yu 		return MT8186_APLL1;
507*55b423d5SJiaxin Yu 
508*55b423d5SJiaxin Yu 	return MT8186_APLL2;
509*55b423d5SJiaxin Yu }
510*55b423d5SJiaxin Yu 
511*55b423d5SJiaxin Yu /* mck */
512*55b423d5SJiaxin Yu struct mt8186_mck_div {
513*55b423d5SJiaxin Yu 	u32 m_sel_id;
514*55b423d5SJiaxin Yu 	u32 div_clk_id;
515*55b423d5SJiaxin Yu };
516*55b423d5SJiaxin Yu 
517*55b423d5SJiaxin Yu static const struct mt8186_mck_div mck_div[MT8186_MCK_NUM] = {
518*55b423d5SJiaxin Yu 	[MT8186_I2S0_MCK] = {
519*55b423d5SJiaxin Yu 		.m_sel_id = CLK_TOP_I2S0_M_SEL,
520*55b423d5SJiaxin Yu 		.div_clk_id = CLK_TOP_APLL12_DIV0,
521*55b423d5SJiaxin Yu 	},
522*55b423d5SJiaxin Yu 	[MT8186_I2S1_MCK] = {
523*55b423d5SJiaxin Yu 		.m_sel_id = CLK_TOP_I2S1_M_SEL,
524*55b423d5SJiaxin Yu 		.div_clk_id = CLK_TOP_APLL12_DIV1,
525*55b423d5SJiaxin Yu 	},
526*55b423d5SJiaxin Yu 	[MT8186_I2S2_MCK] = {
527*55b423d5SJiaxin Yu 		.m_sel_id = CLK_TOP_I2S2_M_SEL,
528*55b423d5SJiaxin Yu 		.div_clk_id = CLK_TOP_APLL12_DIV2,
529*55b423d5SJiaxin Yu 	},
530*55b423d5SJiaxin Yu 	[MT8186_I2S4_MCK] = {
531*55b423d5SJiaxin Yu 		.m_sel_id = CLK_TOP_I2S4_M_SEL,
532*55b423d5SJiaxin Yu 		.div_clk_id = CLK_TOP_APLL12_DIV4,
533*55b423d5SJiaxin Yu 	},
534*55b423d5SJiaxin Yu 	[MT8186_TDM_MCK] = {
535*55b423d5SJiaxin Yu 		.m_sel_id = CLK_TOP_TDM_M_SEL,
536*55b423d5SJiaxin Yu 		.div_clk_id = CLK_TOP_APLL12_DIV_TDM,
537*55b423d5SJiaxin Yu 	},
538*55b423d5SJiaxin Yu };
539*55b423d5SJiaxin Yu 
mt8186_mck_enable(struct mtk_base_afe * afe,int mck_id,int rate)540*55b423d5SJiaxin Yu int mt8186_mck_enable(struct mtk_base_afe *afe, int mck_id, int rate)
541*55b423d5SJiaxin Yu {
542*55b423d5SJiaxin Yu 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
543*55b423d5SJiaxin Yu 	int apll = mt8186_get_apll_by_rate(afe, rate);
544*55b423d5SJiaxin Yu 	int apll_clk_id = apll == MT8186_APLL1 ?
545*55b423d5SJiaxin Yu 			  CLK_TOP_MUX_AUD_1 : CLK_TOP_MUX_AUD_2;
546*55b423d5SJiaxin Yu 	int m_sel_id = mck_div[mck_id].m_sel_id;
547*55b423d5SJiaxin Yu 	int div_clk_id = mck_div[mck_id].div_clk_id;
548*55b423d5SJiaxin Yu 	int ret;
549*55b423d5SJiaxin Yu 
550*55b423d5SJiaxin Yu 	/* select apll */
551*55b423d5SJiaxin Yu 	if (m_sel_id >= 0) {
552*55b423d5SJiaxin Yu 		ret = clk_prepare_enable(afe_priv->clk[m_sel_id]);
553*55b423d5SJiaxin Yu 		if (ret) {
554*55b423d5SJiaxin Yu 			dev_err(afe->dev, "%s(), clk_prepare_enable %s fail %d\n",
555*55b423d5SJiaxin Yu 				__func__, aud_clks[m_sel_id], ret);
556*55b423d5SJiaxin Yu 			return ret;
557*55b423d5SJiaxin Yu 		}
558*55b423d5SJiaxin Yu 		ret = clk_set_parent(afe_priv->clk[m_sel_id],
559*55b423d5SJiaxin Yu 				     afe_priv->clk[apll_clk_id]);
560*55b423d5SJiaxin Yu 		if (ret) {
561*55b423d5SJiaxin Yu 			dev_err(afe->dev, "%s(), clk_set_parent %s-%s fail %d\n",
562*55b423d5SJiaxin Yu 				__func__, aud_clks[m_sel_id],
563*55b423d5SJiaxin Yu 				aud_clks[apll_clk_id], ret);
564*55b423d5SJiaxin Yu 			return ret;
565*55b423d5SJiaxin Yu 		}
566*55b423d5SJiaxin Yu 	}
567*55b423d5SJiaxin Yu 
568*55b423d5SJiaxin Yu 	/* enable div, set rate */
569*55b423d5SJiaxin Yu 	ret = clk_prepare_enable(afe_priv->clk[div_clk_id]);
570*55b423d5SJiaxin Yu 	if (ret) {
571*55b423d5SJiaxin Yu 		dev_err(afe->dev, "%s(), clk_prepare_enable %s fail %d\n",
572*55b423d5SJiaxin Yu 			__func__, aud_clks[div_clk_id], ret);
573*55b423d5SJiaxin Yu 		return ret;
574*55b423d5SJiaxin Yu 	}
575*55b423d5SJiaxin Yu 	ret = clk_set_rate(afe_priv->clk[div_clk_id], rate);
576*55b423d5SJiaxin Yu 	if (ret) {
577*55b423d5SJiaxin Yu 		dev_err(afe->dev, "%s(), clk_set_rate %s, rate %d, fail %d\n",
578*55b423d5SJiaxin Yu 			__func__, aud_clks[div_clk_id], rate, ret);
579*55b423d5SJiaxin Yu 		return ret;
580*55b423d5SJiaxin Yu 	}
581*55b423d5SJiaxin Yu 
582*55b423d5SJiaxin Yu 	return 0;
583*55b423d5SJiaxin Yu }
584*55b423d5SJiaxin Yu 
mt8186_mck_disable(struct mtk_base_afe * afe,int mck_id)585*55b423d5SJiaxin Yu void mt8186_mck_disable(struct mtk_base_afe *afe, int mck_id)
586*55b423d5SJiaxin Yu {
587*55b423d5SJiaxin Yu 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
588*55b423d5SJiaxin Yu 	int m_sel_id = mck_div[mck_id].m_sel_id;
589*55b423d5SJiaxin Yu 	int div_clk_id = mck_div[mck_id].div_clk_id;
590*55b423d5SJiaxin Yu 
591*55b423d5SJiaxin Yu 	clk_disable_unprepare(afe_priv->clk[div_clk_id]);
592*55b423d5SJiaxin Yu 	if (m_sel_id >= 0)
593*55b423d5SJiaxin Yu 		clk_disable_unprepare(afe_priv->clk[m_sel_id]);
594*55b423d5SJiaxin Yu }
595*55b423d5SJiaxin Yu 
mt8186_init_clock(struct mtk_base_afe * afe)596*55b423d5SJiaxin Yu int mt8186_init_clock(struct mtk_base_afe *afe)
597*55b423d5SJiaxin Yu {
598*55b423d5SJiaxin Yu 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
599*55b423d5SJiaxin Yu 	struct device_node *of_node = afe->dev->of_node;
600*55b423d5SJiaxin Yu 	int i = 0;
601*55b423d5SJiaxin Yu 
602*55b423d5SJiaxin Yu 	mt8186_audsys_clk_register(afe);
603*55b423d5SJiaxin Yu 
604*55b423d5SJiaxin Yu 	afe_priv->clk = devm_kcalloc(afe->dev, CLK_NUM, sizeof(*afe_priv->clk),
605*55b423d5SJiaxin Yu 				     GFP_KERNEL);
606*55b423d5SJiaxin Yu 	if (!afe_priv->clk)
607*55b423d5SJiaxin Yu 		return -ENOMEM;
608*55b423d5SJiaxin Yu 
609*55b423d5SJiaxin Yu 	for (i = 0; i < CLK_NUM; i++) {
610*55b423d5SJiaxin Yu 		afe_priv->clk[i] = devm_clk_get(afe->dev, aud_clks[i]);
611*55b423d5SJiaxin Yu 		if (IS_ERR(afe_priv->clk[i])) {
612*55b423d5SJiaxin Yu 			dev_err(afe->dev, "%s devm_clk_get %s fail, ret %ld\n",
613*55b423d5SJiaxin Yu 				__func__,
614*55b423d5SJiaxin Yu 				aud_clks[i], PTR_ERR(afe_priv->clk[i]));
615*55b423d5SJiaxin Yu 			afe_priv->clk[i] = NULL;
616*55b423d5SJiaxin Yu 		}
617*55b423d5SJiaxin Yu 	}
618*55b423d5SJiaxin Yu 
619*55b423d5SJiaxin Yu 	afe_priv->apmixedsys = syscon_regmap_lookup_by_phandle(of_node,
620*55b423d5SJiaxin Yu 							       "mediatek,apmixedsys");
621*55b423d5SJiaxin Yu 	if (IS_ERR(afe_priv->apmixedsys)) {
622*55b423d5SJiaxin Yu 		dev_err(afe->dev, "%s() Cannot find apmixedsys controller: %ld\n",
623*55b423d5SJiaxin Yu 			__func__, PTR_ERR(afe_priv->apmixedsys));
624*55b423d5SJiaxin Yu 		return PTR_ERR(afe_priv->apmixedsys);
625*55b423d5SJiaxin Yu 	}
626*55b423d5SJiaxin Yu 
627*55b423d5SJiaxin Yu 	afe_priv->topckgen = syscon_regmap_lookup_by_phandle(of_node,
628*55b423d5SJiaxin Yu 							     "mediatek,topckgen");
629*55b423d5SJiaxin Yu 	if (IS_ERR(afe_priv->topckgen)) {
630*55b423d5SJiaxin Yu 		dev_err(afe->dev, "%s() Cannot find topckgen controller: %ld\n",
631*55b423d5SJiaxin Yu 			__func__, PTR_ERR(afe_priv->topckgen));
632*55b423d5SJiaxin Yu 		return PTR_ERR(afe_priv->topckgen);
633*55b423d5SJiaxin Yu 	}
634*55b423d5SJiaxin Yu 
635*55b423d5SJiaxin Yu 	afe_priv->infracfg = syscon_regmap_lookup_by_phandle(of_node,
636*55b423d5SJiaxin Yu 							     "mediatek,infracfg");
637*55b423d5SJiaxin Yu 	if (IS_ERR(afe_priv->infracfg)) {
638*55b423d5SJiaxin Yu 		dev_err(afe->dev, "%s() Cannot find infracfg: %ld\n",
639*55b423d5SJiaxin Yu 			__func__, PTR_ERR(afe_priv->infracfg));
640*55b423d5SJiaxin Yu 		return PTR_ERR(afe_priv->infracfg);
641*55b423d5SJiaxin Yu 	}
642*55b423d5SJiaxin Yu 
643*55b423d5SJiaxin Yu 	return 0;
644*55b423d5SJiaxin Yu }
645