brintos

brintos / linux-shallow public Read only

0
0
Text · 40.0 KiB · 771d536 Raw
1399 lines · c
1// SPDX-License-Identifier: GPL-2.02//3// mt8186-mt6366.c4//	--  MT8186-MT6366 ALSA SoC machine driver5//6// Copyright (c) 2022 MediaTek Inc.7// Author: Jiaxin Yu <jiaxin.yu@mediatek.com>8//9// Copyright (c) 2024 Collabora Ltd.10//                    AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>11//12 13#include <linux/gpio/consumer.h>14#include <linux/input.h>15#include <linux/module.h>16#include <linux/of.h>17#include <sound/jack.h>18#include <sound/pcm_params.h>19#include <sound/rt5682.h>20#include <sound/soc.h>21 22#include "../../codecs/da7219.h"23#include "../../codecs/mt6358.h"24#include "../../codecs/rt5682.h"25#include "../common/mtk-afe-platform-driver.h"26#include "../common/mtk-dsp-sof-common.h"27#include "../common/mtk-soc-card.h"28#include "../common/mtk-soundcard-driver.h"29#include "mt8186-afe-common.h"30#include "mt8186-afe-clk.h"31#include "mt8186-afe-gpio.h"32#include "mt8186-mt6366-common.h"33 34#define RT1019_CODEC_DAI	"HiFi"35#define RT1019_DEV0_NAME	"rt1019p"36 37#define RT5682S_CODEC_DAI	"rt5682s-aif1"38#define RT5682S_DEV0_NAME	"rt5682s.5-001a"39 40#define DA7219_CODEC_DAI	"da7219-hifi"41#define DA7219_DEV_NAME		"da7219.5-001a"42 43#define SOF_DMA_DL1 "SOF_DMA_DL1"44#define SOF_DMA_DL2 "SOF_DMA_DL2"45#define SOF_DMA_UL1 "SOF_DMA_UL1"46#define SOF_DMA_UL2 "SOF_DMA_UL2"47 48#define DA7219_CODEC_PRESENT	BIT(0)49 50struct mt8186_mt6366_rt1019_rt5682s_priv {51	struct gpio_desc *dmic_sel;52	int dmic_switch;53};54 55enum mt8186_jacks {56	MT8186_JACK_HEADSET,57	MT8186_JACK_HDMI,58	MT8186_JACK_MAX,59};60 61/* Headset jack detection DAPM pins */62static struct snd_soc_jack_pin mt8186_jack_pins[] = {63	{64		.pin = "Headphone",65		.mask = SND_JACK_HEADPHONE,66	},67	{68		.pin = "Headset Mic",69		.mask = SND_JACK_MICROPHONE,70	},71};72 73static struct snd_soc_codec_conf mt8186_mt6366_rt1019_rt5682s_codec_conf[] = {74	{75		.dlc = COMP_CODEC_CONF("mt6358-sound"),76		.name_prefix = "Mt6366",77	},78	{79		.dlc = COMP_CODEC_CONF("bt-sco"),80		.name_prefix = "Mt8186 bt",81	},82	{83		.dlc = COMP_CODEC_CONF("hdmi-audio-codec"),84		.name_prefix = "Mt8186 hdmi",85	},86};87 88static int dmic_get(struct snd_kcontrol *kcontrol,89		    struct snd_ctl_elem_value *ucontrol)90{91	struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol);92	struct mtk_soc_card_data *soc_card_data =93		snd_soc_card_get_drvdata(dapm->card);94	struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;95 96	ucontrol->value.integer.value[0] = priv->dmic_switch;97	return 0;98}99 100static int dmic_set(struct snd_kcontrol *kcontrol,101		    struct snd_ctl_elem_value *ucontrol)102{103	struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol);104	struct mtk_soc_card_data *soc_card_data =105		snd_soc_card_get_drvdata(dapm->card);106	struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;107 108	priv->dmic_switch = ucontrol->value.integer.value[0];109	if (priv->dmic_sel) {110		gpiod_set_value(priv->dmic_sel, priv->dmic_switch);111		dev_dbg(dapm->card->dev, "dmic_set_value %d\n",112			 priv->dmic_switch);113	}114	return 0;115}116 117static const char * const dmic_mux_text[] = {118	"Front Mic",119	"Rear Mic",120};121 122static SOC_ENUM_SINGLE_DECL(mt8186_dmic_enum,123			    SND_SOC_NOPM, 0, dmic_mux_text);124 125static const struct snd_kcontrol_new mt8186_dmic_mux_control =126	SOC_DAPM_ENUM_EXT("DMIC Select Mux", mt8186_dmic_enum,127			  dmic_get, dmic_set);128 129static const struct snd_soc_dapm_widget dmic_widgets[] = {130	SND_SOC_DAPM_MIC("DMIC", NULL),131	SND_SOC_DAPM_MUX("Dmic Mux", SND_SOC_NOPM, 0, 0, &mt8186_dmic_mux_control),132};133 134static const struct snd_soc_dapm_route dmic_map[] = {135	/* digital mics */136	{"Dmic Mux", "Front Mic", "DMIC"},137	{"Dmic Mux", "Rear Mic", "DMIC"},138};139 140static int primary_codec_init(struct snd_soc_pcm_runtime *rtd)141{142	struct snd_soc_card *card = rtd->card;143	struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card);144	struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;145	int ret;146 147	ret = mt8186_mt6366_init(rtd);148 149	if (ret) {150		dev_err(card->dev, "mt8186_mt6366_init failed: %d\n", ret);151		return ret;152	}153 154	if (!priv->dmic_sel) {155		dev_dbg(card->dev, "dmic_sel is null\n");156		return 0;157	}158 159	ret = snd_soc_dapm_new_controls(&card->dapm, dmic_widgets,160					ARRAY_SIZE(dmic_widgets));161	if (ret) {162		dev_err(card->dev, "DMic widget addition failed: %d\n", ret);163		/* Don't need to add routes if widget addition failed */164		return ret;165	}166 167	ret = snd_soc_dapm_add_routes(&card->dapm, dmic_map,168				      ARRAY_SIZE(dmic_map));169 170	if (ret)171		dev_err(card->dev, "DMic map addition failed: %d\n", ret);172 173	return ret;174}175 176static int mt8186_headset_codec_init(struct snd_soc_pcm_runtime *rtd)177{178	struct snd_soc_component *cmpnt_afe =179		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);180	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);181	struct mtk_soc_card_data *soc_card_data =182		snd_soc_card_get_drvdata(rtd->card);183	struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8186_JACK_HEADSET];184	struct snd_soc_component *cmpnt_codec =185		snd_soc_rtd_to_codec(rtd, 0)->component;186	const int hs_keys_rt5682[] = {187		KEY_PLAYPAUSE, KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_VOICECOMMAND188	};189	const int hs_keys_da7219[] = {190		KEY_PLAYPAUSE, KEY_VOICECOMMAND, KEY_VOLUMEUP, KEY_VOLUMEDOWN191	};192	const int *hs_keys;193	int ret;194	int type;195 196	ret = mt8186_dai_i2s_set_share(afe, "I2S1", "I2S0");197	if (ret) {198		dev_err(rtd->dev, "Failed to set up shared clocks\n");199		return ret;200	}201 202	ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",203				    SND_JACK_HEADSET | SND_JACK_BTN_0 |204				    SND_JACK_BTN_1 | SND_JACK_BTN_2 |205				    SND_JACK_BTN_3,206				    jack, mt8186_jack_pins,207				    ARRAY_SIZE(mt8186_jack_pins));208	if (ret) {209		dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);210		return ret;211	}212 213	if (soc_card_data->card_data->flags & DA7219_CODEC_PRESENT)214		hs_keys = hs_keys_da7219;215	else216		hs_keys = hs_keys_rt5682;217 218	snd_jack_set_key(jack->jack, SND_JACK_BTN_0, hs_keys[0]);219	snd_jack_set_key(jack->jack, SND_JACK_BTN_1, hs_keys[1]);220	snd_jack_set_key(jack->jack, SND_JACK_BTN_2, hs_keys[2]);221	snd_jack_set_key(jack->jack, SND_JACK_BTN_3, hs_keys[3]);222 223	type = SND_JACK_HEADSET | SND_JACK_BTN_0 | SND_JACK_BTN_1 | SND_JACK_BTN_2 | SND_JACK_BTN_3;224	return snd_soc_component_set_jack(cmpnt_codec, jack, (void *)&type);225}226 227static int mt8186_da7219_i2s_hw_params(struct snd_pcm_substream *substream,228				       struct snd_pcm_hw_params *params)229{230	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);231	struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);232	struct snd_soc_dai *codec_dai;233	unsigned int rate = params_rate(params);234	unsigned int mclk_fs_ratio = 256;235	unsigned int mclk_fs = rate * mclk_fs_ratio;236	unsigned int freq;237	int ret, j;238 239	ret = snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);240	if (ret < 0) {241		dev_err(rtd->dev, "failed to set cpu dai sysclk: %d\n", ret);242		return ret;243	}244 245	for_each_rtd_codec_dais(rtd, j, codec_dai) {246		if (strcmp(codec_dai->component->name, DA7219_DEV_NAME))247			continue;248 249		ret = snd_soc_dai_set_sysclk(codec_dai, DA7219_CLKSRC_MCLK,250					     mclk_fs, SND_SOC_CLOCK_IN);251		if (ret < 0) {252			dev_err(rtd->dev, "failed to set sysclk: %d\n", ret);253			return ret;254		}255 256		if ((rate % 8000) == 0)257			freq = DA7219_PLL_FREQ_OUT_98304;258		else259			freq = DA7219_PLL_FREQ_OUT_90316;260 261		ret = snd_soc_dai_set_pll(codec_dai, 0, DA7219_SYSCLK_PLL_SRM,262					  0, freq);263		if (ret) {264			dev_err(rtd->dev, "failed to start PLL: %d\n", ret);265			return ret;266		}267	}268 269	return 0;270}271 272static int mt8186_da7219_i2s_hw_free(struct snd_pcm_substream *substream)273{274	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);275	struct snd_soc_dai *codec_dai;276	int j, ret;277 278	for_each_rtd_codec_dais(rtd, j, codec_dai) {279		if (strcmp(codec_dai->component->name, DA7219_DEV_NAME))280			continue;281 282		ret = snd_soc_dai_set_pll(codec_dai, 0, DA7219_SYSCLK_MCLK, 0, 0);283		if (ret < 0) {284			dev_err(rtd->dev, "failed to stop PLL: %d\n", ret);285			return ret;286		}287	}288 289	return 0;290}291 292static const struct snd_soc_ops mt8186_da7219_i2s_ops = {293	.hw_params = mt8186_da7219_i2s_hw_params,294	.hw_free = mt8186_da7219_i2s_hw_free,295};296 297static int mt8186_rt5682s_i2s_hw_params(struct snd_pcm_substream *substream,298					struct snd_pcm_hw_params *params)299{300	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);301	struct snd_soc_card *card = rtd->card;302	struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);303	struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);304	unsigned int rate = params_rate(params);305	unsigned int mclk_fs_ratio = 128;306	unsigned int mclk_fs = rate * mclk_fs_ratio;307	int bitwidth;308	int ret;309 310	bitwidth = snd_pcm_format_width(params_format(params));311	if (bitwidth < 0) {312		dev_err(card->dev, "invalid bit width: %d\n", bitwidth);313		return bitwidth;314	}315 316	ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);317	if (ret) {318		dev_err(card->dev, "failed to set tdm slot\n");319		return ret;320	}321 322	ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1,323				  RT5682_PLL1_S_BCLK1,324				  params_rate(params) * 64,325				  params_rate(params) * 512);326	if (ret) {327		dev_err(card->dev, "failed to set pll\n");328		return ret;329	}330 331	ret = snd_soc_dai_set_sysclk(codec_dai,332				     RT5682_SCLK_S_PLL1,333				     params_rate(params) * 512,334				     SND_SOC_CLOCK_IN);335	if (ret) {336		dev_err(card->dev, "failed to set sysclk\n");337		return ret;338	}339 340	return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);341}342 343static const struct snd_soc_ops mt8186_rt5682s_i2s_ops = {344	.hw_params = mt8186_rt5682s_i2s_hw_params,345};346 347static int mt8186_mt6366_rt1019_rt5682s_hdmi_init(struct snd_soc_pcm_runtime *rtd)348{349	struct snd_soc_component *cmpnt_afe =350		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);351	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);352	struct snd_soc_component *cmpnt_codec =353		snd_soc_rtd_to_codec(rtd, 0)->component;354	struct mtk_soc_card_data *soc_card_data =355		snd_soc_card_get_drvdata(rtd->card);356	struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8186_JACK_HDMI];357	int ret;358 359	ret = mt8186_dai_i2s_set_share(afe, "I2S2", "I2S3");360	if (ret) {361		dev_err(rtd->dev, "Failed to set up shared clocks\n");362		return ret;363	}364 365	ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT, jack);366	if (ret) {367		dev_err(rtd->dev, "HDMI Jack creation failed: %d\n", ret);368		return ret;369	}370 371	return snd_soc_component_set_jack(cmpnt_codec, jack, NULL);372}373 374static int mt8186_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,375				  struct snd_pcm_hw_params *params,376				  snd_pcm_format_t fmt)377{378	struct snd_interval *channels = hw_param_interval(params,379		SNDRV_PCM_HW_PARAM_CHANNELS);380 381	dev_dbg(rtd->dev, "%s(), fix format to %d\n", __func__, fmt);382 383	/* fix BE i2s channel to 2 channel */384	channels->min = 2;385	channels->max = 2;386 387	/* clean param mask first */388	snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),389			     0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);390 391	params_set_format(params, fmt);392 393	return 0;394}395 396static int mt8186_i2s_hw_params_24le_fixup(struct snd_soc_pcm_runtime *rtd,397					   struct snd_pcm_hw_params *params)398{399	return mt8186_hw_params_fixup(rtd, params, SNDRV_PCM_FORMAT_S24_LE);400}401 402static int mt8186_i2s_hw_params_32le_fixup(struct snd_soc_pcm_runtime *rtd,403					   struct snd_pcm_hw_params *params)404{405	return mt8186_hw_params_fixup(rtd, params, SNDRV_PCM_FORMAT_S32_LE);406}407 408/* fixup the BE DAI link to match any values from topology */409static int mt8186_sof_dai_link_fixup(struct snd_soc_pcm_runtime *rtd,410				     struct snd_pcm_hw_params *params)411{412	struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);413	int ret;414 415	ret = mtk_sof_dai_link_fixup(rtd, params);416 417	if (!strcmp(rtd->dai_link->name, "I2S0") ||418	    !strcmp(rtd->dai_link->name, "I2S1") ||419	    !strcmp(rtd->dai_link->name, "I2S2")) {420		if (soc_card_data->card_data->flags & DA7219_CODEC_PRESENT)421			mt8186_i2s_hw_params_32le_fixup(rtd, params);422		else423			mt8186_i2s_hw_params_24le_fixup(rtd, params);424	} else if (!strcmp(rtd->dai_link->name, "I2S3")) {425		if (soc_card_data->card_data->flags & DA7219_CODEC_PRESENT)426			mt8186_i2s_hw_params_24le_fixup(rtd, params);427		else428			mt8186_i2s_hw_params_32le_fixup(rtd, params);429	}430 431	return ret;432}433 434/* FE */435SND_SOC_DAILINK_DEFS(playback1,436		     DAILINK_COMP_ARRAY(COMP_CPU("DL1")),437		     DAILINK_COMP_ARRAY(COMP_DUMMY()),438		     DAILINK_COMP_ARRAY(COMP_EMPTY()));439 440SND_SOC_DAILINK_DEFS(playback12,441		     DAILINK_COMP_ARRAY(COMP_CPU("DL12")),442		     DAILINK_COMP_ARRAY(COMP_DUMMY()),443		     DAILINK_COMP_ARRAY(COMP_EMPTY()));444 445SND_SOC_DAILINK_DEFS(playback2,446		     DAILINK_COMP_ARRAY(COMP_CPU("DL2")),447		     DAILINK_COMP_ARRAY(COMP_DUMMY()),448		     DAILINK_COMP_ARRAY(COMP_EMPTY()));449 450SND_SOC_DAILINK_DEFS(playback3,451		     DAILINK_COMP_ARRAY(COMP_CPU("DL3")),452		     DAILINK_COMP_ARRAY(COMP_DUMMY()),453		     DAILINK_COMP_ARRAY(COMP_EMPTY()));454 455SND_SOC_DAILINK_DEFS(playback4,456		     DAILINK_COMP_ARRAY(COMP_CPU("DL4")),457		     DAILINK_COMP_ARRAY(COMP_DUMMY()),458		     DAILINK_COMP_ARRAY(COMP_EMPTY()));459 460SND_SOC_DAILINK_DEFS(playback5,461		     DAILINK_COMP_ARRAY(COMP_CPU("DL5")),462		     DAILINK_COMP_ARRAY(COMP_DUMMY()),463		     DAILINK_COMP_ARRAY(COMP_EMPTY()));464 465SND_SOC_DAILINK_DEFS(playback6,466		     DAILINK_COMP_ARRAY(COMP_CPU("DL6")),467		     DAILINK_COMP_ARRAY(COMP_DUMMY()),468		     DAILINK_COMP_ARRAY(COMP_EMPTY()));469 470SND_SOC_DAILINK_DEFS(playback7,471		     DAILINK_COMP_ARRAY(COMP_CPU("DL7")),472		     DAILINK_COMP_ARRAY(COMP_DUMMY()),473		     DAILINK_COMP_ARRAY(COMP_EMPTY()));474 475SND_SOC_DAILINK_DEFS(playback8,476		     DAILINK_COMP_ARRAY(COMP_CPU("DL8")),477		     DAILINK_COMP_ARRAY(COMP_DUMMY()),478		     DAILINK_COMP_ARRAY(COMP_EMPTY()));479 480SND_SOC_DAILINK_DEFS(capture1,481		     DAILINK_COMP_ARRAY(COMP_CPU("UL1")),482		     DAILINK_COMP_ARRAY(COMP_DUMMY()),483		     DAILINK_COMP_ARRAY(COMP_EMPTY()));484 485SND_SOC_DAILINK_DEFS(capture2,486		     DAILINK_COMP_ARRAY(COMP_CPU("UL2")),487		     DAILINK_COMP_ARRAY(COMP_DUMMY()),488		     DAILINK_COMP_ARRAY(COMP_EMPTY()));489 490SND_SOC_DAILINK_DEFS(capture3,491		     DAILINK_COMP_ARRAY(COMP_CPU("UL3")),492		     DAILINK_COMP_ARRAY(COMP_DUMMY()),493		     DAILINK_COMP_ARRAY(COMP_EMPTY()));494 495SND_SOC_DAILINK_DEFS(capture4,496		     DAILINK_COMP_ARRAY(COMP_CPU("UL4")),497		     DAILINK_COMP_ARRAY(COMP_DUMMY()),498		     DAILINK_COMP_ARRAY(COMP_EMPTY()));499 500SND_SOC_DAILINK_DEFS(capture5,501		     DAILINK_COMP_ARRAY(COMP_CPU("UL5")),502		     DAILINK_COMP_ARRAY(COMP_DUMMY()),503		     DAILINK_COMP_ARRAY(COMP_EMPTY()));504 505SND_SOC_DAILINK_DEFS(capture6,506		     DAILINK_COMP_ARRAY(COMP_CPU("UL6")),507		     DAILINK_COMP_ARRAY(COMP_DUMMY()),508		     DAILINK_COMP_ARRAY(COMP_EMPTY()));509 510SND_SOC_DAILINK_DEFS(capture7,511		     DAILINK_COMP_ARRAY(COMP_CPU("UL7")),512		     DAILINK_COMP_ARRAY(COMP_DUMMY()),513		     DAILINK_COMP_ARRAY(COMP_EMPTY()));514 515/* hostless */516SND_SOC_DAILINK_DEFS(hostless_lpbk,517		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless LPBK DAI")),518		     DAILINK_COMP_ARRAY(COMP_DUMMY()),519		     DAILINK_COMP_ARRAY(COMP_EMPTY()));520SND_SOC_DAILINK_DEFS(hostless_fm,521		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless FM DAI")),522		     DAILINK_COMP_ARRAY(COMP_DUMMY()),523		     DAILINK_COMP_ARRAY(COMP_EMPTY()));524SND_SOC_DAILINK_DEFS(hostless_src1,525		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless_SRC_1_DAI")),526		     DAILINK_COMP_ARRAY(COMP_DUMMY()),527		     DAILINK_COMP_ARRAY(COMP_EMPTY()));528SND_SOC_DAILINK_DEFS(hostless_src_bargein,529		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless_SRC_Bargein_DAI")),530		     DAILINK_COMP_ARRAY(COMP_DUMMY()),531		     DAILINK_COMP_ARRAY(COMP_EMPTY()));532 533/* BE */534SND_SOC_DAILINK_DEFS(adda,535		     DAILINK_COMP_ARRAY(COMP_CPU("ADDA")),536		     DAILINK_COMP_ARRAY(COMP_CODEC("mt6358-sound",537						   "mt6358-snd-codec-aif1"),538					COMP_CODEC("dmic-codec",539						   "dmic-hifi")),540		     DAILINK_COMP_ARRAY(COMP_EMPTY()));541SND_SOC_DAILINK_DEFS(i2s0,542		     DAILINK_COMP_ARRAY(COMP_CPU("I2S0")),543		     DAILINK_COMP_ARRAY(COMP_EMPTY()),544		     DAILINK_COMP_ARRAY(COMP_EMPTY()));545SND_SOC_DAILINK_DEFS(i2s1,546		     DAILINK_COMP_ARRAY(COMP_CPU("I2S1")),547		     DAILINK_COMP_ARRAY(COMP_EMPTY()),548		     DAILINK_COMP_ARRAY(COMP_EMPTY()));549SND_SOC_DAILINK_DEFS(i2s2,550		     DAILINK_COMP_ARRAY(COMP_CPU("I2S2")),551		     DAILINK_COMP_ARRAY(COMP_DUMMY()),552		     DAILINK_COMP_ARRAY(COMP_EMPTY()));553SND_SOC_DAILINK_DEFS(i2s3,554		     DAILINK_COMP_ARRAY(COMP_CPU("I2S3")),555		     DAILINK_COMP_ARRAY(COMP_EMPTY()),556		     DAILINK_COMP_ARRAY(COMP_EMPTY()));557SND_SOC_DAILINK_DEFS(hw_gain1,558		     DAILINK_COMP_ARRAY(COMP_CPU("HW Gain 1")),559		     DAILINK_COMP_ARRAY(COMP_DUMMY()),560		     DAILINK_COMP_ARRAY(COMP_EMPTY()));561SND_SOC_DAILINK_DEFS(hw_gain2,562		     DAILINK_COMP_ARRAY(COMP_CPU("HW Gain 2")),563		     DAILINK_COMP_ARRAY(COMP_DUMMY()),564		     DAILINK_COMP_ARRAY(COMP_EMPTY()));565SND_SOC_DAILINK_DEFS(hw_src1,566		     DAILINK_COMP_ARRAY(COMP_CPU("HW_SRC_1")),567		     DAILINK_COMP_ARRAY(COMP_DUMMY()),568		     DAILINK_COMP_ARRAY(COMP_EMPTY()));569SND_SOC_DAILINK_DEFS(hw_src2,570		     DAILINK_COMP_ARRAY(COMP_CPU("HW_SRC_2")),571		     DAILINK_COMP_ARRAY(COMP_DUMMY()),572		     DAILINK_COMP_ARRAY(COMP_EMPTY()));573SND_SOC_DAILINK_DEFS(connsys_i2s,574		     DAILINK_COMP_ARRAY(COMP_CPU("CONNSYS_I2S")),575		     DAILINK_COMP_ARRAY(COMP_DUMMY()),576		     DAILINK_COMP_ARRAY(COMP_EMPTY()));577SND_SOC_DAILINK_DEFS(pcm1,578		     DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")),579		     DAILINK_COMP_ARRAY(COMP_CODEC("bt-sco", "bt-sco-pcm-wb")),580		     DAILINK_COMP_ARRAY(COMP_EMPTY()));581SND_SOC_DAILINK_DEFS(tdm_in,582		     DAILINK_COMP_ARRAY(COMP_CPU("TDM IN")),583		     DAILINK_COMP_ARRAY(COMP_DUMMY()),584		     DAILINK_COMP_ARRAY(COMP_EMPTY()));585 586/* hostless */587SND_SOC_DAILINK_DEFS(hostless_ul1,588		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL1 DAI")),589		     DAILINK_COMP_ARRAY(COMP_DUMMY()),590		     DAILINK_COMP_ARRAY(COMP_EMPTY()));591SND_SOC_DAILINK_DEFS(hostless_ul2,592		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL2 DAI")),593		     DAILINK_COMP_ARRAY(COMP_DUMMY()),594		     DAILINK_COMP_ARRAY(COMP_EMPTY()));595SND_SOC_DAILINK_DEFS(hostless_ul3,596		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL3 DAI")),597		     DAILINK_COMP_ARRAY(COMP_DUMMY()),598		     DAILINK_COMP_ARRAY(COMP_EMPTY()));599SND_SOC_DAILINK_DEFS(hostless_ul5,600		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL5 DAI")),601		     DAILINK_COMP_ARRAY(COMP_DUMMY()),602		     DAILINK_COMP_ARRAY(COMP_EMPTY()));603SND_SOC_DAILINK_DEFS(hostless_ul6,604		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL6 DAI")),605		     DAILINK_COMP_ARRAY(COMP_DUMMY()),606		     DAILINK_COMP_ARRAY(COMP_EMPTY()));607SND_SOC_DAILINK_DEFS(hostless_hw_gain_aaudio,608		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless HW Gain AAudio DAI")),609		     DAILINK_COMP_ARRAY(COMP_DUMMY()),610		     DAILINK_COMP_ARRAY(COMP_EMPTY()));611SND_SOC_DAILINK_DEFS(hostless_src_aaudio,612		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless SRC AAudio DAI")),613		     DAILINK_COMP_ARRAY(COMP_DUMMY()),614		     DAILINK_COMP_ARRAY(COMP_EMPTY()));615SND_SOC_DAILINK_DEFS(AFE_SOF_DL1,616		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL1")),617		     DAILINK_COMP_ARRAY(COMP_DUMMY()),618		     DAILINK_COMP_ARRAY(COMP_EMPTY()));619 620SND_SOC_DAILINK_DEFS(AFE_SOF_DL2,621		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL2")),622		     DAILINK_COMP_ARRAY(COMP_DUMMY()),623		     DAILINK_COMP_ARRAY(COMP_EMPTY()));624 625SND_SOC_DAILINK_DEFS(AFE_SOF_UL1,626		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL1")),627		     DAILINK_COMP_ARRAY(COMP_DUMMY()),628		     DAILINK_COMP_ARRAY(COMP_EMPTY()));629 630SND_SOC_DAILINK_DEFS(AFE_SOF_UL2,631		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL2")),632		     DAILINK_COMP_ARRAY(COMP_DUMMY()),633		     DAILINK_COMP_ARRAY(COMP_EMPTY()));634 635static const struct sof_conn_stream g_sof_conn_streams[] = {636	{ "I2S1", "AFE_SOF_DL1", SOF_DMA_DL1, SNDRV_PCM_STREAM_PLAYBACK},637	{ "I2S3", "AFE_SOF_DL2", SOF_DMA_DL2, SNDRV_PCM_STREAM_PLAYBACK},638	{ "Primary Codec", "AFE_SOF_UL1", SOF_DMA_UL1, SNDRV_PCM_STREAM_CAPTURE},639	{ "I2S0", "AFE_SOF_UL2", SOF_DMA_UL2, SNDRV_PCM_STREAM_CAPTURE},640};641 642static struct snd_soc_dai_link mt8186_mt6366_rt1019_rt5682s_dai_links[] = {643	/* Front End DAI links */644	{645		.name = "Playback_1",646		.stream_name = "Playback_1",647		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,648			    SND_SOC_DPCM_TRIGGER_PRE},649		.dynamic = 1,650		.dpcm_playback = 1,651		.dpcm_merged_format = 1,652		.dpcm_merged_chan = 1,653		.dpcm_merged_rate = 1,654		.ops = &mtk_soundcard_common_playback_ops,655		SND_SOC_DAILINK_REG(playback1),656	},657	{658		.name = "Playback_12",659		.stream_name = "Playback_12",660		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,661			    SND_SOC_DPCM_TRIGGER_PRE},662		.dynamic = 1,663		.dpcm_playback = 1,664		SND_SOC_DAILINK_REG(playback12),665	},666	{667		.name = "Playback_2",668		.stream_name = "Playback_2",669		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,670			    SND_SOC_DPCM_TRIGGER_PRE},671		.dynamic = 1,672		.dpcm_playback = 1,673		.dpcm_merged_format = 1,674		.dpcm_merged_chan = 1,675		.dpcm_merged_rate = 1,676		SND_SOC_DAILINK_REG(playback2),677	},678	{679		.name = "Playback_3",680		.stream_name = "Playback_3",681		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,682			    SND_SOC_DPCM_TRIGGER_PRE},683		.dynamic = 1,684		.dpcm_playback = 1,685		.dpcm_merged_format = 1,686		.dpcm_merged_chan = 1,687		.dpcm_merged_rate = 1,688		.ops = &mtk_soundcard_common_playback_ops,689		SND_SOC_DAILINK_REG(playback3),690	},691	{692		.name = "Playback_4",693		.stream_name = "Playback_4",694		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,695			    SND_SOC_DPCM_TRIGGER_PRE},696		.dynamic = 1,697		.dpcm_playback = 1,698		SND_SOC_DAILINK_REG(playback4),699	},700	{701		.name = "Playback_5",702		.stream_name = "Playback_5",703		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,704			    SND_SOC_DPCM_TRIGGER_PRE},705		.dynamic = 1,706		.dpcm_playback = 1,707		SND_SOC_DAILINK_REG(playback5),708	},709	{710		.name = "Playback_6",711		.stream_name = "Playback_6",712		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,713			    SND_SOC_DPCM_TRIGGER_PRE},714		.dynamic = 1,715		.dpcm_playback = 1,716		SND_SOC_DAILINK_REG(playback6),717	},718	{719		.name = "Playback_7",720		.stream_name = "Playback_7",721		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,722			    SND_SOC_DPCM_TRIGGER_PRE},723		.dynamic = 1,724		.dpcm_playback = 1,725		SND_SOC_DAILINK_REG(playback7),726	},727	{728		.name = "Playback_8",729		.stream_name = "Playback_8",730		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,731			    SND_SOC_DPCM_TRIGGER_PRE},732		.dynamic = 1,733		.dpcm_playback = 1,734		SND_SOC_DAILINK_REG(playback8),735	},736	{737		.name = "Capture_1",738		.stream_name = "Capture_1",739		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,740			    SND_SOC_DPCM_TRIGGER_PRE},741		.dynamic = 1,742		.dpcm_capture = 1,743		SND_SOC_DAILINK_REG(capture1),744	},745	{746		.name = "Capture_2",747		.stream_name = "Capture_2",748		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,749			    SND_SOC_DPCM_TRIGGER_PRE},750		.dynamic = 1,751		.dpcm_capture = 1,752		.dpcm_merged_format = 1,753		.dpcm_merged_chan = 1,754		.dpcm_merged_rate = 1,755		.ops = &mtk_soundcard_common_capture_ops,756		SND_SOC_DAILINK_REG(capture2),757	},758	{759		.name = "Capture_3",760		.stream_name = "Capture_3",761		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,762			    SND_SOC_DPCM_TRIGGER_PRE},763		.dynamic = 1,764		.dpcm_capture = 1,765		SND_SOC_DAILINK_REG(capture3),766	},767	{768		.name = "Capture_4",769		.stream_name = "Capture_4",770		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,771			    SND_SOC_DPCM_TRIGGER_PRE},772		.dynamic = 1,773		.dpcm_capture = 1,774		.dpcm_merged_format = 1,775		.dpcm_merged_chan = 1,776		.dpcm_merged_rate = 1,777		.ops = &mtk_soundcard_common_capture_ops,778		SND_SOC_DAILINK_REG(capture4),779	},780	{781		.name = "Capture_5",782		.stream_name = "Capture_5",783		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,784			    SND_SOC_DPCM_TRIGGER_PRE},785		.dynamic = 1,786		.dpcm_capture = 1,787		SND_SOC_DAILINK_REG(capture5),788	},789	{790		.name = "Capture_6",791		.stream_name = "Capture_6",792		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,793			    SND_SOC_DPCM_TRIGGER_PRE},794		.dynamic = 1,795		.dpcm_capture = 1,796		.dpcm_merged_format = 1,797		.dpcm_merged_chan = 1,798		.dpcm_merged_rate = 1,799		SND_SOC_DAILINK_REG(capture6),800	},801	{802		.name = "Capture_7",803		.stream_name = "Capture_7",804		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,805			    SND_SOC_DPCM_TRIGGER_PRE},806		.dynamic = 1,807		.dpcm_capture = 1,808		SND_SOC_DAILINK_REG(capture7),809	},810	{811		.name = "Hostless_LPBK",812		.stream_name = "Hostless_LPBK",813		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,814			    SND_SOC_DPCM_TRIGGER_PRE},815		.dynamic = 1,816		.dpcm_playback = 1,817		.dpcm_capture = 1,818		.ignore_suspend = 1,819		SND_SOC_DAILINK_REG(hostless_lpbk),820	},821	{822		.name = "Hostless_FM",823		.stream_name = "Hostless_FM",824		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,825			    SND_SOC_DPCM_TRIGGER_PRE},826		.dynamic = 1,827		.dpcm_playback = 1,828		.dpcm_capture = 1,829		.ignore_suspend = 1,830		SND_SOC_DAILINK_REG(hostless_fm),831	},832	{833		.name = "Hostless_SRC_1",834		.stream_name = "Hostless_SRC_1",835		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,836			    SND_SOC_DPCM_TRIGGER_PRE},837		.dynamic = 1,838		.dpcm_playback = 1,839		.dpcm_capture = 1,840		.ignore_suspend = 1,841		SND_SOC_DAILINK_REG(hostless_src1),842	},843	{844		.name = "Hostless_SRC_Bargein",845		.stream_name = "Hostless_SRC_Bargein",846		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,847			    SND_SOC_DPCM_TRIGGER_PRE},848		.dynamic = 1,849		.dpcm_playback = 1,850		.dpcm_capture = 1,851		.ignore_suspend = 1,852		SND_SOC_DAILINK_REG(hostless_src_bargein),853	},854	{855		.name = "Hostless_HW_Gain_AAudio",856		.stream_name = "Hostless_HW_Gain_AAudio",857		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,858			    SND_SOC_DPCM_TRIGGER_PRE},859		.dynamic = 1,860		.dpcm_capture = 1,861		.ignore_suspend = 1,862		SND_SOC_DAILINK_REG(hostless_hw_gain_aaudio),863	},864	{865		.name = "Hostless_SRC_AAudio",866		.stream_name = "Hostless_SRC_AAudio",867		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,868			    SND_SOC_DPCM_TRIGGER_PRE},869		.dynamic = 1,870		.dpcm_playback = 1,871		.dpcm_capture = 1,872		.ignore_suspend = 1,873		SND_SOC_DAILINK_REG(hostless_src_aaudio),874	},875	/* Back End DAI links */876	{877		.name = "Primary Codec",878		.no_pcm = 1,879		.dpcm_playback = 1,880		.dpcm_capture = 1,881		.ignore_suspend = 1,882		.init = primary_codec_init,883		SND_SOC_DAILINK_REG(adda),884	},885	{886		.name = "I2S3",887		.no_pcm = 1,888		.dai_fmt = SND_SOC_DAIFMT_I2S |889			   SND_SOC_DAIFMT_IB_IF |890			   SND_SOC_DAIFMT_CBM_CFM,891		.dpcm_playback = 1,892		.ignore_suspend = 1,893		.init = mt8186_mt6366_rt1019_rt5682s_hdmi_init,894		SND_SOC_DAILINK_REG(i2s3),895	},896	{897		.name = "I2S0",898		.no_pcm = 1,899		.dpcm_capture = 1,900		.ignore_suspend = 1,901		.ops = &mt8186_rt5682s_i2s_ops,902		SND_SOC_DAILINK_REG(i2s0),903	},904	{905		.name = "I2S1",906		.no_pcm = 1,907		.dpcm_playback = 1,908		.ignore_suspend = 1,909		.init = mt8186_headset_codec_init,910		SND_SOC_DAILINK_REG(i2s1),911	},912	{913		.name = "I2S2",914		.no_pcm = 1,915		.dpcm_capture = 1,916		.ignore_suspend = 1,917		SND_SOC_DAILINK_REG(i2s2),918	},919	{920		.name = "HW Gain 1",921		.no_pcm = 1,922		.dpcm_playback = 1,923		.dpcm_capture = 1,924		.ignore_suspend = 1,925		SND_SOC_DAILINK_REG(hw_gain1),926	},927	{928		.name = "HW Gain 2",929		.no_pcm = 1,930		.dpcm_playback = 1,931		.dpcm_capture = 1,932		.ignore_suspend = 1,933		SND_SOC_DAILINK_REG(hw_gain2),934	},935	{936		.name = "HW_SRC_1",937		.no_pcm = 1,938		.dpcm_playback = 1,939		.dpcm_capture = 1,940		.ignore_suspend = 1,941		SND_SOC_DAILINK_REG(hw_src1),942	},943	{944		.name = "HW_SRC_2",945		.no_pcm = 1,946		.dpcm_playback = 1,947		.dpcm_capture = 1,948		.ignore_suspend = 1,949		SND_SOC_DAILINK_REG(hw_src2),950	},951	{952		.name = "CONNSYS_I2S",953		.no_pcm = 1,954		.dpcm_capture = 1,955		.ignore_suspend = 1,956		SND_SOC_DAILINK_REG(connsys_i2s),957	},958	{959		.name = "PCM 1",960		.dai_fmt = SND_SOC_DAIFMT_I2S |961			   SND_SOC_DAIFMT_NB_IF,962		.no_pcm = 1,963		.dpcm_playback = 1,964		.dpcm_capture = 1,965		.ignore_suspend = 1,966		SND_SOC_DAILINK_REG(pcm1),967	},968	{969		.name = "TDM IN",970		.no_pcm = 1,971		.dpcm_capture = 1,972		.ignore_suspend = 1,973		SND_SOC_DAILINK_REG(tdm_in),974	},975	/* dummy BE for ul memif to record from dl memif */976	{977		.name = "Hostless_UL1",978		.no_pcm = 1,979		.dpcm_capture = 1,980		.ignore_suspend = 1,981		SND_SOC_DAILINK_REG(hostless_ul1),982	},983	{984		.name = "Hostless_UL2",985		.no_pcm = 1,986		.dpcm_capture = 1,987		.ignore_suspend = 1,988		SND_SOC_DAILINK_REG(hostless_ul2),989	},990	{991		.name = "Hostless_UL3",992		.no_pcm = 1,993		.dpcm_capture = 1,994		.ignore_suspend = 1,995		SND_SOC_DAILINK_REG(hostless_ul3),996	},997	{998		.name = "Hostless_UL5",999		.no_pcm = 1,1000		.dpcm_capture = 1,1001		.ignore_suspend = 1,1002		SND_SOC_DAILINK_REG(hostless_ul5),1003	},1004	{1005		.name = "Hostless_UL6",1006		.no_pcm = 1,1007		.dpcm_capture = 1,1008		.ignore_suspend = 1,1009		SND_SOC_DAILINK_REG(hostless_ul6),1010	},1011	/* SOF BE */1012	{1013		.name = "AFE_SOF_DL1",1014		.no_pcm = 1,1015		.dpcm_playback = 1,1016		SND_SOC_DAILINK_REG(AFE_SOF_DL1),1017	},1018	{1019		.name = "AFE_SOF_DL2",1020		.no_pcm = 1,1021		.dpcm_playback = 1,1022		SND_SOC_DAILINK_REG(AFE_SOF_DL2),1023	},1024	{1025		.name = "AFE_SOF_UL1",1026		.no_pcm = 1,1027		.dpcm_capture = 1,1028		SND_SOC_DAILINK_REG(AFE_SOF_UL1),1029	},1030	{1031		.name = "AFE_SOF_UL2",1032		.no_pcm = 1,1033		.dpcm_capture = 1,1034		SND_SOC_DAILINK_REG(AFE_SOF_UL2),1035	},1036};1037 1038static const struct snd_soc_dapm_widget1039mt8186_mt6366_da7219_max98357_widgets[] = {1040	SND_SOC_DAPM_SPK("Speakers", NULL),1041	SND_SOC_DAPM_HP("Headphones", NULL),1042	SND_SOC_DAPM_MIC("Headset Mic", NULL),1043	SND_SOC_DAPM_LINE("Line Out", NULL),1044	SND_SOC_DAPM_LINE("HDMI1", NULL),1045	SND_SOC_DAPM_MIXER(SOF_DMA_DL1, SND_SOC_NOPM, 0, 0, NULL, 0),1046	SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0),1047	SND_SOC_DAPM_MIXER(SOF_DMA_UL1, SND_SOC_NOPM, 0, 0, NULL, 0),1048	SND_SOC_DAPM_MIXER(SOF_DMA_UL2, SND_SOC_NOPM, 0, 0, NULL, 0),1049};1050 1051static const struct snd_soc_dapm_widget1052mt8186_mt6366_rt1019_rt5682s_widgets[] = {1053	SND_SOC_DAPM_SPK("Speakers", NULL),1054	SND_SOC_DAPM_HP("Headphone", NULL),1055	SND_SOC_DAPM_MIC("Headset Mic", NULL),1056	SND_SOC_DAPM_OUTPUT("HDMI1"),1057	SND_SOC_DAPM_MIXER(SOF_DMA_DL1, SND_SOC_NOPM, 0, 0, NULL, 0),1058	SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0),1059	SND_SOC_DAPM_MIXER(SOF_DMA_UL1, SND_SOC_NOPM, 0, 0, NULL, 0),1060	SND_SOC_DAPM_MIXER(SOF_DMA_UL2, SND_SOC_NOPM, 0, 0, NULL, 0),1061};1062 1063static const struct snd_soc_dapm_route1064mt8186_mt6366_rt1019_rt5682s_routes[] = {1065	/* SPK */1066	{ "Speakers", NULL, "Speaker" },1067	/* Headset */1068	{ "Headphone", NULL, "HPOL" },1069	{ "Headphone", NULL, "HPOR" },1070	{ "IN1P", NULL, "Headset Mic" },1071	/* HDMI */1072	{ "HDMI1", NULL, "TX" },1073	/* SOF Uplink */1074	{SOF_DMA_UL1, NULL, "UL1_CH1"},1075	{SOF_DMA_UL1, NULL, "UL1_CH2"},1076	{SOF_DMA_UL2, NULL, "UL2_CH1"},1077	{SOF_DMA_UL2, NULL, "UL2_CH2"},1078	/* SOF Downlink */1079	{"DSP_DL1_VIRT", NULL, SOF_DMA_DL1},1080	{"DSP_DL2_VIRT", NULL, SOF_DMA_DL2},1081};1082 1083static const struct snd_soc_dapm_route mt8186_mt6366_rt5650_routes[] = {1084	/* SPK */1085	{"Speakers", NULL, "SPOL"},1086	{"Speakers", NULL, "SPOR"},1087	/* Headset */1088	{ "Headphone", NULL, "HPOL" },1089	{ "Headphone", NULL, "HPOR" },1090	{ "IN1P", NULL, "Headset Mic" },1091	{ "IN1N", NULL, "Headset Mic"},1092	/* HDMI */1093	{ "HDMI1", NULL, "TX" },1094	/* SOF Uplink */1095	{SOF_DMA_UL1, NULL, "UL1_CH1"},1096	{SOF_DMA_UL1, NULL, "UL1_CH2"},1097	{SOF_DMA_UL2, NULL, "UL2_CH1"},1098	{SOF_DMA_UL2, NULL, "UL2_CH2"},1099	/* SOF Downlink */1100	{"DSP_DL1_VIRT", NULL, SOF_DMA_DL1},1101	{"DSP_DL2_VIRT", NULL, SOF_DMA_DL2},1102};1103 1104static const struct snd_kcontrol_new mt8186_mt6366_da7219_max98357_controls[] = {1105	SOC_DAPM_PIN_SWITCH("Speakers"),1106	SOC_DAPM_PIN_SWITCH("Headphones"),1107	SOC_DAPM_PIN_SWITCH("Headset Mic"),1108	SOC_DAPM_PIN_SWITCH("Line Out"),1109	SOC_DAPM_PIN_SWITCH("HDMI1"),1110};1111 1112static const struct snd_kcontrol_new1113mt8186_mt6366_rt1019_rt5682s_controls[] = {1114	SOC_DAPM_PIN_SWITCH("Speakers"),1115	SOC_DAPM_PIN_SWITCH("Headphone"),1116	SOC_DAPM_PIN_SWITCH("Headset Mic"),1117	SOC_DAPM_PIN_SWITCH("HDMI1"),1118};1119 1120static struct snd_soc_card mt8186_mt6366_da7219_max98357_soc_card = {1121	.name = "mt8186_da7219_max98357",1122	.owner = THIS_MODULE,1123	.dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,1124	.num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),1125	.controls = mt8186_mt6366_da7219_max98357_controls,1126	.num_controls = ARRAY_SIZE(mt8186_mt6366_da7219_max98357_controls),1127	.dapm_widgets = mt8186_mt6366_da7219_max98357_widgets,1128	.num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_da7219_max98357_widgets),1129	.dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,1130	.num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),1131	.codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,1132	.num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),1133};1134 1135static struct snd_soc_card mt8186_mt6366_rt1019_rt5682s_soc_card = {1136	.name = "mt8186_rt1019_rt5682s",1137	.owner = THIS_MODULE,1138	.dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,1139	.num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),1140	.controls = mt8186_mt6366_rt1019_rt5682s_controls,1141	.num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),1142	.dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,1143	.num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),1144	.dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,1145	.num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),1146	.codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,1147	.num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),1148};1149 1150static struct snd_soc_card mt8186_mt6366_rt5682s_max98360_soc_card = {1151	.name = "mt8186_rt5682s_max98360",1152	.owner = THIS_MODULE,1153	.dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,1154	.num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),1155	.controls = mt8186_mt6366_rt1019_rt5682s_controls,1156	.num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),1157	.dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,1158	.num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),1159	.dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,1160	.num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),1161	.codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,1162	.num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),1163};1164 1165static struct snd_soc_card mt8186_mt6366_rt5650_soc_card = {1166	.name = "mt8186_rt5650",1167	.owner = THIS_MODULE,1168	.dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,1169	.num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),1170	.controls = mt8186_mt6366_rt1019_rt5682s_controls,1171	.num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),1172	.dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,1173	.num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),1174	.dapm_routes = mt8186_mt6366_rt5650_routes,1175	.num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt5650_routes),1176	.codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,1177	.num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),1178};1179 1180static int mt8186_mt6366_legacy_probe(struct mtk_soc_card_data *soc_card_data)1181{1182	struct mtk_platform_card_data *card_data = soc_card_data->card_data;1183	struct snd_soc_card *card = card_data->card;1184	struct device *dev = card->dev;1185	struct snd_soc_dai_link *dai_link;1186	struct device_node *headset_codec, *playback_codec;1187	int ret, i;1188 1189	playback_codec = of_get_child_by_name(dev->of_node, "playback-codecs");1190	if (!playback_codec)1191		return dev_err_probe(dev, -EINVAL,1192				     "Property 'playback-codecs' missing or invalid\n");1193 1194	headset_codec = of_get_child_by_name(dev->of_node, "headset-codec");1195	if (!headset_codec) {1196		of_node_put(playback_codec);1197		return dev_err_probe(dev, -EINVAL,1198				     "Property 'headset-codec' missing or invalid\n");1199	}1200 1201	for_each_card_prelinks(card, i, dai_link) {1202		ret = mt8186_mt6366_card_set_be_link(card, dai_link, playback_codec, "I2S3");1203		if (ret) {1204			dev_err_probe(dev, ret, "%s set playback_codec fail\n",1205				      dai_link->name);1206			break;1207		}1208 1209		ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S0");1210		if (ret) {1211			dev_err_probe(dev, ret, "%s set headset_codec fail\n",1212				      dai_link->name);1213			break;1214		}1215 1216		ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S1");1217		if (ret) {1218			dev_err_probe(dev, ret, "%s set headset_codec fail\n",1219				      dai_link->name);1220			break;1221		}1222	}1223	of_node_put(headset_codec);1224	of_node_put(playback_codec);1225 1226	return ret;1227}1228 1229static int mt8186_mt6366_soc_card_probe(struct mtk_soc_card_data *soc_card_data, bool legacy)1230{1231	struct mtk_platform_card_data *card_data = soc_card_data->card_data;1232	struct snd_soc_card *card = card_data->card;1233	struct snd_soc_dai_link *dai_link;1234	struct mt8186_mt6366_rt1019_rt5682s_priv *mach_priv;1235	int i, ret;1236 1237	mach_priv = devm_kzalloc(card->dev, sizeof(*mach_priv), GFP_KERNEL);1238	if (!mach_priv)1239		return -ENOMEM;1240 1241	soc_card_data->mach_priv = mach_priv;1242 1243	mach_priv->dmic_sel = devm_gpiod_get_optional(card->dev,1244						      "dmic", GPIOD_OUT_LOW);1245	if (IS_ERR(mach_priv->dmic_sel))1246		return dev_err_probe(card->dev, PTR_ERR(mach_priv->dmic_sel),1247				     "DMIC gpio failed\n");1248 1249	for_each_card_prelinks(card, i, dai_link) {1250		if (strcmp(dai_link->name, "I2S0") == 0 ||1251		    strcmp(dai_link->name, "I2S1") == 0 ||1252		    strcmp(dai_link->name, "I2S2") == 0) {1253			if (card_data->flags & DA7219_CODEC_PRESENT) {1254				dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_32le_fixup;1255				dai_link->ops = &mt8186_da7219_i2s_ops;1256			} else {1257				dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_24le_fixup;1258				dai_link->ops = &mt8186_rt5682s_i2s_ops;1259			}1260		} else if (strcmp(dai_link->name, "I2S3") == 0) {1261			if (card_data->flags & DA7219_CODEC_PRESENT)1262				dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_24le_fixup;1263			else1264				dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_32le_fixup;1265		}1266	}1267 1268	if (legacy) {1269		ret = mt8186_mt6366_legacy_probe(soc_card_data);1270		if (ret)1271			return ret;1272	}1273 1274	ret = mt8186_afe_gpio_init(card->dev);1275	if (ret)1276		return dev_err_probe(card->dev, ret, "init AFE gpio error\n");1277 1278	return 0;1279}1280 1281static const unsigned int mt8186_pcm_playback_channels[] = { 2 };1282static const unsigned int mt8186_pcm_capture_channels[] = { 1, 2 };1283static const unsigned int mt8186_pcm_rates[] = { 48000 };1284 1285static const struct snd_pcm_hw_constraint_list mt8186_rate_constraint = {1286	.list = mt8186_pcm_rates,1287	.count = ARRAY_SIZE(mt8186_pcm_rates)1288};1289 1290static const struct mtk_pcm_constraints_data mt8186_pcm_constraints[MTK_CONSTRAINT_CAPTURE + 1] = {1291	[MTK_CONSTRAINT_PLAYBACK] = {1292		.channels = &(const struct snd_pcm_hw_constraint_list) {1293			.list = mt8186_pcm_playback_channels,1294			.count = ARRAY_SIZE(mt8186_pcm_playback_channels)1295		},1296		.rates = &mt8186_rate_constraint,1297	},1298	[MTK_CONSTRAINT_CAPTURE] = {1299		.channels = &(const struct snd_pcm_hw_constraint_list) {1300			.list = mt8186_pcm_capture_channels,1301			.count = ARRAY_SIZE(mt8186_pcm_capture_channels)1302		},1303		.rates = &mt8186_rate_constraint,1304	}1305};1306 1307static const struct mtk_sof_priv mt8186_sof_priv = {1308	.conn_streams = g_sof_conn_streams,1309	.num_streams = ARRAY_SIZE(g_sof_conn_streams),1310	.sof_dai_link_fixup = mt8186_sof_dai_link_fixup1311};1312 1313static const struct mtk_soundcard_pdata mt8186_mt6366_da7219_max98357_pdata = {1314	.card_data = &(struct mtk_platform_card_data) {1315		.card = &mt8186_mt6366_da7219_max98357_soc_card,1316		.num_jacks = MT8186_JACK_MAX,1317		.pcm_constraints = mt8186_pcm_constraints,1318		.num_pcm_constraints = ARRAY_SIZE(mt8186_pcm_constraints),1319		.flags = DA7219_CODEC_PRESENT,1320	},1321	.sof_priv = &mt8186_sof_priv,1322	.soc_probe = mt8186_mt6366_soc_card_probe1323};1324 1325static const struct mtk_soundcard_pdata mt8186_mt6366_rt1019_rt5682s_pdata = {1326	.card_data = &(struct mtk_platform_card_data) {1327		.card = &mt8186_mt6366_rt1019_rt5682s_soc_card,1328		.num_jacks = MT8186_JACK_MAX,1329		.pcm_constraints = mt8186_pcm_constraints,1330		.num_pcm_constraints = ARRAY_SIZE(mt8186_pcm_constraints),1331	},1332	.sof_priv = &mt8186_sof_priv,1333	.soc_probe = mt8186_mt6366_soc_card_probe1334};1335 1336static const struct mtk_soundcard_pdata mt8186_mt6366_rt5682s_max98360_pdata = {1337	.card_data = &(struct mtk_platform_card_data) {1338		.card = &mt8186_mt6366_rt5682s_max98360_soc_card,1339		.num_jacks = MT8186_JACK_MAX,1340		.pcm_constraints = mt8186_pcm_constraints,1341		.num_pcm_constraints = ARRAY_SIZE(mt8186_pcm_constraints),1342	},1343	.sof_priv = &mt8186_sof_priv,1344	.soc_probe = mt8186_mt6366_soc_card_probe1345};1346 1347static const struct mtk_soundcard_pdata mt8186_mt6366_rt5650_pdata = {1348	.card_data = &(struct mtk_platform_card_data) {1349		.card = &mt8186_mt6366_rt5650_soc_card,1350		.num_jacks = MT8186_JACK_MAX,1351		.pcm_constraints = mt8186_pcm_constraints,1352		.num_pcm_constraints = ARRAY_SIZE(mt8186_pcm_constraints),1353	},1354	.sof_priv = &mt8186_sof_priv,1355	.soc_probe = mt8186_mt6366_soc_card_probe1356};1357 1358#if IS_ENABLED(CONFIG_OF)1359static const struct of_device_id mt8186_mt6366_dt_match[] = {1360	{1361		.compatible = "mediatek,mt8186-mt6366-rt1019-rt5682s-sound",1362		.data = &mt8186_mt6366_rt1019_rt5682s_pdata,1363	},1364	{1365		.compatible = "mediatek,mt8186-mt6366-rt5682s-max98360-sound",1366		.data = &mt8186_mt6366_rt5682s_max98360_pdata,1367	},1368	{1369		.compatible = "mediatek,mt8186-mt6366-rt5650-sound",1370		.data = &mt8186_mt6366_rt5650_pdata,1371	},1372	{1373		.compatible = "mediatek,mt8186-mt6366-da7219-max98357-sound",1374		.data = &mt8186_mt6366_da7219_max98357_pdata,1375	},1376	{ /* sentinel */ }1377};1378MODULE_DEVICE_TABLE(of, mt8186_mt6366_dt_match);1379#endif1380 1381static struct platform_driver mt8186_mt6366_driver = {1382	.driver = {1383		.name = "mt8186_mt6366",1384#if IS_ENABLED(CONFIG_OF)1385		.of_match_table = mt8186_mt6366_dt_match,1386#endif1387		.pm = &snd_soc_pm_ops,1388	},1389	.probe = mtk_soundcard_common_probe,1390};1391 1392module_platform_driver(mt8186_mt6366_driver);1393 1394/* Module information */1395MODULE_DESCRIPTION("MT8186-MT6366 ALSA SoC machine driver");1396MODULE_AUTHOR("Jiaxin Yu <jiaxin.yu@mediatek.com>");1397MODULE_LICENSE("GPL v2");1398MODULE_ALIAS("mt8186_mt6366 soc card");1399