Path: blob/master/sound/soc/mediatek/mt8195/mt8195-dai-etdm.c
26488 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 =741snd_soc_kcontrol_component(kcontrol);742struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);743unsigned int value = 0;744unsigned int reg = 0;745unsigned int mask = 0;746unsigned int shift = 0;747748if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) {749reg = ETDM_OUT1_CON4;750mask = ETDM_OUT_CON4_CLOCK_MASK;751shift = ETDM_OUT_CON4_CLOCK_SHIFT;752} else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) {753reg = ETDM_OUT2_CON4;754mask = ETDM_OUT_CON4_CLOCK_MASK;755shift = ETDM_OUT_CON4_CLOCK_SHIFT;756} else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) {757reg = ETDM_OUT3_CON4;758mask = ETDM_OUT_CON4_CLOCK_MASK;759shift = ETDM_OUT_CON4_CLOCK_SHIFT;760} else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) {761reg = ETDM_IN1_CON2;762mask = ETDM_IN_CON2_CLOCK_MASK;763shift = ETDM_IN_CON2_CLOCK_SHIFT;764} else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) {765reg = ETDM_IN2_CON2;766mask = ETDM_IN_CON2_CLOCK_MASK;767shift = ETDM_IN_CON2_CLOCK_SHIFT;768}769770if (reg)771regmap_read(afe->regmap, reg, &value);772773value &= mask;774value >>= shift;775ucontrol->value.enumerated.item[0] = value;776return 0;777}778779static const struct snd_kcontrol_new mtk_dai_etdm_controls[] = {780SOC_ENUM_EXT("ETDM_OUT1_Clock_Source",781etdmout_clk_src_enum,782mt8195_etdm_clk_src_sel_get,783mt8195_etdm_clk_src_sel_put),784SOC_ENUM_EXT("ETDM_OUT2_Clock_Source",785etdmout_clk_src_enum,786mt8195_etdm_clk_src_sel_get,787mt8195_etdm_clk_src_sel_put),788SOC_ENUM_EXT("ETDM_OUT3_Clock_Source",789etdmout_clk_src_enum,790mt8195_etdm_clk_src_sel_get,791mt8195_etdm_clk_src_sel_put),792SOC_ENUM_EXT("ETDM_IN1_Clock_Source",793etdmout_clk_src_enum,794mt8195_etdm_clk_src_sel_get,795mt8195_etdm_clk_src_sel_put),796SOC_ENUM_EXT("ETDM_IN2_Clock_Source",797etdmout_clk_src_enum,798mt8195_etdm_clk_src_sel_get,799mt8195_etdm_clk_src_sel_put),800};801802static const struct snd_soc_dapm_widget mtk_dai_etdm_widgets[] = {803/* eTDM_IN2 */804SND_SOC_DAPM_MIXER("I012", SND_SOC_NOPM, 0, 0, NULL, 0),805SND_SOC_DAPM_MIXER("I013", SND_SOC_NOPM, 0, 0, NULL, 0),806SND_SOC_DAPM_MIXER("I014", SND_SOC_NOPM, 0, 0, NULL, 0),807SND_SOC_DAPM_MIXER("I015", SND_SOC_NOPM, 0, 0, NULL, 0),808SND_SOC_DAPM_MIXER("I016", SND_SOC_NOPM, 0, 0, NULL, 0),809SND_SOC_DAPM_MIXER("I017", SND_SOC_NOPM, 0, 0, NULL, 0),810SND_SOC_DAPM_MIXER("I018", SND_SOC_NOPM, 0, 0, NULL, 0),811SND_SOC_DAPM_MIXER("I019", SND_SOC_NOPM, 0, 0, NULL, 0),812813/* eTDM_IN1 */814SND_SOC_DAPM_MIXER("I072", SND_SOC_NOPM, 0, 0, NULL, 0),815SND_SOC_DAPM_MIXER("I073", SND_SOC_NOPM, 0, 0, NULL, 0),816SND_SOC_DAPM_MIXER("I074", SND_SOC_NOPM, 0, 0, NULL, 0),817SND_SOC_DAPM_MIXER("I075", SND_SOC_NOPM, 0, 0, NULL, 0),818SND_SOC_DAPM_MIXER("I076", SND_SOC_NOPM, 0, 0, NULL, 0),819SND_SOC_DAPM_MIXER("I077", SND_SOC_NOPM, 0, 0, NULL, 0),820SND_SOC_DAPM_MIXER("I078", SND_SOC_NOPM, 0, 0, NULL, 0),821SND_SOC_DAPM_MIXER("I079", SND_SOC_NOPM, 0, 0, NULL, 0),822SND_SOC_DAPM_MIXER("I080", SND_SOC_NOPM, 0, 0, NULL, 0),823SND_SOC_DAPM_MIXER("I081", SND_SOC_NOPM, 0, 0, NULL, 0),824SND_SOC_DAPM_MIXER("I082", SND_SOC_NOPM, 0, 0, NULL, 0),825SND_SOC_DAPM_MIXER("I083", SND_SOC_NOPM, 0, 0, NULL, 0),826SND_SOC_DAPM_MIXER("I084", SND_SOC_NOPM, 0, 0, NULL, 0),827SND_SOC_DAPM_MIXER("I085", SND_SOC_NOPM, 0, 0, NULL, 0),828SND_SOC_DAPM_MIXER("I086", SND_SOC_NOPM, 0, 0, NULL, 0),829SND_SOC_DAPM_MIXER("I087", SND_SOC_NOPM, 0, 0, NULL, 0),830SND_SOC_DAPM_MIXER("I088", SND_SOC_NOPM, 0, 0, NULL, 0),831SND_SOC_DAPM_MIXER("I089", SND_SOC_NOPM, 0, 0, NULL, 0),832SND_SOC_DAPM_MIXER("I090", SND_SOC_NOPM, 0, 0, NULL, 0),833SND_SOC_DAPM_MIXER("I091", SND_SOC_NOPM, 0, 0, NULL, 0),834SND_SOC_DAPM_MIXER("I092", SND_SOC_NOPM, 0, 0, NULL, 0),835SND_SOC_DAPM_MIXER("I093", SND_SOC_NOPM, 0, 0, NULL, 0),836SND_SOC_DAPM_MIXER("I094", SND_SOC_NOPM, 0, 0, NULL, 0),837SND_SOC_DAPM_MIXER("I095", SND_SOC_NOPM, 0, 0, NULL, 0),838839/* eTDM_OUT2 */840SND_SOC_DAPM_MIXER("O048", SND_SOC_NOPM, 0, 0,841mtk_dai_etdm_o048_mix,842ARRAY_SIZE(mtk_dai_etdm_o048_mix)),843SND_SOC_DAPM_MIXER("O049", SND_SOC_NOPM, 0, 0,844mtk_dai_etdm_o049_mix,845ARRAY_SIZE(mtk_dai_etdm_o049_mix)),846SND_SOC_DAPM_MIXER("O050", SND_SOC_NOPM, 0, 0,847mtk_dai_etdm_o050_mix,848ARRAY_SIZE(mtk_dai_etdm_o050_mix)),849SND_SOC_DAPM_MIXER("O051", SND_SOC_NOPM, 0, 0,850mtk_dai_etdm_o051_mix,851ARRAY_SIZE(mtk_dai_etdm_o051_mix)),852SND_SOC_DAPM_MIXER("O052", SND_SOC_NOPM, 0, 0,853mtk_dai_etdm_o052_mix,854ARRAY_SIZE(mtk_dai_etdm_o052_mix)),855SND_SOC_DAPM_MIXER("O053", SND_SOC_NOPM, 0, 0,856mtk_dai_etdm_o053_mix,857ARRAY_SIZE(mtk_dai_etdm_o053_mix)),858SND_SOC_DAPM_MIXER("O054", SND_SOC_NOPM, 0, 0,859mtk_dai_etdm_o054_mix,860ARRAY_SIZE(mtk_dai_etdm_o054_mix)),861SND_SOC_DAPM_MIXER("O055", SND_SOC_NOPM, 0, 0,862mtk_dai_etdm_o055_mix,863ARRAY_SIZE(mtk_dai_etdm_o055_mix)),864SND_SOC_DAPM_MIXER("O056", SND_SOC_NOPM, 0, 0,865mtk_dai_etdm_o056_mix,866ARRAY_SIZE(mtk_dai_etdm_o056_mix)),867SND_SOC_DAPM_MIXER("O057", SND_SOC_NOPM, 0, 0,868mtk_dai_etdm_o057_mix,869ARRAY_SIZE(mtk_dai_etdm_o057_mix)),870SND_SOC_DAPM_MIXER("O058", SND_SOC_NOPM, 0, 0,871mtk_dai_etdm_o058_mix,872ARRAY_SIZE(mtk_dai_etdm_o058_mix)),873SND_SOC_DAPM_MIXER("O059", SND_SOC_NOPM, 0, 0,874mtk_dai_etdm_o059_mix,875ARRAY_SIZE(mtk_dai_etdm_o059_mix)),876SND_SOC_DAPM_MIXER("O060", SND_SOC_NOPM, 0, 0,877mtk_dai_etdm_o060_mix,878ARRAY_SIZE(mtk_dai_etdm_o060_mix)),879SND_SOC_DAPM_MIXER("O061", SND_SOC_NOPM, 0, 0,880mtk_dai_etdm_o061_mix,881ARRAY_SIZE(mtk_dai_etdm_o061_mix)),882SND_SOC_DAPM_MIXER("O062", SND_SOC_NOPM, 0, 0,883mtk_dai_etdm_o062_mix,884ARRAY_SIZE(mtk_dai_etdm_o062_mix)),885SND_SOC_DAPM_MIXER("O063", SND_SOC_NOPM, 0, 0,886mtk_dai_etdm_o063_mix,887ARRAY_SIZE(mtk_dai_etdm_o063_mix)),888SND_SOC_DAPM_MIXER("O064", SND_SOC_NOPM, 0, 0,889mtk_dai_etdm_o064_mix,890ARRAY_SIZE(mtk_dai_etdm_o064_mix)),891SND_SOC_DAPM_MIXER("O065", SND_SOC_NOPM, 0, 0,892mtk_dai_etdm_o065_mix,893ARRAY_SIZE(mtk_dai_etdm_o065_mix)),894SND_SOC_DAPM_MIXER("O066", SND_SOC_NOPM, 0, 0,895mtk_dai_etdm_o066_mix,896ARRAY_SIZE(mtk_dai_etdm_o066_mix)),897SND_SOC_DAPM_MIXER("O067", SND_SOC_NOPM, 0, 0,898mtk_dai_etdm_o067_mix,899ARRAY_SIZE(mtk_dai_etdm_o067_mix)),900SND_SOC_DAPM_MIXER("O068", SND_SOC_NOPM, 0, 0,901mtk_dai_etdm_o068_mix,902ARRAY_SIZE(mtk_dai_etdm_o068_mix)),903SND_SOC_DAPM_MIXER("O069", SND_SOC_NOPM, 0, 0,904mtk_dai_etdm_o069_mix,905ARRAY_SIZE(mtk_dai_etdm_o069_mix)),906SND_SOC_DAPM_MIXER("O070", SND_SOC_NOPM, 0, 0,907mtk_dai_etdm_o070_mix,908ARRAY_SIZE(mtk_dai_etdm_o070_mix)),909SND_SOC_DAPM_MIXER("O071", SND_SOC_NOPM, 0, 0,910mtk_dai_etdm_o071_mix,911ARRAY_SIZE(mtk_dai_etdm_o071_mix)),912913/* eTDM_OUT1 */914SND_SOC_DAPM_MIXER("O072", SND_SOC_NOPM, 0, 0,915mtk_dai_etdm_o072_mix,916ARRAY_SIZE(mtk_dai_etdm_o072_mix)),917SND_SOC_DAPM_MIXER("O073", SND_SOC_NOPM, 0, 0,918mtk_dai_etdm_o073_mix,919ARRAY_SIZE(mtk_dai_etdm_o073_mix)),920SND_SOC_DAPM_MIXER("O074", SND_SOC_NOPM, 0, 0,921mtk_dai_etdm_o074_mix,922ARRAY_SIZE(mtk_dai_etdm_o074_mix)),923SND_SOC_DAPM_MIXER("O075", SND_SOC_NOPM, 0, 0,924mtk_dai_etdm_o075_mix,925ARRAY_SIZE(mtk_dai_etdm_o075_mix)),926SND_SOC_DAPM_MIXER("O076", SND_SOC_NOPM, 0, 0,927mtk_dai_etdm_o076_mix,928ARRAY_SIZE(mtk_dai_etdm_o076_mix)),929SND_SOC_DAPM_MIXER("O077", SND_SOC_NOPM, 0, 0,930mtk_dai_etdm_o077_mix,931ARRAY_SIZE(mtk_dai_etdm_o077_mix)),932SND_SOC_DAPM_MIXER("O078", SND_SOC_NOPM, 0, 0,933mtk_dai_etdm_o078_mix,934ARRAY_SIZE(mtk_dai_etdm_o078_mix)),935SND_SOC_DAPM_MIXER("O079", SND_SOC_NOPM, 0, 0,936mtk_dai_etdm_o079_mix,937ARRAY_SIZE(mtk_dai_etdm_o079_mix)),938SND_SOC_DAPM_MIXER("O080", SND_SOC_NOPM, 0, 0,939mtk_dai_etdm_o080_mix,940ARRAY_SIZE(mtk_dai_etdm_o080_mix)),941SND_SOC_DAPM_MIXER("O081", SND_SOC_NOPM, 0, 0,942mtk_dai_etdm_o081_mix,943ARRAY_SIZE(mtk_dai_etdm_o081_mix)),944SND_SOC_DAPM_MIXER("O082", SND_SOC_NOPM, 0, 0,945mtk_dai_etdm_o082_mix,946ARRAY_SIZE(mtk_dai_etdm_o082_mix)),947SND_SOC_DAPM_MIXER("O083", SND_SOC_NOPM, 0, 0,948mtk_dai_etdm_o083_mix,949ARRAY_SIZE(mtk_dai_etdm_o083_mix)),950SND_SOC_DAPM_MIXER("O084", SND_SOC_NOPM, 0, 0,951mtk_dai_etdm_o084_mix,952ARRAY_SIZE(mtk_dai_etdm_o084_mix)),953SND_SOC_DAPM_MIXER("O085", SND_SOC_NOPM, 0, 0,954mtk_dai_etdm_o085_mix,955ARRAY_SIZE(mtk_dai_etdm_o085_mix)),956SND_SOC_DAPM_MIXER("O086", SND_SOC_NOPM, 0, 0,957mtk_dai_etdm_o086_mix,958ARRAY_SIZE(mtk_dai_etdm_o086_mix)),959SND_SOC_DAPM_MIXER("O087", SND_SOC_NOPM, 0, 0,960mtk_dai_etdm_o087_mix,961ARRAY_SIZE(mtk_dai_etdm_o087_mix)),962SND_SOC_DAPM_MIXER("O088", SND_SOC_NOPM, 0, 0,963mtk_dai_etdm_o088_mix,964ARRAY_SIZE(mtk_dai_etdm_o088_mix)),965SND_SOC_DAPM_MIXER("O089", SND_SOC_NOPM, 0, 0,966mtk_dai_etdm_o089_mix,967ARRAY_SIZE(mtk_dai_etdm_o089_mix)),968SND_SOC_DAPM_MIXER("O090", SND_SOC_NOPM, 0, 0,969mtk_dai_etdm_o090_mix,970ARRAY_SIZE(mtk_dai_etdm_o090_mix)),971SND_SOC_DAPM_MIXER("O091", SND_SOC_NOPM, 0, 0,972mtk_dai_etdm_o091_mix,973ARRAY_SIZE(mtk_dai_etdm_o091_mix)),974SND_SOC_DAPM_MIXER("O092", SND_SOC_NOPM, 0, 0,975mtk_dai_etdm_o092_mix,976ARRAY_SIZE(mtk_dai_etdm_o092_mix)),977SND_SOC_DAPM_MIXER("O093", SND_SOC_NOPM, 0, 0,978mtk_dai_etdm_o093_mix,979ARRAY_SIZE(mtk_dai_etdm_o093_mix)),980SND_SOC_DAPM_MIXER("O094", SND_SOC_NOPM, 0, 0,981mtk_dai_etdm_o094_mix,982ARRAY_SIZE(mtk_dai_etdm_o094_mix)),983SND_SOC_DAPM_MIXER("O095", SND_SOC_NOPM, 0, 0,984mtk_dai_etdm_o095_mix,985ARRAY_SIZE(mtk_dai_etdm_o095_mix)),986987/* eTDM_OUT3 */988SND_SOC_DAPM_MUX("HDMI_OUT_MUX", SND_SOC_NOPM, 0, 0,989&hdmi_out_mux_control),990SND_SOC_DAPM_MUX("DPTX_OUT_MUX", SND_SOC_NOPM, 0, 0,991&dptx_out_mux_control),992993SND_SOC_DAPM_MUX("HDMI_CH0_MUX", SND_SOC_NOPM, 0, 0,994&hdmi_ch0_mux_control),995SND_SOC_DAPM_MUX("HDMI_CH1_MUX", SND_SOC_NOPM, 0, 0,996&hdmi_ch1_mux_control),997SND_SOC_DAPM_MUX("HDMI_CH2_MUX", SND_SOC_NOPM, 0, 0,998&hdmi_ch2_mux_control),999SND_SOC_DAPM_MUX("HDMI_CH3_MUX", SND_SOC_NOPM, 0, 0,1000&hdmi_ch3_mux_control),1001SND_SOC_DAPM_MUX("HDMI_CH4_MUX", SND_SOC_NOPM, 0, 0,1002&hdmi_ch4_mux_control),1003SND_SOC_DAPM_MUX("HDMI_CH5_MUX", SND_SOC_NOPM, 0, 0,1004&hdmi_ch5_mux_control),1005SND_SOC_DAPM_MUX("HDMI_CH6_MUX", SND_SOC_NOPM, 0, 0,1006&hdmi_ch6_mux_control),1007SND_SOC_DAPM_MUX("HDMI_CH7_MUX", SND_SOC_NOPM, 0, 0,1008&hdmi_ch7_mux_control),10091010SND_SOC_DAPM_INPUT("ETDM_INPUT"),1011SND_SOC_DAPM_OUTPUT("ETDM_OUTPUT"),1012};10131014static const struct snd_soc_dapm_route mtk_dai_etdm_routes[] = {1015{"I012", NULL, "ETDM2 Capture"},1016{"I013", NULL, "ETDM2 Capture"},1017{"I014", NULL, "ETDM2 Capture"},1018{"I015", NULL, "ETDM2 Capture"},1019{"I016", NULL, "ETDM2 Capture"},1020{"I017", NULL, "ETDM2 Capture"},1021{"I018", NULL, "ETDM2 Capture"},1022{"I019", NULL, "ETDM2 Capture"},10231024{"I072", NULL, "ETDM1 Capture"},1025{"I073", NULL, "ETDM1 Capture"},1026{"I074", NULL, "ETDM1 Capture"},1027{"I075", NULL, "ETDM1 Capture"},1028{"I076", NULL, "ETDM1 Capture"},1029{"I077", NULL, "ETDM1 Capture"},1030{"I078", NULL, "ETDM1 Capture"},1031{"I079", NULL, "ETDM1 Capture"},1032{"I080", NULL, "ETDM1 Capture"},1033{"I081", NULL, "ETDM1 Capture"},1034{"I082", NULL, "ETDM1 Capture"},1035{"I083", NULL, "ETDM1 Capture"},1036{"I084", NULL, "ETDM1 Capture"},1037{"I085", NULL, "ETDM1 Capture"},1038{"I086", NULL, "ETDM1 Capture"},1039{"I087", NULL, "ETDM1 Capture"},1040{"I088", NULL, "ETDM1 Capture"},1041{"I089", NULL, "ETDM1 Capture"},1042{"I090", NULL, "ETDM1 Capture"},1043{"I091", NULL, "ETDM1 Capture"},1044{"I092", NULL, "ETDM1 Capture"},1045{"I093", NULL, "ETDM1 Capture"},1046{"I094", NULL, "ETDM1 Capture"},1047{"I095", NULL, "ETDM1 Capture"},10481049{"UL8", NULL, "ETDM1 Capture"},1050{"UL3", NULL, "ETDM2 Capture"},10511052{"ETDM2 Playback", NULL, "O048"},1053{"ETDM2 Playback", NULL, "O049"},1054{"ETDM2 Playback", NULL, "O050"},1055{"ETDM2 Playback", NULL, "O051"},1056{"ETDM2 Playback", NULL, "O052"},1057{"ETDM2 Playback", NULL, "O053"},1058{"ETDM2 Playback", NULL, "O054"},1059{"ETDM2 Playback", NULL, "O055"},1060{"ETDM2 Playback", NULL, "O056"},1061{"ETDM2 Playback", NULL, "O057"},1062{"ETDM2 Playback", NULL, "O058"},1063{"ETDM2 Playback", NULL, "O059"},1064{"ETDM2 Playback", NULL, "O060"},1065{"ETDM2 Playback", NULL, "O061"},1066{"ETDM2 Playback", NULL, "O062"},1067{"ETDM2 Playback", NULL, "O063"},1068{"ETDM2 Playback", NULL, "O064"},1069{"ETDM2 Playback", NULL, "O065"},1070{"ETDM2 Playback", NULL, "O066"},1071{"ETDM2 Playback", NULL, "O067"},1072{"ETDM2 Playback", NULL, "O068"},1073{"ETDM2 Playback", NULL, "O069"},1074{"ETDM2 Playback", NULL, "O070"},1075{"ETDM2 Playback", NULL, "O071"},10761077{"ETDM1 Playback", NULL, "O072"},1078{"ETDM1 Playback", NULL, "O073"},1079{"ETDM1 Playback", NULL, "O074"},1080{"ETDM1 Playback", NULL, "O075"},1081{"ETDM1 Playback", NULL, "O076"},1082{"ETDM1 Playback", NULL, "O077"},1083{"ETDM1 Playback", NULL, "O078"},1084{"ETDM1 Playback", NULL, "O079"},1085{"ETDM1 Playback", NULL, "O080"},1086{"ETDM1 Playback", NULL, "O081"},1087{"ETDM1 Playback", NULL, "O082"},1088{"ETDM1 Playback", NULL, "O083"},1089{"ETDM1 Playback", NULL, "O084"},1090{"ETDM1 Playback", NULL, "O085"},1091{"ETDM1 Playback", NULL, "O086"},1092{"ETDM1 Playback", NULL, "O087"},1093{"ETDM1 Playback", NULL, "O088"},1094{"ETDM1 Playback", NULL, "O089"},1095{"ETDM1 Playback", NULL, "O090"},1096{"ETDM1 Playback", NULL, "O091"},1097{"ETDM1 Playback", NULL, "O092"},1098{"ETDM1 Playback", NULL, "O093"},1099{"ETDM1 Playback", NULL, "O094"},1100{"ETDM1 Playback", NULL, "O095"},11011102{"O048", "I020 Switch", "I020"},1103{"O049", "I021 Switch", "I021"},11041105{"O048", "I022 Switch", "I022"},1106{"O049", "I023 Switch", "I023"},1107{"O050", "I024 Switch", "I024"},1108{"O051", "I025 Switch", "I025"},1109{"O052", "I026 Switch", "I026"},1110{"O053", "I027 Switch", "I027"},1111{"O054", "I028 Switch", "I028"},1112{"O055", "I029 Switch", "I029"},1113{"O056", "I030 Switch", "I030"},1114{"O057", "I031 Switch", "I031"},1115{"O058", "I032 Switch", "I032"},1116{"O059", "I033 Switch", "I033"},1117{"O060", "I034 Switch", "I034"},1118{"O061", "I035 Switch", "I035"},1119{"O062", "I036 Switch", "I036"},1120{"O063", "I037 Switch", "I037"},1121{"O064", "I038 Switch", "I038"},1122{"O065", "I039 Switch", "I039"},1123{"O066", "I040 Switch", "I040"},1124{"O067", "I041 Switch", "I041"},1125{"O068", "I042 Switch", "I042"},1126{"O069", "I043 Switch", "I043"},1127{"O070", "I044 Switch", "I044"},1128{"O071", "I045 Switch", "I045"},11291130{"O048", "I046 Switch", "I046"},1131{"O049", "I047 Switch", "I047"},1132{"O050", "I048 Switch", "I048"},1133{"O051", "I049 Switch", "I049"},1134{"O052", "I050 Switch", "I050"},1135{"O053", "I051 Switch", "I051"},1136{"O054", "I052 Switch", "I052"},1137{"O055", "I053 Switch", "I053"},1138{"O056", "I054 Switch", "I054"},1139{"O057", "I055 Switch", "I055"},1140{"O058", "I056 Switch", "I056"},1141{"O059", "I057 Switch", "I057"},1142{"O060", "I058 Switch", "I058"},1143{"O061", "I059 Switch", "I059"},1144{"O062", "I060 Switch", "I060"},1145{"O063", "I061 Switch", "I061"},1146{"O064", "I062 Switch", "I062"},1147{"O065", "I063 Switch", "I063"},1148{"O066", "I064 Switch", "I064"},1149{"O067", "I065 Switch", "I065"},1150{"O068", "I066 Switch", "I066"},1151{"O069", "I067 Switch", "I067"},1152{"O070", "I068 Switch", "I068"},1153{"O071", "I069 Switch", "I069"},11541155{"O048", "I070 Switch", "I070"},1156{"O049", "I071 Switch", "I071"},11571158{"O072", "I020 Switch", "I020"},1159{"O073", "I021 Switch", "I021"},11601161{"O072", "I022 Switch", "I022"},1162{"O073", "I023 Switch", "I023"},1163{"O074", "I024 Switch", "I024"},1164{"O075", "I025 Switch", "I025"},1165{"O076", "I026 Switch", "I026"},1166{"O077", "I027 Switch", "I027"},1167{"O078", "I028 Switch", "I028"},1168{"O079", "I029 Switch", "I029"},1169{"O080", "I030 Switch", "I030"},1170{"O081", "I031 Switch", "I031"},1171{"O082", "I032 Switch", "I032"},1172{"O083", "I033 Switch", "I033"},1173{"O084", "I034 Switch", "I034"},1174{"O085", "I035 Switch", "I035"},1175{"O086", "I036 Switch", "I036"},1176{"O087", "I037 Switch", "I037"},1177{"O088", "I038 Switch", "I038"},1178{"O089", "I039 Switch", "I039"},1179{"O090", "I040 Switch", "I040"},1180{"O091", "I041 Switch", "I041"},1181{"O092", "I042 Switch", "I042"},1182{"O093", "I043 Switch", "I043"},1183{"O094", "I044 Switch", "I044"},1184{"O095", "I045 Switch", "I045"},11851186{"O072", "I046 Switch", "I046"},1187{"O073", "I047 Switch", "I047"},1188{"O074", "I048 Switch", "I048"},1189{"O075", "I049 Switch", "I049"},1190{"O076", "I050 Switch", "I050"},1191{"O077", "I051 Switch", "I051"},1192{"O078", "I052 Switch", "I052"},1193{"O079", "I053 Switch", "I053"},1194{"O080", "I054 Switch", "I054"},1195{"O081", "I055 Switch", "I055"},1196{"O082", "I056 Switch", "I056"},1197{"O083", "I057 Switch", "I057"},1198{"O084", "I058 Switch", "I058"},1199{"O085", "I059 Switch", "I059"},1200{"O086", "I060 Switch", "I060"},1201{"O087", "I061 Switch", "I061"},1202{"O088", "I062 Switch", "I062"},1203{"O089", "I063 Switch", "I063"},1204{"O090", "I064 Switch", "I064"},1205{"O091", "I065 Switch", "I065"},1206{"O092", "I066 Switch", "I066"},1207{"O093", "I067 Switch", "I067"},1208{"O094", "I068 Switch", "I068"},1209{"O095", "I069 Switch", "I069"},12101211{"O072", "I070 Switch", "I070"},1212{"O073", "I071 Switch", "I071"},12131214{"HDMI_CH0_MUX", "CH0", "DL10"},1215{"HDMI_CH0_MUX", "CH1", "DL10"},1216{"HDMI_CH0_MUX", "CH2", "DL10"},1217{"HDMI_CH0_MUX", "CH3", "DL10"},1218{"HDMI_CH0_MUX", "CH4", "DL10"},1219{"HDMI_CH0_MUX", "CH5", "DL10"},1220{"HDMI_CH0_MUX", "CH6", "DL10"},1221{"HDMI_CH0_MUX", "CH7", "DL10"},12221223{"HDMI_CH1_MUX", "CH0", "DL10"},1224{"HDMI_CH1_MUX", "CH1", "DL10"},1225{"HDMI_CH1_MUX", "CH2", "DL10"},1226{"HDMI_CH1_MUX", "CH3", "DL10"},1227{"HDMI_CH1_MUX", "CH4", "DL10"},1228{"HDMI_CH1_MUX", "CH5", "DL10"},1229{"HDMI_CH1_MUX", "CH6", "DL10"},1230{"HDMI_CH1_MUX", "CH7", "DL10"},12311232{"HDMI_CH2_MUX", "CH0", "DL10"},1233{"HDMI_CH2_MUX", "CH1", "DL10"},1234{"HDMI_CH2_MUX", "CH2", "DL10"},1235{"HDMI_CH2_MUX", "CH3", "DL10"},1236{"HDMI_CH2_MUX", "CH4", "DL10"},1237{"HDMI_CH2_MUX", "CH5", "DL10"},1238{"HDMI_CH2_MUX", "CH6", "DL10"},1239{"HDMI_CH2_MUX", "CH7", "DL10"},12401241{"HDMI_CH3_MUX", "CH0", "DL10"},1242{"HDMI_CH3_MUX", "CH1", "DL10"},1243{"HDMI_CH3_MUX", "CH2", "DL10"},1244{"HDMI_CH3_MUX", "CH3", "DL10"},1245{"HDMI_CH3_MUX", "CH4", "DL10"},1246{"HDMI_CH3_MUX", "CH5", "DL10"},1247{"HDMI_CH3_MUX", "CH6", "DL10"},1248{"HDMI_CH3_MUX", "CH7", "DL10"},12491250{"HDMI_CH4_MUX", "CH0", "DL10"},1251{"HDMI_CH4_MUX", "CH1", "DL10"},1252{"HDMI_CH4_MUX", "CH2", "DL10"},1253{"HDMI_CH4_MUX", "CH3", "DL10"},1254{"HDMI_CH4_MUX", "CH4", "DL10"},1255{"HDMI_CH4_MUX", "CH5", "DL10"},1256{"HDMI_CH4_MUX", "CH6", "DL10"},1257{"HDMI_CH4_MUX", "CH7", "DL10"},12581259{"HDMI_CH5_MUX", "CH0", "DL10"},1260{"HDMI_CH5_MUX", "CH1", "DL10"},1261{"HDMI_CH5_MUX", "CH2", "DL10"},1262{"HDMI_CH5_MUX", "CH3", "DL10"},1263{"HDMI_CH5_MUX", "CH4", "DL10"},1264{"HDMI_CH5_MUX", "CH5", "DL10"},1265{"HDMI_CH5_MUX", "CH6", "DL10"},1266{"HDMI_CH5_MUX", "CH7", "DL10"},12671268{"HDMI_CH6_MUX", "CH0", "DL10"},1269{"HDMI_CH6_MUX", "CH1", "DL10"},1270{"HDMI_CH6_MUX", "CH2", "DL10"},1271{"HDMI_CH6_MUX", "CH3", "DL10"},1272{"HDMI_CH6_MUX", "CH4", "DL10"},1273{"HDMI_CH6_MUX", "CH5", "DL10"},1274{"HDMI_CH6_MUX", "CH6", "DL10"},1275{"HDMI_CH6_MUX", "CH7", "DL10"},12761277{"HDMI_CH7_MUX", "CH0", "DL10"},1278{"HDMI_CH7_MUX", "CH1", "DL10"},1279{"HDMI_CH7_MUX", "CH2", "DL10"},1280{"HDMI_CH7_MUX", "CH3", "DL10"},1281{"HDMI_CH7_MUX", "CH4", "DL10"},1282{"HDMI_CH7_MUX", "CH5", "DL10"},1283{"HDMI_CH7_MUX", "CH6", "DL10"},1284{"HDMI_CH7_MUX", "CH7", "DL10"},12851286{"HDMI_OUT_MUX", "Connect", "HDMI_CH0_MUX"},1287{"HDMI_OUT_MUX", "Connect", "HDMI_CH1_MUX"},1288{"HDMI_OUT_MUX", "Connect", "HDMI_CH2_MUX"},1289{"HDMI_OUT_MUX", "Connect", "HDMI_CH3_MUX"},1290{"HDMI_OUT_MUX", "Connect", "HDMI_CH4_MUX"},1291{"HDMI_OUT_MUX", "Connect", "HDMI_CH5_MUX"},1292{"HDMI_OUT_MUX", "Connect", "HDMI_CH6_MUX"},1293{"HDMI_OUT_MUX", "Connect", "HDMI_CH7_MUX"},12941295{"DPTX_OUT_MUX", "Connect", "HDMI_CH0_MUX"},1296{"DPTX_OUT_MUX", "Connect", "HDMI_CH1_MUX"},1297{"DPTX_OUT_MUX", "Connect", "HDMI_CH2_MUX"},1298{"DPTX_OUT_MUX", "Connect", "HDMI_CH3_MUX"},1299{"DPTX_OUT_MUX", "Connect", "HDMI_CH4_MUX"},1300{"DPTX_OUT_MUX", "Connect", "HDMI_CH5_MUX"},1301{"DPTX_OUT_MUX", "Connect", "HDMI_CH6_MUX"},1302{"DPTX_OUT_MUX", "Connect", "HDMI_CH7_MUX"},13031304{"ETDM3 Playback", NULL, "HDMI_OUT_MUX"},1305{"DPTX Playback", NULL, "DPTX_OUT_MUX"},13061307{"ETDM_OUTPUT", NULL, "DPTX Playback"},1308{"ETDM_OUTPUT", NULL, "ETDM1 Playback"},1309{"ETDM_OUTPUT", NULL, "ETDM2 Playback"},1310{"ETDM_OUTPUT", NULL, "ETDM3 Playback"},1311{"ETDM1 Capture", NULL, "ETDM_INPUT"},1312{"ETDM2 Capture", NULL, "ETDM_INPUT"},1313};13141315static int mt8195_afe_enable_etdm(struct mtk_base_afe *afe, int dai_id)1316{1317int ret = 0;1318struct etdm_con_reg etdm_reg;1319struct mt8195_afe_private *afe_priv = afe->platform_priv;1320struct mtk_dai_etdm_priv *etdm_data;1321unsigned long flags;13221323if (!mt8195_afe_etdm_is_valid(dai_id))1324return -EINVAL;13251326etdm_data = afe_priv->dai_priv[dai_id];1327spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags);1328etdm_data->en_ref_cnt++;1329if (etdm_data->en_ref_cnt == 1) {1330ret = get_etdm_reg(dai_id, &etdm_reg);1331if (ret < 0)1332goto out;13331334regmap_update_bits(afe->regmap, etdm_reg.con0,1335ETDM_CON0_EN, ETDM_CON0_EN);1336}1337out:1338spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags);1339return ret;1340}13411342static int mt8195_afe_disable_etdm(struct mtk_base_afe *afe, int dai_id)1343{1344int ret = 0;1345struct etdm_con_reg etdm_reg;1346struct mt8195_afe_private *afe_priv = afe->platform_priv;1347struct mtk_dai_etdm_priv *etdm_data;1348unsigned long flags;13491350if (!mt8195_afe_etdm_is_valid(dai_id))1351return -EINVAL;13521353etdm_data = afe_priv->dai_priv[dai_id];1354spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags);1355if (etdm_data->en_ref_cnt > 0) {1356etdm_data->en_ref_cnt--;1357if (etdm_data->en_ref_cnt == 0) {1358ret = get_etdm_reg(dai_id, &etdm_reg);1359if (ret < 0)1360goto out;13611362regmap_update_bits(afe->regmap, etdm_reg.con0,1363ETDM_CON0_EN, 0);1364}1365}1366out:1367spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags);1368return ret;1369}13701371static int etdm_cowork_slv_sel(int id, int slave_mode)1372{1373if (slave_mode) {1374switch (id) {1375case MT8195_AFE_IO_ETDM1_IN:1376return COWORK_ETDM_IN1_S;1377case MT8195_AFE_IO_ETDM2_IN:1378return COWORK_ETDM_IN2_S;1379case MT8195_AFE_IO_ETDM1_OUT:1380return COWORK_ETDM_OUT1_S;1381case MT8195_AFE_IO_ETDM2_OUT:1382return COWORK_ETDM_OUT2_S;1383case MT8195_AFE_IO_ETDM3_OUT:1384return COWORK_ETDM_OUT3_S;1385default:1386return -EINVAL;1387}1388} else {1389switch (id) {1390case MT8195_AFE_IO_ETDM1_IN:1391return COWORK_ETDM_IN1_M;1392case MT8195_AFE_IO_ETDM2_IN:1393return COWORK_ETDM_IN2_M;1394case MT8195_AFE_IO_ETDM1_OUT:1395return COWORK_ETDM_OUT1_M;1396case MT8195_AFE_IO_ETDM2_OUT:1397return COWORK_ETDM_OUT2_M;1398case MT8195_AFE_IO_ETDM3_OUT:1399return COWORK_ETDM_OUT3_M;1400default:1401return -EINVAL;1402}1403}1404}14051406static int mt8195_etdm_sync_mode_configure(struct mtk_base_afe *afe, int dai_id)1407{1408struct mt8195_afe_private *afe_priv = afe->platform_priv;1409struct mtk_dai_etdm_priv *etdm_data;1410unsigned int reg = 0;1411unsigned int mask;1412unsigned int val;1413int cowork_source_sel;14141415if (!mt8195_afe_etdm_is_valid(dai_id))1416return -EINVAL;14171418etdm_data = afe_priv->dai_priv[dai_id];1419if (etdm_data->cowork_source_id == COWORK_ETDM_NONE)1420return 0;14211422cowork_source_sel = etdm_cowork_slv_sel(etdm_data->cowork_source_id,1423etdm_data->slave_mode);1424if (cowork_source_sel < 0)1425return cowork_source_sel;14261427switch (dai_id) {1428case MT8195_AFE_IO_ETDM1_IN:1429reg = ETDM_COWORK_CON1;1430mask = ETDM_IN1_SLAVE_SEL_MASK;1431val = ETDM_IN1_SLAVE_SEL(cowork_source_sel);1432break;1433case MT8195_AFE_IO_ETDM2_IN:1434reg = ETDM_COWORK_CON2;1435mask = ETDM_IN2_SLAVE_SEL_MASK;1436val = ETDM_IN2_SLAVE_SEL(cowork_source_sel);1437break;1438case MT8195_AFE_IO_ETDM1_OUT:1439reg = ETDM_COWORK_CON0;1440mask = ETDM_OUT1_SLAVE_SEL_MASK;1441val = ETDM_OUT1_SLAVE_SEL(cowork_source_sel);1442break;1443case MT8195_AFE_IO_ETDM2_OUT:1444reg = ETDM_COWORK_CON2;1445mask = ETDM_OUT2_SLAVE_SEL_MASK;1446val = ETDM_OUT2_SLAVE_SEL(cowork_source_sel);1447break;1448case MT8195_AFE_IO_ETDM3_OUT:1449reg = ETDM_COWORK_CON2;1450mask = ETDM_OUT3_SLAVE_SEL_MASK;1451val = ETDM_OUT3_SLAVE_SEL(cowork_source_sel);1452break;1453default:1454return 0;1455}14561457regmap_update_bits(afe->regmap, reg, mask, val);14581459return 0;1460}14611462static int mtk_dai_etdm_get_cg_id_by_dai_id(int dai_id)1463{1464int cg_id = -1;14651466switch (dai_id) {1467case MT8195_AFE_IO_DPTX:1468cg_id = MT8195_CLK_AUD_HDMI_OUT;1469break;1470case MT8195_AFE_IO_ETDM1_IN:1471cg_id = MT8195_CLK_AUD_TDM_IN;1472break;1473case MT8195_AFE_IO_ETDM2_IN:1474cg_id = MT8195_CLK_AUD_I2SIN;1475break;1476case MT8195_AFE_IO_ETDM1_OUT:1477cg_id = MT8195_CLK_AUD_TDM_OUT;1478break;1479case MT8195_AFE_IO_ETDM2_OUT:1480cg_id = MT8195_CLK_AUD_I2S_OUT;1481break;1482case MT8195_AFE_IO_ETDM3_OUT:1483cg_id = MT8195_CLK_AUD_HDMI_OUT;1484break;1485default:1486break;1487}14881489return cg_id;1490}14911492static int mtk_dai_etdm_get_clk_id_by_dai_id(int dai_id)1493{1494int clk_id = -1;14951496switch (dai_id) {1497case MT8195_AFE_IO_DPTX:1498clk_id = MT8195_CLK_TOP_DPTX_M_SEL;1499break;1500case MT8195_AFE_IO_ETDM1_IN:1501clk_id = MT8195_CLK_TOP_I2SI1_M_SEL;1502break;1503case MT8195_AFE_IO_ETDM2_IN:1504clk_id = MT8195_CLK_TOP_I2SI2_M_SEL;1505break;1506case MT8195_AFE_IO_ETDM1_OUT:1507clk_id = MT8195_CLK_TOP_I2SO1_M_SEL;1508break;1509case MT8195_AFE_IO_ETDM2_OUT:1510clk_id = MT8195_CLK_TOP_I2SO2_M_SEL;1511break;1512case MT8195_AFE_IO_ETDM3_OUT:1513default:1514break;1515}15161517return clk_id;1518}15191520static int mtk_dai_etdm_get_clkdiv_id_by_dai_id(int dai_id)1521{1522int clk_id = -1;15231524switch (dai_id) {1525case MT8195_AFE_IO_DPTX:1526clk_id = MT8195_CLK_TOP_APLL12_DIV9;1527break;1528case MT8195_AFE_IO_ETDM1_IN:1529clk_id = MT8195_CLK_TOP_APLL12_DIV0;1530break;1531case MT8195_AFE_IO_ETDM2_IN:1532clk_id = MT8195_CLK_TOP_APLL12_DIV1;1533break;1534case MT8195_AFE_IO_ETDM1_OUT:1535clk_id = MT8195_CLK_TOP_APLL12_DIV2;1536break;1537case MT8195_AFE_IO_ETDM2_OUT:1538clk_id = MT8195_CLK_TOP_APLL12_DIV3;1539break;1540case MT8195_AFE_IO_ETDM3_OUT:1541default:1542break;1543}15441545return clk_id;1546}15471548static int mtk_dai_etdm_enable_mclk(struct mtk_base_afe *afe, int dai_id)1549{1550struct mt8195_afe_private *afe_priv = afe->platform_priv;1551int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id);15521553if (clkdiv_id < 0)1554return -EINVAL;15551556mt8195_afe_enable_clk(afe, afe_priv->clk[clkdiv_id]);15571558return 0;1559}15601561static int mtk_dai_etdm_disable_mclk(struct mtk_base_afe *afe, int dai_id)1562{1563struct mt8195_afe_private *afe_priv = afe->platform_priv;1564int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id);15651566if (clkdiv_id < 0)1567return -EINVAL;15681569mt8195_afe_disable_clk(afe, afe_priv->clk[clkdiv_id]);15701571return 0;1572}15731574/* dai ops */1575static int mtk_dai_etdm_startup(struct snd_pcm_substream *substream,1576struct snd_soc_dai *dai)1577{1578struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);1579struct mt8195_afe_private *afe_priv = afe->platform_priv;1580struct mtk_dai_etdm_priv *mst_etdm_data;1581int cg_id;1582int mst_dai_id;1583int slv_dai_id;1584int i;15851586if (is_cowork_mode(dai)) {1587mst_dai_id = get_etdm_cowork_master_id(dai);1588if (!mt8195_afe_etdm_is_valid(mst_dai_id))1589return -EINVAL;15901591mtk_dai_etdm_enable_mclk(afe, mst_dai_id);1592cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(mst_dai_id);1593if (cg_id >= 0)1594mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]);15951596mst_etdm_data = afe_priv->dai_priv[mst_dai_id];15971598for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {1599slv_dai_id = mst_etdm_data->cowork_slv_id[i];1600cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(slv_dai_id);1601if (cg_id >= 0)1602mt8195_afe_enable_clk(afe,1603afe_priv->clk[cg_id]);1604}1605} else {1606mtk_dai_etdm_enable_mclk(afe, dai->id);16071608cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id);1609if (cg_id >= 0)1610mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]);1611}16121613return 0;1614}16151616static void mtk_dai_etdm_shutdown(struct snd_pcm_substream *substream,1617struct snd_soc_dai *dai)1618{1619struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);1620struct mt8195_afe_private *afe_priv = afe->platform_priv;1621struct mtk_dai_etdm_priv *mst_etdm_data;1622int cg_id;1623int mst_dai_id;1624int slv_dai_id;1625int i;16261627if (is_cowork_mode(dai)) {1628mst_dai_id = get_etdm_cowork_master_id(dai);1629if (!mt8195_afe_etdm_is_valid(mst_dai_id))1630return;16311632cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(mst_dai_id);1633if (cg_id >= 0)1634mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]);16351636mst_etdm_data = afe_priv->dai_priv[mst_dai_id];1637for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {1638slv_dai_id = mst_etdm_data->cowork_slv_id[i];1639cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(slv_dai_id);1640if (cg_id >= 0)1641mt8195_afe_disable_clk(afe,1642afe_priv->clk[cg_id]);1643}1644mtk_dai_etdm_disable_mclk(afe, mst_dai_id);1645} else {1646cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id);1647if (cg_id >= 0)1648mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]);16491650mtk_dai_etdm_disable_mclk(afe, dai->id);1651}1652}16531654static int mtk_dai_etdm_fifo_mode(struct mtk_base_afe *afe,1655int dai_id, unsigned int rate)1656{1657unsigned int mode = 0;1658unsigned int reg = 0;1659unsigned int val = 0;1660unsigned int mask = (ETDM_IN_AFIFO_MODE_MASK | ETDM_IN_USE_AFIFO);16611662if (rate != 0)1663mode = mt8195_afe_fs_timing(rate);16641665switch (dai_id) {1666case MT8195_AFE_IO_ETDM1_IN:1667reg = ETDM_IN1_AFIFO_CON;1668if (rate == 0)1669mode = MT8195_ETDM_IN1_1X_EN;1670break;1671case MT8195_AFE_IO_ETDM2_IN:1672reg = ETDM_IN2_AFIFO_CON;1673if (rate == 0)1674mode = MT8195_ETDM_IN2_1X_EN;1675break;1676default:1677return -EINVAL;1678}16791680val = (mode | ETDM_IN_USE_AFIFO);16811682regmap_update_bits(afe->regmap, reg, mask, val);1683return 0;1684}16851686static int mtk_dai_etdm_in_configure(struct mtk_base_afe *afe,1687unsigned int rate,1688unsigned int channels,1689int dai_id)1690{1691struct mt8195_afe_private *afe_priv = afe->platform_priv;1692struct mtk_dai_etdm_priv *etdm_data;1693struct etdm_con_reg etdm_reg;1694bool slave_mode;1695unsigned int data_mode;1696unsigned int lrck_width;1697unsigned int val = 0;1698unsigned int mask = 0;1699int i;1700int ret;17011702if (!mt8195_afe_etdm_is_valid(dai_id))1703return -EINVAL;17041705etdm_data = afe_priv->dai_priv[dai_id];1706slave_mode = etdm_data->slave_mode;1707data_mode = etdm_data->data_mode;1708lrck_width = etdm_data->lrck_width;17091710dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n",1711__func__, rate, channels, dai_id);17121713ret = get_etdm_reg(dai_id, &etdm_reg);1714if (ret < 0)1715return ret;17161717if (etdm_data->cowork_source_id != COWORK_ETDM_NONE)1718slave_mode = true;17191720/* afifo */1721if (slave_mode)1722mtk_dai_etdm_fifo_mode(afe, dai_id, 0);1723else1724mtk_dai_etdm_fifo_mode(afe, dai_id, rate);17251726/* con1 */1727if (lrck_width > 0) {1728mask |= (ETDM_IN_CON1_LRCK_AUTO_MODE |1729ETDM_IN_CON1_LRCK_WIDTH_MASK);1730val |= ETDM_IN_CON1_LRCK_WIDTH(lrck_width);1731}1732regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);17331734mask = 0;1735val = 0;17361737/* con2 */1738if (!slave_mode) {1739mask |= ETDM_IN_CON2_UPDATE_GAP_MASK;1740if (rate == 352800 || rate == 384000)1741val |= ETDM_IN_CON2_UPDATE_GAP(4);1742else1743val |= ETDM_IN_CON2_UPDATE_GAP(3);1744}1745mask |= (ETDM_IN_CON2_MULTI_IP_2CH_MODE |1746ETDM_IN_CON2_MULTI_IP_TOTAL_CH_MASK);1747if (data_mode == MTK_DAI_ETDM_DATA_MULTI_PIN) {1748val |= ETDM_IN_CON2_MULTI_IP_2CH_MODE |1749ETDM_IN_CON2_MULTI_IP_TOTAL_CH(channels);1750}1751regmap_update_bits(afe->regmap, etdm_reg.con2, mask, val);17521753mask = 0;1754val = 0;17551756/* con3 */1757mask |= ETDM_IN_CON3_DISABLE_OUT_MASK;1758for (i = 0; i < channels; i += 2) {1759if (etdm_data->in_disable_ch[i] &&1760etdm_data->in_disable_ch[i + 1])1761val |= ETDM_IN_CON3_DISABLE_OUT(i >> 1);1762}1763if (!slave_mode) {1764mask |= ETDM_IN_CON3_FS_MASK;1765val |= ETDM_IN_CON3_FS(get_etdm_fs_timing(rate));1766}1767regmap_update_bits(afe->regmap, etdm_reg.con3, mask, val);17681769mask = 0;1770val = 0;17711772/* con4 */1773mask |= (ETDM_IN_CON4_MASTER_LRCK_INV | ETDM_IN_CON4_MASTER_BCK_INV |1774ETDM_IN_CON4_SLAVE_LRCK_INV | ETDM_IN_CON4_SLAVE_BCK_INV);1775if (slave_mode) {1776if (etdm_data->lrck_inv)1777val |= ETDM_IN_CON4_SLAVE_LRCK_INV;1778if (etdm_data->bck_inv)1779val |= ETDM_IN_CON4_SLAVE_BCK_INV;1780} else {1781if (etdm_data->lrck_inv)1782val |= ETDM_IN_CON4_MASTER_LRCK_INV;1783if (etdm_data->bck_inv)1784val |= ETDM_IN_CON4_MASTER_BCK_INV;1785}1786regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val);17871788mask = 0;1789val = 0;17901791/* con5 */1792mask |= ETDM_IN_CON5_LR_SWAP_MASK;1793mask |= ETDM_IN_CON5_ENABLE_ODD_MASK;1794for (i = 0; i < channels; i += 2) {1795if (etdm_data->in_disable_ch[i] &&1796!etdm_data->in_disable_ch[i + 1]) {1797if (i == (channels - 2))1798val |= ETDM_IN_CON5_LR_SWAP(15);1799else1800val |= ETDM_IN_CON5_LR_SWAP(i >> 1);1801val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1);1802} else if (!etdm_data->in_disable_ch[i] &&1803etdm_data->in_disable_ch[i + 1]) {1804val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1);1805}1806}1807regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val);1808return 0;1809}18101811static int mtk_dai_etdm_out_configure(struct mtk_base_afe *afe,1812unsigned int rate,1813unsigned int channels,1814int dai_id)1815{1816struct mt8195_afe_private *afe_priv = afe->platform_priv;1817struct mtk_dai_etdm_priv *etdm_data;1818struct etdm_con_reg etdm_reg;1819bool slave_mode;1820unsigned int lrck_width;1821unsigned int val = 0;1822unsigned int mask = 0;1823int ret;1824int fs = 0;18251826if (!mt8195_afe_etdm_is_valid(dai_id))1827return -EINVAL;18281829etdm_data = afe_priv->dai_priv[dai_id];1830slave_mode = etdm_data->slave_mode;1831lrck_width = etdm_data->lrck_width;18321833dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n",1834__func__, rate, channels, dai_id);18351836ret = get_etdm_reg(dai_id, &etdm_reg);1837if (ret < 0)1838return ret;18391840if (etdm_data->cowork_source_id != COWORK_ETDM_NONE)1841slave_mode = true;18421843/* con0 */1844mask = ETDM_OUT_CON0_RELATCH_DOMAIN_MASK;1845val = ETDM_OUT_CON0_RELATCH_DOMAIN(ETDM_RELATCH_TIMING_A1A2SYS);1846regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val);18471848mask = 0;1849val = 0;18501851/* con1 */1852if (lrck_width > 0) {1853mask |= (ETDM_OUT_CON1_LRCK_AUTO_MODE |1854ETDM_OUT_CON1_LRCK_WIDTH_MASK);1855val |= ETDM_OUT_CON1_LRCK_WIDTH(lrck_width);1856}1857regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);18581859mask = 0;1860val = 0;18611862if (slave_mode) {1863/* con2 */1864mask = (ETDM_OUT_CON2_LRCK_DELAY_BCK_INV |1865ETDM_OUT_CON2_LRCK_DELAY_0P5T_EN);1866val = (ETDM_OUT_CON2_LRCK_DELAY_BCK_INV |1867ETDM_OUT_CON2_LRCK_DELAY_0P5T_EN);1868regmap_update_bits(afe->regmap, etdm_reg.con2,1869mask, val);1870mask = 0;1871val = 0;1872} else {1873/* con4 */1874mask |= ETDM_OUT_CON4_FS_MASK;1875val |= ETDM_OUT_CON4_FS(get_etdm_fs_timing(rate));1876}18771878mask |= ETDM_OUT_CON4_RELATCH_EN_MASK;1879if (dai_id == MT8195_AFE_IO_ETDM1_OUT)1880fs = MT8195_ETDM_OUT1_1X_EN;1881else if (dai_id == MT8195_AFE_IO_ETDM2_OUT)1882fs = MT8195_ETDM_OUT2_1X_EN;18831884val |= ETDM_OUT_CON4_RELATCH_EN(fs);18851886regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val);18871888mask = 0;1889val = 0;18901891/* con5 */1892mask |= (ETDM_OUT_CON5_MASTER_LRCK_INV | ETDM_OUT_CON5_MASTER_BCK_INV |1893ETDM_OUT_CON5_SLAVE_LRCK_INV | ETDM_OUT_CON5_SLAVE_BCK_INV);1894if (slave_mode) {1895if (etdm_data->lrck_inv)1896val |= ETDM_OUT_CON5_SLAVE_LRCK_INV;1897if (etdm_data->bck_inv)1898val |= ETDM_OUT_CON5_SLAVE_BCK_INV;1899} else {1900if (etdm_data->lrck_inv)1901val |= ETDM_OUT_CON5_MASTER_LRCK_INV;1902if (etdm_data->bck_inv)1903val |= ETDM_OUT_CON5_MASTER_BCK_INV;1904}1905regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val);19061907return 0;1908}19091910static int mtk_dai_etdm_mclk_configure(struct mtk_base_afe *afe, int dai_id)1911{1912struct mt8195_afe_private *afe_priv = afe->platform_priv;1913struct mtk_dai_etdm_priv *etdm_data;1914int clk_id = mtk_dai_etdm_get_clk_id_by_dai_id(dai_id);1915int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id);1916int apll;1917int apll_clk_id;1918struct etdm_con_reg etdm_reg;1919unsigned int val = 0;1920unsigned int mask = 0;1921int ret = 0;19221923if (clk_id < 0 || clkdiv_id < 0)1924return 0;19251926if (!mt8195_afe_etdm_is_valid(dai_id))1927return -EINVAL;19281929etdm_data = afe_priv->dai_priv[dai_id];1930ret = get_etdm_reg(dai_id, &etdm_reg);1931if (ret < 0)1932return ret;19331934mask |= ETDM_CON1_MCLK_OUTPUT;1935if (etdm_data->mclk_dir == SND_SOC_CLOCK_OUT)1936val |= ETDM_CON1_MCLK_OUTPUT;1937regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);19381939if (etdm_data->mclk_freq) {1940apll = etdm_data->mclk_apll;1941apll_clk_id = mt8195_afe_get_mclk_source_clk_id(apll);1942if (apll_clk_id < 0)1943return apll_clk_id;19441945/* select apll */1946ret = mt8195_afe_set_clk_parent(afe, afe_priv->clk[clk_id],1947afe_priv->clk[apll_clk_id]);1948if (ret)1949return ret;19501951/* set rate */1952ret = mt8195_afe_set_clk_rate(afe, afe_priv->clk[clkdiv_id],1953etdm_data->mclk_freq);1954} else {1955if (etdm_data->mclk_dir == SND_SOC_CLOCK_OUT)1956dev_dbg(afe->dev, "%s mclk freq = 0\n", __func__);1957}1958return ret;1959}19601961static int mtk_dai_etdm_configure(struct mtk_base_afe *afe,1962unsigned int rate,1963unsigned int channels,1964unsigned int bit_width,1965int dai_id)1966{1967struct mt8195_afe_private *afe_priv = afe->platform_priv;1968struct mtk_dai_etdm_priv *etdm_data;1969struct etdm_con_reg etdm_reg;1970bool slave_mode;1971unsigned int etdm_channels;1972unsigned int val = 0;1973unsigned int mask = 0;1974unsigned int bck;1975unsigned int wlen = get_etdm_wlen(bit_width);1976int ret;19771978if (!mt8195_afe_etdm_is_valid(dai_id))1979return -EINVAL;19801981etdm_data = afe_priv->dai_priv[dai_id];1982slave_mode = etdm_data->slave_mode;1983ret = get_etdm_reg(dai_id, &etdm_reg);1984if (ret < 0)1985return ret;19861987if (etdm_data->cowork_source_id != COWORK_ETDM_NONE)1988slave_mode = true;19891990dev_dbg(afe->dev, "%s fmt %u data %u lrck %d-%u bck %d, clock %u slv %u\n",1991__func__, etdm_data->format, etdm_data->data_mode,1992etdm_data->lrck_inv, etdm_data->lrck_width, etdm_data->bck_inv,1993etdm_data->clock_mode, etdm_data->slave_mode);1994dev_dbg(afe->dev, "%s rate %u channels %u bitwidth %u, id %d\n",1995__func__, rate, channels, bit_width, dai_id);19961997etdm_channels = (etdm_data->data_mode == MTK_DAI_ETDM_DATA_ONE_PIN) ?1998get_etdm_ch_fixup(channels) : 2;19992000bck = rate * etdm_channels * wlen;2001if (bck > MT8195_ETDM_NORMAL_MAX_BCK_RATE) {2002dev_info(afe->dev, "%s bck rate %u not support\n",2003__func__, bck);2004return -EINVAL;2005}20062007/* con0 */2008mask |= ETDM_CON0_BIT_LEN_MASK;2009val |= ETDM_CON0_BIT_LEN(bit_width);2010mask |= ETDM_CON0_WORD_LEN_MASK;2011val |= ETDM_CON0_WORD_LEN(wlen);2012mask |= ETDM_CON0_FORMAT_MASK;2013val |= ETDM_CON0_FORMAT(etdm_data->format);2014mask |= ETDM_CON0_CH_NUM_MASK;2015val |= ETDM_CON0_CH_NUM(etdm_channels);20162017mask |= ETDM_CON0_SLAVE_MODE;2018if (slave_mode) {2019if (dai_id == MT8195_AFE_IO_ETDM1_OUT &&2020etdm_data->cowork_source_id == COWORK_ETDM_NONE) {2021dev_info(afe->dev, "%s id %d only support master mode\n",2022__func__, dai_id);2023return -EINVAL;2024}2025val |= ETDM_CON0_SLAVE_MODE;2026}2027regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val);20282029if (get_etdm_dir(dai_id) == ETDM_IN)2030mtk_dai_etdm_in_configure(afe, rate, channels, dai_id);2031else2032mtk_dai_etdm_out_configure(afe, rate, channels, dai_id);20332034return 0;2035}20362037static int mtk_dai_etdm_hw_params(struct snd_pcm_substream *substream,2038struct snd_pcm_hw_params *params,2039struct snd_soc_dai *dai)2040{2041int ret = 0;2042unsigned int rate = params_rate(params);2043unsigned int bit_width = params_width(params);2044unsigned int channels = params_channels(params);2045struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2046struct mt8195_afe_private *afe_priv = afe->platform_priv;2047struct mtk_dai_etdm_priv *mst_etdm_data;2048int mst_dai_id;2049int slv_dai_id;2050int i;20512052dev_dbg(afe->dev, "%s '%s' period %u-%u\n",2053__func__, snd_pcm_stream_str(substream),2054params_period_size(params), params_periods(params));20552056if (is_cowork_mode(dai)) {2057mst_dai_id = get_etdm_cowork_master_id(dai);2058if (!mt8195_afe_etdm_is_valid(mst_dai_id))2059return -EINVAL;20602061ret = mtk_dai_etdm_mclk_configure(afe, mst_dai_id);2062if (ret)2063return ret;20642065ret = mtk_dai_etdm_configure(afe, rate, channels,2066bit_width, mst_dai_id);2067if (ret)2068return ret;20692070mst_etdm_data = afe_priv->dai_priv[mst_dai_id];2071for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {2072slv_dai_id = mst_etdm_data->cowork_slv_id[i];2073ret = mtk_dai_etdm_configure(afe, rate, channels,2074bit_width, slv_dai_id);2075if (ret)2076return ret;20772078ret = mt8195_etdm_sync_mode_configure(afe, slv_dai_id);2079if (ret)2080return ret;2081}2082} else {2083ret = mtk_dai_etdm_mclk_configure(afe, dai->id);2084if (ret)2085return ret;20862087ret = mtk_dai_etdm_configure(afe, rate, channels,2088bit_width, dai->id);2089}20902091return ret;2092}20932094static int mtk_dai_etdm_trigger(struct snd_pcm_substream *substream, int cmd,2095struct snd_soc_dai *dai)2096{2097int ret = 0;2098struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2099struct mt8195_afe_private *afe_priv = afe->platform_priv;2100struct mtk_dai_etdm_priv *mst_etdm_data;2101int mst_dai_id;2102int slv_dai_id;2103int i;21042105dev_dbg(afe->dev, "%s(), cmd %d, dai id %d\n", __func__, cmd, dai->id);2106switch (cmd) {2107case SNDRV_PCM_TRIGGER_START:2108case SNDRV_PCM_TRIGGER_RESUME:2109if (is_cowork_mode(dai)) {2110mst_dai_id = get_etdm_cowork_master_id(dai);2111if (!mt8195_afe_etdm_is_valid(mst_dai_id))2112return -EINVAL;21132114mst_etdm_data = afe_priv->dai_priv[mst_dai_id];21152116//open master first2117ret |= mt8195_afe_enable_etdm(afe, mst_dai_id);2118for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {2119slv_dai_id = mst_etdm_data->cowork_slv_id[i];2120ret |= mt8195_afe_enable_etdm(afe, slv_dai_id);2121}2122} else {2123ret = mt8195_afe_enable_etdm(afe, dai->id);2124}2125break;2126case SNDRV_PCM_TRIGGER_STOP:2127case SNDRV_PCM_TRIGGER_SUSPEND:2128if (is_cowork_mode(dai)) {2129mst_dai_id = get_etdm_cowork_master_id(dai);2130if (!mt8195_afe_etdm_is_valid(mst_dai_id))2131return -EINVAL;21322133mst_etdm_data = afe_priv->dai_priv[mst_dai_id];21342135for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {2136slv_dai_id = mst_etdm_data->cowork_slv_id[i];2137ret |= mt8195_afe_disable_etdm(afe, slv_dai_id);2138}2139// close master at last2140ret |= mt8195_afe_disable_etdm(afe, mst_dai_id);2141} else {2142ret = mt8195_afe_disable_etdm(afe, dai->id);2143}2144break;2145default:2146break;2147}2148return ret;2149}21502151static int mtk_dai_etdm_cal_mclk(struct mtk_base_afe *afe, int freq, int dai_id)2152{2153struct mt8195_afe_private *afe_priv = afe->platform_priv;2154struct mtk_dai_etdm_priv *etdm_data;2155int apll;2156int apll_rate;21572158if (!mt8195_afe_etdm_is_valid(dai_id))2159return -EINVAL;21602161etdm_data = afe_priv->dai_priv[dai_id];2162if (freq == 0) {2163etdm_data->mclk_freq = freq;2164return 0;2165}21662167apll = mt8195_afe_get_default_mclk_source_by_rate(freq);2168apll_rate = mt8195_afe_get_mclk_source_rate(afe, apll);21692170if (freq > apll_rate) {2171dev_info(afe->dev, "freq %d > apll rate %d\n", freq, apll_rate);2172return -EINVAL;2173}21742175if (apll_rate % freq != 0) {2176dev_info(afe->dev, "APLL%d cannot generate freq Hz\n", apll);2177return -EINVAL;2178}21792180etdm_data->mclk_apll = apll;2181etdm_data->mclk_freq = freq;21822183return 0;2184}21852186static int mtk_dai_etdm_set_sysclk(struct snd_soc_dai *dai,2187int clk_id, unsigned int freq, int dir)2188{2189struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2190struct mt8195_afe_private *afe_priv = afe->platform_priv;2191struct mtk_dai_etdm_priv *etdm_data;2192int dai_id;21932194dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n",2195__func__, dai->id, freq, dir);2196if (is_cowork_mode(dai))2197dai_id = get_etdm_cowork_master_id(dai);2198else2199dai_id = dai->id;22002201if (!mt8195_afe_etdm_is_valid(dai_id))2202return -EINVAL;22032204etdm_data = afe_priv->dai_priv[dai_id];2205etdm_data->mclk_dir = dir;2206return mtk_dai_etdm_cal_mclk(afe, freq, dai_id);2207}22082209static int mtk_dai_etdm_set_tdm_slot(struct snd_soc_dai *dai,2210unsigned int tx_mask, unsigned int rx_mask,2211int slots, int slot_width)2212{2213struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2214struct mt8195_afe_private *afe_priv = afe->platform_priv;2215struct mtk_dai_etdm_priv *etdm_data;22162217if (!mt8195_afe_etdm_is_valid(dai->id))2218return -EINVAL;22192220etdm_data = afe_priv->dai_priv[dai->id];2221dev_dbg(dai->dev, "%s id %d slot_width %d\n",2222__func__, dai->id, slot_width);22232224etdm_data->slots = slots;2225etdm_data->lrck_width = slot_width;2226return 0;2227}22282229static int mtk_dai_etdm_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)2230{2231struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2232struct mt8195_afe_private *afe_priv = afe->platform_priv;2233struct mtk_dai_etdm_priv *etdm_data;22342235if (!mt8195_afe_etdm_is_valid(dai->id))2236return -EINVAL;22372238etdm_data = afe_priv->dai_priv[dai->id];2239switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {2240case SND_SOC_DAIFMT_I2S:2241etdm_data->format = MTK_DAI_ETDM_FORMAT_I2S;2242break;2243case SND_SOC_DAIFMT_LEFT_J:2244etdm_data->format = MTK_DAI_ETDM_FORMAT_LJ;2245break;2246case SND_SOC_DAIFMT_RIGHT_J:2247etdm_data->format = MTK_DAI_ETDM_FORMAT_RJ;2248break;2249case SND_SOC_DAIFMT_DSP_A:2250etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPA;2251break;2252case SND_SOC_DAIFMT_DSP_B:2253etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPB;2254break;2255default:2256return -EINVAL;2257}22582259switch (fmt & SND_SOC_DAIFMT_INV_MASK) {2260case SND_SOC_DAIFMT_NB_NF:2261etdm_data->bck_inv = false;2262etdm_data->lrck_inv = false;2263break;2264case SND_SOC_DAIFMT_NB_IF:2265etdm_data->bck_inv = false;2266etdm_data->lrck_inv = true;2267break;2268case SND_SOC_DAIFMT_IB_NF:2269etdm_data->bck_inv = true;2270etdm_data->lrck_inv = false;2271break;2272case SND_SOC_DAIFMT_IB_IF:2273etdm_data->bck_inv = true;2274etdm_data->lrck_inv = true;2275break;2276default:2277return -EINVAL;2278}22792280switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {2281case SND_SOC_DAIFMT_BC_FC:2282etdm_data->slave_mode = true;2283break;2284case SND_SOC_DAIFMT_BP_FP:2285etdm_data->slave_mode = false;2286break;2287default:2288return -EINVAL;2289}22902291return 0;2292}22932294static int mtk_dai_hdmitx_dptx_startup(struct snd_pcm_substream *substream,2295struct snd_soc_dai *dai)2296{2297struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2298struct mt8195_afe_private *afe_priv = afe->platform_priv;2299int cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id);23002301if (cg_id >= 0)2302mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]);23032304mtk_dai_etdm_enable_mclk(afe, dai->id);23052306return 0;2307}23082309static void mtk_dai_hdmitx_dptx_shutdown(struct snd_pcm_substream *substream,2310struct snd_soc_dai *dai)2311{2312struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2313struct mt8195_afe_private *afe_priv = afe->platform_priv;2314int cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id);23152316mtk_dai_etdm_disable_mclk(afe, dai->id);23172318if (cg_id >= 0)2319mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]);2320}23212322static unsigned int mtk_dai_get_dptx_ch_en(unsigned int channel)2323{2324switch (channel) {2325case 1 ... 2:2326return AFE_DPTX_CON_CH_EN_2CH;2327case 3 ... 4:2328return AFE_DPTX_CON_CH_EN_4CH;2329case 5 ... 6:2330return AFE_DPTX_CON_CH_EN_6CH;2331case 7 ... 8:2332return AFE_DPTX_CON_CH_EN_8CH;2333default:2334return AFE_DPTX_CON_CH_EN_2CH;2335}2336}23372338static unsigned int mtk_dai_get_dptx_ch(unsigned int ch)2339{2340return (ch > 2) ?2341AFE_DPTX_CON_CH_NUM_8CH : AFE_DPTX_CON_CH_NUM_2CH;2342}23432344static unsigned int mtk_dai_get_dptx_wlen(snd_pcm_format_t format)2345{2346return snd_pcm_format_physical_width(format) <= 16 ?2347AFE_DPTX_CON_16BIT : AFE_DPTX_CON_24BIT;2348}23492350static int mtk_dai_hdmitx_dptx_hw_params(struct snd_pcm_substream *substream,2351struct snd_pcm_hw_params *params,2352struct snd_soc_dai *dai)2353{2354struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2355struct mt8195_afe_private *afe_priv = afe->platform_priv;2356struct mtk_dai_etdm_priv *etdm_data;2357unsigned int rate = params_rate(params);2358unsigned int channels = params_channels(params);2359snd_pcm_format_t format = params_format(params);2360int width = snd_pcm_format_physical_width(format);2361int ret = 0;23622363if (!mt8195_afe_hdmitx_dptx_is_valid(dai->id))2364return -EINVAL;23652366etdm_data = afe_priv->dai_priv[dai->id];23672368/* dptx configure */2369if (dai->id == MT8195_AFE_IO_DPTX) {2370regmap_update_bits(afe->regmap, AFE_DPTX_CON,2371AFE_DPTX_CON_CH_EN_MASK,2372mtk_dai_get_dptx_ch_en(channels));2373regmap_update_bits(afe->regmap, AFE_DPTX_CON,2374AFE_DPTX_CON_CH_NUM_MASK,2375mtk_dai_get_dptx_ch(channels));2376regmap_update_bits(afe->regmap, AFE_DPTX_CON,2377AFE_DPTX_CON_16BIT_MASK,2378mtk_dai_get_dptx_wlen(format));23792380if (mtk_dai_get_dptx_ch(channels) == AFE_DPTX_CON_CH_NUM_8CH) {2381etdm_data->data_mode = MTK_DAI_ETDM_DATA_ONE_PIN;2382channels = 8;2383} else {2384channels = 2;2385}2386} else {2387etdm_data->data_mode = MTK_DAI_ETDM_DATA_MULTI_PIN;2388}23892390ret = mtk_dai_etdm_mclk_configure(afe, dai->id);2391if (ret)2392return ret;23932394ret = mtk_dai_etdm_configure(afe, rate, channels, width, dai->id);23952396return ret;2397}23982399static int mtk_dai_hdmitx_dptx_trigger(struct snd_pcm_substream *substream,2400int cmd,2401struct snd_soc_dai *dai)2402{2403struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2404int ret = 0;24052406dev_dbg(afe->dev, "%s(), cmd %d, dai id %d\n", __func__, cmd, dai->id);24072408switch (cmd) {2409case SNDRV_PCM_TRIGGER_START:2410case SNDRV_PCM_TRIGGER_RESUME:2411/* enable dptx interface */2412if (dai->id == MT8195_AFE_IO_DPTX)2413regmap_update_bits(afe->regmap, AFE_DPTX_CON,2414AFE_DPTX_CON_ON_MASK,2415AFE_DPTX_CON_ON);24162417/* enable etdm_out3 */2418ret = mt8195_afe_enable_etdm(afe, dai->id);2419break;2420case SNDRV_PCM_TRIGGER_STOP:2421case SNDRV_PCM_TRIGGER_SUSPEND:2422/* disable etdm_out3 */2423ret = mt8195_afe_disable_etdm(afe, dai->id);24242425/* disable dptx interface */2426if (dai->id == MT8195_AFE_IO_DPTX)2427regmap_update_bits(afe->regmap, AFE_DPTX_CON,2428AFE_DPTX_CON_ON_MASK, 0);2429break;2430default:2431return -EINVAL;2432}24332434return ret;2435}24362437static int mtk_dai_hdmitx_dptx_set_sysclk(struct snd_soc_dai *dai,2438int clk_id,2439unsigned int freq,2440int dir)2441{2442struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2443struct mt8195_afe_private *afe_priv = afe->platform_priv;2444struct mtk_dai_etdm_priv *etdm_data;24452446if (!mt8195_afe_hdmitx_dptx_is_valid(dai->id))2447return -EINVAL;24482449etdm_data = afe_priv->dai_priv[dai->id];24502451dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n",2452__func__, dai->id, freq, dir);24532454etdm_data->mclk_dir = dir;2455return mtk_dai_etdm_cal_mclk(afe, freq, dai->id);2456}24572458/* dai driver */2459#define MTK_ETDM_RATES (SNDRV_PCM_RATE_8000_384000)24602461#define MTK_ETDM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\2462SNDRV_PCM_FMTBIT_S24_LE |\2463SNDRV_PCM_FMTBIT_S32_LE)24642465static int mtk_dai_etdm_probe(struct snd_soc_dai *dai)2466{2467struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2468struct mt8195_afe_private *afe_priv = afe->platform_priv;2469struct mtk_dai_etdm_priv *etdm_data;24702471dev_dbg(dai->dev, "%s id %d\n", __func__, dai->id);24722473if (!mt8195_afe_etdm_is_valid(dai->id))2474return -EINVAL;24752476etdm_data = afe_priv->dai_priv[dai->id];2477if (etdm_data->mclk_freq) {2478dev_dbg(afe->dev, "MCLK always on, rate %d\n",2479etdm_data->mclk_freq);2480pm_runtime_get_sync(afe->dev);2481mtk_dai_etdm_mclk_configure(afe, dai->id);2482mtk_dai_etdm_enable_mclk(afe, dai->id);2483pm_runtime_put_sync(afe->dev);2484}2485return 0;2486}24872488static const struct snd_soc_dai_ops mtk_dai_hdmitx_dptx_ops = {2489.startup = mtk_dai_hdmitx_dptx_startup,2490.shutdown = mtk_dai_hdmitx_dptx_shutdown,2491.hw_params = mtk_dai_hdmitx_dptx_hw_params,2492.trigger = mtk_dai_hdmitx_dptx_trigger,2493.set_sysclk = mtk_dai_hdmitx_dptx_set_sysclk,2494.set_fmt = mtk_dai_etdm_set_fmt,2495};24962497static const struct snd_soc_dai_ops mtk_dai_hdmitx_dptx_ops2 = {2498.probe = mtk_dai_etdm_probe,2499.startup = mtk_dai_hdmitx_dptx_startup,2500.shutdown = mtk_dai_hdmitx_dptx_shutdown,2501.hw_params = mtk_dai_hdmitx_dptx_hw_params,2502.trigger = mtk_dai_hdmitx_dptx_trigger,2503.set_sysclk = mtk_dai_hdmitx_dptx_set_sysclk,2504.set_fmt = mtk_dai_etdm_set_fmt,2505};25062507static const struct snd_soc_dai_ops mtk_dai_etdm_ops = {2508.probe = mtk_dai_etdm_probe,2509.startup = mtk_dai_etdm_startup,2510.shutdown = mtk_dai_etdm_shutdown,2511.hw_params = mtk_dai_etdm_hw_params,2512.trigger = mtk_dai_etdm_trigger,2513.set_sysclk = mtk_dai_etdm_set_sysclk,2514.set_fmt = mtk_dai_etdm_set_fmt,2515.set_tdm_slot = mtk_dai_etdm_set_tdm_slot,2516};25172518static struct snd_soc_dai_driver mtk_dai_etdm_driver[] = {2519{2520.name = "DPTX",2521.id = MT8195_AFE_IO_DPTX,2522.playback = {2523.stream_name = "DPTX Playback",2524.channels_min = 1,2525.channels_max = 8,2526.rates = MTK_ETDM_RATES,2527.formats = MTK_ETDM_FORMATS,2528},2529.ops = &mtk_dai_hdmitx_dptx_ops,2530},2531{2532.name = "ETDM1_IN",2533.id = MT8195_AFE_IO_ETDM1_IN,2534.capture = {2535.stream_name = "ETDM1 Capture",2536.channels_min = 1,2537.channels_max = 24,2538.rates = MTK_ETDM_RATES,2539.formats = MTK_ETDM_FORMATS,2540},2541.ops = &mtk_dai_etdm_ops,2542},2543{2544.name = "ETDM2_IN",2545.id = MT8195_AFE_IO_ETDM2_IN,2546.capture = {2547.stream_name = "ETDM2 Capture",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 = "ETDM1_OUT",2557.id = MT8195_AFE_IO_ETDM1_OUT,2558.playback = {2559.stream_name = "ETDM1 Playback",2560.channels_min = 1,2561.channels_max = 24,2562.rates = MTK_ETDM_RATES,2563.formats = MTK_ETDM_FORMATS,2564},2565.ops = &mtk_dai_etdm_ops,2566},2567{2568.name = "ETDM2_OUT",2569.id = MT8195_AFE_IO_ETDM2_OUT,2570.playback = {2571.stream_name = "ETDM2 Playback",2572.channels_min = 1,2573.channels_max = 24,2574.rates = MTK_ETDM_RATES,2575.formats = MTK_ETDM_FORMATS,2576},2577.ops = &mtk_dai_etdm_ops,2578},2579{2580.name = "ETDM3_OUT",2581.id = MT8195_AFE_IO_ETDM3_OUT,2582.playback = {2583.stream_name = "ETDM3 Playback",2584.channels_min = 1,2585.channels_max = 8,2586.rates = MTK_ETDM_RATES,2587.formats = MTK_ETDM_FORMATS,2588},2589.ops = &mtk_dai_hdmitx_dptx_ops2,2590},2591};25922593static void mt8195_etdm_update_sync_info(struct mtk_base_afe *afe)2594{2595struct mt8195_afe_private *afe_priv = afe->platform_priv;2596struct mtk_dai_etdm_priv *etdm_data;2597struct mtk_dai_etdm_priv *mst_data;2598int i;2599int mst_dai_id;26002601for (i = MT8195_AFE_IO_ETDM_START; i < MT8195_AFE_IO_ETDM_END; i++) {2602etdm_data = afe_priv->dai_priv[i];2603if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) {2604mst_dai_id = etdm_data->cowork_source_id;2605if (!mt8195_afe_etdm_is_valid(mst_dai_id)) {2606dev_err(afe->dev, "%s invalid dai id %d\n",2607__func__, mst_dai_id);2608return;2609}2610mst_data = afe_priv->dai_priv[mst_dai_id];2611if (mst_data->cowork_source_id != COWORK_ETDM_NONE)2612dev_info(afe->dev, "%s [%d] wrong sync source\n"2613, __func__, i);2614mst_data->cowork_slv_id[mst_data->cowork_slv_count] = i;2615mst_data->cowork_slv_count++;2616}2617}2618}26192620static void mt8195_dai_etdm_parse_of(struct mtk_base_afe *afe)2621{2622const struct device_node *of_node = afe->dev->of_node;2623struct mt8195_afe_private *afe_priv = afe->platform_priv;2624struct mtk_dai_etdm_priv *etdm_data;2625int i, j;2626char prop[48];2627u8 disable_chn[MT8195_ETDM_MAX_CHANNELS];2628int max_chn = MT8195_ETDM_MAX_CHANNELS;2629u32 sel;2630int ret;2631int dai_id;2632unsigned int sync_id;2633struct {2634const char *name;2635const unsigned int sync_id;2636} of_afe_etdms[MT8195_AFE_IO_ETDM_NUM] = {2637{"etdm-in1", ETDM_SYNC_FROM_IN1},2638{"etdm-in2", ETDM_SYNC_FROM_IN2},2639{"etdm-out1", ETDM_SYNC_FROM_OUT1},2640{"etdm-out2", ETDM_SYNC_FROM_OUT2},2641{"etdm-out3", ETDM_SYNC_FROM_OUT3},2642};26432644for (i = 0; i < MT8195_AFE_IO_ETDM_NUM; i++) {2645dai_id = ETDM_TO_DAI_ID(i);2646if (!mt8195_afe_etdm_is_valid(dai_id)) {2647dev_err(afe->dev, "%s invalid dai id %d\n",2648__func__, dai_id);2649return;2650}26512652etdm_data = afe_priv->dai_priv[dai_id];26532654ret = snprintf(prop, sizeof(prop),2655"mediatek,%s-mclk-always-on-rate",2656of_afe_etdms[i].name);2657if (ret < 0) {2658dev_info(afe->dev, "%s snprintf err=%d\n",2659__func__, ret);2660return;2661}2662ret = of_property_read_u32(of_node, prop, &sel);2663if (ret == 0) {2664etdm_data->mclk_dir = SND_SOC_CLOCK_OUT;2665if (mtk_dai_etdm_cal_mclk(afe, sel, dai_id))2666dev_info(afe->dev, "%s unsupported mclk %uHz\n",2667__func__, sel);2668}26692670ret = snprintf(prop, sizeof(prop),2671"mediatek,%s-multi-pin-mode",2672of_afe_etdms[i].name);2673if (ret < 0) {2674dev_info(afe->dev, "%s snprintf err=%d\n",2675__func__, ret);2676return;2677}2678etdm_data->data_mode = of_property_read_bool(of_node, prop);26792680ret = snprintf(prop, sizeof(prop),2681"mediatek,%s-cowork-source",2682of_afe_etdms[i].name);2683if (ret < 0) {2684dev_info(afe->dev, "%s snprintf err=%d\n",2685__func__, ret);2686return;2687}2688ret = of_property_read_u32(of_node, prop, &sel);2689if (ret == 0) {2690if (sel >= MT8195_AFE_IO_ETDM_NUM) {2691dev_info(afe->dev, "%s invalid id=%d\n",2692__func__, sel);2693etdm_data->cowork_source_id = COWORK_ETDM_NONE;2694} else {2695sync_id = of_afe_etdms[sel].sync_id;2696etdm_data->cowork_source_id =2697sync_to_dai_id(sync_id);2698}2699} else {2700etdm_data->cowork_source_id = COWORK_ETDM_NONE;2701}2702}27032704/* etdm in only */2705for (i = 0; i < 2; i++) {2706dai_id = ETDM_TO_DAI_ID(i);2707etdm_data = afe_priv->dai_priv[dai_id];27082709ret = snprintf(prop, sizeof(prop),2710"mediatek,%s-chn-disabled",2711of_afe_etdms[i].name);2712if (ret < 0) {2713dev_info(afe->dev, "%s snprintf err=%d\n",2714__func__, ret);2715return;2716}2717ret = of_property_read_variable_u8_array(of_node, prop,2718disable_chn,27191, max_chn);2720if (ret < 0)2721continue;27222723for (j = 0; j < ret; j++) {2724if (disable_chn[j] >= MT8195_ETDM_MAX_CHANNELS)2725dev_info(afe->dev, "%s [%d] invalid chn %u\n",2726__func__, j, disable_chn[j]);2727else2728etdm_data->in_disable_ch[disable_chn[j]] = true;2729}2730}2731mt8195_etdm_update_sync_info(afe);2732}27332734static int init_etdm_priv_data(struct mtk_base_afe *afe)2735{2736struct mt8195_afe_private *afe_priv = afe->platform_priv;2737struct mtk_dai_etdm_priv *etdm_priv;2738int i;27392740for (i = MT8195_AFE_IO_ETDM_START; i < MT8195_AFE_IO_ETDM_END; i++) {2741etdm_priv = devm_kzalloc(afe->dev,2742sizeof(struct mtk_dai_etdm_priv),2743GFP_KERNEL);2744if (!etdm_priv)2745return -ENOMEM;27462747afe_priv->dai_priv[i] = etdm_priv;2748}27492750afe_priv->dai_priv[MT8195_AFE_IO_DPTX] =2751afe_priv->dai_priv[MT8195_AFE_IO_ETDM3_OUT];27522753mt8195_dai_etdm_parse_of(afe);2754return 0;2755}27562757int mt8195_dai_etdm_register(struct mtk_base_afe *afe)2758{2759struct mtk_base_afe_dai *dai;27602761dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);2762if (!dai)2763return -ENOMEM;27642765list_add(&dai->list, &afe->sub_dais);27662767dai->dai_drivers = mtk_dai_etdm_driver;2768dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_etdm_driver);27692770dai->dapm_widgets = mtk_dai_etdm_widgets;2771dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_etdm_widgets);2772dai->dapm_routes = mtk_dai_etdm_routes;2773dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_etdm_routes);2774dai->controls = mtk_dai_etdm_controls;2775dai->num_controls = ARRAY_SIZE(mtk_dai_etdm_controls);27762777return init_etdm_priv_data(afe);2778}277927802781