xref: /linux/sound/soc/mediatek/mt8188/mt8188-mt6359.c (revision a9e6060bb2a6cae6d43a98ec0794844ad01273d3)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * mt8188-mt6359.c  --  MT8188-MT6359 ALSA SoC machine driver
4  *
5  * Copyright (c) 2022 MediaTek Inc.
6  * Author: Trevor Wu <trevor.wu@mediatek.com>
7  */
8 
9 #include <linux/bitfield.h>
10 #include <linux/input.h>
11 #include <linux/module.h>
12 #include <linux/of.h>
13 #include <linux/pm_runtime.h>
14 #include <sound/jack.h>
15 #include <sound/pcm_params.h>
16 #include <sound/soc.h>
17 #include "mt8188-afe-common.h"
18 #include "../../codecs/nau8825.h"
19 #include "../../codecs/mt6359.h"
20 #include "../../codecs/mt6359-accdet.h"
21 #include "../../codecs/rt5682.h"
22 #include "../common/mtk-afe-platform-driver.h"
23 #include "../common/mtk-soundcard-driver.h"
24 #include "../common/mtk-dsp-sof-common.h"
25 #include "../common/mtk-soc-card.h"
26 
27 #define CKSYS_AUD_TOP_CFG	0x032c
28  #define RG_TEST_ON		BIT(0)
29  #define RG_TEST_TYPE		BIT(2)
30 #define CKSYS_AUD_TOP_MON	0x0330
31  #define TEST_MISO_COUNT_1	GENMASK(3, 0)
32  #define TEST_MISO_COUNT_2	GENMASK(7, 4)
33  #define TEST_MISO_DONE_1	BIT(28)
34  #define TEST_MISO_DONE_2	BIT(29)
35 
36 #define NAU8825_HS_PRESENT	BIT(0)
37 #define RT5682S_HS_PRESENT	BIT(1)
38 #define ES8326_HS_PRESENT	BIT(2)
39 #define MAX98390_TWO_AMP	BIT(3)
40 /*
41  * Maxim MAX98390
42  */
43 #define MAX98390_CODEC_DAI     "max98390-aif1"
44 #define MAX98390_DEV0_NAME     "max98390.0-0038" /* rear right */
45 #define MAX98390_DEV1_NAME     "max98390.0-0039" /* rear left */
46 #define MAX98390_DEV2_NAME     "max98390.0-003a" /* front right */
47 #define MAX98390_DEV3_NAME     "max98390.0-003b" /* front left */
48 
49 /*
50  * Nau88l25
51  */
52 #define NAU8825_CODEC_DAI  "nau8825-hifi"
53 
54 /*
55  * ES8326
56  */
57 #define ES8326_CODEC_DAI  "ES8326 HiFi"
58 
59 #define SOF_DMA_DL2 "SOF_DMA_DL2"
60 #define SOF_DMA_DL3 "SOF_DMA_DL3"
61 #define SOF_DMA_UL4 "SOF_DMA_UL4"
62 #define SOF_DMA_UL5 "SOF_DMA_UL5"
63 
64 #define RT5682S_CODEC_DAI     "rt5682s-aif1"
65 
66 /* FE */
67 SND_SOC_DAILINK_DEFS(playback2,
68 		     DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
69 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
70 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
71 
72 SND_SOC_DAILINK_DEFS(playback3,
73 		     DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
74 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
75 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
76 
77 SND_SOC_DAILINK_DEFS(playback6,
78 		     DAILINK_COMP_ARRAY(COMP_CPU("DL6")),
79 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
80 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
81 
82 SND_SOC_DAILINK_DEFS(playback7,
83 		     DAILINK_COMP_ARRAY(COMP_CPU("DL7")),
84 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
85 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
86 
87 SND_SOC_DAILINK_DEFS(playback8,
88 		     DAILINK_COMP_ARRAY(COMP_CPU("DL8")),
89 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
90 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
91 
92 SND_SOC_DAILINK_DEFS(playback10,
93 		     DAILINK_COMP_ARRAY(COMP_CPU("DL10")),
94 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
95 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
96 
97 SND_SOC_DAILINK_DEFS(playback11,
98 		     DAILINK_COMP_ARRAY(COMP_CPU("DL11")),
99 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
100 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
101 
102 SND_SOC_DAILINK_DEFS(capture1,
103 		     DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
104 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
105 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
106 
107 SND_SOC_DAILINK_DEFS(capture2,
108 		     DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
109 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
110 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
111 
112 SND_SOC_DAILINK_DEFS(capture3,
113 		     DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
114 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
115 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
116 
117 SND_SOC_DAILINK_DEFS(capture4,
118 		     DAILINK_COMP_ARRAY(COMP_CPU("UL4")),
119 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
120 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
121 
122 SND_SOC_DAILINK_DEFS(capture5,
123 		     DAILINK_COMP_ARRAY(COMP_CPU("UL5")),
124 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
125 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
126 
127 SND_SOC_DAILINK_DEFS(capture6,
128 		     DAILINK_COMP_ARRAY(COMP_CPU("UL6")),
129 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
130 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
131 
132 SND_SOC_DAILINK_DEFS(capture8,
133 		     DAILINK_COMP_ARRAY(COMP_CPU("UL8")),
134 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
135 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
136 
137 SND_SOC_DAILINK_DEFS(capture9,
138 		     DAILINK_COMP_ARRAY(COMP_CPU("UL9")),
139 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
140 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
141 
142 SND_SOC_DAILINK_DEFS(capture10,
143 		     DAILINK_COMP_ARRAY(COMP_CPU("UL10")),
144 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
145 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
146 
147 /* BE */
148 SND_SOC_DAILINK_DEFS(dl_src,
149 		     DAILINK_COMP_ARRAY(COMP_CPU("DL_SRC")),
150 		     DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
151 						   "mt6359-snd-codec-aif1")),
152 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
153 
154 SND_SOC_DAILINK_DEFS(DMIC_BE,
155 		     DAILINK_COMP_ARRAY(COMP_CPU("DMIC")),
156 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
157 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
158 
159 SND_SOC_DAILINK_DEFS(dptx,
160 		     DAILINK_COMP_ARRAY(COMP_CPU("DPTX")),
161 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
162 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
163 
164 SND_SOC_DAILINK_DEFS(etdm1_in,
165 		     DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_IN")),
166 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
167 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
168 
169 SND_SOC_DAILINK_DEFS(etdm2_in,
170 		     DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_IN")),
171 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
172 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
173 
174 SND_SOC_DAILINK_DEFS(etdm1_out,
175 		     DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_OUT")),
176 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
177 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
178 
179 SND_SOC_DAILINK_DEFS(etdm2_out,
180 		     DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_OUT")),
181 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
182 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
183 
184 SND_SOC_DAILINK_DEFS(etdm3_out,
185 		     DAILINK_COMP_ARRAY(COMP_CPU("ETDM3_OUT")),
186 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
187 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
188 
189 SND_SOC_DAILINK_DEFS(pcm1,
190 		     DAILINK_COMP_ARRAY(COMP_CPU("PCM1")),
191 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
192 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
193 
194 SND_SOC_DAILINK_DEFS(ul_src,
195 		     DAILINK_COMP_ARRAY(COMP_CPU("UL_SRC")),
196 		     DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
197 						   "mt6359-snd-codec-aif1")),
198 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
199 
200 SND_SOC_DAILINK_DEFS(AFE_SOF_DL2,
201 		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL2")),
202 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
203 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
204 
205 SND_SOC_DAILINK_DEFS(AFE_SOF_DL3,
206 		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL3")),
207 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
208 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
209 
210 SND_SOC_DAILINK_DEFS(AFE_SOF_UL4,
211 		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL4")),
212 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
213 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
214 
215 SND_SOC_DAILINK_DEFS(AFE_SOF_UL5,
216 		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL5")),
217 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
218 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
219 
220 static const struct sof_conn_stream g_sof_conn_streams[] = {
221 	{
222 		.sof_link = "AFE_SOF_DL2",
223 		.sof_dma = SOF_DMA_DL2,
224 		.stream_dir = SNDRV_PCM_STREAM_PLAYBACK
225 	},
226 	{
227 		.sof_link = "AFE_SOF_DL3",
228 		.sof_dma = SOF_DMA_DL3,
229 		.stream_dir = SNDRV_PCM_STREAM_PLAYBACK
230 	},
231 	{
232 		.sof_link = "AFE_SOF_UL4",
233 		.sof_dma = SOF_DMA_UL4,
234 		.stream_dir = SNDRV_PCM_STREAM_CAPTURE
235 	},
236 	{
237 		.sof_link = "AFE_SOF_UL5",
238 		.sof_dma = SOF_DMA_UL5,
239 		.stream_dir = SNDRV_PCM_STREAM_CAPTURE
240 	},
241 };
242 
243 enum mt8188_jacks {
244 	MT8188_JACK_HEADSET,
245 	MT8188_JACK_DP,
246 	MT8188_JACK_HDMI,
247 	MT8188_JACK_MAX,
248 };
249 
250 static struct snd_soc_jack_pin mt8188_hdmi_jack_pins[] = {
251 	{
252 		.pin = "HDMI",
253 		.mask = SND_JACK_LINEOUT,
254 	},
255 };
256 
257 static struct snd_soc_jack_pin mt8188_dp_jack_pins[] = {
258 	{
259 		.pin = "DP",
260 		.mask = SND_JACK_LINEOUT,
261 	},
262 };
263 
264 static struct snd_soc_jack_pin nau8825_jack_pins[] = {
265 	{
266 		.pin    = "Headphone Jack",
267 		.mask   = SND_JACK_HEADPHONE,
268 	},
269 	{
270 		.pin    = "Headset Mic",
271 		.mask   = SND_JACK_MICROPHONE,
272 	},
273 };
274 
275 static struct snd_soc_jack_pin mt8188_headset_jack_pins[] = {
276 	{
277 		.pin    = "Headphone",
278 		.mask   = SND_JACK_HEADPHONE,
279 	},
280 	{
281 		.pin    = "Headset Mic",
282 		.mask   = SND_JACK_MICROPHONE,
283 	},
284 };
285 
286 static const struct snd_kcontrol_new mt8188_dumb_spk_controls[] = {
287 	SOC_DAPM_PIN_SWITCH("Ext Spk"),
288 };
289 
290 static const struct snd_soc_dapm_widget mt8188_dumb_spk_widgets[] = {
291 	SND_SOC_DAPM_SPK("Ext Spk", NULL),
292 };
293 
294 static const struct snd_kcontrol_new mt8188_dual_spk_controls[] = {
295 	SOC_DAPM_PIN_SWITCH("Left Spk"),
296 	SOC_DAPM_PIN_SWITCH("Right Spk"),
297 };
298 
299 static const struct snd_soc_dapm_widget mt8188_dual_spk_widgets[] = {
300 	SND_SOC_DAPM_SPK("Left Spk", NULL),
301 	SND_SOC_DAPM_SPK("Right Spk", NULL),
302 };
303 
304 static const struct snd_kcontrol_new mt8188_rear_spk_controls[] = {
305 	SOC_DAPM_PIN_SWITCH("Rear Left Spk"),
306 	SOC_DAPM_PIN_SWITCH("Rear Right Spk"),
307 };
308 
309 static const struct snd_soc_dapm_widget mt8188_rear_spk_widgets[] = {
310 	SND_SOC_DAPM_SPK("Rear Left Spk", NULL),
311 	SND_SOC_DAPM_SPK("Rear Right Spk", NULL),
312 };
313 
314 static const struct snd_soc_dapm_widget mt8188_mt6359_widgets[] = {
315 	SND_SOC_DAPM_HP("Headphone", NULL),
316 	SND_SOC_DAPM_MIC("Headset Mic", NULL),
317 	SND_SOC_DAPM_MIC("AP DMIC", NULL),
318 	SND_SOC_DAPM_SINK("HDMI"),
319 	SND_SOC_DAPM_SINK("DP"),
320 	SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0),
321 	SND_SOC_DAPM_MIXER(SOF_DMA_DL3, SND_SOC_NOPM, 0, 0, NULL, 0),
322 	SND_SOC_DAPM_MIXER(SOF_DMA_UL4, SND_SOC_NOPM, 0, 0, NULL, 0),
323 	SND_SOC_DAPM_MIXER(SOF_DMA_UL5, SND_SOC_NOPM, 0, 0, NULL, 0),
324 
325 	/* dynamic pinctrl */
326 	SND_SOC_DAPM_PINCTRL("ETDM_SPK_PIN", "aud_etdm_spk_on", "aud_etdm_spk_off"),
327 	SND_SOC_DAPM_PINCTRL("ETDM_HP_PIN", "aud_etdm_hp_on", "aud_etdm_hp_off"),
328 	SND_SOC_DAPM_PINCTRL("MTKAIF_PIN", "aud_mtkaif_on", "aud_mtkaif_off"),
329 };
330 
331 static const struct snd_kcontrol_new mt8188_mt6359_controls[] = {
332 	SOC_DAPM_PIN_SWITCH("Headphone"),
333 	SOC_DAPM_PIN_SWITCH("Headset Mic"),
334 };
335 
336 static const struct snd_soc_dapm_widget mt8188_nau8825_widgets[] = {
337 	SND_SOC_DAPM_HP("Headphone Jack", NULL),
338 };
339 
340 static const struct snd_kcontrol_new mt8188_nau8825_controls[] = {
341 	SOC_DAPM_PIN_SWITCH("Headphone Jack"),
342 };
343 
344 static const struct snd_soc_dapm_route mt8188_mt6359_routes[] = {
345 	/* SOF Uplink */
346 	{SOF_DMA_UL4, NULL, "O034"},
347 	{SOF_DMA_UL4, NULL, "O035"},
348 	{SOF_DMA_UL5, NULL, "O036"},
349 	{SOF_DMA_UL5, NULL, "O037"},
350 	/* SOF Downlink */
351 	{"I070", NULL, SOF_DMA_DL2},
352 	{"I071", NULL, SOF_DMA_DL2},
353 	{"I020", NULL, SOF_DMA_DL3},
354 	{"I021", NULL, SOF_DMA_DL3},
355 };
356 
mt8188_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime * rtd)357 static int mt8188_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd)
358 {
359 	struct snd_soc_component *cmpnt_afe =
360 		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
361 	struct snd_soc_component *cmpnt_codec =
362 		snd_soc_rtd_to_codec(rtd, 0)->component;
363 	struct snd_soc_dapm_widget *pin_w = NULL, *w;
364 	struct mtk_base_afe *afe;
365 	struct mt8188_afe_private *afe_priv;
366 	struct mtkaif_param *param;
367 	int chosen_phase_1, chosen_phase_2;
368 	int prev_cycle_1, prev_cycle_2;
369 	u8 test_done_1, test_done_2;
370 	int cycle_1, cycle_2;
371 	int mtkaif_chosen_phase[MT8188_MTKAIF_MISO_NUM];
372 	int mtkaif_phase_cycle[MT8188_MTKAIF_MISO_NUM];
373 	int mtkaif_calibration_num_phase;
374 	bool mtkaif_calibration_ok;
375 	u32 monitor = 0;
376 	int counter;
377 	int phase;
378 	int i;
379 
380 	if (!cmpnt_afe)
381 		return -EINVAL;
382 
383 	afe = snd_soc_component_get_drvdata(cmpnt_afe);
384 	afe_priv = afe->platform_priv;
385 	param = &afe_priv->mtkaif_params;
386 
387 	dev_dbg(afe->dev, "%s(), start\n", __func__);
388 
389 	param->mtkaif_calibration_ok = false;
390 	for (i = 0; i < MT8188_MTKAIF_MISO_NUM; i++) {
391 		param->mtkaif_chosen_phase[i] = -1;
392 		param->mtkaif_phase_cycle[i] = 0;
393 		mtkaif_chosen_phase[i] = -1;
394 		mtkaif_phase_cycle[i] = 0;
395 	}
396 
397 	if (IS_ERR(afe_priv->topckgen)) {
398 		dev_info(afe->dev, "%s() Cannot find topckgen controller\n",
399 			 __func__);
400 		return 0;
401 	}
402 
403 	for_each_card_widgets(rtd->card, w) {
404 		if (!strcmp(w->name, "MTKAIF_PIN")) {
405 			pin_w = w;
406 			break;
407 		}
408 	}
409 
410 	if (pin_w)
411 		dapm_pinctrl_event(pin_w, NULL, SND_SOC_DAPM_PRE_PMU);
412 	else
413 		dev_dbg(afe->dev, "%s(), no pinmux widget, please check if default on\n", __func__);
414 
415 	pm_runtime_get_sync(afe->dev);
416 	mt6359_mtkaif_calibration_enable(cmpnt_codec);
417 
418 	/* set test type to synchronizer pulse */
419 	regmap_write(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_TYPE);
420 	mtkaif_calibration_num_phase = 42;	/* mt6359: 0 ~ 42 */
421 	mtkaif_calibration_ok = true;
422 
423 	for (phase = 0;
424 	     phase <= mtkaif_calibration_num_phase && mtkaif_calibration_ok;
425 	     phase++) {
426 		mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
427 						    phase, phase, phase);
428 
429 		regmap_set_bits(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_ON);
430 
431 		test_done_1 = 0;
432 		test_done_2 = 0;
433 
434 		cycle_1 = -1;
435 		cycle_2 = -1;
436 
437 		counter = 0;
438 		while (!(test_done_1 & test_done_2)) {
439 			regmap_read(afe_priv->topckgen,
440 				    CKSYS_AUD_TOP_MON, &monitor);
441 			test_done_1 = FIELD_GET(TEST_MISO_DONE_1, monitor);
442 			test_done_2 = FIELD_GET(TEST_MISO_DONE_2, monitor);
443 
444 			if (test_done_1 == 1)
445 				cycle_1 = FIELD_GET(TEST_MISO_COUNT_1, monitor);
446 
447 			if (test_done_2 == 1)
448 				cycle_2 = FIELD_GET(TEST_MISO_COUNT_2, monitor);
449 
450 			/* handle if never test done */
451 			if (++counter > 10000) {
452 				dev_err(afe->dev, "%s(), test fail, cycle_1 %d, cycle_2 %d, monitor 0x%x\n",
453 					__func__, cycle_1, cycle_2, monitor);
454 				mtkaif_calibration_ok = false;
455 				break;
456 			}
457 		}
458 
459 		if (phase == 0) {
460 			prev_cycle_1 = cycle_1;
461 			prev_cycle_2 = cycle_2;
462 		}
463 
464 		if (cycle_1 != prev_cycle_1 &&
465 		    mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] < 0) {
466 			mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] = phase - 1;
467 			mtkaif_phase_cycle[MT8188_MTKAIF_MISO_0] = prev_cycle_1;
468 		}
469 
470 		if (cycle_2 != prev_cycle_2 &&
471 		    mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] < 0) {
472 			mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] = phase - 1;
473 			mtkaif_phase_cycle[MT8188_MTKAIF_MISO_1] = prev_cycle_2;
474 		}
475 
476 		regmap_clear_bits(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_ON);
477 
478 		if (mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] >= 0 &&
479 		    mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] >= 0)
480 			break;
481 	}
482 
483 	if (mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] < 0) {
484 		mtkaif_calibration_ok = false;
485 		chosen_phase_1 = 0;
486 	} else {
487 		chosen_phase_1 = mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0];
488 	}
489 
490 	if (mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] < 0) {
491 		mtkaif_calibration_ok = false;
492 		chosen_phase_2 = 0;
493 	} else {
494 		chosen_phase_2 = mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1];
495 	}
496 
497 	mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
498 					    chosen_phase_1,
499 					    chosen_phase_2,
500 					    0);
501 
502 	mt6359_mtkaif_calibration_disable(cmpnt_codec);
503 	pm_runtime_put(afe->dev);
504 
505 	param->mtkaif_calibration_ok = mtkaif_calibration_ok;
506 	param->mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] = chosen_phase_1;
507 	param->mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] = chosen_phase_2;
508 
509 	for (i = 0; i < MT8188_MTKAIF_MISO_NUM; i++)
510 		param->mtkaif_phase_cycle[i] = mtkaif_phase_cycle[i];
511 
512 	if (pin_w)
513 		dapm_pinctrl_event(pin_w, NULL, SND_SOC_DAPM_POST_PMD);
514 
515 	dev_dbg(afe->dev, "%s(), end, calibration ok %d\n",
516 		__func__, param->mtkaif_calibration_ok);
517 
518 	return 0;
519 }
520 
mt8188_mt6359_accdet_init(struct snd_soc_pcm_runtime * rtd)521 static int mt8188_mt6359_accdet_init(struct snd_soc_pcm_runtime *rtd)
522 {
523 	struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
524 	struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_HEADSET];
525 	int ret;
526 
527 	if (!soc_card_data->accdet)
528 		return 0;
529 
530 	ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
531 				   SND_JACK_HEADSET | SND_JACK_BTN_0 |
532 				   SND_JACK_BTN_1 | SND_JACK_BTN_2 |
533 				   SND_JACK_BTN_3,
534 				   jack, mt8188_headset_jack_pins,
535 				   ARRAY_SIZE(mt8188_headset_jack_pins));
536 	if (ret) {
537 		dev_err(rtd->dev, "Headset Jack create failed: %d\n", ret);
538 		return ret;
539 	}
540 
541 	ret = mt6359_accdet_enable_jack_detect(soc_card_data->accdet, jack);
542 	if (ret) {
543 		dev_err(rtd->dev, "Headset Jack enable failed: %d\n", ret);
544 		return ret;
545 	}
546 
547 	return 0;
548 }
549 
mt8188_mt6359_init(struct snd_soc_pcm_runtime * rtd)550 static int mt8188_mt6359_init(struct snd_soc_pcm_runtime *rtd)
551 {
552 	struct snd_soc_component *cmpnt_codec =
553 		snd_soc_rtd_to_codec(rtd, 0)->component;
554 
555 	/* set mtkaif protocol */
556 	mt6359_set_mtkaif_protocol(cmpnt_codec,
557 				   MT6359_MTKAIF_PROTOCOL_2_CLK_P2);
558 
559 	/* mtkaif calibration */
560 	mt8188_mt6359_mtkaif_calibration(rtd);
561 
562 	mt8188_mt6359_accdet_init(rtd);
563 
564 	return 0;
565 }
566 
567 enum {
568 	DAI_LINK_DL2_FE,
569 	DAI_LINK_DL3_FE,
570 	DAI_LINK_DL6_FE,
571 	DAI_LINK_DL7_FE,
572 	DAI_LINK_DL8_FE,
573 	DAI_LINK_DL10_FE,
574 	DAI_LINK_DL11_FE,
575 	DAI_LINK_UL1_FE,
576 	DAI_LINK_UL2_FE,
577 	DAI_LINK_UL3_FE,
578 	DAI_LINK_UL4_FE,
579 	DAI_LINK_UL5_FE,
580 	DAI_LINK_UL6_FE,
581 	DAI_LINK_UL8_FE,
582 	DAI_LINK_UL9_FE,
583 	DAI_LINK_UL10_FE,
584 	DAI_LINK_DL_SRC_BE,
585 	DAI_LINK_DMIC_BE,
586 	DAI_LINK_DPTX_BE,
587 	DAI_LINK_ETDM1_IN_BE,
588 	DAI_LINK_ETDM2_IN_BE,
589 	DAI_LINK_ETDM1_OUT_BE,
590 	DAI_LINK_ETDM2_OUT_BE,
591 	DAI_LINK_ETDM3_OUT_BE,
592 	DAI_LINK_PCM1_BE,
593 	DAI_LINK_UL_SRC_BE,
594 	DAI_LINK_REGULAR_LAST = DAI_LINK_UL_SRC_BE,
595 	DAI_LINK_SOF_START,
596 	DAI_LINK_SOF_DL2_BE = DAI_LINK_SOF_START,
597 	DAI_LINK_SOF_DL3_BE,
598 	DAI_LINK_SOF_UL4_BE,
599 	DAI_LINK_SOF_UL5_BE,
600 	DAI_LINK_SOF_END = DAI_LINK_SOF_UL5_BE,
601 };
602 
603 #define	DAI_LINK_REGULAR_NUM	(DAI_LINK_REGULAR_LAST + 1)
604 
mt8188_dptx_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params)605 static int mt8188_dptx_hw_params(struct snd_pcm_substream *substream,
606 				 struct snd_pcm_hw_params *params)
607 {
608 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
609 	unsigned int rate = params_rate(params);
610 	unsigned int mclk_fs_ratio = 256;
611 	unsigned int mclk_fs = rate * mclk_fs_ratio;
612 	struct snd_soc_dai *dai = snd_soc_rtd_to_cpu(rtd, 0);
613 
614 	return snd_soc_dai_set_sysclk(dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
615 }
616 
617 static const struct snd_soc_ops mt8188_dptx_ops = {
618 	.hw_params = mt8188_dptx_hw_params,
619 };
620 
mt8188_dptx_hw_params_fixup(struct snd_soc_pcm_runtime * rtd,struct snd_pcm_hw_params * params)621 static int mt8188_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
622 				       struct snd_pcm_hw_params *params)
623 {
624 	/* fix BE i2s format to 32bit, clean param mask first */
625 	snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
626 			     0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);
627 
628 	params_set_format(params, SNDRV_PCM_FORMAT_S32_LE);
629 
630 	return 0;
631 }
632 
mt8188_hdmi_codec_init(struct snd_soc_pcm_runtime * rtd)633 static int mt8188_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd)
634 {
635 	struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
636 	struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_HDMI];
637 	struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
638 	int ret = 0;
639 
640 	ret = snd_soc_card_jack_new_pins(rtd->card, "HDMI Jack",
641 					 SND_JACK_LINEOUT, jack,
642 					 mt8188_hdmi_jack_pins,
643 					 ARRAY_SIZE(mt8188_hdmi_jack_pins));
644 	if (ret) {
645 		dev_err(rtd->dev, "%s, new jack failed: %d\n", __func__, ret);
646 		return ret;
647 	}
648 
649 	ret = snd_soc_component_set_jack(component, jack, NULL);
650 	if (ret) {
651 		dev_err(rtd->dev, "%s, set jack failed on %s (ret=%d)\n",
652 			__func__, component->name, ret);
653 		return ret;
654 	}
655 
656 	return 0;
657 }
658 
mt8188_dptx_codec_init(struct snd_soc_pcm_runtime * rtd)659 static int mt8188_dptx_codec_init(struct snd_soc_pcm_runtime *rtd)
660 {
661 	struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
662 	struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_DP];
663 	struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
664 	int ret = 0;
665 
666 	ret = snd_soc_card_jack_new_pins(rtd->card, "DP Jack", SND_JACK_LINEOUT,
667 					 jack, mt8188_dp_jack_pins,
668 					 ARRAY_SIZE(mt8188_dp_jack_pins));
669 	if (ret) {
670 		dev_err(rtd->dev, "%s, new jack failed: %d\n", __func__, ret);
671 		return ret;
672 	}
673 
674 	ret = snd_soc_component_set_jack(component, jack, NULL);
675 	if (ret) {
676 		dev_err(rtd->dev, "%s, set jack failed on %s (ret=%d)\n",
677 			__func__, component->name, ret);
678 		return ret;
679 	}
680 
681 	return 0;
682 }
683 
mt8188_dumb_amp_init(struct snd_soc_pcm_runtime * rtd)684 static int mt8188_dumb_amp_init(struct snd_soc_pcm_runtime *rtd)
685 {
686 	struct snd_soc_card *card = rtd->card;
687 	int ret = 0;
688 
689 	ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_dumb_spk_widgets,
690 					ARRAY_SIZE(mt8188_dumb_spk_widgets));
691 	if (ret) {
692 		dev_err(rtd->dev, "unable to add Dumb Speaker dapm, ret %d\n", ret);
693 		return ret;
694 	}
695 
696 	ret = snd_soc_add_card_controls(card, mt8188_dumb_spk_controls,
697 					ARRAY_SIZE(mt8188_dumb_spk_controls));
698 	if (ret) {
699 		dev_err(rtd->dev, "unable to add Dumb card controls, ret %d\n", ret);
700 		return ret;
701 	}
702 
703 	return 0;
704 }
705 
mt8188_max98390_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params)706 static int mt8188_max98390_hw_params(struct snd_pcm_substream *substream,
707 				     struct snd_pcm_hw_params *params)
708 {
709 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
710 	unsigned int bit_width = params_width(params);
711 	struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
712 	struct snd_soc_dai *codec_dai;
713 	int i;
714 
715 	snd_soc_dai_set_tdm_slot(cpu_dai, 0xf, 0xf, 4, bit_width);
716 
717 	for_each_rtd_codec_dais(rtd, i, codec_dai) {
718 		if (!strcmp(codec_dai->component->name, MAX98390_DEV0_NAME))
719 			snd_soc_dai_set_tdm_slot(codec_dai, 0x8, 0x3, 4, bit_width);
720 
721 		if (!strcmp(codec_dai->component->name, MAX98390_DEV1_NAME))
722 			snd_soc_dai_set_tdm_slot(codec_dai, 0x4, 0x3, 4, bit_width);
723 
724 		if (!strcmp(codec_dai->component->name, MAX98390_DEV2_NAME))
725 			snd_soc_dai_set_tdm_slot(codec_dai, 0x2, 0x3, 4, bit_width);
726 
727 		if (!strcmp(codec_dai->component->name, MAX98390_DEV3_NAME))
728 			snd_soc_dai_set_tdm_slot(codec_dai, 0x1, 0x3, 4, bit_width);
729 	}
730 	return 0;
731 }
732 
733 static const struct snd_soc_ops mt8188_max98390_ops = {
734 	.hw_params = mt8188_max98390_hw_params,
735 };
736 
mt8188_max98390_codec_init(struct snd_soc_pcm_runtime * rtd)737 static int mt8188_max98390_codec_init(struct snd_soc_pcm_runtime *rtd)
738 {
739 	struct snd_soc_card *card = rtd->card;
740 	int ret;
741 
742 	/* add regular speakers dapm route */
743 	ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_dual_spk_widgets,
744 					ARRAY_SIZE(mt8188_dual_spk_widgets));
745 	if (ret) {
746 		dev_err(rtd->dev, "unable to add Left/Right Speaker widget, ret %d\n", ret);
747 		return ret;
748 	}
749 
750 	ret = snd_soc_add_card_controls(card, mt8188_dual_spk_controls,
751 					ARRAY_SIZE(mt8188_dual_spk_controls));
752 	if (ret) {
753 		dev_err(rtd->dev, "unable to add Left/Right card controls, ret %d\n", ret);
754 		return ret;
755 	}
756 
757 	if (rtd->dai_link->num_codecs <= 2)
758 		return 0;
759 
760 	/* add widgets/controls/dapm for rear speakers */
761 	ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_rear_spk_widgets,
762 					ARRAY_SIZE(mt8188_rear_spk_widgets));
763 	if (ret) {
764 		dev_err(rtd->dev, "unable to add Rear Speaker widget, ret %d\n", ret);
765 		/* Don't need to add routes if widget addition failed */
766 		return ret;
767 	}
768 
769 	ret = snd_soc_add_card_controls(card, mt8188_rear_spk_controls,
770 					ARRAY_SIZE(mt8188_rear_spk_controls));
771 	if (ret) {
772 		dev_err(rtd->dev, "unable to add Rear card controls, ret %d\n", ret);
773 		return ret;
774 	}
775 
776 	return 0;
777 }
778 
mt8188_headset_codec_init(struct snd_soc_pcm_runtime * rtd)779 static int mt8188_headset_codec_init(struct snd_soc_pcm_runtime *rtd)
780 {
781 	struct snd_soc_card *card = rtd->card;
782 	struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
783 	struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_HEADSET];
784 	struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
785 	struct mtk_platform_card_data *card_data = soc_card_data->card_data;
786 	int ret;
787 
788 	ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_nau8825_widgets,
789 					ARRAY_SIZE(mt8188_nau8825_widgets));
790 	if (ret) {
791 		dev_err(rtd->dev, "unable to add nau8825 card widget, ret %d\n", ret);
792 		return ret;
793 	}
794 
795 	ret = snd_soc_add_card_controls(card, mt8188_nau8825_controls,
796 					ARRAY_SIZE(mt8188_nau8825_controls));
797 	if (ret) {
798 		dev_err(rtd->dev, "unable to add nau8825 card controls, ret %d\n", ret);
799 		return ret;
800 	}
801 
802 	ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
803 					 SND_JACK_HEADSET | SND_JACK_BTN_0 |
804 					 SND_JACK_BTN_1 | SND_JACK_BTN_2 |
805 					 SND_JACK_BTN_3,
806 					 jack,
807 					 nau8825_jack_pins,
808 					 ARRAY_SIZE(nau8825_jack_pins));
809 	if (ret) {
810 		dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
811 		return ret;
812 	}
813 
814 	if (card_data->flags & ES8326_HS_PRESENT) {
815 		snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
816 		snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOLUMEUP);
817 		snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEDOWN);
818 		snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOICECOMMAND);
819 	} else {
820 		snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
821 		snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
822 		snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
823 		snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
824 	}
825 
826 	ret = snd_soc_component_set_jack(component, jack, NULL);
827 
828 	if (ret) {
829 		dev_err(rtd->dev, "Headset Jack call-back failed: %d\n", ret);
830 		return ret;
831 	}
832 
833 	return 0;
834 };
835 
mt8188_headset_codec_exit(struct snd_soc_pcm_runtime * rtd)836 static void mt8188_headset_codec_exit(struct snd_soc_pcm_runtime *rtd)
837 {
838 	struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
839 
840 	snd_soc_component_set_jack(component, NULL, NULL);
841 }
842 
843 
mt8188_nau8825_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params)844 static int mt8188_nau8825_hw_params(struct snd_pcm_substream *substream,
845 				    struct snd_pcm_hw_params *params)
846 {
847 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
848 	struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
849 	unsigned int rate = params_rate(params);
850 	unsigned int bit_width = params_width(params);
851 	int clk_freq, ret;
852 
853 	clk_freq = rate * 2 * bit_width;
854 
855 	/* Configure clock for codec */
856 	ret = snd_soc_dai_set_sysclk(codec_dai, NAU8825_CLK_FLL_BLK, 0,
857 				     SND_SOC_CLOCK_IN);
858 	if (ret < 0) {
859 		dev_err(codec_dai->dev, "can't set BCLK clock %d\n", ret);
860 		return ret;
861 	}
862 
863 	/* Configure pll for codec */
864 	ret = snd_soc_dai_set_pll(codec_dai, 0, 0, clk_freq,
865 				  params_rate(params) * 256);
866 	if (ret < 0) {
867 		dev_err(codec_dai->dev, "can't set BCLK: %d\n", ret);
868 		return ret;
869 	}
870 
871 	return 0;
872 }
873 
874 static const struct snd_soc_ops mt8188_nau8825_ops = {
875 	.hw_params = mt8188_nau8825_hw_params,
876 };
877 
mt8188_rt5682s_i2s_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params)878 static int mt8188_rt5682s_i2s_hw_params(struct snd_pcm_substream *substream,
879 					struct snd_pcm_hw_params *params)
880 {
881 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
882 	struct snd_soc_card *card = rtd->card;
883 	struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
884 	struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
885 	unsigned int rate = params_rate(params);
886 	int bitwidth;
887 	int ret;
888 
889 	bitwidth = snd_pcm_format_width(params_format(params));
890 	if (bitwidth < 0) {
891 		dev_err(card->dev, "invalid bit width: %d\n", bitwidth);
892 		return bitwidth;
893 	}
894 
895 	ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);
896 	if (ret) {
897 		dev_err(card->dev, "failed to set tdm slot\n");
898 		return ret;
899 	}
900 
901 	ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1, RT5682_PLL1_S_BCLK1,
902 				  rate * 32, rate * 512);
903 	if (ret) {
904 		dev_err(card->dev, "failed to set pll\n");
905 		return ret;
906 	}
907 
908 	ret = snd_soc_dai_set_sysclk(codec_dai, RT5682_SCLK_S_PLL1,
909 				     rate * 512, SND_SOC_CLOCK_IN);
910 	if (ret) {
911 		dev_err(card->dev, "failed to set sysclk\n");
912 		return ret;
913 	}
914 
915 	return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 128,
916 				      SND_SOC_CLOCK_OUT);
917 }
918 
919 static const struct snd_soc_ops mt8188_rt5682s_i2s_ops = {
920 	.hw_params = mt8188_rt5682s_i2s_hw_params,
921 };
922 
mt8188_sof_be_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params)923 static int mt8188_sof_be_hw_params(struct snd_pcm_substream *substream,
924 				   struct snd_pcm_hw_params *params)
925 {
926 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
927 	struct snd_soc_component *cmpnt_afe = NULL;
928 	struct snd_soc_pcm_runtime *runtime;
929 
930 	/* find afe component */
931 	for_each_card_rtds(rtd->card, runtime) {
932 		cmpnt_afe = snd_soc_rtdcom_lookup(runtime, AFE_PCM_NAME);
933 		if (cmpnt_afe)
934 			break;
935 	}
936 
937 	if (cmpnt_afe && !pm_runtime_active(cmpnt_afe->dev)) {
938 		dev_err(rtd->dev, "afe pm runtime is not active!!\n");
939 		return -EINVAL;
940 	}
941 
942 	return 0;
943 }
944 
945 static const struct snd_soc_ops mt8188_sof_be_ops = {
946 	.hw_params = mt8188_sof_be_hw_params,
947 };
948 
mt8188_es8326_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params)949 static int mt8188_es8326_hw_params(struct snd_pcm_substream *substream,
950 				 struct snd_pcm_hw_params *params)
951 {
952 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
953 	struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
954 	struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
955 	unsigned int rate = params_rate(params);
956 	int ret;
957 
958 	/* Configure MCLK for codec */
959 	ret = snd_soc_dai_set_sysclk(codec_dai, 0, rate * 256, SND_SOC_CLOCK_IN);
960 	if (ret < 0) {
961 		dev_err(codec_dai->dev, "can't set MCLK %d\n", ret);
962 		return ret;
963 	}
964 
965 	/* Configure MCLK for cpu */
966 	return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 256, SND_SOC_CLOCK_OUT);
967 }
968 
969 static const struct snd_soc_ops mt8188_es8326_ops = {
970 	.hw_params = mt8188_es8326_hw_params,
971 };
972 
973 static struct snd_soc_dai_link mt8188_mt6359_dai_links[] = {
974 	/* FE */
975 	[DAI_LINK_DL2_FE] = {
976 		.name = "DL2_FE",
977 		.stream_name = "DL2 Playback",
978 		.trigger = {
979 			SND_SOC_DPCM_TRIGGER_POST,
980 			SND_SOC_DPCM_TRIGGER_POST,
981 		},
982 		.dynamic = 1,
983 		.playback_only = 1,
984 		.dpcm_merged_chan = 1,
985 		.dpcm_merged_rate = 1,
986 		.dpcm_merged_format = 1,
987 		SND_SOC_DAILINK_REG(playback2),
988 	},
989 	[DAI_LINK_DL3_FE] = {
990 		.name = "DL3_FE",
991 		.stream_name = "DL3 Playback",
992 		.trigger = {
993 			SND_SOC_DPCM_TRIGGER_POST,
994 			SND_SOC_DPCM_TRIGGER_POST,
995 		},
996 		.dynamic = 1,
997 		.playback_only = 1,
998 		.dpcm_merged_chan = 1,
999 		.dpcm_merged_rate = 1,
1000 		.dpcm_merged_format = 1,
1001 		SND_SOC_DAILINK_REG(playback3),
1002 	},
1003 	[DAI_LINK_DL6_FE] = {
1004 		.name = "DL6_FE",
1005 		.stream_name = "DL6 Playback",
1006 		.trigger = {
1007 			SND_SOC_DPCM_TRIGGER_POST,
1008 			SND_SOC_DPCM_TRIGGER_POST,
1009 		},
1010 		.dynamic = 1,
1011 		.playback_only = 1,
1012 		.dpcm_merged_chan = 1,
1013 		.dpcm_merged_rate = 1,
1014 		.dpcm_merged_format = 1,
1015 		SND_SOC_DAILINK_REG(playback6),
1016 	},
1017 	[DAI_LINK_DL7_FE] = {
1018 		.name = "DL7_FE",
1019 		.stream_name = "DL7 Playback",
1020 		.trigger = {
1021 			SND_SOC_DPCM_TRIGGER_PRE,
1022 			SND_SOC_DPCM_TRIGGER_PRE,
1023 		},
1024 		.dynamic = 1,
1025 		.playback_only = 1,
1026 		SND_SOC_DAILINK_REG(playback7),
1027 	},
1028 	[DAI_LINK_DL8_FE] = {
1029 		.name = "DL8_FE",
1030 		.stream_name = "DL8 Playback",
1031 		.trigger = {
1032 			SND_SOC_DPCM_TRIGGER_POST,
1033 			SND_SOC_DPCM_TRIGGER_POST,
1034 		},
1035 		.dynamic = 1,
1036 		.playback_only = 1,
1037 		SND_SOC_DAILINK_REG(playback8),
1038 	},
1039 	[DAI_LINK_DL10_FE] = {
1040 		.name = "DL10_FE",
1041 		.stream_name = "DL10 Playback",
1042 		.trigger = {
1043 			SND_SOC_DPCM_TRIGGER_POST,
1044 			SND_SOC_DPCM_TRIGGER_POST,
1045 		},
1046 		.dynamic = 1,
1047 		.playback_only = 1,
1048 		SND_SOC_DAILINK_REG(playback10),
1049 	},
1050 	[DAI_LINK_DL11_FE] = {
1051 		.name = "DL11_FE",
1052 		.stream_name = "DL11 Playback",
1053 		.trigger = {
1054 			SND_SOC_DPCM_TRIGGER_POST,
1055 			SND_SOC_DPCM_TRIGGER_POST,
1056 		},
1057 		.dynamic = 1,
1058 		.playback_only = 1,
1059 		SND_SOC_DAILINK_REG(playback11),
1060 	},
1061 	[DAI_LINK_UL1_FE] = {
1062 		.name = "UL1_FE",
1063 		.stream_name = "UL1 Capture",
1064 		.trigger = {
1065 			SND_SOC_DPCM_TRIGGER_PRE,
1066 			SND_SOC_DPCM_TRIGGER_PRE,
1067 		},
1068 		.dynamic = 1,
1069 		.capture_only = 1,
1070 		SND_SOC_DAILINK_REG(capture1),
1071 	},
1072 	[DAI_LINK_UL2_FE] = {
1073 		.name = "UL2_FE",
1074 		.stream_name = "UL2 Capture",
1075 		.trigger = {
1076 			SND_SOC_DPCM_TRIGGER_POST,
1077 			SND_SOC_DPCM_TRIGGER_POST,
1078 		},
1079 		.dynamic = 1,
1080 		.capture_only = 1,
1081 		SND_SOC_DAILINK_REG(capture2),
1082 	},
1083 	[DAI_LINK_UL3_FE] = {
1084 		.name = "UL3_FE",
1085 		.stream_name = "UL3 Capture",
1086 		.trigger = {
1087 			SND_SOC_DPCM_TRIGGER_POST,
1088 			SND_SOC_DPCM_TRIGGER_POST,
1089 		},
1090 		.dynamic = 1,
1091 		.capture_only = 1,
1092 		SND_SOC_DAILINK_REG(capture3),
1093 	},
1094 	[DAI_LINK_UL4_FE] = {
1095 		.name = "UL4_FE",
1096 		.stream_name = "UL4 Capture",
1097 		.trigger = {
1098 			SND_SOC_DPCM_TRIGGER_POST,
1099 			SND_SOC_DPCM_TRIGGER_POST,
1100 		},
1101 		.dynamic = 1,
1102 		.capture_only = 1,
1103 		.dpcm_merged_chan = 1,
1104 		.dpcm_merged_rate = 1,
1105 		.dpcm_merged_format = 1,
1106 		SND_SOC_DAILINK_REG(capture4),
1107 	},
1108 	[DAI_LINK_UL5_FE] = {
1109 		.name = "UL5_FE",
1110 		.stream_name = "UL5 Capture",
1111 		.trigger = {
1112 			SND_SOC_DPCM_TRIGGER_POST,
1113 			SND_SOC_DPCM_TRIGGER_POST,
1114 		},
1115 		.dynamic = 1,
1116 		.capture_only = 1,
1117 		.dpcm_merged_chan = 1,
1118 		.dpcm_merged_rate = 1,
1119 		.dpcm_merged_format = 1,
1120 		SND_SOC_DAILINK_REG(capture5),
1121 	},
1122 	[DAI_LINK_UL6_FE] = {
1123 		.name = "UL6_FE",
1124 		.stream_name = "UL6 Capture",
1125 		.trigger = {
1126 			SND_SOC_DPCM_TRIGGER_PRE,
1127 			SND_SOC_DPCM_TRIGGER_PRE,
1128 		},
1129 		.dynamic = 1,
1130 		.capture_only = 1,
1131 		SND_SOC_DAILINK_REG(capture6),
1132 	},
1133 	[DAI_LINK_UL8_FE] = {
1134 		.name = "UL8_FE",
1135 		.stream_name = "UL8 Capture",
1136 		.trigger = {
1137 			SND_SOC_DPCM_TRIGGER_POST,
1138 			SND_SOC_DPCM_TRIGGER_POST,
1139 		},
1140 		.dynamic = 1,
1141 		.capture_only = 1,
1142 		SND_SOC_DAILINK_REG(capture8),
1143 	},
1144 	[DAI_LINK_UL9_FE] = {
1145 		.name = "UL9_FE",
1146 		.stream_name = "UL9 Capture",
1147 		.trigger = {
1148 			SND_SOC_DPCM_TRIGGER_POST,
1149 			SND_SOC_DPCM_TRIGGER_POST,
1150 		},
1151 		.dynamic = 1,
1152 		.capture_only = 1,
1153 		SND_SOC_DAILINK_REG(capture9),
1154 	},
1155 	[DAI_LINK_UL10_FE] = {
1156 		.name = "UL10_FE",
1157 		.stream_name = "UL10 Capture",
1158 		.trigger = {
1159 			SND_SOC_DPCM_TRIGGER_POST,
1160 			SND_SOC_DPCM_TRIGGER_POST,
1161 		},
1162 		.dynamic = 1,
1163 		.capture_only = 1,
1164 		SND_SOC_DAILINK_REG(capture10),
1165 	},
1166 	/* BE */
1167 	[DAI_LINK_DL_SRC_BE] = {
1168 		.name = "DL_SRC_BE",
1169 		.no_pcm = 1,
1170 		.playback_only = 1,
1171 		SND_SOC_DAILINK_REG(dl_src),
1172 	},
1173 	[DAI_LINK_DMIC_BE] = {
1174 		.name = "DMIC_BE",
1175 		.no_pcm = 1,
1176 		.capture_only = 1,
1177 		.ignore_suspend = 1,
1178 		SND_SOC_DAILINK_REG(DMIC_BE),
1179 	},
1180 	[DAI_LINK_DPTX_BE] = {
1181 		.name = "DPTX_BE",
1182 		.ops = &mt8188_dptx_ops,
1183 		.be_hw_params_fixup = mt8188_dptx_hw_params_fixup,
1184 		.no_pcm = 1,
1185 		.playback_only = 1,
1186 		SND_SOC_DAILINK_REG(dptx),
1187 	},
1188 	[DAI_LINK_ETDM1_IN_BE] = {
1189 		.name = "ETDM1_IN_BE",
1190 		.no_pcm = 1,
1191 		.dai_fmt = SND_SOC_DAIFMT_I2S |
1192 			SND_SOC_DAIFMT_NB_NF |
1193 			SND_SOC_DAIFMT_CBP_CFP,
1194 		.capture_only = 1,
1195 		.ignore_suspend = 1,
1196 		SND_SOC_DAILINK_REG(etdm1_in),
1197 	},
1198 	[DAI_LINK_ETDM2_IN_BE] = {
1199 		.name = "ETDM2_IN_BE",
1200 		.no_pcm = 1,
1201 		.dai_fmt = SND_SOC_DAIFMT_I2S |
1202 			SND_SOC_DAIFMT_NB_NF |
1203 			SND_SOC_DAIFMT_CBP_CFP,
1204 		.capture_only = 1,
1205 		SND_SOC_DAILINK_REG(etdm2_in),
1206 	},
1207 	[DAI_LINK_ETDM1_OUT_BE] = {
1208 		.name = "ETDM1_OUT_BE",
1209 		.no_pcm = 1,
1210 		.dai_fmt = SND_SOC_DAIFMT_I2S |
1211 			SND_SOC_DAIFMT_NB_NF |
1212 			SND_SOC_DAIFMT_CBC_CFC,
1213 		.playback_only = 1,
1214 		SND_SOC_DAILINK_REG(etdm1_out),
1215 	},
1216 	[DAI_LINK_ETDM2_OUT_BE] = {
1217 		.name = "ETDM2_OUT_BE",
1218 		.no_pcm = 1,
1219 		.dai_fmt = SND_SOC_DAIFMT_I2S |
1220 			SND_SOC_DAIFMT_NB_NF |
1221 			SND_SOC_DAIFMT_CBC_CFC,
1222 		.playback_only = 1,
1223 		SND_SOC_DAILINK_REG(etdm2_out),
1224 	},
1225 	[DAI_LINK_ETDM3_OUT_BE] = {
1226 		.name = "ETDM3_OUT_BE",
1227 		.no_pcm = 1,
1228 		.dai_fmt = SND_SOC_DAIFMT_I2S |
1229 			SND_SOC_DAIFMT_NB_NF |
1230 			SND_SOC_DAIFMT_CBC_CFC,
1231 		.playback_only = 1,
1232 		SND_SOC_DAILINK_REG(etdm3_out),
1233 	},
1234 	[DAI_LINK_PCM1_BE] = {
1235 		.name = "PCM1_BE",
1236 		.no_pcm = 1,
1237 		.dai_fmt = SND_SOC_DAIFMT_I2S |
1238 			SND_SOC_DAIFMT_NB_NF |
1239 			SND_SOC_DAIFMT_CBC_CFC,
1240 		SND_SOC_DAILINK_REG(pcm1),
1241 	},
1242 	[DAI_LINK_UL_SRC_BE] = {
1243 		.name = "UL_SRC_BE",
1244 		.no_pcm = 1,
1245 		.capture_only = 1,
1246 		SND_SOC_DAILINK_REG(ul_src),
1247 	},
1248 
1249 	/* SOF BE */
1250 	[DAI_LINK_SOF_DL2_BE] = {
1251 		.name = "AFE_SOF_DL2",
1252 		.no_pcm = 1,
1253 		.playback_only = 1,
1254 		.ops = &mt8188_sof_be_ops,
1255 		SND_SOC_DAILINK_REG(AFE_SOF_DL2),
1256 	},
1257 	[DAI_LINK_SOF_DL3_BE] = {
1258 		.name = "AFE_SOF_DL3",
1259 		.no_pcm = 1,
1260 		.playback_only = 1,
1261 		.ops = &mt8188_sof_be_ops,
1262 		SND_SOC_DAILINK_REG(AFE_SOF_DL3),
1263 	},
1264 	[DAI_LINK_SOF_UL4_BE] = {
1265 		.name = "AFE_SOF_UL4",
1266 		.no_pcm = 1,
1267 		.capture_only = 1,
1268 		.ops = &mt8188_sof_be_ops,
1269 		SND_SOC_DAILINK_REG(AFE_SOF_UL4),
1270 	},
1271 	[DAI_LINK_SOF_UL5_BE] = {
1272 		.name = "AFE_SOF_UL5",
1273 		.no_pcm = 1,
1274 		.capture_only = 1,
1275 		.ops = &mt8188_sof_be_ops,
1276 		SND_SOC_DAILINK_REG(AFE_SOF_UL5),
1277 	},
1278 };
1279 
mt8188_fixup_controls(struct snd_soc_card * card)1280 static void mt8188_fixup_controls(struct snd_soc_card *card)
1281 {
1282 	struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card);
1283 	struct mtk_platform_card_data *card_data = soc_card_data->card_data;
1284 	struct snd_kcontrol *kctl;
1285 
1286 	if (card_data->flags & (NAU8825_HS_PRESENT | RT5682S_HS_PRESENT | ES8326_HS_PRESENT)) {
1287 		struct snd_soc_dapm_widget *w, *next_w;
1288 
1289 		for_each_card_widgets_safe(card, w, next_w) {
1290 			if (strcmp(w->name, "Headphone"))
1291 				continue;
1292 
1293 			snd_soc_dapm_free_widget(w);
1294 		}
1295 
1296 		kctl = snd_ctl_find_id_mixer(card->snd_card, "Headphone Switch");
1297 		if (kctl)
1298 			snd_ctl_remove(card->snd_card, kctl);
1299 		else
1300 			dev_warn(card->dev, "Cannot find ctl : Headphone Switch\n");
1301 	}
1302 }
1303 
1304 static struct snd_soc_card mt8188_mt6359_soc_card = {
1305 	.owner = THIS_MODULE,
1306 	.dai_link = mt8188_mt6359_dai_links,
1307 	.num_links = ARRAY_SIZE(mt8188_mt6359_dai_links),
1308 	.dapm_widgets = mt8188_mt6359_widgets,
1309 	.num_dapm_widgets = ARRAY_SIZE(mt8188_mt6359_widgets),
1310 	.dapm_routes = mt8188_mt6359_routes,
1311 	.num_dapm_routes = ARRAY_SIZE(mt8188_mt6359_routes),
1312 	.controls = mt8188_mt6359_controls,
1313 	.num_controls = ARRAY_SIZE(mt8188_mt6359_controls),
1314 	.fixup_controls = mt8188_fixup_controls,
1315 };
1316 
mt8188_mt6359_soc_card_probe(struct mtk_soc_card_data * soc_card_data,bool legacy)1317 static int mt8188_mt6359_soc_card_probe(struct mtk_soc_card_data *soc_card_data, bool legacy)
1318 {
1319 	struct mtk_platform_card_data *card_data = soc_card_data->card_data;
1320 	struct snd_soc_card *card = soc_card_data->card_data->card;
1321 	struct snd_soc_dai_link *dai_link;
1322 	bool init_mt6359 = false;
1323 	bool init_es8326 = false;
1324 	bool init_nau8825 = false;
1325 	bool init_rt5682s = false;
1326 	bool init_max98390 = false;
1327 	bool init_dumb = false;
1328 	int i;
1329 
1330 	if (legacy)
1331 		return -EINVAL;
1332 
1333 	for_each_card_prelinks(card, i, dai_link) {
1334 		if (strcmp(dai_link->name, "DPTX_BE") == 0) {
1335 			if (dai_link->num_codecs &&
1336 			    !snd_soc_dlc_is_dummy(dai_link->codecs))
1337 				dai_link->init = mt8188_dptx_codec_init;
1338 		} else if (strcmp(dai_link->name, "ETDM3_OUT_BE") == 0) {
1339 			if (dai_link->num_codecs &&
1340 			    !snd_soc_dlc_is_dummy(dai_link->codecs))
1341 				dai_link->init = mt8188_hdmi_codec_init;
1342 		} else if (strcmp(dai_link->name, "DL_SRC_BE") == 0 ||
1343 			   strcmp(dai_link->name, "UL_SRC_BE") == 0) {
1344 			if (!init_mt6359) {
1345 				dai_link->init = mt8188_mt6359_init;
1346 				init_mt6359 = true;
1347 			}
1348 		} else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0 ||
1349 			   strcmp(dai_link->name, "ETDM2_OUT_BE") == 0 ||
1350 			   strcmp(dai_link->name, "ETDM1_IN_BE") == 0 ||
1351 			   strcmp(dai_link->name, "ETDM2_IN_BE") == 0) {
1352 			if (!dai_link->num_codecs)
1353 				continue;
1354 
1355 			if (!strcmp(dai_link->codecs->dai_name, MAX98390_CODEC_DAI)) {
1356 				/*
1357 				 * The TDM protocol settings with fixed 4 slots are defined in
1358 				 * mt8188_max98390_ops. Two amps is I2S mode,
1359 				 * SOC and codec don't require TDM settings.
1360 				 */
1361 				if (!(card_data->flags & MAX98390_TWO_AMP)) {
1362 					dai_link->ops = &mt8188_max98390_ops;
1363 				}
1364 				if (!init_max98390) {
1365 					dai_link->init = mt8188_max98390_codec_init;
1366 					init_max98390 = true;
1367 				}
1368 			} else if (!strcmp(dai_link->codecs->dai_name, NAU8825_CODEC_DAI)) {
1369 				dai_link->ops = &mt8188_nau8825_ops;
1370 				if (!init_nau8825) {
1371 					dai_link->init = mt8188_headset_codec_init;
1372 					dai_link->exit = mt8188_headset_codec_exit;
1373 					init_nau8825 = true;
1374 				}
1375 			} else if (!strcmp(dai_link->codecs->dai_name, RT5682S_CODEC_DAI)) {
1376 				dai_link->ops = &mt8188_rt5682s_i2s_ops;
1377 				if (!init_rt5682s) {
1378 					dai_link->init = mt8188_headset_codec_init;
1379 					dai_link->exit = mt8188_headset_codec_exit;
1380 					init_rt5682s = true;
1381 				}
1382 			} else if (!strcmp(dai_link->codecs->dai_name, ES8326_CODEC_DAI)) {
1383 				dai_link->ops = &mt8188_es8326_ops;
1384 				if (!init_es8326) {
1385 					dai_link->init = mt8188_headset_codec_init;
1386 					dai_link->exit = mt8188_headset_codec_exit;
1387 					init_es8326 = true;
1388 				}
1389 			} else {
1390 				if (!snd_soc_dlc_is_dummy(dai_link->codecs)) {
1391 					if (!init_dumb) {
1392 						dai_link->init = mt8188_dumb_amp_init;
1393 						init_dumb = true;
1394 					}
1395 				}
1396 			}
1397 		}
1398 	}
1399 
1400 	return 0;
1401 }
1402 
1403 static const struct mtk_sof_priv mt8188_sof_priv = {
1404 	.conn_streams = g_sof_conn_streams,
1405 	.num_streams = ARRAY_SIZE(g_sof_conn_streams),
1406 };
1407 
1408 static const struct mtk_soundcard_pdata mt8188_evb_card = {
1409 	.card_name = "mt8188_mt6359",
1410 	.card_data = &(struct mtk_platform_card_data) {
1411 		.card = &mt8188_mt6359_soc_card,
1412 		.num_jacks = MT8188_JACK_MAX,
1413 	},
1414 	.sof_priv = &mt8188_sof_priv,
1415 	.soc_probe = mt8188_mt6359_soc_card_probe,
1416 };
1417 
1418 static const struct mtk_soundcard_pdata mt8188_nau8825_card = {
1419 	.card_name = "mt8188_nau8825",
1420 	.card_data = &(struct mtk_platform_card_data) {
1421 		.card = &mt8188_mt6359_soc_card,
1422 		.num_jacks = MT8188_JACK_MAX,
1423 		.flags = NAU8825_HS_PRESENT
1424 	},
1425 	.sof_priv = &mt8188_sof_priv,
1426 	.soc_probe = mt8188_mt6359_soc_card_probe,
1427 };
1428 
1429 static const struct mtk_soundcard_pdata mt8188_rt5682s_card = {
1430 	.card_name = "mt8188_rt5682s",
1431 	.card_data = &(struct mtk_platform_card_data) {
1432 		.card = &mt8188_mt6359_soc_card,
1433 		.num_jacks = MT8188_JACK_MAX,
1434 		.flags = RT5682S_HS_PRESENT | MAX98390_TWO_AMP
1435 	},
1436 	.sof_priv = &mt8188_sof_priv,
1437 	.soc_probe = mt8188_mt6359_soc_card_probe,
1438 };
1439 
1440 static const struct mtk_soundcard_pdata mt8188_es8326_card = {
1441 	.card_name = "mt8188_es8326",
1442 	.card_data = &(struct mtk_platform_card_data) {
1443 		.card = &mt8188_mt6359_soc_card,
1444 		.num_jacks = MT8188_JACK_MAX,
1445 		.flags = ES8326_HS_PRESENT | MAX98390_TWO_AMP
1446 	},
1447 	.sof_priv = &mt8188_sof_priv,
1448 	.soc_probe = mt8188_mt6359_soc_card_probe,
1449 };
1450 
1451 static const struct of_device_id mt8188_mt6359_dt_match[] = {
1452 	{ .compatible = "mediatek,mt8188-mt6359-evb", .data = &mt8188_evb_card, },
1453 	{ .compatible = "mediatek,mt8188-nau8825", .data = &mt8188_nau8825_card, },
1454 	{ .compatible = "mediatek,mt8188-rt5682s", .data = &mt8188_rt5682s_card, },
1455 	{ .compatible = "mediatek,mt8188-es8326", .data = &mt8188_es8326_card, },
1456 	{ /* sentinel */ },
1457 };
1458 MODULE_DEVICE_TABLE(of, mt8188_mt6359_dt_match);
1459 
1460 static struct platform_driver mt8188_mt6359_driver = {
1461 	.driver = {
1462 		.name = "mt8188_mt6359",
1463 		.of_match_table = mt8188_mt6359_dt_match,
1464 		.pm = &snd_soc_pm_ops,
1465 	},
1466 	.probe = mtk_soundcard_common_probe,
1467 };
1468 
1469 module_platform_driver(mt8188_mt6359_driver);
1470 
1471 /* Module information */
1472 MODULE_DESCRIPTION("MT8188-MT6359 ALSA SoC machine driver");
1473 MODULE_AUTHOR("Trevor Wu <trevor.wu@mediatek.com>");
1474 MODULE_LICENSE("GPL");
1475 MODULE_ALIAS("mt8188 mt6359 soc card");
1476