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