Path: blob/master/sound/soc/mediatek/mt8188/mt8188-dai-etdm.c
26488 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 =1064snd_soc_kcontrol_component(kcontrol);1065struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);1066unsigned int value;1067unsigned int reg;1068unsigned int mask;1069unsigned int shift;10701071if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) {1072reg = ETDM_OUT1_CON4;1073mask = ETDM_OUT_CON4_CLOCK_MASK;1074shift = ETDM_OUT_CON4_CLOCK_SHIFT;1075} else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) {1076reg = ETDM_OUT2_CON4;1077mask = ETDM_OUT_CON4_CLOCK_MASK;1078shift = ETDM_OUT_CON4_CLOCK_SHIFT;1079} else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) {1080reg = ETDM_OUT3_CON4;1081mask = ETDM_OUT_CON4_CLOCK_MASK;1082shift = ETDM_OUT_CON4_CLOCK_SHIFT;1083} else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) {1084reg = ETDM_IN1_CON2;1085mask = ETDM_IN_CON2_CLOCK_MASK;1086shift = ETDM_IN_CON2_CLOCK_SHIFT;1087} else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) {1088reg = ETDM_IN2_CON2;1089mask = ETDM_IN_CON2_CLOCK_MASK;1090shift = ETDM_IN_CON2_CLOCK_SHIFT;1091} else {1092return -EINVAL;1093}10941095regmap_read(afe->regmap, reg, &value);10961097value &= mask;1098value >>= shift;1099ucontrol->value.enumerated.item[0] = value;1100return 0;1101}11021103static const struct snd_kcontrol_new mtk_dai_etdm_controls[] = {1104SOC_ENUM_EXT("ETDM_OUT1_Clock_Source", etdmout_clk_src_enum,1105mt8188_etdm_clk_src_sel_get,1106mt8188_etdm_clk_src_sel_put),1107SOC_ENUM_EXT("ETDM_OUT2_Clock_Source", etdmout_clk_src_enum,1108mt8188_etdm_clk_src_sel_get,1109mt8188_etdm_clk_src_sel_put),1110SOC_ENUM_EXT("ETDM_OUT3_Clock_Source", etdmout_clk_src_enum,1111mt8188_etdm_clk_src_sel_get,1112mt8188_etdm_clk_src_sel_put),1113SOC_ENUM_EXT("ETDM_IN1_Clock_Source", etdmout_clk_src_enum,1114mt8188_etdm_clk_src_sel_get,1115mt8188_etdm_clk_src_sel_put),1116SOC_ENUM_EXT("ETDM_IN2_Clock_Source", etdmout_clk_src_enum,1117mt8188_etdm_clk_src_sel_get,1118mt8188_etdm_clk_src_sel_put),1119};11201121static const struct snd_soc_dapm_widget mtk_dai_etdm_widgets[] = {1122/* eTDM_IN2 */1123SND_SOC_DAPM_MIXER("I012", SND_SOC_NOPM, 0, 0, NULL, 0),1124SND_SOC_DAPM_MIXER("I013", SND_SOC_NOPM, 0, 0, NULL, 0),1125SND_SOC_DAPM_MIXER("I014", SND_SOC_NOPM, 0, 0, NULL, 0),1126SND_SOC_DAPM_MIXER("I015", SND_SOC_NOPM, 0, 0, NULL, 0),1127SND_SOC_DAPM_MIXER("I016", SND_SOC_NOPM, 0, 0, NULL, 0),1128SND_SOC_DAPM_MIXER("I017", SND_SOC_NOPM, 0, 0, NULL, 0),1129SND_SOC_DAPM_MIXER("I018", SND_SOC_NOPM, 0, 0, NULL, 0),1130SND_SOC_DAPM_MIXER("I019", SND_SOC_NOPM, 0, 0, NULL, 0),1131SND_SOC_DAPM_MIXER("I188", SND_SOC_NOPM, 0, 0, NULL, 0),1132SND_SOC_DAPM_MIXER("I189", SND_SOC_NOPM, 0, 0, NULL, 0),1133SND_SOC_DAPM_MIXER("I190", SND_SOC_NOPM, 0, 0, NULL, 0),1134SND_SOC_DAPM_MIXER("I191", SND_SOC_NOPM, 0, 0, NULL, 0),1135SND_SOC_DAPM_MIXER("I192", SND_SOC_NOPM, 0, 0, NULL, 0),1136SND_SOC_DAPM_MIXER("I193", SND_SOC_NOPM, 0, 0, NULL, 0),1137SND_SOC_DAPM_MIXER("I194", SND_SOC_NOPM, 0, 0, NULL, 0),1138SND_SOC_DAPM_MIXER("I195", SND_SOC_NOPM, 0, 0, NULL, 0),11391140/* eTDM_IN1 */1141SND_SOC_DAPM_MIXER("I072", SND_SOC_NOPM, 0, 0, NULL, 0),1142SND_SOC_DAPM_MIXER("I073", SND_SOC_NOPM, 0, 0, NULL, 0),1143SND_SOC_DAPM_MIXER("I074", SND_SOC_NOPM, 0, 0, NULL, 0),1144SND_SOC_DAPM_MIXER("I075", SND_SOC_NOPM, 0, 0, NULL, 0),1145SND_SOC_DAPM_MIXER("I076", SND_SOC_NOPM, 0, 0, NULL, 0),1146SND_SOC_DAPM_MIXER("I077", SND_SOC_NOPM, 0, 0, NULL, 0),1147SND_SOC_DAPM_MIXER("I078", SND_SOC_NOPM, 0, 0, NULL, 0),1148SND_SOC_DAPM_MIXER("I079", SND_SOC_NOPM, 0, 0, NULL, 0),1149SND_SOC_DAPM_MIXER("I080", SND_SOC_NOPM, 0, 0, NULL, 0),1150SND_SOC_DAPM_MIXER("I081", SND_SOC_NOPM, 0, 0, NULL, 0),1151SND_SOC_DAPM_MIXER("I082", SND_SOC_NOPM, 0, 0, NULL, 0),1152SND_SOC_DAPM_MIXER("I083", SND_SOC_NOPM, 0, 0, NULL, 0),1153SND_SOC_DAPM_MIXER("I084", SND_SOC_NOPM, 0, 0, NULL, 0),1154SND_SOC_DAPM_MIXER("I085", SND_SOC_NOPM, 0, 0, NULL, 0),1155SND_SOC_DAPM_MIXER("I086", SND_SOC_NOPM, 0, 0, NULL, 0),1156SND_SOC_DAPM_MIXER("I087", SND_SOC_NOPM, 0, 0, NULL, 0),11571158/* eTDM_OUT2 */1159SND_SOC_DAPM_MIXER("O048", SND_SOC_NOPM, 0, 0,1160mtk_dai_etdm_o048_mix, ARRAY_SIZE(mtk_dai_etdm_o048_mix)),1161SND_SOC_DAPM_MIXER("O049", SND_SOC_NOPM, 0, 0,1162mtk_dai_etdm_o049_mix, ARRAY_SIZE(mtk_dai_etdm_o049_mix)),1163SND_SOC_DAPM_MIXER("O050", SND_SOC_NOPM, 0, 0,1164mtk_dai_etdm_o050_mix, ARRAY_SIZE(mtk_dai_etdm_o050_mix)),1165SND_SOC_DAPM_MIXER("O051", SND_SOC_NOPM, 0, 0,1166mtk_dai_etdm_o051_mix, ARRAY_SIZE(mtk_dai_etdm_o051_mix)),1167SND_SOC_DAPM_MIXER("O052", SND_SOC_NOPM, 0, 0,1168mtk_dai_etdm_o052_mix, ARRAY_SIZE(mtk_dai_etdm_o052_mix)),1169SND_SOC_DAPM_MIXER("O053", SND_SOC_NOPM, 0, 0,1170mtk_dai_etdm_o053_mix, ARRAY_SIZE(mtk_dai_etdm_o053_mix)),1171SND_SOC_DAPM_MIXER("O054", SND_SOC_NOPM, 0, 0,1172mtk_dai_etdm_o054_mix, ARRAY_SIZE(mtk_dai_etdm_o054_mix)),1173SND_SOC_DAPM_MIXER("O055", SND_SOC_NOPM, 0, 0,1174mtk_dai_etdm_o055_mix, ARRAY_SIZE(mtk_dai_etdm_o055_mix)),1175SND_SOC_DAPM_MIXER("O056", SND_SOC_NOPM, 0, 0,1176mtk_dai_etdm_o056_mix, ARRAY_SIZE(mtk_dai_etdm_o056_mix)),1177SND_SOC_DAPM_MIXER("O057", SND_SOC_NOPM, 0, 0,1178mtk_dai_etdm_o057_mix, ARRAY_SIZE(mtk_dai_etdm_o057_mix)),1179SND_SOC_DAPM_MIXER("O058", SND_SOC_NOPM, 0, 0,1180mtk_dai_etdm_o058_mix, ARRAY_SIZE(mtk_dai_etdm_o058_mix)),1181SND_SOC_DAPM_MIXER("O059", SND_SOC_NOPM, 0, 0,1182mtk_dai_etdm_o059_mix, ARRAY_SIZE(mtk_dai_etdm_o059_mix)),1183SND_SOC_DAPM_MIXER("O060", SND_SOC_NOPM, 0, 0,1184mtk_dai_etdm_o060_mix, ARRAY_SIZE(mtk_dai_etdm_o060_mix)),1185SND_SOC_DAPM_MIXER("O061", SND_SOC_NOPM, 0, 0,1186mtk_dai_etdm_o061_mix, ARRAY_SIZE(mtk_dai_etdm_o061_mix)),1187SND_SOC_DAPM_MIXER("O062", SND_SOC_NOPM, 0, 0,1188mtk_dai_etdm_o062_mix, ARRAY_SIZE(mtk_dai_etdm_o062_mix)),1189SND_SOC_DAPM_MIXER("O063", SND_SOC_NOPM, 0, 0,1190mtk_dai_etdm_o063_mix, ARRAY_SIZE(mtk_dai_etdm_o063_mix)),11911192/* eTDM_OUT1 */1193SND_SOC_DAPM_MIXER("O072", SND_SOC_NOPM, 0, 0,1194mtk_dai_etdm_o072_mix, ARRAY_SIZE(mtk_dai_etdm_o072_mix)),1195SND_SOC_DAPM_MIXER("O073", SND_SOC_NOPM, 0, 0,1196mtk_dai_etdm_o073_mix, ARRAY_SIZE(mtk_dai_etdm_o073_mix)),1197SND_SOC_DAPM_MIXER("O074", SND_SOC_NOPM, 0, 0,1198mtk_dai_etdm_o074_mix, ARRAY_SIZE(mtk_dai_etdm_o074_mix)),1199SND_SOC_DAPM_MIXER("O075", SND_SOC_NOPM, 0, 0,1200mtk_dai_etdm_o075_mix, ARRAY_SIZE(mtk_dai_etdm_o075_mix)),1201SND_SOC_DAPM_MIXER("O076", SND_SOC_NOPM, 0, 0,1202mtk_dai_etdm_o076_mix, ARRAY_SIZE(mtk_dai_etdm_o076_mix)),1203SND_SOC_DAPM_MIXER("O077", SND_SOC_NOPM, 0, 0,1204mtk_dai_etdm_o077_mix, ARRAY_SIZE(mtk_dai_etdm_o077_mix)),1205SND_SOC_DAPM_MIXER("O078", SND_SOC_NOPM, 0, 0,1206mtk_dai_etdm_o078_mix, ARRAY_SIZE(mtk_dai_etdm_o078_mix)),1207SND_SOC_DAPM_MIXER("O079", SND_SOC_NOPM, 0, 0,1208mtk_dai_etdm_o079_mix, ARRAY_SIZE(mtk_dai_etdm_o079_mix)),1209SND_SOC_DAPM_MIXER("O080", SND_SOC_NOPM, 0, 0,1210mtk_dai_etdm_o080_mix, ARRAY_SIZE(mtk_dai_etdm_o080_mix)),1211SND_SOC_DAPM_MIXER("O081", SND_SOC_NOPM, 0, 0,1212mtk_dai_etdm_o081_mix, ARRAY_SIZE(mtk_dai_etdm_o081_mix)),1213SND_SOC_DAPM_MIXER("O082", SND_SOC_NOPM, 0, 0,1214mtk_dai_etdm_o082_mix, ARRAY_SIZE(mtk_dai_etdm_o082_mix)),1215SND_SOC_DAPM_MIXER("O083", SND_SOC_NOPM, 0, 0,1216mtk_dai_etdm_o083_mix, ARRAY_SIZE(mtk_dai_etdm_o083_mix)),1217SND_SOC_DAPM_MIXER("O084", SND_SOC_NOPM, 0, 0,1218mtk_dai_etdm_o084_mix, ARRAY_SIZE(mtk_dai_etdm_o084_mix)),1219SND_SOC_DAPM_MIXER("O085", SND_SOC_NOPM, 0, 0,1220mtk_dai_etdm_o085_mix, ARRAY_SIZE(mtk_dai_etdm_o085_mix)),1221SND_SOC_DAPM_MIXER("O086", SND_SOC_NOPM, 0, 0,1222mtk_dai_etdm_o086_mix, ARRAY_SIZE(mtk_dai_etdm_o086_mix)),1223SND_SOC_DAPM_MIXER("O087", SND_SOC_NOPM, 0, 0,1224mtk_dai_etdm_o087_mix, ARRAY_SIZE(mtk_dai_etdm_o087_mix)),12251226/* eTDM_OUT3 */1227SND_SOC_DAPM_MUX("HDMI_OUT_MUX", SND_SOC_NOPM, 0, 0,1228&hdmi_out_mux_control),1229SND_SOC_DAPM_MUX("DPTX_OUT_MUX", SND_SOC_NOPM, 0, 0,1230&dptx_out_mux_control),12311232SND_SOC_DAPM_MUX("HDMI_CH0_MUX", SND_SOC_NOPM, 0, 0,1233&hdmi_ch0_mux_control),1234SND_SOC_DAPM_MUX("HDMI_CH1_MUX", SND_SOC_NOPM, 0, 0,1235&hdmi_ch1_mux_control),1236SND_SOC_DAPM_MUX("HDMI_CH2_MUX", SND_SOC_NOPM, 0, 0,1237&hdmi_ch2_mux_control),1238SND_SOC_DAPM_MUX("HDMI_CH3_MUX", SND_SOC_NOPM, 0, 0,1239&hdmi_ch3_mux_control),1240SND_SOC_DAPM_MUX("HDMI_CH4_MUX", SND_SOC_NOPM, 0, 0,1241&hdmi_ch4_mux_control),1242SND_SOC_DAPM_MUX("HDMI_CH5_MUX", SND_SOC_NOPM, 0, 0,1243&hdmi_ch5_mux_control),1244SND_SOC_DAPM_MUX("HDMI_CH6_MUX", SND_SOC_NOPM, 0, 0,1245&hdmi_ch6_mux_control),1246SND_SOC_DAPM_MUX("HDMI_CH7_MUX", SND_SOC_NOPM, 0, 0,1247&hdmi_ch7_mux_control),12481249/* mclk en */1250SND_SOC_DAPM_SUPPLY_S("ETDM1_IN_MCLK", SUPPLY_SEQ_ETDM_MCLK,1251SND_SOC_NOPM, 0, 0,1252mtk_etdm_mclk_event,1253SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),1254SND_SOC_DAPM_SUPPLY_S("ETDM2_IN_MCLK", SUPPLY_SEQ_ETDM_MCLK,1255SND_SOC_NOPM, 0, 0,1256mtk_etdm_mclk_event,1257SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),1258SND_SOC_DAPM_SUPPLY_S("ETDM1_OUT_MCLK", SUPPLY_SEQ_ETDM_MCLK,1259SND_SOC_NOPM, 0, 0,1260mtk_etdm_mclk_event,1261SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),1262SND_SOC_DAPM_SUPPLY_S("ETDM2_OUT_MCLK", SUPPLY_SEQ_ETDM_MCLK,1263SND_SOC_NOPM, 0, 0,1264mtk_etdm_mclk_event,1265SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),1266SND_SOC_DAPM_SUPPLY_S("DPTX_MCLK", SUPPLY_SEQ_ETDM_MCLK,1267SND_SOC_NOPM, 0, 0,1268mtk_dptx_mclk_event,1269SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),12701271/* cg */1272SND_SOC_DAPM_SUPPLY_S("ETDM1_IN_CG", SUPPLY_SEQ_ETDM_CG,1273SND_SOC_NOPM, 0, 0,1274mtk_etdm_cg_event,1275SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),1276SND_SOC_DAPM_SUPPLY_S("ETDM2_IN_CG", SUPPLY_SEQ_ETDM_CG,1277SND_SOC_NOPM, 0, 0,1278mtk_etdm_cg_event,1279SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),1280SND_SOC_DAPM_SUPPLY_S("ETDM1_OUT_CG", SUPPLY_SEQ_ETDM_CG,1281SND_SOC_NOPM, 0, 0,1282mtk_etdm_cg_event,1283SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),1284SND_SOC_DAPM_SUPPLY_S("ETDM2_OUT_CG", SUPPLY_SEQ_ETDM_CG,1285SND_SOC_NOPM, 0, 0,1286mtk_etdm_cg_event,1287SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),1288SND_SOC_DAPM_SUPPLY_S("ETDM3_OUT_CG", SUPPLY_SEQ_ETDM_CG,1289SND_SOC_NOPM, 0, 0,1290mtk_etdm3_cg_event,1291SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),12921293/* en */1294SND_SOC_DAPM_SUPPLY_S("ETDM1_IN_EN", SUPPLY_SEQ_ETDM_EN,1295ETDM_IN1_CON0, ETDM_CON0_EN_SHIFT, 0, NULL, 0),1296SND_SOC_DAPM_SUPPLY_S("ETDM2_IN_EN", SUPPLY_SEQ_ETDM_EN,1297ETDM_IN2_CON0, ETDM_CON0_EN_SHIFT, 0, NULL, 0),1298SND_SOC_DAPM_SUPPLY_S("ETDM1_OUT_EN", SUPPLY_SEQ_ETDM_EN,1299ETDM_OUT1_CON0, ETDM_CON0_EN_SHIFT, 0, NULL, 0),1300SND_SOC_DAPM_SUPPLY_S("ETDM2_OUT_EN", SUPPLY_SEQ_ETDM_EN,1301ETDM_OUT2_CON0, ETDM_CON0_EN_SHIFT, 0, NULL, 0),1302SND_SOC_DAPM_SUPPLY_S("ETDM3_OUT_EN", SUPPLY_SEQ_ETDM_EN,1303ETDM_OUT3_CON0, ETDM_CON0_EN_SHIFT, 0, NULL, 0),1304SND_SOC_DAPM_SUPPLY_S("DPTX_EN", SUPPLY_SEQ_DPTX_EN,1305AFE_DPTX_CON, AFE_DPTX_CON_ON_SHIFT, 0, NULL, 0),13061307/* apll */1308SND_SOC_DAPM_SUPPLY_S(APLL1_W_NAME, SUPPLY_SEQ_APLL,1309SND_SOC_NOPM, 0, 0,1310mtk_apll_event,1311SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),1312SND_SOC_DAPM_SUPPLY_S(APLL2_W_NAME, SUPPLY_SEQ_APLL,1313SND_SOC_NOPM, 0, 0,1314mtk_apll_event,1315SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),13161317SND_SOC_DAPM_INPUT("ETDM_INPUT"),1318SND_SOC_DAPM_OUTPUT("ETDM_OUTPUT"),1319};13201321static const struct snd_soc_dapm_route mtk_dai_etdm_routes[] = {1322/* mclk */1323{"ETDM1_IN", NULL, "ETDM1_IN_MCLK", mtk_etdm_mclk_connect},1324{"ETDM1_IN", NULL, "ETDM2_IN_MCLK", mtk_etdm_mclk_connect},1325{"ETDM1_IN", NULL, "ETDM1_OUT_MCLK", mtk_etdm_mclk_connect},1326{"ETDM1_IN", NULL, "ETDM2_OUT_MCLK", mtk_etdm_mclk_connect},13271328{"ETDM2_IN", NULL, "ETDM1_IN_MCLK", mtk_etdm_mclk_connect},1329{"ETDM2_IN", NULL, "ETDM2_IN_MCLK", mtk_etdm_mclk_connect},1330{"ETDM2_IN", NULL, "ETDM1_OUT_MCLK", mtk_etdm_mclk_connect},1331{"ETDM2_IN", NULL, "ETDM2_OUT_MCLK", mtk_etdm_mclk_connect},13321333{"ETDM1_OUT", NULL, "ETDM1_IN_MCLK", mtk_etdm_mclk_connect},1334{"ETDM1_OUT", NULL, "ETDM2_IN_MCLK", mtk_etdm_mclk_connect},1335{"ETDM1_OUT", NULL, "ETDM1_OUT_MCLK", mtk_etdm_mclk_connect},1336{"ETDM1_OUT", NULL, "ETDM2_OUT_MCLK", mtk_etdm_mclk_connect},13371338{"ETDM2_OUT", NULL, "ETDM1_IN_MCLK", mtk_etdm_mclk_connect},1339{"ETDM2_OUT", NULL, "ETDM2_IN_MCLK", mtk_etdm_mclk_connect},1340{"ETDM2_OUT", NULL, "ETDM1_OUT_MCLK", mtk_etdm_mclk_connect},1341{"ETDM2_OUT", NULL, "ETDM2_OUT_MCLK", mtk_etdm_mclk_connect},13421343{"DPTX", NULL, "DPTX_MCLK"},13441345{"ETDM1_IN_MCLK", NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},1346{"ETDM1_IN_MCLK", NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},13471348{"ETDM2_IN_MCLK", NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},1349{"ETDM2_IN_MCLK", NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},13501351{"ETDM1_OUT_MCLK", NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},1352{"ETDM1_OUT_MCLK", NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},13531354{"ETDM2_OUT_MCLK", NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},1355{"ETDM2_OUT_MCLK", NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},13561357{"DPTX_MCLK", NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},1358{"DPTX_MCLK", NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},13591360/* cg */1361{"ETDM1_IN", NULL, "ETDM1_IN_CG"},1362{"ETDM1_IN", NULL, "ETDM2_IN_CG", mtk_etdm_cowork_connect},1363{"ETDM1_IN", NULL, "ETDM1_OUT_CG", mtk_etdm_cowork_connect},1364{"ETDM1_IN", NULL, "ETDM2_OUT_CG", mtk_etdm_cowork_connect},13651366{"ETDM2_IN", NULL, "ETDM1_IN_CG", mtk_etdm_cowork_connect},1367{"ETDM2_IN", NULL, "ETDM2_IN_CG"},1368{"ETDM2_IN", NULL, "ETDM1_OUT_CG", mtk_etdm_cowork_connect},1369{"ETDM2_IN", NULL, "ETDM2_OUT_CG", mtk_etdm_cowork_connect},13701371{"ETDM1_OUT", NULL, "ETDM1_IN_CG", mtk_etdm_cowork_connect},1372{"ETDM1_OUT", NULL, "ETDM2_IN_CG", mtk_etdm_cowork_connect},1373{"ETDM1_OUT", NULL, "ETDM1_OUT_CG"},1374{"ETDM1_OUT", NULL, "ETDM2_OUT_CG", mtk_etdm_cowork_connect},13751376{"ETDM2_OUT", NULL, "ETDM1_IN_CG", mtk_etdm_cowork_connect},1377{"ETDM2_OUT", NULL, "ETDM2_IN_CG", mtk_etdm_cowork_connect},1378{"ETDM2_OUT", NULL, "ETDM1_OUT_CG", mtk_etdm_cowork_connect},1379{"ETDM2_OUT", NULL, "ETDM2_OUT_CG"},13801381{"ETDM3_OUT", NULL, "ETDM3_OUT_CG"},1382{"DPTX", NULL, "ETDM3_OUT_CG"},13831384/* en */1385{"ETDM1_IN", NULL, "ETDM1_IN_EN"},1386{"ETDM1_IN", NULL, "ETDM2_IN_EN", mtk_etdm_cowork_connect},1387{"ETDM1_IN", NULL, "ETDM1_OUT_EN", mtk_etdm_cowork_connect},1388{"ETDM1_IN", NULL, "ETDM2_OUT_EN", mtk_etdm_cowork_connect},13891390{"ETDM2_IN", NULL, "ETDM1_IN_EN", mtk_etdm_cowork_connect},1391{"ETDM2_IN", NULL, "ETDM2_IN_EN"},1392{"ETDM2_IN", NULL, "ETDM1_OUT_EN", mtk_etdm_cowork_connect},1393{"ETDM2_IN", NULL, "ETDM2_OUT_EN", mtk_etdm_cowork_connect},13941395{"ETDM1_OUT", NULL, "ETDM1_IN_EN", mtk_etdm_cowork_connect},1396{"ETDM1_OUT", NULL, "ETDM2_IN_EN", mtk_etdm_cowork_connect},1397{"ETDM1_OUT", NULL, "ETDM1_OUT_EN"},1398{"ETDM1_OUT", NULL, "ETDM2_OUT_EN", mtk_etdm_cowork_connect},13991400{"ETDM2_OUT", NULL, "ETDM1_IN_EN", mtk_etdm_cowork_connect},1401{"ETDM2_OUT", NULL, "ETDM2_IN_EN", mtk_etdm_cowork_connect},1402{"ETDM2_OUT", NULL, "ETDM1_OUT_EN", mtk_etdm_cowork_connect},1403{"ETDM2_OUT", NULL, "ETDM2_OUT_EN"},14041405{"ETDM3_OUT", NULL, "ETDM3_OUT_EN"},1406{"DPTX", NULL, "ETDM3_OUT_EN"},1407{"DPTX", NULL, "DPTX_EN"},14081409{"ETDM1_IN_EN", NULL, APLL1_W_NAME, mtk_afe_etdm_apll_connect},1410{"ETDM1_IN_EN", NULL, APLL2_W_NAME, mtk_afe_etdm_apll_connect},14111412{"ETDM2_IN_EN", NULL, APLL1_W_NAME, mtk_afe_etdm_apll_connect},1413{"ETDM2_IN_EN", NULL, APLL2_W_NAME, mtk_afe_etdm_apll_connect},14141415{"ETDM1_OUT_EN", NULL, APLL1_W_NAME, mtk_afe_etdm_apll_connect},1416{"ETDM1_OUT_EN", NULL, APLL2_W_NAME, mtk_afe_etdm_apll_connect},14171418{"ETDM2_OUT_EN", NULL, APLL1_W_NAME, mtk_afe_etdm_apll_connect},1419{"ETDM2_OUT_EN", NULL, APLL2_W_NAME, mtk_afe_etdm_apll_connect},14201421{"ETDM3_OUT_EN", NULL, APLL1_W_NAME, mtk_afe_etdm_apll_connect},1422{"ETDM3_OUT_EN", NULL, APLL2_W_NAME, mtk_afe_etdm_apll_connect},14231424{"I012", NULL, "ETDM2_IN"},1425{"I013", NULL, "ETDM2_IN"},1426{"I014", NULL, "ETDM2_IN"},1427{"I015", NULL, "ETDM2_IN"},1428{"I016", NULL, "ETDM2_IN"},1429{"I017", NULL, "ETDM2_IN"},1430{"I018", NULL, "ETDM2_IN"},1431{"I019", NULL, "ETDM2_IN"},1432{"I188", NULL, "ETDM2_IN"},1433{"I189", NULL, "ETDM2_IN"},1434{"I190", NULL, "ETDM2_IN"},1435{"I191", NULL, "ETDM2_IN"},1436{"I192", NULL, "ETDM2_IN"},1437{"I193", NULL, "ETDM2_IN"},1438{"I194", NULL, "ETDM2_IN"},1439{"I195", NULL, "ETDM2_IN"},14401441{"I072", NULL, "ETDM1_IN"},1442{"I073", NULL, "ETDM1_IN"},1443{"I074", NULL, "ETDM1_IN"},1444{"I075", NULL, "ETDM1_IN"},1445{"I076", NULL, "ETDM1_IN"},1446{"I077", NULL, "ETDM1_IN"},1447{"I078", NULL, "ETDM1_IN"},1448{"I079", NULL, "ETDM1_IN"},1449{"I080", NULL, "ETDM1_IN"},1450{"I081", NULL, "ETDM1_IN"},1451{"I082", NULL, "ETDM1_IN"},1452{"I083", NULL, "ETDM1_IN"},1453{"I084", NULL, "ETDM1_IN"},1454{"I085", NULL, "ETDM1_IN"},1455{"I086", NULL, "ETDM1_IN"},1456{"I087", NULL, "ETDM1_IN"},14571458{"UL8", NULL, "ETDM1_IN"},1459{"UL3", NULL, "ETDM2_IN"},14601461{"ETDM2_OUT", NULL, "O048"},1462{"ETDM2_OUT", NULL, "O049"},1463{"ETDM2_OUT", NULL, "O050"},1464{"ETDM2_OUT", NULL, "O051"},1465{"ETDM2_OUT", NULL, "O052"},1466{"ETDM2_OUT", NULL, "O053"},1467{"ETDM2_OUT", NULL, "O054"},1468{"ETDM2_OUT", NULL, "O055"},1469{"ETDM2_OUT", NULL, "O056"},1470{"ETDM2_OUT", NULL, "O057"},1471{"ETDM2_OUT", NULL, "O058"},1472{"ETDM2_OUT", NULL, "O059"},1473{"ETDM2_OUT", NULL, "O060"},1474{"ETDM2_OUT", NULL, "O061"},1475{"ETDM2_OUT", NULL, "O062"},1476{"ETDM2_OUT", NULL, "O063"},14771478{"ETDM1_OUT", NULL, "O072"},1479{"ETDM1_OUT", NULL, "O073"},1480{"ETDM1_OUT", NULL, "O074"},1481{"ETDM1_OUT", NULL, "O075"},1482{"ETDM1_OUT", NULL, "O076"},1483{"ETDM1_OUT", NULL, "O077"},1484{"ETDM1_OUT", NULL, "O078"},1485{"ETDM1_OUT", NULL, "O079"},1486{"ETDM1_OUT", NULL, "O080"},1487{"ETDM1_OUT", NULL, "O081"},1488{"ETDM1_OUT", NULL, "O082"},1489{"ETDM1_OUT", NULL, "O083"},1490{"ETDM1_OUT", NULL, "O084"},1491{"ETDM1_OUT", NULL, "O085"},1492{"ETDM1_OUT", NULL, "O086"},1493{"ETDM1_OUT", NULL, "O087"},14941495{"O048", "I020 Switch", "I020"},1496{"O049", "I021 Switch", "I021"},14971498{"O048", "I022 Switch", "I022"},1499{"O049", "I023 Switch", "I023"},1500{"O050", "I024 Switch", "I024"},1501{"O051", "I025 Switch", "I025"},1502{"O052", "I026 Switch", "I026"},1503{"O053", "I027 Switch", "I027"},1504{"O054", "I028 Switch", "I028"},1505{"O055", "I029 Switch", "I029"},1506{"O056", "I030 Switch", "I030"},1507{"O057", "I031 Switch", "I031"},1508{"O058", "I032 Switch", "I032"},1509{"O059", "I033 Switch", "I033"},1510{"O060", "I034 Switch", "I034"},1511{"O061", "I035 Switch", "I035"},1512{"O062", "I036 Switch", "I036"},1513{"O063", "I037 Switch", "I037"},15141515{"O048", "I046 Switch", "I046"},1516{"O049", "I047 Switch", "I047"},1517{"O050", "I048 Switch", "I048"},1518{"O051", "I049 Switch", "I049"},1519{"O052", "I050 Switch", "I050"},1520{"O053", "I051 Switch", "I051"},1521{"O054", "I052 Switch", "I052"},1522{"O055", "I053 Switch", "I053"},1523{"O056", "I054 Switch", "I054"},1524{"O057", "I055 Switch", "I055"},1525{"O058", "I056 Switch", "I056"},1526{"O059", "I057 Switch", "I057"},1527{"O060", "I058 Switch", "I058"},1528{"O061", "I059 Switch", "I059"},1529{"O062", "I060 Switch", "I060"},1530{"O063", "I061 Switch", "I061"},15311532{"O048", "I070 Switch", "I070"},1533{"O049", "I071 Switch", "I071"},15341535{"O072", "I020 Switch", "I020"},1536{"O073", "I021 Switch", "I021"},15371538{"O072", "I022 Switch", "I022"},1539{"O073", "I023 Switch", "I023"},1540{"O074", "I024 Switch", "I024"},1541{"O075", "I025 Switch", "I025"},1542{"O076", "I026 Switch", "I026"},1543{"O077", "I027 Switch", "I027"},1544{"O078", "I028 Switch", "I028"},1545{"O079", "I029 Switch", "I029"},1546{"O080", "I030 Switch", "I030"},1547{"O081", "I031 Switch", "I031"},1548{"O082", "I032 Switch", "I032"},1549{"O083", "I033 Switch", "I033"},1550{"O084", "I034 Switch", "I034"},1551{"O085", "I035 Switch", "I035"},1552{"O086", "I036 Switch", "I036"},1553{"O087", "I037 Switch", "I037"},15541555{"O072", "I046 Switch", "I046"},1556{"O073", "I047 Switch", "I047"},1557{"O074", "I048 Switch", "I048"},1558{"O075", "I049 Switch", "I049"},1559{"O076", "I050 Switch", "I050"},1560{"O077", "I051 Switch", "I051"},1561{"O078", "I052 Switch", "I052"},1562{"O079", "I053 Switch", "I053"},1563{"O080", "I054 Switch", "I054"},1564{"O081", "I055 Switch", "I055"},1565{"O082", "I056 Switch", "I056"},1566{"O083", "I057 Switch", "I057"},1567{"O084", "I058 Switch", "I058"},1568{"O085", "I059 Switch", "I059"},1569{"O086", "I060 Switch", "I060"},1570{"O087", "I061 Switch", "I061"},15711572{"O072", "I070 Switch", "I070"},1573{"O073", "I071 Switch", "I071"},15741575{"HDMI_CH0_MUX", "CH0", "DL10"},1576{"HDMI_CH0_MUX", "CH1", "DL10"},1577{"HDMI_CH0_MUX", "CH2", "DL10"},1578{"HDMI_CH0_MUX", "CH3", "DL10"},1579{"HDMI_CH0_MUX", "CH4", "DL10"},1580{"HDMI_CH0_MUX", "CH5", "DL10"},1581{"HDMI_CH0_MUX", "CH6", "DL10"},1582{"HDMI_CH0_MUX", "CH7", "DL10"},15831584{"HDMI_CH1_MUX", "CH0", "DL10"},1585{"HDMI_CH1_MUX", "CH1", "DL10"},1586{"HDMI_CH1_MUX", "CH2", "DL10"},1587{"HDMI_CH1_MUX", "CH3", "DL10"},1588{"HDMI_CH1_MUX", "CH4", "DL10"},1589{"HDMI_CH1_MUX", "CH5", "DL10"},1590{"HDMI_CH1_MUX", "CH6", "DL10"},1591{"HDMI_CH1_MUX", "CH7", "DL10"},15921593{"HDMI_CH2_MUX", "CH0", "DL10"},1594{"HDMI_CH2_MUX", "CH1", "DL10"},1595{"HDMI_CH2_MUX", "CH2", "DL10"},1596{"HDMI_CH2_MUX", "CH3", "DL10"},1597{"HDMI_CH2_MUX", "CH4", "DL10"},1598{"HDMI_CH2_MUX", "CH5", "DL10"},1599{"HDMI_CH2_MUX", "CH6", "DL10"},1600{"HDMI_CH2_MUX", "CH7", "DL10"},16011602{"HDMI_CH3_MUX", "CH0", "DL10"},1603{"HDMI_CH3_MUX", "CH1", "DL10"},1604{"HDMI_CH3_MUX", "CH2", "DL10"},1605{"HDMI_CH3_MUX", "CH3", "DL10"},1606{"HDMI_CH3_MUX", "CH4", "DL10"},1607{"HDMI_CH3_MUX", "CH5", "DL10"},1608{"HDMI_CH3_MUX", "CH6", "DL10"},1609{"HDMI_CH3_MUX", "CH7", "DL10"},16101611{"HDMI_CH4_MUX", "CH0", "DL10"},1612{"HDMI_CH4_MUX", "CH1", "DL10"},1613{"HDMI_CH4_MUX", "CH2", "DL10"},1614{"HDMI_CH4_MUX", "CH3", "DL10"},1615{"HDMI_CH4_MUX", "CH4", "DL10"},1616{"HDMI_CH4_MUX", "CH5", "DL10"},1617{"HDMI_CH4_MUX", "CH6", "DL10"},1618{"HDMI_CH4_MUX", "CH7", "DL10"},16191620{"HDMI_CH5_MUX", "CH0", "DL10"},1621{"HDMI_CH5_MUX", "CH1", "DL10"},1622{"HDMI_CH5_MUX", "CH2", "DL10"},1623{"HDMI_CH5_MUX", "CH3", "DL10"},1624{"HDMI_CH5_MUX", "CH4", "DL10"},1625{"HDMI_CH5_MUX", "CH5", "DL10"},1626{"HDMI_CH5_MUX", "CH6", "DL10"},1627{"HDMI_CH5_MUX", "CH7", "DL10"},16281629{"HDMI_CH6_MUX", "CH0", "DL10"},1630{"HDMI_CH6_MUX", "CH1", "DL10"},1631{"HDMI_CH6_MUX", "CH2", "DL10"},1632{"HDMI_CH6_MUX", "CH3", "DL10"},1633{"HDMI_CH6_MUX", "CH4", "DL10"},1634{"HDMI_CH6_MUX", "CH5", "DL10"},1635{"HDMI_CH6_MUX", "CH6", "DL10"},1636{"HDMI_CH6_MUX", "CH7", "DL10"},16371638{"HDMI_CH7_MUX", "CH0", "DL10"},1639{"HDMI_CH7_MUX", "CH1", "DL10"},1640{"HDMI_CH7_MUX", "CH2", "DL10"},1641{"HDMI_CH7_MUX", "CH3", "DL10"},1642{"HDMI_CH7_MUX", "CH4", "DL10"},1643{"HDMI_CH7_MUX", "CH5", "DL10"},1644{"HDMI_CH7_MUX", "CH6", "DL10"},1645{"HDMI_CH7_MUX", "CH7", "DL10"},16461647{"HDMI_OUT_MUX", "Connect", "HDMI_CH0_MUX"},1648{"HDMI_OUT_MUX", "Connect", "HDMI_CH1_MUX"},1649{"HDMI_OUT_MUX", "Connect", "HDMI_CH2_MUX"},1650{"HDMI_OUT_MUX", "Connect", "HDMI_CH3_MUX"},1651{"HDMI_OUT_MUX", "Connect", "HDMI_CH4_MUX"},1652{"HDMI_OUT_MUX", "Connect", "HDMI_CH5_MUX"},1653{"HDMI_OUT_MUX", "Connect", "HDMI_CH6_MUX"},1654{"HDMI_OUT_MUX", "Connect", "HDMI_CH7_MUX"},16551656{"DPTX_OUT_MUX", "Connect", "HDMI_CH0_MUX"},1657{"DPTX_OUT_MUX", "Connect", "HDMI_CH1_MUX"},1658{"DPTX_OUT_MUX", "Connect", "HDMI_CH2_MUX"},1659{"DPTX_OUT_MUX", "Connect", "HDMI_CH3_MUX"},1660{"DPTX_OUT_MUX", "Connect", "HDMI_CH4_MUX"},1661{"DPTX_OUT_MUX", "Connect", "HDMI_CH5_MUX"},1662{"DPTX_OUT_MUX", "Connect", "HDMI_CH6_MUX"},1663{"DPTX_OUT_MUX", "Connect", "HDMI_CH7_MUX"},16641665{"ETDM3_OUT", NULL, "HDMI_OUT_MUX"},1666{"DPTX", NULL, "DPTX_OUT_MUX"},16671668{"ETDM_OUTPUT", NULL, "DPTX"},1669{"ETDM_OUTPUT", NULL, "ETDM1_OUT"},1670{"ETDM_OUTPUT", NULL, "ETDM2_OUT"},1671{"ETDM_OUTPUT", NULL, "ETDM3_OUT"},1672{"ETDM1_IN", NULL, "ETDM_INPUT"},1673{"ETDM2_IN", NULL, "ETDM_INPUT"},1674};16751676static int etdm_cowork_slv_sel(int id, int slave_mode)1677{1678if (slave_mode) {1679switch (id) {1680case MT8188_AFE_IO_ETDM1_IN:1681return COWORK_ETDM_IN1_S;1682case MT8188_AFE_IO_ETDM2_IN:1683return COWORK_ETDM_IN2_S;1684case MT8188_AFE_IO_ETDM1_OUT:1685return COWORK_ETDM_OUT1_S;1686case MT8188_AFE_IO_ETDM2_OUT:1687return COWORK_ETDM_OUT2_S;1688case MT8188_AFE_IO_ETDM3_OUT:1689return COWORK_ETDM_OUT3_S;1690default:1691return -EINVAL;1692}1693} else {1694switch (id) {1695case MT8188_AFE_IO_ETDM1_IN:1696return COWORK_ETDM_IN1_M;1697case MT8188_AFE_IO_ETDM2_IN:1698return COWORK_ETDM_IN2_M;1699case MT8188_AFE_IO_ETDM1_OUT:1700return COWORK_ETDM_OUT1_M;1701case MT8188_AFE_IO_ETDM2_OUT:1702return COWORK_ETDM_OUT2_M;1703case MT8188_AFE_IO_ETDM3_OUT:1704return COWORK_ETDM_OUT3_M;1705default:1706return -EINVAL;1707}1708}1709}17101711static int etdm_cowork_sync_sel(int id)1712{1713switch (id) {1714case MT8188_AFE_IO_ETDM1_IN:1715return ETDM_SYNC_FROM_IN1;1716case MT8188_AFE_IO_ETDM2_IN:1717return ETDM_SYNC_FROM_IN2;1718case MT8188_AFE_IO_ETDM1_OUT:1719return ETDM_SYNC_FROM_OUT1;1720case MT8188_AFE_IO_ETDM2_OUT:1721return ETDM_SYNC_FROM_OUT2;1722case MT8188_AFE_IO_ETDM3_OUT:1723return ETDM_SYNC_FROM_OUT3;1724default:1725return -EINVAL;1726}1727}17281729static int mt8188_etdm_sync_mode_slv(struct mtk_base_afe *afe, int dai_id)1730{1731struct mt8188_afe_private *afe_priv = afe->platform_priv;1732struct mtk_dai_etdm_priv *etdm_data;1733unsigned int reg = 0;1734unsigned int mask;1735unsigned int val;1736int cowork_source_sel;17371738if (!is_valid_etdm_dai(dai_id))1739return -EINVAL;1740etdm_data = afe_priv->dai_priv[dai_id];17411742cowork_source_sel = etdm_cowork_slv_sel(etdm_data->cowork_source_id,1743true);1744if (cowork_source_sel < 0)1745return cowork_source_sel;17461747switch (dai_id) {1748case MT8188_AFE_IO_ETDM1_IN:1749reg = ETDM_COWORK_CON1;1750mask = ETDM_IN1_SLAVE_SEL_MASK;1751val = FIELD_PREP(ETDM_IN1_SLAVE_SEL_MASK, cowork_source_sel);1752break;1753case MT8188_AFE_IO_ETDM2_IN:1754reg = ETDM_COWORK_CON2;1755mask = ETDM_IN2_SLAVE_SEL_MASK;1756val = FIELD_PREP(ETDM_IN2_SLAVE_SEL_MASK, cowork_source_sel);1757break;1758case MT8188_AFE_IO_ETDM1_OUT:1759reg = ETDM_COWORK_CON0;1760mask = ETDM_OUT1_SLAVE_SEL_MASK;1761val = FIELD_PREP(ETDM_OUT1_SLAVE_SEL_MASK, cowork_source_sel);1762break;1763case MT8188_AFE_IO_ETDM2_OUT:1764reg = ETDM_COWORK_CON2;1765mask = ETDM_OUT2_SLAVE_SEL_MASK;1766val = FIELD_PREP(ETDM_OUT2_SLAVE_SEL_MASK, cowork_source_sel);1767break;1768case MT8188_AFE_IO_ETDM3_OUT:1769reg = ETDM_COWORK_CON2;1770mask = ETDM_OUT3_SLAVE_SEL_MASK;1771val = FIELD_PREP(ETDM_OUT3_SLAVE_SEL_MASK, cowork_source_sel);1772break;1773default:1774return 0;1775}17761777regmap_update_bits(afe->regmap, reg, mask, val);17781779return 0;1780}17811782static int mt8188_etdm_sync_mode_mst(struct mtk_base_afe *afe, int dai_id)1783{1784struct mt8188_afe_private *afe_priv = afe->platform_priv;1785struct mtk_dai_etdm_priv *etdm_data;1786struct etdm_con_reg etdm_reg;1787unsigned int reg = 0;1788unsigned int mask;1789unsigned int val;1790int cowork_source_sel;1791int ret;17921793if (!is_valid_etdm_dai(dai_id))1794return -EINVAL;1795etdm_data = afe_priv->dai_priv[dai_id];17961797cowork_source_sel = etdm_cowork_sync_sel(etdm_data->cowork_source_id);1798if (cowork_source_sel < 0)1799return cowork_source_sel;18001801switch (dai_id) {1802case MT8188_AFE_IO_ETDM1_IN:1803reg = ETDM_COWORK_CON1;1804mask = ETDM_IN1_SYNC_SEL_MASK;1805val = FIELD_PREP(ETDM_IN1_SYNC_SEL_MASK, cowork_source_sel);1806break;1807case MT8188_AFE_IO_ETDM2_IN:1808reg = ETDM_COWORK_CON2;1809mask = ETDM_IN2_SYNC_SEL_MASK;1810val = FIELD_PREP(ETDM_IN2_SYNC_SEL_MASK, cowork_source_sel);1811break;1812case MT8188_AFE_IO_ETDM1_OUT:1813reg = ETDM_COWORK_CON0;1814mask = ETDM_OUT1_SYNC_SEL_MASK;1815val = FIELD_PREP(ETDM_OUT1_SYNC_SEL_MASK, cowork_source_sel);1816break;1817case MT8188_AFE_IO_ETDM2_OUT:1818reg = ETDM_COWORK_CON2;1819mask = ETDM_OUT2_SYNC_SEL_MASK;1820val = FIELD_PREP(ETDM_OUT2_SYNC_SEL_MASK, cowork_source_sel);1821break;1822case MT8188_AFE_IO_ETDM3_OUT:1823reg = ETDM_COWORK_CON2;1824mask = ETDM_OUT3_SYNC_SEL_MASK;1825val = FIELD_PREP(ETDM_OUT3_SYNC_SEL_MASK, cowork_source_sel);1826break;1827default:1828return 0;1829}18301831ret = get_etdm_reg(dai_id, &etdm_reg);1832if (ret < 0)1833return ret;18341835regmap_update_bits(afe->regmap, reg, mask, val);18361837regmap_set_bits(afe->regmap, etdm_reg.con0, ETDM_CON0_SYNC_MODE);18381839return 0;1840}18411842static int mt8188_etdm_sync_mode_configure(struct mtk_base_afe *afe, int dai_id)1843{1844struct mt8188_afe_private *afe_priv = afe->platform_priv;1845struct mtk_dai_etdm_priv *etdm_data;18461847if (!is_valid_etdm_dai(dai_id))1848return -EINVAL;1849etdm_data = afe_priv->dai_priv[dai_id];18501851if (etdm_data->cowork_source_id == COWORK_ETDM_NONE)1852return 0;18531854if (etdm_data->slave_mode)1855mt8188_etdm_sync_mode_slv(afe, dai_id);1856else1857mt8188_etdm_sync_mode_mst(afe, dai_id);18581859return 0;1860}18611862/* dai ops */1863static int mtk_dai_etdm_fifo_mode(struct mtk_base_afe *afe,1864int dai_id, unsigned int rate)1865{1866unsigned int mode = 0;1867unsigned int reg = 0;1868unsigned int val = 0;1869unsigned int mask = (ETDM_IN_AFIFO_MODE_MASK | ETDM_IN_USE_AFIFO);18701871if (rate != 0)1872mode = mt8188_afe_fs_timing(rate);18731874switch (dai_id) {1875case MT8188_AFE_IO_ETDM1_IN:1876reg = ETDM_IN1_AFIFO_CON;1877if (rate == 0)1878mode = MT8188_ETDM_IN1_1X_EN;1879break;1880case MT8188_AFE_IO_ETDM2_IN:1881reg = ETDM_IN2_AFIFO_CON;1882if (rate == 0)1883mode = MT8188_ETDM_IN2_1X_EN;1884break;1885default:1886return -EINVAL;1887}18881889val = (mode | ETDM_IN_USE_AFIFO);18901891regmap_update_bits(afe->regmap, reg, mask, val);1892return 0;1893}18941895static int mtk_dai_etdm_in_configure(struct mtk_base_afe *afe,1896unsigned int rate,1897unsigned int channels,1898int dai_id)1899{1900struct mt8188_afe_private *afe_priv = afe->platform_priv;1901struct mtk_dai_etdm_priv *etdm_data;1902struct etdm_con_reg etdm_reg;1903bool slave_mode;1904unsigned int data_mode;1905unsigned int lrck_width;1906unsigned int val = 0;1907unsigned int mask = 0;1908int ret;1909int i;19101911if (!is_valid_etdm_dai(dai_id))1912return -EINVAL;1913etdm_data = afe_priv->dai_priv[dai_id];1914slave_mode = etdm_data->slave_mode;1915data_mode = etdm_data->data_mode;1916lrck_width = etdm_data->lrck_width;19171918dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n",1919__func__, rate, channels, dai_id);19201921ret = get_etdm_reg(dai_id, &etdm_reg);1922if (ret < 0)1923return ret;19241925/* afifo */1926if (slave_mode)1927mtk_dai_etdm_fifo_mode(afe, dai_id, 0);1928else1929mtk_dai_etdm_fifo_mode(afe, dai_id, rate);19301931/* con1 */1932if (lrck_width > 0) {1933mask |= (ETDM_IN_CON1_LRCK_AUTO_MODE |1934ETDM_IN_CON1_LRCK_WIDTH_MASK);1935val |= FIELD_PREP(ETDM_IN_CON1_LRCK_WIDTH_MASK, lrck_width - 1);1936}1937regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);19381939mask = 0;1940val = 0;19411942/* con2 */1943if (!slave_mode) {1944mask |= ETDM_IN_CON2_UPDATE_GAP_MASK;1945if (rate == 352800 || rate == 384000)1946val |= FIELD_PREP(ETDM_IN_CON2_UPDATE_GAP_MASK, 4);1947else1948val |= FIELD_PREP(ETDM_IN_CON2_UPDATE_GAP_MASK, 3);1949}1950mask |= (ETDM_IN_CON2_MULTI_IP_2CH_MODE |1951ETDM_IN_CON2_MULTI_IP_TOTAL_CH_MASK);1952if (data_mode == MTK_DAI_ETDM_DATA_MULTI_PIN) {1953val |= ETDM_IN_CON2_MULTI_IP_2CH_MODE |1954FIELD_PREP(ETDM_IN_CON2_MULTI_IP_TOTAL_CH_MASK, channels - 1);1955}1956regmap_update_bits(afe->regmap, etdm_reg.con2, mask, val);19571958mask = 0;1959val = 0;19601961/* con3 */1962mask |= ETDM_IN_CON3_DISABLE_OUT_MASK;1963for (i = 0; i < channels; i += 2) {1964if (etdm_data->in_disable_ch[i] &&1965etdm_data->in_disable_ch[i + 1])1966val |= ETDM_IN_CON3_DISABLE_OUT(i >> 1);1967}1968if (!slave_mode) {1969mask |= ETDM_IN_CON3_FS_MASK;1970val |= FIELD_PREP(ETDM_IN_CON3_FS_MASK, get_etdm_fs_timing(rate));1971}1972regmap_update_bits(afe->regmap, etdm_reg.con3, mask, val);19731974mask = 0;1975val = 0;19761977/* con4 */1978mask |= (ETDM_IN_CON4_MASTER_LRCK_INV | ETDM_IN_CON4_MASTER_BCK_INV |1979ETDM_IN_CON4_SLAVE_LRCK_INV | ETDM_IN_CON4_SLAVE_BCK_INV);1980if (slave_mode) {1981if (etdm_data->lrck_inv)1982val |= ETDM_IN_CON4_SLAVE_LRCK_INV;1983if (etdm_data->bck_inv)1984val |= ETDM_IN_CON4_SLAVE_BCK_INV;1985} else {1986if (etdm_data->lrck_inv)1987val |= ETDM_IN_CON4_MASTER_LRCK_INV;1988if (etdm_data->bck_inv)1989val |= ETDM_IN_CON4_MASTER_BCK_INV;1990}1991regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val);19921993mask = 0;1994val = 0;19951996/* con5 */1997mask |= ETDM_IN_CON5_LR_SWAP_MASK;1998mask |= ETDM_IN_CON5_ENABLE_ODD_MASK;1999for (i = 0; i < channels; i += 2) {2000if (etdm_data->in_disable_ch[i] &&2001!etdm_data->in_disable_ch[i + 1]) {2002val |= ETDM_IN_CON5_LR_SWAP(i >> 1);2003val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1);2004} else if (!etdm_data->in_disable_ch[i] &&2005etdm_data->in_disable_ch[i + 1]) {2006val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1);2007}2008}2009regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val);2010return 0;2011}20122013static int mtk_dai_etdm_out_configure(struct mtk_base_afe *afe,2014unsigned int rate,2015unsigned int channels,2016int dai_id)2017{2018struct mt8188_afe_private *afe_priv = afe->platform_priv;2019struct mtk_dai_etdm_priv *etdm_data;2020struct etdm_con_reg etdm_reg;2021bool slave_mode;2022unsigned int lrck_width;2023unsigned int val = 0;2024unsigned int mask = 0;2025int fs = 0;2026int ret;20272028if (!is_valid_etdm_dai(dai_id))2029return -EINVAL;2030etdm_data = afe_priv->dai_priv[dai_id];2031slave_mode = etdm_data->slave_mode;2032lrck_width = etdm_data->lrck_width;20332034dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n",2035__func__, rate, channels, dai_id);20362037ret = get_etdm_reg(dai_id, &etdm_reg);2038if (ret < 0)2039return ret;20402041/* con0 */2042mask = ETDM_OUT_CON0_RELATCH_DOMAIN_MASK;2043val = FIELD_PREP(ETDM_OUT_CON0_RELATCH_DOMAIN_MASK,2044ETDM_RELATCH_TIMING_A1A2SYS);2045regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val);20462047mask = 0;2048val = 0;20492050/* con1 */2051if (lrck_width > 0) {2052mask |= (ETDM_OUT_CON1_LRCK_AUTO_MODE |2053ETDM_OUT_CON1_LRCK_WIDTH_MASK);2054val |= FIELD_PREP(ETDM_OUT_CON1_LRCK_WIDTH_MASK, lrck_width - 1);2055}2056regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);20572058mask = 0;2059val = 0;20602061if (!slave_mode) {2062/* con4 */2063mask |= ETDM_OUT_CON4_FS_MASK;2064val |= FIELD_PREP(ETDM_OUT_CON4_FS_MASK, get_etdm_fs_timing(rate));2065}20662067mask |= ETDM_OUT_CON4_RELATCH_EN_MASK;2068if (dai_id == MT8188_AFE_IO_ETDM1_OUT)2069fs = MT8188_ETDM_OUT1_1X_EN;2070else if (dai_id == MT8188_AFE_IO_ETDM2_OUT)2071fs = MT8188_ETDM_OUT2_1X_EN;20722073val |= FIELD_PREP(ETDM_OUT_CON4_RELATCH_EN_MASK, fs);20742075regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val);20762077mask = 0;2078val = 0;20792080/* con5 */2081mask |= (ETDM_OUT_CON5_MASTER_LRCK_INV | ETDM_OUT_CON5_MASTER_BCK_INV |2082ETDM_OUT_CON5_SLAVE_LRCK_INV | ETDM_OUT_CON5_SLAVE_BCK_INV);2083if (slave_mode) {2084if (etdm_data->lrck_inv)2085val |= ETDM_OUT_CON5_SLAVE_LRCK_INV;2086if (etdm_data->bck_inv)2087val |= ETDM_OUT_CON5_SLAVE_BCK_INV;2088} else {2089if (etdm_data->lrck_inv)2090val |= ETDM_OUT_CON5_MASTER_LRCK_INV;2091if (etdm_data->bck_inv)2092val |= ETDM_OUT_CON5_MASTER_BCK_INV;2093}2094regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val);20952096return 0;2097}20982099static int mtk_dai_etdm_configure(struct mtk_base_afe *afe,2100unsigned int rate,2101unsigned int channels,2102unsigned int bit_width,2103int dai_id)2104{2105struct mt8188_afe_private *afe_priv = afe->platform_priv;2106struct mtk_dai_etdm_priv *etdm_data;2107struct etdm_con_reg etdm_reg;2108bool slave_mode;2109unsigned int etdm_channels;2110unsigned int val = 0;2111unsigned int mask = 0;2112unsigned int bck;2113unsigned int wlen = get_etdm_wlen(bit_width);2114int ret;21152116if (!is_valid_etdm_dai(dai_id))2117return -EINVAL;2118etdm_data = afe_priv->dai_priv[dai_id];2119slave_mode = etdm_data->slave_mode;2120etdm_data->rate = rate;21212122ret = get_etdm_reg(dai_id, &etdm_reg);2123if (ret < 0)2124return ret;21252126dev_dbg(afe->dev, "%s fmt %u data %u lrck %d-%u bck %d, slv %u\n",2127__func__, etdm_data->format, etdm_data->data_mode,2128etdm_data->lrck_inv, etdm_data->lrck_width, etdm_data->bck_inv,2129etdm_data->slave_mode);2130dev_dbg(afe->dev, "%s rate %u channels %u bitwidth %u, id %d\n",2131__func__, rate, channels, bit_width, dai_id);21322133etdm_channels = (etdm_data->data_mode == MTK_DAI_ETDM_DATA_ONE_PIN) ?2134get_etdm_ch_fixup(channels) : 2;21352136bck = rate * etdm_channels * wlen;2137if (bck > MT8188_ETDM_NORMAL_MAX_BCK_RATE) {2138dev_err(afe->dev, "%s bck rate %u not support\n",2139__func__, bck);2140return -EINVAL;2141}21422143/* con0 */2144mask |= ETDM_CON0_BIT_LEN_MASK;2145val |= FIELD_PREP(ETDM_CON0_BIT_LEN_MASK, bit_width - 1);2146mask |= ETDM_CON0_WORD_LEN_MASK;2147val |= FIELD_PREP(ETDM_CON0_WORD_LEN_MASK, wlen - 1);2148mask |= ETDM_CON0_FORMAT_MASK;2149val |= FIELD_PREP(ETDM_CON0_FORMAT_MASK, etdm_data->format);2150mask |= ETDM_CON0_CH_NUM_MASK;2151val |= FIELD_PREP(ETDM_CON0_CH_NUM_MASK, etdm_channels - 1);21522153mask |= ETDM_CON0_SLAVE_MODE;2154if (slave_mode) {2155if (dai_id == MT8188_AFE_IO_ETDM1_OUT) {2156dev_err(afe->dev, "%s id %d only support master mode\n",2157__func__, dai_id);2158return -EINVAL;2159}2160val |= ETDM_CON0_SLAVE_MODE;2161}2162regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val);21632164if (get_etdm_dir(dai_id) == ETDM_IN)2165mtk_dai_etdm_in_configure(afe, rate, channels, dai_id);2166else2167mtk_dai_etdm_out_configure(afe, rate, channels, dai_id);21682169return 0;2170}21712172static int mtk_dai_etdm_hw_params(struct snd_pcm_substream *substream,2173struct snd_pcm_hw_params *params,2174struct snd_soc_dai *dai)2175{2176unsigned int rate = params_rate(params);2177unsigned int bit_width = params_width(params);2178unsigned int channels = params_channels(params);2179struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2180struct mt8188_afe_private *afe_priv = afe->platform_priv;2181struct mtk_dai_etdm_priv *mst_etdm_data;2182int mst_dai_id;2183int slv_dai_id;2184int ret;2185int i;21862187dev_dbg(afe->dev, "%s '%s' period %u-%u\n",2188__func__, snd_pcm_stream_str(substream),2189params_period_size(params), params_periods(params));21902191if (is_cowork_mode(dai)) {2192mst_dai_id = get_etdm_cowork_master_id(dai);2193if (!is_valid_etdm_dai(mst_dai_id))2194return -EINVAL;21952196mst_etdm_data = afe_priv->dai_priv[mst_dai_id];2197if (mst_etdm_data->slots)2198channels = mst_etdm_data->slots;21992200ret = mtk_dai_etdm_configure(afe, rate, channels,2201bit_width, mst_dai_id);2202if (ret)2203return ret;22042205for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {2206slv_dai_id = mst_etdm_data->cowork_slv_id[i];2207ret = mtk_dai_etdm_configure(afe, rate, channels,2208bit_width, slv_dai_id);2209if (ret)2210return ret;22112212ret = mt8188_etdm_sync_mode_configure(afe, slv_dai_id);2213if (ret)2214return ret;2215}2216} else {2217if (!is_valid_etdm_dai(dai->id))2218return -EINVAL;2219mst_etdm_data = afe_priv->dai_priv[dai->id];2220if (mst_etdm_data->slots)2221channels = mst_etdm_data->slots;22222223ret = mtk_dai_etdm_configure(afe, rate, channels,2224bit_width, dai->id);2225if (ret)2226return ret;2227}22282229return 0;2230}22312232static int mtk_dai_etdm_cal_mclk(struct mtk_base_afe *afe, int freq, int dai_id)2233{2234struct mt8188_afe_private *afe_priv = afe->platform_priv;2235struct mtk_dai_etdm_priv *etdm_data;2236int apll_rate;2237int apll;22382239if (!is_valid_etdm_dai(dai_id))2240return -EINVAL;2241etdm_data = afe_priv->dai_priv[dai_id];22422243if (freq == 0) {2244etdm_data->mclk_freq = freq;2245return 0;2246}22472248if (etdm_data->mclk_fixed_apll == 0)2249apll = mt8188_afe_get_default_mclk_source_by_rate(freq);2250else2251apll = etdm_data->mclk_apll;22522253apll_rate = mt8188_afe_get_mclk_source_rate(afe, apll);22542255if (freq > apll_rate) {2256dev_err(afe->dev, "freq %d > apll rate %d\n", freq, apll_rate);2257return -EINVAL;2258}22592260if (apll_rate % freq != 0) {2261dev_err(afe->dev, "APLL%d cannot generate freq Hz\n", apll);2262return -EINVAL;2263}22642265if (etdm_data->mclk_fixed_apll == 0)2266etdm_data->mclk_apll = apll;2267etdm_data->mclk_freq = freq;22682269return 0;2270}22712272static int mtk_dai_etdm_set_sysclk(struct snd_soc_dai *dai,2273int clk_id, unsigned int freq, int dir)2274{2275struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2276struct mt8188_afe_private *afe_priv = afe->platform_priv;2277struct mtk_dai_etdm_priv *etdm_data;2278int dai_id;22792280dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n",2281__func__, dai->id, freq, dir);2282if (is_cowork_mode(dai))2283dai_id = get_etdm_cowork_master_id(dai);2284else2285dai_id = dai->id;22862287if (!is_valid_etdm_dai(dai_id))2288return -EINVAL;2289etdm_data = afe_priv->dai_priv[dai_id];2290etdm_data->mclk_dir = dir;2291return mtk_dai_etdm_cal_mclk(afe, freq, dai_id);2292}22932294static int mtk_dai_etdm_set_tdm_slot(struct snd_soc_dai *dai,2295unsigned int tx_mask, unsigned int rx_mask,2296int slots, int slot_width)2297{2298struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2299struct mt8188_afe_private *afe_priv = afe->platform_priv;2300struct mtk_dai_etdm_priv *etdm_data;2301int dai_id;23022303if (is_cowork_mode(dai))2304dai_id = get_etdm_cowork_master_id(dai);2305else2306dai_id = dai->id;23072308if (!is_valid_etdm_dai(dai_id))2309return -EINVAL;2310etdm_data = afe_priv->dai_priv[dai_id];23112312dev_dbg(dai->dev, "%s id %d slot_width %d\n",2313__func__, dai->id, slot_width);23142315etdm_data->slots = slots;2316etdm_data->lrck_width = slot_width;2317return 0;2318}23192320static int mtk_dai_etdm_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)2321{2322struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2323struct mt8188_afe_private *afe_priv = afe->platform_priv;2324struct mtk_dai_etdm_priv *etdm_data;23252326if (!is_valid_etdm_dai(dai->id))2327return -EINVAL;2328etdm_data = afe_priv->dai_priv[dai->id];23292330switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {2331case SND_SOC_DAIFMT_I2S:2332etdm_data->format = MTK_DAI_ETDM_FORMAT_I2S;2333break;2334case SND_SOC_DAIFMT_LEFT_J:2335etdm_data->format = MTK_DAI_ETDM_FORMAT_LJ;2336break;2337case SND_SOC_DAIFMT_RIGHT_J:2338etdm_data->format = MTK_DAI_ETDM_FORMAT_RJ;2339break;2340case SND_SOC_DAIFMT_DSP_A:2341etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPA;2342break;2343case SND_SOC_DAIFMT_DSP_B:2344etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPB;2345break;2346default:2347return -EINVAL;2348}23492350switch (fmt & SND_SOC_DAIFMT_INV_MASK) {2351case SND_SOC_DAIFMT_NB_NF:2352etdm_data->bck_inv = false;2353etdm_data->lrck_inv = false;2354break;2355case SND_SOC_DAIFMT_NB_IF:2356etdm_data->bck_inv = false;2357etdm_data->lrck_inv = true;2358break;2359case SND_SOC_DAIFMT_IB_NF:2360etdm_data->bck_inv = true;2361etdm_data->lrck_inv = false;2362break;2363case SND_SOC_DAIFMT_IB_IF:2364etdm_data->bck_inv = true;2365etdm_data->lrck_inv = true;2366break;2367default:2368return -EINVAL;2369}23702371switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {2372case SND_SOC_DAIFMT_BC_FC:2373etdm_data->slave_mode = true;2374break;2375case SND_SOC_DAIFMT_BP_FP:2376etdm_data->slave_mode = false;2377break;2378default:2379return -EINVAL;2380}23812382return 0;2383}23842385static unsigned int mtk_dai_get_dptx_ch_en(unsigned int channel)2386{2387switch (channel) {2388case 1 ... 2:2389return AFE_DPTX_CON_CH_EN_2CH;2390case 3 ... 4:2391return AFE_DPTX_CON_CH_EN_4CH;2392case 5 ... 6:2393return AFE_DPTX_CON_CH_EN_6CH;2394case 7 ... 8:2395return AFE_DPTX_CON_CH_EN_8CH;2396default:2397return AFE_DPTX_CON_CH_EN_2CH;2398}2399}24002401static unsigned int mtk_dai_get_dptx_ch(unsigned int ch)2402{2403return (ch > 2) ?2404AFE_DPTX_CON_CH_NUM_8CH : AFE_DPTX_CON_CH_NUM_2CH;2405}24062407static unsigned int mtk_dai_get_dptx_wlen(snd_pcm_format_t format)2408{2409return snd_pcm_format_physical_width(format) <= 16 ?2410AFE_DPTX_CON_16BIT : AFE_DPTX_CON_24BIT;2411}24122413static int mtk_dai_hdmitx_dptx_hw_params(struct snd_pcm_substream *substream,2414struct snd_pcm_hw_params *params,2415struct snd_soc_dai *dai)2416{2417struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2418struct mt8188_afe_private *afe_priv = afe->platform_priv;2419struct mtk_dai_etdm_priv *etdm_data;2420unsigned int rate = params_rate(params);2421unsigned int channels = params_channels(params);2422snd_pcm_format_t format = params_format(params);2423int width = snd_pcm_format_physical_width(format);24242425if (!is_valid_etdm_dai(dai->id))2426return -EINVAL;2427etdm_data = afe_priv->dai_priv[dai->id];24282429/* dptx configure */2430if (dai->id == MT8188_AFE_IO_DPTX) {2431regmap_update_bits(afe->regmap, AFE_DPTX_CON,2432AFE_DPTX_CON_CH_EN_MASK,2433mtk_dai_get_dptx_ch_en(channels));2434regmap_update_bits(afe->regmap, AFE_DPTX_CON,2435AFE_DPTX_CON_CH_NUM_MASK,2436mtk_dai_get_dptx_ch(channels));2437regmap_update_bits(afe->regmap, AFE_DPTX_CON,2438AFE_DPTX_CON_16BIT_MASK,2439mtk_dai_get_dptx_wlen(format));24402441if (mtk_dai_get_dptx_ch(channels) == AFE_DPTX_CON_CH_NUM_8CH) {2442etdm_data->data_mode = MTK_DAI_ETDM_DATA_ONE_PIN;2443channels = 8;2444} else {2445channels = 2;2446}2447} else {2448etdm_data->data_mode = MTK_DAI_ETDM_DATA_MULTI_PIN;2449}24502451return mtk_dai_etdm_configure(afe, rate, channels, width, dai->id);2452}24532454static int mtk_dai_hdmitx_dptx_set_sysclk(struct snd_soc_dai *dai,2455int clk_id,2456unsigned int freq,2457int dir)2458{2459struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2460struct mt8188_afe_private *afe_priv = afe->platform_priv;2461struct mtk_dai_etdm_priv *etdm_data;24622463if (!is_valid_etdm_dai(dai->id))2464return -EINVAL;2465etdm_data = afe_priv->dai_priv[dai->id];24662467dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n",2468__func__, dai->id, freq, dir);24692470etdm_data->mclk_dir = dir;2471return mtk_dai_etdm_cal_mclk(afe, freq, dai->id);2472}24732474static const struct snd_soc_dai_ops mtk_dai_etdm_ops = {2475.hw_params = mtk_dai_etdm_hw_params,2476.set_sysclk = mtk_dai_etdm_set_sysclk,2477.set_fmt = mtk_dai_etdm_set_fmt,2478.set_tdm_slot = mtk_dai_etdm_set_tdm_slot,2479};24802481static const struct snd_soc_dai_ops mtk_dai_hdmitx_dptx_ops = {2482.hw_params = mtk_dai_hdmitx_dptx_hw_params,2483.set_sysclk = mtk_dai_hdmitx_dptx_set_sysclk,2484.set_fmt = mtk_dai_etdm_set_fmt,2485};24862487/* dai driver */2488#define MTK_ETDM_RATES (SNDRV_PCM_RATE_8000_192000)24892490#define MTK_ETDM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\2491SNDRV_PCM_FMTBIT_S24_LE |\2492SNDRV_PCM_FMTBIT_S32_LE)24932494static struct snd_soc_dai_driver mtk_dai_etdm_driver[] = {2495{2496.name = "DPTX",2497.id = MT8188_AFE_IO_DPTX,2498.playback = {2499.stream_name = "DPTX",2500.channels_min = 1,2501.channels_max = 8,2502.rates = MTK_ETDM_RATES,2503.formats = MTK_ETDM_FORMATS,2504},2505.ops = &mtk_dai_hdmitx_dptx_ops,2506},2507{2508.name = "ETDM1_IN",2509.id = MT8188_AFE_IO_ETDM1_IN,2510.capture = {2511.stream_name = "ETDM1_IN",2512.channels_min = 1,2513.channels_max = 16,2514.rates = MTK_ETDM_RATES,2515.formats = MTK_ETDM_FORMATS,2516},2517.ops = &mtk_dai_etdm_ops,2518},2519{2520.name = "ETDM2_IN",2521.id = MT8188_AFE_IO_ETDM2_IN,2522.capture = {2523.stream_name = "ETDM2_IN",2524.channels_min = 1,2525.channels_max = 16,2526.rates = MTK_ETDM_RATES,2527.formats = MTK_ETDM_FORMATS,2528},2529.ops = &mtk_dai_etdm_ops,2530},2531{2532.name = "ETDM1_OUT",2533.id = MT8188_AFE_IO_ETDM1_OUT,2534.playback = {2535.stream_name = "ETDM1_OUT",2536.channels_min = 1,2537.channels_max = 16,2538.rates = MTK_ETDM_RATES,2539.formats = MTK_ETDM_FORMATS,2540},2541.ops = &mtk_dai_etdm_ops,2542},2543{2544.name = "ETDM2_OUT",2545.id = MT8188_AFE_IO_ETDM2_OUT,2546.playback = {2547.stream_name = "ETDM2_OUT",2548.channels_min = 1,2549.channels_max = 16,2550.rates = MTK_ETDM_RATES,2551.formats = MTK_ETDM_FORMATS,2552},2553.ops = &mtk_dai_etdm_ops,2554},2555{2556.name = "ETDM3_OUT",2557.id = MT8188_AFE_IO_ETDM3_OUT,2558.playback = {2559.stream_name = "ETDM3_OUT",2560.channels_min = 1,2561.channels_max = 8,2562.rates = MTK_ETDM_RATES,2563.formats = MTK_ETDM_FORMATS,2564},2565.ops = &mtk_dai_hdmitx_dptx_ops,2566},2567};25682569static void mt8188_etdm_update_sync_info(struct mtk_base_afe *afe)2570{2571struct mt8188_afe_private *afe_priv = afe->platform_priv;2572struct mtk_dai_etdm_priv *etdm_data;2573struct mtk_dai_etdm_priv *mst_data;2574int mst_dai_id;2575int i;25762577for (i = MT8188_AFE_IO_ETDM_START; i < MT8188_AFE_IO_ETDM_END; i++) {2578etdm_data = afe_priv->dai_priv[i];2579if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) {2580mst_dai_id = etdm_data->cowork_source_id;2581mst_data = afe_priv->dai_priv[mst_dai_id];2582if (mst_data->cowork_source_id != COWORK_ETDM_NONE)2583dev_err(afe->dev, "%s [%d] wrong sync source\n",2584__func__, i);2585mst_data->cowork_slv_id[mst_data->cowork_slv_count] = i;2586mst_data->cowork_slv_count++;2587}2588}2589}25902591static void mt8188_dai_etdm_parse_of(struct mtk_base_afe *afe)2592{2593const struct device_node *of_node = afe->dev->of_node;2594struct mt8188_afe_private *afe_priv = afe->platform_priv;2595struct mtk_dai_etdm_priv *etdm_data;2596char prop[48];2597u8 disable_chn[MT8188_ETDM_MAX_CHANNELS];2598int max_chn = MT8188_ETDM_MAX_CHANNELS;2599unsigned int sync_id;2600u32 sel;2601int ret;2602int dai_id;2603int i, j;2604struct {2605const char *name;2606const unsigned int sync_id;2607} of_afe_etdms[MT8188_AFE_IO_ETDM_NUM] = {2608{"etdm-in1", ETDM_SYNC_FROM_IN1},2609{"etdm-in2", ETDM_SYNC_FROM_IN2},2610{"etdm-out1", ETDM_SYNC_FROM_OUT1},2611{"etdm-out2", ETDM_SYNC_FROM_OUT2},2612{"etdm-out3", ETDM_SYNC_FROM_OUT3},2613};26142615for (i = 0; i < MT8188_AFE_IO_ETDM_NUM; i++) {2616dai_id = ETDM_TO_DAI_ID(i);2617etdm_data = afe_priv->dai_priv[dai_id];26182619snprintf(prop, sizeof(prop), "mediatek,%s-multi-pin-mode",2620of_afe_etdms[i].name);26212622etdm_data->data_mode = of_property_read_bool(of_node, prop);26232624snprintf(prop, sizeof(prop), "mediatek,%s-cowork-source",2625of_afe_etdms[i].name);26262627ret = of_property_read_u32(of_node, prop, &sel);2628if (ret == 0) {2629if (sel >= MT8188_AFE_IO_ETDM_NUM) {2630dev_err(afe->dev, "%s invalid id=%d\n",2631__func__, sel);2632etdm_data->cowork_source_id = COWORK_ETDM_NONE;2633} else {2634sync_id = of_afe_etdms[sel].sync_id;2635etdm_data->cowork_source_id =2636sync_to_dai_id(sync_id);2637}2638} else {2639etdm_data->cowork_source_id = COWORK_ETDM_NONE;2640}2641}26422643/* etdm in only */2644for (i = 0; i < 2; i++) {2645dai_id = ETDM_TO_DAI_ID(i);2646etdm_data = afe_priv->dai_priv[dai_id];26472648snprintf(prop, sizeof(prop), "mediatek,%s-chn-disabled",2649of_afe_etdms[i].name);26502651ret = of_property_read_variable_u8_array(of_node, prop,2652disable_chn,26531, max_chn);2654if (ret < 0)2655continue;26562657for (j = 0; j < ret; j++) {2658if (disable_chn[j] >= MT8188_ETDM_MAX_CHANNELS)2659dev_err(afe->dev, "%s [%d] invalid chn %u\n",2660__func__, j, disable_chn[j]);2661else2662etdm_data->in_disable_ch[disable_chn[j]] = true;2663}2664}2665mt8188_etdm_update_sync_info(afe);2666}26672668static int init_etdm_priv_data(struct mtk_base_afe *afe)2669{2670struct mt8188_afe_private *afe_priv = afe->platform_priv;2671struct mtk_dai_etdm_priv *etdm_priv;2672int i;26732674for (i = MT8188_AFE_IO_ETDM_START; i < MT8188_AFE_IO_ETDM_END; i++) {2675etdm_priv = devm_kzalloc(afe->dev,2676sizeof(struct mtk_dai_etdm_priv),2677GFP_KERNEL);2678if (!etdm_priv)2679return -ENOMEM;26802681afe_priv->dai_priv[i] = etdm_priv;2682}26832684afe_priv->dai_priv[MT8188_AFE_IO_DPTX] =2685afe_priv->dai_priv[MT8188_AFE_IO_ETDM3_OUT];26862687mt8188_dai_etdm_parse_of(afe);2688return 0;2689}26902691int mt8188_dai_etdm_register(struct mtk_base_afe *afe)2692{2693struct mtk_base_afe_dai *dai;26942695dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);2696if (!dai)2697return -ENOMEM;26982699list_add(&dai->list, &afe->sub_dais);27002701dai->dai_drivers = mtk_dai_etdm_driver;2702dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_etdm_driver);27032704dai->dapm_widgets = mtk_dai_etdm_widgets;2705dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_etdm_widgets);2706dai->dapm_routes = mtk_dai_etdm_routes;2707dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_etdm_routes);2708dai->controls = mtk_dai_etdm_controls;2709dai->num_controls = ARRAY_SIZE(mtk_dai_etdm_controls);27102711return init_etdm_priv_data(afe);2712}271327142715