Path: blob/master/sound/soc/mediatek/mt8186/mt8186-mt6366.c
54337 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_to_dapm(kcontrol);91struct snd_soc_card *card = snd_soc_dapm_to_card(dapm);92struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(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_to_dapm(kcontrol);103struct snd_soc_card *card = snd_soc_dapm_to_card(dapm);104struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(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(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 snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card);143struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card);144struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;145int ret;146147ret = mt8186_mt6366_init(rtd);148149if (ret) {150dev_err(card->dev, "mt8186_mt6366_init failed: %d\n", ret);151return ret;152}153154if (!priv->dmic_sel) {155dev_dbg(card->dev, "dmic_sel is null\n");156return 0;157}158159ret = snd_soc_dapm_new_controls(dapm, dmic_widgets,160ARRAY_SIZE(dmic_widgets));161if (ret) {162dev_err(card->dev, "DMic widget addition failed: %d\n", ret);163/* Don't need to add routes if widget addition failed */164return ret;165}166167ret = snd_soc_dapm_add_routes(dapm, dmic_map,168ARRAY_SIZE(dmic_map));169170if (ret)171dev_err(card->dev, "DMic map addition failed: %d\n", ret);172173return ret;174}175176static int mt8186_headset_codec_init(struct snd_soc_pcm_runtime *rtd)177{178struct snd_soc_component *cmpnt_afe =179snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);180struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);181struct mtk_soc_card_data *soc_card_data =182snd_soc_card_get_drvdata(rtd->card);183struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8186_JACK_HEADSET];184struct snd_soc_component *cmpnt_codec =185snd_soc_rtd_to_codec(rtd, 0)->component;186const int hs_keys_rt5682[] = {187KEY_PLAYPAUSE, KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_VOICECOMMAND188};189const int hs_keys_da7219[] = {190KEY_PLAYPAUSE, KEY_VOICECOMMAND, KEY_VOLUMEUP, KEY_VOLUMEDOWN191};192const int *hs_keys;193int ret;194int type;195196ret = mt8186_dai_i2s_set_share(afe, "I2S1", "I2S0");197if (ret) {198dev_err(rtd->dev, "Failed to set up shared clocks\n");199return ret;200}201202ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",203SND_JACK_HEADSET | SND_JACK_BTN_0 |204SND_JACK_BTN_1 | SND_JACK_BTN_2 |205SND_JACK_BTN_3,206jack, mt8186_jack_pins,207ARRAY_SIZE(mt8186_jack_pins));208if (ret) {209dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);210return ret;211}212213if (soc_card_data->card_data->flags & DA7219_CODEC_PRESENT)214hs_keys = hs_keys_da7219;215else216hs_keys = hs_keys_rt5682;217218snd_jack_set_key(jack->jack, SND_JACK_BTN_0, hs_keys[0]);219snd_jack_set_key(jack->jack, SND_JACK_BTN_1, hs_keys[1]);220snd_jack_set_key(jack->jack, SND_JACK_BTN_2, hs_keys[2]);221snd_jack_set_key(jack->jack, SND_JACK_BTN_3, hs_keys[3]);222223type = SND_JACK_HEADSET | SND_JACK_BTN_0 | SND_JACK_BTN_1 | SND_JACK_BTN_2 | SND_JACK_BTN_3;224return snd_soc_component_set_jack(cmpnt_codec, jack, (void *)&type);225}226227static int mt8186_da7219_i2s_hw_params(struct snd_pcm_substream *substream,228struct snd_pcm_hw_params *params)229{230struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);231struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);232struct snd_soc_dai *codec_dai;233unsigned int rate = params_rate(params);234unsigned int mclk_fs_ratio = 256;235unsigned int mclk_fs = rate * mclk_fs_ratio;236unsigned int freq;237int ret, j;238239ret = snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);240if (ret < 0) {241dev_err(rtd->dev, "failed to set cpu dai sysclk: %d\n", ret);242return ret;243}244245for_each_rtd_codec_dais(rtd, j, codec_dai) {246if (strcmp(codec_dai->component->name, DA7219_DEV_NAME))247continue;248249ret = snd_soc_dai_set_sysclk(codec_dai, DA7219_CLKSRC_MCLK,250mclk_fs, SND_SOC_CLOCK_IN);251if (ret < 0) {252dev_err(rtd->dev, "failed to set sysclk: %d\n", ret);253return ret;254}255256if ((rate % 8000) == 0)257freq = DA7219_PLL_FREQ_OUT_98304;258else259freq = DA7219_PLL_FREQ_OUT_90316;260261ret = snd_soc_dai_set_pll(codec_dai, 0, DA7219_SYSCLK_PLL_SRM,2620, freq);263if (ret) {264dev_err(rtd->dev, "failed to start PLL: %d\n", ret);265return ret;266}267}268269return 0;270}271272static int mt8186_da7219_i2s_hw_free(struct snd_pcm_substream *substream)273{274struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);275struct snd_soc_dai *codec_dai;276int j, ret;277278for_each_rtd_codec_dais(rtd, j, codec_dai) {279if (strcmp(codec_dai->component->name, DA7219_DEV_NAME))280continue;281282ret = snd_soc_dai_set_pll(codec_dai, 0, DA7219_SYSCLK_MCLK, 0, 0);283if (ret < 0) {284dev_err(rtd->dev, "failed to stop PLL: %d\n", ret);285return ret;286}287}288289return 0;290}291292static 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};296297static int mt8186_rt5682s_i2s_hw_params(struct snd_pcm_substream *substream,298struct snd_pcm_hw_params *params)299{300struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);301struct snd_soc_card *card = rtd->card;302struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);303struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);304unsigned int rate = params_rate(params);305unsigned int mclk_fs_ratio = 128;306unsigned int mclk_fs = rate * mclk_fs_ratio;307int bitwidth;308int ret;309310bitwidth = snd_pcm_format_width(params_format(params));311if (bitwidth < 0) {312dev_err(card->dev, "invalid bit width: %d\n", bitwidth);313return bitwidth;314}315316ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);317if (ret) {318dev_err(card->dev, "failed to set tdm slot\n");319return ret;320}321322ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1,323RT5682_PLL1_S_BCLK1,324params_rate(params) * 64,325params_rate(params) * 512);326if (ret) {327dev_err(card->dev, "failed to set pll\n");328return ret;329}330331ret = snd_soc_dai_set_sysclk(codec_dai,332RT5682_SCLK_S_PLL1,333params_rate(params) * 512,334SND_SOC_CLOCK_IN);335if (ret) {336dev_err(card->dev, "failed to set sysclk\n");337return ret;338}339340return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);341}342343static const struct snd_soc_ops mt8186_rt5682s_i2s_ops = {344.hw_params = mt8186_rt5682s_i2s_hw_params,345};346347static int mt8186_mt6366_rt1019_rt5682s_hdmi_init(struct snd_soc_pcm_runtime *rtd)348{349struct snd_soc_component *cmpnt_afe =350snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);351struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);352struct snd_soc_component *cmpnt_codec =353snd_soc_rtd_to_codec(rtd, 0)->component;354struct mtk_soc_card_data *soc_card_data =355snd_soc_card_get_drvdata(rtd->card);356struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8186_JACK_HDMI];357int ret;358359ret = mt8186_dai_i2s_set_share(afe, "I2S2", "I2S3");360if (ret) {361dev_err(rtd->dev, "Failed to set up shared clocks\n");362return ret;363}364365ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_AVOUT, jack);366if (ret) {367dev_err(rtd->dev, "HDMI Jack creation failed: %d\n", ret);368return ret;369}370371return snd_soc_component_set_jack(cmpnt_codec, jack, NULL);372}373374static int mt8186_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,375struct snd_pcm_hw_params *params,376snd_pcm_format_t fmt)377{378struct snd_interval *channels = hw_param_interval(params,379SNDRV_PCM_HW_PARAM_CHANNELS);380381dev_dbg(rtd->dev, "%s(), fix format to %d\n", __func__, fmt);382383/* fix BE i2s channel to 2 channel */384channels->min = 2;385channels->max = 2;386387/* clean param mask first */388snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),3890, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);390391params_set_format(params, fmt);392393return 0;394}395396static int mt8186_i2s_hw_params_24le_fixup(struct snd_soc_pcm_runtime *rtd,397struct snd_pcm_hw_params *params)398{399return mt8186_hw_params_fixup(rtd, params, SNDRV_PCM_FORMAT_S24_LE);400}401402static int mt8186_i2s_hw_params_32le_fixup(struct snd_soc_pcm_runtime *rtd,403struct snd_pcm_hw_params *params)404{405return mt8186_hw_params_fixup(rtd, params, SNDRV_PCM_FORMAT_S32_LE);406}407408/* fixup the BE DAI link to match any values from topology */409static int mt8186_sof_dai_link_fixup(struct snd_soc_pcm_runtime *rtd,410struct snd_pcm_hw_params *params)411{412struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);413int ret;414415ret = mtk_sof_dai_link_fixup(rtd, params);416417if (!strcmp(rtd->dai_link->name, "I2S0") ||418!strcmp(rtd->dai_link->name, "I2S1") ||419!strcmp(rtd->dai_link->name, "I2S2")) {420if (soc_card_data->card_data->flags & DA7219_CODEC_PRESENT)421mt8186_i2s_hw_params_32le_fixup(rtd, params);422else423mt8186_i2s_hw_params_24le_fixup(rtd, params);424} else if (!strcmp(rtd->dai_link->name, "I2S3")) {425if (soc_card_data->card_data->flags & DA7219_CODEC_PRESENT)426mt8186_i2s_hw_params_24le_fixup(rtd, params);427else428mt8186_i2s_hw_params_32le_fixup(rtd, params);429}430431return ret;432}433434/* FE */435SND_SOC_DAILINK_DEFS(playback1,436DAILINK_COMP_ARRAY(COMP_CPU("DL1")),437DAILINK_COMP_ARRAY(COMP_DUMMY()),438DAILINK_COMP_ARRAY(COMP_EMPTY()));439440SND_SOC_DAILINK_DEFS(playback12,441DAILINK_COMP_ARRAY(COMP_CPU("DL12")),442DAILINK_COMP_ARRAY(COMP_DUMMY()),443DAILINK_COMP_ARRAY(COMP_EMPTY()));444445SND_SOC_DAILINK_DEFS(playback2,446DAILINK_COMP_ARRAY(COMP_CPU("DL2")),447DAILINK_COMP_ARRAY(COMP_DUMMY()),448DAILINK_COMP_ARRAY(COMP_EMPTY()));449450SND_SOC_DAILINK_DEFS(playback3,451DAILINK_COMP_ARRAY(COMP_CPU("DL3")),452DAILINK_COMP_ARRAY(COMP_DUMMY()),453DAILINK_COMP_ARRAY(COMP_EMPTY()));454455SND_SOC_DAILINK_DEFS(playback4,456DAILINK_COMP_ARRAY(COMP_CPU("DL4")),457DAILINK_COMP_ARRAY(COMP_DUMMY()),458DAILINK_COMP_ARRAY(COMP_EMPTY()));459460SND_SOC_DAILINK_DEFS(playback5,461DAILINK_COMP_ARRAY(COMP_CPU("DL5")),462DAILINK_COMP_ARRAY(COMP_DUMMY()),463DAILINK_COMP_ARRAY(COMP_EMPTY()));464465SND_SOC_DAILINK_DEFS(playback6,466DAILINK_COMP_ARRAY(COMP_CPU("DL6")),467DAILINK_COMP_ARRAY(COMP_DUMMY()),468DAILINK_COMP_ARRAY(COMP_EMPTY()));469470SND_SOC_DAILINK_DEFS(playback7,471DAILINK_COMP_ARRAY(COMP_CPU("DL7")),472DAILINK_COMP_ARRAY(COMP_DUMMY()),473DAILINK_COMP_ARRAY(COMP_EMPTY()));474475SND_SOC_DAILINK_DEFS(playback8,476DAILINK_COMP_ARRAY(COMP_CPU("DL8")),477DAILINK_COMP_ARRAY(COMP_DUMMY()),478DAILINK_COMP_ARRAY(COMP_EMPTY()));479480SND_SOC_DAILINK_DEFS(capture1,481DAILINK_COMP_ARRAY(COMP_CPU("UL1")),482DAILINK_COMP_ARRAY(COMP_DUMMY()),483DAILINK_COMP_ARRAY(COMP_EMPTY()));484485SND_SOC_DAILINK_DEFS(capture2,486DAILINK_COMP_ARRAY(COMP_CPU("UL2")),487DAILINK_COMP_ARRAY(COMP_DUMMY()),488DAILINK_COMP_ARRAY(COMP_EMPTY()));489490SND_SOC_DAILINK_DEFS(capture3,491DAILINK_COMP_ARRAY(COMP_CPU("UL3")),492DAILINK_COMP_ARRAY(COMP_DUMMY()),493DAILINK_COMP_ARRAY(COMP_EMPTY()));494495SND_SOC_DAILINK_DEFS(capture4,496DAILINK_COMP_ARRAY(COMP_CPU("UL4")),497DAILINK_COMP_ARRAY(COMP_DUMMY()),498DAILINK_COMP_ARRAY(COMP_EMPTY()));499500SND_SOC_DAILINK_DEFS(capture5,501DAILINK_COMP_ARRAY(COMP_CPU("UL5")),502DAILINK_COMP_ARRAY(COMP_DUMMY()),503DAILINK_COMP_ARRAY(COMP_EMPTY()));504505SND_SOC_DAILINK_DEFS(capture6,506DAILINK_COMP_ARRAY(COMP_CPU("UL6")),507DAILINK_COMP_ARRAY(COMP_DUMMY()),508DAILINK_COMP_ARRAY(COMP_EMPTY()));509510SND_SOC_DAILINK_DEFS(capture7,511DAILINK_COMP_ARRAY(COMP_CPU("UL7")),512DAILINK_COMP_ARRAY(COMP_DUMMY()),513DAILINK_COMP_ARRAY(COMP_EMPTY()));514515/* hostless */516SND_SOC_DAILINK_DEFS(hostless_lpbk,517DAILINK_COMP_ARRAY(COMP_CPU("Hostless LPBK DAI")),518DAILINK_COMP_ARRAY(COMP_DUMMY()),519DAILINK_COMP_ARRAY(COMP_EMPTY()));520SND_SOC_DAILINK_DEFS(hostless_fm,521DAILINK_COMP_ARRAY(COMP_CPU("Hostless FM DAI")),522DAILINK_COMP_ARRAY(COMP_DUMMY()),523DAILINK_COMP_ARRAY(COMP_EMPTY()));524SND_SOC_DAILINK_DEFS(hostless_src1,525DAILINK_COMP_ARRAY(COMP_CPU("Hostless_SRC_1_DAI")),526DAILINK_COMP_ARRAY(COMP_DUMMY()),527DAILINK_COMP_ARRAY(COMP_EMPTY()));528SND_SOC_DAILINK_DEFS(hostless_src_bargein,529DAILINK_COMP_ARRAY(COMP_CPU("Hostless_SRC_Bargein_DAI")),530DAILINK_COMP_ARRAY(COMP_DUMMY()),531DAILINK_COMP_ARRAY(COMP_EMPTY()));532533/* BE */534SND_SOC_DAILINK_DEFS(adda,535DAILINK_COMP_ARRAY(COMP_CPU("ADDA")),536DAILINK_COMP_ARRAY(COMP_CODEC("mt6358-sound",537"mt6358-snd-codec-aif1"),538COMP_CODEC("dmic-codec",539"dmic-hifi")),540DAILINK_COMP_ARRAY(COMP_EMPTY()));541SND_SOC_DAILINK_DEFS(i2s0,542DAILINK_COMP_ARRAY(COMP_CPU("I2S0")),543DAILINK_COMP_ARRAY(COMP_EMPTY()),544DAILINK_COMP_ARRAY(COMP_EMPTY()));545SND_SOC_DAILINK_DEFS(i2s1,546DAILINK_COMP_ARRAY(COMP_CPU("I2S1")),547DAILINK_COMP_ARRAY(COMP_EMPTY()),548DAILINK_COMP_ARRAY(COMP_EMPTY()));549SND_SOC_DAILINK_DEFS(i2s2,550DAILINK_COMP_ARRAY(COMP_CPU("I2S2")),551DAILINK_COMP_ARRAY(COMP_DUMMY()),552DAILINK_COMP_ARRAY(COMP_EMPTY()));553SND_SOC_DAILINK_DEFS(i2s3,554DAILINK_COMP_ARRAY(COMP_CPU("I2S3")),555DAILINK_COMP_ARRAY(COMP_EMPTY()),556DAILINK_COMP_ARRAY(COMP_EMPTY()));557SND_SOC_DAILINK_DEFS(hw_gain1,558DAILINK_COMP_ARRAY(COMP_CPU("HW Gain 1")),559DAILINK_COMP_ARRAY(COMP_DUMMY()),560DAILINK_COMP_ARRAY(COMP_EMPTY()));561SND_SOC_DAILINK_DEFS(hw_gain2,562DAILINK_COMP_ARRAY(COMP_CPU("HW Gain 2")),563DAILINK_COMP_ARRAY(COMP_DUMMY()),564DAILINK_COMP_ARRAY(COMP_EMPTY()));565SND_SOC_DAILINK_DEFS(hw_src1,566DAILINK_COMP_ARRAY(COMP_CPU("HW_SRC_1")),567DAILINK_COMP_ARRAY(COMP_DUMMY()),568DAILINK_COMP_ARRAY(COMP_EMPTY()));569SND_SOC_DAILINK_DEFS(hw_src2,570DAILINK_COMP_ARRAY(COMP_CPU("HW_SRC_2")),571DAILINK_COMP_ARRAY(COMP_DUMMY()),572DAILINK_COMP_ARRAY(COMP_EMPTY()));573SND_SOC_DAILINK_DEFS(connsys_i2s,574DAILINK_COMP_ARRAY(COMP_CPU("CONNSYS_I2S")),575DAILINK_COMP_ARRAY(COMP_DUMMY()),576DAILINK_COMP_ARRAY(COMP_EMPTY()));577SND_SOC_DAILINK_DEFS(pcm1,578DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")),579DAILINK_COMP_ARRAY(COMP_CODEC("bt-sco", "bt-sco-pcm-wb")),580DAILINK_COMP_ARRAY(COMP_EMPTY()));581SND_SOC_DAILINK_DEFS(tdm_in,582DAILINK_COMP_ARRAY(COMP_CPU("TDM IN")),583DAILINK_COMP_ARRAY(COMP_DUMMY()),584DAILINK_COMP_ARRAY(COMP_EMPTY()));585586/* hostless */587SND_SOC_DAILINK_DEFS(hostless_ul1,588DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL1 DAI")),589DAILINK_COMP_ARRAY(COMP_DUMMY()),590DAILINK_COMP_ARRAY(COMP_EMPTY()));591SND_SOC_DAILINK_DEFS(hostless_ul2,592DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL2 DAI")),593DAILINK_COMP_ARRAY(COMP_DUMMY()),594DAILINK_COMP_ARRAY(COMP_EMPTY()));595SND_SOC_DAILINK_DEFS(hostless_ul3,596DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL3 DAI")),597DAILINK_COMP_ARRAY(COMP_DUMMY()),598DAILINK_COMP_ARRAY(COMP_EMPTY()));599SND_SOC_DAILINK_DEFS(hostless_ul5,600DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL5 DAI")),601DAILINK_COMP_ARRAY(COMP_DUMMY()),602DAILINK_COMP_ARRAY(COMP_EMPTY()));603SND_SOC_DAILINK_DEFS(hostless_ul6,604DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL6 DAI")),605DAILINK_COMP_ARRAY(COMP_DUMMY()),606DAILINK_COMP_ARRAY(COMP_EMPTY()));607SND_SOC_DAILINK_DEFS(hostless_hw_gain_aaudio,608DAILINK_COMP_ARRAY(COMP_CPU("Hostless HW Gain AAudio DAI")),609DAILINK_COMP_ARRAY(COMP_DUMMY()),610DAILINK_COMP_ARRAY(COMP_EMPTY()));611SND_SOC_DAILINK_DEFS(hostless_src_aaudio,612DAILINK_COMP_ARRAY(COMP_CPU("Hostless SRC AAudio DAI")),613DAILINK_COMP_ARRAY(COMP_DUMMY()),614DAILINK_COMP_ARRAY(COMP_EMPTY()));615SND_SOC_DAILINK_DEFS(AFE_SOF_DL1,616DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL1")),617DAILINK_COMP_ARRAY(COMP_DUMMY()),618DAILINK_COMP_ARRAY(COMP_EMPTY()));619620SND_SOC_DAILINK_DEFS(AFE_SOF_DL2,621DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL2")),622DAILINK_COMP_ARRAY(COMP_DUMMY()),623DAILINK_COMP_ARRAY(COMP_EMPTY()));624625SND_SOC_DAILINK_DEFS(AFE_SOF_UL1,626DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL1")),627DAILINK_COMP_ARRAY(COMP_DUMMY()),628DAILINK_COMP_ARRAY(COMP_EMPTY()));629630SND_SOC_DAILINK_DEFS(AFE_SOF_UL2,631DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL2")),632DAILINK_COMP_ARRAY(COMP_DUMMY()),633DAILINK_COMP_ARRAY(COMP_EMPTY()));634635static 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};641642static 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,648SND_SOC_DPCM_TRIGGER_PRE},649.dynamic = 1,650.playback_only = 1,651.dpcm_merged_format = 1,652.dpcm_merged_chan = 1,653.dpcm_merged_rate = 1,654.ops = &mtk_soundcard_common_playback_ops,655SND_SOC_DAILINK_REG(playback1),656},657{658.name = "Playback_12",659.stream_name = "Playback_12",660.trigger = {SND_SOC_DPCM_TRIGGER_PRE,661SND_SOC_DPCM_TRIGGER_PRE},662.dynamic = 1,663.playback_only = 1,664SND_SOC_DAILINK_REG(playback12),665},666{667.name = "Playback_2",668.stream_name = "Playback_2",669.trigger = {SND_SOC_DPCM_TRIGGER_PRE,670SND_SOC_DPCM_TRIGGER_PRE},671.dynamic = 1,672.playback_only = 1,673.dpcm_merged_format = 1,674.dpcm_merged_chan = 1,675.dpcm_merged_rate = 1,676SND_SOC_DAILINK_REG(playback2),677},678{679.name = "Playback_3",680.stream_name = "Playback_3",681.trigger = {SND_SOC_DPCM_TRIGGER_PRE,682SND_SOC_DPCM_TRIGGER_PRE},683.dynamic = 1,684.playback_only = 1,685.dpcm_merged_format = 1,686.dpcm_merged_chan = 1,687.dpcm_merged_rate = 1,688.ops = &mtk_soundcard_common_playback_ops,689SND_SOC_DAILINK_REG(playback3),690},691{692.name = "Playback_4",693.stream_name = "Playback_4",694.trigger = {SND_SOC_DPCM_TRIGGER_PRE,695SND_SOC_DPCM_TRIGGER_PRE},696.dynamic = 1,697.playback_only = 1,698SND_SOC_DAILINK_REG(playback4),699},700{701.name = "Playback_5",702.stream_name = "Playback_5",703.trigger = {SND_SOC_DPCM_TRIGGER_PRE,704SND_SOC_DPCM_TRIGGER_PRE},705.dynamic = 1,706.playback_only = 1,707SND_SOC_DAILINK_REG(playback5),708},709{710.name = "Playback_6",711.stream_name = "Playback_6",712.trigger = {SND_SOC_DPCM_TRIGGER_PRE,713SND_SOC_DPCM_TRIGGER_PRE},714.dynamic = 1,715.playback_only = 1,716SND_SOC_DAILINK_REG(playback6),717},718{719.name = "Playback_7",720.stream_name = "Playback_7",721.trigger = {SND_SOC_DPCM_TRIGGER_PRE,722SND_SOC_DPCM_TRIGGER_PRE},723.dynamic = 1,724.playback_only = 1,725SND_SOC_DAILINK_REG(playback7),726},727{728.name = "Playback_8",729.stream_name = "Playback_8",730.trigger = {SND_SOC_DPCM_TRIGGER_PRE,731SND_SOC_DPCM_TRIGGER_PRE},732.dynamic = 1,733.playback_only = 1,734SND_SOC_DAILINK_REG(playback8),735},736{737.name = "Capture_1",738.stream_name = "Capture_1",739.trigger = {SND_SOC_DPCM_TRIGGER_PRE,740SND_SOC_DPCM_TRIGGER_PRE},741.dynamic = 1,742.capture_only = 1,743SND_SOC_DAILINK_REG(capture1),744},745{746.name = "Capture_2",747.stream_name = "Capture_2",748.trigger = {SND_SOC_DPCM_TRIGGER_PRE,749SND_SOC_DPCM_TRIGGER_PRE},750.dynamic = 1,751.capture_only = 1,752.dpcm_merged_format = 1,753.dpcm_merged_chan = 1,754.dpcm_merged_rate = 1,755.ops = &mtk_soundcard_common_capture_ops,756SND_SOC_DAILINK_REG(capture2),757},758{759.name = "Capture_3",760.stream_name = "Capture_3",761.trigger = {SND_SOC_DPCM_TRIGGER_PRE,762SND_SOC_DPCM_TRIGGER_PRE},763.dynamic = 1,764.capture_only = 1,765SND_SOC_DAILINK_REG(capture3),766},767{768.name = "Capture_4",769.stream_name = "Capture_4",770.trigger = {SND_SOC_DPCM_TRIGGER_PRE,771SND_SOC_DPCM_TRIGGER_PRE},772.dynamic = 1,773.capture_only = 1,774.dpcm_merged_format = 1,775.dpcm_merged_chan = 1,776.dpcm_merged_rate = 1,777.ops = &mtk_soundcard_common_capture_ops,778SND_SOC_DAILINK_REG(capture4),779},780{781.name = "Capture_5",782.stream_name = "Capture_5",783.trigger = {SND_SOC_DPCM_TRIGGER_PRE,784SND_SOC_DPCM_TRIGGER_PRE},785.dynamic = 1,786.capture_only = 1,787SND_SOC_DAILINK_REG(capture5),788},789{790.name = "Capture_6",791.stream_name = "Capture_6",792.trigger = {SND_SOC_DPCM_TRIGGER_PRE,793SND_SOC_DPCM_TRIGGER_PRE},794.dynamic = 1,795.capture_only = 1,796.dpcm_merged_format = 1,797.dpcm_merged_chan = 1,798.dpcm_merged_rate = 1,799SND_SOC_DAILINK_REG(capture6),800},801{802.name = "Capture_7",803.stream_name = "Capture_7",804.trigger = {SND_SOC_DPCM_TRIGGER_PRE,805SND_SOC_DPCM_TRIGGER_PRE},806.dynamic = 1,807.capture_only = 1,808SND_SOC_DAILINK_REG(capture7),809},810{811.name = "Hostless_LPBK",812.stream_name = "Hostless_LPBK",813.trigger = {SND_SOC_DPCM_TRIGGER_PRE,814SND_SOC_DPCM_TRIGGER_PRE},815.dynamic = 1,816.ignore_suspend = 1,817SND_SOC_DAILINK_REG(hostless_lpbk),818},819{820.name = "Hostless_FM",821.stream_name = "Hostless_FM",822.trigger = {SND_SOC_DPCM_TRIGGER_PRE,823SND_SOC_DPCM_TRIGGER_PRE},824.dynamic = 1,825.ignore_suspend = 1,826SND_SOC_DAILINK_REG(hostless_fm),827},828{829.name = "Hostless_SRC_1",830.stream_name = "Hostless_SRC_1",831.trigger = {SND_SOC_DPCM_TRIGGER_PRE,832SND_SOC_DPCM_TRIGGER_PRE},833.dynamic = 1,834.ignore_suspend = 1,835SND_SOC_DAILINK_REG(hostless_src1),836},837{838.name = "Hostless_SRC_Bargein",839.stream_name = "Hostless_SRC_Bargein",840.trigger = {SND_SOC_DPCM_TRIGGER_PRE,841SND_SOC_DPCM_TRIGGER_PRE},842.dynamic = 1,843.ignore_suspend = 1,844SND_SOC_DAILINK_REG(hostless_src_bargein),845},846{847.name = "Hostless_HW_Gain_AAudio",848.stream_name = "Hostless_HW_Gain_AAudio",849.trigger = {SND_SOC_DPCM_TRIGGER_PRE,850SND_SOC_DPCM_TRIGGER_PRE},851.dynamic = 1,852.capture_only = 1,853.ignore_suspend = 1,854SND_SOC_DAILINK_REG(hostless_hw_gain_aaudio),855},856{857.name = "Hostless_SRC_AAudio",858.stream_name = "Hostless_SRC_AAudio",859.trigger = {SND_SOC_DPCM_TRIGGER_PRE,860SND_SOC_DPCM_TRIGGER_PRE},861.dynamic = 1,862.ignore_suspend = 1,863SND_SOC_DAILINK_REG(hostless_src_aaudio),864},865/* Back End DAI links */866{867.name = "Primary Codec",868.no_pcm = 1,869.ignore_suspend = 1,870.init = primary_codec_init,871SND_SOC_DAILINK_REG(adda),872},873{874.name = "I2S3",875.no_pcm = 1,876.dai_fmt = SND_SOC_DAIFMT_I2S |877SND_SOC_DAIFMT_IB_IF |878SND_SOC_DAIFMT_CBP_CFP,879.playback_only = 1,880.ignore_suspend = 1,881.init = mt8186_mt6366_rt1019_rt5682s_hdmi_init,882SND_SOC_DAILINK_REG(i2s3),883},884{885.name = "I2S0",886.no_pcm = 1,887.capture_only = 1,888.ignore_suspend = 1,889.ops = &mt8186_rt5682s_i2s_ops,890SND_SOC_DAILINK_REG(i2s0),891},892{893.name = "I2S1",894.no_pcm = 1,895.playback_only = 1,896.ignore_suspend = 1,897.init = mt8186_headset_codec_init,898SND_SOC_DAILINK_REG(i2s1),899},900{901.name = "I2S2",902.no_pcm = 1,903.capture_only = 1,904.ignore_suspend = 1,905SND_SOC_DAILINK_REG(i2s2),906},907{908.name = "HW Gain 1",909.no_pcm = 1,910.ignore_suspend = 1,911SND_SOC_DAILINK_REG(hw_gain1),912},913{914.name = "HW Gain 2",915.no_pcm = 1,916.ignore_suspend = 1,917SND_SOC_DAILINK_REG(hw_gain2),918},919{920.name = "HW_SRC_1",921.no_pcm = 1,922.ignore_suspend = 1,923SND_SOC_DAILINK_REG(hw_src1),924},925{926.name = "HW_SRC_2",927.no_pcm = 1,928.ignore_suspend = 1,929SND_SOC_DAILINK_REG(hw_src2),930},931{932.name = "CONNSYS_I2S",933.no_pcm = 1,934.capture_only = 1,935.ignore_suspend = 1,936SND_SOC_DAILINK_REG(connsys_i2s),937},938{939.name = "PCM 1",940.dai_fmt = SND_SOC_DAIFMT_I2S |941SND_SOC_DAIFMT_NB_IF,942.no_pcm = 1,943.ignore_suspend = 1,944SND_SOC_DAILINK_REG(pcm1),945},946{947.name = "TDM IN",948.no_pcm = 1,949.capture_only = 1,950.ignore_suspend = 1,951SND_SOC_DAILINK_REG(tdm_in),952},953/* dummy BE for ul memif to record from dl memif */954{955.name = "Hostless_UL1",956.no_pcm = 1,957.capture_only = 1,958.ignore_suspend = 1,959SND_SOC_DAILINK_REG(hostless_ul1),960},961{962.name = "Hostless_UL2",963.no_pcm = 1,964.capture_only = 1,965.ignore_suspend = 1,966SND_SOC_DAILINK_REG(hostless_ul2),967},968{969.name = "Hostless_UL3",970.no_pcm = 1,971.capture_only = 1,972.ignore_suspend = 1,973SND_SOC_DAILINK_REG(hostless_ul3),974},975{976.name = "Hostless_UL5",977.no_pcm = 1,978.capture_only = 1,979.ignore_suspend = 1,980SND_SOC_DAILINK_REG(hostless_ul5),981},982{983.name = "Hostless_UL6",984.no_pcm = 1,985.capture_only = 1,986.ignore_suspend = 1,987SND_SOC_DAILINK_REG(hostless_ul6),988},989/* SOF BE */990{991.name = "AFE_SOF_DL1",992.no_pcm = 1,993.playback_only = 1,994SND_SOC_DAILINK_REG(AFE_SOF_DL1),995},996{997.name = "AFE_SOF_DL2",998.no_pcm = 1,999.playback_only = 1,1000SND_SOC_DAILINK_REG(AFE_SOF_DL2),1001},1002{1003.name = "AFE_SOF_UL1",1004.no_pcm = 1,1005.capture_only = 1,1006SND_SOC_DAILINK_REG(AFE_SOF_UL1),1007},1008{1009.name = "AFE_SOF_UL2",1010.no_pcm = 1,1011.capture_only = 1,1012SND_SOC_DAILINK_REG(AFE_SOF_UL2),1013},1014};10151016static const struct snd_soc_dapm_widget1017mt8186_mt6366_da7219_max98357_widgets[] = {1018SND_SOC_DAPM_SPK("Speakers", NULL),1019SND_SOC_DAPM_HP("Headphones", NULL),1020SND_SOC_DAPM_MIC("Headset Mic", NULL),1021SND_SOC_DAPM_LINE("Line Out", NULL),1022SND_SOC_DAPM_LINE("HDMI1", NULL),1023SND_SOC_DAPM_MIXER(SOF_DMA_DL1, SND_SOC_NOPM, 0, 0, NULL, 0),1024SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0),1025SND_SOC_DAPM_MIXER(SOF_DMA_UL1, SND_SOC_NOPM, 0, 0, NULL, 0),1026SND_SOC_DAPM_MIXER(SOF_DMA_UL2, SND_SOC_NOPM, 0, 0, NULL, 0),1027};10281029static const struct snd_soc_dapm_widget1030mt8186_mt6366_rt1019_rt5682s_widgets[] = {1031SND_SOC_DAPM_SPK("Speakers", NULL),1032SND_SOC_DAPM_HP("Headphone", NULL),1033SND_SOC_DAPM_MIC("Headset Mic", NULL),1034SND_SOC_DAPM_OUTPUT("HDMI1"),1035SND_SOC_DAPM_MIXER(SOF_DMA_DL1, SND_SOC_NOPM, 0, 0, NULL, 0),1036SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0),1037SND_SOC_DAPM_MIXER(SOF_DMA_UL1, SND_SOC_NOPM, 0, 0, NULL, 0),1038SND_SOC_DAPM_MIXER(SOF_DMA_UL2, SND_SOC_NOPM, 0, 0, NULL, 0),1039};10401041static const struct snd_soc_dapm_route1042mt8186_mt6366_rt1019_rt5682s_routes[] = {1043/* SPK */1044{ "Speakers", NULL, "Speaker" },1045/* Headset */1046{ "Headphone", NULL, "HPOL" },1047{ "Headphone", NULL, "HPOR" },1048{ "IN1P", NULL, "Headset Mic" },1049/* HDMI */1050{ "HDMI1", NULL, "TX" },1051/* SOF Uplink */1052{SOF_DMA_UL1, NULL, "UL1_CH1"},1053{SOF_DMA_UL1, NULL, "UL1_CH2"},1054{SOF_DMA_UL2, NULL, "UL2_CH1"},1055{SOF_DMA_UL2, NULL, "UL2_CH2"},1056/* SOF Downlink */1057{"DSP_DL1_VIRT", NULL, SOF_DMA_DL1},1058{"DSP_DL2_VIRT", NULL, SOF_DMA_DL2},1059};10601061static const struct snd_soc_dapm_route mt8186_mt6366_rt5650_routes[] = {1062/* SPK */1063{"Speakers", NULL, "SPOL"},1064{"Speakers", NULL, "SPOR"},1065/* Headset */1066{ "Headphone", NULL, "HPOL" },1067{ "Headphone", NULL, "HPOR" },1068{ "IN1P", NULL, "Headset Mic" },1069{ "IN1N", NULL, "Headset Mic"},1070/* HDMI */1071{ "HDMI1", NULL, "TX" },1072/* SOF Uplink */1073{SOF_DMA_UL1, NULL, "UL1_CH1"},1074{SOF_DMA_UL1, NULL, "UL1_CH2"},1075{SOF_DMA_UL2, NULL, "UL2_CH1"},1076{SOF_DMA_UL2, NULL, "UL2_CH2"},1077/* SOF Downlink */1078{"DSP_DL1_VIRT", NULL, SOF_DMA_DL1},1079{"DSP_DL2_VIRT", NULL, SOF_DMA_DL2},1080};10811082static const struct snd_kcontrol_new mt8186_mt6366_da7219_max98357_controls[] = {1083SOC_DAPM_PIN_SWITCH("Speakers"),1084SOC_DAPM_PIN_SWITCH("Headphones"),1085SOC_DAPM_PIN_SWITCH("Headset Mic"),1086SOC_DAPM_PIN_SWITCH("Line Out"),1087SOC_DAPM_PIN_SWITCH("HDMI1"),1088};10891090static const struct snd_kcontrol_new1091mt8186_mt6366_rt1019_rt5682s_controls[] = {1092SOC_DAPM_PIN_SWITCH("Speakers"),1093SOC_DAPM_PIN_SWITCH("Headphone"),1094SOC_DAPM_PIN_SWITCH("Headset Mic"),1095SOC_DAPM_PIN_SWITCH("HDMI1"),1096};10971098static struct snd_soc_card mt8186_mt6366_da7219_max98357_soc_card = {1099.name = "mt8186_da7219_max98357",1100.owner = THIS_MODULE,1101.dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,1102.num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),1103.controls = mt8186_mt6366_da7219_max98357_controls,1104.num_controls = ARRAY_SIZE(mt8186_mt6366_da7219_max98357_controls),1105.dapm_widgets = mt8186_mt6366_da7219_max98357_widgets,1106.num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_da7219_max98357_widgets),1107.dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,1108.num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),1109.codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,1110.num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),1111};11121113static struct snd_soc_card mt8186_mt6366_rt1019_rt5682s_soc_card = {1114.name = "mt8186_rt1019_rt5682s",1115.owner = THIS_MODULE,1116.dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,1117.num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),1118.controls = mt8186_mt6366_rt1019_rt5682s_controls,1119.num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),1120.dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,1121.num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),1122.dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,1123.num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),1124.codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,1125.num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),1126};11271128static struct snd_soc_card mt8186_mt6366_rt5682s_max98360_soc_card = {1129.name = "mt8186_rt5682s_max98360",1130.owner = THIS_MODULE,1131.dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,1132.num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),1133.controls = mt8186_mt6366_rt1019_rt5682s_controls,1134.num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),1135.dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,1136.num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),1137.dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,1138.num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),1139.codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,1140.num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),1141};11421143static struct snd_soc_card mt8186_mt6366_rt5650_soc_card = {1144.name = "mt8186_rt5650",1145.owner = THIS_MODULE,1146.dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,1147.num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),1148.controls = mt8186_mt6366_rt1019_rt5682s_controls,1149.num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),1150.dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,1151.num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),1152.dapm_routes = mt8186_mt6366_rt5650_routes,1153.num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt5650_routes),1154.codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,1155.num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),1156};11571158static int mt8186_mt6366_legacy_probe(struct mtk_soc_card_data *soc_card_data)1159{1160struct mtk_platform_card_data *card_data = soc_card_data->card_data;1161struct snd_soc_card *card = card_data->card;1162struct device *dev = card->dev;1163struct snd_soc_dai_link *dai_link;1164struct device_node *headset_codec, *playback_codec;1165int ret, i;11661167playback_codec = of_get_child_by_name(dev->of_node, "playback-codecs");1168if (!playback_codec)1169return dev_err_probe(dev, -EINVAL,1170"Property 'playback-codecs' missing or invalid\n");11711172headset_codec = of_get_child_by_name(dev->of_node, "headset-codec");1173if (!headset_codec) {1174of_node_put(playback_codec);1175return dev_err_probe(dev, -EINVAL,1176"Property 'headset-codec' missing or invalid\n");1177}11781179for_each_card_prelinks(card, i, dai_link) {1180ret = mt8186_mt6366_card_set_be_link(card, dai_link, playback_codec, "I2S3");1181if (ret) {1182dev_err_probe(dev, ret, "%s set playback_codec fail\n",1183dai_link->name);1184break;1185}11861187ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S0");1188if (ret) {1189dev_err_probe(dev, ret, "%s set headset_codec fail\n",1190dai_link->name);1191break;1192}11931194ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S1");1195if (ret) {1196dev_err_probe(dev, ret, "%s set headset_codec fail\n",1197dai_link->name);1198break;1199}1200}1201of_node_put(headset_codec);1202of_node_put(playback_codec);12031204return ret;1205}12061207static int mt8186_mt6366_soc_card_probe(struct mtk_soc_card_data *soc_card_data, bool legacy)1208{1209struct mtk_platform_card_data *card_data = soc_card_data->card_data;1210struct snd_soc_card *card = card_data->card;1211struct snd_soc_dai_link *dai_link;1212struct mt8186_mt6366_rt1019_rt5682s_priv *mach_priv;1213int i, ret;12141215mach_priv = devm_kzalloc(card->dev, sizeof(*mach_priv), GFP_KERNEL);1216if (!mach_priv)1217return -ENOMEM;12181219soc_card_data->mach_priv = mach_priv;12201221mach_priv->dmic_sel = devm_gpiod_get_optional(card->dev,1222"dmic", GPIOD_OUT_LOW);1223if (IS_ERR(mach_priv->dmic_sel))1224return dev_err_probe(card->dev, PTR_ERR(mach_priv->dmic_sel),1225"DMIC gpio failed\n");12261227for_each_card_prelinks(card, i, dai_link) {1228if (strcmp(dai_link->name, "I2S0") == 0 ||1229strcmp(dai_link->name, "I2S1") == 0 ||1230strcmp(dai_link->name, "I2S2") == 0) {1231if (card_data->flags & DA7219_CODEC_PRESENT) {1232dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_32le_fixup;1233dai_link->ops = &mt8186_da7219_i2s_ops;1234} else {1235dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_24le_fixup;1236dai_link->ops = &mt8186_rt5682s_i2s_ops;1237}1238} else if (strcmp(dai_link->name, "I2S3") == 0) {1239if (card_data->flags & DA7219_CODEC_PRESENT)1240dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_24le_fixup;1241else1242dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_32le_fixup;1243}1244}12451246if (legacy) {1247ret = mt8186_mt6366_legacy_probe(soc_card_data);1248if (ret)1249return ret;1250}12511252ret = mt8186_afe_gpio_init(card->dev);1253if (ret)1254return dev_err_probe(card->dev, ret, "init AFE gpio error\n");12551256return 0;1257}12581259static const unsigned int mt8186_pcm_playback_channels[] = { 2 };1260static const unsigned int mt8186_pcm_capture_channels[] = { 1, 2 };1261static const unsigned int mt8186_pcm_rates[] = { 48000 };12621263static const struct snd_pcm_hw_constraint_list mt8186_rate_constraint = {1264.list = mt8186_pcm_rates,1265.count = ARRAY_SIZE(mt8186_pcm_rates)1266};12671268static const struct mtk_pcm_constraints_data mt8186_pcm_constraints[MTK_CONSTRAINT_CAPTURE + 1] = {1269[MTK_CONSTRAINT_PLAYBACK] = {1270.channels = &(const struct snd_pcm_hw_constraint_list) {1271.list = mt8186_pcm_playback_channels,1272.count = ARRAY_SIZE(mt8186_pcm_playback_channels)1273},1274.rates = &mt8186_rate_constraint,1275},1276[MTK_CONSTRAINT_CAPTURE] = {1277.channels = &(const struct snd_pcm_hw_constraint_list) {1278.list = mt8186_pcm_capture_channels,1279.count = ARRAY_SIZE(mt8186_pcm_capture_channels)1280},1281.rates = &mt8186_rate_constraint,1282}1283};12841285static const struct mtk_sof_priv mt8186_sof_priv = {1286.conn_streams = g_sof_conn_streams,1287.num_streams = ARRAY_SIZE(g_sof_conn_streams),1288.sof_dai_link_fixup = mt8186_sof_dai_link_fixup1289};12901291static const struct mtk_soundcard_pdata mt8186_mt6366_da7219_max98357_pdata = {1292.card_data = &(struct mtk_platform_card_data) {1293.card = &mt8186_mt6366_da7219_max98357_soc_card,1294.num_jacks = MT8186_JACK_MAX,1295.pcm_constraints = mt8186_pcm_constraints,1296.num_pcm_constraints = ARRAY_SIZE(mt8186_pcm_constraints),1297.flags = DA7219_CODEC_PRESENT,1298},1299.sof_priv = &mt8186_sof_priv,1300.soc_probe = mt8186_mt6366_soc_card_probe1301};13021303static const struct mtk_soundcard_pdata mt8186_mt6366_rt1019_rt5682s_pdata = {1304.card_data = &(struct mtk_platform_card_data) {1305.card = &mt8186_mt6366_rt1019_rt5682s_soc_card,1306.num_jacks = MT8186_JACK_MAX,1307.pcm_constraints = mt8186_pcm_constraints,1308.num_pcm_constraints = ARRAY_SIZE(mt8186_pcm_constraints),1309},1310.sof_priv = &mt8186_sof_priv,1311.soc_probe = mt8186_mt6366_soc_card_probe1312};13131314static const struct mtk_soundcard_pdata mt8186_mt6366_rt5682s_max98360_pdata = {1315.card_data = &(struct mtk_platform_card_data) {1316.card = &mt8186_mt6366_rt5682s_max98360_soc_card,1317.num_jacks = MT8186_JACK_MAX,1318.pcm_constraints = mt8186_pcm_constraints,1319.num_pcm_constraints = ARRAY_SIZE(mt8186_pcm_constraints),1320},1321.sof_priv = &mt8186_sof_priv,1322.soc_probe = mt8186_mt6366_soc_card_probe1323};13241325static const struct mtk_soundcard_pdata mt8186_mt6366_rt5650_pdata = {1326.card_data = &(struct mtk_platform_card_data) {1327.card = &mt8186_mt6366_rt5650_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};13351336#if IS_ENABLED(CONFIG_OF)1337static const struct of_device_id mt8186_mt6366_dt_match[] = {1338{1339.compatible = "mediatek,mt8186-mt6366-rt1019-rt5682s-sound",1340.data = &mt8186_mt6366_rt1019_rt5682s_pdata,1341},1342{1343.compatible = "mediatek,mt8186-mt6366-rt5682s-max98360-sound",1344.data = &mt8186_mt6366_rt5682s_max98360_pdata,1345},1346{1347.compatible = "mediatek,mt8186-mt6366-rt5650-sound",1348.data = &mt8186_mt6366_rt5650_pdata,1349},1350{1351.compatible = "mediatek,mt8186-mt6366-da7219-max98357-sound",1352.data = &mt8186_mt6366_da7219_max98357_pdata,1353},1354{ /* sentinel */ }1355};1356MODULE_DEVICE_TABLE(of, mt8186_mt6366_dt_match);1357#endif13581359static struct platform_driver mt8186_mt6366_driver = {1360.driver = {1361.name = "mt8186_mt6366",1362#if IS_ENABLED(CONFIG_OF)1363.of_match_table = mt8186_mt6366_dt_match,1364#endif1365.pm = &snd_soc_pm_ops,1366},1367.probe = mtk_soundcard_common_probe,1368};13691370module_platform_driver(mt8186_mt6366_driver);13711372/* Module information */1373MODULE_DESCRIPTION("MT8186-MT6366 ALSA SoC machine driver");1374MODULE_AUTHOR("Jiaxin Yu <[email protected]>");1375MODULE_LICENSE("GPL v2");1376MODULE_ALIAS("mt8186_mt6366 soc card");137713781379