Path: blob/master/sound/soc/mediatek/mt8195/mt8195-dai-etdm.c
55028 views
// SPDX-License-Identifier: GPL-2.01/*2* MediaTek ALSA SoC Audio DAI eTDM Control3*4* Copyright (c) 2021 MediaTek Inc.5* Author: Bicycle Tsai <[email protected]>6* Trevor Wu <[email protected]>7*/89#include <linux/delay.h>10#include <linux/pm_runtime.h>11#include <linux/regmap.h>12#include <sound/pcm_params.h>13#include "mt8195-afe-clk.h"14#include "mt8195-afe-common.h"15#include "mt8195-reg.h"1617#define MT8195_ETDM_MAX_CHANNELS 2418#define MT8195_ETDM_NORMAL_MAX_BCK_RATE 2457600019#define ETDM_TO_DAI_ID(x) ((x) + MT8195_AFE_IO_ETDM_START)20#define ENUM_TO_STR(x) #x2122enum {23MTK_DAI_ETDM_FORMAT_I2S = 0,24MTK_DAI_ETDM_FORMAT_LJ,25MTK_DAI_ETDM_FORMAT_RJ,26MTK_DAI_ETDM_FORMAT_EIAJ,27MTK_DAI_ETDM_FORMAT_DSPA,28MTK_DAI_ETDM_FORMAT_DSPB,29};3031enum {32MTK_DAI_ETDM_DATA_ONE_PIN = 0,33MTK_DAI_ETDM_DATA_MULTI_PIN,34};3536enum {37ETDM_IN,38ETDM_OUT,39};4041enum {42ETDM_IN_FROM_PAD,43ETDM_IN_FROM_ETDM_OUT1,44ETDM_IN_FROM_ETDM_OUT2,45};4647enum {48ETDM_IN_SLAVE_FROM_PAD,49ETDM_IN_SLAVE_FROM_ETDM_OUT1,50ETDM_IN_SLAVE_FROM_ETDM_OUT2,51};5253enum {54ETDM_OUT_SLAVE_FROM_PAD,55ETDM_OUT_SLAVE_FROM_ETDM_IN1,56ETDM_OUT_SLAVE_FROM_ETDM_IN2,57};5859enum {60COWORK_ETDM_NONE = 0,61COWORK_ETDM_IN1_M = 2,62COWORK_ETDM_IN1_S = 3,63COWORK_ETDM_IN2_M = 4,64COWORK_ETDM_IN2_S = 5,65COWORK_ETDM_OUT1_M = 10,66COWORK_ETDM_OUT1_S = 11,67COWORK_ETDM_OUT2_M = 12,68COWORK_ETDM_OUT2_S = 13,69COWORK_ETDM_OUT3_M = 14,70COWORK_ETDM_OUT3_S = 15,71};7273enum {74ETDM_RELATCH_TIMING_A1A2SYS,75ETDM_RELATCH_TIMING_A3SYS,76ETDM_RELATCH_TIMING_A4SYS,77};7879enum {80ETDM_SYNC_NONE,81ETDM_SYNC_FROM_IN1,82ETDM_SYNC_FROM_IN2,83ETDM_SYNC_FROM_OUT1,84ETDM_SYNC_FROM_OUT2,85ETDM_SYNC_FROM_OUT3,86};8788struct etdm_con_reg {89unsigned int con0;90unsigned int con1;91unsigned int con2;92unsigned int con3;93unsigned int con4;94unsigned int con5;95};9697struct mtk_dai_etdm_rate {98unsigned int rate;99unsigned int reg_value;100};101102struct mtk_dai_etdm_priv {103unsigned int clock_mode;104unsigned int data_mode;105bool slave_mode;106bool lrck_inv;107bool bck_inv;108unsigned int format;109unsigned int slots;110unsigned int lrck_width;111unsigned int mclk_freq;112unsigned int mclk_apll;113unsigned int mclk_dir;114int cowork_source_id; //dai id115unsigned int cowork_slv_count;116int cowork_slv_id[MT8195_AFE_IO_ETDM_NUM - 1]; //dai_id117bool in_disable_ch[MT8195_ETDM_MAX_CHANNELS];118unsigned int en_ref_cnt;119};120121static const struct mtk_dai_etdm_rate mt8195_etdm_rates[] = {122{ .rate = 8000, .reg_value = 0, },123{ .rate = 12000, .reg_value = 1, },124{ .rate = 16000, .reg_value = 2, },125{ .rate = 24000, .reg_value = 3, },126{ .rate = 32000, .reg_value = 4, },127{ .rate = 48000, .reg_value = 5, },128{ .rate = 96000, .reg_value = 7, },129{ .rate = 192000, .reg_value = 9, },130{ .rate = 384000, .reg_value = 11, },131{ .rate = 11025, .reg_value = 16, },132{ .rate = 22050, .reg_value = 17, },133{ .rate = 44100, .reg_value = 18, },134{ .rate = 88200, .reg_value = 19, },135{ .rate = 176400, .reg_value = 20, },136{ .rate = 352800, .reg_value = 21, },137};138139static bool mt8195_afe_etdm_is_valid(int id)140{141switch (id) {142case MT8195_AFE_IO_ETDM1_IN:143fallthrough;144case MT8195_AFE_IO_ETDM2_IN:145fallthrough;146case MT8195_AFE_IO_ETDM1_OUT:147fallthrough;148case MT8195_AFE_IO_ETDM2_OUT:149fallthrough;150case MT8195_AFE_IO_DPTX:151fallthrough;152case MT8195_AFE_IO_ETDM3_OUT:153return true;154default:155return false;156}157}158159static bool mt8195_afe_hdmitx_dptx_is_valid(int id)160{161switch (id) {162case MT8195_AFE_IO_DPTX:163fallthrough;164case MT8195_AFE_IO_ETDM3_OUT:165return true;166default:167return false;168}169}170171static int get_etdm_fs_timing(unsigned int rate)172{173int i;174175for (i = 0; i < ARRAY_SIZE(mt8195_etdm_rates); i++)176if (mt8195_etdm_rates[i].rate == rate)177return mt8195_etdm_rates[i].reg_value;178179return -EINVAL;180}181182static unsigned int get_etdm_ch_fixup(unsigned int channels)183{184if (channels > 16)185return 24;186else if (channels > 8)187return 16;188else if (channels > 4)189return 8;190else if (channels > 2)191return 4;192else193return 2;194}195196static int get_etdm_reg(unsigned int dai_id, struct etdm_con_reg *etdm_reg)197{198switch (dai_id) {199case MT8195_AFE_IO_ETDM1_IN:200etdm_reg->con0 = ETDM_IN1_CON0;201etdm_reg->con1 = ETDM_IN1_CON1;202etdm_reg->con2 = ETDM_IN1_CON2;203etdm_reg->con3 = ETDM_IN1_CON3;204etdm_reg->con4 = ETDM_IN1_CON4;205etdm_reg->con5 = ETDM_IN1_CON5;206break;207case MT8195_AFE_IO_ETDM2_IN:208etdm_reg->con0 = ETDM_IN2_CON0;209etdm_reg->con1 = ETDM_IN2_CON1;210etdm_reg->con2 = ETDM_IN2_CON2;211etdm_reg->con3 = ETDM_IN2_CON3;212etdm_reg->con4 = ETDM_IN2_CON4;213etdm_reg->con5 = ETDM_IN2_CON5;214break;215case MT8195_AFE_IO_ETDM1_OUT:216etdm_reg->con0 = ETDM_OUT1_CON0;217etdm_reg->con1 = ETDM_OUT1_CON1;218etdm_reg->con2 = ETDM_OUT1_CON2;219etdm_reg->con3 = ETDM_OUT1_CON3;220etdm_reg->con4 = ETDM_OUT1_CON4;221etdm_reg->con5 = ETDM_OUT1_CON5;222break;223case MT8195_AFE_IO_ETDM2_OUT:224etdm_reg->con0 = ETDM_OUT2_CON0;225etdm_reg->con1 = ETDM_OUT2_CON1;226etdm_reg->con2 = ETDM_OUT2_CON2;227etdm_reg->con3 = ETDM_OUT2_CON3;228etdm_reg->con4 = ETDM_OUT2_CON4;229etdm_reg->con5 = ETDM_OUT2_CON5;230break;231case MT8195_AFE_IO_ETDM3_OUT:232case MT8195_AFE_IO_DPTX:233etdm_reg->con0 = ETDM_OUT3_CON0;234etdm_reg->con1 = ETDM_OUT3_CON1;235etdm_reg->con2 = ETDM_OUT3_CON2;236etdm_reg->con3 = ETDM_OUT3_CON3;237etdm_reg->con4 = ETDM_OUT3_CON4;238etdm_reg->con5 = ETDM_OUT3_CON5;239break;240default:241return -EINVAL;242}243return 0;244}245246static int get_etdm_dir(unsigned int dai_id)247{248switch (dai_id) {249case MT8195_AFE_IO_ETDM1_IN:250case MT8195_AFE_IO_ETDM2_IN:251return ETDM_IN;252case MT8195_AFE_IO_ETDM1_OUT:253case MT8195_AFE_IO_ETDM2_OUT:254case MT8195_AFE_IO_ETDM3_OUT:255return ETDM_OUT;256default:257return -EINVAL;258}259}260261static int get_etdm_wlen(unsigned int bitwidth)262{263return bitwidth <= 16 ? 16 : 32;264}265266static int is_cowork_mode(struct snd_soc_dai *dai)267{268struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);269struct mt8195_afe_private *afe_priv = afe->platform_priv;270struct mtk_dai_etdm_priv *etdm_data;271272if (!mt8195_afe_etdm_is_valid(dai->id))273return -EINVAL;274275etdm_data = afe_priv->dai_priv[dai->id];276return (etdm_data->cowork_slv_count > 0 ||277etdm_data->cowork_source_id != COWORK_ETDM_NONE);278}279280static int sync_to_dai_id(int source_sel)281{282switch (source_sel) {283case ETDM_SYNC_FROM_IN1:284return MT8195_AFE_IO_ETDM1_IN;285case ETDM_SYNC_FROM_IN2:286return MT8195_AFE_IO_ETDM2_IN;287case ETDM_SYNC_FROM_OUT1:288return MT8195_AFE_IO_ETDM1_OUT;289case ETDM_SYNC_FROM_OUT2:290return MT8195_AFE_IO_ETDM2_OUT;291case ETDM_SYNC_FROM_OUT3:292return MT8195_AFE_IO_ETDM3_OUT;293default:294return 0;295}296}297298static int get_etdm_cowork_master_id(struct snd_soc_dai *dai)299{300struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);301struct mt8195_afe_private *afe_priv = afe->platform_priv;302struct mtk_dai_etdm_priv *etdm_data;303int dai_id;304305if (!mt8195_afe_etdm_is_valid(dai->id))306return -EINVAL;307308etdm_data = afe_priv->dai_priv[dai->id];309dai_id = etdm_data->cowork_source_id;310311if (dai_id == COWORK_ETDM_NONE)312dai_id = dai->id;313314return dai_id;315}316317static const struct snd_kcontrol_new mtk_dai_etdm_o048_mix[] = {318SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN48, 20, 1, 0),319SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN48, 22, 1, 0),320SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN48_1, 14, 1, 0),321SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN48_2, 6, 1, 0),322};323324static const struct snd_kcontrol_new mtk_dai_etdm_o049_mix[] = {325SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN49, 21, 1, 0),326SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN49, 23, 1, 0),327SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN49_1, 15, 1, 0),328SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN49_2, 7, 1, 0),329};330331static const struct snd_kcontrol_new mtk_dai_etdm_o050_mix[] = {332SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN50, 24, 1, 0),333SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN50_1, 16, 1, 0),334};335336static const struct snd_kcontrol_new mtk_dai_etdm_o051_mix[] = {337SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN51, 25, 1, 0),338SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN51_1, 17, 1, 0),339};340341static const struct snd_kcontrol_new mtk_dai_etdm_o052_mix[] = {342SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN52, 26, 1, 0),343SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN52_1, 18, 1, 0),344};345346static const struct snd_kcontrol_new mtk_dai_etdm_o053_mix[] = {347SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN53, 27, 1, 0),348SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN53_1, 19, 1, 0),349};350351static const struct snd_kcontrol_new mtk_dai_etdm_o054_mix[] = {352SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN54, 28, 1, 0),353SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN54_1, 20, 1, 0),354};355356static const struct snd_kcontrol_new mtk_dai_etdm_o055_mix[] = {357SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN55, 29, 1, 0),358SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN55_1, 21, 1, 0),359};360361static const struct snd_kcontrol_new mtk_dai_etdm_o056_mix[] = {362SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN56, 30, 1, 0),363SOC_DAPM_SINGLE_AUTODISABLE("I054 Switch", AFE_CONN56_1, 22, 1, 0),364};365366static const struct snd_kcontrol_new mtk_dai_etdm_o057_mix[] = {367SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN57, 31, 1, 0),368SOC_DAPM_SINGLE_AUTODISABLE("I055 Switch", AFE_CONN57_1, 23, 1, 0),369};370371static const struct snd_kcontrol_new mtk_dai_etdm_o058_mix[] = {372SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN58_1, 0, 1, 0),373SOC_DAPM_SINGLE_AUTODISABLE("I056 Switch", AFE_CONN58_1, 24, 1, 0),374};375376static const struct snd_kcontrol_new mtk_dai_etdm_o059_mix[] = {377SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN59_1, 1, 1, 0),378SOC_DAPM_SINGLE_AUTODISABLE("I057 Switch", AFE_CONN59_1, 25, 1, 0),379};380381static const struct snd_kcontrol_new mtk_dai_etdm_o060_mix[] = {382SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN60_1, 2, 1, 0),383SOC_DAPM_SINGLE_AUTODISABLE("I058 Switch", AFE_CONN60_1, 26, 1, 0),384};385386static const struct snd_kcontrol_new mtk_dai_etdm_o061_mix[] = {387SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN61_1, 3, 1, 0),388SOC_DAPM_SINGLE_AUTODISABLE("I059 Switch", AFE_CONN61_1, 27, 1, 0),389};390391static const struct snd_kcontrol_new mtk_dai_etdm_o062_mix[] = {392SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN62_1, 4, 1, 0),393SOC_DAPM_SINGLE_AUTODISABLE("I060 Switch", AFE_CONN62_1, 28, 1, 0),394};395396static const struct snd_kcontrol_new mtk_dai_etdm_o063_mix[] = {397SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN63_1, 5, 1, 0),398SOC_DAPM_SINGLE_AUTODISABLE("I061 Switch", AFE_CONN63_1, 29, 1, 0),399};400401static const struct snd_kcontrol_new mtk_dai_etdm_o064_mix[] = {402SOC_DAPM_SINGLE_AUTODISABLE("I038 Switch", AFE_CONN64_1, 6, 1, 0),403SOC_DAPM_SINGLE_AUTODISABLE("I062 Switch", AFE_CONN64_1, 30, 1, 0),404};405406static const struct snd_kcontrol_new mtk_dai_etdm_o065_mix[] = {407SOC_DAPM_SINGLE_AUTODISABLE("I039 Switch", AFE_CONN65_1, 7, 1, 0),408SOC_DAPM_SINGLE_AUTODISABLE("I063 Switch", AFE_CONN65_1, 31, 1, 0),409};410411static const struct snd_kcontrol_new mtk_dai_etdm_o066_mix[] = {412SOC_DAPM_SINGLE_AUTODISABLE("I040 Switch", AFE_CONN66_1, 8, 1, 0),413SOC_DAPM_SINGLE_AUTODISABLE("I064 Switch", AFE_CONN66_2, 0, 1, 0),414};415416static const struct snd_kcontrol_new mtk_dai_etdm_o067_mix[] = {417SOC_DAPM_SINGLE_AUTODISABLE("I041 Switch", AFE_CONN67_1, 9, 1, 0),418SOC_DAPM_SINGLE_AUTODISABLE("I065 Switch", AFE_CONN67_2, 1, 1, 0),419};420421static const struct snd_kcontrol_new mtk_dai_etdm_o068_mix[] = {422SOC_DAPM_SINGLE_AUTODISABLE("I042 Switch", AFE_CONN68_1, 10, 1, 0),423SOC_DAPM_SINGLE_AUTODISABLE("I066 Switch", AFE_CONN68_2, 2, 1, 0),424};425426static const struct snd_kcontrol_new mtk_dai_etdm_o069_mix[] = {427SOC_DAPM_SINGLE_AUTODISABLE("I043 Switch", AFE_CONN69_1, 11, 1, 0),428SOC_DAPM_SINGLE_AUTODISABLE("I067 Switch", AFE_CONN69_2, 3, 1, 0),429};430431static const struct snd_kcontrol_new mtk_dai_etdm_o070_mix[] = {432SOC_DAPM_SINGLE_AUTODISABLE("I044 Switch", AFE_CONN70_1, 12, 1, 0),433SOC_DAPM_SINGLE_AUTODISABLE("I068 Switch", AFE_CONN70_2, 4, 1, 0),434};435436static const struct snd_kcontrol_new mtk_dai_etdm_o071_mix[] = {437SOC_DAPM_SINGLE_AUTODISABLE("I045 Switch", AFE_CONN71_1, 13, 1, 0),438SOC_DAPM_SINGLE_AUTODISABLE("I069 Switch", AFE_CONN71_2, 5, 1, 0),439};440441static const struct snd_kcontrol_new mtk_dai_etdm_o072_mix[] = {442SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN72, 20, 1, 0),443SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN72, 22, 1, 0),444SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN72_1, 14, 1, 0),445SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN72_2, 6, 1, 0),446};447448static const struct snd_kcontrol_new mtk_dai_etdm_o073_mix[] = {449SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN73, 21, 1, 0),450SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN73, 23, 1, 0),451SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN73_1, 15, 1, 0),452SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN73_2, 7, 1, 0),453};454455static const struct snd_kcontrol_new mtk_dai_etdm_o074_mix[] = {456SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN74, 24, 1, 0),457SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN74_1, 16, 1, 0),458};459460static const struct snd_kcontrol_new mtk_dai_etdm_o075_mix[] = {461SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN75, 25, 1, 0),462SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN75_1, 17, 1, 0),463};464465static const struct snd_kcontrol_new mtk_dai_etdm_o076_mix[] = {466SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN76, 26, 1, 0),467SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN76_1, 18, 1, 0),468};469470static const struct snd_kcontrol_new mtk_dai_etdm_o077_mix[] = {471SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN77, 27, 1, 0),472SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN77_1, 19, 1, 0),473};474475static const struct snd_kcontrol_new mtk_dai_etdm_o078_mix[] = {476SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN78, 28, 1, 0),477SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN78_1, 20, 1, 0),478};479480static const struct snd_kcontrol_new mtk_dai_etdm_o079_mix[] = {481SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN79, 29, 1, 0),482SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN79_1, 21, 1, 0),483};484485static const struct snd_kcontrol_new mtk_dai_etdm_o080_mix[] = {486SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN80, 30, 1, 0),487SOC_DAPM_SINGLE_AUTODISABLE("I054 Switch", AFE_CONN80_1, 22, 1, 0),488};489490static const struct snd_kcontrol_new mtk_dai_etdm_o081_mix[] = {491SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN81, 31, 1, 0),492SOC_DAPM_SINGLE_AUTODISABLE("I055 Switch", AFE_CONN81_1, 23, 1, 0),493};494495static const struct snd_kcontrol_new mtk_dai_etdm_o082_mix[] = {496SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN82_1, 0, 1, 0),497SOC_DAPM_SINGLE_AUTODISABLE("I056 Switch", AFE_CONN82_1, 24, 1, 0),498};499500static const struct snd_kcontrol_new mtk_dai_etdm_o083_mix[] = {501SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN83_1, 1, 1, 0),502SOC_DAPM_SINGLE_AUTODISABLE("I057 Switch", AFE_CONN83_1, 25, 1, 0),503};504505static const struct snd_kcontrol_new mtk_dai_etdm_o084_mix[] = {506SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN84_1, 2, 1, 0),507SOC_DAPM_SINGLE_AUTODISABLE("I058 Switch", AFE_CONN84_1, 26, 1, 0),508};509510static const struct snd_kcontrol_new mtk_dai_etdm_o085_mix[] = {511SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN85_1, 3, 1, 0),512SOC_DAPM_SINGLE_AUTODISABLE("I059 Switch", AFE_CONN85_1, 27, 1, 0),513};514515static const struct snd_kcontrol_new mtk_dai_etdm_o086_mix[] = {516SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN86_1, 4, 1, 0),517SOC_DAPM_SINGLE_AUTODISABLE("I060 Switch", AFE_CONN86_1, 28, 1, 0),518};519520static const struct snd_kcontrol_new mtk_dai_etdm_o087_mix[] = {521SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN87_1, 5, 1, 0),522SOC_DAPM_SINGLE_AUTODISABLE("I061 Switch", AFE_CONN87_1, 29, 1, 0),523};524525static const struct snd_kcontrol_new mtk_dai_etdm_o088_mix[] = {526SOC_DAPM_SINGLE_AUTODISABLE("I038 Switch", AFE_CONN88_1, 6, 1, 0),527SOC_DAPM_SINGLE_AUTODISABLE("I062 Switch", AFE_CONN88_1, 30, 1, 0),528};529530static const struct snd_kcontrol_new mtk_dai_etdm_o089_mix[] = {531SOC_DAPM_SINGLE_AUTODISABLE("I039 Switch", AFE_CONN89_1, 7, 1, 0),532SOC_DAPM_SINGLE_AUTODISABLE("I063 Switch", AFE_CONN89_1, 31, 1, 0),533};534535static const struct snd_kcontrol_new mtk_dai_etdm_o090_mix[] = {536SOC_DAPM_SINGLE_AUTODISABLE("I040 Switch", AFE_CONN90_1, 8, 1, 0),537SOC_DAPM_SINGLE_AUTODISABLE("I064 Switch", AFE_CONN90_2, 0, 1, 0),538};539540static const struct snd_kcontrol_new mtk_dai_etdm_o091_mix[] = {541SOC_DAPM_SINGLE_AUTODISABLE("I041 Switch", AFE_CONN91_1, 9, 1, 0),542SOC_DAPM_SINGLE_AUTODISABLE("I065 Switch", AFE_CONN91_2, 1, 1, 0),543};544545static const struct snd_kcontrol_new mtk_dai_etdm_o092_mix[] = {546SOC_DAPM_SINGLE_AUTODISABLE("I042 Switch", AFE_CONN92_1, 10, 1, 0),547SOC_DAPM_SINGLE_AUTODISABLE("I066 Switch", AFE_CONN92_2, 2, 1, 0),548};549550static const struct snd_kcontrol_new mtk_dai_etdm_o093_mix[] = {551SOC_DAPM_SINGLE_AUTODISABLE("I043 Switch", AFE_CONN93_1, 11, 1, 0),552SOC_DAPM_SINGLE_AUTODISABLE("I067 Switch", AFE_CONN93_2, 3, 1, 0),553};554555static const struct snd_kcontrol_new mtk_dai_etdm_o094_mix[] = {556SOC_DAPM_SINGLE_AUTODISABLE("I044 Switch", AFE_CONN94_1, 12, 1, 0),557SOC_DAPM_SINGLE_AUTODISABLE("I068 Switch", AFE_CONN94_2, 4, 1, 0),558};559560static const struct snd_kcontrol_new mtk_dai_etdm_o095_mix[] = {561SOC_DAPM_SINGLE_AUTODISABLE("I045 Switch", AFE_CONN95_1, 13, 1, 0),562SOC_DAPM_SINGLE_AUTODISABLE("I069 Switch", AFE_CONN95_2, 5, 1, 0),563};564565static const char * const mt8195_etdm_clk_src_sel_text[] = {566"26m",567"a1sys_a2sys",568"a3sys",569"a4sys",570};571572static SOC_ENUM_SINGLE_EXT_DECL(etdmout_clk_src_enum,573mt8195_etdm_clk_src_sel_text);574575static const char * const hdmitx_dptx_mux_map[] = {576"Disconnect", "Connect",577};578579static int hdmitx_dptx_mux_map_value[] = {5800, 1,581};582583/* HDMI_OUT_MUX */584static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(hdmi_out_mux_map_enum,585SND_SOC_NOPM,5860,5871,588hdmitx_dptx_mux_map,589hdmitx_dptx_mux_map_value);590591static const struct snd_kcontrol_new hdmi_out_mux_control =592SOC_DAPM_ENUM("HDMI_OUT_MUX", hdmi_out_mux_map_enum);593594/* DPTX_OUT_MUX */595static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(dptx_out_mux_map_enum,596SND_SOC_NOPM,5970,5981,599hdmitx_dptx_mux_map,600hdmitx_dptx_mux_map_value);601602static const struct snd_kcontrol_new dptx_out_mux_control =603SOC_DAPM_ENUM("DPTX_OUT_MUX", dptx_out_mux_map_enum);604605/* HDMI_CH0_MUX ~ HDMI_CH7_MUX */606static const char *const afe_conn_hdmi_mux_map[] = {607"CH0", "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7",608};609610static int afe_conn_hdmi_mux_map_value[] = {6110, 1, 2, 3, 4, 5, 6, 7,612};613614static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch0_mux_map_enum,615AFE_TDMOUT_CONN0,6160,6170xf,618afe_conn_hdmi_mux_map,619afe_conn_hdmi_mux_map_value);620621static const struct snd_kcontrol_new hdmi_ch0_mux_control =622SOC_DAPM_ENUM("HDMI_CH0_MUX", hdmi_ch0_mux_map_enum);623624static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch1_mux_map_enum,625AFE_TDMOUT_CONN0,6264,6270xf,628afe_conn_hdmi_mux_map,629afe_conn_hdmi_mux_map_value);630631static const struct snd_kcontrol_new hdmi_ch1_mux_control =632SOC_DAPM_ENUM("HDMI_CH1_MUX", hdmi_ch1_mux_map_enum);633634static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch2_mux_map_enum,635AFE_TDMOUT_CONN0,6368,6370xf,638afe_conn_hdmi_mux_map,639afe_conn_hdmi_mux_map_value);640641static const struct snd_kcontrol_new hdmi_ch2_mux_control =642SOC_DAPM_ENUM("HDMI_CH2_MUX", hdmi_ch2_mux_map_enum);643644static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch3_mux_map_enum,645AFE_TDMOUT_CONN0,64612,6470xf,648afe_conn_hdmi_mux_map,649afe_conn_hdmi_mux_map_value);650651static const struct snd_kcontrol_new hdmi_ch3_mux_control =652SOC_DAPM_ENUM("HDMI_CH3_MUX", hdmi_ch3_mux_map_enum);653654static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch4_mux_map_enum,655AFE_TDMOUT_CONN0,65616,6570xf,658afe_conn_hdmi_mux_map,659afe_conn_hdmi_mux_map_value);660661static const struct snd_kcontrol_new hdmi_ch4_mux_control =662SOC_DAPM_ENUM("HDMI_CH4_MUX", hdmi_ch4_mux_map_enum);663664static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch5_mux_map_enum,665AFE_TDMOUT_CONN0,66620,6670xf,668afe_conn_hdmi_mux_map,669afe_conn_hdmi_mux_map_value);670671static const struct snd_kcontrol_new hdmi_ch5_mux_control =672SOC_DAPM_ENUM("HDMI_CH5_MUX", hdmi_ch5_mux_map_enum);673674static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch6_mux_map_enum,675AFE_TDMOUT_CONN0,67624,6770xf,678afe_conn_hdmi_mux_map,679afe_conn_hdmi_mux_map_value);680681static const struct snd_kcontrol_new hdmi_ch6_mux_control =682SOC_DAPM_ENUM("HDMI_CH6_MUX", hdmi_ch6_mux_map_enum);683684static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch7_mux_map_enum,685AFE_TDMOUT_CONN0,68628,6870xf,688afe_conn_hdmi_mux_map,689afe_conn_hdmi_mux_map_value);690691static const struct snd_kcontrol_new hdmi_ch7_mux_control =692SOC_DAPM_ENUM("HDMI_CH7_MUX", hdmi_ch7_mux_map_enum);693694static int mt8195_etdm_clk_src_sel_put(struct snd_kcontrol *kcontrol,695struct snd_ctl_elem_value *ucontrol)696{697struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);698struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;699struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);700unsigned int source = ucontrol->value.enumerated.item[0];701unsigned int val;702unsigned int mask;703unsigned int reg;704705if (source >= e->items)706return -EINVAL;707708reg = 0;709if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) {710reg = ETDM_OUT1_CON4;711mask = ETDM_OUT_CON4_CLOCK_MASK;712val = ETDM_OUT_CON4_CLOCK(source);713} else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) {714reg = ETDM_OUT2_CON4;715mask = ETDM_OUT_CON4_CLOCK_MASK;716val = ETDM_OUT_CON4_CLOCK(source);717} else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) {718reg = ETDM_OUT3_CON4;719mask = ETDM_OUT_CON4_CLOCK_MASK;720val = ETDM_OUT_CON4_CLOCK(source);721} else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) {722reg = ETDM_IN1_CON2;723mask = ETDM_IN_CON2_CLOCK_MASK;724val = ETDM_IN_CON2_CLOCK(source);725} else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) {726reg = ETDM_IN2_CON2;727mask = ETDM_IN_CON2_CLOCK_MASK;728val = ETDM_IN_CON2_CLOCK(source);729}730731if (reg)732regmap_update_bits(afe->regmap, reg, mask, val);733734return 0;735}736737static int mt8195_etdm_clk_src_sel_get(struct snd_kcontrol *kcontrol,738struct snd_ctl_elem_value *ucontrol)739{740struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);741struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);742unsigned int value = 0;743unsigned int reg = 0;744unsigned int mask = 0;745unsigned int shift = 0;746747if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) {748reg = ETDM_OUT1_CON4;749mask = ETDM_OUT_CON4_CLOCK_MASK;750shift = ETDM_OUT_CON4_CLOCK_SHIFT;751} else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) {752reg = ETDM_OUT2_CON4;753mask = ETDM_OUT_CON4_CLOCK_MASK;754shift = ETDM_OUT_CON4_CLOCK_SHIFT;755} else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) {756reg = ETDM_OUT3_CON4;757mask = ETDM_OUT_CON4_CLOCK_MASK;758shift = ETDM_OUT_CON4_CLOCK_SHIFT;759} else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) {760reg = ETDM_IN1_CON2;761mask = ETDM_IN_CON2_CLOCK_MASK;762shift = ETDM_IN_CON2_CLOCK_SHIFT;763} else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) {764reg = ETDM_IN2_CON2;765mask = ETDM_IN_CON2_CLOCK_MASK;766shift = ETDM_IN_CON2_CLOCK_SHIFT;767}768769if (reg)770regmap_read(afe->regmap, reg, &value);771772value &= mask;773value >>= shift;774ucontrol->value.enumerated.item[0] = value;775return 0;776}777778static const struct snd_kcontrol_new mtk_dai_etdm_controls[] = {779SOC_ENUM_EXT("ETDM_OUT1_Clock_Source",780etdmout_clk_src_enum,781mt8195_etdm_clk_src_sel_get,782mt8195_etdm_clk_src_sel_put),783SOC_ENUM_EXT("ETDM_OUT2_Clock_Source",784etdmout_clk_src_enum,785mt8195_etdm_clk_src_sel_get,786mt8195_etdm_clk_src_sel_put),787SOC_ENUM_EXT("ETDM_OUT3_Clock_Source",788etdmout_clk_src_enum,789mt8195_etdm_clk_src_sel_get,790mt8195_etdm_clk_src_sel_put),791SOC_ENUM_EXT("ETDM_IN1_Clock_Source",792etdmout_clk_src_enum,793mt8195_etdm_clk_src_sel_get,794mt8195_etdm_clk_src_sel_put),795SOC_ENUM_EXT("ETDM_IN2_Clock_Source",796etdmout_clk_src_enum,797mt8195_etdm_clk_src_sel_get,798mt8195_etdm_clk_src_sel_put),799};800801static const struct snd_soc_dapm_widget mtk_dai_etdm_widgets[] = {802/* eTDM_IN2 */803SND_SOC_DAPM_MIXER("I012", SND_SOC_NOPM, 0, 0, NULL, 0),804SND_SOC_DAPM_MIXER("I013", SND_SOC_NOPM, 0, 0, NULL, 0),805SND_SOC_DAPM_MIXER("I014", SND_SOC_NOPM, 0, 0, NULL, 0),806SND_SOC_DAPM_MIXER("I015", SND_SOC_NOPM, 0, 0, NULL, 0),807SND_SOC_DAPM_MIXER("I016", SND_SOC_NOPM, 0, 0, NULL, 0),808SND_SOC_DAPM_MIXER("I017", SND_SOC_NOPM, 0, 0, NULL, 0),809SND_SOC_DAPM_MIXER("I018", SND_SOC_NOPM, 0, 0, NULL, 0),810SND_SOC_DAPM_MIXER("I019", SND_SOC_NOPM, 0, 0, NULL, 0),811812/* eTDM_IN1 */813SND_SOC_DAPM_MIXER("I072", SND_SOC_NOPM, 0, 0, NULL, 0),814SND_SOC_DAPM_MIXER("I073", SND_SOC_NOPM, 0, 0, NULL, 0),815SND_SOC_DAPM_MIXER("I074", SND_SOC_NOPM, 0, 0, NULL, 0),816SND_SOC_DAPM_MIXER("I075", SND_SOC_NOPM, 0, 0, NULL, 0),817SND_SOC_DAPM_MIXER("I076", SND_SOC_NOPM, 0, 0, NULL, 0),818SND_SOC_DAPM_MIXER("I077", SND_SOC_NOPM, 0, 0, NULL, 0),819SND_SOC_DAPM_MIXER("I078", SND_SOC_NOPM, 0, 0, NULL, 0),820SND_SOC_DAPM_MIXER("I079", SND_SOC_NOPM, 0, 0, NULL, 0),821SND_SOC_DAPM_MIXER("I080", SND_SOC_NOPM, 0, 0, NULL, 0),822SND_SOC_DAPM_MIXER("I081", SND_SOC_NOPM, 0, 0, NULL, 0),823SND_SOC_DAPM_MIXER("I082", SND_SOC_NOPM, 0, 0, NULL, 0),824SND_SOC_DAPM_MIXER("I083", SND_SOC_NOPM, 0, 0, NULL, 0),825SND_SOC_DAPM_MIXER("I084", SND_SOC_NOPM, 0, 0, NULL, 0),826SND_SOC_DAPM_MIXER("I085", SND_SOC_NOPM, 0, 0, NULL, 0),827SND_SOC_DAPM_MIXER("I086", SND_SOC_NOPM, 0, 0, NULL, 0),828SND_SOC_DAPM_MIXER("I087", SND_SOC_NOPM, 0, 0, NULL, 0),829SND_SOC_DAPM_MIXER("I088", SND_SOC_NOPM, 0, 0, NULL, 0),830SND_SOC_DAPM_MIXER("I089", SND_SOC_NOPM, 0, 0, NULL, 0),831SND_SOC_DAPM_MIXER("I090", SND_SOC_NOPM, 0, 0, NULL, 0),832SND_SOC_DAPM_MIXER("I091", SND_SOC_NOPM, 0, 0, NULL, 0),833SND_SOC_DAPM_MIXER("I092", SND_SOC_NOPM, 0, 0, NULL, 0),834SND_SOC_DAPM_MIXER("I093", SND_SOC_NOPM, 0, 0, NULL, 0),835SND_SOC_DAPM_MIXER("I094", SND_SOC_NOPM, 0, 0, NULL, 0),836SND_SOC_DAPM_MIXER("I095", SND_SOC_NOPM, 0, 0, NULL, 0),837838/* eTDM_OUT2 */839SND_SOC_DAPM_MIXER("O048", SND_SOC_NOPM, 0, 0,840mtk_dai_etdm_o048_mix,841ARRAY_SIZE(mtk_dai_etdm_o048_mix)),842SND_SOC_DAPM_MIXER("O049", SND_SOC_NOPM, 0, 0,843mtk_dai_etdm_o049_mix,844ARRAY_SIZE(mtk_dai_etdm_o049_mix)),845SND_SOC_DAPM_MIXER("O050", SND_SOC_NOPM, 0, 0,846mtk_dai_etdm_o050_mix,847ARRAY_SIZE(mtk_dai_etdm_o050_mix)),848SND_SOC_DAPM_MIXER("O051", SND_SOC_NOPM, 0, 0,849mtk_dai_etdm_o051_mix,850ARRAY_SIZE(mtk_dai_etdm_o051_mix)),851SND_SOC_DAPM_MIXER("O052", SND_SOC_NOPM, 0, 0,852mtk_dai_etdm_o052_mix,853ARRAY_SIZE(mtk_dai_etdm_o052_mix)),854SND_SOC_DAPM_MIXER("O053", SND_SOC_NOPM, 0, 0,855mtk_dai_etdm_o053_mix,856ARRAY_SIZE(mtk_dai_etdm_o053_mix)),857SND_SOC_DAPM_MIXER("O054", SND_SOC_NOPM, 0, 0,858mtk_dai_etdm_o054_mix,859ARRAY_SIZE(mtk_dai_etdm_o054_mix)),860SND_SOC_DAPM_MIXER("O055", SND_SOC_NOPM, 0, 0,861mtk_dai_etdm_o055_mix,862ARRAY_SIZE(mtk_dai_etdm_o055_mix)),863SND_SOC_DAPM_MIXER("O056", SND_SOC_NOPM, 0, 0,864mtk_dai_etdm_o056_mix,865ARRAY_SIZE(mtk_dai_etdm_o056_mix)),866SND_SOC_DAPM_MIXER("O057", SND_SOC_NOPM, 0, 0,867mtk_dai_etdm_o057_mix,868ARRAY_SIZE(mtk_dai_etdm_o057_mix)),869SND_SOC_DAPM_MIXER("O058", SND_SOC_NOPM, 0, 0,870mtk_dai_etdm_o058_mix,871ARRAY_SIZE(mtk_dai_etdm_o058_mix)),872SND_SOC_DAPM_MIXER("O059", SND_SOC_NOPM, 0, 0,873mtk_dai_etdm_o059_mix,874ARRAY_SIZE(mtk_dai_etdm_o059_mix)),875SND_SOC_DAPM_MIXER("O060", SND_SOC_NOPM, 0, 0,876mtk_dai_etdm_o060_mix,877ARRAY_SIZE(mtk_dai_etdm_o060_mix)),878SND_SOC_DAPM_MIXER("O061", SND_SOC_NOPM, 0, 0,879mtk_dai_etdm_o061_mix,880ARRAY_SIZE(mtk_dai_etdm_o061_mix)),881SND_SOC_DAPM_MIXER("O062", SND_SOC_NOPM, 0, 0,882mtk_dai_etdm_o062_mix,883ARRAY_SIZE(mtk_dai_etdm_o062_mix)),884SND_SOC_DAPM_MIXER("O063", SND_SOC_NOPM, 0, 0,885mtk_dai_etdm_o063_mix,886ARRAY_SIZE(mtk_dai_etdm_o063_mix)),887SND_SOC_DAPM_MIXER("O064", SND_SOC_NOPM, 0, 0,888mtk_dai_etdm_o064_mix,889ARRAY_SIZE(mtk_dai_etdm_o064_mix)),890SND_SOC_DAPM_MIXER("O065", SND_SOC_NOPM, 0, 0,891mtk_dai_etdm_o065_mix,892ARRAY_SIZE(mtk_dai_etdm_o065_mix)),893SND_SOC_DAPM_MIXER("O066", SND_SOC_NOPM, 0, 0,894mtk_dai_etdm_o066_mix,895ARRAY_SIZE(mtk_dai_etdm_o066_mix)),896SND_SOC_DAPM_MIXER("O067", SND_SOC_NOPM, 0, 0,897mtk_dai_etdm_o067_mix,898ARRAY_SIZE(mtk_dai_etdm_o067_mix)),899SND_SOC_DAPM_MIXER("O068", SND_SOC_NOPM, 0, 0,900mtk_dai_etdm_o068_mix,901ARRAY_SIZE(mtk_dai_etdm_o068_mix)),902SND_SOC_DAPM_MIXER("O069", SND_SOC_NOPM, 0, 0,903mtk_dai_etdm_o069_mix,904ARRAY_SIZE(mtk_dai_etdm_o069_mix)),905SND_SOC_DAPM_MIXER("O070", SND_SOC_NOPM, 0, 0,906mtk_dai_etdm_o070_mix,907ARRAY_SIZE(mtk_dai_etdm_o070_mix)),908SND_SOC_DAPM_MIXER("O071", SND_SOC_NOPM, 0, 0,909mtk_dai_etdm_o071_mix,910ARRAY_SIZE(mtk_dai_etdm_o071_mix)),911912/* eTDM_OUT1 */913SND_SOC_DAPM_MIXER("O072", SND_SOC_NOPM, 0, 0,914mtk_dai_etdm_o072_mix,915ARRAY_SIZE(mtk_dai_etdm_o072_mix)),916SND_SOC_DAPM_MIXER("O073", SND_SOC_NOPM, 0, 0,917mtk_dai_etdm_o073_mix,918ARRAY_SIZE(mtk_dai_etdm_o073_mix)),919SND_SOC_DAPM_MIXER("O074", SND_SOC_NOPM, 0, 0,920mtk_dai_etdm_o074_mix,921ARRAY_SIZE(mtk_dai_etdm_o074_mix)),922SND_SOC_DAPM_MIXER("O075", SND_SOC_NOPM, 0, 0,923mtk_dai_etdm_o075_mix,924ARRAY_SIZE(mtk_dai_etdm_o075_mix)),925SND_SOC_DAPM_MIXER("O076", SND_SOC_NOPM, 0, 0,926mtk_dai_etdm_o076_mix,927ARRAY_SIZE(mtk_dai_etdm_o076_mix)),928SND_SOC_DAPM_MIXER("O077", SND_SOC_NOPM, 0, 0,929mtk_dai_etdm_o077_mix,930ARRAY_SIZE(mtk_dai_etdm_o077_mix)),931SND_SOC_DAPM_MIXER("O078", SND_SOC_NOPM, 0, 0,932mtk_dai_etdm_o078_mix,933ARRAY_SIZE(mtk_dai_etdm_o078_mix)),934SND_SOC_DAPM_MIXER("O079", SND_SOC_NOPM, 0, 0,935mtk_dai_etdm_o079_mix,936ARRAY_SIZE(mtk_dai_etdm_o079_mix)),937SND_SOC_DAPM_MIXER("O080", SND_SOC_NOPM, 0, 0,938mtk_dai_etdm_o080_mix,939ARRAY_SIZE(mtk_dai_etdm_o080_mix)),940SND_SOC_DAPM_MIXER("O081", SND_SOC_NOPM, 0, 0,941mtk_dai_etdm_o081_mix,942ARRAY_SIZE(mtk_dai_etdm_o081_mix)),943SND_SOC_DAPM_MIXER("O082", SND_SOC_NOPM, 0, 0,944mtk_dai_etdm_o082_mix,945ARRAY_SIZE(mtk_dai_etdm_o082_mix)),946SND_SOC_DAPM_MIXER("O083", SND_SOC_NOPM, 0, 0,947mtk_dai_etdm_o083_mix,948ARRAY_SIZE(mtk_dai_etdm_o083_mix)),949SND_SOC_DAPM_MIXER("O084", SND_SOC_NOPM, 0, 0,950mtk_dai_etdm_o084_mix,951ARRAY_SIZE(mtk_dai_etdm_o084_mix)),952SND_SOC_DAPM_MIXER("O085", SND_SOC_NOPM, 0, 0,953mtk_dai_etdm_o085_mix,954ARRAY_SIZE(mtk_dai_etdm_o085_mix)),955SND_SOC_DAPM_MIXER("O086", SND_SOC_NOPM, 0, 0,956mtk_dai_etdm_o086_mix,957ARRAY_SIZE(mtk_dai_etdm_o086_mix)),958SND_SOC_DAPM_MIXER("O087", SND_SOC_NOPM, 0, 0,959mtk_dai_etdm_o087_mix,960ARRAY_SIZE(mtk_dai_etdm_o087_mix)),961SND_SOC_DAPM_MIXER("O088", SND_SOC_NOPM, 0, 0,962mtk_dai_etdm_o088_mix,963ARRAY_SIZE(mtk_dai_etdm_o088_mix)),964SND_SOC_DAPM_MIXER("O089", SND_SOC_NOPM, 0, 0,965mtk_dai_etdm_o089_mix,966ARRAY_SIZE(mtk_dai_etdm_o089_mix)),967SND_SOC_DAPM_MIXER("O090", SND_SOC_NOPM, 0, 0,968mtk_dai_etdm_o090_mix,969ARRAY_SIZE(mtk_dai_etdm_o090_mix)),970SND_SOC_DAPM_MIXER("O091", SND_SOC_NOPM, 0, 0,971mtk_dai_etdm_o091_mix,972ARRAY_SIZE(mtk_dai_etdm_o091_mix)),973SND_SOC_DAPM_MIXER("O092", SND_SOC_NOPM, 0, 0,974mtk_dai_etdm_o092_mix,975ARRAY_SIZE(mtk_dai_etdm_o092_mix)),976SND_SOC_DAPM_MIXER("O093", SND_SOC_NOPM, 0, 0,977mtk_dai_etdm_o093_mix,978ARRAY_SIZE(mtk_dai_etdm_o093_mix)),979SND_SOC_DAPM_MIXER("O094", SND_SOC_NOPM, 0, 0,980mtk_dai_etdm_o094_mix,981ARRAY_SIZE(mtk_dai_etdm_o094_mix)),982SND_SOC_DAPM_MIXER("O095", SND_SOC_NOPM, 0, 0,983mtk_dai_etdm_o095_mix,984ARRAY_SIZE(mtk_dai_etdm_o095_mix)),985986/* eTDM_OUT3 */987SND_SOC_DAPM_MUX("HDMI_OUT_MUX", SND_SOC_NOPM, 0, 0,988&hdmi_out_mux_control),989SND_SOC_DAPM_MUX("DPTX_OUT_MUX", SND_SOC_NOPM, 0, 0,990&dptx_out_mux_control),991992SND_SOC_DAPM_MUX("HDMI_CH0_MUX", SND_SOC_NOPM, 0, 0,993&hdmi_ch0_mux_control),994SND_SOC_DAPM_MUX("HDMI_CH1_MUX", SND_SOC_NOPM, 0, 0,995&hdmi_ch1_mux_control),996SND_SOC_DAPM_MUX("HDMI_CH2_MUX", SND_SOC_NOPM, 0, 0,997&hdmi_ch2_mux_control),998SND_SOC_DAPM_MUX("HDMI_CH3_MUX", SND_SOC_NOPM, 0, 0,999&hdmi_ch3_mux_control),1000SND_SOC_DAPM_MUX("HDMI_CH4_MUX", SND_SOC_NOPM, 0, 0,1001&hdmi_ch4_mux_control),1002SND_SOC_DAPM_MUX("HDMI_CH5_MUX", SND_SOC_NOPM, 0, 0,1003&hdmi_ch5_mux_control),1004SND_SOC_DAPM_MUX("HDMI_CH6_MUX", SND_SOC_NOPM, 0, 0,1005&hdmi_ch6_mux_control),1006SND_SOC_DAPM_MUX("HDMI_CH7_MUX", SND_SOC_NOPM, 0, 0,1007&hdmi_ch7_mux_control),10081009SND_SOC_DAPM_INPUT("ETDM_INPUT"),1010SND_SOC_DAPM_OUTPUT("ETDM_OUTPUT"),1011};10121013static const struct snd_soc_dapm_route mtk_dai_etdm_routes[] = {1014{"I012", NULL, "ETDM2 Capture"},1015{"I013", NULL, "ETDM2 Capture"},1016{"I014", NULL, "ETDM2 Capture"},1017{"I015", NULL, "ETDM2 Capture"},1018{"I016", NULL, "ETDM2 Capture"},1019{"I017", NULL, "ETDM2 Capture"},1020{"I018", NULL, "ETDM2 Capture"},1021{"I019", NULL, "ETDM2 Capture"},10221023{"I072", NULL, "ETDM1 Capture"},1024{"I073", NULL, "ETDM1 Capture"},1025{"I074", NULL, "ETDM1 Capture"},1026{"I075", NULL, "ETDM1 Capture"},1027{"I076", NULL, "ETDM1 Capture"},1028{"I077", NULL, "ETDM1 Capture"},1029{"I078", NULL, "ETDM1 Capture"},1030{"I079", NULL, "ETDM1 Capture"},1031{"I080", NULL, "ETDM1 Capture"},1032{"I081", NULL, "ETDM1 Capture"},1033{"I082", NULL, "ETDM1 Capture"},1034{"I083", NULL, "ETDM1 Capture"},1035{"I084", NULL, "ETDM1 Capture"},1036{"I085", NULL, "ETDM1 Capture"},1037{"I086", NULL, "ETDM1 Capture"},1038{"I087", NULL, "ETDM1 Capture"},1039{"I088", NULL, "ETDM1 Capture"},1040{"I089", NULL, "ETDM1 Capture"},1041{"I090", NULL, "ETDM1 Capture"},1042{"I091", NULL, "ETDM1 Capture"},1043{"I092", NULL, "ETDM1 Capture"},1044{"I093", NULL, "ETDM1 Capture"},1045{"I094", NULL, "ETDM1 Capture"},1046{"I095", NULL, "ETDM1 Capture"},10471048{"UL8", NULL, "ETDM1 Capture"},1049{"UL3", NULL, "ETDM2 Capture"},10501051{"ETDM2 Playback", NULL, "O048"},1052{"ETDM2 Playback", NULL, "O049"},1053{"ETDM2 Playback", NULL, "O050"},1054{"ETDM2 Playback", NULL, "O051"},1055{"ETDM2 Playback", NULL, "O052"},1056{"ETDM2 Playback", NULL, "O053"},1057{"ETDM2 Playback", NULL, "O054"},1058{"ETDM2 Playback", NULL, "O055"},1059{"ETDM2 Playback", NULL, "O056"},1060{"ETDM2 Playback", NULL, "O057"},1061{"ETDM2 Playback", NULL, "O058"},1062{"ETDM2 Playback", NULL, "O059"},1063{"ETDM2 Playback", NULL, "O060"},1064{"ETDM2 Playback", NULL, "O061"},1065{"ETDM2 Playback", NULL, "O062"},1066{"ETDM2 Playback", NULL, "O063"},1067{"ETDM2 Playback", NULL, "O064"},1068{"ETDM2 Playback", NULL, "O065"},1069{"ETDM2 Playback", NULL, "O066"},1070{"ETDM2 Playback", NULL, "O067"},1071{"ETDM2 Playback", NULL, "O068"},1072{"ETDM2 Playback", NULL, "O069"},1073{"ETDM2 Playback", NULL, "O070"},1074{"ETDM2 Playback", NULL, "O071"},10751076{"ETDM1 Playback", NULL, "O072"},1077{"ETDM1 Playback", NULL, "O073"},1078{"ETDM1 Playback", NULL, "O074"},1079{"ETDM1 Playback", NULL, "O075"},1080{"ETDM1 Playback", NULL, "O076"},1081{"ETDM1 Playback", NULL, "O077"},1082{"ETDM1 Playback", NULL, "O078"},1083{"ETDM1 Playback", NULL, "O079"},1084{"ETDM1 Playback", NULL, "O080"},1085{"ETDM1 Playback", NULL, "O081"},1086{"ETDM1 Playback", NULL, "O082"},1087{"ETDM1 Playback", NULL, "O083"},1088{"ETDM1 Playback", NULL, "O084"},1089{"ETDM1 Playback", NULL, "O085"},1090{"ETDM1 Playback", NULL, "O086"},1091{"ETDM1 Playback", NULL, "O087"},1092{"ETDM1 Playback", NULL, "O088"},1093{"ETDM1 Playback", NULL, "O089"},1094{"ETDM1 Playback", NULL, "O090"},1095{"ETDM1 Playback", NULL, "O091"},1096{"ETDM1 Playback", NULL, "O092"},1097{"ETDM1 Playback", NULL, "O093"},1098{"ETDM1 Playback", NULL, "O094"},1099{"ETDM1 Playback", NULL, "O095"},11001101{"O048", "I020 Switch", "I020"},1102{"O049", "I021 Switch", "I021"},11031104{"O048", "I022 Switch", "I022"},1105{"O049", "I023 Switch", "I023"},1106{"O050", "I024 Switch", "I024"},1107{"O051", "I025 Switch", "I025"},1108{"O052", "I026 Switch", "I026"},1109{"O053", "I027 Switch", "I027"},1110{"O054", "I028 Switch", "I028"},1111{"O055", "I029 Switch", "I029"},1112{"O056", "I030 Switch", "I030"},1113{"O057", "I031 Switch", "I031"},1114{"O058", "I032 Switch", "I032"},1115{"O059", "I033 Switch", "I033"},1116{"O060", "I034 Switch", "I034"},1117{"O061", "I035 Switch", "I035"},1118{"O062", "I036 Switch", "I036"},1119{"O063", "I037 Switch", "I037"},1120{"O064", "I038 Switch", "I038"},1121{"O065", "I039 Switch", "I039"},1122{"O066", "I040 Switch", "I040"},1123{"O067", "I041 Switch", "I041"},1124{"O068", "I042 Switch", "I042"},1125{"O069", "I043 Switch", "I043"},1126{"O070", "I044 Switch", "I044"},1127{"O071", "I045 Switch", "I045"},11281129{"O048", "I046 Switch", "I046"},1130{"O049", "I047 Switch", "I047"},1131{"O050", "I048 Switch", "I048"},1132{"O051", "I049 Switch", "I049"},1133{"O052", "I050 Switch", "I050"},1134{"O053", "I051 Switch", "I051"},1135{"O054", "I052 Switch", "I052"},1136{"O055", "I053 Switch", "I053"},1137{"O056", "I054 Switch", "I054"},1138{"O057", "I055 Switch", "I055"},1139{"O058", "I056 Switch", "I056"},1140{"O059", "I057 Switch", "I057"},1141{"O060", "I058 Switch", "I058"},1142{"O061", "I059 Switch", "I059"},1143{"O062", "I060 Switch", "I060"},1144{"O063", "I061 Switch", "I061"},1145{"O064", "I062 Switch", "I062"},1146{"O065", "I063 Switch", "I063"},1147{"O066", "I064 Switch", "I064"},1148{"O067", "I065 Switch", "I065"},1149{"O068", "I066 Switch", "I066"},1150{"O069", "I067 Switch", "I067"},1151{"O070", "I068 Switch", "I068"},1152{"O071", "I069 Switch", "I069"},11531154{"O048", "I070 Switch", "I070"},1155{"O049", "I071 Switch", "I071"},11561157{"O072", "I020 Switch", "I020"},1158{"O073", "I021 Switch", "I021"},11591160{"O072", "I022 Switch", "I022"},1161{"O073", "I023 Switch", "I023"},1162{"O074", "I024 Switch", "I024"},1163{"O075", "I025 Switch", "I025"},1164{"O076", "I026 Switch", "I026"},1165{"O077", "I027 Switch", "I027"},1166{"O078", "I028 Switch", "I028"},1167{"O079", "I029 Switch", "I029"},1168{"O080", "I030 Switch", "I030"},1169{"O081", "I031 Switch", "I031"},1170{"O082", "I032 Switch", "I032"},1171{"O083", "I033 Switch", "I033"},1172{"O084", "I034 Switch", "I034"},1173{"O085", "I035 Switch", "I035"},1174{"O086", "I036 Switch", "I036"},1175{"O087", "I037 Switch", "I037"},1176{"O088", "I038 Switch", "I038"},1177{"O089", "I039 Switch", "I039"},1178{"O090", "I040 Switch", "I040"},1179{"O091", "I041 Switch", "I041"},1180{"O092", "I042 Switch", "I042"},1181{"O093", "I043 Switch", "I043"},1182{"O094", "I044 Switch", "I044"},1183{"O095", "I045 Switch", "I045"},11841185{"O072", "I046 Switch", "I046"},1186{"O073", "I047 Switch", "I047"},1187{"O074", "I048 Switch", "I048"},1188{"O075", "I049 Switch", "I049"},1189{"O076", "I050 Switch", "I050"},1190{"O077", "I051 Switch", "I051"},1191{"O078", "I052 Switch", "I052"},1192{"O079", "I053 Switch", "I053"},1193{"O080", "I054 Switch", "I054"},1194{"O081", "I055 Switch", "I055"},1195{"O082", "I056 Switch", "I056"},1196{"O083", "I057 Switch", "I057"},1197{"O084", "I058 Switch", "I058"},1198{"O085", "I059 Switch", "I059"},1199{"O086", "I060 Switch", "I060"},1200{"O087", "I061 Switch", "I061"},1201{"O088", "I062 Switch", "I062"},1202{"O089", "I063 Switch", "I063"},1203{"O090", "I064 Switch", "I064"},1204{"O091", "I065 Switch", "I065"},1205{"O092", "I066 Switch", "I066"},1206{"O093", "I067 Switch", "I067"},1207{"O094", "I068 Switch", "I068"},1208{"O095", "I069 Switch", "I069"},12091210{"O072", "I070 Switch", "I070"},1211{"O073", "I071 Switch", "I071"},12121213{"HDMI_CH0_MUX", "CH0", "DL10"},1214{"HDMI_CH0_MUX", "CH1", "DL10"},1215{"HDMI_CH0_MUX", "CH2", "DL10"},1216{"HDMI_CH0_MUX", "CH3", "DL10"},1217{"HDMI_CH0_MUX", "CH4", "DL10"},1218{"HDMI_CH0_MUX", "CH5", "DL10"},1219{"HDMI_CH0_MUX", "CH6", "DL10"},1220{"HDMI_CH0_MUX", "CH7", "DL10"},12211222{"HDMI_CH1_MUX", "CH0", "DL10"},1223{"HDMI_CH1_MUX", "CH1", "DL10"},1224{"HDMI_CH1_MUX", "CH2", "DL10"},1225{"HDMI_CH1_MUX", "CH3", "DL10"},1226{"HDMI_CH1_MUX", "CH4", "DL10"},1227{"HDMI_CH1_MUX", "CH5", "DL10"},1228{"HDMI_CH1_MUX", "CH6", "DL10"},1229{"HDMI_CH1_MUX", "CH7", "DL10"},12301231{"HDMI_CH2_MUX", "CH0", "DL10"},1232{"HDMI_CH2_MUX", "CH1", "DL10"},1233{"HDMI_CH2_MUX", "CH2", "DL10"},1234{"HDMI_CH2_MUX", "CH3", "DL10"},1235{"HDMI_CH2_MUX", "CH4", "DL10"},1236{"HDMI_CH2_MUX", "CH5", "DL10"},1237{"HDMI_CH2_MUX", "CH6", "DL10"},1238{"HDMI_CH2_MUX", "CH7", "DL10"},12391240{"HDMI_CH3_MUX", "CH0", "DL10"},1241{"HDMI_CH3_MUX", "CH1", "DL10"},1242{"HDMI_CH3_MUX", "CH2", "DL10"},1243{"HDMI_CH3_MUX", "CH3", "DL10"},1244{"HDMI_CH3_MUX", "CH4", "DL10"},1245{"HDMI_CH3_MUX", "CH5", "DL10"},1246{"HDMI_CH3_MUX", "CH6", "DL10"},1247{"HDMI_CH3_MUX", "CH7", "DL10"},12481249{"HDMI_CH4_MUX", "CH0", "DL10"},1250{"HDMI_CH4_MUX", "CH1", "DL10"},1251{"HDMI_CH4_MUX", "CH2", "DL10"},1252{"HDMI_CH4_MUX", "CH3", "DL10"},1253{"HDMI_CH4_MUX", "CH4", "DL10"},1254{"HDMI_CH4_MUX", "CH5", "DL10"},1255{"HDMI_CH4_MUX", "CH6", "DL10"},1256{"HDMI_CH4_MUX", "CH7", "DL10"},12571258{"HDMI_CH5_MUX", "CH0", "DL10"},1259{"HDMI_CH5_MUX", "CH1", "DL10"},1260{"HDMI_CH5_MUX", "CH2", "DL10"},1261{"HDMI_CH5_MUX", "CH3", "DL10"},1262{"HDMI_CH5_MUX", "CH4", "DL10"},1263{"HDMI_CH5_MUX", "CH5", "DL10"},1264{"HDMI_CH5_MUX", "CH6", "DL10"},1265{"HDMI_CH5_MUX", "CH7", "DL10"},12661267{"HDMI_CH6_MUX", "CH0", "DL10"},1268{"HDMI_CH6_MUX", "CH1", "DL10"},1269{"HDMI_CH6_MUX", "CH2", "DL10"},1270{"HDMI_CH6_MUX", "CH3", "DL10"},1271{"HDMI_CH6_MUX", "CH4", "DL10"},1272{"HDMI_CH6_MUX", "CH5", "DL10"},1273{"HDMI_CH6_MUX", "CH6", "DL10"},1274{"HDMI_CH6_MUX", "CH7", "DL10"},12751276{"HDMI_CH7_MUX", "CH0", "DL10"},1277{"HDMI_CH7_MUX", "CH1", "DL10"},1278{"HDMI_CH7_MUX", "CH2", "DL10"},1279{"HDMI_CH7_MUX", "CH3", "DL10"},1280{"HDMI_CH7_MUX", "CH4", "DL10"},1281{"HDMI_CH7_MUX", "CH5", "DL10"},1282{"HDMI_CH7_MUX", "CH6", "DL10"},1283{"HDMI_CH7_MUX", "CH7", "DL10"},12841285{"HDMI_OUT_MUX", "Connect", "HDMI_CH0_MUX"},1286{"HDMI_OUT_MUX", "Connect", "HDMI_CH1_MUX"},1287{"HDMI_OUT_MUX", "Connect", "HDMI_CH2_MUX"},1288{"HDMI_OUT_MUX", "Connect", "HDMI_CH3_MUX"},1289{"HDMI_OUT_MUX", "Connect", "HDMI_CH4_MUX"},1290{"HDMI_OUT_MUX", "Connect", "HDMI_CH5_MUX"},1291{"HDMI_OUT_MUX", "Connect", "HDMI_CH6_MUX"},1292{"HDMI_OUT_MUX", "Connect", "HDMI_CH7_MUX"},12931294{"DPTX_OUT_MUX", "Connect", "HDMI_CH0_MUX"},1295{"DPTX_OUT_MUX", "Connect", "HDMI_CH1_MUX"},1296{"DPTX_OUT_MUX", "Connect", "HDMI_CH2_MUX"},1297{"DPTX_OUT_MUX", "Connect", "HDMI_CH3_MUX"},1298{"DPTX_OUT_MUX", "Connect", "HDMI_CH4_MUX"},1299{"DPTX_OUT_MUX", "Connect", "HDMI_CH5_MUX"},1300{"DPTX_OUT_MUX", "Connect", "HDMI_CH6_MUX"},1301{"DPTX_OUT_MUX", "Connect", "HDMI_CH7_MUX"},13021303{"ETDM3 Playback", NULL, "HDMI_OUT_MUX"},1304{"DPTX Playback", NULL, "DPTX_OUT_MUX"},13051306{"ETDM_OUTPUT", NULL, "DPTX Playback"},1307{"ETDM_OUTPUT", NULL, "ETDM1 Playback"},1308{"ETDM_OUTPUT", NULL, "ETDM2 Playback"},1309{"ETDM_OUTPUT", NULL, "ETDM3 Playback"},1310{"ETDM1 Capture", NULL, "ETDM_INPUT"},1311{"ETDM2 Capture", NULL, "ETDM_INPUT"},1312};13131314static int mt8195_afe_enable_etdm(struct mtk_base_afe *afe, int dai_id)1315{1316int ret = 0;1317struct etdm_con_reg etdm_reg;1318struct mt8195_afe_private *afe_priv = afe->platform_priv;1319struct mtk_dai_etdm_priv *etdm_data;1320unsigned long flags;13211322if (!mt8195_afe_etdm_is_valid(dai_id))1323return -EINVAL;13241325etdm_data = afe_priv->dai_priv[dai_id];1326spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags);1327etdm_data->en_ref_cnt++;1328if (etdm_data->en_ref_cnt == 1) {1329ret = get_etdm_reg(dai_id, &etdm_reg);1330if (ret < 0)1331goto out;13321333regmap_update_bits(afe->regmap, etdm_reg.con0,1334ETDM_CON0_EN, ETDM_CON0_EN);1335}1336out:1337spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags);1338return ret;1339}13401341static int mt8195_afe_disable_etdm(struct mtk_base_afe *afe, int dai_id)1342{1343int ret = 0;1344struct etdm_con_reg etdm_reg;1345struct mt8195_afe_private *afe_priv = afe->platform_priv;1346struct mtk_dai_etdm_priv *etdm_data;1347unsigned long flags;13481349if (!mt8195_afe_etdm_is_valid(dai_id))1350return -EINVAL;13511352etdm_data = afe_priv->dai_priv[dai_id];1353spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags);1354if (etdm_data->en_ref_cnt > 0) {1355etdm_data->en_ref_cnt--;1356if (etdm_data->en_ref_cnt == 0) {1357ret = get_etdm_reg(dai_id, &etdm_reg);1358if (ret < 0)1359goto out;13601361regmap_update_bits(afe->regmap, etdm_reg.con0,1362ETDM_CON0_EN, 0);1363}1364}1365out:1366spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags);1367return ret;1368}13691370static int etdm_cowork_slv_sel(int id, int slave_mode)1371{1372if (slave_mode) {1373switch (id) {1374case MT8195_AFE_IO_ETDM1_IN:1375return COWORK_ETDM_IN1_S;1376case MT8195_AFE_IO_ETDM2_IN:1377return COWORK_ETDM_IN2_S;1378case MT8195_AFE_IO_ETDM1_OUT:1379return COWORK_ETDM_OUT1_S;1380case MT8195_AFE_IO_ETDM2_OUT:1381return COWORK_ETDM_OUT2_S;1382case MT8195_AFE_IO_ETDM3_OUT:1383return COWORK_ETDM_OUT3_S;1384default:1385return -EINVAL;1386}1387} else {1388switch (id) {1389case MT8195_AFE_IO_ETDM1_IN:1390return COWORK_ETDM_IN1_M;1391case MT8195_AFE_IO_ETDM2_IN:1392return COWORK_ETDM_IN2_M;1393case MT8195_AFE_IO_ETDM1_OUT:1394return COWORK_ETDM_OUT1_M;1395case MT8195_AFE_IO_ETDM2_OUT:1396return COWORK_ETDM_OUT2_M;1397case MT8195_AFE_IO_ETDM3_OUT:1398return COWORK_ETDM_OUT3_M;1399default:1400return -EINVAL;1401}1402}1403}14041405static int mt8195_etdm_sync_mode_configure(struct mtk_base_afe *afe, int dai_id)1406{1407struct mt8195_afe_private *afe_priv = afe->platform_priv;1408struct mtk_dai_etdm_priv *etdm_data;1409unsigned int reg = 0;1410unsigned int mask;1411unsigned int val;1412int cowork_source_sel;14131414if (!mt8195_afe_etdm_is_valid(dai_id))1415return -EINVAL;14161417etdm_data = afe_priv->dai_priv[dai_id];1418if (etdm_data->cowork_source_id == COWORK_ETDM_NONE)1419return 0;14201421cowork_source_sel = etdm_cowork_slv_sel(etdm_data->cowork_source_id,1422etdm_data->slave_mode);1423if (cowork_source_sel < 0)1424return cowork_source_sel;14251426switch (dai_id) {1427case MT8195_AFE_IO_ETDM1_IN:1428reg = ETDM_COWORK_CON1;1429mask = ETDM_IN1_SLAVE_SEL_MASK;1430val = ETDM_IN1_SLAVE_SEL(cowork_source_sel);1431break;1432case MT8195_AFE_IO_ETDM2_IN:1433reg = ETDM_COWORK_CON2;1434mask = ETDM_IN2_SLAVE_SEL_MASK;1435val = ETDM_IN2_SLAVE_SEL(cowork_source_sel);1436break;1437case MT8195_AFE_IO_ETDM1_OUT:1438reg = ETDM_COWORK_CON0;1439mask = ETDM_OUT1_SLAVE_SEL_MASK;1440val = ETDM_OUT1_SLAVE_SEL(cowork_source_sel);1441break;1442case MT8195_AFE_IO_ETDM2_OUT:1443reg = ETDM_COWORK_CON2;1444mask = ETDM_OUT2_SLAVE_SEL_MASK;1445val = ETDM_OUT2_SLAVE_SEL(cowork_source_sel);1446break;1447case MT8195_AFE_IO_ETDM3_OUT:1448reg = ETDM_COWORK_CON2;1449mask = ETDM_OUT3_SLAVE_SEL_MASK;1450val = ETDM_OUT3_SLAVE_SEL(cowork_source_sel);1451break;1452default:1453return 0;1454}14551456regmap_update_bits(afe->regmap, reg, mask, val);14571458return 0;1459}14601461static int mtk_dai_etdm_get_cg_id_by_dai_id(int dai_id)1462{1463int cg_id = -1;14641465switch (dai_id) {1466case MT8195_AFE_IO_DPTX:1467cg_id = MT8195_CLK_AUD_HDMI_OUT;1468break;1469case MT8195_AFE_IO_ETDM1_IN:1470cg_id = MT8195_CLK_AUD_TDM_IN;1471break;1472case MT8195_AFE_IO_ETDM2_IN:1473cg_id = MT8195_CLK_AUD_I2SIN;1474break;1475case MT8195_AFE_IO_ETDM1_OUT:1476cg_id = MT8195_CLK_AUD_TDM_OUT;1477break;1478case MT8195_AFE_IO_ETDM2_OUT:1479cg_id = MT8195_CLK_AUD_I2S_OUT;1480break;1481case MT8195_AFE_IO_ETDM3_OUT:1482cg_id = MT8195_CLK_AUD_HDMI_OUT;1483break;1484default:1485break;1486}14871488return cg_id;1489}14901491static int mtk_dai_etdm_get_clk_id_by_dai_id(int dai_id)1492{1493int clk_id = -1;14941495switch (dai_id) {1496case MT8195_AFE_IO_DPTX:1497clk_id = MT8195_CLK_TOP_DPTX_M_SEL;1498break;1499case MT8195_AFE_IO_ETDM1_IN:1500clk_id = MT8195_CLK_TOP_I2SI1_M_SEL;1501break;1502case MT8195_AFE_IO_ETDM2_IN:1503clk_id = MT8195_CLK_TOP_I2SI2_M_SEL;1504break;1505case MT8195_AFE_IO_ETDM1_OUT:1506clk_id = MT8195_CLK_TOP_I2SO1_M_SEL;1507break;1508case MT8195_AFE_IO_ETDM2_OUT:1509clk_id = MT8195_CLK_TOP_I2SO2_M_SEL;1510break;1511case MT8195_AFE_IO_ETDM3_OUT:1512default:1513break;1514}15151516return clk_id;1517}15181519static int mtk_dai_etdm_get_clkdiv_id_by_dai_id(int dai_id)1520{1521int clk_id = -1;15221523switch (dai_id) {1524case MT8195_AFE_IO_DPTX:1525clk_id = MT8195_CLK_TOP_APLL12_DIV9;1526break;1527case MT8195_AFE_IO_ETDM1_IN:1528clk_id = MT8195_CLK_TOP_APLL12_DIV0;1529break;1530case MT8195_AFE_IO_ETDM2_IN:1531clk_id = MT8195_CLK_TOP_APLL12_DIV1;1532break;1533case MT8195_AFE_IO_ETDM1_OUT:1534clk_id = MT8195_CLK_TOP_APLL12_DIV2;1535break;1536case MT8195_AFE_IO_ETDM2_OUT:1537clk_id = MT8195_CLK_TOP_APLL12_DIV3;1538break;1539case MT8195_AFE_IO_ETDM3_OUT:1540default:1541break;1542}15431544return clk_id;1545}15461547static int mtk_dai_etdm_enable_mclk(struct mtk_base_afe *afe, int dai_id)1548{1549struct mt8195_afe_private *afe_priv = afe->platform_priv;1550int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id);15511552if (clkdiv_id < 0)1553return -EINVAL;15541555mt8195_afe_enable_clk(afe, afe_priv->clk[clkdiv_id]);15561557return 0;1558}15591560static int mtk_dai_etdm_disable_mclk(struct mtk_base_afe *afe, int dai_id)1561{1562struct mt8195_afe_private *afe_priv = afe->platform_priv;1563int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id);15641565if (clkdiv_id < 0)1566return -EINVAL;15671568mt8195_afe_disable_clk(afe, afe_priv->clk[clkdiv_id]);15691570return 0;1571}15721573/* dai ops */1574static int mtk_dai_etdm_startup(struct snd_pcm_substream *substream,1575struct snd_soc_dai *dai)1576{1577struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);1578struct mt8195_afe_private *afe_priv = afe->platform_priv;1579struct mtk_dai_etdm_priv *mst_etdm_data;1580int cg_id;1581int mst_dai_id;1582int slv_dai_id;1583int i;15841585if (is_cowork_mode(dai)) {1586mst_dai_id = get_etdm_cowork_master_id(dai);1587if (!mt8195_afe_etdm_is_valid(mst_dai_id))1588return -EINVAL;15891590mtk_dai_etdm_enable_mclk(afe, mst_dai_id);1591cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(mst_dai_id);1592if (cg_id >= 0)1593mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]);15941595mst_etdm_data = afe_priv->dai_priv[mst_dai_id];15961597for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {1598slv_dai_id = mst_etdm_data->cowork_slv_id[i];1599cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(slv_dai_id);1600if (cg_id >= 0)1601mt8195_afe_enable_clk(afe,1602afe_priv->clk[cg_id]);1603}1604} else {1605mtk_dai_etdm_enable_mclk(afe, dai->id);16061607cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id);1608if (cg_id >= 0)1609mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]);1610}16111612return 0;1613}16141615static void mtk_dai_etdm_shutdown(struct snd_pcm_substream *substream,1616struct snd_soc_dai *dai)1617{1618struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);1619struct mt8195_afe_private *afe_priv = afe->platform_priv;1620struct mtk_dai_etdm_priv *mst_etdm_data;1621int cg_id;1622int mst_dai_id;1623int slv_dai_id;1624int i;16251626if (is_cowork_mode(dai)) {1627mst_dai_id = get_etdm_cowork_master_id(dai);1628if (!mt8195_afe_etdm_is_valid(mst_dai_id))1629return;16301631cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(mst_dai_id);1632if (cg_id >= 0)1633mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]);16341635mst_etdm_data = afe_priv->dai_priv[mst_dai_id];1636for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {1637slv_dai_id = mst_etdm_data->cowork_slv_id[i];1638cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(slv_dai_id);1639if (cg_id >= 0)1640mt8195_afe_disable_clk(afe,1641afe_priv->clk[cg_id]);1642}1643mtk_dai_etdm_disable_mclk(afe, mst_dai_id);1644} else {1645cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id);1646if (cg_id >= 0)1647mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]);16481649mtk_dai_etdm_disable_mclk(afe, dai->id);1650}1651}16521653static int mtk_dai_etdm_fifo_mode(struct mtk_base_afe *afe,1654int dai_id, unsigned int rate)1655{1656unsigned int mode = 0;1657unsigned int reg = 0;1658unsigned int val = 0;1659unsigned int mask = (ETDM_IN_AFIFO_MODE_MASK | ETDM_IN_USE_AFIFO);16601661if (rate != 0)1662mode = mt8195_afe_fs_timing(rate);16631664switch (dai_id) {1665case MT8195_AFE_IO_ETDM1_IN:1666reg = ETDM_IN1_AFIFO_CON;1667if (rate == 0)1668mode = MT8195_ETDM_IN1_1X_EN;1669break;1670case MT8195_AFE_IO_ETDM2_IN:1671reg = ETDM_IN2_AFIFO_CON;1672if (rate == 0)1673mode = MT8195_ETDM_IN2_1X_EN;1674break;1675default:1676return -EINVAL;1677}16781679val = (mode | ETDM_IN_USE_AFIFO);16801681regmap_update_bits(afe->regmap, reg, mask, val);1682return 0;1683}16841685static int mtk_dai_etdm_in_configure(struct mtk_base_afe *afe,1686unsigned int rate,1687unsigned int channels,1688int dai_id)1689{1690struct mt8195_afe_private *afe_priv = afe->platform_priv;1691struct mtk_dai_etdm_priv *etdm_data;1692struct etdm_con_reg etdm_reg;1693bool slave_mode;1694unsigned int data_mode;1695unsigned int lrck_width;1696unsigned int val = 0;1697unsigned int mask = 0;1698int i;1699int ret;17001701if (!mt8195_afe_etdm_is_valid(dai_id))1702return -EINVAL;17031704etdm_data = afe_priv->dai_priv[dai_id];1705slave_mode = etdm_data->slave_mode;1706data_mode = etdm_data->data_mode;1707lrck_width = etdm_data->lrck_width;17081709dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n",1710__func__, rate, channels, dai_id);17111712ret = get_etdm_reg(dai_id, &etdm_reg);1713if (ret < 0)1714return ret;17151716if (etdm_data->cowork_source_id != COWORK_ETDM_NONE)1717slave_mode = true;17181719/* afifo */1720if (slave_mode)1721mtk_dai_etdm_fifo_mode(afe, dai_id, 0);1722else1723mtk_dai_etdm_fifo_mode(afe, dai_id, rate);17241725/* con1 */1726if (lrck_width > 0) {1727mask |= (ETDM_IN_CON1_LRCK_AUTO_MODE |1728ETDM_IN_CON1_LRCK_WIDTH_MASK);1729val |= ETDM_IN_CON1_LRCK_WIDTH(lrck_width);1730}1731regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);17321733mask = 0;1734val = 0;17351736/* con2 */1737if (!slave_mode) {1738mask |= ETDM_IN_CON2_UPDATE_GAP_MASK;1739if (rate == 352800 || rate == 384000)1740val |= ETDM_IN_CON2_UPDATE_GAP(4);1741else1742val |= ETDM_IN_CON2_UPDATE_GAP(3);1743}1744mask |= (ETDM_IN_CON2_MULTI_IP_2CH_MODE |1745ETDM_IN_CON2_MULTI_IP_TOTAL_CH_MASK);1746if (data_mode == MTK_DAI_ETDM_DATA_MULTI_PIN) {1747val |= ETDM_IN_CON2_MULTI_IP_2CH_MODE |1748ETDM_IN_CON2_MULTI_IP_TOTAL_CH(channels);1749}1750regmap_update_bits(afe->regmap, etdm_reg.con2, mask, val);17511752mask = 0;1753val = 0;17541755/* con3 */1756mask |= ETDM_IN_CON3_DISABLE_OUT_MASK;1757for (i = 0; i < channels; i += 2) {1758if (etdm_data->in_disable_ch[i] &&1759etdm_data->in_disable_ch[i + 1])1760val |= ETDM_IN_CON3_DISABLE_OUT(i >> 1);1761}1762if (!slave_mode) {1763mask |= ETDM_IN_CON3_FS_MASK;1764val |= ETDM_IN_CON3_FS(get_etdm_fs_timing(rate));1765}1766regmap_update_bits(afe->regmap, etdm_reg.con3, mask, val);17671768mask = 0;1769val = 0;17701771/* con4 */1772mask |= (ETDM_IN_CON4_MASTER_LRCK_INV | ETDM_IN_CON4_MASTER_BCK_INV |1773ETDM_IN_CON4_SLAVE_LRCK_INV | ETDM_IN_CON4_SLAVE_BCK_INV);1774if (slave_mode) {1775if (etdm_data->lrck_inv)1776val |= ETDM_IN_CON4_SLAVE_LRCK_INV;1777if (etdm_data->bck_inv)1778val |= ETDM_IN_CON4_SLAVE_BCK_INV;1779} else {1780if (etdm_data->lrck_inv)1781val |= ETDM_IN_CON4_MASTER_LRCK_INV;1782if (etdm_data->bck_inv)1783val |= ETDM_IN_CON4_MASTER_BCK_INV;1784}1785regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val);17861787mask = 0;1788val = 0;17891790/* con5 */1791mask |= ETDM_IN_CON5_LR_SWAP_MASK;1792mask |= ETDM_IN_CON5_ENABLE_ODD_MASK;1793for (i = 0; i < channels; i += 2) {1794if (etdm_data->in_disable_ch[i] &&1795!etdm_data->in_disable_ch[i + 1]) {1796if (i == (channels - 2))1797val |= ETDM_IN_CON5_LR_SWAP(15);1798else1799val |= ETDM_IN_CON5_LR_SWAP(i >> 1);1800val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1);1801} else if (!etdm_data->in_disable_ch[i] &&1802etdm_data->in_disable_ch[i + 1]) {1803val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1);1804}1805}1806regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val);1807return 0;1808}18091810static int mtk_dai_etdm_out_configure(struct mtk_base_afe *afe,1811unsigned int rate,1812unsigned int channels,1813int dai_id)1814{1815struct mt8195_afe_private *afe_priv = afe->platform_priv;1816struct mtk_dai_etdm_priv *etdm_data;1817struct etdm_con_reg etdm_reg;1818bool slave_mode;1819unsigned int lrck_width;1820unsigned int val = 0;1821unsigned int mask = 0;1822int ret;1823int fs = 0;18241825if (!mt8195_afe_etdm_is_valid(dai_id))1826return -EINVAL;18271828etdm_data = afe_priv->dai_priv[dai_id];1829slave_mode = etdm_data->slave_mode;1830lrck_width = etdm_data->lrck_width;18311832dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n",1833__func__, rate, channels, dai_id);18341835ret = get_etdm_reg(dai_id, &etdm_reg);1836if (ret < 0)1837return ret;18381839if (etdm_data->cowork_source_id != COWORK_ETDM_NONE)1840slave_mode = true;18411842/* con0 */1843mask = ETDM_OUT_CON0_RELATCH_DOMAIN_MASK;1844val = ETDM_OUT_CON0_RELATCH_DOMAIN(ETDM_RELATCH_TIMING_A1A2SYS);1845regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val);18461847mask = 0;1848val = 0;18491850/* con1 */1851if (lrck_width > 0) {1852mask |= (ETDM_OUT_CON1_LRCK_AUTO_MODE |1853ETDM_OUT_CON1_LRCK_WIDTH_MASK);1854val |= ETDM_OUT_CON1_LRCK_WIDTH(lrck_width);1855}1856regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);18571858mask = 0;1859val = 0;18601861if (slave_mode) {1862/* con2 */1863mask = (ETDM_OUT_CON2_LRCK_DELAY_BCK_INV |1864ETDM_OUT_CON2_LRCK_DELAY_0P5T_EN);1865val = (ETDM_OUT_CON2_LRCK_DELAY_BCK_INV |1866ETDM_OUT_CON2_LRCK_DELAY_0P5T_EN);1867regmap_update_bits(afe->regmap, etdm_reg.con2,1868mask, val);1869mask = 0;1870val = 0;1871} else {1872/* con4 */1873mask |= ETDM_OUT_CON4_FS_MASK;1874val |= ETDM_OUT_CON4_FS(get_etdm_fs_timing(rate));1875}18761877mask |= ETDM_OUT_CON4_RELATCH_EN_MASK;1878if (dai_id == MT8195_AFE_IO_ETDM1_OUT)1879fs = MT8195_ETDM_OUT1_1X_EN;1880else if (dai_id == MT8195_AFE_IO_ETDM2_OUT)1881fs = MT8195_ETDM_OUT2_1X_EN;18821883val |= ETDM_OUT_CON4_RELATCH_EN(fs);18841885regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val);18861887mask = 0;1888val = 0;18891890/* con5 */1891mask |= (ETDM_OUT_CON5_MASTER_LRCK_INV | ETDM_OUT_CON5_MASTER_BCK_INV |1892ETDM_OUT_CON5_SLAVE_LRCK_INV | ETDM_OUT_CON5_SLAVE_BCK_INV);1893if (slave_mode) {1894if (etdm_data->lrck_inv)1895val |= ETDM_OUT_CON5_SLAVE_LRCK_INV;1896if (etdm_data->bck_inv)1897val |= ETDM_OUT_CON5_SLAVE_BCK_INV;1898} else {1899if (etdm_data->lrck_inv)1900val |= ETDM_OUT_CON5_MASTER_LRCK_INV;1901if (etdm_data->bck_inv)1902val |= ETDM_OUT_CON5_MASTER_BCK_INV;1903}1904regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val);19051906return 0;1907}19081909static int mtk_dai_etdm_mclk_configure(struct mtk_base_afe *afe, int dai_id)1910{1911struct mt8195_afe_private *afe_priv = afe->platform_priv;1912struct mtk_dai_etdm_priv *etdm_data;1913int clk_id = mtk_dai_etdm_get_clk_id_by_dai_id(dai_id);1914int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id);1915int apll;1916int apll_clk_id;1917struct etdm_con_reg etdm_reg;1918unsigned int val = 0;1919unsigned int mask = 0;1920int ret = 0;19211922if (clk_id < 0 || clkdiv_id < 0)1923return 0;19241925if (!mt8195_afe_etdm_is_valid(dai_id))1926return -EINVAL;19271928etdm_data = afe_priv->dai_priv[dai_id];1929ret = get_etdm_reg(dai_id, &etdm_reg);1930if (ret < 0)1931return ret;19321933mask |= ETDM_CON1_MCLK_OUTPUT;1934if (etdm_data->mclk_dir == SND_SOC_CLOCK_OUT)1935val |= ETDM_CON1_MCLK_OUTPUT;1936regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);19371938if (etdm_data->mclk_freq) {1939apll = etdm_data->mclk_apll;1940apll_clk_id = mt8195_afe_get_mclk_source_clk_id(apll);1941if (apll_clk_id < 0)1942return apll_clk_id;19431944/* select apll */1945ret = mt8195_afe_set_clk_parent(afe, afe_priv->clk[clk_id],1946afe_priv->clk[apll_clk_id]);1947if (ret)1948return ret;19491950/* set rate */1951ret = mt8195_afe_set_clk_rate(afe, afe_priv->clk[clkdiv_id],1952etdm_data->mclk_freq);1953} else {1954if (etdm_data->mclk_dir == SND_SOC_CLOCK_OUT)1955dev_dbg(afe->dev, "%s mclk freq = 0\n", __func__);1956}1957return ret;1958}19591960static int mtk_dai_etdm_configure(struct mtk_base_afe *afe,1961unsigned int rate,1962unsigned int channels,1963unsigned int bit_width,1964int dai_id)1965{1966struct mt8195_afe_private *afe_priv = afe->platform_priv;1967struct mtk_dai_etdm_priv *etdm_data;1968struct etdm_con_reg etdm_reg;1969bool slave_mode;1970unsigned int etdm_channels;1971unsigned int val = 0;1972unsigned int mask = 0;1973unsigned int bck;1974unsigned int wlen = get_etdm_wlen(bit_width);1975int ret;19761977if (!mt8195_afe_etdm_is_valid(dai_id))1978return -EINVAL;19791980etdm_data = afe_priv->dai_priv[dai_id];1981slave_mode = etdm_data->slave_mode;1982ret = get_etdm_reg(dai_id, &etdm_reg);1983if (ret < 0)1984return ret;19851986if (etdm_data->cowork_source_id != COWORK_ETDM_NONE)1987slave_mode = true;19881989dev_dbg(afe->dev, "%s fmt %u data %u lrck %d-%u bck %d, clock %u slv %u\n",1990__func__, etdm_data->format, etdm_data->data_mode,1991etdm_data->lrck_inv, etdm_data->lrck_width, etdm_data->bck_inv,1992etdm_data->clock_mode, etdm_data->slave_mode);1993dev_dbg(afe->dev, "%s rate %u channels %u bitwidth %u, id %d\n",1994__func__, rate, channels, bit_width, dai_id);19951996etdm_channels = (etdm_data->data_mode == MTK_DAI_ETDM_DATA_ONE_PIN) ?1997get_etdm_ch_fixup(channels) : 2;19981999bck = rate * etdm_channels * wlen;2000if (bck > MT8195_ETDM_NORMAL_MAX_BCK_RATE) {2001dev_info(afe->dev, "%s bck rate %u not support\n",2002__func__, bck);2003return -EINVAL;2004}20052006/* con0 */2007mask |= ETDM_CON0_BIT_LEN_MASK;2008val |= ETDM_CON0_BIT_LEN(bit_width);2009mask |= ETDM_CON0_WORD_LEN_MASK;2010val |= ETDM_CON0_WORD_LEN(wlen);2011mask |= ETDM_CON0_FORMAT_MASK;2012val |= ETDM_CON0_FORMAT(etdm_data->format);2013mask |= ETDM_CON0_CH_NUM_MASK;2014val |= ETDM_CON0_CH_NUM(etdm_channels);20152016mask |= ETDM_CON0_SLAVE_MODE;2017if (slave_mode) {2018if (dai_id == MT8195_AFE_IO_ETDM1_OUT &&2019etdm_data->cowork_source_id == COWORK_ETDM_NONE) {2020dev_info(afe->dev, "%s id %d only support master mode\n",2021__func__, dai_id);2022return -EINVAL;2023}2024val |= ETDM_CON0_SLAVE_MODE;2025}2026regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val);20272028if (get_etdm_dir(dai_id) == ETDM_IN)2029mtk_dai_etdm_in_configure(afe, rate, channels, dai_id);2030else2031mtk_dai_etdm_out_configure(afe, rate, channels, dai_id);20322033return 0;2034}20352036static int mtk_dai_etdm_hw_params(struct snd_pcm_substream *substream,2037struct snd_pcm_hw_params *params,2038struct snd_soc_dai *dai)2039{2040int ret = 0;2041unsigned int rate = params_rate(params);2042unsigned int bit_width = params_width(params);2043unsigned int channels = params_channels(params);2044struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2045struct mt8195_afe_private *afe_priv = afe->platform_priv;2046struct mtk_dai_etdm_priv *mst_etdm_data;2047int mst_dai_id;2048int slv_dai_id;2049int i;20502051dev_dbg(afe->dev, "%s '%s' period %u-%u\n",2052__func__, snd_pcm_stream_str(substream),2053params_period_size(params), params_periods(params));20542055if (is_cowork_mode(dai)) {2056mst_dai_id = get_etdm_cowork_master_id(dai);2057if (!mt8195_afe_etdm_is_valid(mst_dai_id))2058return -EINVAL;20592060ret = mtk_dai_etdm_mclk_configure(afe, mst_dai_id);2061if (ret)2062return ret;20632064ret = mtk_dai_etdm_configure(afe, rate, channels,2065bit_width, mst_dai_id);2066if (ret)2067return ret;20682069mst_etdm_data = afe_priv->dai_priv[mst_dai_id];2070for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {2071slv_dai_id = mst_etdm_data->cowork_slv_id[i];2072ret = mtk_dai_etdm_configure(afe, rate, channels,2073bit_width, slv_dai_id);2074if (ret)2075return ret;20762077ret = mt8195_etdm_sync_mode_configure(afe, slv_dai_id);2078if (ret)2079return ret;2080}2081} else {2082ret = mtk_dai_etdm_mclk_configure(afe, dai->id);2083if (ret)2084return ret;20852086ret = mtk_dai_etdm_configure(afe, rate, channels,2087bit_width, dai->id);2088}20892090return ret;2091}20922093static int mtk_dai_etdm_trigger(struct snd_pcm_substream *substream, int cmd,2094struct snd_soc_dai *dai)2095{2096int ret = 0;2097struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2098struct mt8195_afe_private *afe_priv = afe->platform_priv;2099struct mtk_dai_etdm_priv *mst_etdm_data;2100int mst_dai_id;2101int slv_dai_id;2102int i;21032104dev_dbg(afe->dev, "%s(), cmd %d, dai id %d\n", __func__, cmd, dai->id);2105switch (cmd) {2106case SNDRV_PCM_TRIGGER_START:2107case SNDRV_PCM_TRIGGER_RESUME:2108if (is_cowork_mode(dai)) {2109mst_dai_id = get_etdm_cowork_master_id(dai);2110if (!mt8195_afe_etdm_is_valid(mst_dai_id))2111return -EINVAL;21122113mst_etdm_data = afe_priv->dai_priv[mst_dai_id];21142115//open master first2116ret |= mt8195_afe_enable_etdm(afe, mst_dai_id);2117for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {2118slv_dai_id = mst_etdm_data->cowork_slv_id[i];2119ret |= mt8195_afe_enable_etdm(afe, slv_dai_id);2120}2121} else {2122ret = mt8195_afe_enable_etdm(afe, dai->id);2123}2124break;2125case SNDRV_PCM_TRIGGER_STOP:2126case SNDRV_PCM_TRIGGER_SUSPEND:2127if (is_cowork_mode(dai)) {2128mst_dai_id = get_etdm_cowork_master_id(dai);2129if (!mt8195_afe_etdm_is_valid(mst_dai_id))2130return -EINVAL;21312132mst_etdm_data = afe_priv->dai_priv[mst_dai_id];21332134for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {2135slv_dai_id = mst_etdm_data->cowork_slv_id[i];2136ret |= mt8195_afe_disable_etdm(afe, slv_dai_id);2137}2138// close master at last2139ret |= mt8195_afe_disable_etdm(afe, mst_dai_id);2140} else {2141ret = mt8195_afe_disable_etdm(afe, dai->id);2142}2143break;2144default:2145break;2146}2147return ret;2148}21492150static int mtk_dai_etdm_cal_mclk(struct mtk_base_afe *afe, int freq, int dai_id)2151{2152struct mt8195_afe_private *afe_priv = afe->platform_priv;2153struct mtk_dai_etdm_priv *etdm_data;2154int apll;2155int apll_rate;21562157if (!mt8195_afe_etdm_is_valid(dai_id))2158return -EINVAL;21592160etdm_data = afe_priv->dai_priv[dai_id];2161if (freq == 0) {2162etdm_data->mclk_freq = freq;2163return 0;2164}21652166apll = mt8195_afe_get_default_mclk_source_by_rate(freq);2167apll_rate = mt8195_afe_get_mclk_source_rate(afe, apll);21682169if (freq > apll_rate) {2170dev_info(afe->dev, "freq %d > apll rate %d\n", freq, apll_rate);2171return -EINVAL;2172}21732174if (apll_rate % freq != 0) {2175dev_info(afe->dev, "APLL%d cannot generate freq Hz\n", apll);2176return -EINVAL;2177}21782179etdm_data->mclk_apll = apll;2180etdm_data->mclk_freq = freq;21812182return 0;2183}21842185static int mtk_dai_etdm_set_sysclk(struct snd_soc_dai *dai,2186int clk_id, unsigned int freq, int dir)2187{2188struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2189struct mt8195_afe_private *afe_priv = afe->platform_priv;2190struct mtk_dai_etdm_priv *etdm_data;2191int dai_id;21922193dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n",2194__func__, dai->id, freq, dir);2195if (is_cowork_mode(dai))2196dai_id = get_etdm_cowork_master_id(dai);2197else2198dai_id = dai->id;21992200if (!mt8195_afe_etdm_is_valid(dai_id))2201return -EINVAL;22022203etdm_data = afe_priv->dai_priv[dai_id];2204etdm_data->mclk_dir = dir;2205return mtk_dai_etdm_cal_mclk(afe, freq, dai_id);2206}22072208static int mtk_dai_etdm_set_tdm_slot(struct snd_soc_dai *dai,2209unsigned int tx_mask, unsigned int rx_mask,2210int slots, int slot_width)2211{2212struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2213struct mt8195_afe_private *afe_priv = afe->platform_priv;2214struct mtk_dai_etdm_priv *etdm_data;22152216if (!mt8195_afe_etdm_is_valid(dai->id))2217return -EINVAL;22182219etdm_data = afe_priv->dai_priv[dai->id];2220dev_dbg(dai->dev, "%s id %d slot_width %d\n",2221__func__, dai->id, slot_width);22222223etdm_data->slots = slots;2224etdm_data->lrck_width = slot_width;2225return 0;2226}22272228static int mtk_dai_etdm_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)2229{2230struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2231struct mt8195_afe_private *afe_priv = afe->platform_priv;2232struct mtk_dai_etdm_priv *etdm_data;22332234if (!mt8195_afe_etdm_is_valid(dai->id))2235return -EINVAL;22362237etdm_data = afe_priv->dai_priv[dai->id];2238switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {2239case SND_SOC_DAIFMT_I2S:2240etdm_data->format = MTK_DAI_ETDM_FORMAT_I2S;2241break;2242case SND_SOC_DAIFMT_LEFT_J:2243etdm_data->format = MTK_DAI_ETDM_FORMAT_LJ;2244break;2245case SND_SOC_DAIFMT_RIGHT_J:2246etdm_data->format = MTK_DAI_ETDM_FORMAT_RJ;2247break;2248case SND_SOC_DAIFMT_DSP_A:2249etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPA;2250break;2251case SND_SOC_DAIFMT_DSP_B:2252etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPB;2253break;2254default:2255return -EINVAL;2256}22572258switch (fmt & SND_SOC_DAIFMT_INV_MASK) {2259case SND_SOC_DAIFMT_NB_NF:2260etdm_data->bck_inv = false;2261etdm_data->lrck_inv = false;2262break;2263case SND_SOC_DAIFMT_NB_IF:2264etdm_data->bck_inv = false;2265etdm_data->lrck_inv = true;2266break;2267case SND_SOC_DAIFMT_IB_NF:2268etdm_data->bck_inv = true;2269etdm_data->lrck_inv = false;2270break;2271case SND_SOC_DAIFMT_IB_IF:2272etdm_data->bck_inv = true;2273etdm_data->lrck_inv = true;2274break;2275default:2276return -EINVAL;2277}22782279switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {2280case SND_SOC_DAIFMT_BC_FC:2281etdm_data->slave_mode = true;2282break;2283case SND_SOC_DAIFMT_BP_FP:2284etdm_data->slave_mode = false;2285break;2286default:2287return -EINVAL;2288}22892290return 0;2291}22922293static int mtk_dai_hdmitx_dptx_startup(struct snd_pcm_substream *substream,2294struct snd_soc_dai *dai)2295{2296struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2297struct mt8195_afe_private *afe_priv = afe->platform_priv;2298int cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id);22992300if (cg_id >= 0)2301mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]);23022303mtk_dai_etdm_enable_mclk(afe, dai->id);23042305return 0;2306}23072308static void mtk_dai_hdmitx_dptx_shutdown(struct snd_pcm_substream *substream,2309struct snd_soc_dai *dai)2310{2311struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2312struct mt8195_afe_private *afe_priv = afe->platform_priv;2313int cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id);23142315mtk_dai_etdm_disable_mclk(afe, dai->id);23162317if (cg_id >= 0)2318mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]);2319}23202321static unsigned int mtk_dai_get_dptx_ch_en(unsigned int channel)2322{2323switch (channel) {2324case 1 ... 2:2325return AFE_DPTX_CON_CH_EN_2CH;2326case 3 ... 4:2327return AFE_DPTX_CON_CH_EN_4CH;2328case 5 ... 6:2329return AFE_DPTX_CON_CH_EN_6CH;2330case 7 ... 8:2331return AFE_DPTX_CON_CH_EN_8CH;2332default:2333return AFE_DPTX_CON_CH_EN_2CH;2334}2335}23362337static unsigned int mtk_dai_get_dptx_ch(unsigned int ch)2338{2339return (ch > 2) ?2340AFE_DPTX_CON_CH_NUM_8CH : AFE_DPTX_CON_CH_NUM_2CH;2341}23422343static unsigned int mtk_dai_get_dptx_wlen(snd_pcm_format_t format)2344{2345return snd_pcm_format_physical_width(format) <= 16 ?2346AFE_DPTX_CON_16BIT : AFE_DPTX_CON_24BIT;2347}23482349static int mtk_dai_hdmitx_dptx_hw_params(struct snd_pcm_substream *substream,2350struct snd_pcm_hw_params *params,2351struct snd_soc_dai *dai)2352{2353struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2354struct mt8195_afe_private *afe_priv = afe->platform_priv;2355struct mtk_dai_etdm_priv *etdm_data;2356unsigned int rate = params_rate(params);2357unsigned int channels = params_channels(params);2358snd_pcm_format_t format = params_format(params);2359int width = snd_pcm_format_physical_width(format);2360int ret = 0;23612362if (!mt8195_afe_hdmitx_dptx_is_valid(dai->id))2363return -EINVAL;23642365etdm_data = afe_priv->dai_priv[dai->id];23662367/* dptx configure */2368if (dai->id == MT8195_AFE_IO_DPTX) {2369regmap_update_bits(afe->regmap, AFE_DPTX_CON,2370AFE_DPTX_CON_CH_EN_MASK,2371mtk_dai_get_dptx_ch_en(channels));2372regmap_update_bits(afe->regmap, AFE_DPTX_CON,2373AFE_DPTX_CON_CH_NUM_MASK,2374mtk_dai_get_dptx_ch(channels));2375regmap_update_bits(afe->regmap, AFE_DPTX_CON,2376AFE_DPTX_CON_16BIT_MASK,2377mtk_dai_get_dptx_wlen(format));23782379if (mtk_dai_get_dptx_ch(channels) == AFE_DPTX_CON_CH_NUM_8CH) {2380etdm_data->data_mode = MTK_DAI_ETDM_DATA_ONE_PIN;2381channels = 8;2382} else {2383channels = 2;2384}2385} else {2386etdm_data->data_mode = MTK_DAI_ETDM_DATA_MULTI_PIN;2387}23882389ret = mtk_dai_etdm_mclk_configure(afe, dai->id);2390if (ret)2391return ret;23922393ret = mtk_dai_etdm_configure(afe, rate, channels, width, dai->id);23942395return ret;2396}23972398static int mtk_dai_hdmitx_dptx_trigger(struct snd_pcm_substream *substream,2399int cmd,2400struct snd_soc_dai *dai)2401{2402struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2403int ret = 0;24042405dev_dbg(afe->dev, "%s(), cmd %d, dai id %d\n", __func__, cmd, dai->id);24062407switch (cmd) {2408case SNDRV_PCM_TRIGGER_START:2409case SNDRV_PCM_TRIGGER_RESUME:2410/* enable dptx interface */2411if (dai->id == MT8195_AFE_IO_DPTX)2412regmap_update_bits(afe->regmap, AFE_DPTX_CON,2413AFE_DPTX_CON_ON_MASK,2414AFE_DPTX_CON_ON);24152416/* enable etdm_out3 */2417ret = mt8195_afe_enable_etdm(afe, dai->id);2418break;2419case SNDRV_PCM_TRIGGER_STOP:2420case SNDRV_PCM_TRIGGER_SUSPEND:2421/* disable etdm_out3 */2422ret = mt8195_afe_disable_etdm(afe, dai->id);24232424/* disable dptx interface */2425if (dai->id == MT8195_AFE_IO_DPTX)2426regmap_update_bits(afe->regmap, AFE_DPTX_CON,2427AFE_DPTX_CON_ON_MASK, 0);2428break;2429default:2430return -EINVAL;2431}24322433return ret;2434}24352436static int mtk_dai_hdmitx_dptx_set_sysclk(struct snd_soc_dai *dai,2437int clk_id,2438unsigned int freq,2439int dir)2440{2441struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2442struct mt8195_afe_private *afe_priv = afe->platform_priv;2443struct mtk_dai_etdm_priv *etdm_data;24442445if (!mt8195_afe_hdmitx_dptx_is_valid(dai->id))2446return -EINVAL;24472448etdm_data = afe_priv->dai_priv[dai->id];24492450dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n",2451__func__, dai->id, freq, dir);24522453etdm_data->mclk_dir = dir;2454return mtk_dai_etdm_cal_mclk(afe, freq, dai->id);2455}24562457/* dai driver */2458#define MTK_ETDM_RATES (SNDRV_PCM_RATE_8000_384000)24592460#define MTK_ETDM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\2461SNDRV_PCM_FMTBIT_S24_LE |\2462SNDRV_PCM_FMTBIT_S32_LE)24632464static int mtk_dai_etdm_probe(struct snd_soc_dai *dai)2465{2466struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2467struct mt8195_afe_private *afe_priv = afe->platform_priv;2468struct mtk_dai_etdm_priv *etdm_data;24692470dev_dbg(dai->dev, "%s id %d\n", __func__, dai->id);24712472if (!mt8195_afe_etdm_is_valid(dai->id))2473return -EINVAL;24742475etdm_data = afe_priv->dai_priv[dai->id];2476if (etdm_data->mclk_freq) {2477dev_dbg(afe->dev, "MCLK always on, rate %d\n",2478etdm_data->mclk_freq);2479pm_runtime_get_sync(afe->dev);2480mtk_dai_etdm_mclk_configure(afe, dai->id);2481mtk_dai_etdm_enable_mclk(afe, dai->id);2482pm_runtime_put_sync(afe->dev);2483}2484return 0;2485}24862487static const struct snd_soc_dai_ops mtk_dai_hdmitx_dptx_ops = {2488.startup = mtk_dai_hdmitx_dptx_startup,2489.shutdown = mtk_dai_hdmitx_dptx_shutdown,2490.hw_params = mtk_dai_hdmitx_dptx_hw_params,2491.trigger = mtk_dai_hdmitx_dptx_trigger,2492.set_sysclk = mtk_dai_hdmitx_dptx_set_sysclk,2493.set_fmt = mtk_dai_etdm_set_fmt,2494};24952496static const struct snd_soc_dai_ops mtk_dai_hdmitx_dptx_ops2 = {2497.probe = mtk_dai_etdm_probe,2498.startup = mtk_dai_hdmitx_dptx_startup,2499.shutdown = mtk_dai_hdmitx_dptx_shutdown,2500.hw_params = mtk_dai_hdmitx_dptx_hw_params,2501.trigger = mtk_dai_hdmitx_dptx_trigger,2502.set_sysclk = mtk_dai_hdmitx_dptx_set_sysclk,2503.set_fmt = mtk_dai_etdm_set_fmt,2504};25052506static const struct snd_soc_dai_ops mtk_dai_etdm_ops = {2507.probe = mtk_dai_etdm_probe,2508.startup = mtk_dai_etdm_startup,2509.shutdown = mtk_dai_etdm_shutdown,2510.hw_params = mtk_dai_etdm_hw_params,2511.trigger = mtk_dai_etdm_trigger,2512.set_sysclk = mtk_dai_etdm_set_sysclk,2513.set_fmt = mtk_dai_etdm_set_fmt,2514.set_tdm_slot = mtk_dai_etdm_set_tdm_slot,2515};25162517static struct snd_soc_dai_driver mtk_dai_etdm_driver[] = {2518{2519.name = "DPTX",2520.id = MT8195_AFE_IO_DPTX,2521.playback = {2522.stream_name = "DPTX Playback",2523.channels_min = 1,2524.channels_max = 8,2525.rates = MTK_ETDM_RATES,2526.formats = MTK_ETDM_FORMATS,2527},2528.ops = &mtk_dai_hdmitx_dptx_ops,2529},2530{2531.name = "ETDM1_IN",2532.id = MT8195_AFE_IO_ETDM1_IN,2533.capture = {2534.stream_name = "ETDM1 Capture",2535.channels_min = 1,2536.channels_max = 24,2537.rates = MTK_ETDM_RATES,2538.formats = MTK_ETDM_FORMATS,2539},2540.ops = &mtk_dai_etdm_ops,2541},2542{2543.name = "ETDM2_IN",2544.id = MT8195_AFE_IO_ETDM2_IN,2545.capture = {2546.stream_name = "ETDM2 Capture",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 = "ETDM1_OUT",2556.id = MT8195_AFE_IO_ETDM1_OUT,2557.playback = {2558.stream_name = "ETDM1 Playback",2559.channels_min = 1,2560.channels_max = 24,2561.rates = MTK_ETDM_RATES,2562.formats = MTK_ETDM_FORMATS,2563},2564.ops = &mtk_dai_etdm_ops,2565},2566{2567.name = "ETDM2_OUT",2568.id = MT8195_AFE_IO_ETDM2_OUT,2569.playback = {2570.stream_name = "ETDM2 Playback",2571.channels_min = 1,2572.channels_max = 24,2573.rates = MTK_ETDM_RATES,2574.formats = MTK_ETDM_FORMATS,2575},2576.ops = &mtk_dai_etdm_ops,2577},2578{2579.name = "ETDM3_OUT",2580.id = MT8195_AFE_IO_ETDM3_OUT,2581.playback = {2582.stream_name = "ETDM3 Playback",2583.channels_min = 1,2584.channels_max = 8,2585.rates = MTK_ETDM_RATES,2586.formats = MTK_ETDM_FORMATS,2587},2588.ops = &mtk_dai_hdmitx_dptx_ops2,2589},2590};25912592static void mt8195_etdm_update_sync_info(struct mtk_base_afe *afe)2593{2594struct mt8195_afe_private *afe_priv = afe->platform_priv;2595struct mtk_dai_etdm_priv *etdm_data;2596struct mtk_dai_etdm_priv *mst_data;2597int i;2598int mst_dai_id;25992600for (i = MT8195_AFE_IO_ETDM_START; i < MT8195_AFE_IO_ETDM_END; i++) {2601etdm_data = afe_priv->dai_priv[i];2602if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) {2603mst_dai_id = etdm_data->cowork_source_id;2604if (!mt8195_afe_etdm_is_valid(mst_dai_id)) {2605dev_err(afe->dev, "%s invalid dai id %d\n",2606__func__, mst_dai_id);2607return;2608}2609mst_data = afe_priv->dai_priv[mst_dai_id];2610if (mst_data->cowork_source_id != COWORK_ETDM_NONE)2611dev_info(afe->dev, "%s [%d] wrong sync source\n"2612, __func__, i);2613mst_data->cowork_slv_id[mst_data->cowork_slv_count] = i;2614mst_data->cowork_slv_count++;2615}2616}2617}26182619static void mt8195_dai_etdm_parse_of(struct mtk_base_afe *afe)2620{2621const struct device_node *of_node = afe->dev->of_node;2622struct mt8195_afe_private *afe_priv = afe->platform_priv;2623struct mtk_dai_etdm_priv *etdm_data;2624int i, j;2625char prop[48];2626u8 disable_chn[MT8195_ETDM_MAX_CHANNELS];2627int max_chn = MT8195_ETDM_MAX_CHANNELS;2628u32 sel;2629int ret;2630int dai_id;2631unsigned int sync_id;2632struct {2633const char *name;2634const unsigned int sync_id;2635} of_afe_etdms[MT8195_AFE_IO_ETDM_NUM] = {2636{"etdm-in1", ETDM_SYNC_FROM_IN1},2637{"etdm-in2", ETDM_SYNC_FROM_IN2},2638{"etdm-out1", ETDM_SYNC_FROM_OUT1},2639{"etdm-out2", ETDM_SYNC_FROM_OUT2},2640{"etdm-out3", ETDM_SYNC_FROM_OUT3},2641};26422643for (i = 0; i < MT8195_AFE_IO_ETDM_NUM; i++) {2644dai_id = ETDM_TO_DAI_ID(i);2645if (!mt8195_afe_etdm_is_valid(dai_id)) {2646dev_err(afe->dev, "%s invalid dai id %d\n",2647__func__, dai_id);2648return;2649}26502651etdm_data = afe_priv->dai_priv[dai_id];26522653scnprintf(prop, sizeof(prop),2654"mediatek,%s-mclk-always-on-rate",2655of_afe_etdms[i].name);2656ret = of_property_read_u32(of_node, prop, &sel);2657if (ret == 0) {2658etdm_data->mclk_dir = SND_SOC_CLOCK_OUT;2659if (mtk_dai_etdm_cal_mclk(afe, sel, dai_id))2660dev_info(afe->dev, "%s unsupported mclk %uHz\n",2661__func__, sel);2662}26632664scnprintf(prop, sizeof(prop),2665"mediatek,%s-multi-pin-mode",2666of_afe_etdms[i].name);2667etdm_data->data_mode = of_property_read_bool(of_node, prop);26682669scnprintf(prop, sizeof(prop),2670"mediatek,%s-cowork-source",2671of_afe_etdms[i].name);2672ret = of_property_read_u32(of_node, prop, &sel);2673if (ret == 0) {2674if (sel >= MT8195_AFE_IO_ETDM_NUM) {2675dev_info(afe->dev, "%s invalid id=%d\n",2676__func__, sel);2677etdm_data->cowork_source_id = COWORK_ETDM_NONE;2678} else {2679sync_id = of_afe_etdms[sel].sync_id;2680etdm_data->cowork_source_id =2681sync_to_dai_id(sync_id);2682}2683} else {2684etdm_data->cowork_source_id = COWORK_ETDM_NONE;2685}2686}26872688/* etdm in only */2689for (i = 0; i < 2; i++) {2690dai_id = ETDM_TO_DAI_ID(i);2691etdm_data = afe_priv->dai_priv[dai_id];26922693scnprintf(prop, sizeof(prop),2694"mediatek,%s-chn-disabled",2695of_afe_etdms[i].name);2696ret = of_property_read_variable_u8_array(of_node, prop,2697disable_chn,26981, max_chn);2699if (ret < 0)2700continue;27012702for (j = 0; j < ret; j++) {2703if (disable_chn[j] >= MT8195_ETDM_MAX_CHANNELS)2704dev_info(afe->dev, "%s [%d] invalid chn %u\n",2705__func__, j, disable_chn[j]);2706else2707etdm_data->in_disable_ch[disable_chn[j]] = true;2708}2709}2710mt8195_etdm_update_sync_info(afe);2711}27122713static int init_etdm_priv_data(struct mtk_base_afe *afe)2714{2715struct mt8195_afe_private *afe_priv = afe->platform_priv;2716struct mtk_dai_etdm_priv *etdm_priv;2717int i;27182719for (i = MT8195_AFE_IO_ETDM_START; i < MT8195_AFE_IO_ETDM_END; i++) {2720etdm_priv = devm_kzalloc(afe->dev,2721sizeof(struct mtk_dai_etdm_priv),2722GFP_KERNEL);2723if (!etdm_priv)2724return -ENOMEM;27252726afe_priv->dai_priv[i] = etdm_priv;2727}27282729afe_priv->dai_priv[MT8195_AFE_IO_DPTX] =2730afe_priv->dai_priv[MT8195_AFE_IO_ETDM3_OUT];27312732mt8195_dai_etdm_parse_of(afe);2733return 0;2734}27352736int mt8195_dai_etdm_register(struct mtk_base_afe *afe)2737{2738struct mtk_base_afe_dai *dai;27392740dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);2741if (!dai)2742return -ENOMEM;27432744list_add(&dai->list, &afe->sub_dais);27452746dai->dai_drivers = mtk_dai_etdm_driver;2747dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_etdm_driver);27482749dai->dapm_widgets = mtk_dai_etdm_widgets;2750dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_etdm_widgets);2751dai->dapm_routes = mtk_dai_etdm_routes;2752dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_etdm_routes);2753dai->controls = mtk_dai_etdm_controls;2754dai->num_controls = ARRAY_SIZE(mtk_dai_etdm_controls);27552756return init_etdm_priv_data(afe);2757}275827592760