xref: /openbmc/linux/sound/soc/mediatek/mt8186/mt8186-dai-tdm.c (revision 2bebc3b622c3c300eb3a3f603473429d8264c3b6)
1 // SPDX-License-Identifier: GPL-2.0
2 //
3 // MediaTek ALSA SoC Audio DAI TDM Control
4 //
5 // Copyright (c) 2022 MediaTek Inc.
6 // Author: Jiaxin Yu <jiaxin.yu@mediatek.com>
7 
8 #include <linux/regmap.h>
9 #include <sound/pcm_params.h>
10 
11 #include "mt8186-afe-clk.h"
12 #include "mt8186-afe-common.h"
13 #include "mt8186-afe-gpio.h"
14 #include "mt8186-interconnection.h"
15 
16 #define TDM_HD_EN_W_NAME "TDM_HD_EN"
17 #define TDM_MCLK_EN_W_NAME "TDM_MCLK_EN"
18 #define MTK_AFE_TDM_KCONTROL_NAME "TDM_HD_Mux"
19 
20 struct mtk_afe_tdm_priv {
21 	unsigned int id;
22 	unsigned int rate; /* for determine which apll to use */
23 	unsigned int bck_invert;
24 	unsigned int lck_invert;
25 	unsigned int lrck_width;
26 	unsigned int mclk_id;
27 	unsigned int mclk_multiple; /* according to sample rate */
28 	unsigned int mclk_rate;
29 	unsigned int mclk_apll;
30 	unsigned int tdm_mode;
31 	unsigned int data_mode;
32 	unsigned int slave_mode;
33 	unsigned int low_jitter_en;
34 };
35 
36 enum {
37 	TDM_IN_I2S = 0,
38 	TDM_IN_LJ = 1,
39 	TDM_IN_RJ = 2,
40 	TDM_IN_DSP_A = 4,
41 	TDM_IN_DSP_B = 5,
42 };
43 
44 enum {
45 	TDM_DATA_ONE_PIN = 0,
46 	TDM_DATA_MULTI_PIN,
47 };
48 
49 enum {
50 	TDM_BCK_NON_INV = 0,
51 	TDM_BCK_INV = 1,
52 };
53 
54 enum {
55 	TDM_LCK_NON_INV = 0,
56 	TDM_LCK_INV = 1,
57 };
58 
59 static unsigned int get_tdm_lrck_width(snd_pcm_format_t format,
60 				       unsigned int mode)
61 {
62 	if (mode == TDM_IN_DSP_A || mode == TDM_IN_DSP_B)
63 		return 0;
64 
65 	return snd_pcm_format_physical_width(format) - 1;
66 }
67 
68 static unsigned int get_tdm_ch_fixup(unsigned int channels)
69 {
70 	if (channels > 4)
71 		return 8;
72 	else if (channels > 2)
73 		return 4;
74 
75 	return 2;
76 }
77 
78 static unsigned int get_tdm_ch_per_sdata(unsigned int mode,
79 					 unsigned int channels)
80 {
81 	if (mode == TDM_IN_DSP_A || mode == TDM_IN_DSP_B)
82 		return get_tdm_ch_fixup(channels);
83 
84 	return 2;
85 }
86 
87 enum {
88 	SUPPLY_SEQ_APLL,
89 	SUPPLY_SEQ_TDM_MCK_EN,
90 	SUPPLY_SEQ_TDM_HD_EN,
91 	SUPPLY_SEQ_TDM_EN,
92 };
93 
94 static int get_tdm_id_by_name(const char *name)
95 {
96 	return MT8186_DAI_TDM_IN;
97 }
98 
99 static int mtk_tdm_en_event(struct snd_soc_dapm_widget *w,
100 			    struct snd_kcontrol *kcontrol,
101 			    int event)
102 {
103 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
104 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
105 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
106 	int dai_id = get_tdm_id_by_name(w->name);
107 	struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id];
108 
109 	if (!tdm_priv) {
110 		dev_err(afe->dev, "%s(), tdm_priv == NULL", __func__);
111 		return -EINVAL;
112 	}
113 
114 	dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",
115 		__func__, w->name, event);
116 
117 	switch (event) {
118 	case SND_SOC_DAPM_PRE_PMU:
119 		mt8186_afe_gpio_request(afe->dev, true, tdm_priv->id, 0);
120 		break;
121 	case SND_SOC_DAPM_POST_PMD:
122 		mt8186_afe_gpio_request(afe->dev, false, tdm_priv->id, 0);
123 		break;
124 	default:
125 		break;
126 	}
127 
128 	return 0;
129 }
130 
131 static int mtk_tdm_mck_en_event(struct snd_soc_dapm_widget *w,
132 				struct snd_kcontrol *kcontrol,
133 				int event)
134 {
135 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
136 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
137 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
138 	int dai_id = get_tdm_id_by_name(w->name);
139 	struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id];
140 
141 	if (!tdm_priv) {
142 		dev_err(afe->dev, "%s(), tdm_priv == NULL", __func__);
143 		return -EINVAL;
144 	}
145 
146 	dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x, dai_id %d\n",
147 		__func__, w->name, event, dai_id);
148 
149 	switch (event) {
150 	case SND_SOC_DAPM_PRE_PMU:
151 		mt8186_mck_enable(afe, tdm_priv->mclk_id, tdm_priv->mclk_rate);
152 		break;
153 	case SND_SOC_DAPM_POST_PMD:
154 		tdm_priv->mclk_rate = 0;
155 		mt8186_mck_disable(afe, tdm_priv->mclk_id);
156 		break;
157 	default:
158 		break;
159 	}
160 
161 	return 0;
162 }
163 
164 /* dai component */
165 /* tdm virtual mux to output widget */
166 static const char * const tdm_mux_map[] = {
167 	"Normal", "Dummy_Widget",
168 };
169 
170 static int tdm_mux_map_value[] = {
171 	0, 1,
172 };
173 
174 static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(tdm_mux_map_enum,
175 					      SND_SOC_NOPM,
176 					      0,
177 					      1,
178 					      tdm_mux_map,
179 					      tdm_mux_map_value);
180 
181 static const struct snd_kcontrol_new tdm_in_mux_control =
182 	SOC_DAPM_ENUM("TDM In Select", tdm_mux_map_enum);
183 
184 static const struct snd_soc_dapm_widget mtk_dai_tdm_widgets[] = {
185 	SND_SOC_DAPM_CLOCK_SUPPLY("aud_tdm_clk"),
186 
187 	SND_SOC_DAPM_SUPPLY_S("TDM_EN", SUPPLY_SEQ_TDM_EN,
188 			      ETDM_IN1_CON0, ETDM_IN1_CON0_REG_ETDM_IN_EN_SFT,
189 			      0, mtk_tdm_en_event,
190 			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
191 	/* tdm hd en */
192 	SND_SOC_DAPM_SUPPLY_S(TDM_HD_EN_W_NAME, SUPPLY_SEQ_TDM_HD_EN,
193 			      ETDM_IN1_CON2, ETDM_IN1_CON2_REG_CLOCK_SOURCE_SEL_SFT,
194 			      0, NULL,
195 			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
196 
197 	SND_SOC_DAPM_SUPPLY_S(TDM_MCLK_EN_W_NAME, SUPPLY_SEQ_TDM_MCK_EN,
198 			      SND_SOC_NOPM, 0, 0,
199 			      mtk_tdm_mck_en_event,
200 			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
201 
202 	SND_SOC_DAPM_INPUT("TDM_DUMMY_IN"),
203 
204 	SND_SOC_DAPM_MUX("TDM_In_Mux",
205 			 SND_SOC_NOPM, 0, 0, &tdm_in_mux_control),
206 };
207 
208 static int mtk_afe_tdm_mclk_connect(struct snd_soc_dapm_widget *source,
209 				    struct snd_soc_dapm_widget *sink)
210 {
211 	struct snd_soc_dapm_widget *w = sink;
212 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
213 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
214 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
215 	int dai_id = get_tdm_id_by_name(w->name);
216 	struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id];
217 
218 	if (!tdm_priv) {
219 		dev_err(afe->dev, "%s(), tdm_priv == NULL", __func__);
220 		return 0;
221 	}
222 
223 	return (tdm_priv->mclk_rate > 0) ? 1 : 0;
224 }
225 
226 static int mtk_afe_tdm_mclk_apll_connect(struct snd_soc_dapm_widget *source,
227 					 struct snd_soc_dapm_widget *sink)
228 {
229 	struct snd_soc_dapm_widget *w = sink;
230 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
231 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
232 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
233 	int dai_id = get_tdm_id_by_name(w->name);
234 	struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id];
235 	int cur_apll;
236 
237 	/* which apll */
238 	cur_apll = mt8186_get_apll_by_name(afe, source->name);
239 
240 	return (tdm_priv->mclk_apll == cur_apll) ? 1 : 0;
241 }
242 
243 static int mtk_afe_tdm_hd_connect(struct snd_soc_dapm_widget *source,
244 				  struct snd_soc_dapm_widget *sink)
245 {
246 	struct snd_soc_dapm_widget *w = sink;
247 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
248 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
249 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
250 	int dai_id = get_tdm_id_by_name(w->name);
251 	struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id];
252 
253 	if (!tdm_priv) {
254 		dev_err(afe->dev, "%s(), tdm_priv == NULL", __func__);
255 		return 0;
256 	}
257 
258 	return tdm_priv->low_jitter_en;
259 }
260 
261 static int mtk_afe_tdm_apll_connect(struct snd_soc_dapm_widget *source,
262 				    struct snd_soc_dapm_widget *sink)
263 {
264 	struct snd_soc_dapm_widget *w = sink;
265 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
266 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
267 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
268 	int dai_id = get_tdm_id_by_name(w->name);
269 	struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id];
270 	int cur_apll;
271 	int tdm_need_apll;
272 
273 	if (!tdm_priv) {
274 		dev_err(afe->dev, "%s(), tdm_priv == NULL", __func__);
275 		return 0;
276 	}
277 
278 	/* which apll */
279 	cur_apll = mt8186_get_apll_by_name(afe, source->name);
280 
281 	/* choose APLL from tdm rate */
282 	tdm_need_apll = mt8186_get_apll_by_rate(afe, tdm_priv->rate);
283 
284 	return (tdm_need_apll == cur_apll) ? 1 : 0;
285 }
286 
287 /* low jitter control */
288 static const char * const mt8186_tdm_hd_str[] = {
289 	"Normal", "Low_Jitter"
290 };
291 
292 static const struct soc_enum mt8186_tdm_enum[] = {
293 	SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(mt8186_tdm_hd_str),
294 			    mt8186_tdm_hd_str),
295 };
296 
297 static int mt8186_tdm_hd_get(struct snd_kcontrol *kcontrol,
298 			     struct snd_ctl_elem_value *ucontrol)
299 {
300 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
301 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
302 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
303 	int dai_id = get_tdm_id_by_name(kcontrol->id.name);
304 	struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id];
305 
306 	if (!tdm_priv) {
307 		dev_err(afe->dev, "%s(), tdm_priv == NULL", __func__);
308 		return -EINVAL;
309 	}
310 
311 	ucontrol->value.integer.value[0] = tdm_priv->low_jitter_en;
312 
313 	return 0;
314 }
315 
316 static int mt8186_tdm_hd_set(struct snd_kcontrol *kcontrol,
317 			     struct snd_ctl_elem_value *ucontrol)
318 {
319 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
320 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
321 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
322 	int dai_id = get_tdm_id_by_name(kcontrol->id.name);
323 	struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai_id];
324 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
325 	int hd_en;
326 
327 	if (ucontrol->value.enumerated.item[0] >= e->items)
328 		return -EINVAL;
329 
330 	hd_en = ucontrol->value.integer.value[0];
331 
332 	dev_dbg(afe->dev, "%s(), kcontrol name %s, hd_en %d\n",
333 		__func__, kcontrol->id.name, hd_en);
334 
335 	if (!tdm_priv) {
336 		dev_err(afe->dev, "%s(), tdm_priv == NULL", __func__);
337 		return -EINVAL;
338 	}
339 
340 	if (tdm_priv->low_jitter_en == hd_en)
341 		return 0;
342 
343 	tdm_priv->low_jitter_en = hd_en;
344 
345 	return 1;
346 }
347 
348 static const struct snd_kcontrol_new mtk_dai_tdm_controls[] = {
349 	SOC_ENUM_EXT(MTK_AFE_TDM_KCONTROL_NAME, mt8186_tdm_enum[0],
350 		     mt8186_tdm_hd_get, mt8186_tdm_hd_set),
351 };
352 
353 static const struct snd_soc_dapm_route mtk_dai_tdm_routes[] = {
354 	{"TDM IN", NULL, "aud_tdm_clk"},
355 	{"TDM IN", NULL, "TDM_EN"},
356 	{"TDM IN", NULL, TDM_HD_EN_W_NAME, mtk_afe_tdm_hd_connect},
357 	{TDM_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_tdm_apll_connect},
358 	{TDM_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_tdm_apll_connect},
359 
360 	{"TDM IN", NULL, TDM_MCLK_EN_W_NAME, mtk_afe_tdm_mclk_connect},
361 	{TDM_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_tdm_mclk_apll_connect},
362 	{TDM_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_tdm_mclk_apll_connect},
363 
364 	/* allow tdm on without codec on */
365 	{"TDM IN", NULL, "TDM_In_Mux"},
366 	{"TDM_In_Mux", "Dummy_Widget", "TDM_DUMMY_IN"},
367 };
368 
369 /* dai ops */
370 static int mtk_dai_tdm_cal_mclk(struct mtk_base_afe *afe,
371 				struct mtk_afe_tdm_priv *tdm_priv,
372 				int freq)
373 {
374 	int apll;
375 	int apll_rate;
376 
377 	apll = mt8186_get_apll_by_rate(afe, freq);
378 	apll_rate = mt8186_get_apll_rate(afe, apll);
379 
380 	if (!freq || freq > apll_rate) {
381 		dev_err(afe->dev,
382 			"%s(), freq(%d Hz) invalid\n", __func__, freq);
383 		return -EINVAL;
384 	}
385 
386 	if (apll_rate % freq != 0) {
387 		dev_err(afe->dev,
388 			"%s(), APLL cannot generate %d Hz", __func__, freq);
389 		return -EINVAL;
390 	}
391 
392 	tdm_priv->mclk_rate = freq;
393 	tdm_priv->mclk_apll = apll;
394 
395 	return 0;
396 }
397 
398 static int mtk_dai_tdm_hw_params(struct snd_pcm_substream *substream,
399 				 struct snd_pcm_hw_params *params,
400 				 struct snd_soc_dai *dai)
401 {
402 	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
403 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
404 	int tdm_id = dai->id;
405 	struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[tdm_id];
406 	unsigned int tdm_mode = tdm_priv->tdm_mode;
407 	unsigned int data_mode = tdm_priv->data_mode;
408 	unsigned int rate = params_rate(params);
409 	unsigned int channels = params_channels(params);
410 	snd_pcm_format_t format = params_format(params);
411 	unsigned int bit_width =
412 		snd_pcm_format_physical_width(format);
413 	unsigned int tdm_channels = (data_mode == TDM_DATA_ONE_PIN) ?
414 		get_tdm_ch_per_sdata(tdm_mode, channels) : 2;
415 	unsigned int lrck_width =
416 		get_tdm_lrck_width(format, tdm_mode);
417 	unsigned int tdm_con = 0;
418 	bool slave_mode = tdm_priv->slave_mode;
419 	bool lrck_inv = tdm_priv->lck_invert;
420 	bool bck_inv = tdm_priv->bck_invert;
421 	unsigned int tran_rate;
422 	unsigned int tran_relatch_rate;
423 
424 	if (!tdm_priv) {
425 		dev_err(afe->dev, "%s(), tdm_priv == NULL", __func__);
426 		return -EINVAL;
427 	}
428 
429 	tdm_priv->rate = rate;
430 
431 	tran_rate = mt8186_rate_transform(afe->dev, rate, dai->id);
432 	tran_relatch_rate = mt8186_tdm_relatch_rate_transform(afe->dev, rate);
433 
434 	/* calculate mclk_rate, if not set explicitly */
435 	if (!tdm_priv->mclk_rate) {
436 		tdm_priv->mclk_rate = rate * tdm_priv->mclk_multiple;
437 		mtk_dai_tdm_cal_mclk(afe,
438 				     tdm_priv,
439 				     tdm_priv->mclk_rate);
440 	}
441 
442 	/* ETDM_IN1_CON0 */
443 	tdm_con |= slave_mode << ETDM_IN1_CON0_REG_SLAVE_MODE_SFT;
444 	tdm_con |= tdm_mode << ETDM_IN1_CON0_REG_FMT_SFT;
445 	tdm_con |= (bit_width - 1) << ETDM_IN1_CON0_REG_BIT_LENGTH_SFT;
446 	tdm_con |= (bit_width - 1) << ETDM_IN1_CON0_REG_WORD_LENGTH_SFT;
447 	tdm_con |= (tdm_channels - 1) << ETDM_IN1_CON0_REG_CH_NUM_SFT;
448 	/* need to disable sync mode otherwise this may cause latch data error */
449 	tdm_con |= 0 << ETDM_IN1_CON0_REG_SYNC_MODE_SFT;
450 	/* relatch 1x en clock fix to h26m */
451 	tdm_con |= 0 << ETDM_IN1_CON0_REG_RELATCH_1X_EN_SEL_DOMAIN_SFT;
452 	regmap_update_bits(afe->regmap, ETDM_IN1_CON0, ETDM_IN_CON0_CTRL_MASK, tdm_con);
453 
454 	/* ETDM_IN1_CON1 */
455 	tdm_con = 0;
456 	tdm_con |= 0 << ETDM_IN1_CON1_REG_LRCK_AUTO_MODE_SFT;
457 	tdm_con |= 1 << ETDM_IN1_CON1_PINMUX_MCLK_CTRL_OE_SFT;
458 	tdm_con |= (lrck_width - 1) << ETDM_IN1_CON1_REG_LRCK_WIDTH_SFT;
459 	regmap_update_bits(afe->regmap, ETDM_IN1_CON1, ETDM_IN_CON1_CTRL_MASK, tdm_con);
460 
461 	/* ETDM_IN1_CON3 */
462 	tdm_con = 0;
463 	tdm_con = ETDM_IN_CON3_FS(tran_rate);
464 	regmap_update_bits(afe->regmap, ETDM_IN1_CON3, ETDM_IN_CON3_CTRL_MASK, tdm_con);
465 
466 	/* ETDM_IN1_CON4 */
467 	tdm_con = 0;
468 	tdm_con = ETDM_IN_CON4_FS(tran_relatch_rate);
469 	if (slave_mode) {
470 		if (lrck_inv)
471 			tdm_con |= ETDM_IN_CON4_CON0_SLAVE_LRCK_INV;
472 		if (bck_inv)
473 			tdm_con |= ETDM_IN_CON4_CON0_SLAVE_BCK_INV;
474 	} else {
475 		if (lrck_inv)
476 			tdm_con |= ETDM_IN_CON4_CON0_MASTER_LRCK_INV;
477 		if (bck_inv)
478 			tdm_con |= ETDM_IN_CON4_CON0_MASTER_BCK_INV;
479 	}
480 	regmap_update_bits(afe->regmap, ETDM_IN1_CON4, ETDM_IN_CON4_CTRL_MASK, tdm_con);
481 
482 	/* ETDM_IN1_CON2 */
483 	tdm_con = 0;
484 	if (data_mode == TDM_DATA_MULTI_PIN) {
485 		tdm_con |= ETDM_IN_CON2_MULTI_IP_2CH_MODE;
486 		tdm_con |= ETDM_IN_CON2_MULTI_IP_CH(channels);
487 	}
488 	regmap_update_bits(afe->regmap, ETDM_IN1_CON2, ETDM_IN_CON2_CTRL_MASK, tdm_con);
489 
490 	/* ETDM_IN1_CON8 */
491 	tdm_con = 0;
492 	if (slave_mode) {
493 		tdm_con |= 1 << ETDM_IN1_CON8_REG_ETDM_USE_AFIFO_SFT;
494 		tdm_con |= 0 << ETDM_IN1_CON8_REG_AFIFO_CLOCK_DOMAIN_SEL_SFT;
495 		tdm_con |= ETDM_IN_CON8_FS(tran_relatch_rate);
496 	} else {
497 		tdm_con |= 0 << ETDM_IN1_CON8_REG_ETDM_USE_AFIFO_SFT;
498 	}
499 	regmap_update_bits(afe->regmap, ETDM_IN1_CON8, ETDM_IN_CON8_CTRL_MASK, tdm_con);
500 
501 	return 0;
502 }
503 
504 static int mtk_dai_tdm_set_sysclk(struct snd_soc_dai *dai,
505 				  int clk_id, unsigned int freq, int dir)
506 {
507 	struct mtk_base_afe *afe = dev_get_drvdata(dai->dev);
508 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
509 	struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai->id];
510 
511 	if (!tdm_priv) {
512 		dev_err(afe->dev, "%s(), tdm_priv == NULL", __func__);
513 		return -EINVAL;
514 	}
515 
516 	if (dir != SND_SOC_CLOCK_IN) {
517 		dev_err(afe->dev, "%s(), dir != SND_SOC_CLOCK_OUT", __func__);
518 		return -EINVAL;
519 	}
520 
521 	dev_dbg(afe->dev, "%s(), freq %d\n", __func__, freq);
522 
523 	return mtk_dai_tdm_cal_mclk(afe, tdm_priv, freq);
524 }
525 
526 static int mtk_dai_tdm_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
527 {
528 	struct mtk_base_afe *afe = dev_get_drvdata(dai->dev);
529 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
530 	struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai->id];
531 
532 	if (!tdm_priv) {
533 		dev_err(afe->dev, "%s(), tdm_priv == NULL", __func__);
534 		return -EINVAL;
535 	}
536 
537 	/* DAI mode*/
538 	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
539 	case SND_SOC_DAIFMT_I2S:
540 		tdm_priv->tdm_mode = TDM_IN_I2S;
541 		tdm_priv->data_mode = TDM_DATA_MULTI_PIN;
542 		break;
543 	case SND_SOC_DAIFMT_LEFT_J:
544 		tdm_priv->tdm_mode = TDM_IN_LJ;
545 		tdm_priv->data_mode = TDM_DATA_MULTI_PIN;
546 		break;
547 	case SND_SOC_DAIFMT_RIGHT_J:
548 		tdm_priv->tdm_mode = TDM_IN_RJ;
549 		tdm_priv->data_mode = TDM_DATA_MULTI_PIN;
550 		break;
551 	case SND_SOC_DAIFMT_DSP_A:
552 		tdm_priv->tdm_mode = TDM_IN_DSP_A;
553 		tdm_priv->data_mode = TDM_DATA_ONE_PIN;
554 		break;
555 	case SND_SOC_DAIFMT_DSP_B:
556 		tdm_priv->tdm_mode = TDM_IN_DSP_B;
557 		tdm_priv->data_mode = TDM_DATA_ONE_PIN;
558 		break;
559 	default:
560 		dev_err(afe->dev, "%s(), invalid DAIFMT_FORMAT_MASK", __func__);
561 		return -EINVAL;
562 	}
563 
564 	/* DAI clock inversion*/
565 	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
566 	case SND_SOC_DAIFMT_NB_NF:
567 		tdm_priv->bck_invert = TDM_BCK_NON_INV;
568 		tdm_priv->lck_invert = TDM_LCK_NON_INV;
569 		break;
570 	case SND_SOC_DAIFMT_NB_IF:
571 		tdm_priv->bck_invert = TDM_BCK_NON_INV;
572 		tdm_priv->lck_invert = TDM_LCK_INV;
573 		break;
574 	case SND_SOC_DAIFMT_IB_NF:
575 		tdm_priv->bck_invert = TDM_BCK_INV;
576 		tdm_priv->lck_invert = TDM_LCK_NON_INV;
577 		break;
578 	case SND_SOC_DAIFMT_IB_IF:
579 		tdm_priv->bck_invert = TDM_BCK_INV;
580 		tdm_priv->lck_invert = TDM_LCK_INV;
581 		break;
582 	default:
583 		dev_err(afe->dev, "%s(), invalid DAIFMT_INV_MASK", __func__);
584 		return -EINVAL;
585 	}
586 
587 	switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
588 	case SND_SOC_DAIFMT_BP_FP:
589 		tdm_priv->slave_mode = false;
590 		break;
591 	case SND_SOC_DAIFMT_BC_FC:
592 		tdm_priv->slave_mode = true;
593 		break;
594 	default:
595 		dev_err(afe->dev, "%s(), invalid DAIFMT_CLOCK_PROVIDER_MASK",
596 			__func__);
597 		return -EINVAL;
598 	}
599 
600 	return 0;
601 }
602 
603 static int mtk_dai_tdm_set_tdm_slot(struct snd_soc_dai *dai,
604 				    unsigned int tx_mask,
605 				    unsigned int rx_mask,
606 				    int slots,
607 				    int slot_width)
608 {
609 	struct mtk_base_afe *afe = dev_get_drvdata(dai->dev);
610 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
611 	struct mtk_afe_tdm_priv *tdm_priv = afe_priv->dai_priv[dai->id];
612 
613 	dev_dbg(dai->dev, "%s %d slot_width %d\n", __func__, dai->id, slot_width);
614 
615 	tdm_priv->lrck_width = slot_width;
616 
617 	return 0;
618 }
619 
620 static const struct snd_soc_dai_ops mtk_dai_tdm_ops = {
621 	.hw_params = mtk_dai_tdm_hw_params,
622 	.set_sysclk = mtk_dai_tdm_set_sysclk,
623 	.set_fmt = mtk_dai_tdm_set_fmt,
624 	.set_tdm_slot = mtk_dai_tdm_set_tdm_slot,
625 };
626 
627 /* dai driver */
628 #define MTK_TDM_RATES (SNDRV_PCM_RATE_8000_48000 |\
629 		       SNDRV_PCM_RATE_88200 |\
630 		       SNDRV_PCM_RATE_96000 |\
631 		       SNDRV_PCM_RATE_176400 |\
632 		       SNDRV_PCM_RATE_192000)
633 
634 #define MTK_TDM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
635 			 SNDRV_PCM_FMTBIT_S24_LE |\
636 			 SNDRV_PCM_FMTBIT_S32_LE)
637 
638 static struct snd_soc_dai_driver mtk_dai_tdm_driver[] = {
639 	{
640 		.name = "TDM IN",
641 		.id = MT8186_DAI_TDM_IN,
642 		.capture = {
643 			.stream_name = "TDM IN",
644 			.channels_min = 2,
645 			.channels_max = 8,
646 			.rates = MTK_TDM_RATES,
647 			.formats = MTK_TDM_FORMATS,
648 		},
649 		.ops = &mtk_dai_tdm_ops,
650 	},
651 };
652 
653 static struct mtk_afe_tdm_priv *init_tdm_priv_data(struct mtk_base_afe *afe)
654 {
655 	struct mtk_afe_tdm_priv *tdm_priv;
656 
657 	tdm_priv = devm_kzalloc(afe->dev, sizeof(struct mtk_afe_tdm_priv),
658 				GFP_KERNEL);
659 	if (!tdm_priv)
660 		return NULL;
661 
662 	tdm_priv->mclk_multiple = 512;
663 	tdm_priv->mclk_id = MT8186_TDM_MCK;
664 	tdm_priv->id = MT8186_DAI_TDM_IN;
665 
666 	return tdm_priv;
667 }
668 
669 int mt8186_dai_tdm_register(struct mtk_base_afe *afe)
670 {
671 	struct mt8186_afe_private *afe_priv = afe->platform_priv;
672 	struct mtk_afe_tdm_priv *tdm_priv;
673 	struct mtk_base_afe_dai *dai;
674 
675 	dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
676 	if (!dai)
677 		return -ENOMEM;
678 
679 	list_add(&dai->list, &afe->sub_dais);
680 
681 	dai->dai_drivers = mtk_dai_tdm_driver;
682 	dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_tdm_driver);
683 
684 	dai->controls = mtk_dai_tdm_controls;
685 	dai->num_controls = ARRAY_SIZE(mtk_dai_tdm_controls);
686 	dai->dapm_widgets = mtk_dai_tdm_widgets;
687 	dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_tdm_widgets);
688 	dai->dapm_routes = mtk_dai_tdm_routes;
689 	dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_tdm_routes);
690 
691 	tdm_priv = init_tdm_priv_data(afe);
692 	if (!tdm_priv)
693 		return -ENOMEM;
694 
695 	afe_priv->dai_priv[MT8186_DAI_TDM_IN] = tdm_priv;
696 
697 	return 0;
698 }
699