Path: blob/master/sound/soc/mediatek/mt8188/mt8188-dai-etdm.c
54915 views
// SPDX-License-Identifier: GPL-2.01/*2* MediaTek ALSA SoC Audio DAI eTDM Control3*4* Copyright (c) 2022 MediaTek Inc.5* Author: Bicycle Tsai <[email protected]>6* Trevor Wu <[email protected]>7* Chun-Chia Chiu <[email protected]>8*/910#include <linux/bitfield.h>11#include <linux/pm_runtime.h>12#include <linux/regmap.h>13#include <sound/pcm_params.h>14#include "mt8188-afe-clk.h"15#include "mt8188-afe-common.h"16#include "mt8188-reg.h"1718#define MT8188_ETDM_MAX_CHANNELS 1619#define MT8188_ETDM_NORMAL_MAX_BCK_RATE 2457600020#define ETDM_TO_DAI_ID(x) ((x) + MT8188_AFE_IO_ETDM_START)21#define ENUM_TO_STR(x) #x2223enum {24SUPPLY_SEQ_APLL,25SUPPLY_SEQ_ETDM_MCLK,26SUPPLY_SEQ_ETDM_CG,27SUPPLY_SEQ_DPTX_EN,28SUPPLY_SEQ_ETDM_EN,29};3031enum {32MTK_DAI_ETDM_FORMAT_I2S = 0,33MTK_DAI_ETDM_FORMAT_LJ,34MTK_DAI_ETDM_FORMAT_RJ,35MTK_DAI_ETDM_FORMAT_EIAJ,36MTK_DAI_ETDM_FORMAT_DSPA,37MTK_DAI_ETDM_FORMAT_DSPB,38};3940enum {41MTK_DAI_ETDM_DATA_ONE_PIN = 0,42MTK_DAI_ETDM_DATA_MULTI_PIN,43};4445enum {46ETDM_IN,47ETDM_OUT,48};4950enum {51COWORK_ETDM_NONE = 0,52COWORK_ETDM_IN1_M = 2,53COWORK_ETDM_IN1_S = 3,54COWORK_ETDM_IN2_M = 4,55COWORK_ETDM_IN2_S = 5,56COWORK_ETDM_OUT1_M = 10,57COWORK_ETDM_OUT1_S = 11,58COWORK_ETDM_OUT2_M = 12,59COWORK_ETDM_OUT2_S = 13,60COWORK_ETDM_OUT3_M = 14,61COWORK_ETDM_OUT3_S = 15,62};6364enum {65ETDM_RELATCH_TIMING_A1A2SYS,66ETDM_RELATCH_TIMING_A3SYS,67ETDM_RELATCH_TIMING_A4SYS,68};6970enum {71ETDM_SYNC_NONE,72ETDM_SYNC_FROM_IN1 = 2,73ETDM_SYNC_FROM_IN2 = 4,74ETDM_SYNC_FROM_OUT1 = 10,75ETDM_SYNC_FROM_OUT2 = 12,76ETDM_SYNC_FROM_OUT3 = 14,77};7879struct etdm_con_reg {80unsigned int con0;81unsigned int con1;82unsigned int con2;83unsigned int con3;84unsigned int con4;85unsigned int con5;86};8788struct mtk_dai_etdm_rate {89unsigned int rate;90unsigned int reg_value;91};9293struct mtk_dai_etdm_priv {94unsigned int data_mode;95bool slave_mode;96bool lrck_inv;97bool bck_inv;98unsigned int rate;99unsigned int format;100unsigned int slots;101unsigned int lrck_width;102unsigned int mclk_freq;103unsigned int mclk_fixed_apll;104unsigned int mclk_apll;105unsigned int mclk_dir;106int cowork_source_id; //dai id107unsigned int cowork_slv_count;108int cowork_slv_id[MT8188_AFE_IO_ETDM_NUM - 1]; //dai_id109bool in_disable_ch[MT8188_ETDM_MAX_CHANNELS];110};111112static const struct mtk_dai_etdm_rate mt8188_etdm_rates[] = {113{ .rate = 8000, .reg_value = 0, },114{ .rate = 12000, .reg_value = 1, },115{ .rate = 16000, .reg_value = 2, },116{ .rate = 24000, .reg_value = 3, },117{ .rate = 32000, .reg_value = 4, },118{ .rate = 48000, .reg_value = 5, },119{ .rate = 96000, .reg_value = 7, },120{ .rate = 192000, .reg_value = 9, },121{ .rate = 384000, .reg_value = 11, },122{ .rate = 11025, .reg_value = 16, },123{ .rate = 22050, .reg_value = 17, },124{ .rate = 44100, .reg_value = 18, },125{ .rate = 88200, .reg_value = 19, },126{ .rate = 176400, .reg_value = 20, },127{ .rate = 352800, .reg_value = 21, },128};129130static int get_etdm_fs_timing(unsigned int rate)131{132int i;133134for (i = 0; i < ARRAY_SIZE(mt8188_etdm_rates); i++)135if (mt8188_etdm_rates[i].rate == rate)136return mt8188_etdm_rates[i].reg_value;137138return -EINVAL;139}140141static unsigned int get_etdm_ch_fixup(unsigned int channels)142{143if (channels > 16)144return 24;145else if (channels > 8)146return 16;147else if (channels > 4)148return 8;149else if (channels > 2)150return 4;151else152return 2;153}154155static int get_etdm_reg(unsigned int dai_id, struct etdm_con_reg *etdm_reg)156{157switch (dai_id) {158case MT8188_AFE_IO_ETDM1_IN:159etdm_reg->con0 = ETDM_IN1_CON0;160etdm_reg->con1 = ETDM_IN1_CON1;161etdm_reg->con2 = ETDM_IN1_CON2;162etdm_reg->con3 = ETDM_IN1_CON3;163etdm_reg->con4 = ETDM_IN1_CON4;164etdm_reg->con5 = ETDM_IN1_CON5;165break;166case MT8188_AFE_IO_ETDM2_IN:167etdm_reg->con0 = ETDM_IN2_CON0;168etdm_reg->con1 = ETDM_IN2_CON1;169etdm_reg->con2 = ETDM_IN2_CON2;170etdm_reg->con3 = ETDM_IN2_CON3;171etdm_reg->con4 = ETDM_IN2_CON4;172etdm_reg->con5 = ETDM_IN2_CON5;173break;174case MT8188_AFE_IO_ETDM1_OUT:175etdm_reg->con0 = ETDM_OUT1_CON0;176etdm_reg->con1 = ETDM_OUT1_CON1;177etdm_reg->con2 = ETDM_OUT1_CON2;178etdm_reg->con3 = ETDM_OUT1_CON3;179etdm_reg->con4 = ETDM_OUT1_CON4;180etdm_reg->con5 = ETDM_OUT1_CON5;181break;182case MT8188_AFE_IO_ETDM2_OUT:183etdm_reg->con0 = ETDM_OUT2_CON0;184etdm_reg->con1 = ETDM_OUT2_CON1;185etdm_reg->con2 = ETDM_OUT2_CON2;186etdm_reg->con3 = ETDM_OUT2_CON3;187etdm_reg->con4 = ETDM_OUT2_CON4;188etdm_reg->con5 = ETDM_OUT2_CON5;189break;190case MT8188_AFE_IO_ETDM3_OUT:191case MT8188_AFE_IO_DPTX:192etdm_reg->con0 = ETDM_OUT3_CON0;193etdm_reg->con1 = ETDM_OUT3_CON1;194etdm_reg->con2 = ETDM_OUT3_CON2;195etdm_reg->con3 = ETDM_OUT3_CON3;196etdm_reg->con4 = ETDM_OUT3_CON4;197etdm_reg->con5 = ETDM_OUT3_CON5;198break;199default:200return -EINVAL;201}202return 0;203}204205static int get_etdm_dir(unsigned int dai_id)206{207switch (dai_id) {208case MT8188_AFE_IO_ETDM1_IN:209case MT8188_AFE_IO_ETDM2_IN:210return ETDM_IN;211case MT8188_AFE_IO_ETDM1_OUT:212case MT8188_AFE_IO_ETDM2_OUT:213case MT8188_AFE_IO_ETDM3_OUT:214return ETDM_OUT;215default:216return -EINVAL;217}218}219220static int get_etdm_wlen(unsigned int bitwidth)221{222return bitwidth <= 16 ? 16 : 32;223}224225static bool is_valid_etdm_dai(int dai_id)226{227switch (dai_id) {228case MT8188_AFE_IO_ETDM1_IN:229fallthrough;230case MT8188_AFE_IO_ETDM2_IN:231fallthrough;232case MT8188_AFE_IO_ETDM1_OUT:233fallthrough;234case MT8188_AFE_IO_ETDM2_OUT:235fallthrough;236case MT8188_AFE_IO_DPTX:237fallthrough;238case MT8188_AFE_IO_ETDM3_OUT:239return true;240default:241return false;242}243}244245static int is_cowork_mode(struct snd_soc_dai *dai)246{247struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);248struct mt8188_afe_private *afe_priv = afe->platform_priv;249struct mtk_dai_etdm_priv *etdm_data;250251if (!is_valid_etdm_dai(dai->id))252return -EINVAL;253etdm_data = afe_priv->dai_priv[dai->id];254255return (etdm_data->cowork_slv_count > 0 ||256etdm_data->cowork_source_id != COWORK_ETDM_NONE);257}258259static int sync_to_dai_id(int source_sel)260{261switch (source_sel) {262case ETDM_SYNC_FROM_IN1:263return MT8188_AFE_IO_ETDM1_IN;264case ETDM_SYNC_FROM_IN2:265return MT8188_AFE_IO_ETDM2_IN;266case ETDM_SYNC_FROM_OUT1:267return MT8188_AFE_IO_ETDM1_OUT;268case ETDM_SYNC_FROM_OUT2:269return MT8188_AFE_IO_ETDM2_OUT;270case ETDM_SYNC_FROM_OUT3:271return MT8188_AFE_IO_ETDM3_OUT;272default:273return 0;274}275}276277static int get_etdm_cowork_master_id(struct snd_soc_dai *dai)278{279struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);280struct mt8188_afe_private *afe_priv = afe->platform_priv;281struct mtk_dai_etdm_priv *etdm_data;282int dai_id;283284if (!is_valid_etdm_dai(dai->id))285return -EINVAL;286etdm_data = afe_priv->dai_priv[dai->id];287dai_id = etdm_data->cowork_source_id;288289if (dai_id == COWORK_ETDM_NONE)290dai_id = dai->id;291292return dai_id;293}294295static int mtk_dai_etdm_get_cg_id_by_dai_id(int dai_id)296{297switch (dai_id) {298case MT8188_AFE_IO_DPTX:299return MT8188_CLK_AUD_HDMI_OUT;300case MT8188_AFE_IO_ETDM1_IN:301return MT8188_CLK_AUD_TDM_IN;302case MT8188_AFE_IO_ETDM2_IN:303return MT8188_CLK_AUD_I2SIN;304case MT8188_AFE_IO_ETDM1_OUT:305return MT8188_CLK_AUD_TDM_OUT;306case MT8188_AFE_IO_ETDM2_OUT:307return MT8188_CLK_AUD_I2S_OUT;308case MT8188_AFE_IO_ETDM3_OUT:309return MT8188_CLK_AUD_HDMI_OUT;310default:311return -EINVAL;312}313}314315static int mtk_dai_etdm_get_clk_id_by_dai_id(int dai_id)316{317switch (dai_id) {318case MT8188_AFE_IO_DPTX:319return MT8188_CLK_TOP_DPTX_M_SEL;320case MT8188_AFE_IO_ETDM1_IN:321return MT8188_CLK_TOP_I2SI1_M_SEL;322case MT8188_AFE_IO_ETDM2_IN:323return MT8188_CLK_TOP_I2SI2_M_SEL;324case MT8188_AFE_IO_ETDM1_OUT:325return MT8188_CLK_TOP_I2SO1_M_SEL;326case MT8188_AFE_IO_ETDM2_OUT:327return MT8188_CLK_TOP_I2SO2_M_SEL;328case MT8188_AFE_IO_ETDM3_OUT:329default:330return -EINVAL;331}332}333334static int mtk_dai_etdm_get_clkdiv_id_by_dai_id(int dai_id)335{336switch (dai_id) {337case MT8188_AFE_IO_DPTX:338return MT8188_CLK_TOP_APLL12_DIV9;339case MT8188_AFE_IO_ETDM1_IN:340return MT8188_CLK_TOP_APLL12_DIV0;341case MT8188_AFE_IO_ETDM2_IN:342return MT8188_CLK_TOP_APLL12_DIV1;343case MT8188_AFE_IO_ETDM1_OUT:344return MT8188_CLK_TOP_APLL12_DIV2;345case MT8188_AFE_IO_ETDM2_OUT:346return MT8188_CLK_TOP_APLL12_DIV3;347case MT8188_AFE_IO_ETDM3_OUT:348default:349return -EINVAL;350}351}352353static int get_etdm_id_by_name(struct mtk_base_afe *afe,354const char *name)355{356if (!strncmp(name, "ETDM1_IN", strlen("ETDM1_IN")))357return MT8188_AFE_IO_ETDM1_IN;358else if (!strncmp(name, "ETDM2_IN", strlen("ETDM2_IN")))359return MT8188_AFE_IO_ETDM2_IN;360else if (!strncmp(name, "ETDM1_OUT", strlen("ETDM1_OUT")))361return MT8188_AFE_IO_ETDM1_OUT;362else if (!strncmp(name, "ETDM2_OUT", strlen("ETDM2_OUT")))363return MT8188_AFE_IO_ETDM2_OUT;364else if (!strncmp(name, "ETDM3_OUT", strlen("ETDM3_OUT")))365return MT8188_AFE_IO_ETDM3_OUT;366else if (!strncmp(name, "DPTX", strlen("DPTX")))367return MT8188_AFE_IO_ETDM3_OUT;368else369return -EINVAL;370}371372static struct mtk_dai_etdm_priv *get_etdm_priv_by_name(struct mtk_base_afe *afe,373const char *name)374{375struct mt8188_afe_private *afe_priv = afe->platform_priv;376int dai_id = get_etdm_id_by_name(afe, name);377378if (dai_id < MT8188_AFE_IO_ETDM_START ||379dai_id >= MT8188_AFE_IO_ETDM_END)380return NULL;381382return afe_priv->dai_priv[dai_id];383}384385static int mtk_dai_etdm_enable_mclk(struct mtk_base_afe *afe, int dai_id)386{387struct mt8188_afe_private *afe_priv = afe->platform_priv;388struct mtk_dai_etdm_priv *etdm_data;389struct etdm_con_reg etdm_reg;390unsigned int val = 0;391unsigned int mask;392int clkmux_id = mtk_dai_etdm_get_clk_id_by_dai_id(dai_id);393int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id);394int apll_clk_id;395int apll;396int ret;397398if (!is_valid_etdm_dai(dai_id))399return -EINVAL;400etdm_data = afe_priv->dai_priv[dai_id];401402apll = etdm_data->mclk_apll;403apll_clk_id = mt8188_afe_get_mclk_source_clk_id(apll);404405if (clkmux_id < 0 || clkdiv_id < 0)406return -EINVAL;407408if (apll_clk_id < 0)409return apll_clk_id;410411ret = get_etdm_reg(dai_id, &etdm_reg);412if (ret < 0)413return ret;414415mask = ETDM_CON1_MCLK_OUTPUT;416if (etdm_data->mclk_dir == SND_SOC_CLOCK_OUT)417val = ETDM_CON1_MCLK_OUTPUT;418regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);419420/* enable parent clock before select apll*/421mt8188_afe_enable_clk(afe, afe_priv->clk[clkmux_id]);422423/* select apll */424ret = mt8188_afe_set_clk_parent(afe, afe_priv->clk[clkmux_id],425afe_priv->clk[apll_clk_id]);426if (ret)427return ret;428429/* set rate */430ret = mt8188_afe_set_clk_rate(afe, afe_priv->clk[clkdiv_id],431etdm_data->mclk_freq);432433mt8188_afe_enable_clk(afe, afe_priv->clk[clkdiv_id]);434435return 0;436}437438static int mtk_dai_etdm_disable_mclk(struct mtk_base_afe *afe, int dai_id)439{440struct mt8188_afe_private *afe_priv = afe->platform_priv;441int clkmux_id = mtk_dai_etdm_get_clk_id_by_dai_id(dai_id);442int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id);443444if (clkmux_id < 0 || clkdiv_id < 0)445return -EINVAL;446447mt8188_afe_disable_clk(afe, afe_priv->clk[clkdiv_id]);448mt8188_afe_disable_clk(afe, afe_priv->clk[clkmux_id]);449450return 0;451}452453static int mtk_afe_etdm_apll_connect(struct snd_soc_dapm_widget *source,454struct snd_soc_dapm_widget *sink)455{456struct snd_soc_dapm_widget *w = sink;457struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);458struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);459struct mtk_dai_etdm_priv *etdm_priv;460int cur_apll;461int need_apll;462463etdm_priv = get_etdm_priv_by_name(afe, w->name);464if (!etdm_priv) {465dev_dbg(afe->dev, "etdm_priv == NULL\n");466return 0;467}468469cur_apll = mt8188_get_apll_by_name(afe, source->name);470need_apll = mt8188_get_apll_by_rate(afe, etdm_priv->rate);471472return (need_apll == cur_apll) ? 1 : 0;473}474475static int mtk_afe_mclk_apll_connect(struct snd_soc_dapm_widget *source,476struct snd_soc_dapm_widget *sink)477{478struct snd_soc_dapm_widget *w = sink;479struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);480struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);481struct mtk_dai_etdm_priv *etdm_priv;482int cur_apll;483484etdm_priv = get_etdm_priv_by_name(afe, w->name);485486cur_apll = mt8188_get_apll_by_name(afe, source->name);487488return (etdm_priv->mclk_apll == cur_apll) ? 1 : 0;489}490491static int mtk_etdm_mclk_connect(struct snd_soc_dapm_widget *source,492struct snd_soc_dapm_widget *sink)493{494struct snd_soc_dapm_widget *w = sink;495struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);496struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);497struct mt8188_afe_private *afe_priv = afe->platform_priv;498struct mtk_dai_etdm_priv *etdm_priv;499int mclk_id;500501mclk_id = get_etdm_id_by_name(afe, source->name);502if (mclk_id < 0) {503dev_dbg(afe->dev, "mclk_id < 0\n");504return 0;505}506507etdm_priv = get_etdm_priv_by_name(afe, w->name);508if (!etdm_priv) {509dev_dbg(afe->dev, "etdm_priv == NULL\n");510return 0;511}512513if (get_etdm_id_by_name(afe, sink->name) == mclk_id)514return !!(etdm_priv->mclk_freq > 0);515516if (etdm_priv->cowork_source_id == mclk_id) {517etdm_priv = afe_priv->dai_priv[mclk_id];518return !!(etdm_priv->mclk_freq > 0);519}520521return 0;522}523524static int mtk_etdm_cowork_connect(struct snd_soc_dapm_widget *source,525struct snd_soc_dapm_widget *sink)526{527struct snd_soc_dapm_widget *w = sink;528struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);529struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);530struct mt8188_afe_private *afe_priv = afe->platform_priv;531struct mtk_dai_etdm_priv *etdm_priv;532int source_id;533int i;534535source_id = get_etdm_id_by_name(afe, source->name);536if (source_id < 0) {537dev_dbg(afe->dev, "%s() source_id < 0\n", __func__);538return 0;539}540541etdm_priv = get_etdm_priv_by_name(afe, w->name);542if (!etdm_priv) {543dev_dbg(afe->dev, "%s() etdm_priv == NULL\n", __func__);544return 0;545}546547if (etdm_priv->cowork_source_id != COWORK_ETDM_NONE) {548if (etdm_priv->cowork_source_id == source_id)549return 1;550551etdm_priv = afe_priv->dai_priv[etdm_priv->cowork_source_id];552for (i = 0; i < etdm_priv->cowork_slv_count; i++) {553if (etdm_priv->cowork_slv_id[i] == source_id)554return 1;555}556} else {557for (i = 0; i < etdm_priv->cowork_slv_count; i++) {558if (etdm_priv->cowork_slv_id[i] == source_id)559return 1;560}561}562563return 0;564}565566static int mtk_apll_event(struct snd_soc_dapm_widget *w,567struct snd_kcontrol *kcontrol,568int event)569{570struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);571struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);572573dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",574__func__, w->name, event);575576switch (event) {577case SND_SOC_DAPM_PRE_PMU:578if (snd_soc_dapm_widget_name_cmp(w, APLL1_W_NAME) == 0)579mt8188_apll1_enable(afe);580else581mt8188_apll2_enable(afe);582break;583case SND_SOC_DAPM_POST_PMD:584if (snd_soc_dapm_widget_name_cmp(w, APLL1_W_NAME) == 0)585mt8188_apll1_disable(afe);586else587mt8188_apll2_disable(afe);588break;589default:590break;591}592593return 0;594}595596static int mtk_etdm_mclk_event(struct snd_soc_dapm_widget *w,597struct snd_kcontrol *kcontrol,598int event)599{600struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);601struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);602int mclk_id = get_etdm_id_by_name(afe, w->name);603604if (mclk_id < 0) {605dev_dbg(afe->dev, "%s() mclk_id < 0\n", __func__);606return 0;607}608609dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",610__func__, w->name, event);611612switch (event) {613case SND_SOC_DAPM_PRE_PMU:614mtk_dai_etdm_enable_mclk(afe, mclk_id);615break;616case SND_SOC_DAPM_POST_PMD:617mtk_dai_etdm_disable_mclk(afe, mclk_id);618break;619default:620break;621}622623return 0;624}625626static int mtk_dptx_mclk_event(struct snd_soc_dapm_widget *w,627struct snd_kcontrol *kcontrol,628int event)629{630struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);631struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);632633dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",634__func__, w->name, event);635636switch (event) {637case SND_SOC_DAPM_PRE_PMU:638mtk_dai_etdm_enable_mclk(afe, MT8188_AFE_IO_DPTX);639break;640case SND_SOC_DAPM_POST_PMD:641mtk_dai_etdm_disable_mclk(afe, MT8188_AFE_IO_DPTX);642break;643default:644break;645}646647return 0;648}649650static int mtk_etdm_cg_event(struct snd_soc_dapm_widget *w,651struct snd_kcontrol *kcontrol,652int event)653{654struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);655struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);656struct mt8188_afe_private *afe_priv = afe->platform_priv;657int etdm_id;658int cg_id;659660etdm_id = get_etdm_id_by_name(afe, w->name);661if (etdm_id < 0) {662dev_dbg(afe->dev, "%s() etdm_id < 0\n", __func__);663return 0;664}665666cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(etdm_id);667if (cg_id < 0) {668dev_dbg(afe->dev, "%s() cg_id < 0\n", __func__);669return 0;670}671672dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",673__func__, w->name, event);674675switch (event) {676case SND_SOC_DAPM_PRE_PMU:677mt8188_afe_enable_clk(afe, afe_priv->clk[cg_id]);678break;679case SND_SOC_DAPM_POST_PMD:680mt8188_afe_disable_clk(afe, afe_priv->clk[cg_id]);681break;682default:683break;684}685686return 0;687}688689static int mtk_etdm3_cg_event(struct snd_soc_dapm_widget *w,690struct snd_kcontrol *kcontrol,691int event)692{693struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);694struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);695struct mt8188_afe_private *afe_priv = afe->platform_priv;696697dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",698__func__, w->name, event);699700switch (event) {701case SND_SOC_DAPM_PRE_PMU:702mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_HDMI_OUT]);703break;704case SND_SOC_DAPM_POST_PMD:705mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_HDMI_OUT]);706break;707default:708break;709}710711return 0;712}713714static const struct snd_kcontrol_new mtk_dai_etdm_o048_mix[] = {715SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN48, 20, 1, 0),716SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN48, 22, 1, 0),717SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN48_1, 14, 1, 0),718SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN48_2, 6, 1, 0),719};720721static const struct snd_kcontrol_new mtk_dai_etdm_o049_mix[] = {722SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN49, 21, 1, 0),723SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN49, 23, 1, 0),724SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN49_1, 15, 1, 0),725SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN49_2, 7, 1, 0),726};727728static const struct snd_kcontrol_new mtk_dai_etdm_o050_mix[] = {729SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN50, 24, 1, 0),730SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN50_1, 16, 1, 0),731};732733static const struct snd_kcontrol_new mtk_dai_etdm_o051_mix[] = {734SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN51, 25, 1, 0),735SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN51_1, 17, 1, 0),736};737738static const struct snd_kcontrol_new mtk_dai_etdm_o052_mix[] = {739SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN52, 26, 1, 0),740SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN52_1, 18, 1, 0),741};742743static const struct snd_kcontrol_new mtk_dai_etdm_o053_mix[] = {744SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN53, 27, 1, 0),745SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN53_1, 19, 1, 0),746};747748static const struct snd_kcontrol_new mtk_dai_etdm_o054_mix[] = {749SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN54, 28, 1, 0),750SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN54_1, 20, 1, 0),751};752753static const struct snd_kcontrol_new mtk_dai_etdm_o055_mix[] = {754SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN55, 29, 1, 0),755SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN55_1, 21, 1, 0),756};757758static const struct snd_kcontrol_new mtk_dai_etdm_o056_mix[] = {759SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN56, 30, 1, 0),760SOC_DAPM_SINGLE_AUTODISABLE("I054 Switch", AFE_CONN56_1, 22, 1, 0),761};762763static const struct snd_kcontrol_new mtk_dai_etdm_o057_mix[] = {764SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN57, 31, 1, 0),765SOC_DAPM_SINGLE_AUTODISABLE("I055 Switch", AFE_CONN57_1, 23, 1, 0),766};767768static const struct snd_kcontrol_new mtk_dai_etdm_o058_mix[] = {769SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN58_1, 0, 1, 0),770SOC_DAPM_SINGLE_AUTODISABLE("I056 Switch", AFE_CONN58_1, 24, 1, 0),771};772773static const struct snd_kcontrol_new mtk_dai_etdm_o059_mix[] = {774SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN59_1, 1, 1, 0),775SOC_DAPM_SINGLE_AUTODISABLE("I057 Switch", AFE_CONN59_1, 25, 1, 0),776};777778static const struct snd_kcontrol_new mtk_dai_etdm_o060_mix[] = {779SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN60_1, 2, 1, 0),780SOC_DAPM_SINGLE_AUTODISABLE("I058 Switch", AFE_CONN60_1, 26, 1, 0),781};782783static const struct snd_kcontrol_new mtk_dai_etdm_o061_mix[] = {784SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN61_1, 3, 1, 0),785SOC_DAPM_SINGLE_AUTODISABLE("I059 Switch", AFE_CONN61_1, 27, 1, 0),786};787788static const struct snd_kcontrol_new mtk_dai_etdm_o062_mix[] = {789SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN62_1, 4, 1, 0),790SOC_DAPM_SINGLE_AUTODISABLE("I060 Switch", AFE_CONN62_1, 28, 1, 0),791};792793static const struct snd_kcontrol_new mtk_dai_etdm_o063_mix[] = {794SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN63_1, 5, 1, 0),795SOC_DAPM_SINGLE_AUTODISABLE("I061 Switch", AFE_CONN63_1, 29, 1, 0),796};797798static const struct snd_kcontrol_new mtk_dai_etdm_o072_mix[] = {799SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN72, 20, 1, 0),800SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN72, 22, 1, 0),801SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN72_1, 14, 1, 0),802SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN72_2, 6, 1, 0),803};804805static const struct snd_kcontrol_new mtk_dai_etdm_o073_mix[] = {806SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN73, 21, 1, 0),807SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN73, 23, 1, 0),808SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN73_1, 15, 1, 0),809SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN73_2, 7, 1, 0),810};811812static const struct snd_kcontrol_new mtk_dai_etdm_o074_mix[] = {813SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN74, 24, 1, 0),814SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN74_1, 16, 1, 0),815};816817static const struct snd_kcontrol_new mtk_dai_etdm_o075_mix[] = {818SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN75, 25, 1, 0),819SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN75_1, 17, 1, 0),820};821822static const struct snd_kcontrol_new mtk_dai_etdm_o076_mix[] = {823SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN76, 26, 1, 0),824SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN76_1, 18, 1, 0),825};826827static const struct snd_kcontrol_new mtk_dai_etdm_o077_mix[] = {828SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN77, 27, 1, 0),829SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN77_1, 19, 1, 0),830};831832static const struct snd_kcontrol_new mtk_dai_etdm_o078_mix[] = {833SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN78, 28, 1, 0),834SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN78_1, 20, 1, 0),835};836837static const struct snd_kcontrol_new mtk_dai_etdm_o079_mix[] = {838SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN79, 29, 1, 0),839SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN79_1, 21, 1, 0),840};841842static const struct snd_kcontrol_new mtk_dai_etdm_o080_mix[] = {843SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN80, 30, 1, 0),844SOC_DAPM_SINGLE_AUTODISABLE("I054 Switch", AFE_CONN80_1, 22, 1, 0),845};846847static const struct snd_kcontrol_new mtk_dai_etdm_o081_mix[] = {848SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN81, 31, 1, 0),849SOC_DAPM_SINGLE_AUTODISABLE("I055 Switch", AFE_CONN81_1, 23, 1, 0),850};851852static const struct snd_kcontrol_new mtk_dai_etdm_o082_mix[] = {853SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN82_1, 0, 1, 0),854SOC_DAPM_SINGLE_AUTODISABLE("I056 Switch", AFE_CONN82_1, 24, 1, 0),855};856857static const struct snd_kcontrol_new mtk_dai_etdm_o083_mix[] = {858SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN83_1, 1, 1, 0),859SOC_DAPM_SINGLE_AUTODISABLE("I057 Switch", AFE_CONN83_1, 25, 1, 0),860};861862static const struct snd_kcontrol_new mtk_dai_etdm_o084_mix[] = {863SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN84_1, 2, 1, 0),864SOC_DAPM_SINGLE_AUTODISABLE("I058 Switch", AFE_CONN84_1, 26, 1, 0),865};866867static const struct snd_kcontrol_new mtk_dai_etdm_o085_mix[] = {868SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN85_1, 3, 1, 0),869SOC_DAPM_SINGLE_AUTODISABLE("I059 Switch", AFE_CONN85_1, 27, 1, 0),870};871872static const struct snd_kcontrol_new mtk_dai_etdm_o086_mix[] = {873SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN86_1, 4, 1, 0),874SOC_DAPM_SINGLE_AUTODISABLE("I060 Switch", AFE_CONN86_1, 28, 1, 0),875};876877static const struct snd_kcontrol_new mtk_dai_etdm_o087_mix[] = {878SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN87_1, 5, 1, 0),879SOC_DAPM_SINGLE_AUTODISABLE("I061 Switch", AFE_CONN87_1, 29, 1, 0),880};881882static const char * const mt8188_etdm_clk_src_sel_text[] = {883"26m",884"a1sys_a2sys",885"a3sys",886"a4sys",887};888889static SOC_ENUM_SINGLE_EXT_DECL(etdmout_clk_src_enum,890mt8188_etdm_clk_src_sel_text);891892static const char * const hdmitx_dptx_mux_map[] = {893"Disconnect", "Connect",894};895896static int hdmitx_dptx_mux_map_value[] = {8970, 1,898};899900/* HDMI_OUT_MUX */901static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(hdmi_out_mux_map_enum,902SND_SOC_NOPM,9030,9041,905hdmitx_dptx_mux_map,906hdmitx_dptx_mux_map_value);907908static const struct snd_kcontrol_new hdmi_out_mux_control =909SOC_DAPM_ENUM("HDMI_OUT_MUX", hdmi_out_mux_map_enum);910911/* DPTX_OUT_MUX */912static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(dptx_out_mux_map_enum,913SND_SOC_NOPM,9140,9151,916hdmitx_dptx_mux_map,917hdmitx_dptx_mux_map_value);918919static const struct snd_kcontrol_new dptx_out_mux_control =920SOC_DAPM_ENUM("DPTX_OUT_MUX", dptx_out_mux_map_enum);921922/* HDMI_CH0_MUX ~ HDMI_CH7_MUX */923static const char *const afe_conn_hdmi_mux_map[] = {924"CH0", "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7",925};926927static int afe_conn_hdmi_mux_map_value[] = {9280, 1, 2, 3, 4, 5, 6, 7,929};930931static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch0_mux_map_enum,932AFE_TDMOUT_CONN0,9330,9340xf,935afe_conn_hdmi_mux_map,936afe_conn_hdmi_mux_map_value);937938static const struct snd_kcontrol_new hdmi_ch0_mux_control =939SOC_DAPM_ENUM("HDMI_CH0_MUX", hdmi_ch0_mux_map_enum);940941static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch1_mux_map_enum,942AFE_TDMOUT_CONN0,9434,9440xf,945afe_conn_hdmi_mux_map,946afe_conn_hdmi_mux_map_value);947948static const struct snd_kcontrol_new hdmi_ch1_mux_control =949SOC_DAPM_ENUM("HDMI_CH1_MUX", hdmi_ch1_mux_map_enum);950951static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch2_mux_map_enum,952AFE_TDMOUT_CONN0,9538,9540xf,955afe_conn_hdmi_mux_map,956afe_conn_hdmi_mux_map_value);957958static const struct snd_kcontrol_new hdmi_ch2_mux_control =959SOC_DAPM_ENUM("HDMI_CH2_MUX", hdmi_ch2_mux_map_enum);960961static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch3_mux_map_enum,962AFE_TDMOUT_CONN0,96312,9640xf,965afe_conn_hdmi_mux_map,966afe_conn_hdmi_mux_map_value);967968static const struct snd_kcontrol_new hdmi_ch3_mux_control =969SOC_DAPM_ENUM("HDMI_CH3_MUX", hdmi_ch3_mux_map_enum);970971static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch4_mux_map_enum,972AFE_TDMOUT_CONN0,97316,9740xf,975afe_conn_hdmi_mux_map,976afe_conn_hdmi_mux_map_value);977978static const struct snd_kcontrol_new hdmi_ch4_mux_control =979SOC_DAPM_ENUM("HDMI_CH4_MUX", hdmi_ch4_mux_map_enum);980981static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch5_mux_map_enum,982AFE_TDMOUT_CONN0,98320,9840xf,985afe_conn_hdmi_mux_map,986afe_conn_hdmi_mux_map_value);987988static const struct snd_kcontrol_new hdmi_ch5_mux_control =989SOC_DAPM_ENUM("HDMI_CH5_MUX", hdmi_ch5_mux_map_enum);990991static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch6_mux_map_enum,992AFE_TDMOUT_CONN0,99324,9940xf,995afe_conn_hdmi_mux_map,996afe_conn_hdmi_mux_map_value);997998static const struct snd_kcontrol_new hdmi_ch6_mux_control =999SOC_DAPM_ENUM("HDMI_CH6_MUX", hdmi_ch6_mux_map_enum);10001001static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch7_mux_map_enum,1002AFE_TDMOUT_CONN0,100328,10040xf,1005afe_conn_hdmi_mux_map,1006afe_conn_hdmi_mux_map_value);10071008static const struct snd_kcontrol_new hdmi_ch7_mux_control =1009SOC_DAPM_ENUM("HDMI_CH7_MUX", hdmi_ch7_mux_map_enum);10101011static int mt8188_etdm_clk_src_sel_put(struct snd_kcontrol *kcontrol,1012struct snd_ctl_elem_value *ucontrol)1013{1014struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);1015struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;1016struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);1017unsigned int source = ucontrol->value.enumerated.item[0];1018unsigned int val;1019unsigned int old_val;1020unsigned int mask;1021unsigned int reg;10221023if (source >= e->items)1024return -EINVAL;10251026if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) {1027reg = ETDM_OUT1_CON4;1028mask = ETDM_OUT_CON4_CLOCK_MASK;1029val = FIELD_PREP(ETDM_OUT_CON4_CLOCK_MASK, source);1030} else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) {1031reg = ETDM_OUT2_CON4;1032mask = ETDM_OUT_CON4_CLOCK_MASK;1033val = FIELD_PREP(ETDM_OUT_CON4_CLOCK_MASK, source);1034} else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) {1035reg = ETDM_OUT3_CON4;1036mask = ETDM_OUT_CON4_CLOCK_MASK;1037val = FIELD_PREP(ETDM_OUT_CON4_CLOCK_MASK, source);1038} else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) {1039reg = ETDM_IN1_CON2;1040mask = ETDM_IN_CON2_CLOCK_MASK;1041val = FIELD_PREP(ETDM_IN_CON2_CLOCK_MASK, source);1042} else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) {1043reg = ETDM_IN2_CON2;1044mask = ETDM_IN_CON2_CLOCK_MASK;1045val = FIELD_PREP(ETDM_IN_CON2_CLOCK_MASK, source);1046} else {1047return -EINVAL;1048}10491050regmap_read(afe->regmap, reg, &old_val);1051old_val &= mask;1052if (old_val == val)1053return 0;10541055regmap_update_bits(afe->regmap, reg, mask, val);10561057return 1;1058}10591060static int mt8188_etdm_clk_src_sel_get(struct snd_kcontrol *kcontrol,1061struct snd_ctl_elem_value *ucontrol)1062{1063struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);1064struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);1065unsigned int value;1066unsigned int reg;1067unsigned int mask;1068unsigned int shift;10691070if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) {1071reg = ETDM_OUT1_CON4;1072mask = ETDM_OUT_CON4_CLOCK_MASK;1073shift = ETDM_OUT_CON4_CLOCK_SHIFT;1074} else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) {1075reg = ETDM_OUT2_CON4;1076mask = ETDM_OUT_CON4_CLOCK_MASK;1077shift = ETDM_OUT_CON4_CLOCK_SHIFT;1078} else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) {1079reg = ETDM_OUT3_CON4;1080mask = ETDM_OUT_CON4_CLOCK_MASK;1081shift = ETDM_OUT_CON4_CLOCK_SHIFT;1082} else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) {1083reg = ETDM_IN1_CON2;1084mask = ETDM_IN_CON2_CLOCK_MASK;1085shift = ETDM_IN_CON2_CLOCK_SHIFT;1086} else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) {1087reg = ETDM_IN2_CON2;1088mask = ETDM_IN_CON2_CLOCK_MASK;1089shift = ETDM_IN_CON2_CLOCK_SHIFT;1090} else {1091return -EINVAL;1092}10931094regmap_read(afe->regmap, reg, &value);10951096value &= mask;1097value >>= shift;1098ucontrol->value.enumerated.item[0] = value;1099return 0;1100}11011102static const struct snd_kcontrol_new mtk_dai_etdm_controls[] = {1103SOC_ENUM_EXT("ETDM_OUT1_Clock_Source", etdmout_clk_src_enum,1104mt8188_etdm_clk_src_sel_get,1105mt8188_etdm_clk_src_sel_put),1106SOC_ENUM_EXT("ETDM_OUT2_Clock_Source", etdmout_clk_src_enum,1107mt8188_etdm_clk_src_sel_get,1108mt8188_etdm_clk_src_sel_put),1109SOC_ENUM_EXT("ETDM_OUT3_Clock_Source", etdmout_clk_src_enum,1110mt8188_etdm_clk_src_sel_get,1111mt8188_etdm_clk_src_sel_put),1112SOC_ENUM_EXT("ETDM_IN1_Clock_Source", etdmout_clk_src_enum,1113mt8188_etdm_clk_src_sel_get,1114mt8188_etdm_clk_src_sel_put),1115SOC_ENUM_EXT("ETDM_IN2_Clock_Source", etdmout_clk_src_enum,1116mt8188_etdm_clk_src_sel_get,1117mt8188_etdm_clk_src_sel_put),1118};11191120static const struct snd_soc_dapm_widget mtk_dai_etdm_widgets[] = {1121/* eTDM_IN2 */1122SND_SOC_DAPM_MIXER("I012", SND_SOC_NOPM, 0, 0, NULL, 0),1123SND_SOC_DAPM_MIXER("I013", SND_SOC_NOPM, 0, 0, NULL, 0),1124SND_SOC_DAPM_MIXER("I014", SND_SOC_NOPM, 0, 0, NULL, 0),1125SND_SOC_DAPM_MIXER("I015", SND_SOC_NOPM, 0, 0, NULL, 0),1126SND_SOC_DAPM_MIXER("I016", SND_SOC_NOPM, 0, 0, NULL, 0),1127SND_SOC_DAPM_MIXER("I017", SND_SOC_NOPM, 0, 0, NULL, 0),1128SND_SOC_DAPM_MIXER("I018", SND_SOC_NOPM, 0, 0, NULL, 0),1129SND_SOC_DAPM_MIXER("I019", SND_SOC_NOPM, 0, 0, NULL, 0),1130SND_SOC_DAPM_MIXER("I188", SND_SOC_NOPM, 0, 0, NULL, 0),1131SND_SOC_DAPM_MIXER("I189", SND_SOC_NOPM, 0, 0, NULL, 0),1132SND_SOC_DAPM_MIXER("I190", SND_SOC_NOPM, 0, 0, NULL, 0),1133SND_SOC_DAPM_MIXER("I191", SND_SOC_NOPM, 0, 0, NULL, 0),1134SND_SOC_DAPM_MIXER("I192", SND_SOC_NOPM, 0, 0, NULL, 0),1135SND_SOC_DAPM_MIXER("I193", SND_SOC_NOPM, 0, 0, NULL, 0),1136SND_SOC_DAPM_MIXER("I194", SND_SOC_NOPM, 0, 0, NULL, 0),1137SND_SOC_DAPM_MIXER("I195", SND_SOC_NOPM, 0, 0, NULL, 0),11381139/* eTDM_IN1 */1140SND_SOC_DAPM_MIXER("I072", SND_SOC_NOPM, 0, 0, NULL, 0),1141SND_SOC_DAPM_MIXER("I073", SND_SOC_NOPM, 0, 0, NULL, 0),1142SND_SOC_DAPM_MIXER("I074", SND_SOC_NOPM, 0, 0, NULL, 0),1143SND_SOC_DAPM_MIXER("I075", SND_SOC_NOPM, 0, 0, NULL, 0),1144SND_SOC_DAPM_MIXER("I076", SND_SOC_NOPM, 0, 0, NULL, 0),1145SND_SOC_DAPM_MIXER("I077", SND_SOC_NOPM, 0, 0, NULL, 0),1146SND_SOC_DAPM_MIXER("I078", SND_SOC_NOPM, 0, 0, NULL, 0),1147SND_SOC_DAPM_MIXER("I079", SND_SOC_NOPM, 0, 0, NULL, 0),1148SND_SOC_DAPM_MIXER("I080", SND_SOC_NOPM, 0, 0, NULL, 0),1149SND_SOC_DAPM_MIXER("I081", SND_SOC_NOPM, 0, 0, NULL, 0),1150SND_SOC_DAPM_MIXER("I082", SND_SOC_NOPM, 0, 0, NULL, 0),1151SND_SOC_DAPM_MIXER("I083", SND_SOC_NOPM, 0, 0, NULL, 0),1152SND_SOC_DAPM_MIXER("I084", SND_SOC_NOPM, 0, 0, NULL, 0),1153SND_SOC_DAPM_MIXER("I085", SND_SOC_NOPM, 0, 0, NULL, 0),1154SND_SOC_DAPM_MIXER("I086", SND_SOC_NOPM, 0, 0, NULL, 0),1155SND_SOC_DAPM_MIXER("I087", SND_SOC_NOPM, 0, 0, NULL, 0),11561157/* eTDM_OUT2 */1158SND_SOC_DAPM_MIXER("O048", SND_SOC_NOPM, 0, 0,1159mtk_dai_etdm_o048_mix, ARRAY_SIZE(mtk_dai_etdm_o048_mix)),1160SND_SOC_DAPM_MIXER("O049", SND_SOC_NOPM, 0, 0,1161mtk_dai_etdm_o049_mix, ARRAY_SIZE(mtk_dai_etdm_o049_mix)),1162SND_SOC_DAPM_MIXER("O050", SND_SOC_NOPM, 0, 0,1163mtk_dai_etdm_o050_mix, ARRAY_SIZE(mtk_dai_etdm_o050_mix)),1164SND_SOC_DAPM_MIXER("O051", SND_SOC_NOPM, 0, 0,1165mtk_dai_etdm_o051_mix, ARRAY_SIZE(mtk_dai_etdm_o051_mix)),1166SND_SOC_DAPM_MIXER("O052", SND_SOC_NOPM, 0, 0,1167mtk_dai_etdm_o052_mix, ARRAY_SIZE(mtk_dai_etdm_o052_mix)),1168SND_SOC_DAPM_MIXER("O053", SND_SOC_NOPM, 0, 0,1169mtk_dai_etdm_o053_mix, ARRAY_SIZE(mtk_dai_etdm_o053_mix)),1170SND_SOC_DAPM_MIXER("O054", SND_SOC_NOPM, 0, 0,1171mtk_dai_etdm_o054_mix, ARRAY_SIZE(mtk_dai_etdm_o054_mix)),1172SND_SOC_DAPM_MIXER("O055", SND_SOC_NOPM, 0, 0,1173mtk_dai_etdm_o055_mix, ARRAY_SIZE(mtk_dai_etdm_o055_mix)),1174SND_SOC_DAPM_MIXER("O056", SND_SOC_NOPM, 0, 0,1175mtk_dai_etdm_o056_mix, ARRAY_SIZE(mtk_dai_etdm_o056_mix)),1176SND_SOC_DAPM_MIXER("O057", SND_SOC_NOPM, 0, 0,1177mtk_dai_etdm_o057_mix, ARRAY_SIZE(mtk_dai_etdm_o057_mix)),1178SND_SOC_DAPM_MIXER("O058", SND_SOC_NOPM, 0, 0,1179mtk_dai_etdm_o058_mix, ARRAY_SIZE(mtk_dai_etdm_o058_mix)),1180SND_SOC_DAPM_MIXER("O059", SND_SOC_NOPM, 0, 0,1181mtk_dai_etdm_o059_mix, ARRAY_SIZE(mtk_dai_etdm_o059_mix)),1182SND_SOC_DAPM_MIXER("O060", SND_SOC_NOPM, 0, 0,1183mtk_dai_etdm_o060_mix, ARRAY_SIZE(mtk_dai_etdm_o060_mix)),1184SND_SOC_DAPM_MIXER("O061", SND_SOC_NOPM, 0, 0,1185mtk_dai_etdm_o061_mix, ARRAY_SIZE(mtk_dai_etdm_o061_mix)),1186SND_SOC_DAPM_MIXER("O062", SND_SOC_NOPM, 0, 0,1187mtk_dai_etdm_o062_mix, ARRAY_SIZE(mtk_dai_etdm_o062_mix)),1188SND_SOC_DAPM_MIXER("O063", SND_SOC_NOPM, 0, 0,1189mtk_dai_etdm_o063_mix, ARRAY_SIZE(mtk_dai_etdm_o063_mix)),11901191/* eTDM_OUT1 */1192SND_SOC_DAPM_MIXER("O072", SND_SOC_NOPM, 0, 0,1193mtk_dai_etdm_o072_mix, ARRAY_SIZE(mtk_dai_etdm_o072_mix)),1194SND_SOC_DAPM_MIXER("O073", SND_SOC_NOPM, 0, 0,1195mtk_dai_etdm_o073_mix, ARRAY_SIZE(mtk_dai_etdm_o073_mix)),1196SND_SOC_DAPM_MIXER("O074", SND_SOC_NOPM, 0, 0,1197mtk_dai_etdm_o074_mix, ARRAY_SIZE(mtk_dai_etdm_o074_mix)),1198SND_SOC_DAPM_MIXER("O075", SND_SOC_NOPM, 0, 0,1199mtk_dai_etdm_o075_mix, ARRAY_SIZE(mtk_dai_etdm_o075_mix)),1200SND_SOC_DAPM_MIXER("O076", SND_SOC_NOPM, 0, 0,1201mtk_dai_etdm_o076_mix, ARRAY_SIZE(mtk_dai_etdm_o076_mix)),1202SND_SOC_DAPM_MIXER("O077", SND_SOC_NOPM, 0, 0,1203mtk_dai_etdm_o077_mix, ARRAY_SIZE(mtk_dai_etdm_o077_mix)),1204SND_SOC_DAPM_MIXER("O078", SND_SOC_NOPM, 0, 0,1205mtk_dai_etdm_o078_mix, ARRAY_SIZE(mtk_dai_etdm_o078_mix)),1206SND_SOC_DAPM_MIXER("O079", SND_SOC_NOPM, 0, 0,1207mtk_dai_etdm_o079_mix, ARRAY_SIZE(mtk_dai_etdm_o079_mix)),1208SND_SOC_DAPM_MIXER("O080", SND_SOC_NOPM, 0, 0,1209mtk_dai_etdm_o080_mix, ARRAY_SIZE(mtk_dai_etdm_o080_mix)),1210SND_SOC_DAPM_MIXER("O081", SND_SOC_NOPM, 0, 0,1211mtk_dai_etdm_o081_mix, ARRAY_SIZE(mtk_dai_etdm_o081_mix)),1212SND_SOC_DAPM_MIXER("O082", SND_SOC_NOPM, 0, 0,1213mtk_dai_etdm_o082_mix, ARRAY_SIZE(mtk_dai_etdm_o082_mix)),1214SND_SOC_DAPM_MIXER("O083", SND_SOC_NOPM, 0, 0,1215mtk_dai_etdm_o083_mix, ARRAY_SIZE(mtk_dai_etdm_o083_mix)),1216SND_SOC_DAPM_MIXER("O084", SND_SOC_NOPM, 0, 0,1217mtk_dai_etdm_o084_mix, ARRAY_SIZE(mtk_dai_etdm_o084_mix)),1218SND_SOC_DAPM_MIXER("O085", SND_SOC_NOPM, 0, 0,1219mtk_dai_etdm_o085_mix, ARRAY_SIZE(mtk_dai_etdm_o085_mix)),1220SND_SOC_DAPM_MIXER("O086", SND_SOC_NOPM, 0, 0,1221mtk_dai_etdm_o086_mix, ARRAY_SIZE(mtk_dai_etdm_o086_mix)),1222SND_SOC_DAPM_MIXER("O087", SND_SOC_NOPM, 0, 0,1223mtk_dai_etdm_o087_mix, ARRAY_SIZE(mtk_dai_etdm_o087_mix)),12241225/* eTDM_OUT3 */1226SND_SOC_DAPM_MUX("HDMI_OUT_MUX", SND_SOC_NOPM, 0, 0,1227&hdmi_out_mux_control),1228SND_SOC_DAPM_MUX("DPTX_OUT_MUX", SND_SOC_NOPM, 0, 0,1229&dptx_out_mux_control),12301231SND_SOC_DAPM_MUX("HDMI_CH0_MUX", SND_SOC_NOPM, 0, 0,1232&hdmi_ch0_mux_control),1233SND_SOC_DAPM_MUX("HDMI_CH1_MUX", SND_SOC_NOPM, 0, 0,1234&hdmi_ch1_mux_control),1235SND_SOC_DAPM_MUX("HDMI_CH2_MUX", SND_SOC_NOPM, 0, 0,1236&hdmi_ch2_mux_control),1237SND_SOC_DAPM_MUX("HDMI_CH3_MUX", SND_SOC_NOPM, 0, 0,1238&hdmi_ch3_mux_control),1239SND_SOC_DAPM_MUX("HDMI_CH4_MUX", SND_SOC_NOPM, 0, 0,1240&hdmi_ch4_mux_control),1241SND_SOC_DAPM_MUX("HDMI_CH5_MUX", SND_SOC_NOPM, 0, 0,1242&hdmi_ch5_mux_control),1243SND_SOC_DAPM_MUX("HDMI_CH6_MUX", SND_SOC_NOPM, 0, 0,1244&hdmi_ch6_mux_control),1245SND_SOC_DAPM_MUX("HDMI_CH7_MUX", SND_SOC_NOPM, 0, 0,1246&hdmi_ch7_mux_control),12471248/* mclk en */1249SND_SOC_DAPM_SUPPLY_S("ETDM1_IN_MCLK", SUPPLY_SEQ_ETDM_MCLK,1250SND_SOC_NOPM, 0, 0,1251mtk_etdm_mclk_event,1252SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),1253SND_SOC_DAPM_SUPPLY_S("ETDM2_IN_MCLK", SUPPLY_SEQ_ETDM_MCLK,1254SND_SOC_NOPM, 0, 0,1255mtk_etdm_mclk_event,1256SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),1257SND_SOC_DAPM_SUPPLY_S("ETDM1_OUT_MCLK", SUPPLY_SEQ_ETDM_MCLK,1258SND_SOC_NOPM, 0, 0,1259mtk_etdm_mclk_event,1260SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),1261SND_SOC_DAPM_SUPPLY_S("ETDM2_OUT_MCLK", SUPPLY_SEQ_ETDM_MCLK,1262SND_SOC_NOPM, 0, 0,1263mtk_etdm_mclk_event,1264SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),1265SND_SOC_DAPM_SUPPLY_S("DPTX_MCLK", SUPPLY_SEQ_ETDM_MCLK,1266SND_SOC_NOPM, 0, 0,1267mtk_dptx_mclk_event,1268SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),12691270/* cg */1271SND_SOC_DAPM_SUPPLY_S("ETDM1_IN_CG", SUPPLY_SEQ_ETDM_CG,1272SND_SOC_NOPM, 0, 0,1273mtk_etdm_cg_event,1274SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),1275SND_SOC_DAPM_SUPPLY_S("ETDM2_IN_CG", SUPPLY_SEQ_ETDM_CG,1276SND_SOC_NOPM, 0, 0,1277mtk_etdm_cg_event,1278SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),1279SND_SOC_DAPM_SUPPLY_S("ETDM1_OUT_CG", SUPPLY_SEQ_ETDM_CG,1280SND_SOC_NOPM, 0, 0,1281mtk_etdm_cg_event,1282SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),1283SND_SOC_DAPM_SUPPLY_S("ETDM2_OUT_CG", SUPPLY_SEQ_ETDM_CG,1284SND_SOC_NOPM, 0, 0,1285mtk_etdm_cg_event,1286SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),1287SND_SOC_DAPM_SUPPLY_S("ETDM3_OUT_CG", SUPPLY_SEQ_ETDM_CG,1288SND_SOC_NOPM, 0, 0,1289mtk_etdm3_cg_event,1290SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),12911292/* en */1293SND_SOC_DAPM_SUPPLY_S("ETDM1_IN_EN", SUPPLY_SEQ_ETDM_EN,1294ETDM_IN1_CON0, ETDM_CON0_EN_SHIFT, 0, NULL, 0),1295SND_SOC_DAPM_SUPPLY_S("ETDM2_IN_EN", SUPPLY_SEQ_ETDM_EN,1296ETDM_IN2_CON0, ETDM_CON0_EN_SHIFT, 0, NULL, 0),1297SND_SOC_DAPM_SUPPLY_S("ETDM1_OUT_EN", SUPPLY_SEQ_ETDM_EN,1298ETDM_OUT1_CON0, ETDM_CON0_EN_SHIFT, 0, NULL, 0),1299SND_SOC_DAPM_SUPPLY_S("ETDM2_OUT_EN", SUPPLY_SEQ_ETDM_EN,1300ETDM_OUT2_CON0, ETDM_CON0_EN_SHIFT, 0, NULL, 0),1301SND_SOC_DAPM_SUPPLY_S("ETDM3_OUT_EN", SUPPLY_SEQ_ETDM_EN,1302ETDM_OUT3_CON0, ETDM_CON0_EN_SHIFT, 0, NULL, 0),1303SND_SOC_DAPM_SUPPLY_S("DPTX_EN", SUPPLY_SEQ_DPTX_EN,1304AFE_DPTX_CON, AFE_DPTX_CON_ON_SHIFT, 0, NULL, 0),13051306/* apll */1307SND_SOC_DAPM_SUPPLY_S(APLL1_W_NAME, SUPPLY_SEQ_APLL,1308SND_SOC_NOPM, 0, 0,1309mtk_apll_event,1310SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),1311SND_SOC_DAPM_SUPPLY_S(APLL2_W_NAME, SUPPLY_SEQ_APLL,1312SND_SOC_NOPM, 0, 0,1313mtk_apll_event,1314SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),13151316SND_SOC_DAPM_INPUT("ETDM_INPUT"),1317SND_SOC_DAPM_OUTPUT("ETDM_OUTPUT"),1318};13191320static const struct snd_soc_dapm_route mtk_dai_etdm_routes[] = {1321/* mclk */1322{"ETDM1_IN", NULL, "ETDM1_IN_MCLK", mtk_etdm_mclk_connect},1323{"ETDM1_IN", NULL, "ETDM2_IN_MCLK", mtk_etdm_mclk_connect},1324{"ETDM1_IN", NULL, "ETDM1_OUT_MCLK", mtk_etdm_mclk_connect},1325{"ETDM1_IN", NULL, "ETDM2_OUT_MCLK", mtk_etdm_mclk_connect},13261327{"ETDM2_IN", NULL, "ETDM1_IN_MCLK", mtk_etdm_mclk_connect},1328{"ETDM2_IN", NULL, "ETDM2_IN_MCLK", mtk_etdm_mclk_connect},1329{"ETDM2_IN", NULL, "ETDM1_OUT_MCLK", mtk_etdm_mclk_connect},1330{"ETDM2_IN", NULL, "ETDM2_OUT_MCLK", mtk_etdm_mclk_connect},13311332{"ETDM1_OUT", NULL, "ETDM1_IN_MCLK", mtk_etdm_mclk_connect},1333{"ETDM1_OUT", NULL, "ETDM2_IN_MCLK", mtk_etdm_mclk_connect},1334{"ETDM1_OUT", NULL, "ETDM1_OUT_MCLK", mtk_etdm_mclk_connect},1335{"ETDM1_OUT", NULL, "ETDM2_OUT_MCLK", mtk_etdm_mclk_connect},13361337{"ETDM2_OUT", NULL, "ETDM1_IN_MCLK", mtk_etdm_mclk_connect},1338{"ETDM2_OUT", NULL, "ETDM2_IN_MCLK", mtk_etdm_mclk_connect},1339{"ETDM2_OUT", NULL, "ETDM1_OUT_MCLK", mtk_etdm_mclk_connect},1340{"ETDM2_OUT", NULL, "ETDM2_OUT_MCLK", mtk_etdm_mclk_connect},13411342{"DPTX", NULL, "DPTX_MCLK"},13431344{"ETDM1_IN_MCLK", NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},1345{"ETDM1_IN_MCLK", NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},13461347{"ETDM2_IN_MCLK", NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},1348{"ETDM2_IN_MCLK", NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},13491350{"ETDM1_OUT_MCLK", NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},1351{"ETDM1_OUT_MCLK", NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},13521353{"ETDM2_OUT_MCLK", NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},1354{"ETDM2_OUT_MCLK", NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},13551356{"DPTX_MCLK", NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},1357{"DPTX_MCLK", NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},13581359/* cg */1360{"ETDM1_IN", NULL, "ETDM1_IN_CG"},1361{"ETDM1_IN", NULL, "ETDM2_IN_CG", mtk_etdm_cowork_connect},1362{"ETDM1_IN", NULL, "ETDM1_OUT_CG", mtk_etdm_cowork_connect},1363{"ETDM1_IN", NULL, "ETDM2_OUT_CG", mtk_etdm_cowork_connect},13641365{"ETDM2_IN", NULL, "ETDM1_IN_CG", mtk_etdm_cowork_connect},1366{"ETDM2_IN", NULL, "ETDM2_IN_CG"},1367{"ETDM2_IN", NULL, "ETDM1_OUT_CG", mtk_etdm_cowork_connect},1368{"ETDM2_IN", NULL, "ETDM2_OUT_CG", mtk_etdm_cowork_connect},13691370{"ETDM1_OUT", NULL, "ETDM1_IN_CG", mtk_etdm_cowork_connect},1371{"ETDM1_OUT", NULL, "ETDM2_IN_CG", mtk_etdm_cowork_connect},1372{"ETDM1_OUT", NULL, "ETDM1_OUT_CG"},1373{"ETDM1_OUT", NULL, "ETDM2_OUT_CG", mtk_etdm_cowork_connect},13741375{"ETDM2_OUT", NULL, "ETDM1_IN_CG", mtk_etdm_cowork_connect},1376{"ETDM2_OUT", NULL, "ETDM2_IN_CG", mtk_etdm_cowork_connect},1377{"ETDM2_OUT", NULL, "ETDM1_OUT_CG", mtk_etdm_cowork_connect},1378{"ETDM2_OUT", NULL, "ETDM2_OUT_CG"},13791380{"ETDM3_OUT", NULL, "ETDM3_OUT_CG"},1381{"DPTX", NULL, "ETDM3_OUT_CG"},13821383/* en */1384{"ETDM1_IN", NULL, "ETDM1_IN_EN"},1385{"ETDM1_IN", NULL, "ETDM2_IN_EN", mtk_etdm_cowork_connect},1386{"ETDM1_IN", NULL, "ETDM1_OUT_EN", mtk_etdm_cowork_connect},1387{"ETDM1_IN", NULL, "ETDM2_OUT_EN", mtk_etdm_cowork_connect},13881389{"ETDM2_IN", NULL, "ETDM1_IN_EN", mtk_etdm_cowork_connect},1390{"ETDM2_IN", NULL, "ETDM2_IN_EN"},1391{"ETDM2_IN", NULL, "ETDM1_OUT_EN", mtk_etdm_cowork_connect},1392{"ETDM2_IN", NULL, "ETDM2_OUT_EN", mtk_etdm_cowork_connect},13931394{"ETDM1_OUT", NULL, "ETDM1_IN_EN", mtk_etdm_cowork_connect},1395{"ETDM1_OUT", NULL, "ETDM2_IN_EN", mtk_etdm_cowork_connect},1396{"ETDM1_OUT", NULL, "ETDM1_OUT_EN"},1397{"ETDM1_OUT", NULL, "ETDM2_OUT_EN", mtk_etdm_cowork_connect},13981399{"ETDM2_OUT", NULL, "ETDM1_IN_EN", mtk_etdm_cowork_connect},1400{"ETDM2_OUT", NULL, "ETDM2_IN_EN", mtk_etdm_cowork_connect},1401{"ETDM2_OUT", NULL, "ETDM1_OUT_EN", mtk_etdm_cowork_connect},1402{"ETDM2_OUT", NULL, "ETDM2_OUT_EN"},14031404{"ETDM3_OUT", NULL, "ETDM3_OUT_EN"},1405{"DPTX", NULL, "ETDM3_OUT_EN"},1406{"DPTX", NULL, "DPTX_EN"},14071408{"ETDM1_IN_EN", NULL, APLL1_W_NAME, mtk_afe_etdm_apll_connect},1409{"ETDM1_IN_EN", NULL, APLL2_W_NAME, mtk_afe_etdm_apll_connect},14101411{"ETDM2_IN_EN", NULL, APLL1_W_NAME, mtk_afe_etdm_apll_connect},1412{"ETDM2_IN_EN", NULL, APLL2_W_NAME, mtk_afe_etdm_apll_connect},14131414{"ETDM1_OUT_EN", NULL, APLL1_W_NAME, mtk_afe_etdm_apll_connect},1415{"ETDM1_OUT_EN", NULL, APLL2_W_NAME, mtk_afe_etdm_apll_connect},14161417{"ETDM2_OUT_EN", NULL, APLL1_W_NAME, mtk_afe_etdm_apll_connect},1418{"ETDM2_OUT_EN", NULL, APLL2_W_NAME, mtk_afe_etdm_apll_connect},14191420{"ETDM3_OUT_EN", NULL, APLL1_W_NAME, mtk_afe_etdm_apll_connect},1421{"ETDM3_OUT_EN", NULL, APLL2_W_NAME, mtk_afe_etdm_apll_connect},14221423{"I012", NULL, "ETDM2_IN"},1424{"I013", NULL, "ETDM2_IN"},1425{"I014", NULL, "ETDM2_IN"},1426{"I015", NULL, "ETDM2_IN"},1427{"I016", NULL, "ETDM2_IN"},1428{"I017", NULL, "ETDM2_IN"},1429{"I018", NULL, "ETDM2_IN"},1430{"I019", NULL, "ETDM2_IN"},1431{"I188", NULL, "ETDM2_IN"},1432{"I189", NULL, "ETDM2_IN"},1433{"I190", NULL, "ETDM2_IN"},1434{"I191", NULL, "ETDM2_IN"},1435{"I192", NULL, "ETDM2_IN"},1436{"I193", NULL, "ETDM2_IN"},1437{"I194", NULL, "ETDM2_IN"},1438{"I195", NULL, "ETDM2_IN"},14391440{"I072", NULL, "ETDM1_IN"},1441{"I073", NULL, "ETDM1_IN"},1442{"I074", NULL, "ETDM1_IN"},1443{"I075", NULL, "ETDM1_IN"},1444{"I076", NULL, "ETDM1_IN"},1445{"I077", NULL, "ETDM1_IN"},1446{"I078", NULL, "ETDM1_IN"},1447{"I079", NULL, "ETDM1_IN"},1448{"I080", NULL, "ETDM1_IN"},1449{"I081", NULL, "ETDM1_IN"},1450{"I082", NULL, "ETDM1_IN"},1451{"I083", NULL, "ETDM1_IN"},1452{"I084", NULL, "ETDM1_IN"},1453{"I085", NULL, "ETDM1_IN"},1454{"I086", NULL, "ETDM1_IN"},1455{"I087", NULL, "ETDM1_IN"},14561457{"UL8", NULL, "ETDM1_IN"},1458{"UL3", NULL, "ETDM2_IN"},14591460{"ETDM2_OUT", NULL, "O048"},1461{"ETDM2_OUT", NULL, "O049"},1462{"ETDM2_OUT", NULL, "O050"},1463{"ETDM2_OUT", NULL, "O051"},1464{"ETDM2_OUT", NULL, "O052"},1465{"ETDM2_OUT", NULL, "O053"},1466{"ETDM2_OUT", NULL, "O054"},1467{"ETDM2_OUT", NULL, "O055"},1468{"ETDM2_OUT", NULL, "O056"},1469{"ETDM2_OUT", NULL, "O057"},1470{"ETDM2_OUT", NULL, "O058"},1471{"ETDM2_OUT", NULL, "O059"},1472{"ETDM2_OUT", NULL, "O060"},1473{"ETDM2_OUT", NULL, "O061"},1474{"ETDM2_OUT", NULL, "O062"},1475{"ETDM2_OUT", NULL, "O063"},14761477{"ETDM1_OUT", NULL, "O072"},1478{"ETDM1_OUT", NULL, "O073"},1479{"ETDM1_OUT", NULL, "O074"},1480{"ETDM1_OUT", NULL, "O075"},1481{"ETDM1_OUT", NULL, "O076"},1482{"ETDM1_OUT", NULL, "O077"},1483{"ETDM1_OUT", NULL, "O078"},1484{"ETDM1_OUT", NULL, "O079"},1485{"ETDM1_OUT", NULL, "O080"},1486{"ETDM1_OUT", NULL, "O081"},1487{"ETDM1_OUT", NULL, "O082"},1488{"ETDM1_OUT", NULL, "O083"},1489{"ETDM1_OUT", NULL, "O084"},1490{"ETDM1_OUT", NULL, "O085"},1491{"ETDM1_OUT", NULL, "O086"},1492{"ETDM1_OUT", NULL, "O087"},14931494{"O048", "I020 Switch", "I020"},1495{"O049", "I021 Switch", "I021"},14961497{"O048", "I022 Switch", "I022"},1498{"O049", "I023 Switch", "I023"},1499{"O050", "I024 Switch", "I024"},1500{"O051", "I025 Switch", "I025"},1501{"O052", "I026 Switch", "I026"},1502{"O053", "I027 Switch", "I027"},1503{"O054", "I028 Switch", "I028"},1504{"O055", "I029 Switch", "I029"},1505{"O056", "I030 Switch", "I030"},1506{"O057", "I031 Switch", "I031"},1507{"O058", "I032 Switch", "I032"},1508{"O059", "I033 Switch", "I033"},1509{"O060", "I034 Switch", "I034"},1510{"O061", "I035 Switch", "I035"},1511{"O062", "I036 Switch", "I036"},1512{"O063", "I037 Switch", "I037"},15131514{"O048", "I046 Switch", "I046"},1515{"O049", "I047 Switch", "I047"},1516{"O050", "I048 Switch", "I048"},1517{"O051", "I049 Switch", "I049"},1518{"O052", "I050 Switch", "I050"},1519{"O053", "I051 Switch", "I051"},1520{"O054", "I052 Switch", "I052"},1521{"O055", "I053 Switch", "I053"},1522{"O056", "I054 Switch", "I054"},1523{"O057", "I055 Switch", "I055"},1524{"O058", "I056 Switch", "I056"},1525{"O059", "I057 Switch", "I057"},1526{"O060", "I058 Switch", "I058"},1527{"O061", "I059 Switch", "I059"},1528{"O062", "I060 Switch", "I060"},1529{"O063", "I061 Switch", "I061"},15301531{"O048", "I070 Switch", "I070"},1532{"O049", "I071 Switch", "I071"},15331534{"O072", "I020 Switch", "I020"},1535{"O073", "I021 Switch", "I021"},15361537{"O072", "I022 Switch", "I022"},1538{"O073", "I023 Switch", "I023"},1539{"O074", "I024 Switch", "I024"},1540{"O075", "I025 Switch", "I025"},1541{"O076", "I026 Switch", "I026"},1542{"O077", "I027 Switch", "I027"},1543{"O078", "I028 Switch", "I028"},1544{"O079", "I029 Switch", "I029"},1545{"O080", "I030 Switch", "I030"},1546{"O081", "I031 Switch", "I031"},1547{"O082", "I032 Switch", "I032"},1548{"O083", "I033 Switch", "I033"},1549{"O084", "I034 Switch", "I034"},1550{"O085", "I035 Switch", "I035"},1551{"O086", "I036 Switch", "I036"},1552{"O087", "I037 Switch", "I037"},15531554{"O072", "I046 Switch", "I046"},1555{"O073", "I047 Switch", "I047"},1556{"O074", "I048 Switch", "I048"},1557{"O075", "I049 Switch", "I049"},1558{"O076", "I050 Switch", "I050"},1559{"O077", "I051 Switch", "I051"},1560{"O078", "I052 Switch", "I052"},1561{"O079", "I053 Switch", "I053"},1562{"O080", "I054 Switch", "I054"},1563{"O081", "I055 Switch", "I055"},1564{"O082", "I056 Switch", "I056"},1565{"O083", "I057 Switch", "I057"},1566{"O084", "I058 Switch", "I058"},1567{"O085", "I059 Switch", "I059"},1568{"O086", "I060 Switch", "I060"},1569{"O087", "I061 Switch", "I061"},15701571{"O072", "I070 Switch", "I070"},1572{"O073", "I071 Switch", "I071"},15731574{"HDMI_CH0_MUX", "CH0", "DL10"},1575{"HDMI_CH0_MUX", "CH1", "DL10"},1576{"HDMI_CH0_MUX", "CH2", "DL10"},1577{"HDMI_CH0_MUX", "CH3", "DL10"},1578{"HDMI_CH0_MUX", "CH4", "DL10"},1579{"HDMI_CH0_MUX", "CH5", "DL10"},1580{"HDMI_CH0_MUX", "CH6", "DL10"},1581{"HDMI_CH0_MUX", "CH7", "DL10"},15821583{"HDMI_CH1_MUX", "CH0", "DL10"},1584{"HDMI_CH1_MUX", "CH1", "DL10"},1585{"HDMI_CH1_MUX", "CH2", "DL10"},1586{"HDMI_CH1_MUX", "CH3", "DL10"},1587{"HDMI_CH1_MUX", "CH4", "DL10"},1588{"HDMI_CH1_MUX", "CH5", "DL10"},1589{"HDMI_CH1_MUX", "CH6", "DL10"},1590{"HDMI_CH1_MUX", "CH7", "DL10"},15911592{"HDMI_CH2_MUX", "CH0", "DL10"},1593{"HDMI_CH2_MUX", "CH1", "DL10"},1594{"HDMI_CH2_MUX", "CH2", "DL10"},1595{"HDMI_CH2_MUX", "CH3", "DL10"},1596{"HDMI_CH2_MUX", "CH4", "DL10"},1597{"HDMI_CH2_MUX", "CH5", "DL10"},1598{"HDMI_CH2_MUX", "CH6", "DL10"},1599{"HDMI_CH2_MUX", "CH7", "DL10"},16001601{"HDMI_CH3_MUX", "CH0", "DL10"},1602{"HDMI_CH3_MUX", "CH1", "DL10"},1603{"HDMI_CH3_MUX", "CH2", "DL10"},1604{"HDMI_CH3_MUX", "CH3", "DL10"},1605{"HDMI_CH3_MUX", "CH4", "DL10"},1606{"HDMI_CH3_MUX", "CH5", "DL10"},1607{"HDMI_CH3_MUX", "CH6", "DL10"},1608{"HDMI_CH3_MUX", "CH7", "DL10"},16091610{"HDMI_CH4_MUX", "CH0", "DL10"},1611{"HDMI_CH4_MUX", "CH1", "DL10"},1612{"HDMI_CH4_MUX", "CH2", "DL10"},1613{"HDMI_CH4_MUX", "CH3", "DL10"},1614{"HDMI_CH4_MUX", "CH4", "DL10"},1615{"HDMI_CH4_MUX", "CH5", "DL10"},1616{"HDMI_CH4_MUX", "CH6", "DL10"},1617{"HDMI_CH4_MUX", "CH7", "DL10"},16181619{"HDMI_CH5_MUX", "CH0", "DL10"},1620{"HDMI_CH5_MUX", "CH1", "DL10"},1621{"HDMI_CH5_MUX", "CH2", "DL10"},1622{"HDMI_CH5_MUX", "CH3", "DL10"},1623{"HDMI_CH5_MUX", "CH4", "DL10"},1624{"HDMI_CH5_MUX", "CH5", "DL10"},1625{"HDMI_CH5_MUX", "CH6", "DL10"},1626{"HDMI_CH5_MUX", "CH7", "DL10"},16271628{"HDMI_CH6_MUX", "CH0", "DL10"},1629{"HDMI_CH6_MUX", "CH1", "DL10"},1630{"HDMI_CH6_MUX", "CH2", "DL10"},1631{"HDMI_CH6_MUX", "CH3", "DL10"},1632{"HDMI_CH6_MUX", "CH4", "DL10"},1633{"HDMI_CH6_MUX", "CH5", "DL10"},1634{"HDMI_CH6_MUX", "CH6", "DL10"},1635{"HDMI_CH6_MUX", "CH7", "DL10"},16361637{"HDMI_CH7_MUX", "CH0", "DL10"},1638{"HDMI_CH7_MUX", "CH1", "DL10"},1639{"HDMI_CH7_MUX", "CH2", "DL10"},1640{"HDMI_CH7_MUX", "CH3", "DL10"},1641{"HDMI_CH7_MUX", "CH4", "DL10"},1642{"HDMI_CH7_MUX", "CH5", "DL10"},1643{"HDMI_CH7_MUX", "CH6", "DL10"},1644{"HDMI_CH7_MUX", "CH7", "DL10"},16451646{"HDMI_OUT_MUX", "Connect", "HDMI_CH0_MUX"},1647{"HDMI_OUT_MUX", "Connect", "HDMI_CH1_MUX"},1648{"HDMI_OUT_MUX", "Connect", "HDMI_CH2_MUX"},1649{"HDMI_OUT_MUX", "Connect", "HDMI_CH3_MUX"},1650{"HDMI_OUT_MUX", "Connect", "HDMI_CH4_MUX"},1651{"HDMI_OUT_MUX", "Connect", "HDMI_CH5_MUX"},1652{"HDMI_OUT_MUX", "Connect", "HDMI_CH6_MUX"},1653{"HDMI_OUT_MUX", "Connect", "HDMI_CH7_MUX"},16541655{"DPTX_OUT_MUX", "Connect", "HDMI_CH0_MUX"},1656{"DPTX_OUT_MUX", "Connect", "HDMI_CH1_MUX"},1657{"DPTX_OUT_MUX", "Connect", "HDMI_CH2_MUX"},1658{"DPTX_OUT_MUX", "Connect", "HDMI_CH3_MUX"},1659{"DPTX_OUT_MUX", "Connect", "HDMI_CH4_MUX"},1660{"DPTX_OUT_MUX", "Connect", "HDMI_CH5_MUX"},1661{"DPTX_OUT_MUX", "Connect", "HDMI_CH6_MUX"},1662{"DPTX_OUT_MUX", "Connect", "HDMI_CH7_MUX"},16631664{"ETDM3_OUT", NULL, "HDMI_OUT_MUX"},1665{"DPTX", NULL, "DPTX_OUT_MUX"},16661667{"ETDM_OUTPUT", NULL, "DPTX"},1668{"ETDM_OUTPUT", NULL, "ETDM1_OUT"},1669{"ETDM_OUTPUT", NULL, "ETDM2_OUT"},1670{"ETDM_OUTPUT", NULL, "ETDM3_OUT"},1671{"ETDM1_IN", NULL, "ETDM_INPUT"},1672{"ETDM2_IN", NULL, "ETDM_INPUT"},1673};16741675static int etdm_cowork_slv_sel(int id, int slave_mode)1676{1677if (slave_mode) {1678switch (id) {1679case MT8188_AFE_IO_ETDM1_IN:1680return COWORK_ETDM_IN1_S;1681case MT8188_AFE_IO_ETDM2_IN:1682return COWORK_ETDM_IN2_S;1683case MT8188_AFE_IO_ETDM1_OUT:1684return COWORK_ETDM_OUT1_S;1685case MT8188_AFE_IO_ETDM2_OUT:1686return COWORK_ETDM_OUT2_S;1687case MT8188_AFE_IO_ETDM3_OUT:1688return COWORK_ETDM_OUT3_S;1689default:1690return -EINVAL;1691}1692} else {1693switch (id) {1694case MT8188_AFE_IO_ETDM1_IN:1695return COWORK_ETDM_IN1_M;1696case MT8188_AFE_IO_ETDM2_IN:1697return COWORK_ETDM_IN2_M;1698case MT8188_AFE_IO_ETDM1_OUT:1699return COWORK_ETDM_OUT1_M;1700case MT8188_AFE_IO_ETDM2_OUT:1701return COWORK_ETDM_OUT2_M;1702case MT8188_AFE_IO_ETDM3_OUT:1703return COWORK_ETDM_OUT3_M;1704default:1705return -EINVAL;1706}1707}1708}17091710static int etdm_cowork_sync_sel(int id)1711{1712switch (id) {1713case MT8188_AFE_IO_ETDM1_IN:1714return ETDM_SYNC_FROM_IN1;1715case MT8188_AFE_IO_ETDM2_IN:1716return ETDM_SYNC_FROM_IN2;1717case MT8188_AFE_IO_ETDM1_OUT:1718return ETDM_SYNC_FROM_OUT1;1719case MT8188_AFE_IO_ETDM2_OUT:1720return ETDM_SYNC_FROM_OUT2;1721case MT8188_AFE_IO_ETDM3_OUT:1722return ETDM_SYNC_FROM_OUT3;1723default:1724return -EINVAL;1725}1726}17271728static int mt8188_etdm_sync_mode_slv(struct mtk_base_afe *afe, int dai_id)1729{1730struct mt8188_afe_private *afe_priv = afe->platform_priv;1731struct mtk_dai_etdm_priv *etdm_data;1732unsigned int reg = 0;1733unsigned int mask;1734unsigned int val;1735int cowork_source_sel;17361737if (!is_valid_etdm_dai(dai_id))1738return -EINVAL;1739etdm_data = afe_priv->dai_priv[dai_id];17401741cowork_source_sel = etdm_cowork_slv_sel(etdm_data->cowork_source_id,1742true);1743if (cowork_source_sel < 0)1744return cowork_source_sel;17451746switch (dai_id) {1747case MT8188_AFE_IO_ETDM1_IN:1748reg = ETDM_COWORK_CON1;1749mask = ETDM_IN1_SLAVE_SEL_MASK;1750val = FIELD_PREP(ETDM_IN1_SLAVE_SEL_MASK, cowork_source_sel);1751break;1752case MT8188_AFE_IO_ETDM2_IN:1753reg = ETDM_COWORK_CON2;1754mask = ETDM_IN2_SLAVE_SEL_MASK;1755val = FIELD_PREP(ETDM_IN2_SLAVE_SEL_MASK, cowork_source_sel);1756break;1757case MT8188_AFE_IO_ETDM1_OUT:1758reg = ETDM_COWORK_CON0;1759mask = ETDM_OUT1_SLAVE_SEL_MASK;1760val = FIELD_PREP(ETDM_OUT1_SLAVE_SEL_MASK, cowork_source_sel);1761break;1762case MT8188_AFE_IO_ETDM2_OUT:1763reg = ETDM_COWORK_CON2;1764mask = ETDM_OUT2_SLAVE_SEL_MASK;1765val = FIELD_PREP(ETDM_OUT2_SLAVE_SEL_MASK, cowork_source_sel);1766break;1767case MT8188_AFE_IO_ETDM3_OUT:1768reg = ETDM_COWORK_CON2;1769mask = ETDM_OUT3_SLAVE_SEL_MASK;1770val = FIELD_PREP(ETDM_OUT3_SLAVE_SEL_MASK, cowork_source_sel);1771break;1772default:1773return 0;1774}17751776regmap_update_bits(afe->regmap, reg, mask, val);17771778return 0;1779}17801781static int mt8188_etdm_sync_mode_mst(struct mtk_base_afe *afe, int dai_id)1782{1783struct mt8188_afe_private *afe_priv = afe->platform_priv;1784struct mtk_dai_etdm_priv *etdm_data;1785struct etdm_con_reg etdm_reg;1786unsigned int reg = 0;1787unsigned int mask;1788unsigned int val;1789int cowork_source_sel;1790int ret;17911792if (!is_valid_etdm_dai(dai_id))1793return -EINVAL;1794etdm_data = afe_priv->dai_priv[dai_id];17951796cowork_source_sel = etdm_cowork_sync_sel(etdm_data->cowork_source_id);1797if (cowork_source_sel < 0)1798return cowork_source_sel;17991800switch (dai_id) {1801case MT8188_AFE_IO_ETDM1_IN:1802reg = ETDM_COWORK_CON1;1803mask = ETDM_IN1_SYNC_SEL_MASK;1804val = FIELD_PREP(ETDM_IN1_SYNC_SEL_MASK, cowork_source_sel);1805break;1806case MT8188_AFE_IO_ETDM2_IN:1807reg = ETDM_COWORK_CON2;1808mask = ETDM_IN2_SYNC_SEL_MASK;1809val = FIELD_PREP(ETDM_IN2_SYNC_SEL_MASK, cowork_source_sel);1810break;1811case MT8188_AFE_IO_ETDM1_OUT:1812reg = ETDM_COWORK_CON0;1813mask = ETDM_OUT1_SYNC_SEL_MASK;1814val = FIELD_PREP(ETDM_OUT1_SYNC_SEL_MASK, cowork_source_sel);1815break;1816case MT8188_AFE_IO_ETDM2_OUT:1817reg = ETDM_COWORK_CON2;1818mask = ETDM_OUT2_SYNC_SEL_MASK;1819val = FIELD_PREP(ETDM_OUT2_SYNC_SEL_MASK, cowork_source_sel);1820break;1821case MT8188_AFE_IO_ETDM3_OUT:1822reg = ETDM_COWORK_CON2;1823mask = ETDM_OUT3_SYNC_SEL_MASK;1824val = FIELD_PREP(ETDM_OUT3_SYNC_SEL_MASK, cowork_source_sel);1825break;1826default:1827return 0;1828}18291830ret = get_etdm_reg(dai_id, &etdm_reg);1831if (ret < 0)1832return ret;18331834regmap_update_bits(afe->regmap, reg, mask, val);18351836regmap_set_bits(afe->regmap, etdm_reg.con0, ETDM_CON0_SYNC_MODE);18371838return 0;1839}18401841static int mt8188_etdm_sync_mode_configure(struct mtk_base_afe *afe, int dai_id)1842{1843struct mt8188_afe_private *afe_priv = afe->platform_priv;1844struct mtk_dai_etdm_priv *etdm_data;18451846if (!is_valid_etdm_dai(dai_id))1847return -EINVAL;1848etdm_data = afe_priv->dai_priv[dai_id];18491850if (etdm_data->cowork_source_id == COWORK_ETDM_NONE)1851return 0;18521853if (etdm_data->slave_mode)1854mt8188_etdm_sync_mode_slv(afe, dai_id);1855else1856mt8188_etdm_sync_mode_mst(afe, dai_id);18571858return 0;1859}18601861/* dai ops */1862static int mtk_dai_etdm_fifo_mode(struct mtk_base_afe *afe,1863int dai_id, unsigned int rate)1864{1865unsigned int mode = 0;1866unsigned int reg = 0;1867unsigned int val = 0;1868unsigned int mask = (ETDM_IN_AFIFO_MODE_MASK | ETDM_IN_USE_AFIFO);18691870if (rate != 0)1871mode = mt8188_afe_fs_timing(rate);18721873switch (dai_id) {1874case MT8188_AFE_IO_ETDM1_IN:1875reg = ETDM_IN1_AFIFO_CON;1876if (rate == 0)1877mode = MT8188_ETDM_IN1_1X_EN;1878break;1879case MT8188_AFE_IO_ETDM2_IN:1880reg = ETDM_IN2_AFIFO_CON;1881if (rate == 0)1882mode = MT8188_ETDM_IN2_1X_EN;1883break;1884default:1885return -EINVAL;1886}18871888val = (mode | ETDM_IN_USE_AFIFO);18891890regmap_update_bits(afe->regmap, reg, mask, val);1891return 0;1892}18931894static int mtk_dai_etdm_in_configure(struct mtk_base_afe *afe,1895unsigned int rate,1896unsigned int channels,1897int dai_id)1898{1899struct mt8188_afe_private *afe_priv = afe->platform_priv;1900struct mtk_dai_etdm_priv *etdm_data;1901struct etdm_con_reg etdm_reg;1902bool slave_mode;1903unsigned int data_mode;1904unsigned int lrck_width;1905unsigned int val = 0;1906unsigned int mask = 0;1907int ret;1908int i;19091910if (!is_valid_etdm_dai(dai_id))1911return -EINVAL;1912etdm_data = afe_priv->dai_priv[dai_id];1913slave_mode = etdm_data->slave_mode;1914data_mode = etdm_data->data_mode;1915lrck_width = etdm_data->lrck_width;19161917dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n",1918__func__, rate, channels, dai_id);19191920ret = get_etdm_reg(dai_id, &etdm_reg);1921if (ret < 0)1922return ret;19231924/* afifo */1925if (slave_mode)1926mtk_dai_etdm_fifo_mode(afe, dai_id, 0);1927else1928mtk_dai_etdm_fifo_mode(afe, dai_id, rate);19291930/* con1 */1931if (lrck_width > 0) {1932mask |= (ETDM_IN_CON1_LRCK_AUTO_MODE |1933ETDM_IN_CON1_LRCK_WIDTH_MASK);1934val |= FIELD_PREP(ETDM_IN_CON1_LRCK_WIDTH_MASK, lrck_width - 1);1935}1936regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);19371938mask = 0;1939val = 0;19401941/* con2 */1942if (!slave_mode) {1943mask |= ETDM_IN_CON2_UPDATE_GAP_MASK;1944if (rate == 352800 || rate == 384000)1945val |= FIELD_PREP(ETDM_IN_CON2_UPDATE_GAP_MASK, 4);1946else1947val |= FIELD_PREP(ETDM_IN_CON2_UPDATE_GAP_MASK, 3);1948}1949mask |= (ETDM_IN_CON2_MULTI_IP_2CH_MODE |1950ETDM_IN_CON2_MULTI_IP_TOTAL_CH_MASK);1951if (data_mode == MTK_DAI_ETDM_DATA_MULTI_PIN) {1952val |= ETDM_IN_CON2_MULTI_IP_2CH_MODE |1953FIELD_PREP(ETDM_IN_CON2_MULTI_IP_TOTAL_CH_MASK, channels - 1);1954}1955regmap_update_bits(afe->regmap, etdm_reg.con2, mask, val);19561957mask = 0;1958val = 0;19591960/* con3 */1961mask |= ETDM_IN_CON3_DISABLE_OUT_MASK;1962for (i = 0; i < channels; i += 2) {1963if (etdm_data->in_disable_ch[i] &&1964etdm_data->in_disable_ch[i + 1])1965val |= ETDM_IN_CON3_DISABLE_OUT(i >> 1);1966}1967if (!slave_mode) {1968mask |= ETDM_IN_CON3_FS_MASK;1969val |= FIELD_PREP(ETDM_IN_CON3_FS_MASK, get_etdm_fs_timing(rate));1970}1971regmap_update_bits(afe->regmap, etdm_reg.con3, mask, val);19721973mask = 0;1974val = 0;19751976/* con4 */1977mask |= (ETDM_IN_CON4_MASTER_LRCK_INV | ETDM_IN_CON4_MASTER_BCK_INV |1978ETDM_IN_CON4_SLAVE_LRCK_INV | ETDM_IN_CON4_SLAVE_BCK_INV);1979if (slave_mode) {1980if (etdm_data->lrck_inv)1981val |= ETDM_IN_CON4_SLAVE_LRCK_INV;1982if (etdm_data->bck_inv)1983val |= ETDM_IN_CON4_SLAVE_BCK_INV;1984} else {1985if (etdm_data->lrck_inv)1986val |= ETDM_IN_CON4_MASTER_LRCK_INV;1987if (etdm_data->bck_inv)1988val |= ETDM_IN_CON4_MASTER_BCK_INV;1989}1990regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val);19911992mask = 0;1993val = 0;19941995/* con5 */1996mask |= ETDM_IN_CON5_LR_SWAP_MASK;1997mask |= ETDM_IN_CON5_ENABLE_ODD_MASK;1998for (i = 0; i < channels; i += 2) {1999if (etdm_data->in_disable_ch[i] &&2000!etdm_data->in_disable_ch[i + 1]) {2001val |= ETDM_IN_CON5_LR_SWAP(i >> 1);2002val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1);2003} else if (!etdm_data->in_disable_ch[i] &&2004etdm_data->in_disable_ch[i + 1]) {2005val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1);2006}2007}2008regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val);2009return 0;2010}20112012static int mtk_dai_etdm_out_configure(struct mtk_base_afe *afe,2013unsigned int rate,2014unsigned int channels,2015int dai_id)2016{2017struct mt8188_afe_private *afe_priv = afe->platform_priv;2018struct mtk_dai_etdm_priv *etdm_data;2019struct etdm_con_reg etdm_reg;2020bool slave_mode;2021unsigned int lrck_width;2022unsigned int val = 0;2023unsigned int mask = 0;2024int fs = 0;2025int ret;20262027if (!is_valid_etdm_dai(dai_id))2028return -EINVAL;2029etdm_data = afe_priv->dai_priv[dai_id];2030slave_mode = etdm_data->slave_mode;2031lrck_width = etdm_data->lrck_width;20322033dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n",2034__func__, rate, channels, dai_id);20352036ret = get_etdm_reg(dai_id, &etdm_reg);2037if (ret < 0)2038return ret;20392040/* con0 */2041mask = ETDM_OUT_CON0_RELATCH_DOMAIN_MASK;2042val = FIELD_PREP(ETDM_OUT_CON0_RELATCH_DOMAIN_MASK,2043ETDM_RELATCH_TIMING_A1A2SYS);2044regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val);20452046mask = 0;2047val = 0;20482049/* con1 */2050if (lrck_width > 0) {2051mask |= (ETDM_OUT_CON1_LRCK_AUTO_MODE |2052ETDM_OUT_CON1_LRCK_WIDTH_MASK);2053val |= FIELD_PREP(ETDM_OUT_CON1_LRCK_WIDTH_MASK, lrck_width - 1);2054}2055regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);20562057mask = 0;2058val = 0;20592060if (!slave_mode) {2061/* con4 */2062mask |= ETDM_OUT_CON4_FS_MASK;2063val |= FIELD_PREP(ETDM_OUT_CON4_FS_MASK, get_etdm_fs_timing(rate));2064}20652066mask |= ETDM_OUT_CON4_RELATCH_EN_MASK;2067if (dai_id == MT8188_AFE_IO_ETDM1_OUT)2068fs = MT8188_ETDM_OUT1_1X_EN;2069else if (dai_id == MT8188_AFE_IO_ETDM2_OUT)2070fs = MT8188_ETDM_OUT2_1X_EN;20712072val |= FIELD_PREP(ETDM_OUT_CON4_RELATCH_EN_MASK, fs);20732074regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val);20752076mask = 0;2077val = 0;20782079/* con5 */2080mask |= (ETDM_OUT_CON5_MASTER_LRCK_INV | ETDM_OUT_CON5_MASTER_BCK_INV |2081ETDM_OUT_CON5_SLAVE_LRCK_INV | ETDM_OUT_CON5_SLAVE_BCK_INV);2082if (slave_mode) {2083if (etdm_data->lrck_inv)2084val |= ETDM_OUT_CON5_SLAVE_LRCK_INV;2085if (etdm_data->bck_inv)2086val |= ETDM_OUT_CON5_SLAVE_BCK_INV;2087} else {2088if (etdm_data->lrck_inv)2089val |= ETDM_OUT_CON5_MASTER_LRCK_INV;2090if (etdm_data->bck_inv)2091val |= ETDM_OUT_CON5_MASTER_BCK_INV;2092}2093regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val);20942095return 0;2096}20972098static int mtk_dai_etdm_configure(struct mtk_base_afe *afe,2099unsigned int rate,2100unsigned int channels,2101unsigned int bit_width,2102int dai_id)2103{2104struct mt8188_afe_private *afe_priv = afe->platform_priv;2105struct mtk_dai_etdm_priv *etdm_data;2106struct etdm_con_reg etdm_reg;2107bool slave_mode;2108unsigned int etdm_channels;2109unsigned int val = 0;2110unsigned int mask = 0;2111unsigned int bck;2112unsigned int wlen = get_etdm_wlen(bit_width);2113int ret;21142115if (!is_valid_etdm_dai(dai_id))2116return -EINVAL;2117etdm_data = afe_priv->dai_priv[dai_id];2118slave_mode = etdm_data->slave_mode;2119etdm_data->rate = rate;21202121ret = get_etdm_reg(dai_id, &etdm_reg);2122if (ret < 0)2123return ret;21242125dev_dbg(afe->dev, "%s fmt %u data %u lrck %d-%u bck %d, slv %u\n",2126__func__, etdm_data->format, etdm_data->data_mode,2127etdm_data->lrck_inv, etdm_data->lrck_width, etdm_data->bck_inv,2128etdm_data->slave_mode);2129dev_dbg(afe->dev, "%s rate %u channels %u bitwidth %u, id %d\n",2130__func__, rate, channels, bit_width, dai_id);21312132etdm_channels = (etdm_data->data_mode == MTK_DAI_ETDM_DATA_ONE_PIN) ?2133get_etdm_ch_fixup(channels) : 2;21342135bck = rate * etdm_channels * wlen;2136if (bck > MT8188_ETDM_NORMAL_MAX_BCK_RATE) {2137dev_err(afe->dev, "%s bck rate %u not support\n",2138__func__, bck);2139return -EINVAL;2140}21412142/* con0 */2143mask |= ETDM_CON0_BIT_LEN_MASK;2144val |= FIELD_PREP(ETDM_CON0_BIT_LEN_MASK, bit_width - 1);2145mask |= ETDM_CON0_WORD_LEN_MASK;2146val |= FIELD_PREP(ETDM_CON0_WORD_LEN_MASK, wlen - 1);2147mask |= ETDM_CON0_FORMAT_MASK;2148val |= FIELD_PREP(ETDM_CON0_FORMAT_MASK, etdm_data->format);2149mask |= ETDM_CON0_CH_NUM_MASK;2150val |= FIELD_PREP(ETDM_CON0_CH_NUM_MASK, etdm_channels - 1);21512152mask |= ETDM_CON0_SLAVE_MODE;2153if (slave_mode) {2154if (dai_id == MT8188_AFE_IO_ETDM1_OUT) {2155dev_err(afe->dev, "%s id %d only support master mode\n",2156__func__, dai_id);2157return -EINVAL;2158}2159val |= ETDM_CON0_SLAVE_MODE;2160}2161regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val);21622163if (get_etdm_dir(dai_id) == ETDM_IN)2164mtk_dai_etdm_in_configure(afe, rate, channels, dai_id);2165else2166mtk_dai_etdm_out_configure(afe, rate, channels, dai_id);21672168return 0;2169}21702171static int mtk_dai_etdm_hw_params(struct snd_pcm_substream *substream,2172struct snd_pcm_hw_params *params,2173struct snd_soc_dai *dai)2174{2175unsigned int rate = params_rate(params);2176unsigned int bit_width = params_width(params);2177unsigned int channels = params_channels(params);2178struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2179struct mt8188_afe_private *afe_priv = afe->platform_priv;2180struct mtk_dai_etdm_priv *mst_etdm_data;2181int mst_dai_id;2182int slv_dai_id;2183int ret;2184int i;21852186dev_dbg(afe->dev, "%s '%s' period %u-%u\n",2187__func__, snd_pcm_stream_str(substream),2188params_period_size(params), params_periods(params));21892190if (is_cowork_mode(dai)) {2191mst_dai_id = get_etdm_cowork_master_id(dai);2192if (!is_valid_etdm_dai(mst_dai_id))2193return -EINVAL;21942195mst_etdm_data = afe_priv->dai_priv[mst_dai_id];2196if (mst_etdm_data->slots)2197channels = mst_etdm_data->slots;21982199ret = mtk_dai_etdm_configure(afe, rate, channels,2200bit_width, mst_dai_id);2201if (ret)2202return ret;22032204for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {2205slv_dai_id = mst_etdm_data->cowork_slv_id[i];2206ret = mtk_dai_etdm_configure(afe, rate, channels,2207bit_width, slv_dai_id);2208if (ret)2209return ret;22102211ret = mt8188_etdm_sync_mode_configure(afe, slv_dai_id);2212if (ret)2213return ret;2214}2215} else {2216if (!is_valid_etdm_dai(dai->id))2217return -EINVAL;2218mst_etdm_data = afe_priv->dai_priv[dai->id];2219if (mst_etdm_data->slots)2220channels = mst_etdm_data->slots;22212222ret = mtk_dai_etdm_configure(afe, rate, channels,2223bit_width, dai->id);2224if (ret)2225return ret;2226}22272228return 0;2229}22302231static int mtk_dai_etdm_cal_mclk(struct mtk_base_afe *afe, int freq, int dai_id)2232{2233struct mt8188_afe_private *afe_priv = afe->platform_priv;2234struct mtk_dai_etdm_priv *etdm_data;2235int apll_rate;2236int apll;22372238if (!is_valid_etdm_dai(dai_id))2239return -EINVAL;2240etdm_data = afe_priv->dai_priv[dai_id];22412242if (freq == 0) {2243etdm_data->mclk_freq = freq;2244return 0;2245}22462247if (etdm_data->mclk_fixed_apll == 0)2248apll = mt8188_afe_get_default_mclk_source_by_rate(freq);2249else2250apll = etdm_data->mclk_apll;22512252apll_rate = mt8188_afe_get_mclk_source_rate(afe, apll);22532254if (freq > apll_rate) {2255dev_err(afe->dev, "freq %d > apll rate %d\n", freq, apll_rate);2256return -EINVAL;2257}22582259if (apll_rate % freq != 0) {2260dev_err(afe->dev, "APLL%d cannot generate freq Hz\n", apll);2261return -EINVAL;2262}22632264if (etdm_data->mclk_fixed_apll == 0)2265etdm_data->mclk_apll = apll;2266etdm_data->mclk_freq = freq;22672268return 0;2269}22702271static int mtk_dai_etdm_set_sysclk(struct snd_soc_dai *dai,2272int clk_id, unsigned int freq, int dir)2273{2274struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2275struct mt8188_afe_private *afe_priv = afe->platform_priv;2276struct mtk_dai_etdm_priv *etdm_data;2277int dai_id;22782279dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n",2280__func__, dai->id, freq, dir);2281if (is_cowork_mode(dai))2282dai_id = get_etdm_cowork_master_id(dai);2283else2284dai_id = dai->id;22852286if (!is_valid_etdm_dai(dai_id))2287return -EINVAL;2288etdm_data = afe_priv->dai_priv[dai_id];2289etdm_data->mclk_dir = dir;2290return mtk_dai_etdm_cal_mclk(afe, freq, dai_id);2291}22922293static int mtk_dai_etdm_set_tdm_slot(struct snd_soc_dai *dai,2294unsigned int tx_mask, unsigned int rx_mask,2295int slots, int slot_width)2296{2297struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2298struct mt8188_afe_private *afe_priv = afe->platform_priv;2299struct mtk_dai_etdm_priv *etdm_data;2300int dai_id;23012302if (is_cowork_mode(dai))2303dai_id = get_etdm_cowork_master_id(dai);2304else2305dai_id = dai->id;23062307if (!is_valid_etdm_dai(dai_id))2308return -EINVAL;2309etdm_data = afe_priv->dai_priv[dai_id];23102311dev_dbg(dai->dev, "%s id %d slot_width %d\n",2312__func__, dai->id, slot_width);23132314etdm_data->slots = slots;2315etdm_data->lrck_width = slot_width;2316return 0;2317}23182319static int mtk_dai_etdm_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)2320{2321struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2322struct mt8188_afe_private *afe_priv = afe->platform_priv;2323struct mtk_dai_etdm_priv *etdm_data;23242325if (!is_valid_etdm_dai(dai->id))2326return -EINVAL;2327etdm_data = afe_priv->dai_priv[dai->id];23282329switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {2330case SND_SOC_DAIFMT_I2S:2331etdm_data->format = MTK_DAI_ETDM_FORMAT_I2S;2332break;2333case SND_SOC_DAIFMT_LEFT_J:2334etdm_data->format = MTK_DAI_ETDM_FORMAT_LJ;2335break;2336case SND_SOC_DAIFMT_RIGHT_J:2337etdm_data->format = MTK_DAI_ETDM_FORMAT_RJ;2338break;2339case SND_SOC_DAIFMT_DSP_A:2340etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPA;2341break;2342case SND_SOC_DAIFMT_DSP_B:2343etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPB;2344break;2345default:2346return -EINVAL;2347}23482349switch (fmt & SND_SOC_DAIFMT_INV_MASK) {2350case SND_SOC_DAIFMT_NB_NF:2351etdm_data->bck_inv = false;2352etdm_data->lrck_inv = false;2353break;2354case SND_SOC_DAIFMT_NB_IF:2355etdm_data->bck_inv = false;2356etdm_data->lrck_inv = true;2357break;2358case SND_SOC_DAIFMT_IB_NF:2359etdm_data->bck_inv = true;2360etdm_data->lrck_inv = false;2361break;2362case SND_SOC_DAIFMT_IB_IF:2363etdm_data->bck_inv = true;2364etdm_data->lrck_inv = true;2365break;2366default:2367return -EINVAL;2368}23692370switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {2371case SND_SOC_DAIFMT_BC_FC:2372etdm_data->slave_mode = true;2373break;2374case SND_SOC_DAIFMT_BP_FP:2375etdm_data->slave_mode = false;2376break;2377default:2378return -EINVAL;2379}23802381return 0;2382}23832384static unsigned int mtk_dai_get_dptx_ch_en(unsigned int channel)2385{2386switch (channel) {2387case 1 ... 2:2388return AFE_DPTX_CON_CH_EN_2CH;2389case 3 ... 4:2390return AFE_DPTX_CON_CH_EN_4CH;2391case 5 ... 6:2392return AFE_DPTX_CON_CH_EN_6CH;2393case 7 ... 8:2394return AFE_DPTX_CON_CH_EN_8CH;2395default:2396return AFE_DPTX_CON_CH_EN_2CH;2397}2398}23992400static unsigned int mtk_dai_get_dptx_ch(unsigned int ch)2401{2402return (ch > 2) ?2403AFE_DPTX_CON_CH_NUM_8CH : AFE_DPTX_CON_CH_NUM_2CH;2404}24052406static unsigned int mtk_dai_get_dptx_wlen(snd_pcm_format_t format)2407{2408return snd_pcm_format_physical_width(format) <= 16 ?2409AFE_DPTX_CON_16BIT : AFE_DPTX_CON_24BIT;2410}24112412static int mtk_dai_hdmitx_dptx_hw_params(struct snd_pcm_substream *substream,2413struct snd_pcm_hw_params *params,2414struct snd_soc_dai *dai)2415{2416struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2417struct mt8188_afe_private *afe_priv = afe->platform_priv;2418struct mtk_dai_etdm_priv *etdm_data;2419unsigned int rate = params_rate(params);2420unsigned int channels = params_channels(params);2421snd_pcm_format_t format = params_format(params);2422int width = snd_pcm_format_physical_width(format);24232424if (!is_valid_etdm_dai(dai->id))2425return -EINVAL;2426etdm_data = afe_priv->dai_priv[dai->id];24272428/* dptx configure */2429if (dai->id == MT8188_AFE_IO_DPTX) {2430regmap_update_bits(afe->regmap, AFE_DPTX_CON,2431AFE_DPTX_CON_CH_EN_MASK,2432mtk_dai_get_dptx_ch_en(channels));2433regmap_update_bits(afe->regmap, AFE_DPTX_CON,2434AFE_DPTX_CON_CH_NUM_MASK,2435mtk_dai_get_dptx_ch(channels));2436regmap_update_bits(afe->regmap, AFE_DPTX_CON,2437AFE_DPTX_CON_16BIT_MASK,2438mtk_dai_get_dptx_wlen(format));24392440if (mtk_dai_get_dptx_ch(channels) == AFE_DPTX_CON_CH_NUM_8CH) {2441etdm_data->data_mode = MTK_DAI_ETDM_DATA_ONE_PIN;2442channels = 8;2443} else {2444channels = 2;2445}2446} else {2447etdm_data->data_mode = MTK_DAI_ETDM_DATA_MULTI_PIN;2448}24492450return mtk_dai_etdm_configure(afe, rate, channels, width, dai->id);2451}24522453static int mtk_dai_hdmitx_dptx_set_sysclk(struct snd_soc_dai *dai,2454int clk_id,2455unsigned int freq,2456int dir)2457{2458struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2459struct mt8188_afe_private *afe_priv = afe->platform_priv;2460struct mtk_dai_etdm_priv *etdm_data;24612462if (!is_valid_etdm_dai(dai->id))2463return -EINVAL;2464etdm_data = afe_priv->dai_priv[dai->id];24652466dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n",2467__func__, dai->id, freq, dir);24682469etdm_data->mclk_dir = dir;2470return mtk_dai_etdm_cal_mclk(afe, freq, dai->id);2471}24722473static const struct snd_soc_dai_ops mtk_dai_etdm_ops = {2474.hw_params = mtk_dai_etdm_hw_params,2475.set_sysclk = mtk_dai_etdm_set_sysclk,2476.set_fmt = mtk_dai_etdm_set_fmt,2477.set_tdm_slot = mtk_dai_etdm_set_tdm_slot,2478};24792480static const struct snd_soc_dai_ops mtk_dai_hdmitx_dptx_ops = {2481.hw_params = mtk_dai_hdmitx_dptx_hw_params,2482.set_sysclk = mtk_dai_hdmitx_dptx_set_sysclk,2483.set_fmt = mtk_dai_etdm_set_fmt,2484};24852486/* dai driver */2487#define MTK_ETDM_RATES (SNDRV_PCM_RATE_8000_192000)24882489#define MTK_ETDM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\2490SNDRV_PCM_FMTBIT_S24_LE |\2491SNDRV_PCM_FMTBIT_S32_LE)24922493static struct snd_soc_dai_driver mtk_dai_etdm_driver[] = {2494{2495.name = "DPTX",2496.id = MT8188_AFE_IO_DPTX,2497.playback = {2498.stream_name = "DPTX",2499.channels_min = 1,2500.channels_max = 8,2501.rates = MTK_ETDM_RATES,2502.formats = MTK_ETDM_FORMATS,2503},2504.ops = &mtk_dai_hdmitx_dptx_ops,2505},2506{2507.name = "ETDM1_IN",2508.id = MT8188_AFE_IO_ETDM1_IN,2509.capture = {2510.stream_name = "ETDM1_IN",2511.channels_min = 1,2512.channels_max = 16,2513.rates = MTK_ETDM_RATES,2514.formats = MTK_ETDM_FORMATS,2515},2516.ops = &mtk_dai_etdm_ops,2517},2518{2519.name = "ETDM2_IN",2520.id = MT8188_AFE_IO_ETDM2_IN,2521.capture = {2522.stream_name = "ETDM2_IN",2523.channels_min = 1,2524.channels_max = 16,2525.rates = MTK_ETDM_RATES,2526.formats = MTK_ETDM_FORMATS,2527},2528.ops = &mtk_dai_etdm_ops,2529},2530{2531.name = "ETDM1_OUT",2532.id = MT8188_AFE_IO_ETDM1_OUT,2533.playback = {2534.stream_name = "ETDM1_OUT",2535.channels_min = 1,2536.channels_max = 16,2537.rates = MTK_ETDM_RATES,2538.formats = MTK_ETDM_FORMATS,2539},2540.ops = &mtk_dai_etdm_ops,2541},2542{2543.name = "ETDM2_OUT",2544.id = MT8188_AFE_IO_ETDM2_OUT,2545.playback = {2546.stream_name = "ETDM2_OUT",2547.channels_min = 1,2548.channels_max = 16,2549.rates = MTK_ETDM_RATES,2550.formats = MTK_ETDM_FORMATS,2551},2552.ops = &mtk_dai_etdm_ops,2553},2554{2555.name = "ETDM3_OUT",2556.id = MT8188_AFE_IO_ETDM3_OUT,2557.playback = {2558.stream_name = "ETDM3_OUT",2559.channels_min = 1,2560.channels_max = 8,2561.rates = MTK_ETDM_RATES,2562.formats = MTK_ETDM_FORMATS,2563},2564.ops = &mtk_dai_hdmitx_dptx_ops,2565},2566};25672568static void mt8188_etdm_update_sync_info(struct mtk_base_afe *afe)2569{2570struct mt8188_afe_private *afe_priv = afe->platform_priv;2571struct mtk_dai_etdm_priv *etdm_data;2572struct mtk_dai_etdm_priv *mst_data;2573int mst_dai_id;2574int i;25752576for (i = MT8188_AFE_IO_ETDM_START; i < MT8188_AFE_IO_ETDM_END; i++) {2577etdm_data = afe_priv->dai_priv[i];2578if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) {2579mst_dai_id = etdm_data->cowork_source_id;2580mst_data = afe_priv->dai_priv[mst_dai_id];2581if (mst_data->cowork_source_id != COWORK_ETDM_NONE)2582dev_err(afe->dev, "%s [%d] wrong sync source\n",2583__func__, i);2584mst_data->cowork_slv_id[mst_data->cowork_slv_count] = i;2585mst_data->cowork_slv_count++;2586}2587}2588}25892590static void mt8188_dai_etdm_parse_of(struct mtk_base_afe *afe)2591{2592const struct device_node *of_node = afe->dev->of_node;2593struct mt8188_afe_private *afe_priv = afe->platform_priv;2594struct mtk_dai_etdm_priv *etdm_data;2595char prop[48];2596u8 disable_chn[MT8188_ETDM_MAX_CHANNELS];2597int max_chn = MT8188_ETDM_MAX_CHANNELS;2598unsigned int sync_id;2599u32 sel;2600int ret;2601int dai_id;2602int i, j;2603struct {2604const char *name;2605const unsigned int sync_id;2606} of_afe_etdms[MT8188_AFE_IO_ETDM_NUM] = {2607{"etdm-in1", ETDM_SYNC_FROM_IN1},2608{"etdm-in2", ETDM_SYNC_FROM_IN2},2609{"etdm-out1", ETDM_SYNC_FROM_OUT1},2610{"etdm-out2", ETDM_SYNC_FROM_OUT2},2611{"etdm-out3", ETDM_SYNC_FROM_OUT3},2612};26132614for (i = 0; i < MT8188_AFE_IO_ETDM_NUM; i++) {2615dai_id = ETDM_TO_DAI_ID(i);2616etdm_data = afe_priv->dai_priv[dai_id];26172618snprintf(prop, sizeof(prop), "mediatek,%s-multi-pin-mode",2619of_afe_etdms[i].name);26202621etdm_data->data_mode = of_property_read_bool(of_node, prop);26222623snprintf(prop, sizeof(prop), "mediatek,%s-cowork-source",2624of_afe_etdms[i].name);26252626ret = of_property_read_u32(of_node, prop, &sel);2627if (ret == 0) {2628if (sel >= MT8188_AFE_IO_ETDM_NUM) {2629dev_err(afe->dev, "%s invalid id=%d\n",2630__func__, sel);2631etdm_data->cowork_source_id = COWORK_ETDM_NONE;2632} else {2633sync_id = of_afe_etdms[sel].sync_id;2634etdm_data->cowork_source_id =2635sync_to_dai_id(sync_id);2636}2637} else {2638etdm_data->cowork_source_id = COWORK_ETDM_NONE;2639}2640}26412642/* etdm in only */2643for (i = 0; i < 2; i++) {2644dai_id = ETDM_TO_DAI_ID(i);2645etdm_data = afe_priv->dai_priv[dai_id];26462647snprintf(prop, sizeof(prop), "mediatek,%s-chn-disabled",2648of_afe_etdms[i].name);26492650ret = of_property_read_variable_u8_array(of_node, prop,2651disable_chn,26521, max_chn);2653if (ret < 0)2654continue;26552656for (j = 0; j < ret; j++) {2657if (disable_chn[j] >= MT8188_ETDM_MAX_CHANNELS)2658dev_err(afe->dev, "%s [%d] invalid chn %u\n",2659__func__, j, disable_chn[j]);2660else2661etdm_data->in_disable_ch[disable_chn[j]] = true;2662}2663}2664mt8188_etdm_update_sync_info(afe);2665}26662667static int init_etdm_priv_data(struct mtk_base_afe *afe)2668{2669struct mt8188_afe_private *afe_priv = afe->platform_priv;2670struct mtk_dai_etdm_priv *etdm_priv;2671int i;26722673for (i = MT8188_AFE_IO_ETDM_START; i < MT8188_AFE_IO_ETDM_END; i++) {2674etdm_priv = devm_kzalloc(afe->dev,2675sizeof(struct mtk_dai_etdm_priv),2676GFP_KERNEL);2677if (!etdm_priv)2678return -ENOMEM;26792680afe_priv->dai_priv[i] = etdm_priv;2681}26822683afe_priv->dai_priv[MT8188_AFE_IO_DPTX] =2684afe_priv->dai_priv[MT8188_AFE_IO_ETDM3_OUT];26852686mt8188_dai_etdm_parse_of(afe);2687return 0;2688}26892690int mt8188_dai_etdm_register(struct mtk_base_afe *afe)2691{2692struct mtk_base_afe_dai *dai;26932694dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);2695if (!dai)2696return -ENOMEM;26972698list_add(&dai->list, &afe->sub_dais);26992700dai->dai_drivers = mtk_dai_etdm_driver;2701dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_etdm_driver);27022703dai->dapm_widgets = mtk_dai_etdm_widgets;2704dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_etdm_widgets);2705dai->dapm_routes = mtk_dai_etdm_routes;2706dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_etdm_routes);2707dai->controls = mtk_dai_etdm_controls;2708dai->num_controls = ARRAY_SIZE(mtk_dai_etdm_controls);27092710return init_etdm_priv_data(afe);2711}271227132714