Path: blob/master/sound/soc/mediatek/mt8192/mt8192-mt6359-rt1015-rt5682.c
26488 views
// SPDX-License-Identifier: GPL-2.01//2// mt8192-mt6359-rt1015-rt5682.c --3// MT8192-MT6359-RT1015-RT6358 ALSA SoC machine driver4//5// Copyright (c) 2020 MediaTek Inc.6// Author: Jiaxin Yu <[email protected]>7//89#include <linux/input.h>10#include <linux/module.h>11#include <linux/of.h>12#include <linux/pm_runtime.h>13#include <sound/jack.h>14#include <sound/pcm_params.h>15#include <sound/rt5682.h>16#include <sound/soc.h>1718#include "../../codecs/mt6359.h"19#include "../../codecs/rt1015.h"20#include "../../codecs/rt5682.h"21#include "../common/mtk-afe-platform-driver.h"22#include "../common/mtk-soc-card.h"23#include "../common/mtk-soundcard-driver.h"24#include "mt8192-afe-common.h"25#include "mt8192-afe-clk.h"26#include "mt8192-afe-gpio.h"2728#define DRIVER_NAME "mt8192_mt6359"2930#define RT1015_CODEC_DAI "rt1015-aif"31#define RT1015_DEV0_NAME "rt1015.1-0028"32#define RT1015_DEV1_NAME "rt1015.1-0029"3334#define RT1015_RT5682_CARD_NAME "mt8192_mt6359_rt1015_rt5682"35#define RT1015P_RT5682_CARD_NAME "mt8192_mt6359_rt1015p_rt5682"36#define RT1015P_RT5682S_CARD_NAME "mt8192_mt6359_rt1015p_rt5682s"3738#define RT1015_RT5682_OF_NAME "mediatek,mt8192_mt6359_rt1015_rt5682"39#define RT1015P_RT5682_OF_NAME "mediatek,mt8192_mt6359_rt1015p_rt5682"40#define RT1015P_RT5682S_OF_NAME "mediatek,mt8192_mt6359_rt1015p_rt5682s"4142enum mt8192_jacks {43MT8192_JACK_HEADSET,44MT8192_JACK_HDMI,45MT8192_JACK_MAX,46};4748/* Headset jack detection DAPM pins */49static struct snd_soc_jack_pin mt8192_jack_pins[] = {50{51.pin = "Headphone Jack",52.mask = SND_JACK_HEADPHONE,53},54{55.pin = "Headset Mic",56.mask = SND_JACK_MICROPHONE,57},58};5960static int mt8192_rt1015_i2s_hw_params(struct snd_pcm_substream *substream,61struct snd_pcm_hw_params *params)62{63struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);64struct snd_soc_card *card = rtd->card;65struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);66struct snd_soc_dai *codec_dai;67unsigned int rate = params_rate(params);68unsigned int mclk_fs_ratio = 128;69unsigned int mclk_fs = rate * mclk_fs_ratio;70int ret, i;7172for_each_rtd_codec_dais(rtd, i, codec_dai) {73ret = snd_soc_dai_set_pll(codec_dai, 0,74RT1015_PLL_S_BCLK,75params_rate(params) * 64,76params_rate(params) * 256);77if (ret) {78dev_err(card->dev, "failed to set pll\n");79return ret;80}8182ret = snd_soc_dai_set_sysclk(codec_dai,83RT1015_SCLK_S_PLL,84params_rate(params) * 256,85SND_SOC_CLOCK_IN);86if (ret) {87dev_err(card->dev, "failed to set sysclk\n");88return ret;89}90}9192return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);93}9495static int mt8192_rt5682x_i2s_hw_params(struct snd_pcm_substream *substream,96struct snd_pcm_hw_params *params)97{98struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);99struct snd_soc_card *card = rtd->card;100struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);101struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);102unsigned int rate = params_rate(params);103unsigned int mclk_fs_ratio = 128;104unsigned int mclk_fs = rate * mclk_fs_ratio;105int bitwidth;106int ret;107108bitwidth = snd_pcm_format_width(params_format(params));109if (bitwidth < 0) {110dev_err(card->dev, "invalid bit width: %d\n", bitwidth);111return bitwidth;112}113114ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);115if (ret) {116dev_err(card->dev, "failed to set tdm slot\n");117return ret;118}119120ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1,121RT5682_PLL1_S_BCLK1,122params_rate(params) * 64,123params_rate(params) * 512);124if (ret) {125dev_err(card->dev, "failed to set pll\n");126return ret;127}128129ret = snd_soc_dai_set_sysclk(codec_dai,130RT5682_SCLK_S_PLL1,131params_rate(params) * 512,132SND_SOC_CLOCK_IN);133if (ret) {134dev_err(card->dev, "failed to set sysclk\n");135return ret;136}137138return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);139}140141static const struct snd_soc_ops mt8192_rt1015_i2s_ops = {142.hw_params = mt8192_rt1015_i2s_hw_params,143};144145static const struct snd_soc_ops mt8192_rt5682x_i2s_ops = {146.hw_params = mt8192_rt5682x_i2s_hw_params,147};148149static int mt8192_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd)150{151struct snd_soc_component *cmpnt_afe =152snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);153struct snd_soc_component *cmpnt_codec =154snd_soc_rtd_to_codec(rtd, 0)->component;155struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);156struct mt8192_afe_private *afe_priv = afe->platform_priv;157int phase;158unsigned int monitor;159int test_done_1, test_done_2, test_done_3;160int cycle_1, cycle_2, cycle_3;161int prev_cycle_1, prev_cycle_2, prev_cycle_3;162int chosen_phase_1, chosen_phase_2, chosen_phase_3;163int counter;164int mtkaif_calib_ok;165166pm_runtime_get_sync(afe->dev);167mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 1);168mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 0);169mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34, 1);170mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34, 0);171172mt6359_mtkaif_calibration_enable(cmpnt_codec);173174/* set clock protocol 2 */175regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x38);176regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x39);177178/* set test type to synchronizer pulse */179regmap_update_bits(afe_priv->topckgen,180CKSYS_AUD_TOP_CFG, 0xffff, 0x4);181182mtkaif_calib_ok = true;183afe_priv->mtkaif_calibration_num_phase = 42; /* mt6359: 0 ~ 42 */184afe_priv->mtkaif_chosen_phase[0] = -1;185afe_priv->mtkaif_chosen_phase[1] = -1;186afe_priv->mtkaif_chosen_phase[2] = -1;187188for (phase = 0;189phase <= afe_priv->mtkaif_calibration_num_phase &&190mtkaif_calib_ok;191phase++) {192mt6359_set_mtkaif_calibration_phase(cmpnt_codec,193phase, phase, phase);194195regmap_update_bits(afe_priv->topckgen,196CKSYS_AUD_TOP_CFG, 0x1, 0x1);197198test_done_1 = 0;199test_done_2 = 0;200test_done_3 = 0;201cycle_1 = -1;202cycle_2 = -1;203cycle_3 = -1;204counter = 0;205while (test_done_1 == 0 ||206test_done_2 == 0 ||207test_done_3 == 0) {208regmap_read(afe_priv->topckgen,209CKSYS_AUD_TOP_MON, &monitor);210211test_done_1 = (monitor >> 28) & 0x1;212test_done_2 = (monitor >> 29) & 0x1;213test_done_3 = (monitor >> 30) & 0x1;214if (test_done_1 == 1)215cycle_1 = monitor & 0xf;216217if (test_done_2 == 1)218cycle_2 = (monitor >> 4) & 0xf;219220if (test_done_3 == 1)221cycle_3 = (monitor >> 8) & 0xf;222223/* handle if never test done */224if (++counter > 10000) {225dev_err(afe->dev, "%s(), test fail, cycle_1 %d, cycle_2 %d, cycle_3 %d, monitor 0x%x\n",226__func__,227cycle_1, cycle_2, cycle_3, monitor);228mtkaif_calib_ok = false;229break;230}231}232233if (phase == 0) {234prev_cycle_1 = cycle_1;235prev_cycle_2 = cycle_2;236prev_cycle_3 = cycle_3;237}238239if (cycle_1 != prev_cycle_1 &&240afe_priv->mtkaif_chosen_phase[0] < 0) {241afe_priv->mtkaif_chosen_phase[0] = phase - 1;242afe_priv->mtkaif_phase_cycle[0] = prev_cycle_1;243}244245if (cycle_2 != prev_cycle_2 &&246afe_priv->mtkaif_chosen_phase[1] < 0) {247afe_priv->mtkaif_chosen_phase[1] = phase - 1;248afe_priv->mtkaif_phase_cycle[1] = prev_cycle_2;249}250251if (cycle_3 != prev_cycle_3 &&252afe_priv->mtkaif_chosen_phase[2] < 0) {253afe_priv->mtkaif_chosen_phase[2] = phase - 1;254afe_priv->mtkaif_phase_cycle[2] = prev_cycle_3;255}256257regmap_update_bits(afe_priv->topckgen,258CKSYS_AUD_TOP_CFG, 0x1, 0x0);259260if (afe_priv->mtkaif_chosen_phase[0] >= 0 &&261afe_priv->mtkaif_chosen_phase[1] >= 0 &&262afe_priv->mtkaif_chosen_phase[2] >= 0)263break;264}265266if (afe_priv->mtkaif_chosen_phase[0] < 0)267chosen_phase_1 = 0;268else269chosen_phase_1 = afe_priv->mtkaif_chosen_phase[0];270271if (afe_priv->mtkaif_chosen_phase[1] < 0)272chosen_phase_2 = 0;273else274chosen_phase_2 = afe_priv->mtkaif_chosen_phase[1];275276if (afe_priv->mtkaif_chosen_phase[2] < 0)277chosen_phase_3 = 0;278else279chosen_phase_3 = afe_priv->mtkaif_chosen_phase[2];280281mt6359_set_mtkaif_calibration_phase(cmpnt_codec,282chosen_phase_1,283chosen_phase_2,284chosen_phase_3);285286/* disable rx fifo */287regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x38);288289mt6359_mtkaif_calibration_disable(cmpnt_codec);290291mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 1);292mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 0);293mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34, 1);294mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34, 0);295pm_runtime_put(afe->dev);296297dev_dbg(afe->dev, "%s(), mtkaif_chosen_phase[0/1/2]:%d/%d/%d\n",298__func__,299afe_priv->mtkaif_chosen_phase[0],300afe_priv->mtkaif_chosen_phase[1],301afe_priv->mtkaif_chosen_phase[2]);302303return 0;304}305306static int mt8192_mt6359_init(struct snd_soc_pcm_runtime *rtd)307{308struct snd_soc_component *cmpnt_afe =309snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);310struct snd_soc_component *cmpnt_codec =311snd_soc_rtd_to_codec(rtd, 0)->component;312struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);313struct mt8192_afe_private *afe_priv = afe->platform_priv;314315/* set mtkaif protocol */316mt6359_set_mtkaif_protocol(cmpnt_codec,317MT6359_MTKAIF_PROTOCOL_2_CLK_P2);318afe_priv->mtkaif_protocol = MTKAIF_PROTOCOL_2_CLK_P2;319320/* mtkaif calibration */321mt8192_mt6359_mtkaif_calibration(rtd);322323return 0;324}325326static int mt8192_rt5682_init(struct snd_soc_pcm_runtime *rtd)327{328struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);329struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8192_JACK_HEADSET];330struct snd_soc_component *cmpnt_afe =331snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);332struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);333struct snd_soc_component *cmpnt_codec =334snd_soc_rtd_to_codec(rtd, 0)->component;335int ret;336337ret = mt8192_dai_i2s_set_share(afe, "I2S8", "I2S9");338if (ret) {339dev_err(rtd->dev, "Failed to set up shared clocks\n");340return ret;341}342343ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",344SND_JACK_HEADSET | SND_JACK_BTN_0 |345SND_JACK_BTN_1 | SND_JACK_BTN_2 |346SND_JACK_BTN_3,347jack, mt8192_jack_pins,348ARRAY_SIZE(mt8192_jack_pins));349if (ret) {350dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);351return ret;352}353354snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);355snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);356snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);357snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);358359return snd_soc_component_set_jack(cmpnt_codec, jack, NULL);360};361362static int mt8192_mt6359_hdmi_init(struct snd_soc_pcm_runtime *rtd)363{364struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);365struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8192_JACK_HDMI];366struct snd_soc_component *cmpnt_codec =367snd_soc_rtd_to_codec(rtd, 0)->component;368int ret;369370ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT, jack);371if (ret) {372dev_err(rtd->dev, "HDMI Jack creation failed: %d\n", ret);373return ret;374}375376return snd_soc_component_set_jack(cmpnt_codec, jack, NULL);377}378379static int mt8192_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,380struct snd_pcm_hw_params *params)381{382/* fix BE i2s format to S24_LE, clean param mask first */383snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),3840, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);385386params_set_format(params, SNDRV_PCM_FORMAT_S24_LE);387388return 0;389}390391/* FE */392SND_SOC_DAILINK_DEFS(playback1,393DAILINK_COMP_ARRAY(COMP_CPU("DL1")),394DAILINK_COMP_ARRAY(COMP_DUMMY()),395DAILINK_COMP_ARRAY(COMP_EMPTY()));396397SND_SOC_DAILINK_DEFS(playback12,398DAILINK_COMP_ARRAY(COMP_CPU("DL12")),399DAILINK_COMP_ARRAY(COMP_DUMMY()),400DAILINK_COMP_ARRAY(COMP_EMPTY()));401402SND_SOC_DAILINK_DEFS(playback2,403DAILINK_COMP_ARRAY(COMP_CPU("DL2")),404DAILINK_COMP_ARRAY(COMP_DUMMY()),405DAILINK_COMP_ARRAY(COMP_EMPTY()));406407SND_SOC_DAILINK_DEFS(playback3,408DAILINK_COMP_ARRAY(COMP_CPU("DL3")),409DAILINK_COMP_ARRAY(COMP_DUMMY()),410DAILINK_COMP_ARRAY(COMP_EMPTY()));411412SND_SOC_DAILINK_DEFS(playback4,413DAILINK_COMP_ARRAY(COMP_CPU("DL4")),414DAILINK_COMP_ARRAY(COMP_DUMMY()),415DAILINK_COMP_ARRAY(COMP_EMPTY()));416417SND_SOC_DAILINK_DEFS(playback5,418DAILINK_COMP_ARRAY(COMP_CPU("DL5")),419DAILINK_COMP_ARRAY(COMP_DUMMY()),420DAILINK_COMP_ARRAY(COMP_EMPTY()));421422SND_SOC_DAILINK_DEFS(playback6,423DAILINK_COMP_ARRAY(COMP_CPU("DL6")),424DAILINK_COMP_ARRAY(COMP_DUMMY()),425DAILINK_COMP_ARRAY(COMP_EMPTY()));426427SND_SOC_DAILINK_DEFS(playback7,428DAILINK_COMP_ARRAY(COMP_CPU("DL7")),429DAILINK_COMP_ARRAY(COMP_DUMMY()),430DAILINK_COMP_ARRAY(COMP_EMPTY()));431432SND_SOC_DAILINK_DEFS(playback8,433DAILINK_COMP_ARRAY(COMP_CPU("DL8")),434DAILINK_COMP_ARRAY(COMP_DUMMY()),435DAILINK_COMP_ARRAY(COMP_EMPTY()));436437SND_SOC_DAILINK_DEFS(playback9,438DAILINK_COMP_ARRAY(COMP_CPU("DL9")),439DAILINK_COMP_ARRAY(COMP_DUMMY()),440DAILINK_COMP_ARRAY(COMP_EMPTY()));441442SND_SOC_DAILINK_DEFS(capture1,443DAILINK_COMP_ARRAY(COMP_CPU("UL1")),444DAILINK_COMP_ARRAY(COMP_DUMMY()),445DAILINK_COMP_ARRAY(COMP_EMPTY()));446447SND_SOC_DAILINK_DEFS(capture2,448DAILINK_COMP_ARRAY(COMP_CPU("UL2")),449DAILINK_COMP_ARRAY(COMP_DUMMY()),450DAILINK_COMP_ARRAY(COMP_EMPTY()));451452SND_SOC_DAILINK_DEFS(capture3,453DAILINK_COMP_ARRAY(COMP_CPU("UL3")),454DAILINK_COMP_ARRAY(COMP_DUMMY()),455DAILINK_COMP_ARRAY(COMP_EMPTY()));456457SND_SOC_DAILINK_DEFS(capture4,458DAILINK_COMP_ARRAY(COMP_CPU("UL4")),459DAILINK_COMP_ARRAY(COMP_DUMMY()),460DAILINK_COMP_ARRAY(COMP_EMPTY()));461462SND_SOC_DAILINK_DEFS(capture5,463DAILINK_COMP_ARRAY(COMP_CPU("UL5")),464DAILINK_COMP_ARRAY(COMP_DUMMY()),465DAILINK_COMP_ARRAY(COMP_EMPTY()));466467SND_SOC_DAILINK_DEFS(capture6,468DAILINK_COMP_ARRAY(COMP_CPU("UL6")),469DAILINK_COMP_ARRAY(COMP_DUMMY()),470DAILINK_COMP_ARRAY(COMP_EMPTY()));471472SND_SOC_DAILINK_DEFS(capture7,473DAILINK_COMP_ARRAY(COMP_CPU("UL7")),474DAILINK_COMP_ARRAY(COMP_DUMMY()),475DAILINK_COMP_ARRAY(COMP_EMPTY()));476477SND_SOC_DAILINK_DEFS(capture8,478DAILINK_COMP_ARRAY(COMP_CPU("UL8")),479DAILINK_COMP_ARRAY(COMP_DUMMY()),480DAILINK_COMP_ARRAY(COMP_EMPTY()));481482SND_SOC_DAILINK_DEFS(capture_mono1,483DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_1")),484DAILINK_COMP_ARRAY(COMP_DUMMY()),485DAILINK_COMP_ARRAY(COMP_EMPTY()));486487SND_SOC_DAILINK_DEFS(capture_mono2,488DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_2")),489DAILINK_COMP_ARRAY(COMP_DUMMY()),490DAILINK_COMP_ARRAY(COMP_EMPTY()));491492SND_SOC_DAILINK_DEFS(capture_mono3,493DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_3")),494DAILINK_COMP_ARRAY(COMP_DUMMY()),495DAILINK_COMP_ARRAY(COMP_EMPTY()));496497SND_SOC_DAILINK_DEFS(playback_hdmi,498DAILINK_COMP_ARRAY(COMP_CPU("HDMI")),499DAILINK_COMP_ARRAY(COMP_DUMMY()),500DAILINK_COMP_ARRAY(COMP_EMPTY()));501502/* BE */503SND_SOC_DAILINK_DEFS(primary_codec,504DAILINK_COMP_ARRAY(COMP_CPU("ADDA")),505DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",506"mt6359-snd-codec-aif1"),507COMP_CODEC("dmic-codec",508"dmic-hifi")),509DAILINK_COMP_ARRAY(COMP_EMPTY()));510511SND_SOC_DAILINK_DEFS(primary_codec_ch34,512DAILINK_COMP_ARRAY(COMP_CPU("ADDA_CH34")),513DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",514"mt6359-snd-codec-aif2")),515DAILINK_COMP_ARRAY(COMP_EMPTY()));516517SND_SOC_DAILINK_DEFS(ap_dmic,518DAILINK_COMP_ARRAY(COMP_CPU("AP_DMIC")),519DAILINK_COMP_ARRAY(COMP_DUMMY()),520DAILINK_COMP_ARRAY(COMP_EMPTY()));521522SND_SOC_DAILINK_DEFS(ap_dmic_ch34,523DAILINK_COMP_ARRAY(COMP_CPU("AP_DMIC_CH34")),524DAILINK_COMP_ARRAY(COMP_DUMMY()),525DAILINK_COMP_ARRAY(COMP_EMPTY()));526527SND_SOC_DAILINK_DEFS(i2s0,528DAILINK_COMP_ARRAY(COMP_CPU("I2S0")),529DAILINK_COMP_ARRAY(COMP_DUMMY()),530DAILINK_COMP_ARRAY(COMP_EMPTY()));531532SND_SOC_DAILINK_DEFS(i2s1,533DAILINK_COMP_ARRAY(COMP_CPU("I2S1")),534DAILINK_COMP_ARRAY(COMP_DUMMY()),535DAILINK_COMP_ARRAY(COMP_EMPTY()));536537SND_SOC_DAILINK_DEFS(i2s2,538DAILINK_COMP_ARRAY(COMP_CPU("I2S2")),539DAILINK_COMP_ARRAY(COMP_DUMMY()),540DAILINK_COMP_ARRAY(COMP_EMPTY()));541542SND_SOC_DAILINK_DEFS(i2s3,543DAILINK_COMP_ARRAY(COMP_CPU("I2S3")),544DAILINK_COMP_ARRAY(COMP_EMPTY()),545DAILINK_COMP_ARRAY(COMP_EMPTY()));546547SND_SOC_DAILINK_DEFS(i2s5,548DAILINK_COMP_ARRAY(COMP_CPU("I2S5")),549DAILINK_COMP_ARRAY(COMP_DUMMY()),550DAILINK_COMP_ARRAY(COMP_EMPTY()));551552SND_SOC_DAILINK_DEFS(i2s6,553DAILINK_COMP_ARRAY(COMP_CPU("I2S6")),554DAILINK_COMP_ARRAY(COMP_DUMMY()),555DAILINK_COMP_ARRAY(COMP_EMPTY()));556557SND_SOC_DAILINK_DEFS(i2s7,558DAILINK_COMP_ARRAY(COMP_CPU("I2S7")),559DAILINK_COMP_ARRAY(COMP_DUMMY()),560DAILINK_COMP_ARRAY(COMP_EMPTY()));561562SND_SOC_DAILINK_DEFS(i2s8,563DAILINK_COMP_ARRAY(COMP_CPU("I2S8")),564DAILINK_COMP_ARRAY(COMP_EMPTY()),565DAILINK_COMP_ARRAY(COMP_EMPTY()));566567SND_SOC_DAILINK_DEFS(i2s9,568DAILINK_COMP_ARRAY(COMP_CPU("I2S9")),569DAILINK_COMP_ARRAY(COMP_EMPTY()),570DAILINK_COMP_ARRAY(COMP_EMPTY()));571572SND_SOC_DAILINK_DEFS(connsys_i2s,573DAILINK_COMP_ARRAY(COMP_CPU("CONNSYS_I2S")),574DAILINK_COMP_ARRAY(COMP_DUMMY()),575DAILINK_COMP_ARRAY(COMP_EMPTY()));576577SND_SOC_DAILINK_DEFS(pcm1,578DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")),579DAILINK_COMP_ARRAY(COMP_DUMMY()),580DAILINK_COMP_ARRAY(COMP_EMPTY()));581582SND_SOC_DAILINK_DEFS(pcm2,583DAILINK_COMP_ARRAY(COMP_CPU("PCM 2")),584DAILINK_COMP_ARRAY(COMP_DUMMY()),585DAILINK_COMP_ARRAY(COMP_EMPTY()));586587SND_SOC_DAILINK_DEFS(tdm,588DAILINK_COMP_ARRAY(COMP_CPU("TDM")),589DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "i2s-hifi")),590DAILINK_COMP_ARRAY(COMP_EMPTY()));591592static struct snd_soc_dai_link mt8192_mt6359_dai_links[] = {593/* Front End DAI links */594{595.name = "Playback_1",596.stream_name = "Playback_1",597.trigger = {SND_SOC_DPCM_TRIGGER_PRE,598SND_SOC_DPCM_TRIGGER_PRE},599.dynamic = 1,600.playback_only = 1,601SND_SOC_DAILINK_REG(playback1),602},603{604.name = "Playback_12",605.stream_name = "Playback_12",606.trigger = {SND_SOC_DPCM_TRIGGER_PRE,607SND_SOC_DPCM_TRIGGER_PRE},608.dynamic = 1,609.playback_only = 1,610SND_SOC_DAILINK_REG(playback12),611},612{613.name = "Playback_2",614.stream_name = "Playback_2",615.trigger = {SND_SOC_DPCM_TRIGGER_PRE,616SND_SOC_DPCM_TRIGGER_PRE},617.dynamic = 1,618.playback_only = 1,619SND_SOC_DAILINK_REG(playback2),620},621{622.name = "Playback_3",623.stream_name = "Playback_3",624.trigger = {SND_SOC_DPCM_TRIGGER_PRE,625SND_SOC_DPCM_TRIGGER_PRE},626.dynamic = 1,627.playback_only = 1,628.ops = &mtk_soundcard_common_playback_ops,629SND_SOC_DAILINK_REG(playback3),630},631{632.name = "Playback_4",633.stream_name = "Playback_4",634.trigger = {SND_SOC_DPCM_TRIGGER_PRE,635SND_SOC_DPCM_TRIGGER_PRE},636.dynamic = 1,637.playback_only = 1,638SND_SOC_DAILINK_REG(playback4),639},640{641.name = "Playback_5",642.stream_name = "Playback_5",643.trigger = {SND_SOC_DPCM_TRIGGER_PRE,644SND_SOC_DPCM_TRIGGER_PRE},645.dynamic = 1,646.playback_only = 1,647SND_SOC_DAILINK_REG(playback5),648},649{650.name = "Playback_6",651.stream_name = "Playback_6",652.trigger = {SND_SOC_DPCM_TRIGGER_PRE,653SND_SOC_DPCM_TRIGGER_PRE},654.dynamic = 1,655.playback_only = 1,656SND_SOC_DAILINK_REG(playback6),657},658{659.name = "Playback_7",660.stream_name = "Playback_7",661.trigger = {SND_SOC_DPCM_TRIGGER_PRE,662SND_SOC_DPCM_TRIGGER_PRE},663.dynamic = 1,664.playback_only = 1,665SND_SOC_DAILINK_REG(playback7),666},667{668.name = "Playback_8",669.stream_name = "Playback_8",670.trigger = {SND_SOC_DPCM_TRIGGER_PRE,671SND_SOC_DPCM_TRIGGER_PRE},672.dynamic = 1,673.playback_only = 1,674SND_SOC_DAILINK_REG(playback8),675},676{677.name = "Playback_9",678.stream_name = "Playback_9",679.trigger = {SND_SOC_DPCM_TRIGGER_PRE,680SND_SOC_DPCM_TRIGGER_PRE},681.dynamic = 1,682.playback_only = 1,683SND_SOC_DAILINK_REG(playback9),684},685{686.name = "Capture_1",687.stream_name = "Capture_1",688.trigger = {SND_SOC_DPCM_TRIGGER_PRE,689SND_SOC_DPCM_TRIGGER_PRE},690.dynamic = 1,691.capture_only = 1,692.ops = &mtk_soundcard_common_capture_ops,693SND_SOC_DAILINK_REG(capture1),694},695{696.name = "Capture_2",697.stream_name = "Capture_2",698.trigger = {SND_SOC_DPCM_TRIGGER_PRE,699SND_SOC_DPCM_TRIGGER_PRE},700.dynamic = 1,701.capture_only = 1,702.ops = &mtk_soundcard_common_playback_ops,703SND_SOC_DAILINK_REG(capture2),704},705{706.name = "Capture_3",707.stream_name = "Capture_3",708.trigger = {SND_SOC_DPCM_TRIGGER_PRE,709SND_SOC_DPCM_TRIGGER_PRE},710.dynamic = 1,711.capture_only = 1,712SND_SOC_DAILINK_REG(capture3),713},714{715.name = "Capture_4",716.stream_name = "Capture_4",717.trigger = {SND_SOC_DPCM_TRIGGER_PRE,718SND_SOC_DPCM_TRIGGER_PRE},719.dynamic = 1,720.capture_only = 1,721SND_SOC_DAILINK_REG(capture4),722},723{724.name = "Capture_5",725.stream_name = "Capture_5",726.trigger = {SND_SOC_DPCM_TRIGGER_PRE,727SND_SOC_DPCM_TRIGGER_PRE},728.dynamic = 1,729.capture_only = 1,730SND_SOC_DAILINK_REG(capture5),731},732{733.name = "Capture_6",734.stream_name = "Capture_6",735.trigger = {SND_SOC_DPCM_TRIGGER_PRE,736SND_SOC_DPCM_TRIGGER_PRE},737.dynamic = 1,738.capture_only = 1,739SND_SOC_DAILINK_REG(capture6),740},741{742.name = "Capture_7",743.stream_name = "Capture_7",744.trigger = {SND_SOC_DPCM_TRIGGER_PRE,745SND_SOC_DPCM_TRIGGER_PRE},746.dynamic = 1,747.capture_only = 1,748SND_SOC_DAILINK_REG(capture7),749},750{751.name = "Capture_8",752.stream_name = "Capture_8",753.trigger = {SND_SOC_DPCM_TRIGGER_PRE,754SND_SOC_DPCM_TRIGGER_PRE},755.dynamic = 1,756.capture_only = 1,757SND_SOC_DAILINK_REG(capture8),758},759{760.name = "Capture_Mono_1",761.stream_name = "Capture_Mono_1",762.trigger = {SND_SOC_DPCM_TRIGGER_PRE,763SND_SOC_DPCM_TRIGGER_PRE},764.dynamic = 1,765.capture_only = 1,766SND_SOC_DAILINK_REG(capture_mono1),767},768{769.name = "Capture_Mono_2",770.stream_name = "Capture_Mono_2",771.trigger = {SND_SOC_DPCM_TRIGGER_PRE,772SND_SOC_DPCM_TRIGGER_PRE},773.dynamic = 1,774.capture_only = 1,775SND_SOC_DAILINK_REG(capture_mono2),776},777{778.name = "Capture_Mono_3",779.stream_name = "Capture_Mono_3",780.trigger = {SND_SOC_DPCM_TRIGGER_PRE,781SND_SOC_DPCM_TRIGGER_PRE},782.dynamic = 1,783.capture_only = 1,784SND_SOC_DAILINK_REG(capture_mono3),785},786{787.name = "playback_hdmi",788.stream_name = "Playback_HDMI",789.trigger = {SND_SOC_DPCM_TRIGGER_PRE,790SND_SOC_DPCM_TRIGGER_PRE},791.dynamic = 1,792.playback_only = 1,793SND_SOC_DAILINK_REG(playback_hdmi),794},795/* Back End DAI links */796{797.name = "Primary Codec",798.no_pcm = 1,799.ignore_suspend = 1,800.init = mt8192_mt6359_init,801SND_SOC_DAILINK_REG(primary_codec),802},803{804.name = "Primary Codec CH34",805.no_pcm = 1,806.ignore_suspend = 1,807SND_SOC_DAILINK_REG(primary_codec_ch34),808},809{810.name = "AP_DMIC",811.no_pcm = 1,812.capture_only = 1,813.ignore_suspend = 1,814SND_SOC_DAILINK_REG(ap_dmic),815},816{817.name = "AP_DMIC_CH34",818.no_pcm = 1,819.capture_only = 1,820.ignore_suspend = 1,821SND_SOC_DAILINK_REG(ap_dmic_ch34),822},823{824.name = "I2S0",825.no_pcm = 1,826.capture_only = 1,827.ignore_suspend = 1,828.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,829SND_SOC_DAILINK_REG(i2s0),830},831{832.name = "I2S1",833.no_pcm = 1,834.playback_only = 1,835.ignore_suspend = 1,836.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,837SND_SOC_DAILINK_REG(i2s1),838},839{840.name = "I2S2",841.no_pcm = 1,842.capture_only = 1,843.ignore_suspend = 1,844.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,845SND_SOC_DAILINK_REG(i2s2),846},847{848.name = "I2S3",849.no_pcm = 1,850.playback_only = 1,851.ignore_suspend = 1,852.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,853SND_SOC_DAILINK_REG(i2s3),854},855{856.name = "I2S5",857.no_pcm = 1,858.playback_only = 1,859.ignore_suspend = 1,860.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,861SND_SOC_DAILINK_REG(i2s5),862},863{864.name = "I2S6",865.no_pcm = 1,866.capture_only = 1,867.ignore_suspend = 1,868.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,869SND_SOC_DAILINK_REG(i2s6),870},871{872.name = "I2S7",873.no_pcm = 1,874.playback_only = 1,875.ignore_suspend = 1,876.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,877SND_SOC_DAILINK_REG(i2s7),878},879{880.name = "I2S8",881.no_pcm = 1,882.capture_only = 1,883.ignore_suspend = 1,884.init = mt8192_rt5682_init,885.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,886SND_SOC_DAILINK_REG(i2s8),887.ops = &mt8192_rt5682x_i2s_ops,888},889{890.name = "I2S9",891.no_pcm = 1,892.playback_only = 1,893.ignore_suspend = 1,894.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,895SND_SOC_DAILINK_REG(i2s9),896.ops = &mt8192_rt5682x_i2s_ops,897},898{899.name = "CONNSYS_I2S",900.no_pcm = 1,901.capture_only = 1,902.ignore_suspend = 1,903SND_SOC_DAILINK_REG(connsys_i2s),904},905{906.name = "PCM 1",907.no_pcm = 1,908.ignore_suspend = 1,909SND_SOC_DAILINK_REG(pcm1),910},911{912.name = "PCM 2",913.no_pcm = 1,914.ignore_suspend = 1,915SND_SOC_DAILINK_REG(pcm2),916},917{918.name = "TDM",919.no_pcm = 1,920.dai_fmt = SND_SOC_DAIFMT_DSP_A |921SND_SOC_DAIFMT_IB_NF |922SND_SOC_DAIFMT_CBP_CFP,923.playback_only = 1,924.ignore_suspend = 1,925.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,926.ignore = 1,927.init = mt8192_mt6359_hdmi_init,928SND_SOC_DAILINK_REG(tdm),929},930};931932static const struct snd_soc_dapm_widget933mt8192_mt6359_rt1015_rt5682_widgets[] = {934SND_SOC_DAPM_SPK("Left Spk", NULL),935SND_SOC_DAPM_SPK("Right Spk", NULL),936SND_SOC_DAPM_HP("Headphone Jack", NULL),937SND_SOC_DAPM_MIC("Headset Mic", NULL),938SND_SOC_DAPM_OUTPUT("TDM Out"),939};940941static const struct snd_soc_dapm_route mt8192_mt6359_rt1015_rt5682_routes[] = {942/* speaker */943{ "Left Spk", NULL, "Left SPO" },944{ "Right Spk", NULL, "Right SPO" },945/* headset */946{ "Headphone Jack", NULL, "HPOL" },947{ "Headphone Jack", NULL, "HPOR" },948{ "IN1P", NULL, "Headset Mic" },949/* TDM */950{ "TDM Out", NULL, "TDM" },951};952953static const struct snd_kcontrol_new mt8192_mt6359_rt1015_rt5682_controls[] = {954SOC_DAPM_PIN_SWITCH("Left Spk"),955SOC_DAPM_PIN_SWITCH("Right Spk"),956SOC_DAPM_PIN_SWITCH("Headphone Jack"),957SOC_DAPM_PIN_SWITCH("Headset Mic"),958};959960static struct snd_soc_codec_conf rt1015_amp_conf[] = {961{962.dlc = COMP_CODEC_CONF(RT1015_DEV0_NAME),963.name_prefix = "Left",964},965{966.dlc = COMP_CODEC_CONF(RT1015_DEV1_NAME),967.name_prefix = "Right",968},969};970971static struct snd_soc_card mt8192_mt6359_rt1015_rt5682_card = {972.name = RT1015_RT5682_CARD_NAME,973.driver_name = DRIVER_NAME,974.owner = THIS_MODULE,975.dai_link = mt8192_mt6359_dai_links,976.num_links = ARRAY_SIZE(mt8192_mt6359_dai_links),977.controls = mt8192_mt6359_rt1015_rt5682_controls,978.num_controls = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_controls),979.dapm_widgets = mt8192_mt6359_rt1015_rt5682_widgets,980.num_dapm_widgets = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_widgets),981.dapm_routes = mt8192_mt6359_rt1015_rt5682_routes,982.num_dapm_routes = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_routes),983.codec_conf = rt1015_amp_conf,984.num_configs = ARRAY_SIZE(rt1015_amp_conf),985};986987static const struct snd_soc_dapm_widget mt8192_mt6359_rt1015p_rt5682x_widgets[] = {988SND_SOC_DAPM_SPK("Speakers", NULL),989SND_SOC_DAPM_HP("Headphone Jack", NULL),990SND_SOC_DAPM_MIC("Headset Mic", NULL),991};992993static const struct snd_soc_dapm_route mt8192_mt6359_rt1015p_rt5682x_routes[] = {994/* speaker */995{ "Speakers", NULL, "Speaker" },996/* headset */997{ "Headphone Jack", NULL, "HPOL" },998{ "Headphone Jack", NULL, "HPOR" },999{ "IN1P", NULL, "Headset Mic" },1000};10011002static const struct snd_kcontrol_new mt8192_mt6359_rt1015p_rt5682x_controls[] = {1003SOC_DAPM_PIN_SWITCH("Speakers"),1004SOC_DAPM_PIN_SWITCH("Headphone Jack"),1005SOC_DAPM_PIN_SWITCH("Headset Mic"),1006};10071008static struct snd_soc_card mt8192_mt6359_rt1015p_rt5682x_card = {1009.driver_name = DRIVER_NAME,1010.owner = THIS_MODULE,1011.dai_link = mt8192_mt6359_dai_links,1012.num_links = ARRAY_SIZE(mt8192_mt6359_dai_links),1013.controls = mt8192_mt6359_rt1015p_rt5682x_controls,1014.num_controls = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682x_controls),1015.dapm_widgets = mt8192_mt6359_rt1015p_rt5682x_widgets,1016.num_dapm_widgets = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682x_widgets),1017.dapm_routes = mt8192_mt6359_rt1015p_rt5682x_routes,1018.num_dapm_routes = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682x_routes),1019};10201021static int mt8192_mt6359_card_set_be_link(struct snd_soc_card *card,1022struct snd_soc_dai_link *link,1023struct device_node *node,1024char *link_name)1025{1026int ret;10271028if (node && strcmp(link->name, link_name) == 0) {1029ret = snd_soc_of_get_dai_link_codecs(card->dev, node, link);1030if (ret < 0) {1031dev_err_probe(card->dev, ret, "get dai link codecs fail\n");1032return ret;1033}1034}10351036return 0;1037}10381039static int mt8192_mt6359_legacy_probe(struct mtk_soc_card_data *soc_card_data)1040{1041struct mtk_platform_card_data *card_data = soc_card_data->card_data;1042struct snd_soc_card *card = card_data->card;1043struct device *dev = card->dev;1044struct device_node *hdmi_codec, *headset_codec, *speaker_codec;1045struct snd_soc_dai_link *dai_link;1046int i, ret = 0;10471048hdmi_codec = of_parse_phandle(dev->of_node, "mediatek,hdmi-codec", 0);1049if (!hdmi_codec)1050dev_dbg(dev, "The machine has no hdmi-codec\n");10511052speaker_codec = of_get_child_by_name(dev->of_node, "speaker-codecs");1053if (!speaker_codec) {1054ret = -EINVAL;1055dev_err_probe(dev, ret, "Property 'speaker-codecs' missing or invalid\n");1056goto err_speaker_codec;1057}10581059headset_codec = of_get_child_by_name(dev->of_node, "headset-codec");1060if (!headset_codec) {1061ret = -EINVAL;1062dev_err_probe(dev, ret, "Property 'headset-codec' missing or invalid\n");1063goto err_headset_codec;1064}10651066for_each_card_prelinks(card, i, dai_link) {1067ret = mt8192_mt6359_card_set_be_link(card, dai_link, speaker_codec, "I2S3");1068if (ret) {1069dev_err_probe(dev, ret, "%s set speaker_codec fail\n",1070dai_link->name);1071break;1072}10731074ret = mt8192_mt6359_card_set_be_link(card, dai_link, headset_codec, "I2S8");1075if (ret) {1076dev_err_probe(dev, ret, "%s set headset_codec fail\n",1077dai_link->name);1078break;1079}10801081ret = mt8192_mt6359_card_set_be_link(card, dai_link, headset_codec, "I2S9");1082if (ret) {1083dev_err_probe(dev, ret, "%s set headset_codec fail\n",1084dai_link->name);1085break;1086}10871088if (hdmi_codec && strcmp(dai_link->name, "TDM") == 0) {1089dai_link->codecs->of_node = hdmi_codec;1090dai_link->ignore = 0;1091}10921093if (dai_link->num_codecs &&1094strcmp(dai_link->codecs[0].dai_name, RT1015_CODEC_DAI) == 0)1095dai_link->ops = &mt8192_rt1015_i2s_ops;1096}10971098of_node_put(headset_codec);1099err_headset_codec:1100of_node_put(speaker_codec);1101err_speaker_codec:1102of_node_put(hdmi_codec);1103return ret;1104}11051106static int mt8192_mt6359_soc_card_probe(struct mtk_soc_card_data *soc_card_data, bool legacy)1107{1108struct mtk_platform_card_data *card_data = soc_card_data->card_data;1109struct snd_soc_card *card = card_data->card;1110int ret;11111112if (legacy) {1113ret = mt8192_mt6359_legacy_probe(soc_card_data);1114if (ret)1115return ret;1116} else {1117struct snd_soc_dai_link *dai_link;1118int i;11191120for_each_card_prelinks(card, i, dai_link)1121if (dai_link->num_codecs &&1122strcmp(dai_link->codecs[0].dai_name, RT1015_CODEC_DAI) == 0)1123dai_link->ops = &mt8192_rt1015_i2s_ops;1124}11251126ret = mt8192_afe_gpio_init(card->dev);1127if (ret)1128return dev_err_probe(card->dev, ret, "%s init gpio error\n", __func__);11291130return 0;1131}11321133static const unsigned int mt8192_pcm_playback_channels[] = { 1, 2 };1134static const unsigned int mt8192_pcm_playback_rates[] = { 48000 };11351136static const unsigned int mt8192_pcm_capture_channels[] = { 1, 2, 4 };1137static const unsigned int mt8192_pcm_capture_rates[] = {11388000, 16000, 32000, 48000, 96000, 1920001139};11401141static const struct mtk_pcm_constraints_data mt8192_pcm_constraints[MTK_CONSTRAINT_CAPTURE + 1] = {1142[MTK_CONSTRAINT_PLAYBACK] = {1143.channels = &(const struct snd_pcm_hw_constraint_list) {1144.list = mt8192_pcm_playback_channels,1145.count = ARRAY_SIZE(mt8192_pcm_playback_channels)1146},1147.rates = &(const struct snd_pcm_hw_constraint_list) {1148.list = mt8192_pcm_playback_rates,1149.count = ARRAY_SIZE(mt8192_pcm_playback_rates)1150}1151},1152[MTK_CONSTRAINT_CAPTURE] = {1153.channels = &(const struct snd_pcm_hw_constraint_list) {1154.list = mt8192_pcm_capture_channels,1155.count = ARRAY_SIZE(mt8192_pcm_capture_channels)1156},1157.rates = &(const struct snd_pcm_hw_constraint_list) {1158.list = mt8192_pcm_capture_rates,1159.count = ARRAY_SIZE(mt8192_pcm_capture_rates)1160}1161}1162};11631164static const struct mtk_soundcard_pdata mt8192_mt6359_rt1015_rt5682_pdata = {1165.card_name = RT1015_RT5682_CARD_NAME,1166.card_data = &(struct mtk_platform_card_data) {1167.card = &mt8192_mt6359_rt1015_rt5682_card,1168.num_jacks = MT8192_JACK_MAX,1169.pcm_constraints = mt8192_pcm_constraints,1170.num_pcm_constraints = ARRAY_SIZE(mt8192_pcm_constraints),1171},1172.soc_probe = mt8192_mt6359_soc_card_probe1173};11741175static const struct mtk_soundcard_pdata mt8192_mt6359_rt1015p_rt5682_pdata = {1176.card_name = RT1015P_RT5682_CARD_NAME,1177.card_data = &(struct mtk_platform_card_data) {1178.card = &mt8192_mt6359_rt1015p_rt5682x_card,1179.num_jacks = MT8192_JACK_MAX,1180.pcm_constraints = mt8192_pcm_constraints,1181.num_pcm_constraints = ARRAY_SIZE(mt8192_pcm_constraints),1182},1183.soc_probe = mt8192_mt6359_soc_card_probe1184};11851186static const struct mtk_soundcard_pdata mt8192_mt6359_rt1015p_rt5682s_pdata = {1187.card_name = RT1015P_RT5682S_CARD_NAME,1188.card_data = &(struct mtk_platform_card_data) {1189.card = &mt8192_mt6359_rt1015p_rt5682x_card,1190.num_jacks = MT8192_JACK_MAX,1191.pcm_constraints = mt8192_pcm_constraints,1192.num_pcm_constraints = ARRAY_SIZE(mt8192_pcm_constraints),1193},1194.soc_probe = mt8192_mt6359_soc_card_probe1195};11961197#ifdef CONFIG_OF1198static const struct of_device_id mt8192_mt6359_dt_match[] = {1199{1200.compatible = RT1015_RT5682_OF_NAME,1201.data = &mt8192_mt6359_rt1015_rt5682_pdata,1202},1203{1204.compatible = RT1015P_RT5682_OF_NAME,1205.data = &mt8192_mt6359_rt1015p_rt5682_pdata,1206},1207{1208.compatible = RT1015P_RT5682S_OF_NAME,1209.data = &mt8192_mt6359_rt1015p_rt5682s_pdata,1210},1211{}1212};1213MODULE_DEVICE_TABLE(of, mt8192_mt6359_dt_match);1214#endif12151216static const struct dev_pm_ops mt8192_mt6359_pm_ops = {1217.poweroff = snd_soc_poweroff,1218.restore = snd_soc_resume,1219};12201221static struct platform_driver mt8192_mt6359_driver = {1222.driver = {1223.name = DRIVER_NAME,1224#ifdef CONFIG_OF1225.of_match_table = mt8192_mt6359_dt_match,1226#endif1227.pm = &mt8192_mt6359_pm_ops,1228},1229.probe = mtk_soundcard_common_probe,1230};12311232module_platform_driver(mt8192_mt6359_driver);12331234/* Module information */1235MODULE_DESCRIPTION("MT8192-MT6359 ALSA SoC machine driver");1236MODULE_AUTHOR("Jiaxin Yu <[email protected]>");1237MODULE_LICENSE("GPL v2");1238MODULE_ALIAS("mt8192_mt6359 soc card");123912401241