1 // SPDX-License-Identifier: GPL-2.0
3 * mt8188-mt6359.c -- MT8188-MT6359 ALSA SoC machine driver
5 * Copyright (c) 2022 MediaTek Inc.
6 * Author: Trevor Wu <trevor.wu@mediatek.com>
9 #include <linux/bitfield.h>
10 #include <linux/input.h>
11 #include <linux/module.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"
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)
35 #define NAU8825_HS_PRESENT BIT(0)
36 #define RT5682S_HS_PRESENT BIT(1)
40 #define MAX98390_CODEC_DAI "max98390-aif1"
41 #define MAX98390_DEV0_NAME "max98390.0-0038" /* rear right */
42 #define MAX98390_DEV1_NAME "max98390.0-0039" /* rear left */
43 #define MAX98390_DEV2_NAME "max98390.0-003a" /* front right */
44 #define MAX98390_DEV3_NAME "max98390.0-003b" /* front left */
49 #define NAU8825_CODEC_DAI "nau8825-hifi"
51 #define SOF_DMA_DL2 "SOF_DMA_DL2"
52 #define SOF_DMA_DL3 "SOF_DMA_DL3"
53 #define SOF_DMA_UL4 "SOF_DMA_UL4"
54 #define SOF_DMA_UL5 "SOF_DMA_UL5"
56 #define RT5682S_CODEC_DAI "rt5682s-aif1"
59 SND_SOC_DAILINK_DEFS(playback2,
60 DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
61 DAILINK_COMP_ARRAY(COMP_DUMMY()),
62 DAILINK_COMP_ARRAY(COMP_EMPTY()));
64 SND_SOC_DAILINK_DEFS(playback3,
65 DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
66 DAILINK_COMP_ARRAY(COMP_DUMMY()),
67 DAILINK_COMP_ARRAY(COMP_EMPTY()));
69 SND_SOC_DAILINK_DEFS(playback6,
70 DAILINK_COMP_ARRAY(COMP_CPU("DL6")),
71 DAILINK_COMP_ARRAY(COMP_DUMMY()),
72 DAILINK_COMP_ARRAY(COMP_EMPTY()));
74 SND_SOC_DAILINK_DEFS(playback7,
75 DAILINK_COMP_ARRAY(COMP_CPU("DL7")),
76 DAILINK_COMP_ARRAY(COMP_DUMMY()),
77 DAILINK_COMP_ARRAY(COMP_EMPTY()));
79 SND_SOC_DAILINK_DEFS(playback8,
80 DAILINK_COMP_ARRAY(COMP_CPU("DL8")),
81 DAILINK_COMP_ARRAY(COMP_DUMMY()),
82 DAILINK_COMP_ARRAY(COMP_EMPTY()));
84 SND_SOC_DAILINK_DEFS(playback10,
85 DAILINK_COMP_ARRAY(COMP_CPU("DL10")),
86 DAILINK_COMP_ARRAY(COMP_DUMMY()),
87 DAILINK_COMP_ARRAY(COMP_EMPTY()));
89 SND_SOC_DAILINK_DEFS(playback11,
90 DAILINK_COMP_ARRAY(COMP_CPU("DL11")),
91 DAILINK_COMP_ARRAY(COMP_DUMMY()),
92 DAILINK_COMP_ARRAY(COMP_EMPTY()));
94 SND_SOC_DAILINK_DEFS(capture1,
95 DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
96 DAILINK_COMP_ARRAY(COMP_DUMMY()),
97 DAILINK_COMP_ARRAY(COMP_EMPTY()));
99 SND_SOC_DAILINK_DEFS(capture2,
100 DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
101 DAILINK_COMP_ARRAY(COMP_DUMMY()),
102 DAILINK_COMP_ARRAY(COMP_EMPTY()));
104 SND_SOC_DAILINK_DEFS(capture3,
105 DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
106 DAILINK_COMP_ARRAY(COMP_DUMMY()),
107 DAILINK_COMP_ARRAY(COMP_EMPTY()));
109 SND_SOC_DAILINK_DEFS(capture4,
110 DAILINK_COMP_ARRAY(COMP_CPU("UL4")),
111 DAILINK_COMP_ARRAY(COMP_DUMMY()),
112 DAILINK_COMP_ARRAY(COMP_EMPTY()));
114 SND_SOC_DAILINK_DEFS(capture5,
115 DAILINK_COMP_ARRAY(COMP_CPU("UL5")),
116 DAILINK_COMP_ARRAY(COMP_DUMMY()),
117 DAILINK_COMP_ARRAY(COMP_EMPTY()));
119 SND_SOC_DAILINK_DEFS(capture6,
120 DAILINK_COMP_ARRAY(COMP_CPU("UL6")),
121 DAILINK_COMP_ARRAY(COMP_DUMMY()),
122 DAILINK_COMP_ARRAY(COMP_EMPTY()));
124 SND_SOC_DAILINK_DEFS(capture8,
125 DAILINK_COMP_ARRAY(COMP_CPU("UL8")),
126 DAILINK_COMP_ARRAY(COMP_DUMMY()),
127 DAILINK_COMP_ARRAY(COMP_EMPTY()));
129 SND_SOC_DAILINK_DEFS(capture9,
130 DAILINK_COMP_ARRAY(COMP_CPU("UL9")),
131 DAILINK_COMP_ARRAY(COMP_DUMMY()),
132 DAILINK_COMP_ARRAY(COMP_EMPTY()));
134 SND_SOC_DAILINK_DEFS(capture10,
135 DAILINK_COMP_ARRAY(COMP_CPU("UL10")),
136 DAILINK_COMP_ARRAY(COMP_DUMMY()),
137 DAILINK_COMP_ARRAY(COMP_EMPTY()));
140 SND_SOC_DAILINK_DEFS(dl_src,
141 DAILINK_COMP_ARRAY(COMP_CPU("DL_SRC")),
142 DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
143 "mt6359-snd-codec-aif1")),
144 DAILINK_COMP_ARRAY(COMP_EMPTY()));
146 SND_SOC_DAILINK_DEFS(dptx,
147 DAILINK_COMP_ARRAY(COMP_CPU("DPTX")),
148 DAILINK_COMP_ARRAY(COMP_DUMMY()),
149 DAILINK_COMP_ARRAY(COMP_EMPTY()));
151 SND_SOC_DAILINK_DEFS(etdm1_in,
152 DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_IN")),
153 DAILINK_COMP_ARRAY(COMP_DUMMY()),
154 DAILINK_COMP_ARRAY(COMP_EMPTY()));
156 SND_SOC_DAILINK_DEFS(etdm2_in,
157 DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_IN")),
158 DAILINK_COMP_ARRAY(COMP_DUMMY()),
159 DAILINK_COMP_ARRAY(COMP_EMPTY()));
161 SND_SOC_DAILINK_DEFS(etdm1_out,
162 DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_OUT")),
163 DAILINK_COMP_ARRAY(COMP_DUMMY()),
164 DAILINK_COMP_ARRAY(COMP_EMPTY()));
166 SND_SOC_DAILINK_DEFS(etdm2_out,
167 DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_OUT")),
168 DAILINK_COMP_ARRAY(COMP_DUMMY()),
169 DAILINK_COMP_ARRAY(COMP_EMPTY()));
171 SND_SOC_DAILINK_DEFS(etdm3_out,
172 DAILINK_COMP_ARRAY(COMP_CPU("ETDM3_OUT")),
173 DAILINK_COMP_ARRAY(COMP_DUMMY()),
174 DAILINK_COMP_ARRAY(COMP_EMPTY()));
176 SND_SOC_DAILINK_DEFS(pcm1,
177 DAILINK_COMP_ARRAY(COMP_CPU("PCM1")),
178 DAILINK_COMP_ARRAY(COMP_DUMMY()),
179 DAILINK_COMP_ARRAY(COMP_EMPTY()));
181 SND_SOC_DAILINK_DEFS(ul_src,
182 DAILINK_COMP_ARRAY(COMP_CPU("UL_SRC")),
183 DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
184 "mt6359-snd-codec-aif1"),
185 COMP_CODEC("dmic-codec",
187 DAILINK_COMP_ARRAY(COMP_EMPTY()));
189 SND_SOC_DAILINK_DEFS(AFE_SOF_DL2,
190 DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL2")),
191 DAILINK_COMP_ARRAY(COMP_DUMMY()),
192 DAILINK_COMP_ARRAY(COMP_EMPTY()));
194 SND_SOC_DAILINK_DEFS(AFE_SOF_DL3,
195 DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL3")),
196 DAILINK_COMP_ARRAY(COMP_DUMMY()),
197 DAILINK_COMP_ARRAY(COMP_EMPTY()));
199 SND_SOC_DAILINK_DEFS(AFE_SOF_UL4,
200 DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL4")),
201 DAILINK_COMP_ARRAY(COMP_DUMMY()),
202 DAILINK_COMP_ARRAY(COMP_EMPTY()));
204 SND_SOC_DAILINK_DEFS(AFE_SOF_UL5,
205 DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL5")),
206 DAILINK_COMP_ARRAY(COMP_DUMMY()),
207 DAILINK_COMP_ARRAY(COMP_EMPTY()));
209 static const struct sof_conn_stream g_sof_conn_streams[] = {
211 .sof_link = "AFE_SOF_DL2",
212 .sof_dma = SOF_DMA_DL2,
213 .stream_dir = SNDRV_PCM_STREAM_PLAYBACK
216 .sof_link = "AFE_SOF_DL3",
217 .sof_dma = SOF_DMA_DL3,
218 .stream_dir = SNDRV_PCM_STREAM_PLAYBACK
221 .sof_link = "AFE_SOF_UL4",
222 .sof_dma = SOF_DMA_UL4,
223 .stream_dir = SNDRV_PCM_STREAM_CAPTURE
226 .sof_link = "AFE_SOF_UL5",
227 .sof_dma = SOF_DMA_UL5,
228 .stream_dir = SNDRV_PCM_STREAM_CAPTURE
232 struct mt8188_mt6359_priv {
233 struct snd_soc_jack dp_jack;
234 struct snd_soc_jack hdmi_jack;
235 struct snd_soc_jack headset_jack;
239 static struct snd_soc_jack_pin mt8188_hdmi_jack_pins[] = {
242 .mask = SND_JACK_LINEOUT,
246 static struct snd_soc_jack_pin mt8188_dp_jack_pins[] = {
249 .mask = SND_JACK_LINEOUT,
253 static struct snd_soc_jack_pin nau8825_jack_pins[] = {
255 .pin = "Headphone Jack",
256 .mask = SND_JACK_HEADPHONE,
259 .pin = "Headset Mic",
260 .mask = SND_JACK_MICROPHONE,
264 struct mt8188_card_data {
269 static const struct snd_kcontrol_new mt8188_dumb_spk_controls[] = {
270 SOC_DAPM_PIN_SWITCH("Ext Spk"),
273 static const struct snd_soc_dapm_widget mt8188_dumb_spk_widgets[] = {
274 SND_SOC_DAPM_SPK("Ext Spk", NULL),
277 static const struct snd_kcontrol_new mt8188_dual_spk_controls[] = {
278 SOC_DAPM_PIN_SWITCH("Left Spk"),
279 SOC_DAPM_PIN_SWITCH("Right Spk"),
282 static const struct snd_soc_dapm_widget mt8188_dual_spk_widgets[] = {
283 SND_SOC_DAPM_SPK("Left Spk", NULL),
284 SND_SOC_DAPM_SPK("Right Spk", NULL),
287 static const struct snd_kcontrol_new mt8188_rear_spk_controls[] = {
288 SOC_DAPM_PIN_SWITCH("Rear Left Spk"),
289 SOC_DAPM_PIN_SWITCH("Rear Right Spk"),
292 static const struct snd_soc_dapm_widget mt8188_rear_spk_widgets[] = {
293 SND_SOC_DAPM_SPK("Rear Left Spk", NULL),
294 SND_SOC_DAPM_SPK("Rear Right Spk", NULL),
297 static const struct snd_soc_dapm_widget mt8188_mt6359_widgets[] = {
298 SND_SOC_DAPM_HP("Headphone", NULL),
299 SND_SOC_DAPM_MIC("Headset Mic", NULL),
300 SND_SOC_DAPM_SINK("HDMI"),
301 SND_SOC_DAPM_SINK("DP"),
302 SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0),
303 SND_SOC_DAPM_MIXER(SOF_DMA_DL3, SND_SOC_NOPM, 0, 0, NULL, 0),
304 SND_SOC_DAPM_MIXER(SOF_DMA_UL4, SND_SOC_NOPM, 0, 0, NULL, 0),
305 SND_SOC_DAPM_MIXER(SOF_DMA_UL5, SND_SOC_NOPM, 0, 0, NULL, 0),
307 /* dynamic pinctrl */
308 SND_SOC_DAPM_PINCTRL("ETDM_SPK_PIN", "aud_etdm_spk_on", "aud_etdm_spk_off"),
309 SND_SOC_DAPM_PINCTRL("ETDM_HP_PIN", "aud_etdm_hp_on", "aud_etdm_hp_off"),
310 SND_SOC_DAPM_PINCTRL("MTKAIF_PIN", "aud_mtkaif_on", "aud_mtkaif_off"),
313 static const struct snd_kcontrol_new mt8188_mt6359_controls[] = {
314 SOC_DAPM_PIN_SWITCH("Headphone"),
315 SOC_DAPM_PIN_SWITCH("Headset Mic"),
318 static const struct snd_soc_dapm_widget mt8188_nau8825_widgets[] = {
319 SND_SOC_DAPM_HP("Headphone Jack", NULL),
322 static const struct snd_kcontrol_new mt8188_nau8825_controls[] = {
323 SOC_DAPM_PIN_SWITCH("Headphone Jack"),
326 static const struct snd_soc_dapm_route mt8188_mt6359_routes[] = {
328 {SOF_DMA_UL4, NULL, "O034"},
329 {SOF_DMA_UL4, NULL, "O035"},
330 {SOF_DMA_UL5, NULL, "O036"},
331 {SOF_DMA_UL5, NULL, "O037"},
333 {"I070", NULL, SOF_DMA_DL2},
334 {"I071", NULL, SOF_DMA_DL2},
335 {"I020", NULL, SOF_DMA_DL3},
336 {"I021", NULL, SOF_DMA_DL3},
339 static int mt8188_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd)
341 struct snd_soc_component *cmpnt_afe =
342 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
343 struct snd_soc_component *cmpnt_codec =
344 snd_soc_rtd_to_codec(rtd, 0)->component;
345 struct snd_soc_dapm_widget *pin_w = NULL, *w;
346 struct mtk_base_afe *afe;
347 struct mt8188_afe_private *afe_priv;
348 struct mtkaif_param *param;
349 int chosen_phase_1, chosen_phase_2;
350 int prev_cycle_1, prev_cycle_2;
351 u8 test_done_1, test_done_2;
352 int cycle_1, cycle_2;
353 int mtkaif_chosen_phase[MT8188_MTKAIF_MISO_NUM];
354 int mtkaif_phase_cycle[MT8188_MTKAIF_MISO_NUM];
355 int mtkaif_calibration_num_phase;
356 bool mtkaif_calibration_ok;
365 afe = snd_soc_component_get_drvdata(cmpnt_afe);
366 afe_priv = afe->platform_priv;
367 param = &afe_priv->mtkaif_params;
369 dev_dbg(afe->dev, "%s(), start\n", __func__);
371 param->mtkaif_calibration_ok = false;
372 for (i = 0; i < MT8188_MTKAIF_MISO_NUM; i++) {
373 param->mtkaif_chosen_phase[i] = -1;
374 param->mtkaif_phase_cycle[i] = 0;
375 mtkaif_chosen_phase[i] = -1;
376 mtkaif_phase_cycle[i] = 0;
379 if (IS_ERR(afe_priv->topckgen)) {
380 dev_info(afe->dev, "%s() Cannot find topckgen controller\n",
385 for_each_card_widgets(rtd->card, w) {
386 if (!strcmp(w->name, "MTKAIF_PIN")) {
393 dapm_pinctrl_event(pin_w, NULL, SND_SOC_DAPM_PRE_PMU);
395 dev_dbg(afe->dev, "%s(), no pinmux widget, please check if default on\n", __func__);
397 pm_runtime_get_sync(afe->dev);
398 mt6359_mtkaif_calibration_enable(cmpnt_codec);
400 /* set test type to synchronizer pulse */
401 regmap_write(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_TYPE);
402 mtkaif_calibration_num_phase = 42; /* mt6359: 0 ~ 42 */
403 mtkaif_calibration_ok = true;
406 phase <= mtkaif_calibration_num_phase && mtkaif_calibration_ok;
408 mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
409 phase, phase, phase);
411 regmap_set_bits(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_ON);
420 while (!(test_done_1 & test_done_2)) {
421 regmap_read(afe_priv->topckgen,
422 CKSYS_AUD_TOP_MON, &monitor);
423 test_done_1 = FIELD_GET(TEST_MISO_DONE_1, monitor);
424 test_done_2 = FIELD_GET(TEST_MISO_DONE_2, monitor);
426 if (test_done_1 == 1)
427 cycle_1 = FIELD_GET(TEST_MISO_COUNT_1, monitor);
429 if (test_done_2 == 1)
430 cycle_2 = FIELD_GET(TEST_MISO_COUNT_2, monitor);
432 /* handle if never test done */
433 if (++counter > 10000) {
434 dev_err(afe->dev, "%s(), test fail, cycle_1 %d, cycle_2 %d, monitor 0x%x\n",
435 __func__, cycle_1, cycle_2, monitor);
436 mtkaif_calibration_ok = false;
442 prev_cycle_1 = cycle_1;
443 prev_cycle_2 = cycle_2;
446 if (cycle_1 != prev_cycle_1 &&
447 mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] < 0) {
448 mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] = phase - 1;
449 mtkaif_phase_cycle[MT8188_MTKAIF_MISO_0] = prev_cycle_1;
452 if (cycle_2 != prev_cycle_2 &&
453 mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] < 0) {
454 mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] = phase - 1;
455 mtkaif_phase_cycle[MT8188_MTKAIF_MISO_1] = prev_cycle_2;
458 regmap_clear_bits(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_ON);
460 if (mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] >= 0 &&
461 mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] >= 0)
465 if (mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] < 0) {
466 mtkaif_calibration_ok = false;
469 chosen_phase_1 = mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0];
472 if (mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] < 0) {
473 mtkaif_calibration_ok = false;
476 chosen_phase_2 = mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1];
479 mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
484 mt6359_mtkaif_calibration_disable(cmpnt_codec);
485 pm_runtime_put(afe->dev);
487 param->mtkaif_calibration_ok = mtkaif_calibration_ok;
488 param->mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] = chosen_phase_1;
489 param->mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] = chosen_phase_2;
491 for (i = 0; i < MT8188_MTKAIF_MISO_NUM; i++)
492 param->mtkaif_phase_cycle[i] = mtkaif_phase_cycle[i];
495 dapm_pinctrl_event(pin_w, NULL, SND_SOC_DAPM_POST_PMD);
497 dev_dbg(afe->dev, "%s(), end, calibration ok %d\n",
498 __func__, param->mtkaif_calibration_ok);
503 static int mt8188_mt6359_init(struct snd_soc_pcm_runtime *rtd)
505 struct snd_soc_component *cmpnt_codec =
506 snd_soc_rtd_to_codec(rtd, 0)->component;
508 /* set mtkaif protocol */
509 mt6359_set_mtkaif_protocol(cmpnt_codec,
510 MT6359_MTKAIF_PROTOCOL_2_CLK_P2);
512 /* mtkaif calibration */
513 mt8188_mt6359_mtkaif_calibration(rtd);
537 DAI_LINK_ETDM1_IN_BE,
538 DAI_LINK_ETDM2_IN_BE,
539 DAI_LINK_ETDM1_OUT_BE,
540 DAI_LINK_ETDM2_OUT_BE,
541 DAI_LINK_ETDM3_OUT_BE,
544 DAI_LINK_REGULAR_LAST = DAI_LINK_UL_SRC_BE,
546 DAI_LINK_SOF_DL2_BE = DAI_LINK_SOF_START,
550 DAI_LINK_SOF_END = DAI_LINK_SOF_UL5_BE,
553 #define DAI_LINK_REGULAR_NUM (DAI_LINK_REGULAR_LAST + 1)
555 static int mt8188_dptx_hw_params(struct snd_pcm_substream *substream,
556 struct snd_pcm_hw_params *params)
558 struct snd_soc_pcm_runtime *rtd = substream->private_data;
559 unsigned int rate = params_rate(params);
560 unsigned int mclk_fs_ratio = 256;
561 unsigned int mclk_fs = rate * mclk_fs_ratio;
562 struct snd_soc_dai *dai = snd_soc_rtd_to_cpu(rtd, 0);
564 return snd_soc_dai_set_sysclk(dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
567 static const struct snd_soc_ops mt8188_dptx_ops = {
568 .hw_params = mt8188_dptx_hw_params,
571 static int mt8188_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
572 struct snd_pcm_hw_params *params)
574 /* fix BE i2s format to 32bit, clean param mask first */
575 snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
576 0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);
578 params_set_format(params, SNDRV_PCM_FORMAT_S32_LE);
583 static int mt8188_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd)
585 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
586 struct mt8188_mt6359_priv *priv = soc_card_data->mach_priv;
587 struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
590 ret = snd_soc_card_jack_new_pins(rtd->card, "HDMI Jack",
591 SND_JACK_LINEOUT, &priv->hdmi_jack,
592 mt8188_hdmi_jack_pins,
593 ARRAY_SIZE(mt8188_hdmi_jack_pins));
595 dev_err(rtd->dev, "%s, new jack failed: %d\n", __func__, ret);
599 ret = snd_soc_component_set_jack(component, &priv->hdmi_jack, NULL);
601 dev_err(rtd->dev, "%s, set jack failed on %s (ret=%d)\n",
602 __func__, component->name, ret);
609 static int mt8188_dptx_codec_init(struct snd_soc_pcm_runtime *rtd)
611 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
612 struct mt8188_mt6359_priv *priv = soc_card_data->mach_priv;
613 struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
616 ret = snd_soc_card_jack_new_pins(rtd->card, "DP Jack", SND_JACK_LINEOUT,
617 &priv->dp_jack, mt8188_dp_jack_pins,
618 ARRAY_SIZE(mt8188_dp_jack_pins));
620 dev_err(rtd->dev, "%s, new jack failed: %d\n", __func__, ret);
624 ret = snd_soc_component_set_jack(component, &priv->dp_jack, NULL);
626 dev_err(rtd->dev, "%s, set jack failed on %s (ret=%d)\n",
627 __func__, component->name, ret);
634 static int mt8188_dumb_amp_init(struct snd_soc_pcm_runtime *rtd)
636 struct snd_soc_card *card = rtd->card;
639 ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_dumb_spk_widgets,
640 ARRAY_SIZE(mt8188_dumb_spk_widgets));
642 dev_err(rtd->dev, "unable to add Dumb Speaker dapm, ret %d\n", ret);
646 ret = snd_soc_add_card_controls(card, mt8188_dumb_spk_controls,
647 ARRAY_SIZE(mt8188_dumb_spk_controls));
649 dev_err(rtd->dev, "unable to add Dumb card controls, ret %d\n", ret);
656 static int mt8188_max98390_hw_params(struct snd_pcm_substream *substream,
657 struct snd_pcm_hw_params *params)
659 struct snd_soc_pcm_runtime *rtd = substream->private_data;
660 unsigned int bit_width = params_width(params);
661 struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
662 struct snd_soc_dai *codec_dai;
665 snd_soc_dai_set_tdm_slot(cpu_dai, 0xf, 0xf, 4, bit_width);
667 for_each_rtd_codec_dais(rtd, i, codec_dai) {
668 if (!strcmp(codec_dai->component->name, MAX98390_DEV0_NAME))
669 snd_soc_dai_set_tdm_slot(codec_dai, 0x8, 0x3, 4, bit_width);
671 if (!strcmp(codec_dai->component->name, MAX98390_DEV1_NAME))
672 snd_soc_dai_set_tdm_slot(codec_dai, 0x4, 0x3, 4, bit_width);
674 if (!strcmp(codec_dai->component->name, MAX98390_DEV2_NAME))
675 snd_soc_dai_set_tdm_slot(codec_dai, 0x2, 0x3, 4, bit_width);
677 if (!strcmp(codec_dai->component->name, MAX98390_DEV3_NAME))
678 snd_soc_dai_set_tdm_slot(codec_dai, 0x1, 0x3, 4, bit_width);
683 static const struct snd_soc_ops mt8188_max98390_ops = {
684 .hw_params = mt8188_max98390_hw_params,
687 static int mt8188_max98390_codec_init(struct snd_soc_pcm_runtime *rtd)
689 struct snd_soc_card *card = rtd->card;
692 /* add regular speakers dapm route */
693 ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_dual_spk_widgets,
694 ARRAY_SIZE(mt8188_dual_spk_widgets));
696 dev_err(rtd->dev, "unable to add Left/Right Speaker widget, ret %d\n", ret);
700 ret = snd_soc_add_card_controls(card, mt8188_dual_spk_controls,
701 ARRAY_SIZE(mt8188_dual_spk_controls));
703 dev_err(rtd->dev, "unable to add Left/Right card controls, ret %d\n", ret);
707 if (rtd->dai_link->num_codecs <= 2)
710 /* add widgets/controls/dapm for rear speakers */
711 ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_rear_spk_widgets,
712 ARRAY_SIZE(mt8188_rear_spk_widgets));
714 dev_err(rtd->dev, "unable to add Rear Speaker widget, ret %d\n", ret);
715 /* Don't need to add routes if widget addition failed */
719 ret = snd_soc_add_card_controls(card, mt8188_rear_spk_controls,
720 ARRAY_SIZE(mt8188_rear_spk_controls));
722 dev_err(rtd->dev, "unable to add Rear card controls, ret %d\n", ret);
729 static int mt8188_nau8825_codec_init(struct snd_soc_pcm_runtime *rtd)
731 struct snd_soc_card *card = rtd->card;
732 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card);
733 struct mt8188_mt6359_priv *priv = soc_card_data->mach_priv;
734 struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
735 struct snd_soc_jack *jack = &priv->headset_jack;
738 ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_nau8825_widgets,
739 ARRAY_SIZE(mt8188_nau8825_widgets));
741 dev_err(rtd->dev, "unable to add nau8825 card widget, ret %d\n", ret);
745 ret = snd_soc_add_card_controls(card, mt8188_nau8825_controls,
746 ARRAY_SIZE(mt8188_nau8825_controls));
748 dev_err(rtd->dev, "unable to add nau8825 card controls, ret %d\n", ret);
752 ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
753 SND_JACK_HEADSET | SND_JACK_BTN_0 |
754 SND_JACK_BTN_1 | SND_JACK_BTN_2 |
758 ARRAY_SIZE(nau8825_jack_pins));
760 dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
764 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
765 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
766 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
767 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
768 ret = snd_soc_component_set_jack(component, jack, NULL);
771 dev_err(rtd->dev, "Headset Jack call-back failed: %d\n", ret);
778 static int mt8188_rt5682s_codec_init(struct snd_soc_pcm_runtime *rtd)
780 struct snd_soc_card *card = rtd->card;
781 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card);
782 struct mt8188_mt6359_priv *priv = soc_card_data->mach_priv;
783 struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
784 struct snd_soc_jack *jack = &priv->headset_jack;
787 ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_nau8825_widgets,
788 ARRAY_SIZE(mt8188_nau8825_widgets));
790 dev_err(rtd->dev, "unable to add rt5682s card widget, ret %d\n", ret);
794 ret = snd_soc_add_card_controls(card, mt8188_nau8825_controls,
795 ARRAY_SIZE(mt8188_nau8825_controls));
797 dev_err(rtd->dev, "unable to add rt5682s card controls, ret %d\n", ret);
801 ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
802 SND_JACK_HEADSET | SND_JACK_BTN_0 |
803 SND_JACK_BTN_1 | SND_JACK_BTN_2 |
807 ARRAY_SIZE(nau8825_jack_pins));
809 dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
813 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
814 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
815 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
816 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
817 ret = snd_soc_component_set_jack(component, jack, NULL);
820 dev_err(rtd->dev, "Headset Jack call-back failed: %d\n", ret);
827 static void mt8188_nau8825_codec_exit(struct snd_soc_pcm_runtime *rtd)
829 struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
831 snd_soc_component_set_jack(component, NULL, NULL);
834 static void mt8188_rt5682s_codec_exit(struct snd_soc_pcm_runtime *rtd)
836 struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
838 snd_soc_component_set_jack(component, NULL, NULL);
841 static int mt8188_nau8825_hw_params(struct snd_pcm_substream *substream,
842 struct snd_pcm_hw_params *params)
844 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
845 struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
846 unsigned int rate = params_rate(params);
847 unsigned int bit_width = params_width(params);
850 clk_freq = rate * 2 * bit_width;
852 /* Configure clock for codec */
853 ret = snd_soc_dai_set_sysclk(codec_dai, NAU8825_CLK_FLL_BLK, 0,
856 dev_err(codec_dai->dev, "can't set BCLK clock %d\n", ret);
860 /* Configure pll for codec */
861 ret = snd_soc_dai_set_pll(codec_dai, 0, 0, clk_freq,
862 params_rate(params) * 256);
864 dev_err(codec_dai->dev, "can't set BCLK: %d\n", ret);
871 static const struct snd_soc_ops mt8188_nau8825_ops = {
872 .hw_params = mt8188_nau8825_hw_params,
875 static int mt8188_rt5682s_i2s_hw_params(struct snd_pcm_substream *substream,
876 struct snd_pcm_hw_params *params)
878 struct snd_soc_pcm_runtime *rtd = substream->private_data;
879 struct snd_soc_card *card = rtd->card;
880 struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
881 struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
882 unsigned int rate = params_rate(params);
886 bitwidth = snd_pcm_format_width(params_format(params));
888 dev_err(card->dev, "invalid bit width: %d\n", bitwidth);
892 ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);
894 dev_err(card->dev, "failed to set tdm slot\n");
898 ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1, RT5682_PLL1_S_BCLK1,
899 rate * 32, rate * 512);
901 dev_err(card->dev, "failed to set pll\n");
905 ret = snd_soc_dai_set_sysclk(codec_dai, RT5682_SCLK_S_PLL1,
906 rate * 512, SND_SOC_CLOCK_IN);
908 dev_err(card->dev, "failed to set sysclk\n");
912 return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 128,
916 static const struct snd_soc_ops mt8188_rt5682s_i2s_ops = {
917 .hw_params = mt8188_rt5682s_i2s_hw_params,
920 static int mt8188_sof_be_hw_params(struct snd_pcm_substream *substream,
921 struct snd_pcm_hw_params *params)
923 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
924 struct snd_soc_component *cmpnt_afe = NULL;
925 struct snd_soc_pcm_runtime *runtime;
927 /* find afe component */
928 for_each_card_rtds(rtd->card, runtime) {
929 cmpnt_afe = snd_soc_rtdcom_lookup(runtime, AFE_PCM_NAME);
934 if (cmpnt_afe && !pm_runtime_active(cmpnt_afe->dev)) {
935 dev_err(rtd->dev, "afe pm runtime is not active!!\n");
942 static const struct snd_soc_ops mt8188_sof_be_ops = {
943 .hw_params = mt8188_sof_be_hw_params,
946 static struct snd_soc_dai_link mt8188_mt6359_dai_links[] = {
948 [DAI_LINK_DL2_FE] = {
950 .stream_name = "DL2 Playback",
952 SND_SOC_DPCM_TRIGGER_POST,
953 SND_SOC_DPCM_TRIGGER_POST,
957 .dpcm_merged_chan = 1,
958 .dpcm_merged_rate = 1,
959 .dpcm_merged_format = 1,
960 SND_SOC_DAILINK_REG(playback2),
962 [DAI_LINK_DL3_FE] = {
964 .stream_name = "DL3 Playback",
966 SND_SOC_DPCM_TRIGGER_POST,
967 SND_SOC_DPCM_TRIGGER_POST,
971 .dpcm_merged_chan = 1,
972 .dpcm_merged_rate = 1,
973 .dpcm_merged_format = 1,
974 SND_SOC_DAILINK_REG(playback3),
976 [DAI_LINK_DL6_FE] = {
978 .stream_name = "DL6 Playback",
980 SND_SOC_DPCM_TRIGGER_POST,
981 SND_SOC_DPCM_TRIGGER_POST,
985 .dpcm_merged_chan = 1,
986 .dpcm_merged_rate = 1,
987 .dpcm_merged_format = 1,
988 SND_SOC_DAILINK_REG(playback6),
990 [DAI_LINK_DL7_FE] = {
992 .stream_name = "DL7 Playback",
994 SND_SOC_DPCM_TRIGGER_PRE,
995 SND_SOC_DPCM_TRIGGER_PRE,
999 SND_SOC_DAILINK_REG(playback7),
1001 [DAI_LINK_DL8_FE] = {
1003 .stream_name = "DL8 Playback",
1005 SND_SOC_DPCM_TRIGGER_POST,
1006 SND_SOC_DPCM_TRIGGER_POST,
1010 SND_SOC_DAILINK_REG(playback8),
1012 [DAI_LINK_DL10_FE] = {
1014 .stream_name = "DL10 Playback",
1016 SND_SOC_DPCM_TRIGGER_POST,
1017 SND_SOC_DPCM_TRIGGER_POST,
1021 SND_SOC_DAILINK_REG(playback10),
1023 [DAI_LINK_DL11_FE] = {
1025 .stream_name = "DL11 Playback",
1027 SND_SOC_DPCM_TRIGGER_POST,
1028 SND_SOC_DPCM_TRIGGER_POST,
1032 SND_SOC_DAILINK_REG(playback11),
1034 [DAI_LINK_UL1_FE] = {
1036 .stream_name = "UL1 Capture",
1038 SND_SOC_DPCM_TRIGGER_PRE,
1039 SND_SOC_DPCM_TRIGGER_PRE,
1043 SND_SOC_DAILINK_REG(capture1),
1045 [DAI_LINK_UL2_FE] = {
1047 .stream_name = "UL2 Capture",
1049 SND_SOC_DPCM_TRIGGER_POST,
1050 SND_SOC_DPCM_TRIGGER_POST,
1054 SND_SOC_DAILINK_REG(capture2),
1056 [DAI_LINK_UL3_FE] = {
1058 .stream_name = "UL3 Capture",
1060 SND_SOC_DPCM_TRIGGER_POST,
1061 SND_SOC_DPCM_TRIGGER_POST,
1065 SND_SOC_DAILINK_REG(capture3),
1067 [DAI_LINK_UL4_FE] = {
1069 .stream_name = "UL4 Capture",
1071 SND_SOC_DPCM_TRIGGER_POST,
1072 SND_SOC_DPCM_TRIGGER_POST,
1076 .dpcm_merged_chan = 1,
1077 .dpcm_merged_rate = 1,
1078 .dpcm_merged_format = 1,
1079 SND_SOC_DAILINK_REG(capture4),
1081 [DAI_LINK_UL5_FE] = {
1083 .stream_name = "UL5 Capture",
1085 SND_SOC_DPCM_TRIGGER_POST,
1086 SND_SOC_DPCM_TRIGGER_POST,
1090 .dpcm_merged_chan = 1,
1091 .dpcm_merged_rate = 1,
1092 .dpcm_merged_format = 1,
1093 SND_SOC_DAILINK_REG(capture5),
1095 [DAI_LINK_UL6_FE] = {
1097 .stream_name = "UL6 Capture",
1099 SND_SOC_DPCM_TRIGGER_PRE,
1100 SND_SOC_DPCM_TRIGGER_PRE,
1104 SND_SOC_DAILINK_REG(capture6),
1106 [DAI_LINK_UL8_FE] = {
1108 .stream_name = "UL8 Capture",
1110 SND_SOC_DPCM_TRIGGER_POST,
1111 SND_SOC_DPCM_TRIGGER_POST,
1115 SND_SOC_DAILINK_REG(capture8),
1117 [DAI_LINK_UL9_FE] = {
1119 .stream_name = "UL9 Capture",
1121 SND_SOC_DPCM_TRIGGER_POST,
1122 SND_SOC_DPCM_TRIGGER_POST,
1126 SND_SOC_DAILINK_REG(capture9),
1128 [DAI_LINK_UL10_FE] = {
1130 .stream_name = "UL10 Capture",
1132 SND_SOC_DPCM_TRIGGER_POST,
1133 SND_SOC_DPCM_TRIGGER_POST,
1137 SND_SOC_DAILINK_REG(capture10),
1140 [DAI_LINK_DL_SRC_BE] = {
1141 .name = "DL_SRC_BE",
1144 SND_SOC_DAILINK_REG(dl_src),
1146 [DAI_LINK_DPTX_BE] = {
1148 .ops = &mt8188_dptx_ops,
1149 .be_hw_params_fixup = mt8188_dptx_hw_params_fixup,
1152 SND_SOC_DAILINK_REG(dptx),
1154 [DAI_LINK_ETDM1_IN_BE] = {
1155 .name = "ETDM1_IN_BE",
1157 .dai_fmt = SND_SOC_DAIFMT_I2S |
1158 SND_SOC_DAIFMT_NB_NF |
1159 SND_SOC_DAIFMT_CBP_CFP,
1161 .ignore_suspend = 1,
1162 SND_SOC_DAILINK_REG(etdm1_in),
1164 [DAI_LINK_ETDM2_IN_BE] = {
1165 .name = "ETDM2_IN_BE",
1167 .dai_fmt = SND_SOC_DAIFMT_I2S |
1168 SND_SOC_DAIFMT_NB_NF |
1169 SND_SOC_DAIFMT_CBP_CFP,
1171 SND_SOC_DAILINK_REG(etdm2_in),
1173 [DAI_LINK_ETDM1_OUT_BE] = {
1174 .name = "ETDM1_OUT_BE",
1176 .dai_fmt = SND_SOC_DAIFMT_I2S |
1177 SND_SOC_DAIFMT_NB_NF |
1178 SND_SOC_DAIFMT_CBC_CFC,
1180 SND_SOC_DAILINK_REG(etdm1_out),
1182 [DAI_LINK_ETDM2_OUT_BE] = {
1183 .name = "ETDM2_OUT_BE",
1185 .dai_fmt = SND_SOC_DAIFMT_I2S |
1186 SND_SOC_DAIFMT_NB_NF |
1187 SND_SOC_DAIFMT_CBC_CFC,
1189 SND_SOC_DAILINK_REG(etdm2_out),
1191 [DAI_LINK_ETDM3_OUT_BE] = {
1192 .name = "ETDM3_OUT_BE",
1194 .dai_fmt = SND_SOC_DAIFMT_I2S |
1195 SND_SOC_DAIFMT_NB_NF |
1196 SND_SOC_DAIFMT_CBC_CFC,
1198 SND_SOC_DAILINK_REG(etdm3_out),
1200 [DAI_LINK_PCM1_BE] = {
1203 .dai_fmt = SND_SOC_DAIFMT_I2S |
1204 SND_SOC_DAIFMT_NB_NF |
1205 SND_SOC_DAIFMT_CBC_CFC,
1208 SND_SOC_DAILINK_REG(pcm1),
1210 [DAI_LINK_UL_SRC_BE] = {
1211 .name = "UL_SRC_BE",
1214 SND_SOC_DAILINK_REG(ul_src),
1218 [DAI_LINK_SOF_DL2_BE] = {
1219 .name = "AFE_SOF_DL2",
1222 .ops = &mt8188_sof_be_ops,
1223 SND_SOC_DAILINK_REG(AFE_SOF_DL2),
1225 [DAI_LINK_SOF_DL3_BE] = {
1226 .name = "AFE_SOF_DL3",
1229 .ops = &mt8188_sof_be_ops,
1230 SND_SOC_DAILINK_REG(AFE_SOF_DL3),
1232 [DAI_LINK_SOF_UL4_BE] = {
1233 .name = "AFE_SOF_UL4",
1236 .ops = &mt8188_sof_be_ops,
1237 SND_SOC_DAILINK_REG(AFE_SOF_UL4),
1239 [DAI_LINK_SOF_UL5_BE] = {
1240 .name = "AFE_SOF_UL5",
1243 .ops = &mt8188_sof_be_ops,
1244 SND_SOC_DAILINK_REG(AFE_SOF_UL5),
1248 static void mt8188_fixup_controls(struct snd_soc_card *card)
1250 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card);
1251 struct mt8188_mt6359_priv *priv = soc_card_data->mach_priv;
1252 struct mt8188_card_data *card_data = (struct mt8188_card_data *)priv->private_data;
1253 struct snd_kcontrol *kctl;
1255 if (card_data->quirk & (NAU8825_HS_PRESENT | RT5682S_HS_PRESENT)) {
1256 struct snd_soc_dapm_widget *w, *next_w;
1258 for_each_card_widgets_safe(card, w, next_w) {
1259 if (strcmp(w->name, "Headphone"))
1262 snd_soc_dapm_free_widget(w);
1265 kctl = snd_ctl_find_id_mixer(card->snd_card, "Headphone Switch");
1267 snd_ctl_remove(card->snd_card, kctl);
1269 dev_warn(card->dev, "Cannot find ctl : Headphone Switch\n");
1273 static struct snd_soc_card mt8188_mt6359_soc_card = {
1274 .owner = THIS_MODULE,
1275 .dai_link = mt8188_mt6359_dai_links,
1276 .num_links = ARRAY_SIZE(mt8188_mt6359_dai_links),
1277 .dapm_widgets = mt8188_mt6359_widgets,
1278 .num_dapm_widgets = ARRAY_SIZE(mt8188_mt6359_widgets),
1279 .dapm_routes = mt8188_mt6359_routes,
1280 .num_dapm_routes = ARRAY_SIZE(mt8188_mt6359_routes),
1281 .controls = mt8188_mt6359_controls,
1282 .num_controls = ARRAY_SIZE(mt8188_mt6359_controls),
1283 .fixup_controls = mt8188_fixup_controls,
1286 static int mt8188_mt6359_dev_probe(struct platform_device *pdev)
1288 struct snd_soc_card *card = &mt8188_mt6359_soc_card;
1289 struct device_node *platform_node;
1290 struct device_node *adsp_node;
1291 struct mtk_soc_card_data *soc_card_data;
1292 struct mt8188_mt6359_priv *priv;
1293 struct mt8188_card_data *card_data;
1294 struct snd_soc_dai_link *dai_link;
1295 bool init_mt6359 = false;
1296 bool init_nau8825 = false;
1297 bool init_rt5682s = false;
1298 bool init_max98390 = false;
1299 bool init_dumb = false;
1302 card_data = (struct mt8188_card_data *)of_device_get_match_data(&pdev->dev);
1303 card->dev = &pdev->dev;
1305 ret = snd_soc_of_parse_card_name(card, "model");
1307 return dev_err_probe(&pdev->dev, ret, "%s new card name parsing error\n",
1311 card->name = card_data->name;
1313 if (of_property_read_bool(pdev->dev.of_node, "audio-routing")) {
1314 ret = snd_soc_of_parse_audio_routing(card, "audio-routing");
1319 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
1323 soc_card_data = devm_kzalloc(&pdev->dev, sizeof(*card_data), GFP_KERNEL);
1327 soc_card_data->mach_priv = priv;
1329 adsp_node = of_parse_phandle(pdev->dev.of_node, "mediatek,adsp", 0);
1331 struct mtk_sof_priv *sof_priv;
1333 sof_priv = devm_kzalloc(&pdev->dev, sizeof(*sof_priv), GFP_KERNEL);
1338 sof_priv->conn_streams = g_sof_conn_streams;
1339 sof_priv->num_streams = ARRAY_SIZE(g_sof_conn_streams);
1340 soc_card_data->sof_priv = sof_priv;
1341 card->probe = mtk_sof_card_probe;
1342 card->late_probe = mtk_sof_card_late_probe;
1343 if (!card->topology_shortname_created) {
1344 snprintf(card->topology_shortname, 32, "sof-%s", card->name);
1345 card->topology_shortname_created = true;
1347 card->name = card->topology_shortname;
1350 if (of_property_read_bool(pdev->dev.of_node, "mediatek,dai-link")) {
1351 ret = mtk_sof_dailink_parse_of(card, pdev->dev.of_node,
1352 "mediatek,dai-link",
1353 mt8188_mt6359_dai_links,
1354 ARRAY_SIZE(mt8188_mt6359_dai_links));
1356 dev_err_probe(&pdev->dev, ret, "Parse dai-link fail\n");
1361 card->num_links = DAI_LINK_REGULAR_NUM;
1364 platform_node = of_parse_phandle(pdev->dev.of_node,
1365 "mediatek,platform", 0);
1366 if (!platform_node) {
1367 ret = dev_err_probe(&pdev->dev, -EINVAL,
1368 "Property 'platform' missing or invalid\n");
1373 ret = parse_dai_link_info(card);
1377 for_each_card_prelinks(card, i, dai_link) {
1378 if (!dai_link->platforms->name) {
1379 if (!strncmp(dai_link->name, "AFE_SOF", strlen("AFE_SOF")) && adsp_node)
1380 dai_link->platforms->of_node = adsp_node;
1382 dai_link->platforms->of_node = platform_node;
1385 if (strcmp(dai_link->name, "DPTX_BE") == 0) {
1386 if (strcmp(dai_link->codecs->dai_name, "snd-soc-dummy-dai"))
1387 dai_link->init = mt8188_dptx_codec_init;
1388 } else if (strcmp(dai_link->name, "ETDM3_OUT_BE") == 0) {
1389 if (strcmp(dai_link->codecs->dai_name, "snd-soc-dummy-dai"))
1390 dai_link->init = mt8188_hdmi_codec_init;
1391 } else if (strcmp(dai_link->name, "DL_SRC_BE") == 0 ||
1392 strcmp(dai_link->name, "UL_SRC_BE") == 0) {
1394 dai_link->init = mt8188_mt6359_init;
1397 } else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0 ||
1398 strcmp(dai_link->name, "ETDM2_OUT_BE") == 0 ||
1399 strcmp(dai_link->name, "ETDM1_IN_BE") == 0 ||
1400 strcmp(dai_link->name, "ETDM2_IN_BE") == 0) {
1401 if (!strcmp(dai_link->codecs->dai_name, MAX98390_CODEC_DAI)) {
1402 dai_link->ops = &mt8188_max98390_ops;
1403 if (!init_max98390) {
1404 dai_link->init = mt8188_max98390_codec_init;
1405 init_max98390 = true;
1407 } else if (!strcmp(dai_link->codecs->dai_name, NAU8825_CODEC_DAI)) {
1408 dai_link->ops = &mt8188_nau8825_ops;
1409 if (!init_nau8825) {
1410 dai_link->init = mt8188_nau8825_codec_init;
1411 dai_link->exit = mt8188_nau8825_codec_exit;
1412 init_nau8825 = true;
1414 } else if (!strcmp(dai_link->codecs->dai_name, RT5682S_CODEC_DAI)) {
1415 dai_link->ops = &mt8188_rt5682s_i2s_ops;
1416 if (!init_rt5682s) {
1417 dai_link->init = mt8188_rt5682s_codec_init;
1418 dai_link->exit = mt8188_rt5682s_codec_exit;
1419 init_rt5682s = true;
1422 if (strcmp(dai_link->codecs->dai_name, "snd-soc-dummy-dai")) {
1424 dai_link->init = mt8188_dumb_amp_init;
1432 priv->private_data = card_data;
1433 snd_soc_card_set_drvdata(card, soc_card_data);
1435 ret = devm_snd_soc_register_card(&pdev->dev, card);
1437 dev_err_probe(&pdev->dev, ret, "%s snd_soc_register_card fail\n",
1440 of_node_put(platform_node);
1441 clean_card_reference(card);
1444 of_node_put(adsp_node);
1449 static struct mt8188_card_data mt8188_evb_card = {
1450 .name = "mt8188_mt6359",
1453 static struct mt8188_card_data mt8188_nau8825_card = {
1454 .name = "mt8188_nau8825",
1455 .quirk = NAU8825_HS_PRESENT,
1458 static struct mt8188_card_data mt8188_rt5682s_card = {
1459 .name = "mt8188_rt5682s",
1460 .quirk = RT5682S_HS_PRESENT,
1463 static const struct of_device_id mt8188_mt6359_dt_match[] = {
1464 { .compatible = "mediatek,mt8188-mt6359-evb", .data = &mt8188_evb_card, },
1465 { .compatible = "mediatek,mt8188-nau8825", .data = &mt8188_nau8825_card, },
1466 { .compatible = "mediatek,mt8188-rt5682s", .data = &mt8188_rt5682s_card, },
1469 MODULE_DEVICE_TABLE(of, mt8188_mt6359_dt_match);
1471 static struct platform_driver mt8188_mt6359_driver = {
1473 .name = "mt8188_mt6359",
1474 .of_match_table = mt8188_mt6359_dt_match,
1475 .pm = &snd_soc_pm_ops,
1477 .probe = mt8188_mt6359_dev_probe,
1480 module_platform_driver(mt8188_mt6359_driver);
1482 /* Module information */
1483 MODULE_DESCRIPTION("MT8188-MT6359 ALSA SoC machine driver");
1484 MODULE_AUTHOR("Trevor Wu <trevor.wu@mediatek.com>");
1485 MODULE_LICENSE("GPL");
1486 MODULE_ALIAS("mt8188 mt6359 soc card");