1// SPDX-License-Identifier: GPL-2.0
2/*
3 * mt8195-mt6359.c  --
4 *	MT8195-MT6359 ALSA SoC machine driver code
5 *
6 * Copyright (c) 2022 MediaTek Inc.
7 * Author: Trevor Wu <trevor.wu@mediatek.com>
8 *	   YC Hung <yc.hung@mediatek.com>
9 */
10
11#include <linux/input.h>
12#include <linux/module.h>
13#include <linux/of_device.h>
14#include <linux/pm_runtime.h>
15#include <sound/jack.h>
16#include <sound/pcm_params.h>
17#include <sound/rt5682.h>
18#include <sound/soc.h>
19#include "../../codecs/mt6359.h"
20#include "../../codecs/rt1011.h"
21#include "../../codecs/rt5682.h"
22#include "../common/mtk-afe-platform-driver.h"
23#include "../common/mtk-dsp-sof-common.h"
24#include "../common/mtk-soc-card.h"
25#include "mt8195-afe-clk.h"
26#include "mt8195-afe-common.h"
27
28#define RT1011_SPEAKER_AMP_PRESENT		BIT(0)
29#define RT1019_SPEAKER_AMP_PRESENT		BIT(1)
30#define MAX98390_SPEAKER_AMP_PRESENT		BIT(2)
31
32#define RT1011_CODEC_DAI	"rt1011-aif"
33#define RT1011_DEV0_NAME	"rt1011.2-0038"
34#define RT1011_DEV1_NAME	"rt1011.2-0039"
35
36#define RT1019_CODEC_DAI	"HiFi"
37#define RT1019_DEV0_NAME	"rt1019p"
38
39#define MAX98390_CODEC_DAI	"max98390-aif1"
40#define MAX98390_DEV0_NAME	"max98390.2-0038" /* right */
41#define MAX98390_DEV1_NAME	"max98390.2-0039" /* left */
42
43#define RT5682_CODEC_DAI	"rt5682-aif1"
44#define RT5682_DEV0_NAME	"rt5682.2-001a"
45
46#define RT5682S_CODEC_DAI	"rt5682s-aif1"
47#define RT5682S_DEV0_NAME	"rt5682s.2-001a"
48
49#define SOF_DMA_DL2 "SOF_DMA_DL2"
50#define SOF_DMA_DL3 "SOF_DMA_DL3"
51#define SOF_DMA_UL4 "SOF_DMA_UL4"
52#define SOF_DMA_UL5 "SOF_DMA_UL5"
53
54struct mt8195_card_data {
55	const char *name;
56	unsigned long quirk;
57};
58
59struct mt8195_mt6359_priv {
60	struct snd_soc_jack headset_jack;
61	struct snd_soc_jack dp_jack;
62	struct snd_soc_jack hdmi_jack;
63	struct clk *i2so1_mclk;
64};
65
66/* Headset jack detection DAPM pins */
67static struct snd_soc_jack_pin mt8195_jack_pins[] = {
68	{
69		.pin = "Headphone",
70		.mask = SND_JACK_HEADPHONE,
71	},
72	{
73		.pin = "Headset Mic",
74		.mask = SND_JACK_MICROPHONE,
75	},
76};
77
78static const struct snd_soc_dapm_widget mt8195_mt6359_widgets[] = {
79	SND_SOC_DAPM_HP("Headphone", NULL),
80	SND_SOC_DAPM_MIC("Headset Mic", NULL),
81	SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0),
82	SND_SOC_DAPM_MIXER(SOF_DMA_DL3, SND_SOC_NOPM, 0, 0, NULL, 0),
83	SND_SOC_DAPM_MIXER(SOF_DMA_UL4, SND_SOC_NOPM, 0, 0, NULL, 0),
84	SND_SOC_DAPM_MIXER(SOF_DMA_UL5, SND_SOC_NOPM, 0, 0, NULL, 0),
85};
86
87static const struct snd_soc_dapm_route mt8195_mt6359_routes[] = {
88	/* headset */
89	{ "Headphone", NULL, "HPOL" },
90	{ "Headphone", NULL, "HPOR" },
91	{ "IN1P", NULL, "Headset Mic" },
92	/* SOF Uplink */
93	{SOF_DMA_UL4, NULL, "O034"},
94	{SOF_DMA_UL4, NULL, "O035"},
95	{SOF_DMA_UL5, NULL, "O036"},
96	{SOF_DMA_UL5, NULL, "O037"},
97	/* SOF Downlink */
98	{"I070", NULL, SOF_DMA_DL2},
99	{"I071", NULL, SOF_DMA_DL2},
100	{"I020", NULL, SOF_DMA_DL3},
101	{"I021", NULL, SOF_DMA_DL3},
102};
103
104static const struct snd_kcontrol_new mt8195_mt6359_controls[] = {
105	SOC_DAPM_PIN_SWITCH("Headphone"),
106	SOC_DAPM_PIN_SWITCH("Headset Mic"),
107};
108
109static const struct snd_soc_dapm_widget mt8195_dual_speaker_widgets[] = {
110	SND_SOC_DAPM_SPK("Left Spk", NULL),
111	SND_SOC_DAPM_SPK("Right Spk", NULL),
112};
113
114static const struct snd_kcontrol_new mt8195_dual_speaker_controls[] = {
115	SOC_DAPM_PIN_SWITCH("Left Spk"),
116	SOC_DAPM_PIN_SWITCH("Right Spk"),
117};
118
119static const struct snd_soc_dapm_widget mt8195_speaker_widgets[] = {
120	SND_SOC_DAPM_SPK("Ext Spk", NULL),
121};
122
123static const struct snd_kcontrol_new mt8195_speaker_controls[] = {
124	SOC_DAPM_PIN_SWITCH("Ext Spk"),
125};
126
127static const struct snd_soc_dapm_route mt8195_rt1011_routes[] = {
128	{ "Left Spk", NULL, "Left SPO" },
129	{ "Right Spk", NULL, "Right SPO" },
130};
131
132static const struct snd_soc_dapm_route mt8195_rt1019_routes[] = {
133	{ "Ext Spk", NULL, "Speaker" },
134};
135
136static const struct snd_soc_dapm_route mt8195_max98390_routes[] = {
137	{ "Left Spk", NULL, "Left BE_OUT" },
138	{ "Right Spk", NULL, "Right BE_OUT" },
139};
140
141#define CKSYS_AUD_TOP_CFG 0x032c
142#define CKSYS_AUD_TOP_MON 0x0330
143
144static int mt8195_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd)
145{
146	struct snd_soc_component *cmpnt_afe =
147		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
148	struct snd_soc_component *cmpnt_codec =
149		asoc_rtd_to_codec(rtd, 0)->component;
150	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
151	struct mt8195_afe_private *afe_priv = afe->platform_priv;
152	struct mtkaif_param *param = &afe_priv->mtkaif_params;
153	int chosen_phase_1, chosen_phase_2, chosen_phase_3;
154	int prev_cycle_1, prev_cycle_2, prev_cycle_3;
155	int test_done_1, test_done_2, test_done_3;
156	int cycle_1, cycle_2, cycle_3;
157	int mtkaif_chosen_phase[MT8195_MTKAIF_MISO_NUM];
158	int mtkaif_phase_cycle[MT8195_MTKAIF_MISO_NUM];
159	int mtkaif_calibration_num_phase;
160	bool mtkaif_calibration_ok;
161	unsigned int monitor = 0;
162	int counter;
163	int phase;
164	int i;
165
166	dev_dbg(afe->dev, "%s(), start\n", __func__);
167
168	param->mtkaif_calibration_ok = false;
169	for (i = 0; i < MT8195_MTKAIF_MISO_NUM; i++) {
170		param->mtkaif_chosen_phase[i] = -1;
171		param->mtkaif_phase_cycle[i] = 0;
172		mtkaif_chosen_phase[i] = -1;
173		mtkaif_phase_cycle[i] = 0;
174	}
175
176	if (IS_ERR(afe_priv->topckgen)) {
177		dev_info(afe->dev, "%s() Cannot find topckgen controller\n",
178			 __func__);
179		return 0;
180	}
181
182	pm_runtime_get_sync(afe->dev);
183	mt6359_mtkaif_calibration_enable(cmpnt_codec);
184
185	/* set test type to synchronizer pulse */
186	regmap_update_bits(afe_priv->topckgen,
187			   CKSYS_AUD_TOP_CFG, 0xffff, 0x4);
188	mtkaif_calibration_num_phase = 42;	/* mt6359: 0 ~ 42 */
189	mtkaif_calibration_ok = true;
190
191	for (phase = 0;
192	     phase <= mtkaif_calibration_num_phase && mtkaif_calibration_ok;
193	     phase++) {
194		mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
195						    phase, phase, phase);
196
197		regmap_update_bits(afe_priv->topckgen,
198				   CKSYS_AUD_TOP_CFG, 0x1, 0x1);
199
200		test_done_1 = 0;
201		test_done_2 = 0;
202		test_done_3 = 0;
203		cycle_1 = -1;
204		cycle_2 = -1;
205		cycle_3 = -1;
206		counter = 0;
207		while (!(test_done_1 & test_done_2 & test_done_3)) {
208			regmap_read(afe_priv->topckgen,
209				    CKSYS_AUD_TOP_MON, &monitor);
210			test_done_1 = (monitor >> 28) & 0x1;
211			test_done_2 = (monitor >> 29) & 0x1;
212			test_done_3 = (monitor >> 30) & 0x1;
213			if (test_done_1 == 1)
214				cycle_1 = monitor & 0xf;
215
216			if (test_done_2 == 1)
217				cycle_2 = (monitor >> 4) & 0xf;
218
219			if (test_done_3 == 1)
220				cycle_3 = (monitor >> 8) & 0xf;
221
222			/* handle if never test done */
223			if (++counter > 10000) {
224				dev_info(afe->dev, "%s(), test fail, cycle_1 %d, cycle_2 %d, cycle_3 %d, monitor 0x%x\n",
225					 __func__,
226					 cycle_1, cycle_2, cycle_3, monitor);
227				mtkaif_calibration_ok = false;
228				break;
229			}
230		}
231
232		if (phase == 0) {
233			prev_cycle_1 = cycle_1;
234			prev_cycle_2 = cycle_2;
235			prev_cycle_3 = cycle_3;
236		}
237
238		if (cycle_1 != prev_cycle_1 &&
239		    mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] < 0) {
240			mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] = phase - 1;
241			mtkaif_phase_cycle[MT8195_MTKAIF_MISO_0] = prev_cycle_1;
242		}
243
244		if (cycle_2 != prev_cycle_2 &&
245		    mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] < 0) {
246			mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] = phase - 1;
247			mtkaif_phase_cycle[MT8195_MTKAIF_MISO_1] = prev_cycle_2;
248		}
249
250		if (cycle_3 != prev_cycle_3 &&
251		    mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] < 0) {
252			mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] = phase - 1;
253			mtkaif_phase_cycle[MT8195_MTKAIF_MISO_2] = prev_cycle_3;
254		}
255
256		regmap_update_bits(afe_priv->topckgen,
257				   CKSYS_AUD_TOP_CFG, 0x1, 0x0);
258
259		if (mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] >= 0 &&
260		    mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] >= 0 &&
261		    mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] >= 0)
262			break;
263	}
264
265	if (mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] < 0) {
266		mtkaif_calibration_ok = false;
267		chosen_phase_1 = 0;
268	} else {
269		chosen_phase_1 = mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0];
270	}
271
272	if (mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] < 0) {
273		mtkaif_calibration_ok = false;
274		chosen_phase_2 = 0;
275	} else {
276		chosen_phase_2 = mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1];
277	}
278
279	if (mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] < 0) {
280		mtkaif_calibration_ok = false;
281		chosen_phase_3 = 0;
282	} else {
283		chosen_phase_3 = mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2];
284	}
285
286	mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
287					    chosen_phase_1,
288					    chosen_phase_2,
289					    chosen_phase_3);
290
291	mt6359_mtkaif_calibration_disable(cmpnt_codec);
292	pm_runtime_put(afe->dev);
293
294	param->mtkaif_calibration_ok = mtkaif_calibration_ok;
295	param->mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] = chosen_phase_1;
296	param->mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] = chosen_phase_2;
297	param->mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] = chosen_phase_3;
298	for (i = 0; i < MT8195_MTKAIF_MISO_NUM; i++)
299		param->mtkaif_phase_cycle[i] = mtkaif_phase_cycle[i];
300
301	dev_info(afe->dev, "%s(), end, calibration ok %d\n",
302		 __func__, param->mtkaif_calibration_ok);
303
304	return 0;
305}
306
307static int mt8195_mt6359_init(struct snd_soc_pcm_runtime *rtd)
308{
309	struct snd_soc_component *cmpnt_codec =
310		asoc_rtd_to_codec(rtd, 0)->component;
311
312	/* set mtkaif protocol */
313	mt6359_set_mtkaif_protocol(cmpnt_codec,
314				   MT6359_MTKAIF_PROTOCOL_2_CLK_P2);
315
316	/* mtkaif calibration */
317	mt8195_mt6359_mtkaif_calibration(rtd);
318
319	return 0;
320}
321
322static int mt8195_hdmitx_dptx_startup(struct snd_pcm_substream *substream)
323{
324	static const unsigned int rates[] = {
325		48000
326	};
327	static const unsigned int channels[] = {
328		2, 4, 6, 8
329	};
330	static const struct snd_pcm_hw_constraint_list constraints_rates = {
331		.count = ARRAY_SIZE(rates),
332		.list  = rates,
333		.mask = 0,
334	};
335	static const struct snd_pcm_hw_constraint_list constraints_channels = {
336		.count = ARRAY_SIZE(channels),
337		.list  = channels,
338		.mask = 0,
339	};
340
341	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
342	struct snd_pcm_runtime *runtime = substream->runtime;
343	int ret;
344
345	ret = snd_pcm_hw_constraint_list(runtime, 0,
346					 SNDRV_PCM_HW_PARAM_RATE,
347					 &constraints_rates);
348	if (ret < 0) {
349		dev_err(rtd->dev, "hw_constraint_list rate failed\n");
350		return ret;
351	}
352
353	ret = snd_pcm_hw_constraint_list(runtime, 0,
354					 SNDRV_PCM_HW_PARAM_CHANNELS,
355					 &constraints_channels);
356	if (ret < 0) {
357		dev_err(rtd->dev, "hw_constraint_list channel failed\n");
358		return ret;
359	}
360
361	return 0;
362}
363
364static const struct snd_soc_ops mt8195_hdmitx_dptx_playback_ops = {
365	.startup = mt8195_hdmitx_dptx_startup,
366};
367
368static int mt8195_dptx_hw_params(struct snd_pcm_substream *substream,
369				 struct snd_pcm_hw_params *params)
370{
371	struct snd_soc_pcm_runtime *rtd = substream->private_data;
372	struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
373
374	return snd_soc_dai_set_sysclk(cpu_dai, 0, params_rate(params) * 256,
375				      SND_SOC_CLOCK_OUT);
376}
377
378static const struct snd_soc_ops mt8195_dptx_ops = {
379	.hw_params = mt8195_dptx_hw_params,
380};
381
382static int mt8195_dptx_codec_init(struct snd_soc_pcm_runtime *rtd)
383{
384	struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
385	struct mt8195_mt6359_priv *priv = soc_card_data->mach_priv;
386	struct snd_soc_component *cmpnt_codec =
387		asoc_rtd_to_codec(rtd, 0)->component;
388	int ret;
389
390	ret = snd_soc_card_jack_new(rtd->card, "DP Jack", SND_JACK_LINEOUT,
391				    &priv->dp_jack);
392	if (ret)
393		return ret;
394
395	return snd_soc_component_set_jack(cmpnt_codec, &priv->dp_jack, NULL);
396}
397
398static int mt8195_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd)
399{
400	struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
401	struct mt8195_mt6359_priv *priv = soc_card_data->mach_priv;
402	struct snd_soc_component *cmpnt_codec =
403		asoc_rtd_to_codec(rtd, 0)->component;
404	int ret;
405
406	ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT,
407				    &priv->hdmi_jack);
408	if (ret)
409		return ret;
410
411	return snd_soc_component_set_jack(cmpnt_codec, &priv->hdmi_jack, NULL);
412}
413
414static int mt8195_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
415				       struct snd_pcm_hw_params *params)
416{
417	/* fix BE i2s format to S24_LE, clean param mask first */
418	snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
419			     0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);
420
421	params_set_format(params, SNDRV_PCM_FORMAT_S24_LE);
422
423	return 0;
424}
425
426static int mt8195_playback_startup(struct snd_pcm_substream *substream)
427{
428	static const unsigned int rates[] = {
429		48000
430	};
431	static const unsigned int channels[] = {
432		2
433	};
434	static const struct snd_pcm_hw_constraint_list constraints_rates = {
435		.count = ARRAY_SIZE(rates),
436		.list  = rates,
437		.mask = 0,
438	};
439	static const struct snd_pcm_hw_constraint_list constraints_channels = {
440		.count = ARRAY_SIZE(channels),
441		.list  = channels,
442		.mask = 0,
443	};
444
445	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
446	struct snd_pcm_runtime *runtime = substream->runtime;
447	int ret;
448
449	ret = snd_pcm_hw_constraint_list(runtime, 0,
450					 SNDRV_PCM_HW_PARAM_RATE,
451					 &constraints_rates);
452	if (ret < 0) {
453		dev_err(rtd->dev, "hw_constraint_list rate failed\n");
454		return ret;
455	}
456
457	ret = snd_pcm_hw_constraint_list(runtime, 0,
458					 SNDRV_PCM_HW_PARAM_CHANNELS,
459					 &constraints_channels);
460	if (ret < 0) {
461		dev_err(rtd->dev, "hw_constraint_list channel failed\n");
462		return ret;
463	}
464
465	return 0;
466}
467
468static const struct snd_soc_ops mt8195_playback_ops = {
469	.startup = mt8195_playback_startup,
470};
471
472static int mt8195_capture_startup(struct snd_pcm_substream *substream)
473{
474	static const unsigned int rates[] = {
475		48000
476	};
477	static const unsigned int channels[] = {
478		1, 2
479	};
480	static const struct snd_pcm_hw_constraint_list constraints_rates = {
481		.count = ARRAY_SIZE(rates),
482		.list  = rates,
483		.mask = 0,
484	};
485	static const struct snd_pcm_hw_constraint_list constraints_channels = {
486		.count = ARRAY_SIZE(channels),
487		.list  = channels,
488		.mask = 0,
489	};
490
491	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
492	struct snd_pcm_runtime *runtime = substream->runtime;
493	int ret;
494
495	ret = snd_pcm_hw_constraint_list(runtime, 0,
496					 SNDRV_PCM_HW_PARAM_RATE,
497					 &constraints_rates);
498	if (ret < 0) {
499		dev_err(rtd->dev, "hw_constraint_list rate failed\n");
500		return ret;
501	}
502
503	ret = snd_pcm_hw_constraint_list(runtime, 0,
504					 SNDRV_PCM_HW_PARAM_CHANNELS,
505					 &constraints_channels);
506	if (ret < 0) {
507		dev_err(rtd->dev, "hw_constraint_list channel failed\n");
508		return ret;
509	}
510
511	return 0;
512}
513
514static const struct snd_soc_ops mt8195_capture_ops = {
515	.startup = mt8195_capture_startup,
516};
517
518static int mt8195_rt5682_etdm_hw_params(struct snd_pcm_substream *substream,
519					struct snd_pcm_hw_params *params)
520{
521	struct snd_soc_pcm_runtime *rtd = substream->private_data;
522	struct snd_soc_card *card = rtd->card;
523	struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
524	struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
525	unsigned int rate = params_rate(params);
526	int bitwidth;
527	int ret;
528
529	bitwidth = snd_pcm_format_width(params_format(params));
530	if (bitwidth < 0) {
531		dev_err(card->dev, "invalid bit width: %d\n", bitwidth);
532		return bitwidth;
533	}
534
535	ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);
536	if (ret) {
537		dev_err(card->dev, "failed to set tdm slot\n");
538		return ret;
539	}
540
541	ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1, RT5682_PLL1_S_MCLK,
542				  rate * 256, rate * 512);
543	if (ret) {
544		dev_err(card->dev, "failed to set pll\n");
545		return ret;
546	}
547
548	ret = snd_soc_dai_set_sysclk(codec_dai, RT5682_SCLK_S_PLL1,
549				     rate * 512, SND_SOC_CLOCK_IN);
550	if (ret) {
551		dev_err(card->dev, "failed to set sysclk\n");
552		return ret;
553	}
554
555	return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 256,
556				      SND_SOC_CLOCK_OUT);
557}
558
559static const struct snd_soc_ops mt8195_rt5682_etdm_ops = {
560	.hw_params = mt8195_rt5682_etdm_hw_params,
561};
562
563static int mt8195_rt5682_init(struct snd_soc_pcm_runtime *rtd)
564{
565	struct snd_soc_component *cmpnt_codec =
566		asoc_rtd_to_codec(rtd, 0)->component;
567	struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
568	struct mt8195_mt6359_priv *priv = soc_card_data->mach_priv;
569	struct snd_soc_jack *jack = &priv->headset_jack;
570	struct snd_soc_component *cmpnt_afe =
571		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
572	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
573	struct mt8195_afe_private *afe_priv = afe->platform_priv;
574	int ret;
575
576	priv->i2so1_mclk = afe_priv->clk[MT8195_CLK_TOP_APLL12_DIV2];
577
578	ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
579				    SND_JACK_HEADSET | SND_JACK_BTN_0 |
580				    SND_JACK_BTN_1 | SND_JACK_BTN_2 |
581				    SND_JACK_BTN_3,
582				    jack, mt8195_jack_pins,
583				    ARRAY_SIZE(mt8195_jack_pins));
584	if (ret) {
585		dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
586		return ret;
587	}
588
589	snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
590	snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
591	snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
592	snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
593
594	ret = snd_soc_component_set_jack(cmpnt_codec, jack, NULL);
595	if (ret) {
596		dev_err(rtd->dev, "Headset Jack set failed: %d\n", ret);
597		return ret;
598	}
599
600	return 0;
601};
602
603static int mt8195_rt1011_etdm_hw_params(struct snd_pcm_substream *substream,
604					struct snd_pcm_hw_params *params)
605{
606	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
607	struct snd_soc_dai *codec_dai;
608	struct snd_soc_card *card = rtd->card;
609	int srate, i, ret;
610
611	srate = params_rate(params);
612
613	for_each_rtd_codec_dais(rtd, i, codec_dai) {
614		ret = snd_soc_dai_set_pll(codec_dai, 0, RT1011_PLL1_S_BCLK,
615					  64 * srate, 256 * srate);
616		if (ret < 0) {
617			dev_err(card->dev, "codec_dai clock not set\n");
618			return ret;
619		}
620
621		ret = snd_soc_dai_set_sysclk(codec_dai,
622					     RT1011_FS_SYS_PRE_S_PLL1,
623					     256 * srate, SND_SOC_CLOCK_IN);
624		if (ret < 0) {
625			dev_err(card->dev, "codec_dai clock not set\n");
626			return ret;
627		}
628	}
629	return 0;
630}
631
632static const struct snd_soc_ops mt8195_rt1011_etdm_ops = {
633	.hw_params = mt8195_rt1011_etdm_hw_params,
634};
635
636static int mt8195_sof_be_hw_params(struct snd_pcm_substream *substream,
637				   struct snd_pcm_hw_params *params)
638{
639	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
640	struct snd_soc_component *cmpnt_afe = NULL;
641	struct snd_soc_pcm_runtime *runtime;
642
643	/* find afe component */
644	for_each_card_rtds(rtd->card, runtime) {
645		cmpnt_afe = snd_soc_rtdcom_lookup(runtime, AFE_PCM_NAME);
646		if (cmpnt_afe)
647			break;
648	}
649
650	if (cmpnt_afe && !pm_runtime_active(cmpnt_afe->dev)) {
651		dev_err(rtd->dev, "afe pm runtime is not active!!\n");
652		return -EINVAL;
653	}
654
655	return 0;
656}
657
658static const struct snd_soc_ops mt8195_sof_be_ops = {
659	.hw_params = mt8195_sof_be_hw_params,
660};
661
662static int mt8195_rt1011_init(struct snd_soc_pcm_runtime *rtd)
663{
664	struct snd_soc_card *card = rtd->card;
665	int ret;
666
667	ret = snd_soc_dapm_new_controls(&card->dapm, mt8195_dual_speaker_widgets,
668					ARRAY_SIZE(mt8195_dual_speaker_widgets));
669	if (ret) {
670		dev_err(rtd->dev, "unable to add dapm controls, ret %d\n", ret);
671		/* Don't need to add routes if widget addition failed */
672		return ret;
673	}
674
675	ret = snd_soc_add_card_controls(card, mt8195_dual_speaker_controls,
676					ARRAY_SIZE(mt8195_dual_speaker_controls));
677	if (ret) {
678		dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
679		return ret;
680	}
681
682	ret = snd_soc_dapm_add_routes(&card->dapm, mt8195_rt1011_routes,
683				      ARRAY_SIZE(mt8195_rt1011_routes));
684	if (ret)
685		dev_err(rtd->dev, "unable to add dapm routes, ret %d\n", ret);
686
687	return ret;
688}
689
690static int mt8195_rt1019_init(struct snd_soc_pcm_runtime *rtd)
691{
692	struct snd_soc_card *card = rtd->card;
693	int ret;
694
695	ret = snd_soc_dapm_new_controls(&card->dapm, mt8195_speaker_widgets,
696					ARRAY_SIZE(mt8195_speaker_widgets));
697	if (ret) {
698		dev_err(rtd->dev, "unable to add dapm controls, ret %d\n", ret);
699		/* Don't need to add routes if widget addition failed */
700		return ret;
701	}
702
703	ret = snd_soc_add_card_controls(card, mt8195_speaker_controls,
704					ARRAY_SIZE(mt8195_speaker_controls));
705	if (ret) {
706		dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
707		return ret;
708	}
709
710	ret = snd_soc_dapm_add_routes(&card->dapm, mt8195_rt1019_routes,
711				      ARRAY_SIZE(mt8195_rt1019_routes));
712	if (ret)
713		dev_err(rtd->dev, "unable to add dapm routes, ret %d\n", ret);
714
715	return ret;
716}
717
718static int mt8195_max98390_init(struct snd_soc_pcm_runtime *rtd)
719{
720	struct snd_soc_card *card = rtd->card;
721	int ret;
722
723	ret = snd_soc_dapm_new_controls(&card->dapm, mt8195_dual_speaker_widgets,
724					ARRAY_SIZE(mt8195_dual_speaker_widgets));
725	if (ret) {
726		dev_err(rtd->dev, "unable to add dapm controls, ret %d\n", ret);
727		/* Don't need to add routes if widget addition failed */
728		return ret;
729	}
730
731	ret = snd_soc_add_card_controls(card, mt8195_dual_speaker_controls,
732					ARRAY_SIZE(mt8195_dual_speaker_controls));
733	if (ret) {
734		dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
735		return ret;
736	}
737
738	ret = snd_soc_dapm_add_routes(&card->dapm, mt8195_max98390_routes,
739				      ARRAY_SIZE(mt8195_max98390_routes));
740	if (ret)
741		dev_err(rtd->dev, "unable to add dapm routes, ret %d\n", ret);
742
743	return ret;
744}
745
746static int mt8195_etdm_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
747				       struct snd_pcm_hw_params *params)
748{
749	/* fix BE i2s format to S24_LE, clean param mask first */
750	snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
751			     0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);
752
753	params_set_format(params, SNDRV_PCM_FORMAT_S24_LE);
754
755	return 0;
756}
757
758static int mt8195_set_bias_level_post(struct snd_soc_card *card,
759	struct snd_soc_dapm_context *dapm, enum snd_soc_bias_level level)
760{
761	struct snd_soc_component *component = dapm->component;
762	struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card);
763	struct mt8195_mt6359_priv *priv = soc_card_data->mach_priv;
764	int ret;
765
766	/*
767	 * It's required to control mclk directly in the set_bias_level_post
768	 * function for rt5682 and rt5682s codec, or the unexpected pop happens
769	 * at the end of playback.
770	 */
771	if (!component ||
772	    (strcmp(component->name, RT5682_DEV0_NAME) &&
773	    strcmp(component->name, RT5682S_DEV0_NAME)))
774		return 0;
775
776	switch (level) {
777	case SND_SOC_BIAS_OFF:
778		if (!__clk_is_enabled(priv->i2so1_mclk))
779			return 0;
780
781		clk_disable_unprepare(priv->i2so1_mclk);
782		dev_dbg(card->dev, "Disable i2so1 mclk\n");
783		break;
784	case SND_SOC_BIAS_ON:
785		ret = clk_prepare_enable(priv->i2so1_mclk);
786		if (ret) {
787			dev_err(card->dev, "Can't enable i2so1 mclk: %d\n", ret);
788			return ret;
789		}
790		dev_dbg(card->dev, "Enable i2so1 mclk\n");
791		break;
792	default:
793		break;
794	}
795
796	return 0;
797}
798
799enum {
800	DAI_LINK_DL2_FE,
801	DAI_LINK_DL3_FE,
802	DAI_LINK_DL6_FE,
803	DAI_LINK_DL7_FE,
804	DAI_LINK_DL8_FE,
805	DAI_LINK_DL10_FE,
806	DAI_LINK_DL11_FE,
807	DAI_LINK_UL1_FE,
808	DAI_LINK_UL2_FE,
809	DAI_LINK_UL3_FE,
810	DAI_LINK_UL4_FE,
811	DAI_LINK_UL5_FE,
812	DAI_LINK_UL6_FE,
813	DAI_LINK_UL8_FE,
814	DAI_LINK_UL9_FE,
815	DAI_LINK_UL10_FE,
816	DAI_LINK_DL_SRC_BE,
817	DAI_LINK_DPTX_BE,
818	DAI_LINK_ETDM1_IN_BE,
819	DAI_LINK_ETDM2_IN_BE,
820	DAI_LINK_ETDM1_OUT_BE,
821	DAI_LINK_ETDM2_OUT_BE,
822	DAI_LINK_ETDM3_OUT_BE,
823	DAI_LINK_PCM1_BE,
824	DAI_LINK_UL_SRC1_BE,
825	DAI_LINK_UL_SRC2_BE,
826	DAI_LINK_REGULAR_LAST = DAI_LINK_UL_SRC2_BE,
827	DAI_LINK_SOF_START,
828	DAI_LINK_SOF_DL2_BE = DAI_LINK_SOF_START,
829	DAI_LINK_SOF_DL3_BE,
830	DAI_LINK_SOF_UL4_BE,
831	DAI_LINK_SOF_UL5_BE,
832	DAI_LINK_SOF_END = DAI_LINK_SOF_UL5_BE,
833};
834
835#define	DAI_LINK_REGULAR_NUM	(DAI_LINK_REGULAR_LAST + 1)
836
837/* FE */
838SND_SOC_DAILINK_DEFS(DL2_FE,
839		     DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
840		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
841		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
842
843SND_SOC_DAILINK_DEFS(DL3_FE,
844		     DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
845		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
846		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
847
848SND_SOC_DAILINK_DEFS(DL6_FE,
849		     DAILINK_COMP_ARRAY(COMP_CPU("DL6")),
850		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
851		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
852
853SND_SOC_DAILINK_DEFS(DL7_FE,
854		     DAILINK_COMP_ARRAY(COMP_CPU("DL7")),
855		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
856		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
857
858SND_SOC_DAILINK_DEFS(DL8_FE,
859		     DAILINK_COMP_ARRAY(COMP_CPU("DL8")),
860		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
861		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
862
863SND_SOC_DAILINK_DEFS(DL10_FE,
864		     DAILINK_COMP_ARRAY(COMP_CPU("DL10")),
865		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
866		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
867
868SND_SOC_DAILINK_DEFS(DL11_FE,
869		     DAILINK_COMP_ARRAY(COMP_CPU("DL11")),
870		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
871		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
872
873SND_SOC_DAILINK_DEFS(UL1_FE,
874		     DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
875		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
876		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
877
878SND_SOC_DAILINK_DEFS(UL2_FE,
879		     DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
880		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
881		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
882
883SND_SOC_DAILINK_DEFS(UL3_FE,
884		     DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
885		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
886		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
887
888SND_SOC_DAILINK_DEFS(UL4_FE,
889		     DAILINK_COMP_ARRAY(COMP_CPU("UL4")),
890		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
891		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
892
893SND_SOC_DAILINK_DEFS(UL5_FE,
894		     DAILINK_COMP_ARRAY(COMP_CPU("UL5")),
895		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
896		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
897
898SND_SOC_DAILINK_DEFS(UL6_FE,
899		     DAILINK_COMP_ARRAY(COMP_CPU("UL6")),
900		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
901		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
902
903SND_SOC_DAILINK_DEFS(UL8_FE,
904		     DAILINK_COMP_ARRAY(COMP_CPU("UL8")),
905		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
906		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
907
908SND_SOC_DAILINK_DEFS(UL9_FE,
909		     DAILINK_COMP_ARRAY(COMP_CPU("UL9")),
910		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
911		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
912
913SND_SOC_DAILINK_DEFS(UL10_FE,
914		     DAILINK_COMP_ARRAY(COMP_CPU("UL10")),
915		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
916		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
917
918/* BE */
919SND_SOC_DAILINK_DEFS(DL_SRC_BE,
920		     DAILINK_COMP_ARRAY(COMP_CPU("DL_SRC")),
921		     DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
922						   "mt6359-snd-codec-aif1")),
923		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
924
925SND_SOC_DAILINK_DEFS(DPTX_BE,
926		     DAILINK_COMP_ARRAY(COMP_CPU("DPTX")),
927		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
928		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
929
930SND_SOC_DAILINK_DEFS(ETDM1_IN_BE,
931		     DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_IN")),
932		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
933		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
934
935SND_SOC_DAILINK_DEFS(ETDM2_IN_BE,
936		     DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_IN")),
937		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
938		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
939
940SND_SOC_DAILINK_DEFS(ETDM1_OUT_BE,
941		     DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_OUT")),
942		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
943		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
944
945SND_SOC_DAILINK_DEFS(ETDM2_OUT_BE,
946		     DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_OUT")),
947		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
948		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
949
950SND_SOC_DAILINK_DEFS(ETDM3_OUT_BE,
951		     DAILINK_COMP_ARRAY(COMP_CPU("ETDM3_OUT")),
952		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
953		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
954
955SND_SOC_DAILINK_DEFS(PCM1_BE,
956		     DAILINK_COMP_ARRAY(COMP_CPU("PCM1")),
957		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
958		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
959
960SND_SOC_DAILINK_DEFS(UL_SRC1_BE,
961		     DAILINK_COMP_ARRAY(COMP_CPU("UL_SRC1")),
962		     DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
963						   "mt6359-snd-codec-aif1"),
964					COMP_CODEC("dmic-codec",
965						   "dmic-hifi")),
966		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
967
968SND_SOC_DAILINK_DEFS(UL_SRC2_BE,
969		     DAILINK_COMP_ARRAY(COMP_CPU("UL_SRC2")),
970		     DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
971						   "mt6359-snd-codec-aif2")),
972		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
973
974SND_SOC_DAILINK_DEFS(AFE_SOF_DL2,
975		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL2")),
976		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
977		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
978
979SND_SOC_DAILINK_DEFS(AFE_SOF_DL3,
980		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL3")),
981		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
982		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
983
984SND_SOC_DAILINK_DEFS(AFE_SOF_UL4,
985		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL4")),
986		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
987		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
988
989SND_SOC_DAILINK_DEFS(AFE_SOF_UL5,
990		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL5")),
991		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
992		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
993
994/* codec */
995SND_SOC_DAILINK_DEF(rt1019_comps,
996		    DAILINK_COMP_ARRAY(COMP_CODEC(RT1019_DEV0_NAME,
997						  RT1019_CODEC_DAI)));
998
999SND_SOC_DAILINK_DEF(rt1011_comps,
1000		    DAILINK_COMP_ARRAY(COMP_CODEC(RT1011_DEV0_NAME,
1001						  RT1011_CODEC_DAI),
1002				       COMP_CODEC(RT1011_DEV1_NAME,
1003						  RT1011_CODEC_DAI)));
1004
1005SND_SOC_DAILINK_DEF(max98390_comps,
1006		    DAILINK_COMP_ARRAY(COMP_CODEC(MAX98390_DEV0_NAME,
1007						  MAX98390_CODEC_DAI),
1008				       COMP_CODEC(MAX98390_DEV1_NAME,
1009						  MAX98390_CODEC_DAI)));
1010
1011static const struct sof_conn_stream g_sof_conn_streams[] = {
1012	{ "ETDM2_OUT_BE", "AFE_SOF_DL2", SOF_DMA_DL2, SNDRV_PCM_STREAM_PLAYBACK},
1013	{ "ETDM1_OUT_BE", "AFE_SOF_DL3", SOF_DMA_DL3, SNDRV_PCM_STREAM_PLAYBACK},
1014	{ "UL_SRC1_BE", "AFE_SOF_UL4", SOF_DMA_UL4, SNDRV_PCM_STREAM_CAPTURE},
1015	{ "ETDM2_IN_BE", "AFE_SOF_UL5", SOF_DMA_UL5, SNDRV_PCM_STREAM_CAPTURE},
1016};
1017
1018static struct snd_soc_dai_link mt8195_mt6359_dai_links[] = {
1019	/* FE */
1020	[DAI_LINK_DL2_FE] = {
1021		.name = "DL2_FE",
1022		.stream_name = "DL2 Playback",
1023		.trigger = {
1024			SND_SOC_DPCM_TRIGGER_POST,
1025			SND_SOC_DPCM_TRIGGER_POST,
1026		},
1027		.dynamic = 1,
1028		.dpcm_playback = 1,
1029		.ops = &mt8195_playback_ops,
1030		SND_SOC_DAILINK_REG(DL2_FE),
1031	},
1032	[DAI_LINK_DL3_FE] = {
1033		.name = "DL3_FE",
1034		.stream_name = "DL3 Playback",
1035		.trigger = {
1036			SND_SOC_DPCM_TRIGGER_POST,
1037			SND_SOC_DPCM_TRIGGER_POST,
1038		},
1039		.dynamic = 1,
1040		.dpcm_playback = 1,
1041		.ops = &mt8195_playback_ops,
1042		SND_SOC_DAILINK_REG(DL3_FE),
1043	},
1044	[DAI_LINK_DL6_FE] = {
1045		.name = "DL6_FE",
1046		.stream_name = "DL6 Playback",
1047		.trigger = {
1048			SND_SOC_DPCM_TRIGGER_POST,
1049			SND_SOC_DPCM_TRIGGER_POST,
1050		},
1051		.dynamic = 1,
1052		.dpcm_playback = 1,
1053		.ops = &mt8195_playback_ops,
1054		SND_SOC_DAILINK_REG(DL6_FE),
1055	},
1056	[DAI_LINK_DL7_FE] = {
1057		.name = "DL7_FE",
1058		.stream_name = "DL7 Playback",
1059		.trigger = {
1060			SND_SOC_DPCM_TRIGGER_PRE,
1061			SND_SOC_DPCM_TRIGGER_PRE,
1062		},
1063		.dynamic = 1,
1064		.dpcm_playback = 1,
1065		SND_SOC_DAILINK_REG(DL7_FE),
1066	},
1067	[DAI_LINK_DL8_FE] = {
1068		.name = "DL8_FE",
1069		.stream_name = "DL8 Playback",
1070		.trigger = {
1071			SND_SOC_DPCM_TRIGGER_POST,
1072			SND_SOC_DPCM_TRIGGER_POST,
1073		},
1074		.dynamic = 1,
1075		.dpcm_playback = 1,
1076		.ops = &mt8195_playback_ops,
1077		SND_SOC_DAILINK_REG(DL8_FE),
1078	},
1079	[DAI_LINK_DL10_FE] = {
1080		.name = "DL10_FE",
1081		.stream_name = "DL10 Playback",
1082		.trigger = {
1083			SND_SOC_DPCM_TRIGGER_POST,
1084			SND_SOC_DPCM_TRIGGER_POST,
1085		},
1086		.dynamic = 1,
1087		.dpcm_playback = 1,
1088		.ops = &mt8195_hdmitx_dptx_playback_ops,
1089		SND_SOC_DAILINK_REG(DL10_FE),
1090	},
1091	[DAI_LINK_DL11_FE] = {
1092		.name = "DL11_FE",
1093		.stream_name = "DL11 Playback",
1094		.trigger = {
1095			SND_SOC_DPCM_TRIGGER_POST,
1096			SND_SOC_DPCM_TRIGGER_POST,
1097		},
1098		.dynamic = 1,
1099		.dpcm_playback = 1,
1100		.ops = &mt8195_playback_ops,
1101		SND_SOC_DAILINK_REG(DL11_FE),
1102	},
1103	[DAI_LINK_UL1_FE] = {
1104		.name = "UL1_FE",
1105		.stream_name = "UL1 Capture",
1106		.trigger = {
1107			SND_SOC_DPCM_TRIGGER_PRE,
1108			SND_SOC_DPCM_TRIGGER_PRE,
1109		},
1110		.dynamic = 1,
1111		.dpcm_capture = 1,
1112		SND_SOC_DAILINK_REG(UL1_FE),
1113	},
1114	[DAI_LINK_UL2_FE] = {
1115		.name = "UL2_FE",
1116		.stream_name = "UL2 Capture",
1117		.trigger = {
1118			SND_SOC_DPCM_TRIGGER_POST,
1119			SND_SOC_DPCM_TRIGGER_POST,
1120		},
1121		.dynamic = 1,
1122		.dpcm_capture = 1,
1123		.ops = &mt8195_capture_ops,
1124		SND_SOC_DAILINK_REG(UL2_FE),
1125	},
1126	[DAI_LINK_UL3_FE] = {
1127		.name = "UL3_FE",
1128		.stream_name = "UL3 Capture",
1129		.trigger = {
1130			SND_SOC_DPCM_TRIGGER_POST,
1131			SND_SOC_DPCM_TRIGGER_POST,
1132		},
1133		.dynamic = 1,
1134		.dpcm_capture = 1,
1135		.ops = &mt8195_capture_ops,
1136		SND_SOC_DAILINK_REG(UL3_FE),
1137	},
1138	[DAI_LINK_UL4_FE] = {
1139		.name = "UL4_FE",
1140		.stream_name = "UL4 Capture",
1141		.trigger = {
1142			SND_SOC_DPCM_TRIGGER_POST,
1143			SND_SOC_DPCM_TRIGGER_POST,
1144		},
1145		.dynamic = 1,
1146		.dpcm_capture = 1,
1147		.ops = &mt8195_capture_ops,
1148		SND_SOC_DAILINK_REG(UL4_FE),
1149	},
1150	[DAI_LINK_UL5_FE] = {
1151		.name = "UL5_FE",
1152		.stream_name = "UL5 Capture",
1153		.trigger = {
1154			SND_SOC_DPCM_TRIGGER_POST,
1155			SND_SOC_DPCM_TRIGGER_POST,
1156		},
1157		.dynamic = 1,
1158		.dpcm_capture = 1,
1159		.ops = &mt8195_capture_ops,
1160		SND_SOC_DAILINK_REG(UL5_FE),
1161	},
1162	[DAI_LINK_UL6_FE] = {
1163		.name = "UL6_FE",
1164		.stream_name = "UL6 Capture",
1165		.trigger = {
1166			SND_SOC_DPCM_TRIGGER_PRE,
1167			SND_SOC_DPCM_TRIGGER_PRE,
1168		},
1169		.dynamic = 1,
1170		.dpcm_capture = 1,
1171		SND_SOC_DAILINK_REG(UL6_FE),
1172	},
1173	[DAI_LINK_UL8_FE] = {
1174		.name = "UL8_FE",
1175		.stream_name = "UL8 Capture",
1176		.trigger = {
1177			SND_SOC_DPCM_TRIGGER_POST,
1178			SND_SOC_DPCM_TRIGGER_POST,
1179		},
1180		.dynamic = 1,
1181		.dpcm_capture = 1,
1182		.ops = &mt8195_capture_ops,
1183		SND_SOC_DAILINK_REG(UL8_FE),
1184	},
1185	[DAI_LINK_UL9_FE] = {
1186		.name = "UL9_FE",
1187		.stream_name = "UL9 Capture",
1188		.trigger = {
1189			SND_SOC_DPCM_TRIGGER_POST,
1190			SND_SOC_DPCM_TRIGGER_POST,
1191		},
1192		.dynamic = 1,
1193		.dpcm_capture = 1,
1194		.ops = &mt8195_capture_ops,
1195		SND_SOC_DAILINK_REG(UL9_FE),
1196	},
1197	[DAI_LINK_UL10_FE] = {
1198		.name = "UL10_FE",
1199		.stream_name = "UL10 Capture",
1200		.trigger = {
1201			SND_SOC_DPCM_TRIGGER_POST,
1202			SND_SOC_DPCM_TRIGGER_POST,
1203		},
1204		.dynamic = 1,
1205		.dpcm_capture = 1,
1206		.ops = &mt8195_capture_ops,
1207		SND_SOC_DAILINK_REG(UL10_FE),
1208	},
1209	/* BE */
1210	[DAI_LINK_DL_SRC_BE] = {
1211		.name = "DL_SRC_BE",
1212		.no_pcm = 1,
1213		.dpcm_playback = 1,
1214		SND_SOC_DAILINK_REG(DL_SRC_BE),
1215	},
1216	[DAI_LINK_DPTX_BE] = {
1217		.name = "DPTX_BE",
1218		.no_pcm = 1,
1219		.dpcm_playback = 1,
1220		.ops = &mt8195_dptx_ops,
1221		.be_hw_params_fixup = mt8195_dptx_hw_params_fixup,
1222		SND_SOC_DAILINK_REG(DPTX_BE),
1223	},
1224	[DAI_LINK_ETDM1_IN_BE] = {
1225		.name = "ETDM1_IN_BE",
1226		.no_pcm = 1,
1227		.dai_fmt = SND_SOC_DAIFMT_I2S |
1228			SND_SOC_DAIFMT_NB_NF |
1229			SND_SOC_DAIFMT_CBS_CFS,
1230		.dpcm_capture = 1,
1231		SND_SOC_DAILINK_REG(ETDM1_IN_BE),
1232	},
1233	[DAI_LINK_ETDM2_IN_BE] = {
1234		.name = "ETDM2_IN_BE",
1235		.no_pcm = 1,
1236		.dai_fmt = SND_SOC_DAIFMT_I2S |
1237			SND_SOC_DAIFMT_NB_NF |
1238			SND_SOC_DAIFMT_CBS_CFS,
1239		.dpcm_capture = 1,
1240		.init = mt8195_rt5682_init,
1241		.ops = &mt8195_rt5682_etdm_ops,
1242		.be_hw_params_fixup = mt8195_etdm_hw_params_fixup,
1243		SND_SOC_DAILINK_REG(ETDM2_IN_BE),
1244	},
1245	[DAI_LINK_ETDM1_OUT_BE] = {
1246		.name = "ETDM1_OUT_BE",
1247		.no_pcm = 1,
1248		.dai_fmt = SND_SOC_DAIFMT_I2S |
1249			SND_SOC_DAIFMT_NB_NF |
1250			SND_SOC_DAIFMT_CBS_CFS,
1251		.dpcm_playback = 1,
1252		.ops = &mt8195_rt5682_etdm_ops,
1253		.be_hw_params_fixup = mt8195_etdm_hw_params_fixup,
1254		SND_SOC_DAILINK_REG(ETDM1_OUT_BE),
1255	},
1256	[DAI_LINK_ETDM2_OUT_BE] = {
1257		.name = "ETDM2_OUT_BE",
1258		.no_pcm = 1,
1259		.dai_fmt = SND_SOC_DAIFMT_I2S |
1260			SND_SOC_DAIFMT_NB_NF |
1261			SND_SOC_DAIFMT_CBS_CFS,
1262		.dpcm_playback = 1,
1263		SND_SOC_DAILINK_REG(ETDM2_OUT_BE),
1264	},
1265	[DAI_LINK_ETDM3_OUT_BE] = {
1266		.name = "ETDM3_OUT_BE",
1267		.no_pcm = 1,
1268		.dai_fmt = SND_SOC_DAIFMT_I2S |
1269			SND_SOC_DAIFMT_NB_NF |
1270			SND_SOC_DAIFMT_CBS_CFS,
1271		.dpcm_playback = 1,
1272		SND_SOC_DAILINK_REG(ETDM3_OUT_BE),
1273	},
1274	[DAI_LINK_PCM1_BE] = {
1275		.name = "PCM1_BE",
1276		.no_pcm = 1,
1277		.dai_fmt = SND_SOC_DAIFMT_I2S |
1278			SND_SOC_DAIFMT_NB_NF |
1279			SND_SOC_DAIFMT_CBS_CFS,
1280		.dpcm_playback = 1,
1281		.dpcm_capture = 1,
1282		SND_SOC_DAILINK_REG(PCM1_BE),
1283	},
1284	[DAI_LINK_UL_SRC1_BE] = {
1285		.name = "UL_SRC1_BE",
1286		.no_pcm = 1,
1287		.dpcm_capture = 1,
1288		SND_SOC_DAILINK_REG(UL_SRC1_BE),
1289	},
1290	[DAI_LINK_UL_SRC2_BE] = {
1291		.name = "UL_SRC2_BE",
1292		.no_pcm = 1,
1293		.dpcm_capture = 1,
1294		SND_SOC_DAILINK_REG(UL_SRC2_BE),
1295	},
1296	/* SOF BE */
1297	[DAI_LINK_SOF_DL2_BE] = {
1298		.name = "AFE_SOF_DL2",
1299		.no_pcm = 1,
1300		.dpcm_playback = 1,
1301		.ops = &mt8195_sof_be_ops,
1302		SND_SOC_DAILINK_REG(AFE_SOF_DL2),
1303	},
1304	[DAI_LINK_SOF_DL3_BE] = {
1305		.name = "AFE_SOF_DL3",
1306		.no_pcm = 1,
1307		.dpcm_playback = 1,
1308		.ops = &mt8195_sof_be_ops,
1309		SND_SOC_DAILINK_REG(AFE_SOF_DL3),
1310	},
1311	[DAI_LINK_SOF_UL4_BE] = {
1312		.name = "AFE_SOF_UL4",
1313		.no_pcm = 1,
1314		.dpcm_capture = 1,
1315		.ops = &mt8195_sof_be_ops,
1316		SND_SOC_DAILINK_REG(AFE_SOF_UL4),
1317	},
1318	[DAI_LINK_SOF_UL5_BE] = {
1319		.name = "AFE_SOF_UL5",
1320		.no_pcm = 1,
1321		.dpcm_capture = 1,
1322		.ops = &mt8195_sof_be_ops,
1323		SND_SOC_DAILINK_REG(AFE_SOF_UL5),
1324	},
1325};
1326
1327static struct snd_soc_codec_conf rt1011_codec_conf[] = {
1328	{
1329		.dlc = COMP_CODEC_CONF(RT1011_DEV0_NAME),
1330		.name_prefix = "Left",
1331	},
1332	{
1333		.dlc = COMP_CODEC_CONF(RT1011_DEV1_NAME),
1334		.name_prefix = "Right",
1335	},
1336};
1337
1338static struct snd_soc_codec_conf max98390_codec_conf[] = {
1339	{
1340		.dlc = COMP_CODEC_CONF(MAX98390_DEV0_NAME),
1341		.name_prefix = "Right",
1342	},
1343	{
1344		.dlc = COMP_CODEC_CONF(MAX98390_DEV1_NAME),
1345		.name_prefix = "Left",
1346	},
1347};
1348
1349static struct snd_soc_card mt8195_mt6359_soc_card = {
1350	.owner = THIS_MODULE,
1351	.dai_link = mt8195_mt6359_dai_links,
1352	.num_links = ARRAY_SIZE(mt8195_mt6359_dai_links),
1353	.controls = mt8195_mt6359_controls,
1354	.num_controls = ARRAY_SIZE(mt8195_mt6359_controls),
1355	.dapm_widgets = mt8195_mt6359_widgets,
1356	.num_dapm_widgets = ARRAY_SIZE(mt8195_mt6359_widgets),
1357	.dapm_routes = mt8195_mt6359_routes,
1358	.num_dapm_routes = ARRAY_SIZE(mt8195_mt6359_routes),
1359	.set_bias_level_post = mt8195_set_bias_level_post,
1360};
1361
1362/* fixup the BE DAI link to match any values from topology */
1363static int mt8195_dai_link_fixup(struct snd_soc_pcm_runtime *rtd,
1364				 struct snd_pcm_hw_params *params)
1365{
1366	int ret;
1367
1368	ret = mtk_sof_dai_link_fixup(rtd, params);
1369
1370	if (!strcmp(rtd->dai_link->name, "ETDM2_IN_BE") ||
1371	    !strcmp(rtd->dai_link->name, "ETDM1_OUT_BE")) {
1372		mt8195_etdm_hw_params_fixup(rtd, params);
1373	}
1374
1375	return ret;
1376}
1377
1378static int mt8195_mt6359_dev_probe(struct platform_device *pdev)
1379{
1380	struct snd_soc_card *card = &mt8195_mt6359_soc_card;
1381	struct snd_soc_dai_link *dai_link;
1382	struct mtk_soc_card_data *soc_card_data;
1383	struct mt8195_mt6359_priv *mach_priv;
1384	struct device_node *platform_node, *adsp_node, *dp_node, *hdmi_node;
1385	struct mt8195_card_data *card_data;
1386	int is5682s = 0;
1387	int init6359 = 0;
1388	int sof_on = 0;
1389	int ret, i;
1390
1391	card_data = (struct mt8195_card_data *)of_device_get_match_data(&pdev->dev);
1392	card->dev = &pdev->dev;
1393
1394	ret = snd_soc_of_parse_card_name(card, "model");
1395	if (ret) {
1396		dev_err(&pdev->dev, "%s new card name parsing error %d\n",
1397			__func__, ret);
1398		return ret;
1399	}
1400
1401	if (!card->name)
1402		card->name = card_data->name;
1403
1404	if (strstr(card->name, "_5682s"))
1405		is5682s = 1;
1406	soc_card_data = devm_kzalloc(&pdev->dev, sizeof(*card_data), GFP_KERNEL);
1407	if (!soc_card_data)
1408		return -ENOMEM;
1409
1410	mach_priv = devm_kzalloc(&pdev->dev, sizeof(*mach_priv), GFP_KERNEL);
1411	if (!mach_priv)
1412		return -ENOMEM;
1413
1414	soc_card_data->mach_priv = mach_priv;
1415
1416	adsp_node = of_parse_phandle(pdev->dev.of_node, "mediatek,adsp", 0);
1417	if (adsp_node) {
1418		struct mtk_sof_priv *sof_priv;
1419
1420		sof_priv = devm_kzalloc(&pdev->dev, sizeof(*sof_priv), GFP_KERNEL);
1421		if (!sof_priv) {
1422			ret = -ENOMEM;
1423			goto err_kzalloc;
1424		}
1425		sof_priv->conn_streams = g_sof_conn_streams;
1426		sof_priv->num_streams = ARRAY_SIZE(g_sof_conn_streams);
1427		sof_priv->sof_dai_link_fixup = mt8195_dai_link_fixup;
1428		soc_card_data->sof_priv = sof_priv;
1429		card->probe = mtk_sof_card_probe;
1430		card->late_probe = mtk_sof_card_late_probe;
1431		if (!card->topology_shortname_created) {
1432			snprintf(card->topology_shortname, 32, "sof-%s", card->name);
1433			card->topology_shortname_created = true;
1434		}
1435		card->name = card->topology_shortname;
1436		sof_on = 1;
1437	}
1438
1439	if (of_property_read_bool(pdev->dev.of_node, "mediatek,dai-link")) {
1440		ret = mtk_sof_dailink_parse_of(card, pdev->dev.of_node,
1441					       "mediatek,dai-link",
1442					       mt8195_mt6359_dai_links,
1443					       ARRAY_SIZE(mt8195_mt6359_dai_links));
1444		if (ret) {
1445			dev_dbg(&pdev->dev, "Parse dai-link fail\n");
1446			goto err_parse_of;
1447		}
1448	} else {
1449		if (!sof_on)
1450			card->num_links = DAI_LINK_REGULAR_NUM;
1451	}
1452
1453	platform_node = of_parse_phandle(pdev->dev.of_node,
1454					 "mediatek,platform", 0);
1455	if (!platform_node) {
1456		dev_dbg(&pdev->dev, "Property 'platform' missing or invalid\n");
1457		ret = -EINVAL;
1458		goto err_platform_node;
1459	}
1460
1461	dp_node = of_parse_phandle(pdev->dev.of_node, "mediatek,dptx-codec", 0);
1462	hdmi_node = of_parse_phandle(pdev->dev.of_node,
1463				     "mediatek,hdmi-codec", 0);
1464
1465	for_each_card_prelinks(card, i, dai_link) {
1466		if (!dai_link->platforms->name) {
1467			if (!strncmp(dai_link->name, "AFE_SOF", strlen("AFE_SOF")) && sof_on)
1468				dai_link->platforms->of_node = adsp_node;
1469			else
1470				dai_link->platforms->of_node = platform_node;
1471		}
1472
1473		if (strcmp(dai_link->name, "DPTX_BE") == 0) {
1474			if (!dp_node) {
1475				dev_dbg(&pdev->dev, "No property 'dptx-codec'\n");
1476			} else {
1477				dai_link->codecs->of_node = dp_node;
1478				dai_link->codecs->name = NULL;
1479				dai_link->codecs->dai_name = "i2s-hifi";
1480				dai_link->init = mt8195_dptx_codec_init;
1481			}
1482		} else if (strcmp(dai_link->name, "ETDM3_OUT_BE") == 0) {
1483			if (!hdmi_node) {
1484				dev_dbg(&pdev->dev, "No property 'hdmi-codec'\n");
1485			} else {
1486				dai_link->codecs->of_node = hdmi_node;
1487				dai_link->codecs->name = NULL;
1488				dai_link->codecs->dai_name = "i2s-hifi";
1489				dai_link->init = mt8195_hdmi_codec_init;
1490			}
1491		} else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0 ||
1492			   strcmp(dai_link->name, "ETDM2_IN_BE") == 0) {
1493			dai_link->codecs->name =
1494				is5682s ? RT5682S_DEV0_NAME : RT5682_DEV0_NAME;
1495			dai_link->codecs->dai_name =
1496				is5682s ? RT5682S_CODEC_DAI : RT5682_CODEC_DAI;
1497		} else if (strcmp(dai_link->name, "DL_SRC_BE") == 0 ||
1498			   strcmp(dai_link->name, "UL_SRC1_BE") == 0 ||
1499			   strcmp(dai_link->name, "UL_SRC2_BE") == 0) {
1500			if (!init6359) {
1501				dai_link->init = mt8195_mt6359_init;
1502				init6359 = 1;
1503			}
1504		} else if (strcmp(dai_link->name, "ETDM2_OUT_BE") == 0) {
1505			switch (card_data->quirk) {
1506			case RT1011_SPEAKER_AMP_PRESENT:
1507				dai_link->codecs = rt1011_comps;
1508				dai_link->num_codecs = ARRAY_SIZE(rt1011_comps);
1509				dai_link->init = mt8195_rt1011_init;
1510				dai_link->ops = &mt8195_rt1011_etdm_ops;
1511				dai_link->be_hw_params_fixup = mt8195_etdm_hw_params_fixup;
1512				card->codec_conf = rt1011_codec_conf;
1513				card->num_configs = ARRAY_SIZE(rt1011_codec_conf);
1514				break;
1515			case RT1019_SPEAKER_AMP_PRESENT:
1516				dai_link->codecs = rt1019_comps;
1517				dai_link->num_codecs = ARRAY_SIZE(rt1019_comps);
1518				dai_link->init = mt8195_rt1019_init;
1519				break;
1520			case MAX98390_SPEAKER_AMP_PRESENT:
1521				dai_link->codecs = max98390_comps;
1522				dai_link->num_codecs = ARRAY_SIZE(max98390_comps);
1523				dai_link->init = mt8195_max98390_init;
1524				card->codec_conf = max98390_codec_conf;
1525				card->num_configs = ARRAY_SIZE(max98390_codec_conf);
1526				break;
1527			default:
1528				break;
1529			}
1530		}
1531	}
1532
1533	snd_soc_card_set_drvdata(card, soc_card_data);
1534
1535	ret = devm_snd_soc_register_card(&pdev->dev, card);
1536
1537	of_node_put(platform_node);
1538	of_node_put(dp_node);
1539	of_node_put(hdmi_node);
1540err_kzalloc:
1541err_parse_of:
1542err_platform_node:
1543	of_node_put(adsp_node);
1544	return ret;
1545}
1546
1547static struct mt8195_card_data mt8195_mt6359_rt1019_rt5682_card = {
1548	.name = "mt8195_r1019_5682",
1549	.quirk = RT1019_SPEAKER_AMP_PRESENT,
1550};
1551
1552static struct mt8195_card_data mt8195_mt6359_rt1011_rt5682_card = {
1553	.name = "mt8195_r1011_5682",
1554	.quirk = RT1011_SPEAKER_AMP_PRESENT,
1555};
1556
1557static struct mt8195_card_data mt8195_mt6359_max98390_rt5682_card = {
1558	.name = "mt8195_m98390_r5682",
1559	.quirk = MAX98390_SPEAKER_AMP_PRESENT,
1560};
1561
1562static const struct of_device_id mt8195_mt6359_dt_match[] = {
1563	{
1564		.compatible = "mediatek,mt8195_mt6359_rt1019_rt5682",
1565		.data = &mt8195_mt6359_rt1019_rt5682_card,
1566	},
1567	{
1568		.compatible = "mediatek,mt8195_mt6359_rt1011_rt5682",
1569		.data = &mt8195_mt6359_rt1011_rt5682_card,
1570	},
1571	{
1572		.compatible = "mediatek,mt8195_mt6359_max98390_rt5682",
1573		.data = &mt8195_mt6359_max98390_rt5682_card,
1574	},
1575	{},
1576};
1577MODULE_DEVICE_TABLE(of, mt8195_mt6359_dt_match);
1578
1579static struct platform_driver mt8195_mt6359_driver = {
1580	.driver = {
1581		.name = "mt8195_mt6359",
1582		.of_match_table = mt8195_mt6359_dt_match,
1583		.pm = &snd_soc_pm_ops,
1584	},
1585	.probe = mt8195_mt6359_dev_probe,
1586};
1587
1588module_platform_driver(mt8195_mt6359_driver);
1589
1590/* Module information */
1591MODULE_DESCRIPTION("MT8195-MT6359 ALSA SoC machine driver");
1592MODULE_AUTHOR("Trevor Wu <trevor.wu@mediatek.com>");
1593MODULE_AUTHOR("YC Hung <yc.hung@mediatek.com>");
1594MODULE_LICENSE("GPL");
1595MODULE_ALIAS("mt8195_mt6359 soc card");
1596