Path: blob/master/sound/soc/mediatek/mt8186/mt8186-mt6366.c
26488 views
// SPDX-License-Identifier: GPL-2.01//2// mt8186-mt6366.c3// -- MT8186-MT6366 ALSA SoC machine driver4//5// Copyright (c) 2022 MediaTek Inc.6// Author: Jiaxin Yu <[email protected]>7//8// Copyright (c) 2024 Collabora Ltd.9// AngeloGioacchino Del Regno <[email protected]>10//1112#include <linux/gpio/consumer.h>13#include <linux/input.h>14#include <linux/module.h>15#include <linux/of.h>16#include <sound/jack.h>17#include <sound/pcm_params.h>18#include <sound/rt5682.h>19#include <sound/soc.h>2021#include "../../codecs/da7219.h"22#include "../../codecs/mt6358.h"23#include "../../codecs/rt5682.h"24#include "../common/mtk-afe-platform-driver.h"25#include "../common/mtk-dsp-sof-common.h"26#include "../common/mtk-soc-card.h"27#include "../common/mtk-soundcard-driver.h"28#include "mt8186-afe-common.h"29#include "mt8186-afe-clk.h"30#include "mt8186-afe-gpio.h"31#include "mt8186-mt6366-common.h"3233#define RT1019_CODEC_DAI "HiFi"34#define RT1019_DEV0_NAME "rt1019p"3536#define RT5682S_CODEC_DAI "rt5682s-aif1"37#define RT5682S_DEV0_NAME "rt5682s.5-001a"3839#define DA7219_CODEC_DAI "da7219-hifi"40#define DA7219_DEV_NAME "da7219.5-001a"4142#define SOF_DMA_DL1 "SOF_DMA_DL1"43#define SOF_DMA_DL2 "SOF_DMA_DL2"44#define SOF_DMA_UL1 "SOF_DMA_UL1"45#define SOF_DMA_UL2 "SOF_DMA_UL2"4647#define DA7219_CODEC_PRESENT BIT(0)4849struct mt8186_mt6366_rt1019_rt5682s_priv {50struct gpio_desc *dmic_sel;51int dmic_switch;52};5354enum mt8186_jacks {55MT8186_JACK_HEADSET,56MT8186_JACK_HDMI,57MT8186_JACK_MAX,58};5960/* Headset jack detection DAPM pins */61static struct snd_soc_jack_pin mt8186_jack_pins[] = {62{63.pin = "Headphone",64.mask = SND_JACK_HEADPHONE,65},66{67.pin = "Headset Mic",68.mask = SND_JACK_MICROPHONE,69},70};7172static struct snd_soc_codec_conf mt8186_mt6366_rt1019_rt5682s_codec_conf[] = {73{74.dlc = COMP_CODEC_CONF("mt6358-sound"),75.name_prefix = "Mt6366",76},77{78.dlc = COMP_CODEC_CONF("bt-sco"),79.name_prefix = "Mt8186 bt",80},81{82.dlc = COMP_CODEC_CONF("hdmi-audio-codec"),83.name_prefix = "Mt8186 hdmi",84},85};8687static int dmic_get(struct snd_kcontrol *kcontrol,88struct snd_ctl_elem_value *ucontrol)89{90struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol);91struct mtk_soc_card_data *soc_card_data =92snd_soc_card_get_drvdata(dapm->card);93struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;9495ucontrol->value.integer.value[0] = priv->dmic_switch;96return 0;97}9899static int dmic_set(struct snd_kcontrol *kcontrol,100struct snd_ctl_elem_value *ucontrol)101{102struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol);103struct mtk_soc_card_data *soc_card_data =104snd_soc_card_get_drvdata(dapm->card);105struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;106107priv->dmic_switch = ucontrol->value.integer.value[0];108if (priv->dmic_sel) {109gpiod_set_value(priv->dmic_sel, priv->dmic_switch);110dev_dbg(dapm->card->dev, "dmic_set_value %d\n",111priv->dmic_switch);112}113return 0;114}115116static const char * const dmic_mux_text[] = {117"Front Mic",118"Rear Mic",119};120121static SOC_ENUM_SINGLE_DECL(mt8186_dmic_enum,122SND_SOC_NOPM, 0, dmic_mux_text);123124static const struct snd_kcontrol_new mt8186_dmic_mux_control =125SOC_DAPM_ENUM_EXT("DMIC Select Mux", mt8186_dmic_enum,126dmic_get, dmic_set);127128static const struct snd_soc_dapm_widget dmic_widgets[] = {129SND_SOC_DAPM_MIC("DMIC", NULL),130SND_SOC_DAPM_MUX("Dmic Mux", SND_SOC_NOPM, 0, 0, &mt8186_dmic_mux_control),131};132133static const struct snd_soc_dapm_route dmic_map[] = {134/* digital mics */135{"Dmic Mux", "Front Mic", "DMIC"},136{"Dmic Mux", "Rear Mic", "DMIC"},137};138139static int primary_codec_init(struct snd_soc_pcm_runtime *rtd)140{141struct snd_soc_card *card = rtd->card;142struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card);143struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;144int ret;145146ret = mt8186_mt6366_init(rtd);147148if (ret) {149dev_err(card->dev, "mt8186_mt6366_init failed: %d\n", ret);150return ret;151}152153if (!priv->dmic_sel) {154dev_dbg(card->dev, "dmic_sel is null\n");155return 0;156}157158ret = snd_soc_dapm_new_controls(&card->dapm, dmic_widgets,159ARRAY_SIZE(dmic_widgets));160if (ret) {161dev_err(card->dev, "DMic widget addition failed: %d\n", ret);162/* Don't need to add routes if widget addition failed */163return ret;164}165166ret = snd_soc_dapm_add_routes(&card->dapm, dmic_map,167ARRAY_SIZE(dmic_map));168169if (ret)170dev_err(card->dev, "DMic map addition failed: %d\n", ret);171172return ret;173}174175static int mt8186_headset_codec_init(struct snd_soc_pcm_runtime *rtd)176{177struct snd_soc_component *cmpnt_afe =178snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);179struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);180struct mtk_soc_card_data *soc_card_data =181snd_soc_card_get_drvdata(rtd->card);182struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8186_JACK_HEADSET];183struct snd_soc_component *cmpnt_codec =184snd_soc_rtd_to_codec(rtd, 0)->component;185const int hs_keys_rt5682[] = {186KEY_PLAYPAUSE, KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_VOICECOMMAND187};188const int hs_keys_da7219[] = {189KEY_PLAYPAUSE, KEY_VOICECOMMAND, KEY_VOLUMEUP, KEY_VOLUMEDOWN190};191const int *hs_keys;192int ret;193int type;194195ret = mt8186_dai_i2s_set_share(afe, "I2S1", "I2S0");196if (ret) {197dev_err(rtd->dev, "Failed to set up shared clocks\n");198return ret;199}200201ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",202SND_JACK_HEADSET | SND_JACK_BTN_0 |203SND_JACK_BTN_1 | SND_JACK_BTN_2 |204SND_JACK_BTN_3,205jack, mt8186_jack_pins,206ARRAY_SIZE(mt8186_jack_pins));207if (ret) {208dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);209return ret;210}211212if (soc_card_data->card_data->flags & DA7219_CODEC_PRESENT)213hs_keys = hs_keys_da7219;214else215hs_keys = hs_keys_rt5682;216217snd_jack_set_key(jack->jack, SND_JACK_BTN_0, hs_keys[0]);218snd_jack_set_key(jack->jack, SND_JACK_BTN_1, hs_keys[1]);219snd_jack_set_key(jack->jack, SND_JACK_BTN_2, hs_keys[2]);220snd_jack_set_key(jack->jack, SND_JACK_BTN_3, hs_keys[3]);221222type = SND_JACK_HEADSET | SND_JACK_BTN_0 | SND_JACK_BTN_1 | SND_JACK_BTN_2 | SND_JACK_BTN_3;223return snd_soc_component_set_jack(cmpnt_codec, jack, (void *)&type);224}225226static int mt8186_da7219_i2s_hw_params(struct snd_pcm_substream *substream,227struct snd_pcm_hw_params *params)228{229struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);230struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);231struct snd_soc_dai *codec_dai;232unsigned int rate = params_rate(params);233unsigned int mclk_fs_ratio = 256;234unsigned int mclk_fs = rate * mclk_fs_ratio;235unsigned int freq;236int ret, j;237238ret = snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);239if (ret < 0) {240dev_err(rtd->dev, "failed to set cpu dai sysclk: %d\n", ret);241return ret;242}243244for_each_rtd_codec_dais(rtd, j, codec_dai) {245if (strcmp(codec_dai->component->name, DA7219_DEV_NAME))246continue;247248ret = snd_soc_dai_set_sysclk(codec_dai, DA7219_CLKSRC_MCLK,249mclk_fs, SND_SOC_CLOCK_IN);250if (ret < 0) {251dev_err(rtd->dev, "failed to set sysclk: %d\n", ret);252return ret;253}254255if ((rate % 8000) == 0)256freq = DA7219_PLL_FREQ_OUT_98304;257else258freq = DA7219_PLL_FREQ_OUT_90316;259260ret = snd_soc_dai_set_pll(codec_dai, 0, DA7219_SYSCLK_PLL_SRM,2610, freq);262if (ret) {263dev_err(rtd->dev, "failed to start PLL: %d\n", ret);264return ret;265}266}267268return 0;269}270271static int mt8186_da7219_i2s_hw_free(struct snd_pcm_substream *substream)272{273struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);274struct snd_soc_dai *codec_dai;275int j, ret;276277for_each_rtd_codec_dais(rtd, j, codec_dai) {278if (strcmp(codec_dai->component->name, DA7219_DEV_NAME))279continue;280281ret = snd_soc_dai_set_pll(codec_dai, 0, DA7219_SYSCLK_MCLK, 0, 0);282if (ret < 0) {283dev_err(rtd->dev, "failed to stop PLL: %d\n", ret);284return ret;285}286}287288return 0;289}290291static const struct snd_soc_ops mt8186_da7219_i2s_ops = {292.hw_params = mt8186_da7219_i2s_hw_params,293.hw_free = mt8186_da7219_i2s_hw_free,294};295296static int mt8186_rt5682s_i2s_hw_params(struct snd_pcm_substream *substream,297struct snd_pcm_hw_params *params)298{299struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);300struct snd_soc_card *card = rtd->card;301struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);302struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);303unsigned int rate = params_rate(params);304unsigned int mclk_fs_ratio = 128;305unsigned int mclk_fs = rate * mclk_fs_ratio;306int bitwidth;307int ret;308309bitwidth = snd_pcm_format_width(params_format(params));310if (bitwidth < 0) {311dev_err(card->dev, "invalid bit width: %d\n", bitwidth);312return bitwidth;313}314315ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);316if (ret) {317dev_err(card->dev, "failed to set tdm slot\n");318return ret;319}320321ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1,322RT5682_PLL1_S_BCLK1,323params_rate(params) * 64,324params_rate(params) * 512);325if (ret) {326dev_err(card->dev, "failed to set pll\n");327return ret;328}329330ret = snd_soc_dai_set_sysclk(codec_dai,331RT5682_SCLK_S_PLL1,332params_rate(params) * 512,333SND_SOC_CLOCK_IN);334if (ret) {335dev_err(card->dev, "failed to set sysclk\n");336return ret;337}338339return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);340}341342static const struct snd_soc_ops mt8186_rt5682s_i2s_ops = {343.hw_params = mt8186_rt5682s_i2s_hw_params,344};345346static int mt8186_mt6366_rt1019_rt5682s_hdmi_init(struct snd_soc_pcm_runtime *rtd)347{348struct snd_soc_component *cmpnt_afe =349snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);350struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);351struct snd_soc_component *cmpnt_codec =352snd_soc_rtd_to_codec(rtd, 0)->component;353struct mtk_soc_card_data *soc_card_data =354snd_soc_card_get_drvdata(rtd->card);355struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8186_JACK_HDMI];356int ret;357358ret = mt8186_dai_i2s_set_share(afe, "I2S2", "I2S3");359if (ret) {360dev_err(rtd->dev, "Failed to set up shared clocks\n");361return ret;362}363364ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT, jack);365if (ret) {366dev_err(rtd->dev, "HDMI Jack creation failed: %d\n", ret);367return ret;368}369370return snd_soc_component_set_jack(cmpnt_codec, jack, NULL);371}372373static int mt8186_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,374struct snd_pcm_hw_params *params,375snd_pcm_format_t fmt)376{377struct snd_interval *channels = hw_param_interval(params,378SNDRV_PCM_HW_PARAM_CHANNELS);379380dev_dbg(rtd->dev, "%s(), fix format to %d\n", __func__, fmt);381382/* fix BE i2s channel to 2 channel */383channels->min = 2;384channels->max = 2;385386/* clean param mask first */387snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),3880, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);389390params_set_format(params, fmt);391392return 0;393}394395static int mt8186_i2s_hw_params_24le_fixup(struct snd_soc_pcm_runtime *rtd,396struct snd_pcm_hw_params *params)397{398return mt8186_hw_params_fixup(rtd, params, SNDRV_PCM_FORMAT_S24_LE);399}400401static int mt8186_i2s_hw_params_32le_fixup(struct snd_soc_pcm_runtime *rtd,402struct snd_pcm_hw_params *params)403{404return mt8186_hw_params_fixup(rtd, params, SNDRV_PCM_FORMAT_S32_LE);405}406407/* fixup the BE DAI link to match any values from topology */408static int mt8186_sof_dai_link_fixup(struct snd_soc_pcm_runtime *rtd,409struct snd_pcm_hw_params *params)410{411struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);412int ret;413414ret = mtk_sof_dai_link_fixup(rtd, params);415416if (!strcmp(rtd->dai_link->name, "I2S0") ||417!strcmp(rtd->dai_link->name, "I2S1") ||418!strcmp(rtd->dai_link->name, "I2S2")) {419if (soc_card_data->card_data->flags & DA7219_CODEC_PRESENT)420mt8186_i2s_hw_params_32le_fixup(rtd, params);421else422mt8186_i2s_hw_params_24le_fixup(rtd, params);423} else if (!strcmp(rtd->dai_link->name, "I2S3")) {424if (soc_card_data->card_data->flags & DA7219_CODEC_PRESENT)425mt8186_i2s_hw_params_24le_fixup(rtd, params);426else427mt8186_i2s_hw_params_32le_fixup(rtd, params);428}429430return ret;431}432433/* FE */434SND_SOC_DAILINK_DEFS(playback1,435DAILINK_COMP_ARRAY(COMP_CPU("DL1")),436DAILINK_COMP_ARRAY(COMP_DUMMY()),437DAILINK_COMP_ARRAY(COMP_EMPTY()));438439SND_SOC_DAILINK_DEFS(playback12,440DAILINK_COMP_ARRAY(COMP_CPU("DL12")),441DAILINK_COMP_ARRAY(COMP_DUMMY()),442DAILINK_COMP_ARRAY(COMP_EMPTY()));443444SND_SOC_DAILINK_DEFS(playback2,445DAILINK_COMP_ARRAY(COMP_CPU("DL2")),446DAILINK_COMP_ARRAY(COMP_DUMMY()),447DAILINK_COMP_ARRAY(COMP_EMPTY()));448449SND_SOC_DAILINK_DEFS(playback3,450DAILINK_COMP_ARRAY(COMP_CPU("DL3")),451DAILINK_COMP_ARRAY(COMP_DUMMY()),452DAILINK_COMP_ARRAY(COMP_EMPTY()));453454SND_SOC_DAILINK_DEFS(playback4,455DAILINK_COMP_ARRAY(COMP_CPU("DL4")),456DAILINK_COMP_ARRAY(COMP_DUMMY()),457DAILINK_COMP_ARRAY(COMP_EMPTY()));458459SND_SOC_DAILINK_DEFS(playback5,460DAILINK_COMP_ARRAY(COMP_CPU("DL5")),461DAILINK_COMP_ARRAY(COMP_DUMMY()),462DAILINK_COMP_ARRAY(COMP_EMPTY()));463464SND_SOC_DAILINK_DEFS(playback6,465DAILINK_COMP_ARRAY(COMP_CPU("DL6")),466DAILINK_COMP_ARRAY(COMP_DUMMY()),467DAILINK_COMP_ARRAY(COMP_EMPTY()));468469SND_SOC_DAILINK_DEFS(playback7,470DAILINK_COMP_ARRAY(COMP_CPU("DL7")),471DAILINK_COMP_ARRAY(COMP_DUMMY()),472DAILINK_COMP_ARRAY(COMP_EMPTY()));473474SND_SOC_DAILINK_DEFS(playback8,475DAILINK_COMP_ARRAY(COMP_CPU("DL8")),476DAILINK_COMP_ARRAY(COMP_DUMMY()),477DAILINK_COMP_ARRAY(COMP_EMPTY()));478479SND_SOC_DAILINK_DEFS(capture1,480DAILINK_COMP_ARRAY(COMP_CPU("UL1")),481DAILINK_COMP_ARRAY(COMP_DUMMY()),482DAILINK_COMP_ARRAY(COMP_EMPTY()));483484SND_SOC_DAILINK_DEFS(capture2,485DAILINK_COMP_ARRAY(COMP_CPU("UL2")),486DAILINK_COMP_ARRAY(COMP_DUMMY()),487DAILINK_COMP_ARRAY(COMP_EMPTY()));488489SND_SOC_DAILINK_DEFS(capture3,490DAILINK_COMP_ARRAY(COMP_CPU("UL3")),491DAILINK_COMP_ARRAY(COMP_DUMMY()),492DAILINK_COMP_ARRAY(COMP_EMPTY()));493494SND_SOC_DAILINK_DEFS(capture4,495DAILINK_COMP_ARRAY(COMP_CPU("UL4")),496DAILINK_COMP_ARRAY(COMP_DUMMY()),497DAILINK_COMP_ARRAY(COMP_EMPTY()));498499SND_SOC_DAILINK_DEFS(capture5,500DAILINK_COMP_ARRAY(COMP_CPU("UL5")),501DAILINK_COMP_ARRAY(COMP_DUMMY()),502DAILINK_COMP_ARRAY(COMP_EMPTY()));503504SND_SOC_DAILINK_DEFS(capture6,505DAILINK_COMP_ARRAY(COMP_CPU("UL6")),506DAILINK_COMP_ARRAY(COMP_DUMMY()),507DAILINK_COMP_ARRAY(COMP_EMPTY()));508509SND_SOC_DAILINK_DEFS(capture7,510DAILINK_COMP_ARRAY(COMP_CPU("UL7")),511DAILINK_COMP_ARRAY(COMP_DUMMY()),512DAILINK_COMP_ARRAY(COMP_EMPTY()));513514/* hostless */515SND_SOC_DAILINK_DEFS(hostless_lpbk,516DAILINK_COMP_ARRAY(COMP_CPU("Hostless LPBK DAI")),517DAILINK_COMP_ARRAY(COMP_DUMMY()),518DAILINK_COMP_ARRAY(COMP_EMPTY()));519SND_SOC_DAILINK_DEFS(hostless_fm,520DAILINK_COMP_ARRAY(COMP_CPU("Hostless FM DAI")),521DAILINK_COMP_ARRAY(COMP_DUMMY()),522DAILINK_COMP_ARRAY(COMP_EMPTY()));523SND_SOC_DAILINK_DEFS(hostless_src1,524DAILINK_COMP_ARRAY(COMP_CPU("Hostless_SRC_1_DAI")),525DAILINK_COMP_ARRAY(COMP_DUMMY()),526DAILINK_COMP_ARRAY(COMP_EMPTY()));527SND_SOC_DAILINK_DEFS(hostless_src_bargein,528DAILINK_COMP_ARRAY(COMP_CPU("Hostless_SRC_Bargein_DAI")),529DAILINK_COMP_ARRAY(COMP_DUMMY()),530DAILINK_COMP_ARRAY(COMP_EMPTY()));531532/* BE */533SND_SOC_DAILINK_DEFS(adda,534DAILINK_COMP_ARRAY(COMP_CPU("ADDA")),535DAILINK_COMP_ARRAY(COMP_CODEC("mt6358-sound",536"mt6358-snd-codec-aif1"),537COMP_CODEC("dmic-codec",538"dmic-hifi")),539DAILINK_COMP_ARRAY(COMP_EMPTY()));540SND_SOC_DAILINK_DEFS(i2s0,541DAILINK_COMP_ARRAY(COMP_CPU("I2S0")),542DAILINK_COMP_ARRAY(COMP_EMPTY()),543DAILINK_COMP_ARRAY(COMP_EMPTY()));544SND_SOC_DAILINK_DEFS(i2s1,545DAILINK_COMP_ARRAY(COMP_CPU("I2S1")),546DAILINK_COMP_ARRAY(COMP_EMPTY()),547DAILINK_COMP_ARRAY(COMP_EMPTY()));548SND_SOC_DAILINK_DEFS(i2s2,549DAILINK_COMP_ARRAY(COMP_CPU("I2S2")),550DAILINK_COMP_ARRAY(COMP_DUMMY()),551DAILINK_COMP_ARRAY(COMP_EMPTY()));552SND_SOC_DAILINK_DEFS(i2s3,553DAILINK_COMP_ARRAY(COMP_CPU("I2S3")),554DAILINK_COMP_ARRAY(COMP_EMPTY()),555DAILINK_COMP_ARRAY(COMP_EMPTY()));556SND_SOC_DAILINK_DEFS(hw_gain1,557DAILINK_COMP_ARRAY(COMP_CPU("HW Gain 1")),558DAILINK_COMP_ARRAY(COMP_DUMMY()),559DAILINK_COMP_ARRAY(COMP_EMPTY()));560SND_SOC_DAILINK_DEFS(hw_gain2,561DAILINK_COMP_ARRAY(COMP_CPU("HW Gain 2")),562DAILINK_COMP_ARRAY(COMP_DUMMY()),563DAILINK_COMP_ARRAY(COMP_EMPTY()));564SND_SOC_DAILINK_DEFS(hw_src1,565DAILINK_COMP_ARRAY(COMP_CPU("HW_SRC_1")),566DAILINK_COMP_ARRAY(COMP_DUMMY()),567DAILINK_COMP_ARRAY(COMP_EMPTY()));568SND_SOC_DAILINK_DEFS(hw_src2,569DAILINK_COMP_ARRAY(COMP_CPU("HW_SRC_2")),570DAILINK_COMP_ARRAY(COMP_DUMMY()),571DAILINK_COMP_ARRAY(COMP_EMPTY()));572SND_SOC_DAILINK_DEFS(connsys_i2s,573DAILINK_COMP_ARRAY(COMP_CPU("CONNSYS_I2S")),574DAILINK_COMP_ARRAY(COMP_DUMMY()),575DAILINK_COMP_ARRAY(COMP_EMPTY()));576SND_SOC_DAILINK_DEFS(pcm1,577DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")),578DAILINK_COMP_ARRAY(COMP_CODEC("bt-sco", "bt-sco-pcm-wb")),579DAILINK_COMP_ARRAY(COMP_EMPTY()));580SND_SOC_DAILINK_DEFS(tdm_in,581DAILINK_COMP_ARRAY(COMP_CPU("TDM IN")),582DAILINK_COMP_ARRAY(COMP_DUMMY()),583DAILINK_COMP_ARRAY(COMP_EMPTY()));584585/* hostless */586SND_SOC_DAILINK_DEFS(hostless_ul1,587DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL1 DAI")),588DAILINK_COMP_ARRAY(COMP_DUMMY()),589DAILINK_COMP_ARRAY(COMP_EMPTY()));590SND_SOC_DAILINK_DEFS(hostless_ul2,591DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL2 DAI")),592DAILINK_COMP_ARRAY(COMP_DUMMY()),593DAILINK_COMP_ARRAY(COMP_EMPTY()));594SND_SOC_DAILINK_DEFS(hostless_ul3,595DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL3 DAI")),596DAILINK_COMP_ARRAY(COMP_DUMMY()),597DAILINK_COMP_ARRAY(COMP_EMPTY()));598SND_SOC_DAILINK_DEFS(hostless_ul5,599DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL5 DAI")),600DAILINK_COMP_ARRAY(COMP_DUMMY()),601DAILINK_COMP_ARRAY(COMP_EMPTY()));602SND_SOC_DAILINK_DEFS(hostless_ul6,603DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL6 DAI")),604DAILINK_COMP_ARRAY(COMP_DUMMY()),605DAILINK_COMP_ARRAY(COMP_EMPTY()));606SND_SOC_DAILINK_DEFS(hostless_hw_gain_aaudio,607DAILINK_COMP_ARRAY(COMP_CPU("Hostless HW Gain AAudio DAI")),608DAILINK_COMP_ARRAY(COMP_DUMMY()),609DAILINK_COMP_ARRAY(COMP_EMPTY()));610SND_SOC_DAILINK_DEFS(hostless_src_aaudio,611DAILINK_COMP_ARRAY(COMP_CPU("Hostless SRC AAudio DAI")),612DAILINK_COMP_ARRAY(COMP_DUMMY()),613DAILINK_COMP_ARRAY(COMP_EMPTY()));614SND_SOC_DAILINK_DEFS(AFE_SOF_DL1,615DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL1")),616DAILINK_COMP_ARRAY(COMP_DUMMY()),617DAILINK_COMP_ARRAY(COMP_EMPTY()));618619SND_SOC_DAILINK_DEFS(AFE_SOF_DL2,620DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL2")),621DAILINK_COMP_ARRAY(COMP_DUMMY()),622DAILINK_COMP_ARRAY(COMP_EMPTY()));623624SND_SOC_DAILINK_DEFS(AFE_SOF_UL1,625DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL1")),626DAILINK_COMP_ARRAY(COMP_DUMMY()),627DAILINK_COMP_ARRAY(COMP_EMPTY()));628629SND_SOC_DAILINK_DEFS(AFE_SOF_UL2,630DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL2")),631DAILINK_COMP_ARRAY(COMP_DUMMY()),632DAILINK_COMP_ARRAY(COMP_EMPTY()));633634static const struct sof_conn_stream g_sof_conn_streams[] = {635{ "I2S1", "AFE_SOF_DL1", SOF_DMA_DL1, SNDRV_PCM_STREAM_PLAYBACK},636{ "I2S3", "AFE_SOF_DL2", SOF_DMA_DL2, SNDRV_PCM_STREAM_PLAYBACK},637{ "Primary Codec", "AFE_SOF_UL1", SOF_DMA_UL1, SNDRV_PCM_STREAM_CAPTURE},638{ "I2S0", "AFE_SOF_UL2", SOF_DMA_UL2, SNDRV_PCM_STREAM_CAPTURE},639};640641static struct snd_soc_dai_link mt8186_mt6366_rt1019_rt5682s_dai_links[] = {642/* Front End DAI links */643{644.name = "Playback_1",645.stream_name = "Playback_1",646.trigger = {SND_SOC_DPCM_TRIGGER_PRE,647SND_SOC_DPCM_TRIGGER_PRE},648.dynamic = 1,649.playback_only = 1,650.dpcm_merged_format = 1,651.dpcm_merged_chan = 1,652.dpcm_merged_rate = 1,653.ops = &mtk_soundcard_common_playback_ops,654SND_SOC_DAILINK_REG(playback1),655},656{657.name = "Playback_12",658.stream_name = "Playback_12",659.trigger = {SND_SOC_DPCM_TRIGGER_PRE,660SND_SOC_DPCM_TRIGGER_PRE},661.dynamic = 1,662.playback_only = 1,663SND_SOC_DAILINK_REG(playback12),664},665{666.name = "Playback_2",667.stream_name = "Playback_2",668.trigger = {SND_SOC_DPCM_TRIGGER_PRE,669SND_SOC_DPCM_TRIGGER_PRE},670.dynamic = 1,671.playback_only = 1,672.dpcm_merged_format = 1,673.dpcm_merged_chan = 1,674.dpcm_merged_rate = 1,675SND_SOC_DAILINK_REG(playback2),676},677{678.name = "Playback_3",679.stream_name = "Playback_3",680.trigger = {SND_SOC_DPCM_TRIGGER_PRE,681SND_SOC_DPCM_TRIGGER_PRE},682.dynamic = 1,683.playback_only = 1,684.dpcm_merged_format = 1,685.dpcm_merged_chan = 1,686.dpcm_merged_rate = 1,687.ops = &mtk_soundcard_common_playback_ops,688SND_SOC_DAILINK_REG(playback3),689},690{691.name = "Playback_4",692.stream_name = "Playback_4",693.trigger = {SND_SOC_DPCM_TRIGGER_PRE,694SND_SOC_DPCM_TRIGGER_PRE},695.dynamic = 1,696.playback_only = 1,697SND_SOC_DAILINK_REG(playback4),698},699{700.name = "Playback_5",701.stream_name = "Playback_5",702.trigger = {SND_SOC_DPCM_TRIGGER_PRE,703SND_SOC_DPCM_TRIGGER_PRE},704.dynamic = 1,705.playback_only = 1,706SND_SOC_DAILINK_REG(playback5),707},708{709.name = "Playback_6",710.stream_name = "Playback_6",711.trigger = {SND_SOC_DPCM_TRIGGER_PRE,712SND_SOC_DPCM_TRIGGER_PRE},713.dynamic = 1,714.playback_only = 1,715SND_SOC_DAILINK_REG(playback6),716},717{718.name = "Playback_7",719.stream_name = "Playback_7",720.trigger = {SND_SOC_DPCM_TRIGGER_PRE,721SND_SOC_DPCM_TRIGGER_PRE},722.dynamic = 1,723.playback_only = 1,724SND_SOC_DAILINK_REG(playback7),725},726{727.name = "Playback_8",728.stream_name = "Playback_8",729.trigger = {SND_SOC_DPCM_TRIGGER_PRE,730SND_SOC_DPCM_TRIGGER_PRE},731.dynamic = 1,732.playback_only = 1,733SND_SOC_DAILINK_REG(playback8),734},735{736.name = "Capture_1",737.stream_name = "Capture_1",738.trigger = {SND_SOC_DPCM_TRIGGER_PRE,739SND_SOC_DPCM_TRIGGER_PRE},740.dynamic = 1,741.capture_only = 1,742SND_SOC_DAILINK_REG(capture1),743},744{745.name = "Capture_2",746.stream_name = "Capture_2",747.trigger = {SND_SOC_DPCM_TRIGGER_PRE,748SND_SOC_DPCM_TRIGGER_PRE},749.dynamic = 1,750.capture_only = 1,751.dpcm_merged_format = 1,752.dpcm_merged_chan = 1,753.dpcm_merged_rate = 1,754.ops = &mtk_soundcard_common_capture_ops,755SND_SOC_DAILINK_REG(capture2),756},757{758.name = "Capture_3",759.stream_name = "Capture_3",760.trigger = {SND_SOC_DPCM_TRIGGER_PRE,761SND_SOC_DPCM_TRIGGER_PRE},762.dynamic = 1,763.capture_only = 1,764SND_SOC_DAILINK_REG(capture3),765},766{767.name = "Capture_4",768.stream_name = "Capture_4",769.trigger = {SND_SOC_DPCM_TRIGGER_PRE,770SND_SOC_DPCM_TRIGGER_PRE},771.dynamic = 1,772.capture_only = 1,773.dpcm_merged_format = 1,774.dpcm_merged_chan = 1,775.dpcm_merged_rate = 1,776.ops = &mtk_soundcard_common_capture_ops,777SND_SOC_DAILINK_REG(capture4),778},779{780.name = "Capture_5",781.stream_name = "Capture_5",782.trigger = {SND_SOC_DPCM_TRIGGER_PRE,783SND_SOC_DPCM_TRIGGER_PRE},784.dynamic = 1,785.capture_only = 1,786SND_SOC_DAILINK_REG(capture5),787},788{789.name = "Capture_6",790.stream_name = "Capture_6",791.trigger = {SND_SOC_DPCM_TRIGGER_PRE,792SND_SOC_DPCM_TRIGGER_PRE},793.dynamic = 1,794.capture_only = 1,795.dpcm_merged_format = 1,796.dpcm_merged_chan = 1,797.dpcm_merged_rate = 1,798SND_SOC_DAILINK_REG(capture6),799},800{801.name = "Capture_7",802.stream_name = "Capture_7",803.trigger = {SND_SOC_DPCM_TRIGGER_PRE,804SND_SOC_DPCM_TRIGGER_PRE},805.dynamic = 1,806.capture_only = 1,807SND_SOC_DAILINK_REG(capture7),808},809{810.name = "Hostless_LPBK",811.stream_name = "Hostless_LPBK",812.trigger = {SND_SOC_DPCM_TRIGGER_PRE,813SND_SOC_DPCM_TRIGGER_PRE},814.dynamic = 1,815.ignore_suspend = 1,816SND_SOC_DAILINK_REG(hostless_lpbk),817},818{819.name = "Hostless_FM",820.stream_name = "Hostless_FM",821.trigger = {SND_SOC_DPCM_TRIGGER_PRE,822SND_SOC_DPCM_TRIGGER_PRE},823.dynamic = 1,824.ignore_suspend = 1,825SND_SOC_DAILINK_REG(hostless_fm),826},827{828.name = "Hostless_SRC_1",829.stream_name = "Hostless_SRC_1",830.trigger = {SND_SOC_DPCM_TRIGGER_PRE,831SND_SOC_DPCM_TRIGGER_PRE},832.dynamic = 1,833.ignore_suspend = 1,834SND_SOC_DAILINK_REG(hostless_src1),835},836{837.name = "Hostless_SRC_Bargein",838.stream_name = "Hostless_SRC_Bargein",839.trigger = {SND_SOC_DPCM_TRIGGER_PRE,840SND_SOC_DPCM_TRIGGER_PRE},841.dynamic = 1,842.ignore_suspend = 1,843SND_SOC_DAILINK_REG(hostless_src_bargein),844},845{846.name = "Hostless_HW_Gain_AAudio",847.stream_name = "Hostless_HW_Gain_AAudio",848.trigger = {SND_SOC_DPCM_TRIGGER_PRE,849SND_SOC_DPCM_TRIGGER_PRE},850.dynamic = 1,851.capture_only = 1,852.ignore_suspend = 1,853SND_SOC_DAILINK_REG(hostless_hw_gain_aaudio),854},855{856.name = "Hostless_SRC_AAudio",857.stream_name = "Hostless_SRC_AAudio",858.trigger = {SND_SOC_DPCM_TRIGGER_PRE,859SND_SOC_DPCM_TRIGGER_PRE},860.dynamic = 1,861.ignore_suspend = 1,862SND_SOC_DAILINK_REG(hostless_src_aaudio),863},864/* Back End DAI links */865{866.name = "Primary Codec",867.no_pcm = 1,868.ignore_suspend = 1,869.init = primary_codec_init,870SND_SOC_DAILINK_REG(adda),871},872{873.name = "I2S3",874.no_pcm = 1,875.dai_fmt = SND_SOC_DAIFMT_I2S |876SND_SOC_DAIFMT_IB_IF |877SND_SOC_DAIFMT_CBP_CFP,878.playback_only = 1,879.ignore_suspend = 1,880.init = mt8186_mt6366_rt1019_rt5682s_hdmi_init,881SND_SOC_DAILINK_REG(i2s3),882},883{884.name = "I2S0",885.no_pcm = 1,886.capture_only = 1,887.ignore_suspend = 1,888.ops = &mt8186_rt5682s_i2s_ops,889SND_SOC_DAILINK_REG(i2s0),890},891{892.name = "I2S1",893.no_pcm = 1,894.playback_only = 1,895.ignore_suspend = 1,896.init = mt8186_headset_codec_init,897SND_SOC_DAILINK_REG(i2s1),898},899{900.name = "I2S2",901.no_pcm = 1,902.capture_only = 1,903.ignore_suspend = 1,904SND_SOC_DAILINK_REG(i2s2),905},906{907.name = "HW Gain 1",908.no_pcm = 1,909.ignore_suspend = 1,910SND_SOC_DAILINK_REG(hw_gain1),911},912{913.name = "HW Gain 2",914.no_pcm = 1,915.ignore_suspend = 1,916SND_SOC_DAILINK_REG(hw_gain2),917},918{919.name = "HW_SRC_1",920.no_pcm = 1,921.ignore_suspend = 1,922SND_SOC_DAILINK_REG(hw_src1),923},924{925.name = "HW_SRC_2",926.no_pcm = 1,927.ignore_suspend = 1,928SND_SOC_DAILINK_REG(hw_src2),929},930{931.name = "CONNSYS_I2S",932.no_pcm = 1,933.capture_only = 1,934.ignore_suspend = 1,935SND_SOC_DAILINK_REG(connsys_i2s),936},937{938.name = "PCM 1",939.dai_fmt = SND_SOC_DAIFMT_I2S |940SND_SOC_DAIFMT_NB_IF,941.no_pcm = 1,942.ignore_suspend = 1,943SND_SOC_DAILINK_REG(pcm1),944},945{946.name = "TDM IN",947.no_pcm = 1,948.capture_only = 1,949.ignore_suspend = 1,950SND_SOC_DAILINK_REG(tdm_in),951},952/* dummy BE for ul memif to record from dl memif */953{954.name = "Hostless_UL1",955.no_pcm = 1,956.capture_only = 1,957.ignore_suspend = 1,958SND_SOC_DAILINK_REG(hostless_ul1),959},960{961.name = "Hostless_UL2",962.no_pcm = 1,963.capture_only = 1,964.ignore_suspend = 1,965SND_SOC_DAILINK_REG(hostless_ul2),966},967{968.name = "Hostless_UL3",969.no_pcm = 1,970.capture_only = 1,971.ignore_suspend = 1,972SND_SOC_DAILINK_REG(hostless_ul3),973},974{975.name = "Hostless_UL5",976.no_pcm = 1,977.capture_only = 1,978.ignore_suspend = 1,979SND_SOC_DAILINK_REG(hostless_ul5),980},981{982.name = "Hostless_UL6",983.no_pcm = 1,984.capture_only = 1,985.ignore_suspend = 1,986SND_SOC_DAILINK_REG(hostless_ul6),987},988/* SOF BE */989{990.name = "AFE_SOF_DL1",991.no_pcm = 1,992.playback_only = 1,993SND_SOC_DAILINK_REG(AFE_SOF_DL1),994},995{996.name = "AFE_SOF_DL2",997.no_pcm = 1,998.playback_only = 1,999SND_SOC_DAILINK_REG(AFE_SOF_DL2),1000},1001{1002.name = "AFE_SOF_UL1",1003.no_pcm = 1,1004.capture_only = 1,1005SND_SOC_DAILINK_REG(AFE_SOF_UL1),1006},1007{1008.name = "AFE_SOF_UL2",1009.no_pcm = 1,1010.capture_only = 1,1011SND_SOC_DAILINK_REG(AFE_SOF_UL2),1012},1013};10141015static const struct snd_soc_dapm_widget1016mt8186_mt6366_da7219_max98357_widgets[] = {1017SND_SOC_DAPM_SPK("Speakers", NULL),1018SND_SOC_DAPM_HP("Headphones", NULL),1019SND_SOC_DAPM_MIC("Headset Mic", NULL),1020SND_SOC_DAPM_LINE("Line Out", NULL),1021SND_SOC_DAPM_LINE("HDMI1", NULL),1022SND_SOC_DAPM_MIXER(SOF_DMA_DL1, SND_SOC_NOPM, 0, 0, NULL, 0),1023SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0),1024SND_SOC_DAPM_MIXER(SOF_DMA_UL1, SND_SOC_NOPM, 0, 0, NULL, 0),1025SND_SOC_DAPM_MIXER(SOF_DMA_UL2, SND_SOC_NOPM, 0, 0, NULL, 0),1026};10271028static const struct snd_soc_dapm_widget1029mt8186_mt6366_rt1019_rt5682s_widgets[] = {1030SND_SOC_DAPM_SPK("Speakers", NULL),1031SND_SOC_DAPM_HP("Headphone", NULL),1032SND_SOC_DAPM_MIC("Headset Mic", NULL),1033SND_SOC_DAPM_OUTPUT("HDMI1"),1034SND_SOC_DAPM_MIXER(SOF_DMA_DL1, SND_SOC_NOPM, 0, 0, NULL, 0),1035SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0),1036SND_SOC_DAPM_MIXER(SOF_DMA_UL1, SND_SOC_NOPM, 0, 0, NULL, 0),1037SND_SOC_DAPM_MIXER(SOF_DMA_UL2, SND_SOC_NOPM, 0, 0, NULL, 0),1038};10391040static const struct snd_soc_dapm_route1041mt8186_mt6366_rt1019_rt5682s_routes[] = {1042/* SPK */1043{ "Speakers", NULL, "Speaker" },1044/* Headset */1045{ "Headphone", NULL, "HPOL" },1046{ "Headphone", NULL, "HPOR" },1047{ "IN1P", NULL, "Headset Mic" },1048/* HDMI */1049{ "HDMI1", NULL, "TX" },1050/* SOF Uplink */1051{SOF_DMA_UL1, NULL, "UL1_CH1"},1052{SOF_DMA_UL1, NULL, "UL1_CH2"},1053{SOF_DMA_UL2, NULL, "UL2_CH1"},1054{SOF_DMA_UL2, NULL, "UL2_CH2"},1055/* SOF Downlink */1056{"DSP_DL1_VIRT", NULL, SOF_DMA_DL1},1057{"DSP_DL2_VIRT", NULL, SOF_DMA_DL2},1058};10591060static const struct snd_soc_dapm_route mt8186_mt6366_rt5650_routes[] = {1061/* SPK */1062{"Speakers", NULL, "SPOL"},1063{"Speakers", NULL, "SPOR"},1064/* Headset */1065{ "Headphone", NULL, "HPOL" },1066{ "Headphone", NULL, "HPOR" },1067{ "IN1P", NULL, "Headset Mic" },1068{ "IN1N", NULL, "Headset Mic"},1069/* HDMI */1070{ "HDMI1", NULL, "TX" },1071/* SOF Uplink */1072{SOF_DMA_UL1, NULL, "UL1_CH1"},1073{SOF_DMA_UL1, NULL, "UL1_CH2"},1074{SOF_DMA_UL2, NULL, "UL2_CH1"},1075{SOF_DMA_UL2, NULL, "UL2_CH2"},1076/* SOF Downlink */1077{"DSP_DL1_VIRT", NULL, SOF_DMA_DL1},1078{"DSP_DL2_VIRT", NULL, SOF_DMA_DL2},1079};10801081static const struct snd_kcontrol_new mt8186_mt6366_da7219_max98357_controls[] = {1082SOC_DAPM_PIN_SWITCH("Speakers"),1083SOC_DAPM_PIN_SWITCH("Headphones"),1084SOC_DAPM_PIN_SWITCH("Headset Mic"),1085SOC_DAPM_PIN_SWITCH("Line Out"),1086SOC_DAPM_PIN_SWITCH("HDMI1"),1087};10881089static const struct snd_kcontrol_new1090mt8186_mt6366_rt1019_rt5682s_controls[] = {1091SOC_DAPM_PIN_SWITCH("Speakers"),1092SOC_DAPM_PIN_SWITCH("Headphone"),1093SOC_DAPM_PIN_SWITCH("Headset Mic"),1094SOC_DAPM_PIN_SWITCH("HDMI1"),1095};10961097static struct snd_soc_card mt8186_mt6366_da7219_max98357_soc_card = {1098.name = "mt8186_da7219_max98357",1099.owner = THIS_MODULE,1100.dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,1101.num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),1102.controls = mt8186_mt6366_da7219_max98357_controls,1103.num_controls = ARRAY_SIZE(mt8186_mt6366_da7219_max98357_controls),1104.dapm_widgets = mt8186_mt6366_da7219_max98357_widgets,1105.num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_da7219_max98357_widgets),1106.dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,1107.num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),1108.codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,1109.num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),1110};11111112static struct snd_soc_card mt8186_mt6366_rt1019_rt5682s_soc_card = {1113.name = "mt8186_rt1019_rt5682s",1114.owner = THIS_MODULE,1115.dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,1116.num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),1117.controls = mt8186_mt6366_rt1019_rt5682s_controls,1118.num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),1119.dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,1120.num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),1121.dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,1122.num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),1123.codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,1124.num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),1125};11261127static struct snd_soc_card mt8186_mt6366_rt5682s_max98360_soc_card = {1128.name = "mt8186_rt5682s_max98360",1129.owner = THIS_MODULE,1130.dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,1131.num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),1132.controls = mt8186_mt6366_rt1019_rt5682s_controls,1133.num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),1134.dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,1135.num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),1136.dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,1137.num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),1138.codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,1139.num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),1140};11411142static struct snd_soc_card mt8186_mt6366_rt5650_soc_card = {1143.name = "mt8186_rt5650",1144.owner = THIS_MODULE,1145.dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,1146.num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),1147.controls = mt8186_mt6366_rt1019_rt5682s_controls,1148.num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),1149.dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,1150.num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),1151.dapm_routes = mt8186_mt6366_rt5650_routes,1152.num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt5650_routes),1153.codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,1154.num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),1155};11561157static int mt8186_mt6366_legacy_probe(struct mtk_soc_card_data *soc_card_data)1158{1159struct mtk_platform_card_data *card_data = soc_card_data->card_data;1160struct snd_soc_card *card = card_data->card;1161struct device *dev = card->dev;1162struct snd_soc_dai_link *dai_link;1163struct device_node *headset_codec, *playback_codec;1164int ret, i;11651166playback_codec = of_get_child_by_name(dev->of_node, "playback-codecs");1167if (!playback_codec)1168return dev_err_probe(dev, -EINVAL,1169"Property 'playback-codecs' missing or invalid\n");11701171headset_codec = of_get_child_by_name(dev->of_node, "headset-codec");1172if (!headset_codec) {1173of_node_put(playback_codec);1174return dev_err_probe(dev, -EINVAL,1175"Property 'headset-codec' missing or invalid\n");1176}11771178for_each_card_prelinks(card, i, dai_link) {1179ret = mt8186_mt6366_card_set_be_link(card, dai_link, playback_codec, "I2S3");1180if (ret) {1181dev_err_probe(dev, ret, "%s set playback_codec fail\n",1182dai_link->name);1183break;1184}11851186ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S0");1187if (ret) {1188dev_err_probe(dev, ret, "%s set headset_codec fail\n",1189dai_link->name);1190break;1191}11921193ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S1");1194if (ret) {1195dev_err_probe(dev, ret, "%s set headset_codec fail\n",1196dai_link->name);1197break;1198}1199}1200of_node_put(headset_codec);1201of_node_put(playback_codec);12021203return ret;1204}12051206static int mt8186_mt6366_soc_card_probe(struct mtk_soc_card_data *soc_card_data, bool legacy)1207{1208struct mtk_platform_card_data *card_data = soc_card_data->card_data;1209struct snd_soc_card *card = card_data->card;1210struct snd_soc_dai_link *dai_link;1211struct mt8186_mt6366_rt1019_rt5682s_priv *mach_priv;1212int i, ret;12131214mach_priv = devm_kzalloc(card->dev, sizeof(*mach_priv), GFP_KERNEL);1215if (!mach_priv)1216return -ENOMEM;12171218soc_card_data->mach_priv = mach_priv;12191220mach_priv->dmic_sel = devm_gpiod_get_optional(card->dev,1221"dmic", GPIOD_OUT_LOW);1222if (IS_ERR(mach_priv->dmic_sel))1223return dev_err_probe(card->dev, PTR_ERR(mach_priv->dmic_sel),1224"DMIC gpio failed\n");12251226for_each_card_prelinks(card, i, dai_link) {1227if (strcmp(dai_link->name, "I2S0") == 0 ||1228strcmp(dai_link->name, "I2S1") == 0 ||1229strcmp(dai_link->name, "I2S2") == 0) {1230if (card_data->flags & DA7219_CODEC_PRESENT) {1231dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_32le_fixup;1232dai_link->ops = &mt8186_da7219_i2s_ops;1233} else {1234dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_24le_fixup;1235dai_link->ops = &mt8186_rt5682s_i2s_ops;1236}1237} else if (strcmp(dai_link->name, "I2S3") == 0) {1238if (card_data->flags & DA7219_CODEC_PRESENT)1239dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_24le_fixup;1240else1241dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_32le_fixup;1242}1243}12441245if (legacy) {1246ret = mt8186_mt6366_legacy_probe(soc_card_data);1247if (ret)1248return ret;1249}12501251ret = mt8186_afe_gpio_init(card->dev);1252if (ret)1253return dev_err_probe(card->dev, ret, "init AFE gpio error\n");12541255return 0;1256}12571258static const unsigned int mt8186_pcm_playback_channels[] = { 2 };1259static const unsigned int mt8186_pcm_capture_channels[] = { 1, 2 };1260static const unsigned int mt8186_pcm_rates[] = { 48000 };12611262static const struct snd_pcm_hw_constraint_list mt8186_rate_constraint = {1263.list = mt8186_pcm_rates,1264.count = ARRAY_SIZE(mt8186_pcm_rates)1265};12661267static const struct mtk_pcm_constraints_data mt8186_pcm_constraints[MTK_CONSTRAINT_CAPTURE + 1] = {1268[MTK_CONSTRAINT_PLAYBACK] = {1269.channels = &(const struct snd_pcm_hw_constraint_list) {1270.list = mt8186_pcm_playback_channels,1271.count = ARRAY_SIZE(mt8186_pcm_playback_channels)1272},1273.rates = &mt8186_rate_constraint,1274},1275[MTK_CONSTRAINT_CAPTURE] = {1276.channels = &(const struct snd_pcm_hw_constraint_list) {1277.list = mt8186_pcm_capture_channels,1278.count = ARRAY_SIZE(mt8186_pcm_capture_channels)1279},1280.rates = &mt8186_rate_constraint,1281}1282};12831284static const struct mtk_sof_priv mt8186_sof_priv = {1285.conn_streams = g_sof_conn_streams,1286.num_streams = ARRAY_SIZE(g_sof_conn_streams),1287.sof_dai_link_fixup = mt8186_sof_dai_link_fixup1288};12891290static const struct mtk_soundcard_pdata mt8186_mt6366_da7219_max98357_pdata = {1291.card_data = &(struct mtk_platform_card_data) {1292.card = &mt8186_mt6366_da7219_max98357_soc_card,1293.num_jacks = MT8186_JACK_MAX,1294.pcm_constraints = mt8186_pcm_constraints,1295.num_pcm_constraints = ARRAY_SIZE(mt8186_pcm_constraints),1296.flags = DA7219_CODEC_PRESENT,1297},1298.sof_priv = &mt8186_sof_priv,1299.soc_probe = mt8186_mt6366_soc_card_probe1300};13011302static const struct mtk_soundcard_pdata mt8186_mt6366_rt1019_rt5682s_pdata = {1303.card_data = &(struct mtk_platform_card_data) {1304.card = &mt8186_mt6366_rt1019_rt5682s_soc_card,1305.num_jacks = MT8186_JACK_MAX,1306.pcm_constraints = mt8186_pcm_constraints,1307.num_pcm_constraints = ARRAY_SIZE(mt8186_pcm_constraints),1308},1309.sof_priv = &mt8186_sof_priv,1310.soc_probe = mt8186_mt6366_soc_card_probe1311};13121313static const struct mtk_soundcard_pdata mt8186_mt6366_rt5682s_max98360_pdata = {1314.card_data = &(struct mtk_platform_card_data) {1315.card = &mt8186_mt6366_rt5682s_max98360_soc_card,1316.num_jacks = MT8186_JACK_MAX,1317.pcm_constraints = mt8186_pcm_constraints,1318.num_pcm_constraints = ARRAY_SIZE(mt8186_pcm_constraints),1319},1320.sof_priv = &mt8186_sof_priv,1321.soc_probe = mt8186_mt6366_soc_card_probe1322};13231324static const struct mtk_soundcard_pdata mt8186_mt6366_rt5650_pdata = {1325.card_data = &(struct mtk_platform_card_data) {1326.card = &mt8186_mt6366_rt5650_soc_card,1327.num_jacks = MT8186_JACK_MAX,1328.pcm_constraints = mt8186_pcm_constraints,1329.num_pcm_constraints = ARRAY_SIZE(mt8186_pcm_constraints),1330},1331.sof_priv = &mt8186_sof_priv,1332.soc_probe = mt8186_mt6366_soc_card_probe1333};13341335#if IS_ENABLED(CONFIG_OF)1336static const struct of_device_id mt8186_mt6366_dt_match[] = {1337{1338.compatible = "mediatek,mt8186-mt6366-rt1019-rt5682s-sound",1339.data = &mt8186_mt6366_rt1019_rt5682s_pdata,1340},1341{1342.compatible = "mediatek,mt8186-mt6366-rt5682s-max98360-sound",1343.data = &mt8186_mt6366_rt5682s_max98360_pdata,1344},1345{1346.compatible = "mediatek,mt8186-mt6366-rt5650-sound",1347.data = &mt8186_mt6366_rt5650_pdata,1348},1349{1350.compatible = "mediatek,mt8186-mt6366-da7219-max98357-sound",1351.data = &mt8186_mt6366_da7219_max98357_pdata,1352},1353{ /* sentinel */ }1354};1355MODULE_DEVICE_TABLE(of, mt8186_mt6366_dt_match);1356#endif13571358static struct platform_driver mt8186_mt6366_driver = {1359.driver = {1360.name = "mt8186_mt6366",1361#if IS_ENABLED(CONFIG_OF)1362.of_match_table = mt8186_mt6366_dt_match,1363#endif1364.pm = &snd_soc_pm_ops,1365},1366.probe = mtk_soundcard_common_probe,1367};13681369module_platform_driver(mt8186_mt6366_driver);13701371/* Module information */1372MODULE_DESCRIPTION("MT8186-MT6366 ALSA SoC machine driver");1373MODULE_AUTHOR("Jiaxin Yu <[email protected]>");1374MODULE_LICENSE("GPL v2");1375MODULE_ALIAS("mt8186_mt6366 soc card");137613771378