brintos

brintos / linux-shallow public Read only

0
0
Text · 78.4 KiB · fd4f9f8 Raw
2780 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * MediaTek ALSA SoC Audio DAI eTDM Control4 *5 * Copyright (c) 2021 MediaTek Inc.6 * Author: Bicycle Tsai <bicycle.tsai@mediatek.com>7 *         Trevor Wu <trevor.wu@mediatek.com>8 */9 10#include <linux/delay.h>11#include <linux/pm_runtime.h>12#include <linux/regmap.h>13#include <sound/pcm_params.h>14#include "mt8195-afe-clk.h"15#include "mt8195-afe-common.h"16#include "mt8195-reg.h"17 18#define MT8195_ETDM_MAX_CHANNELS 2419#define MT8195_ETDM_NORMAL_MAX_BCK_RATE 2457600020#define ETDM_TO_DAI_ID(x) ((x) + MT8195_AFE_IO_ETDM_START)21#define ENUM_TO_STR(x)	#x22 23enum {24	MTK_DAI_ETDM_FORMAT_I2S = 0,25	MTK_DAI_ETDM_FORMAT_LJ,26	MTK_DAI_ETDM_FORMAT_RJ,27	MTK_DAI_ETDM_FORMAT_EIAJ,28	MTK_DAI_ETDM_FORMAT_DSPA,29	MTK_DAI_ETDM_FORMAT_DSPB,30};31 32enum {33	MTK_DAI_ETDM_DATA_ONE_PIN = 0,34	MTK_DAI_ETDM_DATA_MULTI_PIN,35};36 37enum {38	ETDM_IN,39	ETDM_OUT,40};41 42enum {43	ETDM_IN_FROM_PAD,44	ETDM_IN_FROM_ETDM_OUT1,45	ETDM_IN_FROM_ETDM_OUT2,46};47 48enum {49	ETDM_IN_SLAVE_FROM_PAD,50	ETDM_IN_SLAVE_FROM_ETDM_OUT1,51	ETDM_IN_SLAVE_FROM_ETDM_OUT2,52};53 54enum {55	ETDM_OUT_SLAVE_FROM_PAD,56	ETDM_OUT_SLAVE_FROM_ETDM_IN1,57	ETDM_OUT_SLAVE_FROM_ETDM_IN2,58};59 60enum {61	COWORK_ETDM_NONE = 0,62	COWORK_ETDM_IN1_M = 2,63	COWORK_ETDM_IN1_S = 3,64	COWORK_ETDM_IN2_M = 4,65	COWORK_ETDM_IN2_S = 5,66	COWORK_ETDM_OUT1_M = 10,67	COWORK_ETDM_OUT1_S = 11,68	COWORK_ETDM_OUT2_M = 12,69	COWORK_ETDM_OUT2_S = 13,70	COWORK_ETDM_OUT3_M = 14,71	COWORK_ETDM_OUT3_S = 15,72};73 74enum {75	ETDM_RELATCH_TIMING_A1A2SYS,76	ETDM_RELATCH_TIMING_A3SYS,77	ETDM_RELATCH_TIMING_A4SYS,78};79 80enum {81	ETDM_SYNC_NONE,82	ETDM_SYNC_FROM_IN1,83	ETDM_SYNC_FROM_IN2,84	ETDM_SYNC_FROM_OUT1,85	ETDM_SYNC_FROM_OUT2,86	ETDM_SYNC_FROM_OUT3,87};88 89struct etdm_con_reg {90	unsigned int con0;91	unsigned int con1;92	unsigned int con2;93	unsigned int con3;94	unsigned int con4;95	unsigned int con5;96};97 98struct mtk_dai_etdm_rate {99	unsigned int rate;100	unsigned int reg_value;101};102 103struct mtk_dai_etdm_priv {104	unsigned int clock_mode;105	unsigned int data_mode;106	bool slave_mode;107	bool lrck_inv;108	bool bck_inv;109	unsigned int format;110	unsigned int slots;111	unsigned int lrck_width;112	unsigned int mclk_freq;113	unsigned int mclk_apll;114	unsigned int mclk_dir;115	int cowork_source_id; //dai id116	unsigned int cowork_slv_count;117	int cowork_slv_id[MT8195_AFE_IO_ETDM_NUM - 1]; //dai_id118	bool in_disable_ch[MT8195_ETDM_MAX_CHANNELS];119	unsigned int en_ref_cnt;120};121 122static const struct mtk_dai_etdm_rate mt8195_etdm_rates[] = {123	{ .rate = 8000, .reg_value = 0, },124	{ .rate = 12000, .reg_value = 1, },125	{ .rate = 16000, .reg_value = 2, },126	{ .rate = 24000, .reg_value = 3, },127	{ .rate = 32000, .reg_value = 4, },128	{ .rate = 48000, .reg_value = 5, },129	{ .rate = 96000, .reg_value = 7, },130	{ .rate = 192000, .reg_value = 9, },131	{ .rate = 384000, .reg_value = 11, },132	{ .rate = 11025, .reg_value = 16, },133	{ .rate = 22050, .reg_value = 17, },134	{ .rate = 44100, .reg_value = 18, },135	{ .rate = 88200, .reg_value = 19, },136	{ .rate = 176400, .reg_value = 20, },137	{ .rate = 352800, .reg_value = 21, },138};139 140static bool mt8195_afe_etdm_is_valid(int id)141{142	switch (id) {143	case MT8195_AFE_IO_ETDM1_IN:144		fallthrough;145	case MT8195_AFE_IO_ETDM2_IN:146		fallthrough;147	case MT8195_AFE_IO_ETDM1_OUT:148		fallthrough;149	case MT8195_AFE_IO_ETDM2_OUT:150		fallthrough;151	case MT8195_AFE_IO_DPTX:152		fallthrough;153	case MT8195_AFE_IO_ETDM3_OUT:154		return true;155	default:156		return false;157	}158}159 160static bool mt8195_afe_hdmitx_dptx_is_valid(int id)161{162	switch (id) {163	case MT8195_AFE_IO_DPTX:164		fallthrough;165	case MT8195_AFE_IO_ETDM3_OUT:166		return true;167	default:168		return false;169	}170}171 172static int get_etdm_fs_timing(unsigned int rate)173{174	int i;175 176	for (i = 0; i < ARRAY_SIZE(mt8195_etdm_rates); i++)177		if (mt8195_etdm_rates[i].rate == rate)178			return mt8195_etdm_rates[i].reg_value;179 180	return -EINVAL;181}182 183static unsigned int get_etdm_ch_fixup(unsigned int channels)184{185	if (channels > 16)186		return 24;187	else if (channels > 8)188		return 16;189	else if (channels > 4)190		return 8;191	else if (channels > 2)192		return 4;193	else194		return 2;195}196 197static int get_etdm_reg(unsigned int dai_id, struct etdm_con_reg *etdm_reg)198{199	switch (dai_id) {200	case MT8195_AFE_IO_ETDM1_IN:201		etdm_reg->con0 = ETDM_IN1_CON0;202		etdm_reg->con1 = ETDM_IN1_CON1;203		etdm_reg->con2 = ETDM_IN1_CON2;204		etdm_reg->con3 = ETDM_IN1_CON3;205		etdm_reg->con4 = ETDM_IN1_CON4;206		etdm_reg->con5 = ETDM_IN1_CON5;207		break;208	case MT8195_AFE_IO_ETDM2_IN:209		etdm_reg->con0 = ETDM_IN2_CON0;210		etdm_reg->con1 = ETDM_IN2_CON1;211		etdm_reg->con2 = ETDM_IN2_CON2;212		etdm_reg->con3 = ETDM_IN2_CON3;213		etdm_reg->con4 = ETDM_IN2_CON4;214		etdm_reg->con5 = ETDM_IN2_CON5;215		break;216	case MT8195_AFE_IO_ETDM1_OUT:217		etdm_reg->con0 = ETDM_OUT1_CON0;218		etdm_reg->con1 = ETDM_OUT1_CON1;219		etdm_reg->con2 = ETDM_OUT1_CON2;220		etdm_reg->con3 = ETDM_OUT1_CON3;221		etdm_reg->con4 = ETDM_OUT1_CON4;222		etdm_reg->con5 = ETDM_OUT1_CON5;223		break;224	case MT8195_AFE_IO_ETDM2_OUT:225		etdm_reg->con0 = ETDM_OUT2_CON0;226		etdm_reg->con1 = ETDM_OUT2_CON1;227		etdm_reg->con2 = ETDM_OUT2_CON2;228		etdm_reg->con3 = ETDM_OUT2_CON3;229		etdm_reg->con4 = ETDM_OUT2_CON4;230		etdm_reg->con5 = ETDM_OUT2_CON5;231		break;232	case MT8195_AFE_IO_ETDM3_OUT:233	case MT8195_AFE_IO_DPTX:234		etdm_reg->con0 = ETDM_OUT3_CON0;235		etdm_reg->con1 = ETDM_OUT3_CON1;236		etdm_reg->con2 = ETDM_OUT3_CON2;237		etdm_reg->con3 = ETDM_OUT3_CON3;238		etdm_reg->con4 = ETDM_OUT3_CON4;239		etdm_reg->con5 = ETDM_OUT3_CON5;240		break;241	default:242		return -EINVAL;243	}244	return 0;245}246 247static int get_etdm_dir(unsigned int dai_id)248{249	switch (dai_id) {250	case MT8195_AFE_IO_ETDM1_IN:251	case MT8195_AFE_IO_ETDM2_IN:252		return ETDM_IN;253	case MT8195_AFE_IO_ETDM1_OUT:254	case MT8195_AFE_IO_ETDM2_OUT:255	case MT8195_AFE_IO_ETDM3_OUT:256		return ETDM_OUT;257	default:258		return -EINVAL;259	}260}261 262static int get_etdm_wlen(unsigned int bitwidth)263{264	return bitwidth <= 16 ? 16 : 32;265}266 267static int is_cowork_mode(struct snd_soc_dai *dai)268{269	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);270	struct mt8195_afe_private *afe_priv = afe->platform_priv;271	struct mtk_dai_etdm_priv *etdm_data;272 273	if (!mt8195_afe_etdm_is_valid(dai->id))274		return -EINVAL;275 276	etdm_data = afe_priv->dai_priv[dai->id];277	return (etdm_data->cowork_slv_count > 0 ||278		etdm_data->cowork_source_id != COWORK_ETDM_NONE);279}280 281static int sync_to_dai_id(int source_sel)282{283	switch (source_sel) {284	case ETDM_SYNC_FROM_IN1:285		return MT8195_AFE_IO_ETDM1_IN;286	case ETDM_SYNC_FROM_IN2:287		return MT8195_AFE_IO_ETDM2_IN;288	case ETDM_SYNC_FROM_OUT1:289		return MT8195_AFE_IO_ETDM1_OUT;290	case ETDM_SYNC_FROM_OUT2:291		return MT8195_AFE_IO_ETDM2_OUT;292	case ETDM_SYNC_FROM_OUT3:293		return MT8195_AFE_IO_ETDM3_OUT;294	default:295		return 0;296	}297}298 299static int get_etdm_cowork_master_id(struct snd_soc_dai *dai)300{301	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);302	struct mt8195_afe_private *afe_priv = afe->platform_priv;303	struct mtk_dai_etdm_priv *etdm_data;304	int dai_id;305 306	if (!mt8195_afe_etdm_is_valid(dai->id))307		return -EINVAL;308 309	etdm_data = afe_priv->dai_priv[dai->id];310	dai_id = etdm_data->cowork_source_id;311 312	if (dai_id == COWORK_ETDM_NONE)313		dai_id = dai->id;314 315	return dai_id;316}317 318static const struct snd_kcontrol_new mtk_dai_etdm_o048_mix[] = {319	SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN48, 20, 1, 0),320	SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN48, 22, 1, 0),321	SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN48_1, 14, 1, 0),322	SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN48_2, 6, 1, 0),323};324 325static const struct snd_kcontrol_new mtk_dai_etdm_o049_mix[] = {326	SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN49, 21, 1, 0),327	SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN49, 23, 1, 0),328	SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN49_1, 15, 1, 0),329	SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN49_2, 7, 1, 0),330};331 332static const struct snd_kcontrol_new mtk_dai_etdm_o050_mix[] = {333	SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN50, 24, 1, 0),334	SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN50_1, 16, 1, 0),335};336 337static const struct snd_kcontrol_new mtk_dai_etdm_o051_mix[] = {338	SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN51, 25, 1, 0),339	SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN51_1, 17, 1, 0),340};341 342static const struct snd_kcontrol_new mtk_dai_etdm_o052_mix[] = {343	SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN52, 26, 1, 0),344	SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN52_1, 18, 1, 0),345};346 347static const struct snd_kcontrol_new mtk_dai_etdm_o053_mix[] = {348	SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN53, 27, 1, 0),349	SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN53_1, 19, 1, 0),350};351 352static const struct snd_kcontrol_new mtk_dai_etdm_o054_mix[] = {353	SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN54, 28, 1, 0),354	SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN54_1, 20, 1, 0),355};356 357static const struct snd_kcontrol_new mtk_dai_etdm_o055_mix[] = {358	SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN55, 29, 1, 0),359	SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN55_1, 21, 1, 0),360};361 362static const struct snd_kcontrol_new mtk_dai_etdm_o056_mix[] = {363	SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN56, 30, 1, 0),364	SOC_DAPM_SINGLE_AUTODISABLE("I054 Switch", AFE_CONN56_1, 22, 1, 0),365};366 367static const struct snd_kcontrol_new mtk_dai_etdm_o057_mix[] = {368	SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN57, 31, 1, 0),369	SOC_DAPM_SINGLE_AUTODISABLE("I055 Switch", AFE_CONN57_1, 23, 1, 0),370};371 372static const struct snd_kcontrol_new mtk_dai_etdm_o058_mix[] = {373	SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN58_1, 0, 1, 0),374	SOC_DAPM_SINGLE_AUTODISABLE("I056 Switch", AFE_CONN58_1, 24, 1, 0),375};376 377static const struct snd_kcontrol_new mtk_dai_etdm_o059_mix[] = {378	SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN59_1, 1, 1, 0),379	SOC_DAPM_SINGLE_AUTODISABLE("I057 Switch", AFE_CONN59_1, 25, 1, 0),380};381 382static const struct snd_kcontrol_new mtk_dai_etdm_o060_mix[] = {383	SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN60_1, 2, 1, 0),384	SOC_DAPM_SINGLE_AUTODISABLE("I058 Switch", AFE_CONN60_1, 26, 1, 0),385};386 387static const struct snd_kcontrol_new mtk_dai_etdm_o061_mix[] = {388	SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN61_1, 3, 1, 0),389	SOC_DAPM_SINGLE_AUTODISABLE("I059 Switch", AFE_CONN61_1, 27, 1, 0),390};391 392static const struct snd_kcontrol_new mtk_dai_etdm_o062_mix[] = {393	SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN62_1, 4, 1, 0),394	SOC_DAPM_SINGLE_AUTODISABLE("I060 Switch", AFE_CONN62_1, 28, 1, 0),395};396 397static const struct snd_kcontrol_new mtk_dai_etdm_o063_mix[] = {398	SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN63_1, 5, 1, 0),399	SOC_DAPM_SINGLE_AUTODISABLE("I061 Switch", AFE_CONN63_1, 29, 1, 0),400};401 402static const struct snd_kcontrol_new mtk_dai_etdm_o064_mix[] = {403	SOC_DAPM_SINGLE_AUTODISABLE("I038 Switch", AFE_CONN64_1, 6, 1, 0),404	SOC_DAPM_SINGLE_AUTODISABLE("I062 Switch", AFE_CONN64_1, 30, 1, 0),405};406 407static const struct snd_kcontrol_new mtk_dai_etdm_o065_mix[] = {408	SOC_DAPM_SINGLE_AUTODISABLE("I039 Switch", AFE_CONN65_1, 7, 1, 0),409	SOC_DAPM_SINGLE_AUTODISABLE("I063 Switch", AFE_CONN65_1, 31, 1, 0),410};411 412static const struct snd_kcontrol_new mtk_dai_etdm_o066_mix[] = {413	SOC_DAPM_SINGLE_AUTODISABLE("I040 Switch", AFE_CONN66_1, 8, 1, 0),414	SOC_DAPM_SINGLE_AUTODISABLE("I064 Switch", AFE_CONN66_2, 0, 1, 0),415};416 417static const struct snd_kcontrol_new mtk_dai_etdm_o067_mix[] = {418	SOC_DAPM_SINGLE_AUTODISABLE("I041 Switch", AFE_CONN67_1, 9, 1, 0),419	SOC_DAPM_SINGLE_AUTODISABLE("I065 Switch", AFE_CONN67_2, 1, 1, 0),420};421 422static const struct snd_kcontrol_new mtk_dai_etdm_o068_mix[] = {423	SOC_DAPM_SINGLE_AUTODISABLE("I042 Switch", AFE_CONN68_1, 10, 1, 0),424	SOC_DAPM_SINGLE_AUTODISABLE("I066 Switch", AFE_CONN68_2, 2, 1, 0),425};426 427static const struct snd_kcontrol_new mtk_dai_etdm_o069_mix[] = {428	SOC_DAPM_SINGLE_AUTODISABLE("I043 Switch", AFE_CONN69_1, 11, 1, 0),429	SOC_DAPM_SINGLE_AUTODISABLE("I067 Switch", AFE_CONN69_2, 3, 1, 0),430};431 432static const struct snd_kcontrol_new mtk_dai_etdm_o070_mix[] = {433	SOC_DAPM_SINGLE_AUTODISABLE("I044 Switch", AFE_CONN70_1, 12, 1, 0),434	SOC_DAPM_SINGLE_AUTODISABLE("I068 Switch", AFE_CONN70_2, 4, 1, 0),435};436 437static const struct snd_kcontrol_new mtk_dai_etdm_o071_mix[] = {438	SOC_DAPM_SINGLE_AUTODISABLE("I045 Switch", AFE_CONN71_1, 13, 1, 0),439	SOC_DAPM_SINGLE_AUTODISABLE("I069 Switch", AFE_CONN71_2, 5, 1, 0),440};441 442static const struct snd_kcontrol_new mtk_dai_etdm_o072_mix[] = {443	SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN72, 20, 1, 0),444	SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN72, 22, 1, 0),445	SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN72_1, 14, 1, 0),446	SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN72_2, 6, 1, 0),447};448 449static const struct snd_kcontrol_new mtk_dai_etdm_o073_mix[] = {450	SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN73, 21, 1, 0),451	SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN73, 23, 1, 0),452	SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN73_1, 15, 1, 0),453	SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN73_2, 7, 1, 0),454};455 456static const struct snd_kcontrol_new mtk_dai_etdm_o074_mix[] = {457	SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN74, 24, 1, 0),458	SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN74_1, 16, 1, 0),459};460 461static const struct snd_kcontrol_new mtk_dai_etdm_o075_mix[] = {462	SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN75, 25, 1, 0),463	SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN75_1, 17, 1, 0),464};465 466static const struct snd_kcontrol_new mtk_dai_etdm_o076_mix[] = {467	SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN76, 26, 1, 0),468	SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN76_1, 18, 1, 0),469};470 471static const struct snd_kcontrol_new mtk_dai_etdm_o077_mix[] = {472	SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN77, 27, 1, 0),473	SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN77_1, 19, 1, 0),474};475 476static const struct snd_kcontrol_new mtk_dai_etdm_o078_mix[] = {477	SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN78, 28, 1, 0),478	SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN78_1, 20, 1, 0),479};480 481static const struct snd_kcontrol_new mtk_dai_etdm_o079_mix[] = {482	SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN79, 29, 1, 0),483	SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN79_1, 21, 1, 0),484};485 486static const struct snd_kcontrol_new mtk_dai_etdm_o080_mix[] = {487	SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN80, 30, 1, 0),488	SOC_DAPM_SINGLE_AUTODISABLE("I054 Switch", AFE_CONN80_1, 22, 1, 0),489};490 491static const struct snd_kcontrol_new mtk_dai_etdm_o081_mix[] = {492	SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN81, 31, 1, 0),493	SOC_DAPM_SINGLE_AUTODISABLE("I055 Switch", AFE_CONN81_1, 23, 1, 0),494};495 496static const struct snd_kcontrol_new mtk_dai_etdm_o082_mix[] = {497	SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN82_1, 0, 1, 0),498	SOC_DAPM_SINGLE_AUTODISABLE("I056 Switch", AFE_CONN82_1, 24, 1, 0),499};500 501static const struct snd_kcontrol_new mtk_dai_etdm_o083_mix[] = {502	SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN83_1, 1, 1, 0),503	SOC_DAPM_SINGLE_AUTODISABLE("I057 Switch", AFE_CONN83_1, 25, 1, 0),504};505 506static const struct snd_kcontrol_new mtk_dai_etdm_o084_mix[] = {507	SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN84_1, 2, 1, 0),508	SOC_DAPM_SINGLE_AUTODISABLE("I058 Switch", AFE_CONN84_1, 26, 1, 0),509};510 511static const struct snd_kcontrol_new mtk_dai_etdm_o085_mix[] = {512	SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN85_1, 3, 1, 0),513	SOC_DAPM_SINGLE_AUTODISABLE("I059 Switch", AFE_CONN85_1, 27, 1, 0),514};515 516static const struct snd_kcontrol_new mtk_dai_etdm_o086_mix[] = {517	SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN86_1, 4, 1, 0),518	SOC_DAPM_SINGLE_AUTODISABLE("I060 Switch", AFE_CONN86_1, 28, 1, 0),519};520 521static const struct snd_kcontrol_new mtk_dai_etdm_o087_mix[] = {522	SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN87_1, 5, 1, 0),523	SOC_DAPM_SINGLE_AUTODISABLE("I061 Switch", AFE_CONN87_1, 29, 1, 0),524};525 526static const struct snd_kcontrol_new mtk_dai_etdm_o088_mix[] = {527	SOC_DAPM_SINGLE_AUTODISABLE("I038 Switch", AFE_CONN88_1, 6, 1, 0),528	SOC_DAPM_SINGLE_AUTODISABLE("I062 Switch", AFE_CONN88_1, 30, 1, 0),529};530 531static const struct snd_kcontrol_new mtk_dai_etdm_o089_mix[] = {532	SOC_DAPM_SINGLE_AUTODISABLE("I039 Switch", AFE_CONN89_1, 7, 1, 0),533	SOC_DAPM_SINGLE_AUTODISABLE("I063 Switch", AFE_CONN89_1, 31, 1, 0),534};535 536static const struct snd_kcontrol_new mtk_dai_etdm_o090_mix[] = {537	SOC_DAPM_SINGLE_AUTODISABLE("I040 Switch", AFE_CONN90_1, 8, 1, 0),538	SOC_DAPM_SINGLE_AUTODISABLE("I064 Switch", AFE_CONN90_2, 0, 1, 0),539};540 541static const struct snd_kcontrol_new mtk_dai_etdm_o091_mix[] = {542	SOC_DAPM_SINGLE_AUTODISABLE("I041 Switch", AFE_CONN91_1, 9, 1, 0),543	SOC_DAPM_SINGLE_AUTODISABLE("I065 Switch", AFE_CONN91_2, 1, 1, 0),544};545 546static const struct snd_kcontrol_new mtk_dai_etdm_o092_mix[] = {547	SOC_DAPM_SINGLE_AUTODISABLE("I042 Switch", AFE_CONN92_1, 10, 1, 0),548	SOC_DAPM_SINGLE_AUTODISABLE("I066 Switch", AFE_CONN92_2, 2, 1, 0),549};550 551static const struct snd_kcontrol_new mtk_dai_etdm_o093_mix[] = {552	SOC_DAPM_SINGLE_AUTODISABLE("I043 Switch", AFE_CONN93_1, 11, 1, 0),553	SOC_DAPM_SINGLE_AUTODISABLE("I067 Switch", AFE_CONN93_2, 3, 1, 0),554};555 556static const struct snd_kcontrol_new mtk_dai_etdm_o094_mix[] = {557	SOC_DAPM_SINGLE_AUTODISABLE("I044 Switch", AFE_CONN94_1, 12, 1, 0),558	SOC_DAPM_SINGLE_AUTODISABLE("I068 Switch", AFE_CONN94_2, 4, 1, 0),559};560 561static const struct snd_kcontrol_new mtk_dai_etdm_o095_mix[] = {562	SOC_DAPM_SINGLE_AUTODISABLE("I045 Switch", AFE_CONN95_1, 13, 1, 0),563	SOC_DAPM_SINGLE_AUTODISABLE("I069 Switch", AFE_CONN95_2, 5, 1, 0),564};565 566static const char * const mt8195_etdm_clk_src_sel_text[] = {567	"26m",568	"a1sys_a2sys",569	"a3sys",570	"a4sys",571};572 573static SOC_ENUM_SINGLE_EXT_DECL(etdmout_clk_src_enum,574	mt8195_etdm_clk_src_sel_text);575 576static const char * const hdmitx_dptx_mux_map[] = {577	"Disconnect", "Connect",578};579 580static int hdmitx_dptx_mux_map_value[] = {581	0, 1,582};583 584/* HDMI_OUT_MUX */585static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(hdmi_out_mux_map_enum,586				SND_SOC_NOPM,587				0,588				1,589				hdmitx_dptx_mux_map,590				hdmitx_dptx_mux_map_value);591 592static const struct snd_kcontrol_new hdmi_out_mux_control =593	SOC_DAPM_ENUM("HDMI_OUT_MUX", hdmi_out_mux_map_enum);594 595/* DPTX_OUT_MUX */596static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(dptx_out_mux_map_enum,597				SND_SOC_NOPM,598				0,599				1,600				hdmitx_dptx_mux_map,601				hdmitx_dptx_mux_map_value);602 603static const struct snd_kcontrol_new dptx_out_mux_control =604	SOC_DAPM_ENUM("DPTX_OUT_MUX", dptx_out_mux_map_enum);605 606/* HDMI_CH0_MUX ~ HDMI_CH7_MUX */607static const char *const afe_conn_hdmi_mux_map[] = {608	"CH0", "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7",609};610 611static int afe_conn_hdmi_mux_map_value[] = {612	0, 1, 2, 3, 4, 5, 6, 7,613};614 615static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch0_mux_map_enum,616				AFE_TDMOUT_CONN0,617				0,618				0xf,619				afe_conn_hdmi_mux_map,620				afe_conn_hdmi_mux_map_value);621 622static const struct snd_kcontrol_new hdmi_ch0_mux_control =623	SOC_DAPM_ENUM("HDMI_CH0_MUX", hdmi_ch0_mux_map_enum);624 625static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch1_mux_map_enum,626				AFE_TDMOUT_CONN0,627				4,628				0xf,629				afe_conn_hdmi_mux_map,630				afe_conn_hdmi_mux_map_value);631 632static const struct snd_kcontrol_new hdmi_ch1_mux_control =633	SOC_DAPM_ENUM("HDMI_CH1_MUX", hdmi_ch1_mux_map_enum);634 635static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch2_mux_map_enum,636				AFE_TDMOUT_CONN0,637				8,638				0xf,639				afe_conn_hdmi_mux_map,640				afe_conn_hdmi_mux_map_value);641 642static const struct snd_kcontrol_new hdmi_ch2_mux_control =643	SOC_DAPM_ENUM("HDMI_CH2_MUX", hdmi_ch2_mux_map_enum);644 645static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch3_mux_map_enum,646				AFE_TDMOUT_CONN0,647				12,648				0xf,649				afe_conn_hdmi_mux_map,650				afe_conn_hdmi_mux_map_value);651 652static const struct snd_kcontrol_new hdmi_ch3_mux_control =653	SOC_DAPM_ENUM("HDMI_CH3_MUX", hdmi_ch3_mux_map_enum);654 655static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch4_mux_map_enum,656				AFE_TDMOUT_CONN0,657				16,658				0xf,659				afe_conn_hdmi_mux_map,660				afe_conn_hdmi_mux_map_value);661 662static const struct snd_kcontrol_new hdmi_ch4_mux_control =663	SOC_DAPM_ENUM("HDMI_CH4_MUX", hdmi_ch4_mux_map_enum);664 665static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch5_mux_map_enum,666				AFE_TDMOUT_CONN0,667				20,668				0xf,669				afe_conn_hdmi_mux_map,670				afe_conn_hdmi_mux_map_value);671 672static const struct snd_kcontrol_new hdmi_ch5_mux_control =673	SOC_DAPM_ENUM("HDMI_CH5_MUX", hdmi_ch5_mux_map_enum);674 675static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch6_mux_map_enum,676				AFE_TDMOUT_CONN0,677				24,678				0xf,679				afe_conn_hdmi_mux_map,680				afe_conn_hdmi_mux_map_value);681 682static const struct snd_kcontrol_new hdmi_ch6_mux_control =683	SOC_DAPM_ENUM("HDMI_CH6_MUX", hdmi_ch6_mux_map_enum);684 685static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch7_mux_map_enum,686				AFE_TDMOUT_CONN0,687				28,688				0xf,689				afe_conn_hdmi_mux_map,690				afe_conn_hdmi_mux_map_value);691 692static const struct snd_kcontrol_new hdmi_ch7_mux_control =693	SOC_DAPM_ENUM("HDMI_CH7_MUX", hdmi_ch7_mux_map_enum);694 695static int mt8195_etdm_clk_src_sel_put(struct snd_kcontrol *kcontrol,696				       struct snd_ctl_elem_value *ucontrol)697{698	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);699	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;700	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);701	unsigned int source = ucontrol->value.enumerated.item[0];702	unsigned int val;703	unsigned int mask;704	unsigned int reg;705 706	if (source >= e->items)707		return -EINVAL;708 709	reg = 0;710	if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) {711		reg = ETDM_OUT1_CON4;712		mask = ETDM_OUT_CON4_CLOCK_MASK;713		val = ETDM_OUT_CON4_CLOCK(source);714	} else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) {715		reg = ETDM_OUT2_CON4;716		mask = ETDM_OUT_CON4_CLOCK_MASK;717		val = ETDM_OUT_CON4_CLOCK(source);718	} else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) {719		reg = ETDM_OUT3_CON4;720		mask = ETDM_OUT_CON4_CLOCK_MASK;721		val = ETDM_OUT_CON4_CLOCK(source);722	} else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) {723		reg = ETDM_IN1_CON2;724		mask = ETDM_IN_CON2_CLOCK_MASK;725		val = ETDM_IN_CON2_CLOCK(source);726	} else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) {727		reg = ETDM_IN2_CON2;728		mask = ETDM_IN_CON2_CLOCK_MASK;729		val = ETDM_IN_CON2_CLOCK(source);730	}731 732	if (reg)733		regmap_update_bits(afe->regmap, reg, mask, val);734 735	return 0;736}737 738static int mt8195_etdm_clk_src_sel_get(struct snd_kcontrol *kcontrol,739				       struct snd_ctl_elem_value *ucontrol)740{741	struct snd_soc_component *component =742		snd_soc_kcontrol_component(kcontrol);743	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);744	unsigned int value = 0;745	unsigned int reg = 0;746	unsigned int mask = 0;747	unsigned int shift = 0;748 749	if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) {750		reg = ETDM_OUT1_CON4;751		mask = ETDM_OUT_CON4_CLOCK_MASK;752		shift = ETDM_OUT_CON4_CLOCK_SHIFT;753	} else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) {754		reg = ETDM_OUT2_CON4;755		mask = ETDM_OUT_CON4_CLOCK_MASK;756		shift = ETDM_OUT_CON4_CLOCK_SHIFT;757	} else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) {758		reg = ETDM_OUT3_CON4;759		mask = ETDM_OUT_CON4_CLOCK_MASK;760		shift = ETDM_OUT_CON4_CLOCK_SHIFT;761	} else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) {762		reg = ETDM_IN1_CON2;763		mask = ETDM_IN_CON2_CLOCK_MASK;764		shift = ETDM_IN_CON2_CLOCK_SHIFT;765	} else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) {766		reg = ETDM_IN2_CON2;767		mask = ETDM_IN_CON2_CLOCK_MASK;768		shift = ETDM_IN_CON2_CLOCK_SHIFT;769	}770 771	if (reg)772		regmap_read(afe->regmap, reg, &value);773 774	value &= mask;775	value >>= shift;776	ucontrol->value.enumerated.item[0] = value;777	return 0;778}779 780static const struct snd_kcontrol_new mtk_dai_etdm_controls[] = {781	SOC_ENUM_EXT("ETDM_OUT1_Clock_Source",782		     etdmout_clk_src_enum,783		     mt8195_etdm_clk_src_sel_get,784		     mt8195_etdm_clk_src_sel_put),785	SOC_ENUM_EXT("ETDM_OUT2_Clock_Source",786		     etdmout_clk_src_enum,787		     mt8195_etdm_clk_src_sel_get,788		     mt8195_etdm_clk_src_sel_put),789	SOC_ENUM_EXT("ETDM_OUT3_Clock_Source",790		     etdmout_clk_src_enum,791		     mt8195_etdm_clk_src_sel_get,792		     mt8195_etdm_clk_src_sel_put),793	SOC_ENUM_EXT("ETDM_IN1_Clock_Source",794		     etdmout_clk_src_enum,795		     mt8195_etdm_clk_src_sel_get,796		     mt8195_etdm_clk_src_sel_put),797	SOC_ENUM_EXT("ETDM_IN2_Clock_Source",798		     etdmout_clk_src_enum,799		     mt8195_etdm_clk_src_sel_get,800		     mt8195_etdm_clk_src_sel_put),801};802 803static const struct snd_soc_dapm_widget mtk_dai_etdm_widgets[] = {804	/* eTDM_IN2 */805	SND_SOC_DAPM_MIXER("I012", SND_SOC_NOPM, 0, 0, NULL, 0),806	SND_SOC_DAPM_MIXER("I013", SND_SOC_NOPM, 0, 0, NULL, 0),807	SND_SOC_DAPM_MIXER("I014", SND_SOC_NOPM, 0, 0, NULL, 0),808	SND_SOC_DAPM_MIXER("I015", SND_SOC_NOPM, 0, 0, NULL, 0),809	SND_SOC_DAPM_MIXER("I016", SND_SOC_NOPM, 0, 0, NULL, 0),810	SND_SOC_DAPM_MIXER("I017", SND_SOC_NOPM, 0, 0, NULL, 0),811	SND_SOC_DAPM_MIXER("I018", SND_SOC_NOPM, 0, 0, NULL, 0),812	SND_SOC_DAPM_MIXER("I019", SND_SOC_NOPM, 0, 0, NULL, 0),813 814	/* eTDM_IN1 */815	SND_SOC_DAPM_MIXER("I072", SND_SOC_NOPM, 0, 0, NULL, 0),816	SND_SOC_DAPM_MIXER("I073", SND_SOC_NOPM, 0, 0, NULL, 0),817	SND_SOC_DAPM_MIXER("I074", SND_SOC_NOPM, 0, 0, NULL, 0),818	SND_SOC_DAPM_MIXER("I075", SND_SOC_NOPM, 0, 0, NULL, 0),819	SND_SOC_DAPM_MIXER("I076", SND_SOC_NOPM, 0, 0, NULL, 0),820	SND_SOC_DAPM_MIXER("I077", SND_SOC_NOPM, 0, 0, NULL, 0),821	SND_SOC_DAPM_MIXER("I078", SND_SOC_NOPM, 0, 0, NULL, 0),822	SND_SOC_DAPM_MIXER("I079", SND_SOC_NOPM, 0, 0, NULL, 0),823	SND_SOC_DAPM_MIXER("I080", SND_SOC_NOPM, 0, 0, NULL, 0),824	SND_SOC_DAPM_MIXER("I081", SND_SOC_NOPM, 0, 0, NULL, 0),825	SND_SOC_DAPM_MIXER("I082", SND_SOC_NOPM, 0, 0, NULL, 0),826	SND_SOC_DAPM_MIXER("I083", SND_SOC_NOPM, 0, 0, NULL, 0),827	SND_SOC_DAPM_MIXER("I084", SND_SOC_NOPM, 0, 0, NULL, 0),828	SND_SOC_DAPM_MIXER("I085", SND_SOC_NOPM, 0, 0, NULL, 0),829	SND_SOC_DAPM_MIXER("I086", SND_SOC_NOPM, 0, 0, NULL, 0),830	SND_SOC_DAPM_MIXER("I087", SND_SOC_NOPM, 0, 0, NULL, 0),831	SND_SOC_DAPM_MIXER("I088", SND_SOC_NOPM, 0, 0, NULL, 0),832	SND_SOC_DAPM_MIXER("I089", SND_SOC_NOPM, 0, 0, NULL, 0),833	SND_SOC_DAPM_MIXER("I090", SND_SOC_NOPM, 0, 0, NULL, 0),834	SND_SOC_DAPM_MIXER("I091", SND_SOC_NOPM, 0, 0, NULL, 0),835	SND_SOC_DAPM_MIXER("I092", SND_SOC_NOPM, 0, 0, NULL, 0),836	SND_SOC_DAPM_MIXER("I093", SND_SOC_NOPM, 0, 0, NULL, 0),837	SND_SOC_DAPM_MIXER("I094", SND_SOC_NOPM, 0, 0, NULL, 0),838	SND_SOC_DAPM_MIXER("I095", SND_SOC_NOPM, 0, 0, NULL, 0),839 840	/* eTDM_OUT2 */841	SND_SOC_DAPM_MIXER("O048", SND_SOC_NOPM, 0, 0,842			   mtk_dai_etdm_o048_mix,843			   ARRAY_SIZE(mtk_dai_etdm_o048_mix)),844	SND_SOC_DAPM_MIXER("O049", SND_SOC_NOPM, 0, 0,845			   mtk_dai_etdm_o049_mix,846			   ARRAY_SIZE(mtk_dai_etdm_o049_mix)),847	SND_SOC_DAPM_MIXER("O050", SND_SOC_NOPM, 0, 0,848			   mtk_dai_etdm_o050_mix,849			   ARRAY_SIZE(mtk_dai_etdm_o050_mix)),850	SND_SOC_DAPM_MIXER("O051", SND_SOC_NOPM, 0, 0,851			   mtk_dai_etdm_o051_mix,852			   ARRAY_SIZE(mtk_dai_etdm_o051_mix)),853	SND_SOC_DAPM_MIXER("O052", SND_SOC_NOPM, 0, 0,854			   mtk_dai_etdm_o052_mix,855			   ARRAY_SIZE(mtk_dai_etdm_o052_mix)),856	SND_SOC_DAPM_MIXER("O053", SND_SOC_NOPM, 0, 0,857			   mtk_dai_etdm_o053_mix,858			   ARRAY_SIZE(mtk_dai_etdm_o053_mix)),859	SND_SOC_DAPM_MIXER("O054", SND_SOC_NOPM, 0, 0,860			   mtk_dai_etdm_o054_mix,861			   ARRAY_SIZE(mtk_dai_etdm_o054_mix)),862	SND_SOC_DAPM_MIXER("O055", SND_SOC_NOPM, 0, 0,863			   mtk_dai_etdm_o055_mix,864			   ARRAY_SIZE(mtk_dai_etdm_o055_mix)),865	SND_SOC_DAPM_MIXER("O056", SND_SOC_NOPM, 0, 0,866			   mtk_dai_etdm_o056_mix,867			   ARRAY_SIZE(mtk_dai_etdm_o056_mix)),868	SND_SOC_DAPM_MIXER("O057", SND_SOC_NOPM, 0, 0,869			   mtk_dai_etdm_o057_mix,870			   ARRAY_SIZE(mtk_dai_etdm_o057_mix)),871	SND_SOC_DAPM_MIXER("O058", SND_SOC_NOPM, 0, 0,872			   mtk_dai_etdm_o058_mix,873			   ARRAY_SIZE(mtk_dai_etdm_o058_mix)),874	SND_SOC_DAPM_MIXER("O059", SND_SOC_NOPM, 0, 0,875			   mtk_dai_etdm_o059_mix,876			   ARRAY_SIZE(mtk_dai_etdm_o059_mix)),877	SND_SOC_DAPM_MIXER("O060", SND_SOC_NOPM, 0, 0,878			   mtk_dai_etdm_o060_mix,879			   ARRAY_SIZE(mtk_dai_etdm_o060_mix)),880	SND_SOC_DAPM_MIXER("O061", SND_SOC_NOPM, 0, 0,881			   mtk_dai_etdm_o061_mix,882			   ARRAY_SIZE(mtk_dai_etdm_o061_mix)),883	SND_SOC_DAPM_MIXER("O062", SND_SOC_NOPM, 0, 0,884			   mtk_dai_etdm_o062_mix,885			   ARRAY_SIZE(mtk_dai_etdm_o062_mix)),886	SND_SOC_DAPM_MIXER("O063", SND_SOC_NOPM, 0, 0,887			   mtk_dai_etdm_o063_mix,888			   ARRAY_SIZE(mtk_dai_etdm_o063_mix)),889	SND_SOC_DAPM_MIXER("O064", SND_SOC_NOPM, 0, 0,890			   mtk_dai_etdm_o064_mix,891			   ARRAY_SIZE(mtk_dai_etdm_o064_mix)),892	SND_SOC_DAPM_MIXER("O065", SND_SOC_NOPM, 0, 0,893			   mtk_dai_etdm_o065_mix,894			   ARRAY_SIZE(mtk_dai_etdm_o065_mix)),895	SND_SOC_DAPM_MIXER("O066", SND_SOC_NOPM, 0, 0,896			   mtk_dai_etdm_o066_mix,897			   ARRAY_SIZE(mtk_dai_etdm_o066_mix)),898	SND_SOC_DAPM_MIXER("O067", SND_SOC_NOPM, 0, 0,899			   mtk_dai_etdm_o067_mix,900			   ARRAY_SIZE(mtk_dai_etdm_o067_mix)),901	SND_SOC_DAPM_MIXER("O068", SND_SOC_NOPM, 0, 0,902			   mtk_dai_etdm_o068_mix,903			   ARRAY_SIZE(mtk_dai_etdm_o068_mix)),904	SND_SOC_DAPM_MIXER("O069", SND_SOC_NOPM, 0, 0,905			   mtk_dai_etdm_o069_mix,906			   ARRAY_SIZE(mtk_dai_etdm_o069_mix)),907	SND_SOC_DAPM_MIXER("O070", SND_SOC_NOPM, 0, 0,908			   mtk_dai_etdm_o070_mix,909			   ARRAY_SIZE(mtk_dai_etdm_o070_mix)),910	SND_SOC_DAPM_MIXER("O071", SND_SOC_NOPM, 0, 0,911			   mtk_dai_etdm_o071_mix,912			   ARRAY_SIZE(mtk_dai_etdm_o071_mix)),913 914	/* eTDM_OUT1 */915	SND_SOC_DAPM_MIXER("O072", SND_SOC_NOPM, 0, 0,916			   mtk_dai_etdm_o072_mix,917			   ARRAY_SIZE(mtk_dai_etdm_o072_mix)),918	SND_SOC_DAPM_MIXER("O073", SND_SOC_NOPM, 0, 0,919			   mtk_dai_etdm_o073_mix,920			   ARRAY_SIZE(mtk_dai_etdm_o073_mix)),921	SND_SOC_DAPM_MIXER("O074", SND_SOC_NOPM, 0, 0,922			   mtk_dai_etdm_o074_mix,923			   ARRAY_SIZE(mtk_dai_etdm_o074_mix)),924	SND_SOC_DAPM_MIXER("O075", SND_SOC_NOPM, 0, 0,925			   mtk_dai_etdm_o075_mix,926			   ARRAY_SIZE(mtk_dai_etdm_o075_mix)),927	SND_SOC_DAPM_MIXER("O076", SND_SOC_NOPM, 0, 0,928			   mtk_dai_etdm_o076_mix,929			   ARRAY_SIZE(mtk_dai_etdm_o076_mix)),930	SND_SOC_DAPM_MIXER("O077", SND_SOC_NOPM, 0, 0,931			   mtk_dai_etdm_o077_mix,932			   ARRAY_SIZE(mtk_dai_etdm_o077_mix)),933	SND_SOC_DAPM_MIXER("O078", SND_SOC_NOPM, 0, 0,934			   mtk_dai_etdm_o078_mix,935			   ARRAY_SIZE(mtk_dai_etdm_o078_mix)),936	SND_SOC_DAPM_MIXER("O079", SND_SOC_NOPM, 0, 0,937			   mtk_dai_etdm_o079_mix,938			   ARRAY_SIZE(mtk_dai_etdm_o079_mix)),939	SND_SOC_DAPM_MIXER("O080", SND_SOC_NOPM, 0, 0,940			   mtk_dai_etdm_o080_mix,941			   ARRAY_SIZE(mtk_dai_etdm_o080_mix)),942	SND_SOC_DAPM_MIXER("O081", SND_SOC_NOPM, 0, 0,943			   mtk_dai_etdm_o081_mix,944			   ARRAY_SIZE(mtk_dai_etdm_o081_mix)),945	SND_SOC_DAPM_MIXER("O082", SND_SOC_NOPM, 0, 0,946			   mtk_dai_etdm_o082_mix,947			   ARRAY_SIZE(mtk_dai_etdm_o082_mix)),948	SND_SOC_DAPM_MIXER("O083", SND_SOC_NOPM, 0, 0,949			   mtk_dai_etdm_o083_mix,950			   ARRAY_SIZE(mtk_dai_etdm_o083_mix)),951	SND_SOC_DAPM_MIXER("O084", SND_SOC_NOPM, 0, 0,952			   mtk_dai_etdm_o084_mix,953			   ARRAY_SIZE(mtk_dai_etdm_o084_mix)),954	SND_SOC_DAPM_MIXER("O085", SND_SOC_NOPM, 0, 0,955			   mtk_dai_etdm_o085_mix,956			   ARRAY_SIZE(mtk_dai_etdm_o085_mix)),957	SND_SOC_DAPM_MIXER("O086", SND_SOC_NOPM, 0, 0,958			   mtk_dai_etdm_o086_mix,959			   ARRAY_SIZE(mtk_dai_etdm_o086_mix)),960	SND_SOC_DAPM_MIXER("O087", SND_SOC_NOPM, 0, 0,961			   mtk_dai_etdm_o087_mix,962			   ARRAY_SIZE(mtk_dai_etdm_o087_mix)),963	SND_SOC_DAPM_MIXER("O088", SND_SOC_NOPM, 0, 0,964			   mtk_dai_etdm_o088_mix,965			   ARRAY_SIZE(mtk_dai_etdm_o088_mix)),966	SND_SOC_DAPM_MIXER("O089", SND_SOC_NOPM, 0, 0,967			   mtk_dai_etdm_o089_mix,968			   ARRAY_SIZE(mtk_dai_etdm_o089_mix)),969	SND_SOC_DAPM_MIXER("O090", SND_SOC_NOPM, 0, 0,970			   mtk_dai_etdm_o090_mix,971			   ARRAY_SIZE(mtk_dai_etdm_o090_mix)),972	SND_SOC_DAPM_MIXER("O091", SND_SOC_NOPM, 0, 0,973			   mtk_dai_etdm_o091_mix,974			   ARRAY_SIZE(mtk_dai_etdm_o091_mix)),975	SND_SOC_DAPM_MIXER("O092", SND_SOC_NOPM, 0, 0,976			   mtk_dai_etdm_o092_mix,977			   ARRAY_SIZE(mtk_dai_etdm_o092_mix)),978	SND_SOC_DAPM_MIXER("O093", SND_SOC_NOPM, 0, 0,979			   mtk_dai_etdm_o093_mix,980			   ARRAY_SIZE(mtk_dai_etdm_o093_mix)),981	SND_SOC_DAPM_MIXER("O094", SND_SOC_NOPM, 0, 0,982			   mtk_dai_etdm_o094_mix,983			   ARRAY_SIZE(mtk_dai_etdm_o094_mix)),984	SND_SOC_DAPM_MIXER("O095", SND_SOC_NOPM, 0, 0,985			   mtk_dai_etdm_o095_mix,986			   ARRAY_SIZE(mtk_dai_etdm_o095_mix)),987 988	/* eTDM_OUT3 */989	SND_SOC_DAPM_MUX("HDMI_OUT_MUX", SND_SOC_NOPM, 0, 0,990			 &hdmi_out_mux_control),991	SND_SOC_DAPM_MUX("DPTX_OUT_MUX", SND_SOC_NOPM, 0, 0,992			 &dptx_out_mux_control),993 994	SND_SOC_DAPM_MUX("HDMI_CH0_MUX", SND_SOC_NOPM, 0, 0,995			 &hdmi_ch0_mux_control),996	SND_SOC_DAPM_MUX("HDMI_CH1_MUX", SND_SOC_NOPM, 0, 0,997			 &hdmi_ch1_mux_control),998	SND_SOC_DAPM_MUX("HDMI_CH2_MUX", SND_SOC_NOPM, 0, 0,999			 &hdmi_ch2_mux_control),1000	SND_SOC_DAPM_MUX("HDMI_CH3_MUX", SND_SOC_NOPM, 0, 0,1001			 &hdmi_ch3_mux_control),1002	SND_SOC_DAPM_MUX("HDMI_CH4_MUX", SND_SOC_NOPM, 0, 0,1003			 &hdmi_ch4_mux_control),1004	SND_SOC_DAPM_MUX("HDMI_CH5_MUX", SND_SOC_NOPM, 0, 0,1005			 &hdmi_ch5_mux_control),1006	SND_SOC_DAPM_MUX("HDMI_CH6_MUX", SND_SOC_NOPM, 0, 0,1007			 &hdmi_ch6_mux_control),1008	SND_SOC_DAPM_MUX("HDMI_CH7_MUX", SND_SOC_NOPM, 0, 0,1009			 &hdmi_ch7_mux_control),1010 1011	SND_SOC_DAPM_INPUT("ETDM_INPUT"),1012	SND_SOC_DAPM_OUTPUT("ETDM_OUTPUT"),1013};1014 1015static const struct snd_soc_dapm_route mtk_dai_etdm_routes[] = {1016	{"I012", NULL, "ETDM2 Capture"},1017	{"I013", NULL, "ETDM2 Capture"},1018	{"I014", NULL, "ETDM2 Capture"},1019	{"I015", NULL, "ETDM2 Capture"},1020	{"I016", NULL, "ETDM2 Capture"},1021	{"I017", NULL, "ETDM2 Capture"},1022	{"I018", NULL, "ETDM2 Capture"},1023	{"I019", NULL, "ETDM2 Capture"},1024 1025	{"I072", NULL, "ETDM1 Capture"},1026	{"I073", NULL, "ETDM1 Capture"},1027	{"I074", NULL, "ETDM1 Capture"},1028	{"I075", NULL, "ETDM1 Capture"},1029	{"I076", NULL, "ETDM1 Capture"},1030	{"I077", NULL, "ETDM1 Capture"},1031	{"I078", NULL, "ETDM1 Capture"},1032	{"I079", NULL, "ETDM1 Capture"},1033	{"I080", NULL, "ETDM1 Capture"},1034	{"I081", NULL, "ETDM1 Capture"},1035	{"I082", NULL, "ETDM1 Capture"},1036	{"I083", NULL, "ETDM1 Capture"},1037	{"I084", NULL, "ETDM1 Capture"},1038	{"I085", NULL, "ETDM1 Capture"},1039	{"I086", NULL, "ETDM1 Capture"},1040	{"I087", NULL, "ETDM1 Capture"},1041	{"I088", NULL, "ETDM1 Capture"},1042	{"I089", NULL, "ETDM1 Capture"},1043	{"I090", NULL, "ETDM1 Capture"},1044	{"I091", NULL, "ETDM1 Capture"},1045	{"I092", NULL, "ETDM1 Capture"},1046	{"I093", NULL, "ETDM1 Capture"},1047	{"I094", NULL, "ETDM1 Capture"},1048	{"I095", NULL, "ETDM1 Capture"},1049 1050	{"UL8", NULL, "ETDM1 Capture"},1051	{"UL3", NULL, "ETDM2 Capture"},1052 1053	{"ETDM2 Playback", NULL, "O048"},1054	{"ETDM2 Playback", NULL, "O049"},1055	{"ETDM2 Playback", NULL, "O050"},1056	{"ETDM2 Playback", NULL, "O051"},1057	{"ETDM2 Playback", NULL, "O052"},1058	{"ETDM2 Playback", NULL, "O053"},1059	{"ETDM2 Playback", NULL, "O054"},1060	{"ETDM2 Playback", NULL, "O055"},1061	{"ETDM2 Playback", NULL, "O056"},1062	{"ETDM2 Playback", NULL, "O057"},1063	{"ETDM2 Playback", NULL, "O058"},1064	{"ETDM2 Playback", NULL, "O059"},1065	{"ETDM2 Playback", NULL, "O060"},1066	{"ETDM2 Playback", NULL, "O061"},1067	{"ETDM2 Playback", NULL, "O062"},1068	{"ETDM2 Playback", NULL, "O063"},1069	{"ETDM2 Playback", NULL, "O064"},1070	{"ETDM2 Playback", NULL, "O065"},1071	{"ETDM2 Playback", NULL, "O066"},1072	{"ETDM2 Playback", NULL, "O067"},1073	{"ETDM2 Playback", NULL, "O068"},1074	{"ETDM2 Playback", NULL, "O069"},1075	{"ETDM2 Playback", NULL, "O070"},1076	{"ETDM2 Playback", NULL, "O071"},1077 1078	{"ETDM1 Playback", NULL, "O072"},1079	{"ETDM1 Playback", NULL, "O073"},1080	{"ETDM1 Playback", NULL, "O074"},1081	{"ETDM1 Playback", NULL, "O075"},1082	{"ETDM1 Playback", NULL, "O076"},1083	{"ETDM1 Playback", NULL, "O077"},1084	{"ETDM1 Playback", NULL, "O078"},1085	{"ETDM1 Playback", NULL, "O079"},1086	{"ETDM1 Playback", NULL, "O080"},1087	{"ETDM1 Playback", NULL, "O081"},1088	{"ETDM1 Playback", NULL, "O082"},1089	{"ETDM1 Playback", NULL, "O083"},1090	{"ETDM1 Playback", NULL, "O084"},1091	{"ETDM1 Playback", NULL, "O085"},1092	{"ETDM1 Playback", NULL, "O086"},1093	{"ETDM1 Playback", NULL, "O087"},1094	{"ETDM1 Playback", NULL, "O088"},1095	{"ETDM1 Playback", NULL, "O089"},1096	{"ETDM1 Playback", NULL, "O090"},1097	{"ETDM1 Playback", NULL, "O091"},1098	{"ETDM1 Playback", NULL, "O092"},1099	{"ETDM1 Playback", NULL, "O093"},1100	{"ETDM1 Playback", NULL, "O094"},1101	{"ETDM1 Playback", NULL, "O095"},1102 1103	{"O048", "I020 Switch", "I020"},1104	{"O049", "I021 Switch", "I021"},1105 1106	{"O048", "I022 Switch", "I022"},1107	{"O049", "I023 Switch", "I023"},1108	{"O050", "I024 Switch", "I024"},1109	{"O051", "I025 Switch", "I025"},1110	{"O052", "I026 Switch", "I026"},1111	{"O053", "I027 Switch", "I027"},1112	{"O054", "I028 Switch", "I028"},1113	{"O055", "I029 Switch", "I029"},1114	{"O056", "I030 Switch", "I030"},1115	{"O057", "I031 Switch", "I031"},1116	{"O058", "I032 Switch", "I032"},1117	{"O059", "I033 Switch", "I033"},1118	{"O060", "I034 Switch", "I034"},1119	{"O061", "I035 Switch", "I035"},1120	{"O062", "I036 Switch", "I036"},1121	{"O063", "I037 Switch", "I037"},1122	{"O064", "I038 Switch", "I038"},1123	{"O065", "I039 Switch", "I039"},1124	{"O066", "I040 Switch", "I040"},1125	{"O067", "I041 Switch", "I041"},1126	{"O068", "I042 Switch", "I042"},1127	{"O069", "I043 Switch", "I043"},1128	{"O070", "I044 Switch", "I044"},1129	{"O071", "I045 Switch", "I045"},1130 1131	{"O048", "I046 Switch", "I046"},1132	{"O049", "I047 Switch", "I047"},1133	{"O050", "I048 Switch", "I048"},1134	{"O051", "I049 Switch", "I049"},1135	{"O052", "I050 Switch", "I050"},1136	{"O053", "I051 Switch", "I051"},1137	{"O054", "I052 Switch", "I052"},1138	{"O055", "I053 Switch", "I053"},1139	{"O056", "I054 Switch", "I054"},1140	{"O057", "I055 Switch", "I055"},1141	{"O058", "I056 Switch", "I056"},1142	{"O059", "I057 Switch", "I057"},1143	{"O060", "I058 Switch", "I058"},1144	{"O061", "I059 Switch", "I059"},1145	{"O062", "I060 Switch", "I060"},1146	{"O063", "I061 Switch", "I061"},1147	{"O064", "I062 Switch", "I062"},1148	{"O065", "I063 Switch", "I063"},1149	{"O066", "I064 Switch", "I064"},1150	{"O067", "I065 Switch", "I065"},1151	{"O068", "I066 Switch", "I066"},1152	{"O069", "I067 Switch", "I067"},1153	{"O070", "I068 Switch", "I068"},1154	{"O071", "I069 Switch", "I069"},1155 1156	{"O048", "I070 Switch", "I070"},1157	{"O049", "I071 Switch", "I071"},1158 1159	{"O072", "I020 Switch", "I020"},1160	{"O073", "I021 Switch", "I021"},1161 1162	{"O072", "I022 Switch", "I022"},1163	{"O073", "I023 Switch", "I023"},1164	{"O074", "I024 Switch", "I024"},1165	{"O075", "I025 Switch", "I025"},1166	{"O076", "I026 Switch", "I026"},1167	{"O077", "I027 Switch", "I027"},1168	{"O078", "I028 Switch", "I028"},1169	{"O079", "I029 Switch", "I029"},1170	{"O080", "I030 Switch", "I030"},1171	{"O081", "I031 Switch", "I031"},1172	{"O082", "I032 Switch", "I032"},1173	{"O083", "I033 Switch", "I033"},1174	{"O084", "I034 Switch", "I034"},1175	{"O085", "I035 Switch", "I035"},1176	{"O086", "I036 Switch", "I036"},1177	{"O087", "I037 Switch", "I037"},1178	{"O088", "I038 Switch", "I038"},1179	{"O089", "I039 Switch", "I039"},1180	{"O090", "I040 Switch", "I040"},1181	{"O091", "I041 Switch", "I041"},1182	{"O092", "I042 Switch", "I042"},1183	{"O093", "I043 Switch", "I043"},1184	{"O094", "I044 Switch", "I044"},1185	{"O095", "I045 Switch", "I045"},1186 1187	{"O072", "I046 Switch", "I046"},1188	{"O073", "I047 Switch", "I047"},1189	{"O074", "I048 Switch", "I048"},1190	{"O075", "I049 Switch", "I049"},1191	{"O076", "I050 Switch", "I050"},1192	{"O077", "I051 Switch", "I051"},1193	{"O078", "I052 Switch", "I052"},1194	{"O079", "I053 Switch", "I053"},1195	{"O080", "I054 Switch", "I054"},1196	{"O081", "I055 Switch", "I055"},1197	{"O082", "I056 Switch", "I056"},1198	{"O083", "I057 Switch", "I057"},1199	{"O084", "I058 Switch", "I058"},1200	{"O085", "I059 Switch", "I059"},1201	{"O086", "I060 Switch", "I060"},1202	{"O087", "I061 Switch", "I061"},1203	{"O088", "I062 Switch", "I062"},1204	{"O089", "I063 Switch", "I063"},1205	{"O090", "I064 Switch", "I064"},1206	{"O091", "I065 Switch", "I065"},1207	{"O092", "I066 Switch", "I066"},1208	{"O093", "I067 Switch", "I067"},1209	{"O094", "I068 Switch", "I068"},1210	{"O095", "I069 Switch", "I069"},1211 1212	{"O072", "I070 Switch", "I070"},1213	{"O073", "I071 Switch", "I071"},1214 1215	{"HDMI_CH0_MUX", "CH0", "DL10"},1216	{"HDMI_CH0_MUX", "CH1", "DL10"},1217	{"HDMI_CH0_MUX", "CH2", "DL10"},1218	{"HDMI_CH0_MUX", "CH3", "DL10"},1219	{"HDMI_CH0_MUX", "CH4", "DL10"},1220	{"HDMI_CH0_MUX", "CH5", "DL10"},1221	{"HDMI_CH0_MUX", "CH6", "DL10"},1222	{"HDMI_CH0_MUX", "CH7", "DL10"},1223 1224	{"HDMI_CH1_MUX", "CH0", "DL10"},1225	{"HDMI_CH1_MUX", "CH1", "DL10"},1226	{"HDMI_CH1_MUX", "CH2", "DL10"},1227	{"HDMI_CH1_MUX", "CH3", "DL10"},1228	{"HDMI_CH1_MUX", "CH4", "DL10"},1229	{"HDMI_CH1_MUX", "CH5", "DL10"},1230	{"HDMI_CH1_MUX", "CH6", "DL10"},1231	{"HDMI_CH1_MUX", "CH7", "DL10"},1232 1233	{"HDMI_CH2_MUX", "CH0", "DL10"},1234	{"HDMI_CH2_MUX", "CH1", "DL10"},1235	{"HDMI_CH2_MUX", "CH2", "DL10"},1236	{"HDMI_CH2_MUX", "CH3", "DL10"},1237	{"HDMI_CH2_MUX", "CH4", "DL10"},1238	{"HDMI_CH2_MUX", "CH5", "DL10"},1239	{"HDMI_CH2_MUX", "CH6", "DL10"},1240	{"HDMI_CH2_MUX", "CH7", "DL10"},1241 1242	{"HDMI_CH3_MUX", "CH0", "DL10"},1243	{"HDMI_CH3_MUX", "CH1", "DL10"},1244	{"HDMI_CH3_MUX", "CH2", "DL10"},1245	{"HDMI_CH3_MUX", "CH3", "DL10"},1246	{"HDMI_CH3_MUX", "CH4", "DL10"},1247	{"HDMI_CH3_MUX", "CH5", "DL10"},1248	{"HDMI_CH3_MUX", "CH6", "DL10"},1249	{"HDMI_CH3_MUX", "CH7", "DL10"},1250 1251	{"HDMI_CH4_MUX", "CH0", "DL10"},1252	{"HDMI_CH4_MUX", "CH1", "DL10"},1253	{"HDMI_CH4_MUX", "CH2", "DL10"},1254	{"HDMI_CH4_MUX", "CH3", "DL10"},1255	{"HDMI_CH4_MUX", "CH4", "DL10"},1256	{"HDMI_CH4_MUX", "CH5", "DL10"},1257	{"HDMI_CH4_MUX", "CH6", "DL10"},1258	{"HDMI_CH4_MUX", "CH7", "DL10"},1259 1260	{"HDMI_CH5_MUX", "CH0", "DL10"},1261	{"HDMI_CH5_MUX", "CH1", "DL10"},1262	{"HDMI_CH5_MUX", "CH2", "DL10"},1263	{"HDMI_CH5_MUX", "CH3", "DL10"},1264	{"HDMI_CH5_MUX", "CH4", "DL10"},1265	{"HDMI_CH5_MUX", "CH5", "DL10"},1266	{"HDMI_CH5_MUX", "CH6", "DL10"},1267	{"HDMI_CH5_MUX", "CH7", "DL10"},1268 1269	{"HDMI_CH6_MUX", "CH0", "DL10"},1270	{"HDMI_CH6_MUX", "CH1", "DL10"},1271	{"HDMI_CH6_MUX", "CH2", "DL10"},1272	{"HDMI_CH6_MUX", "CH3", "DL10"},1273	{"HDMI_CH6_MUX", "CH4", "DL10"},1274	{"HDMI_CH6_MUX", "CH5", "DL10"},1275	{"HDMI_CH6_MUX", "CH6", "DL10"},1276	{"HDMI_CH6_MUX", "CH7", "DL10"},1277 1278	{"HDMI_CH7_MUX", "CH0", "DL10"},1279	{"HDMI_CH7_MUX", "CH1", "DL10"},1280	{"HDMI_CH7_MUX", "CH2", "DL10"},1281	{"HDMI_CH7_MUX", "CH3", "DL10"},1282	{"HDMI_CH7_MUX", "CH4", "DL10"},1283	{"HDMI_CH7_MUX", "CH5", "DL10"},1284	{"HDMI_CH7_MUX", "CH6", "DL10"},1285	{"HDMI_CH7_MUX", "CH7", "DL10"},1286 1287	{"HDMI_OUT_MUX", "Connect", "HDMI_CH0_MUX"},1288	{"HDMI_OUT_MUX", "Connect", "HDMI_CH1_MUX"},1289	{"HDMI_OUT_MUX", "Connect", "HDMI_CH2_MUX"},1290	{"HDMI_OUT_MUX", "Connect", "HDMI_CH3_MUX"},1291	{"HDMI_OUT_MUX", "Connect", "HDMI_CH4_MUX"},1292	{"HDMI_OUT_MUX", "Connect", "HDMI_CH5_MUX"},1293	{"HDMI_OUT_MUX", "Connect", "HDMI_CH6_MUX"},1294	{"HDMI_OUT_MUX", "Connect", "HDMI_CH7_MUX"},1295 1296	{"DPTX_OUT_MUX", "Connect", "HDMI_CH0_MUX"},1297	{"DPTX_OUT_MUX", "Connect", "HDMI_CH1_MUX"},1298	{"DPTX_OUT_MUX", "Connect", "HDMI_CH2_MUX"},1299	{"DPTX_OUT_MUX", "Connect", "HDMI_CH3_MUX"},1300	{"DPTX_OUT_MUX", "Connect", "HDMI_CH4_MUX"},1301	{"DPTX_OUT_MUX", "Connect", "HDMI_CH5_MUX"},1302	{"DPTX_OUT_MUX", "Connect", "HDMI_CH6_MUX"},1303	{"DPTX_OUT_MUX", "Connect", "HDMI_CH7_MUX"},1304 1305	{"ETDM3 Playback", NULL, "HDMI_OUT_MUX"},1306	{"DPTX Playback", NULL, "DPTX_OUT_MUX"},1307 1308	{"ETDM_OUTPUT", NULL, "DPTX Playback"},1309	{"ETDM_OUTPUT", NULL, "ETDM1 Playback"},1310	{"ETDM_OUTPUT", NULL, "ETDM2 Playback"},1311	{"ETDM_OUTPUT", NULL, "ETDM3 Playback"},1312	{"ETDM1 Capture", NULL, "ETDM_INPUT"},1313	{"ETDM2 Capture", NULL, "ETDM_INPUT"},1314};1315 1316static int mt8195_afe_enable_etdm(struct mtk_base_afe *afe, int dai_id)1317{1318	int ret = 0;1319	struct etdm_con_reg etdm_reg;1320	struct mt8195_afe_private *afe_priv = afe->platform_priv;1321	struct mtk_dai_etdm_priv *etdm_data;1322	unsigned long flags;1323 1324	if (!mt8195_afe_etdm_is_valid(dai_id))1325		return -EINVAL;1326 1327	etdm_data = afe_priv->dai_priv[dai_id];1328	spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags);1329	etdm_data->en_ref_cnt++;1330	if (etdm_data->en_ref_cnt == 1) {1331		ret = get_etdm_reg(dai_id, &etdm_reg);1332		if (ret < 0)1333			goto out;1334 1335		regmap_update_bits(afe->regmap, etdm_reg.con0,1336				   ETDM_CON0_EN, ETDM_CON0_EN);1337	}1338out:1339	spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags);1340	return ret;1341}1342 1343static int mt8195_afe_disable_etdm(struct mtk_base_afe *afe, int dai_id)1344{1345	int ret = 0;1346	struct etdm_con_reg etdm_reg;1347	struct mt8195_afe_private *afe_priv = afe->platform_priv;1348	struct mtk_dai_etdm_priv *etdm_data;1349	unsigned long flags;1350 1351	if (!mt8195_afe_etdm_is_valid(dai_id))1352		return -EINVAL;1353 1354	etdm_data = afe_priv->dai_priv[dai_id];1355	spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags);1356	if (etdm_data->en_ref_cnt > 0) {1357		etdm_data->en_ref_cnt--;1358		if (etdm_data->en_ref_cnt == 0) {1359			ret = get_etdm_reg(dai_id, &etdm_reg);1360			if (ret < 0)1361				goto out;1362 1363			regmap_update_bits(afe->regmap, etdm_reg.con0,1364					   ETDM_CON0_EN, 0);1365		}1366	}1367out:1368	spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags);1369	return ret;1370}1371 1372static int etdm_cowork_slv_sel(int id, int slave_mode)1373{1374	if (slave_mode) {1375		switch (id) {1376		case MT8195_AFE_IO_ETDM1_IN:1377			return COWORK_ETDM_IN1_S;1378		case MT8195_AFE_IO_ETDM2_IN:1379			return COWORK_ETDM_IN2_S;1380		case MT8195_AFE_IO_ETDM1_OUT:1381			return COWORK_ETDM_OUT1_S;1382		case MT8195_AFE_IO_ETDM2_OUT:1383			return COWORK_ETDM_OUT2_S;1384		case MT8195_AFE_IO_ETDM3_OUT:1385			return COWORK_ETDM_OUT3_S;1386		default:1387			return -EINVAL;1388		}1389	} else {1390		switch (id) {1391		case MT8195_AFE_IO_ETDM1_IN:1392			return COWORK_ETDM_IN1_M;1393		case MT8195_AFE_IO_ETDM2_IN:1394			return COWORK_ETDM_IN2_M;1395		case MT8195_AFE_IO_ETDM1_OUT:1396			return COWORK_ETDM_OUT1_M;1397		case MT8195_AFE_IO_ETDM2_OUT:1398			return COWORK_ETDM_OUT2_M;1399		case MT8195_AFE_IO_ETDM3_OUT:1400			return COWORK_ETDM_OUT3_M;1401		default:1402			return -EINVAL;1403		}1404	}1405}1406 1407static int mt8195_etdm_sync_mode_configure(struct mtk_base_afe *afe, int dai_id)1408{1409	struct mt8195_afe_private *afe_priv = afe->platform_priv;1410	struct mtk_dai_etdm_priv *etdm_data;1411	unsigned int reg = 0;1412	unsigned int mask;1413	unsigned int val;1414	int cowork_source_sel;1415 1416	if (!mt8195_afe_etdm_is_valid(dai_id))1417		return -EINVAL;1418 1419	etdm_data = afe_priv->dai_priv[dai_id];1420	if (etdm_data->cowork_source_id == COWORK_ETDM_NONE)1421		return 0;1422 1423	cowork_source_sel = etdm_cowork_slv_sel(etdm_data->cowork_source_id,1424						etdm_data->slave_mode);1425	if (cowork_source_sel < 0)1426		return cowork_source_sel;1427 1428	switch (dai_id) {1429	case MT8195_AFE_IO_ETDM1_IN:1430		reg = ETDM_COWORK_CON1;1431		mask = ETDM_IN1_SLAVE_SEL_MASK;1432		val = ETDM_IN1_SLAVE_SEL(cowork_source_sel);1433		break;1434	case MT8195_AFE_IO_ETDM2_IN:1435		reg = ETDM_COWORK_CON2;1436		mask = ETDM_IN2_SLAVE_SEL_MASK;1437		val = ETDM_IN2_SLAVE_SEL(cowork_source_sel);1438		break;1439	case MT8195_AFE_IO_ETDM1_OUT:1440		reg = ETDM_COWORK_CON0;1441		mask = ETDM_OUT1_SLAVE_SEL_MASK;1442		val = ETDM_OUT1_SLAVE_SEL(cowork_source_sel);1443		break;1444	case MT8195_AFE_IO_ETDM2_OUT:1445		reg = ETDM_COWORK_CON2;1446		mask = ETDM_OUT2_SLAVE_SEL_MASK;1447		val = ETDM_OUT2_SLAVE_SEL(cowork_source_sel);1448		break;1449	case MT8195_AFE_IO_ETDM3_OUT:1450		reg = ETDM_COWORK_CON2;1451		mask = ETDM_OUT3_SLAVE_SEL_MASK;1452		val = ETDM_OUT3_SLAVE_SEL(cowork_source_sel);1453		break;1454	default:1455		return 0;1456	}1457 1458	regmap_update_bits(afe->regmap, reg, mask, val);1459 1460	return 0;1461}1462 1463static int mtk_dai_etdm_get_cg_id_by_dai_id(int dai_id)1464{1465	int cg_id = -1;1466 1467	switch (dai_id) {1468	case MT8195_AFE_IO_DPTX:1469		cg_id = MT8195_CLK_AUD_HDMI_OUT;1470		break;1471	case MT8195_AFE_IO_ETDM1_IN:1472		cg_id = MT8195_CLK_AUD_TDM_IN;1473		break;1474	case MT8195_AFE_IO_ETDM2_IN:1475		cg_id = MT8195_CLK_AUD_I2SIN;1476		break;1477	case MT8195_AFE_IO_ETDM1_OUT:1478		cg_id = MT8195_CLK_AUD_TDM_OUT;1479		break;1480	case MT8195_AFE_IO_ETDM2_OUT:1481		cg_id = MT8195_CLK_AUD_I2S_OUT;1482		break;1483	case MT8195_AFE_IO_ETDM3_OUT:1484		cg_id = MT8195_CLK_AUD_HDMI_OUT;1485		break;1486	default:1487		break;1488	}1489 1490	return cg_id;1491}1492 1493static int mtk_dai_etdm_get_clk_id_by_dai_id(int dai_id)1494{1495	int clk_id = -1;1496 1497	switch (dai_id) {1498	case MT8195_AFE_IO_DPTX:1499		clk_id = MT8195_CLK_TOP_DPTX_M_SEL;1500		break;1501	case MT8195_AFE_IO_ETDM1_IN:1502		clk_id = MT8195_CLK_TOP_I2SI1_M_SEL;1503		break;1504	case MT8195_AFE_IO_ETDM2_IN:1505		clk_id = MT8195_CLK_TOP_I2SI2_M_SEL;1506		break;1507	case MT8195_AFE_IO_ETDM1_OUT:1508		clk_id = MT8195_CLK_TOP_I2SO1_M_SEL;1509		break;1510	case MT8195_AFE_IO_ETDM2_OUT:1511		clk_id = MT8195_CLK_TOP_I2SO2_M_SEL;1512		break;1513	case MT8195_AFE_IO_ETDM3_OUT:1514	default:1515		break;1516	}1517 1518	return clk_id;1519}1520 1521static int mtk_dai_etdm_get_clkdiv_id_by_dai_id(int dai_id)1522{1523	int clk_id = -1;1524 1525	switch (dai_id) {1526	case MT8195_AFE_IO_DPTX:1527		clk_id = MT8195_CLK_TOP_APLL12_DIV9;1528		break;1529	case MT8195_AFE_IO_ETDM1_IN:1530		clk_id = MT8195_CLK_TOP_APLL12_DIV0;1531		break;1532	case MT8195_AFE_IO_ETDM2_IN:1533		clk_id = MT8195_CLK_TOP_APLL12_DIV1;1534		break;1535	case MT8195_AFE_IO_ETDM1_OUT:1536		clk_id = MT8195_CLK_TOP_APLL12_DIV2;1537		break;1538	case MT8195_AFE_IO_ETDM2_OUT:1539		clk_id = MT8195_CLK_TOP_APLL12_DIV3;1540		break;1541	case MT8195_AFE_IO_ETDM3_OUT:1542	default:1543		break;1544	}1545 1546	return clk_id;1547}1548 1549static int mtk_dai_etdm_enable_mclk(struct mtk_base_afe *afe, int dai_id)1550{1551	struct mt8195_afe_private *afe_priv = afe->platform_priv;1552	int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id);1553 1554	if (clkdiv_id < 0)1555		return -EINVAL;1556 1557	mt8195_afe_enable_clk(afe, afe_priv->clk[clkdiv_id]);1558 1559	return 0;1560}1561 1562static int mtk_dai_etdm_disable_mclk(struct mtk_base_afe *afe, int dai_id)1563{1564	struct mt8195_afe_private *afe_priv = afe->platform_priv;1565	int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id);1566 1567	if (clkdiv_id < 0)1568		return -EINVAL;1569 1570	mt8195_afe_disable_clk(afe, afe_priv->clk[clkdiv_id]);1571 1572	return 0;1573}1574 1575/* dai ops */1576static int mtk_dai_etdm_startup(struct snd_pcm_substream *substream,1577				struct snd_soc_dai *dai)1578{1579	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);1580	struct mt8195_afe_private *afe_priv = afe->platform_priv;1581	struct mtk_dai_etdm_priv *mst_etdm_data;1582	int cg_id;1583	int mst_dai_id;1584	int slv_dai_id;1585	int i;1586 1587	if (is_cowork_mode(dai)) {1588		mst_dai_id = get_etdm_cowork_master_id(dai);1589		if (!mt8195_afe_etdm_is_valid(mst_dai_id))1590			return -EINVAL;1591 1592		mtk_dai_etdm_enable_mclk(afe, mst_dai_id);1593		cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(mst_dai_id);1594		if (cg_id >= 0)1595			mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]);1596 1597		mst_etdm_data = afe_priv->dai_priv[mst_dai_id];1598 1599		for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {1600			slv_dai_id = mst_etdm_data->cowork_slv_id[i];1601			cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(slv_dai_id);1602			if (cg_id >= 0)1603				mt8195_afe_enable_clk(afe,1604						      afe_priv->clk[cg_id]);1605		}1606	} else {1607		mtk_dai_etdm_enable_mclk(afe, dai->id);1608 1609		cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id);1610		if (cg_id >= 0)1611			mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]);1612	}1613 1614	return 0;1615}1616 1617static void mtk_dai_etdm_shutdown(struct snd_pcm_substream *substream,1618				  struct snd_soc_dai *dai)1619{1620	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);1621	struct mt8195_afe_private *afe_priv = afe->platform_priv;1622	struct mtk_dai_etdm_priv *mst_etdm_data;1623	int cg_id;1624	int mst_dai_id;1625	int slv_dai_id;1626	int i;1627 1628	if (is_cowork_mode(dai)) {1629		mst_dai_id = get_etdm_cowork_master_id(dai);1630		if (!mt8195_afe_etdm_is_valid(mst_dai_id))1631			return;1632 1633		cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(mst_dai_id);1634		if (cg_id >= 0)1635			mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]);1636 1637		mst_etdm_data = afe_priv->dai_priv[mst_dai_id];1638		for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {1639			slv_dai_id = mst_etdm_data->cowork_slv_id[i];1640			cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(slv_dai_id);1641			if (cg_id >= 0)1642				mt8195_afe_disable_clk(afe,1643						       afe_priv->clk[cg_id]);1644		}1645		mtk_dai_etdm_disable_mclk(afe, mst_dai_id);1646	} else {1647		cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id);1648		if (cg_id >= 0)1649			mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]);1650 1651		mtk_dai_etdm_disable_mclk(afe, dai->id);1652	}1653}1654 1655static int mtk_dai_etdm_fifo_mode(struct mtk_base_afe *afe,1656				  int dai_id, unsigned int rate)1657{1658	unsigned int mode = 0;1659	unsigned int reg = 0;1660	unsigned int val = 0;1661	unsigned int mask = (ETDM_IN_AFIFO_MODE_MASK | ETDM_IN_USE_AFIFO);1662 1663	if (rate != 0)1664		mode = mt8195_afe_fs_timing(rate);1665 1666	switch (dai_id) {1667	case MT8195_AFE_IO_ETDM1_IN:1668		reg = ETDM_IN1_AFIFO_CON;1669		if (rate == 0)1670			mode = MT8195_ETDM_IN1_1X_EN;1671		break;1672	case MT8195_AFE_IO_ETDM2_IN:1673		reg = ETDM_IN2_AFIFO_CON;1674		if (rate == 0)1675			mode = MT8195_ETDM_IN2_1X_EN;1676		break;1677	default:1678		return -EINVAL;1679	}1680 1681	val = (mode | ETDM_IN_USE_AFIFO);1682 1683	regmap_update_bits(afe->regmap, reg, mask, val);1684	return 0;1685}1686 1687static int mtk_dai_etdm_in_configure(struct mtk_base_afe *afe,1688				     unsigned int rate,1689				     unsigned int channels,1690				     int dai_id)1691{1692	struct mt8195_afe_private *afe_priv = afe->platform_priv;1693	struct mtk_dai_etdm_priv *etdm_data;1694	struct etdm_con_reg etdm_reg;1695	bool slave_mode;1696	unsigned int data_mode;1697	unsigned int lrck_width;1698	unsigned int val = 0;1699	unsigned int mask = 0;1700	int i;1701	int ret;1702 1703	if (!mt8195_afe_etdm_is_valid(dai_id))1704		return -EINVAL;1705 1706	etdm_data = afe_priv->dai_priv[dai_id];1707	slave_mode = etdm_data->slave_mode;1708	data_mode = etdm_data->data_mode;1709	lrck_width = etdm_data->lrck_width;1710 1711	dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n",1712		__func__, rate, channels, dai_id);1713 1714	ret = get_etdm_reg(dai_id, &etdm_reg);1715	if (ret < 0)1716		return ret;1717 1718	if (etdm_data->cowork_source_id != COWORK_ETDM_NONE)1719		slave_mode = true;1720 1721	/* afifo */1722	if (slave_mode)1723		mtk_dai_etdm_fifo_mode(afe, dai_id, 0);1724	else1725		mtk_dai_etdm_fifo_mode(afe, dai_id, rate);1726 1727	/* con1 */1728	if (lrck_width > 0) {1729		mask |= (ETDM_IN_CON1_LRCK_AUTO_MODE |1730			ETDM_IN_CON1_LRCK_WIDTH_MASK);1731		val |= ETDM_IN_CON1_LRCK_WIDTH(lrck_width);1732	}1733	regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);1734 1735	mask = 0;1736	val = 0;1737 1738	/* con2 */1739	if (!slave_mode) {1740		mask |= ETDM_IN_CON2_UPDATE_GAP_MASK;1741		if (rate == 352800 || rate == 384000)1742			val |= ETDM_IN_CON2_UPDATE_GAP(4);1743		else1744			val |= ETDM_IN_CON2_UPDATE_GAP(3);1745	}1746	mask |= (ETDM_IN_CON2_MULTI_IP_2CH_MODE |1747		ETDM_IN_CON2_MULTI_IP_TOTAL_CH_MASK);1748	if (data_mode == MTK_DAI_ETDM_DATA_MULTI_PIN) {1749		val |= ETDM_IN_CON2_MULTI_IP_2CH_MODE |1750		       ETDM_IN_CON2_MULTI_IP_TOTAL_CH(channels);1751	}1752	regmap_update_bits(afe->regmap, etdm_reg.con2, mask, val);1753 1754	mask = 0;1755	val = 0;1756 1757	/* con3 */1758	mask |= ETDM_IN_CON3_DISABLE_OUT_MASK;1759	for (i = 0; i < channels; i += 2) {1760		if (etdm_data->in_disable_ch[i] &&1761		    etdm_data->in_disable_ch[i + 1])1762			val |= ETDM_IN_CON3_DISABLE_OUT(i >> 1);1763	}1764	if (!slave_mode) {1765		mask |= ETDM_IN_CON3_FS_MASK;1766		val |= ETDM_IN_CON3_FS(get_etdm_fs_timing(rate));1767	}1768	regmap_update_bits(afe->regmap, etdm_reg.con3, mask, val);1769 1770	mask = 0;1771	val = 0;1772 1773	/* con4 */1774	mask |= (ETDM_IN_CON4_MASTER_LRCK_INV | ETDM_IN_CON4_MASTER_BCK_INV |1775		ETDM_IN_CON4_SLAVE_LRCK_INV | ETDM_IN_CON4_SLAVE_BCK_INV);1776	if (slave_mode) {1777		if (etdm_data->lrck_inv)1778			val |= ETDM_IN_CON4_SLAVE_LRCK_INV;1779		if (etdm_data->bck_inv)1780			val |= ETDM_IN_CON4_SLAVE_BCK_INV;1781	} else {1782		if (etdm_data->lrck_inv)1783			val |= ETDM_IN_CON4_MASTER_LRCK_INV;1784		if (etdm_data->bck_inv)1785			val |= ETDM_IN_CON4_MASTER_BCK_INV;1786	}1787	regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val);1788 1789	mask = 0;1790	val = 0;1791 1792	/* con5 */1793	mask |= ETDM_IN_CON5_LR_SWAP_MASK;1794	mask |= ETDM_IN_CON5_ENABLE_ODD_MASK;1795	for (i = 0; i < channels; i += 2) {1796		if (etdm_data->in_disable_ch[i] &&1797		    !etdm_data->in_disable_ch[i + 1]) {1798			if (i == (channels - 2))1799				val |= ETDM_IN_CON5_LR_SWAP(15);1800			else1801				val |= ETDM_IN_CON5_LR_SWAP(i >> 1);1802			val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1);1803		} else if (!etdm_data->in_disable_ch[i] &&1804			   etdm_data->in_disable_ch[i + 1]) {1805			val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1);1806		}1807	}1808	regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val);1809	return 0;1810}1811 1812static int mtk_dai_etdm_out_configure(struct mtk_base_afe *afe,1813				      unsigned int rate,1814				      unsigned int channels,1815				      int dai_id)1816{1817	struct mt8195_afe_private *afe_priv = afe->platform_priv;1818	struct mtk_dai_etdm_priv *etdm_data;1819	struct etdm_con_reg etdm_reg;1820	bool slave_mode;1821	unsigned int lrck_width;1822	unsigned int val = 0;1823	unsigned int mask = 0;1824	int ret;1825	int fs = 0;1826 1827	if (!mt8195_afe_etdm_is_valid(dai_id))1828		return -EINVAL;1829 1830	etdm_data = afe_priv->dai_priv[dai_id];1831	slave_mode = etdm_data->slave_mode;1832	lrck_width = etdm_data->lrck_width;1833 1834	dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n",1835		__func__, rate, channels, dai_id);1836 1837	ret = get_etdm_reg(dai_id, &etdm_reg);1838	if (ret < 0)1839		return ret;1840 1841	if (etdm_data->cowork_source_id != COWORK_ETDM_NONE)1842		slave_mode = true;1843 1844	/* con0 */1845	mask = ETDM_OUT_CON0_RELATCH_DOMAIN_MASK;1846	val = ETDM_OUT_CON0_RELATCH_DOMAIN(ETDM_RELATCH_TIMING_A1A2SYS);1847	regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val);1848 1849	mask = 0;1850	val = 0;1851 1852	/* con1 */1853	if (lrck_width > 0) {1854		mask |= (ETDM_OUT_CON1_LRCK_AUTO_MODE |1855			ETDM_OUT_CON1_LRCK_WIDTH_MASK);1856		val |= ETDM_OUT_CON1_LRCK_WIDTH(lrck_width);1857	}1858	regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);1859 1860	mask = 0;1861	val = 0;1862 1863	if (slave_mode) {1864		/* con2 */1865		mask = (ETDM_OUT_CON2_LRCK_DELAY_BCK_INV |1866			ETDM_OUT_CON2_LRCK_DELAY_0P5T_EN);1867		val = (ETDM_OUT_CON2_LRCK_DELAY_BCK_INV |1868			ETDM_OUT_CON2_LRCK_DELAY_0P5T_EN);1869		regmap_update_bits(afe->regmap, etdm_reg.con2,1870				   mask, val);1871		mask = 0;1872		val = 0;1873	} else {1874		/* con4 */1875		mask |= ETDM_OUT_CON4_FS_MASK;1876		val |= ETDM_OUT_CON4_FS(get_etdm_fs_timing(rate));1877	}1878 1879	mask |= ETDM_OUT_CON4_RELATCH_EN_MASK;1880	if (dai_id == MT8195_AFE_IO_ETDM1_OUT)1881		fs = MT8195_ETDM_OUT1_1X_EN;1882	else if (dai_id == MT8195_AFE_IO_ETDM2_OUT)1883		fs = MT8195_ETDM_OUT2_1X_EN;1884 1885	val |= ETDM_OUT_CON4_RELATCH_EN(fs);1886 1887	regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val);1888 1889	mask = 0;1890	val = 0;1891 1892	/* con5 */1893	mask |= (ETDM_OUT_CON5_MASTER_LRCK_INV | ETDM_OUT_CON5_MASTER_BCK_INV |1894		ETDM_OUT_CON5_SLAVE_LRCK_INV | ETDM_OUT_CON5_SLAVE_BCK_INV);1895	if (slave_mode) {1896		if (etdm_data->lrck_inv)1897			val |= ETDM_OUT_CON5_SLAVE_LRCK_INV;1898		if (etdm_data->bck_inv)1899			val |= ETDM_OUT_CON5_SLAVE_BCK_INV;1900	} else {1901		if (etdm_data->lrck_inv)1902			val |= ETDM_OUT_CON5_MASTER_LRCK_INV;1903		if (etdm_data->bck_inv)1904			val |= ETDM_OUT_CON5_MASTER_BCK_INV;1905	}1906	regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val);1907 1908	return 0;1909}1910 1911static int mtk_dai_etdm_mclk_configure(struct mtk_base_afe *afe, int dai_id)1912{1913	struct mt8195_afe_private *afe_priv = afe->platform_priv;1914	struct mtk_dai_etdm_priv *etdm_data;1915	int clk_id = mtk_dai_etdm_get_clk_id_by_dai_id(dai_id);1916	int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id);1917	int apll;1918	int apll_clk_id;1919	struct etdm_con_reg etdm_reg;1920	unsigned int val = 0;1921	unsigned int mask = 0;1922	int ret = 0;1923 1924	if (clk_id < 0 || clkdiv_id < 0)1925		return 0;1926 1927	if (!mt8195_afe_etdm_is_valid(dai_id))1928		return -EINVAL;1929 1930	etdm_data = afe_priv->dai_priv[dai_id];1931	ret = get_etdm_reg(dai_id, &etdm_reg);1932	if (ret < 0)1933		return ret;1934 1935	mask |= ETDM_CON1_MCLK_OUTPUT;1936	if (etdm_data->mclk_dir == SND_SOC_CLOCK_OUT)1937		val |= ETDM_CON1_MCLK_OUTPUT;1938	regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);1939 1940	if (etdm_data->mclk_freq) {1941		apll = etdm_data->mclk_apll;1942		apll_clk_id = mt8195_afe_get_mclk_source_clk_id(apll);1943		if (apll_clk_id < 0)1944			return apll_clk_id;1945 1946		/* select apll */1947		ret = mt8195_afe_set_clk_parent(afe, afe_priv->clk[clk_id],1948						afe_priv->clk[apll_clk_id]);1949		if (ret)1950			return ret;1951 1952		/* set rate */1953		ret = mt8195_afe_set_clk_rate(afe, afe_priv->clk[clkdiv_id],1954					      etdm_data->mclk_freq);1955	} else {1956		if (etdm_data->mclk_dir == SND_SOC_CLOCK_OUT)1957			dev_dbg(afe->dev, "%s mclk freq = 0\n", __func__);1958	}1959	return ret;1960}1961 1962static int mtk_dai_etdm_configure(struct mtk_base_afe *afe,1963				  unsigned int rate,1964				  unsigned int channels,1965				  unsigned int bit_width,1966				  int dai_id)1967{1968	struct mt8195_afe_private *afe_priv = afe->platform_priv;1969	struct mtk_dai_etdm_priv *etdm_data;1970	struct etdm_con_reg etdm_reg;1971	bool slave_mode;1972	unsigned int etdm_channels;1973	unsigned int val = 0;1974	unsigned int mask = 0;1975	unsigned int bck;1976	unsigned int wlen = get_etdm_wlen(bit_width);1977	int ret;1978 1979	if (!mt8195_afe_etdm_is_valid(dai_id))1980		return -EINVAL;1981 1982	etdm_data = afe_priv->dai_priv[dai_id];1983	slave_mode = etdm_data->slave_mode;1984	ret = get_etdm_reg(dai_id, &etdm_reg);1985	if (ret < 0)1986		return ret;1987 1988	if (etdm_data->cowork_source_id != COWORK_ETDM_NONE)1989		slave_mode = true;1990 1991	dev_dbg(afe->dev, "%s fmt %u data %u lrck %d-%u bck %d, clock %u slv %u\n",1992		__func__, etdm_data->format, etdm_data->data_mode,1993		etdm_data->lrck_inv, etdm_data->lrck_width, etdm_data->bck_inv,1994		etdm_data->clock_mode, etdm_data->slave_mode);1995	dev_dbg(afe->dev, "%s rate %u channels %u bitwidth %u, id %d\n",1996		__func__, rate, channels, bit_width, dai_id);1997 1998	etdm_channels = (etdm_data->data_mode == MTK_DAI_ETDM_DATA_ONE_PIN) ?1999			get_etdm_ch_fixup(channels) : 2;2000 2001	bck = rate * etdm_channels * wlen;2002	if (bck > MT8195_ETDM_NORMAL_MAX_BCK_RATE) {2003		dev_info(afe->dev, "%s bck rate %u not support\n",2004			 __func__, bck);2005		return -EINVAL;2006	}2007 2008	/* con0 */2009	mask |= ETDM_CON0_BIT_LEN_MASK;2010	val |= ETDM_CON0_BIT_LEN(bit_width);2011	mask |= ETDM_CON0_WORD_LEN_MASK;2012	val |= ETDM_CON0_WORD_LEN(wlen);2013	mask |= ETDM_CON0_FORMAT_MASK;2014	val |= ETDM_CON0_FORMAT(etdm_data->format);2015	mask |= ETDM_CON0_CH_NUM_MASK;2016	val |= ETDM_CON0_CH_NUM(etdm_channels);2017 2018	mask |= ETDM_CON0_SLAVE_MODE;2019	if (slave_mode) {2020		if (dai_id == MT8195_AFE_IO_ETDM1_OUT &&2021		    etdm_data->cowork_source_id == COWORK_ETDM_NONE) {2022			dev_info(afe->dev, "%s id %d only support master mode\n",2023				 __func__, dai_id);2024			return -EINVAL;2025		}2026		val |= ETDM_CON0_SLAVE_MODE;2027	}2028	regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val);2029 2030	if (get_etdm_dir(dai_id) == ETDM_IN)2031		mtk_dai_etdm_in_configure(afe, rate, channels, dai_id);2032	else2033		mtk_dai_etdm_out_configure(afe, rate, channels, dai_id);2034 2035	return 0;2036}2037 2038static int mtk_dai_etdm_hw_params(struct snd_pcm_substream *substream,2039				  struct snd_pcm_hw_params *params,2040				  struct snd_soc_dai *dai)2041{2042	int ret = 0;2043	unsigned int rate = params_rate(params);2044	unsigned int bit_width = params_width(params);2045	unsigned int channels = params_channels(params);2046	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2047	struct mt8195_afe_private *afe_priv = afe->platform_priv;2048	struct mtk_dai_etdm_priv *mst_etdm_data;2049	int mst_dai_id;2050	int slv_dai_id;2051	int i;2052 2053	dev_dbg(afe->dev, "%s '%s' period %u-%u\n",2054		__func__, snd_pcm_stream_str(substream),2055		params_period_size(params), params_periods(params));2056 2057	if (is_cowork_mode(dai)) {2058		mst_dai_id = get_etdm_cowork_master_id(dai);2059		if (!mt8195_afe_etdm_is_valid(mst_dai_id))2060			return -EINVAL;2061 2062		ret = mtk_dai_etdm_mclk_configure(afe, mst_dai_id);2063		if (ret)2064			return ret;2065 2066		ret = mtk_dai_etdm_configure(afe, rate, channels,2067					     bit_width, mst_dai_id);2068		if (ret)2069			return ret;2070 2071		mst_etdm_data = afe_priv->dai_priv[mst_dai_id];2072		for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {2073			slv_dai_id = mst_etdm_data->cowork_slv_id[i];2074			ret = mtk_dai_etdm_configure(afe, rate, channels,2075						     bit_width, slv_dai_id);2076			if (ret)2077				return ret;2078 2079			ret = mt8195_etdm_sync_mode_configure(afe, slv_dai_id);2080			if (ret)2081				return ret;2082		}2083	} else {2084		ret = mtk_dai_etdm_mclk_configure(afe, dai->id);2085		if (ret)2086			return ret;2087 2088		ret = mtk_dai_etdm_configure(afe, rate, channels,2089					     bit_width, dai->id);2090	}2091 2092	return ret;2093}2094 2095static int mtk_dai_etdm_trigger(struct snd_pcm_substream *substream, int cmd,2096				struct snd_soc_dai *dai)2097{2098	int ret = 0;2099	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2100	struct mt8195_afe_private *afe_priv = afe->platform_priv;2101	struct mtk_dai_etdm_priv *mst_etdm_data;2102	int mst_dai_id;2103	int slv_dai_id;2104	int i;2105 2106	dev_dbg(afe->dev, "%s(), cmd %d, dai id %d\n", __func__, cmd, dai->id);2107	switch (cmd) {2108	case SNDRV_PCM_TRIGGER_START:2109	case SNDRV_PCM_TRIGGER_RESUME:2110		if (is_cowork_mode(dai)) {2111			mst_dai_id = get_etdm_cowork_master_id(dai);2112			if (!mt8195_afe_etdm_is_valid(mst_dai_id))2113				return -EINVAL;2114 2115			mst_etdm_data = afe_priv->dai_priv[mst_dai_id];2116 2117			//open master first2118			ret |= mt8195_afe_enable_etdm(afe, mst_dai_id);2119			for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {2120				slv_dai_id = mst_etdm_data->cowork_slv_id[i];2121				ret |= mt8195_afe_enable_etdm(afe, slv_dai_id);2122			}2123		} else {2124			ret = mt8195_afe_enable_etdm(afe, dai->id);2125		}2126		break;2127	case SNDRV_PCM_TRIGGER_STOP:2128	case SNDRV_PCM_TRIGGER_SUSPEND:2129		if (is_cowork_mode(dai)) {2130			mst_dai_id = get_etdm_cowork_master_id(dai);2131			if (!mt8195_afe_etdm_is_valid(mst_dai_id))2132				return -EINVAL;2133 2134			mst_etdm_data = afe_priv->dai_priv[mst_dai_id];2135 2136			for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {2137				slv_dai_id = mst_etdm_data->cowork_slv_id[i];2138				ret |= mt8195_afe_disable_etdm(afe, slv_dai_id);2139			}2140			// close master at last2141			ret |= mt8195_afe_disable_etdm(afe, mst_dai_id);2142		} else {2143			ret = mt8195_afe_disable_etdm(afe, dai->id);2144		}2145		break;2146	default:2147		break;2148	}2149	return ret;2150}2151 2152static int mtk_dai_etdm_cal_mclk(struct mtk_base_afe *afe, int freq, int dai_id)2153{2154	struct mt8195_afe_private *afe_priv = afe->platform_priv;2155	struct mtk_dai_etdm_priv *etdm_data;2156	int apll;2157	int apll_rate;2158 2159	if (!mt8195_afe_etdm_is_valid(dai_id))2160		return -EINVAL;2161 2162	etdm_data = afe_priv->dai_priv[dai_id];2163	if (freq == 0) {2164		etdm_data->mclk_freq = freq;2165		return 0;2166	}2167 2168	apll = mt8195_afe_get_default_mclk_source_by_rate(freq);2169	apll_rate = mt8195_afe_get_mclk_source_rate(afe, apll);2170 2171	if (freq > apll_rate) {2172		dev_info(afe->dev, "freq %d > apll rate %d\n", freq, apll_rate);2173		return -EINVAL;2174	}2175 2176	if (apll_rate % freq != 0) {2177		dev_info(afe->dev, "APLL%d cannot generate freq Hz\n", apll);2178		return -EINVAL;2179	}2180 2181	etdm_data->mclk_apll = apll;2182	etdm_data->mclk_freq = freq;2183 2184	return 0;2185}2186 2187static int mtk_dai_etdm_set_sysclk(struct snd_soc_dai *dai,2188				   int clk_id, unsigned int freq, int dir)2189{2190	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2191	struct mt8195_afe_private *afe_priv = afe->platform_priv;2192	struct mtk_dai_etdm_priv *etdm_data;2193	int dai_id;2194 2195	dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n",2196		__func__, dai->id, freq, dir);2197	if (is_cowork_mode(dai))2198		dai_id = get_etdm_cowork_master_id(dai);2199	else2200		dai_id = dai->id;2201 2202	if (!mt8195_afe_etdm_is_valid(dai_id))2203		return -EINVAL;2204 2205	etdm_data = afe_priv->dai_priv[dai_id];2206	etdm_data->mclk_dir = dir;2207	return mtk_dai_etdm_cal_mclk(afe, freq, dai_id);2208}2209 2210static int mtk_dai_etdm_set_tdm_slot(struct snd_soc_dai *dai,2211				     unsigned int tx_mask, unsigned int rx_mask,2212				     int slots, int slot_width)2213{2214	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2215	struct mt8195_afe_private *afe_priv = afe->platform_priv;2216	struct mtk_dai_etdm_priv *etdm_data;2217 2218	if (!mt8195_afe_etdm_is_valid(dai->id))2219		return -EINVAL;2220 2221	etdm_data = afe_priv->dai_priv[dai->id];2222	dev_dbg(dai->dev, "%s id %d slot_width %d\n",2223		__func__, dai->id, slot_width);2224 2225	etdm_data->slots = slots;2226	etdm_data->lrck_width = slot_width;2227	return 0;2228}2229 2230static int mtk_dai_etdm_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)2231{2232	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2233	struct mt8195_afe_private *afe_priv = afe->platform_priv;2234	struct mtk_dai_etdm_priv *etdm_data;2235 2236	if (!mt8195_afe_etdm_is_valid(dai->id))2237		return -EINVAL;2238 2239	etdm_data = afe_priv->dai_priv[dai->id];2240	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {2241	case SND_SOC_DAIFMT_I2S:2242		etdm_data->format = MTK_DAI_ETDM_FORMAT_I2S;2243		break;2244	case SND_SOC_DAIFMT_LEFT_J:2245		etdm_data->format = MTK_DAI_ETDM_FORMAT_LJ;2246		break;2247	case SND_SOC_DAIFMT_RIGHT_J:2248		etdm_data->format = MTK_DAI_ETDM_FORMAT_RJ;2249		break;2250	case SND_SOC_DAIFMT_DSP_A:2251		etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPA;2252		break;2253	case SND_SOC_DAIFMT_DSP_B:2254		etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPB;2255		break;2256	default:2257		return -EINVAL;2258	}2259 2260	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {2261	case SND_SOC_DAIFMT_NB_NF:2262		etdm_data->bck_inv = false;2263		etdm_data->lrck_inv = false;2264		break;2265	case SND_SOC_DAIFMT_NB_IF:2266		etdm_data->bck_inv = false;2267		etdm_data->lrck_inv = true;2268		break;2269	case SND_SOC_DAIFMT_IB_NF:2270		etdm_data->bck_inv = true;2271		etdm_data->lrck_inv = false;2272		break;2273	case SND_SOC_DAIFMT_IB_IF:2274		etdm_data->bck_inv = true;2275		etdm_data->lrck_inv = true;2276		break;2277	default:2278		return -EINVAL;2279	}2280 2281	switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {2282	case SND_SOC_DAIFMT_BC_FC:2283		etdm_data->slave_mode = true;2284		break;2285	case SND_SOC_DAIFMT_BP_FP:2286		etdm_data->slave_mode = false;2287		break;2288	default:2289		return -EINVAL;2290	}2291 2292	return 0;2293}2294 2295static int mtk_dai_hdmitx_dptx_startup(struct snd_pcm_substream *substream,2296				       struct snd_soc_dai *dai)2297{2298	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2299	struct mt8195_afe_private *afe_priv = afe->platform_priv;2300	int cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id);2301 2302	if (cg_id >= 0)2303		mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]);2304 2305	mtk_dai_etdm_enable_mclk(afe, dai->id);2306 2307	return 0;2308}2309 2310static void mtk_dai_hdmitx_dptx_shutdown(struct snd_pcm_substream *substream,2311					 struct snd_soc_dai *dai)2312{2313	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2314	struct mt8195_afe_private *afe_priv = afe->platform_priv;2315	int cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id);2316 2317	mtk_dai_etdm_disable_mclk(afe, dai->id);2318 2319	if (cg_id >= 0)2320		mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]);2321}2322 2323static unsigned int mtk_dai_get_dptx_ch_en(unsigned int channel)2324{2325	switch (channel) {2326	case 1 ... 2:2327		return AFE_DPTX_CON_CH_EN_2CH;2328	case 3 ... 4:2329		return AFE_DPTX_CON_CH_EN_4CH;2330	case 5 ... 6:2331		return AFE_DPTX_CON_CH_EN_6CH;2332	case 7 ... 8:2333		return AFE_DPTX_CON_CH_EN_8CH;2334	default:2335		return AFE_DPTX_CON_CH_EN_2CH;2336	}2337}2338 2339static unsigned int mtk_dai_get_dptx_ch(unsigned int ch)2340{2341	return (ch > 2) ?2342		AFE_DPTX_CON_CH_NUM_8CH : AFE_DPTX_CON_CH_NUM_2CH;2343}2344 2345static unsigned int mtk_dai_get_dptx_wlen(snd_pcm_format_t format)2346{2347	return snd_pcm_format_physical_width(format) <= 16 ?2348		AFE_DPTX_CON_16BIT : AFE_DPTX_CON_24BIT;2349}2350 2351static int mtk_dai_hdmitx_dptx_hw_params(struct snd_pcm_substream *substream,2352					 struct snd_pcm_hw_params *params,2353					 struct snd_soc_dai *dai)2354{2355	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2356	struct mt8195_afe_private *afe_priv = afe->platform_priv;2357	struct mtk_dai_etdm_priv *etdm_data;2358	unsigned int rate = params_rate(params);2359	unsigned int channels = params_channels(params);2360	snd_pcm_format_t format = params_format(params);2361	int width = snd_pcm_format_physical_width(format);2362	int ret = 0;2363 2364	if (!mt8195_afe_hdmitx_dptx_is_valid(dai->id))2365		return -EINVAL;2366 2367	etdm_data = afe_priv->dai_priv[dai->id];2368 2369	/* dptx configure */2370	if (dai->id == MT8195_AFE_IO_DPTX) {2371		regmap_update_bits(afe->regmap, AFE_DPTX_CON,2372				   AFE_DPTX_CON_CH_EN_MASK,2373				   mtk_dai_get_dptx_ch_en(channels));2374		regmap_update_bits(afe->regmap, AFE_DPTX_CON,2375				   AFE_DPTX_CON_CH_NUM_MASK,2376				   mtk_dai_get_dptx_ch(channels));2377		regmap_update_bits(afe->regmap, AFE_DPTX_CON,2378				   AFE_DPTX_CON_16BIT_MASK,2379				   mtk_dai_get_dptx_wlen(format));2380 2381		if (mtk_dai_get_dptx_ch(channels) == AFE_DPTX_CON_CH_NUM_8CH) {2382			etdm_data->data_mode = MTK_DAI_ETDM_DATA_ONE_PIN;2383			channels = 8;2384		} else {2385			channels = 2;2386		}2387	} else {2388		etdm_data->data_mode = MTK_DAI_ETDM_DATA_MULTI_PIN;2389	}2390 2391	ret = mtk_dai_etdm_mclk_configure(afe, dai->id);2392	if (ret)2393		return ret;2394 2395	ret = mtk_dai_etdm_configure(afe, rate, channels, width, dai->id);2396 2397	return ret;2398}2399 2400static int mtk_dai_hdmitx_dptx_trigger(struct snd_pcm_substream *substream,2401				       int cmd,2402				       struct snd_soc_dai *dai)2403{2404	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2405	int ret = 0;2406 2407	dev_dbg(afe->dev, "%s(), cmd %d, dai id %d\n", __func__, cmd, dai->id);2408 2409	switch (cmd) {2410	case SNDRV_PCM_TRIGGER_START:2411	case SNDRV_PCM_TRIGGER_RESUME:2412		/* enable dptx interface */2413		if (dai->id == MT8195_AFE_IO_DPTX)2414			regmap_update_bits(afe->regmap, AFE_DPTX_CON,2415					   AFE_DPTX_CON_ON_MASK,2416					   AFE_DPTX_CON_ON);2417 2418		/* enable etdm_out3 */2419		ret = mt8195_afe_enable_etdm(afe, dai->id);2420		break;2421	case SNDRV_PCM_TRIGGER_STOP:2422	case SNDRV_PCM_TRIGGER_SUSPEND:2423		/* disable etdm_out3 */2424		ret = mt8195_afe_disable_etdm(afe, dai->id);2425 2426		/* disable dptx interface */2427		if (dai->id == MT8195_AFE_IO_DPTX)2428			regmap_update_bits(afe->regmap, AFE_DPTX_CON,2429					   AFE_DPTX_CON_ON_MASK, 0);2430		break;2431	default:2432		return -EINVAL;2433	}2434 2435	return ret;2436}2437 2438static int mtk_dai_hdmitx_dptx_set_sysclk(struct snd_soc_dai *dai,2439					  int clk_id,2440					  unsigned int freq,2441					  int dir)2442{2443	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2444	struct mt8195_afe_private *afe_priv = afe->platform_priv;2445	struct mtk_dai_etdm_priv *etdm_data;2446 2447	if (!mt8195_afe_hdmitx_dptx_is_valid(dai->id))2448		return -EINVAL;2449 2450	etdm_data = afe_priv->dai_priv[dai->id];2451 2452	dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n",2453		__func__, dai->id, freq, dir);2454 2455	etdm_data->mclk_dir = dir;2456	return mtk_dai_etdm_cal_mclk(afe, freq, dai->id);2457}2458 2459/* dai driver */2460#define MTK_ETDM_RATES (SNDRV_PCM_RATE_8000_384000)2461 2462#define MTK_ETDM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\2463			  SNDRV_PCM_FMTBIT_S24_LE |\2464			  SNDRV_PCM_FMTBIT_S32_LE)2465 2466static int mtk_dai_etdm_probe(struct snd_soc_dai *dai)2467{2468	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);2469	struct mt8195_afe_private *afe_priv = afe->platform_priv;2470	struct mtk_dai_etdm_priv *etdm_data;2471 2472	dev_dbg(dai->dev, "%s id %d\n", __func__, dai->id);2473 2474	if (!mt8195_afe_etdm_is_valid(dai->id))2475		return -EINVAL;2476 2477	etdm_data = afe_priv->dai_priv[dai->id];2478	if (etdm_data->mclk_freq) {2479		dev_dbg(afe->dev, "MCLK always on, rate %d\n",2480			etdm_data->mclk_freq);2481		pm_runtime_get_sync(afe->dev);2482		mtk_dai_etdm_mclk_configure(afe, dai->id);2483		mtk_dai_etdm_enable_mclk(afe, dai->id);2484		pm_runtime_put_sync(afe->dev);2485	}2486	return 0;2487}2488 2489static const struct snd_soc_dai_ops mtk_dai_hdmitx_dptx_ops = {2490	.startup	= mtk_dai_hdmitx_dptx_startup,2491	.shutdown	= mtk_dai_hdmitx_dptx_shutdown,2492	.hw_params	= mtk_dai_hdmitx_dptx_hw_params,2493	.trigger	= mtk_dai_hdmitx_dptx_trigger,2494	.set_sysclk	= mtk_dai_hdmitx_dptx_set_sysclk,2495	.set_fmt	= mtk_dai_etdm_set_fmt,2496};2497 2498static const struct snd_soc_dai_ops mtk_dai_hdmitx_dptx_ops2 = {2499	.probe		= mtk_dai_etdm_probe,2500	.startup	= mtk_dai_hdmitx_dptx_startup,2501	.shutdown	= mtk_dai_hdmitx_dptx_shutdown,2502	.hw_params	= mtk_dai_hdmitx_dptx_hw_params,2503	.trigger	= mtk_dai_hdmitx_dptx_trigger,2504	.set_sysclk	= mtk_dai_hdmitx_dptx_set_sysclk,2505	.set_fmt	= mtk_dai_etdm_set_fmt,2506};2507 2508static const struct snd_soc_dai_ops mtk_dai_etdm_ops = {2509	.probe		= mtk_dai_etdm_probe,2510	.startup	= mtk_dai_etdm_startup,2511	.shutdown	= mtk_dai_etdm_shutdown,2512	.hw_params	= mtk_dai_etdm_hw_params,2513	.trigger	= mtk_dai_etdm_trigger,2514	.set_sysclk	= mtk_dai_etdm_set_sysclk,2515	.set_fmt	= mtk_dai_etdm_set_fmt,2516	.set_tdm_slot	= mtk_dai_etdm_set_tdm_slot,2517};2518 2519static struct snd_soc_dai_driver mtk_dai_etdm_driver[] = {2520	{2521		.name = "DPTX",2522		.id = MT8195_AFE_IO_DPTX,2523		.playback = {2524			.stream_name = "DPTX Playback",2525			.channels_min = 1,2526			.channels_max = 8,2527			.rates = MTK_ETDM_RATES,2528			.formats = MTK_ETDM_FORMATS,2529		},2530		.ops = &mtk_dai_hdmitx_dptx_ops,2531	},2532	{2533		.name = "ETDM1_IN",2534		.id = MT8195_AFE_IO_ETDM1_IN,2535		.capture = {2536			.stream_name = "ETDM1 Capture",2537			.channels_min = 1,2538			.channels_max = 24,2539			.rates = MTK_ETDM_RATES,2540			.formats = MTK_ETDM_FORMATS,2541		},2542		.ops = &mtk_dai_etdm_ops,2543	},2544	{2545		.name = "ETDM2_IN",2546		.id = MT8195_AFE_IO_ETDM2_IN,2547		.capture = {2548			.stream_name = "ETDM2 Capture",2549			.channels_min = 1,2550			.channels_max = 16,2551			.rates = MTK_ETDM_RATES,2552			.formats = MTK_ETDM_FORMATS,2553		},2554		.ops = &mtk_dai_etdm_ops,2555	},2556	{2557		.name = "ETDM1_OUT",2558		.id = MT8195_AFE_IO_ETDM1_OUT,2559		.playback = {2560			.stream_name = "ETDM1 Playback",2561			.channels_min = 1,2562			.channels_max = 24,2563			.rates = MTK_ETDM_RATES,2564			.formats = MTK_ETDM_FORMATS,2565		},2566		.ops = &mtk_dai_etdm_ops,2567	},2568	{2569		.name = "ETDM2_OUT",2570		.id = MT8195_AFE_IO_ETDM2_OUT,2571		.playback = {2572			.stream_name = "ETDM2 Playback",2573			.channels_min = 1,2574			.channels_max = 24,2575			.rates = MTK_ETDM_RATES,2576			.formats = MTK_ETDM_FORMATS,2577		},2578		.ops = &mtk_dai_etdm_ops,2579	},2580	{2581		.name = "ETDM3_OUT",2582		.id = MT8195_AFE_IO_ETDM3_OUT,2583		.playback = {2584			.stream_name = "ETDM3 Playback",2585			.channels_min = 1,2586			.channels_max = 8,2587			.rates = MTK_ETDM_RATES,2588			.formats = MTK_ETDM_FORMATS,2589		},2590		.ops = &mtk_dai_hdmitx_dptx_ops2,2591	},2592};2593 2594static void mt8195_etdm_update_sync_info(struct mtk_base_afe *afe)2595{2596	struct mt8195_afe_private *afe_priv = afe->platform_priv;2597	struct mtk_dai_etdm_priv *etdm_data;2598	struct mtk_dai_etdm_priv *mst_data;2599	int i;2600	int mst_dai_id;2601 2602	for (i = MT8195_AFE_IO_ETDM_START; i < MT8195_AFE_IO_ETDM_END; i++) {2603		etdm_data = afe_priv->dai_priv[i];2604		if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) {2605			mst_dai_id = etdm_data->cowork_source_id;2606			if (!mt8195_afe_etdm_is_valid(mst_dai_id)) {2607				dev_err(afe->dev, "%s invalid dai id %d\n",2608					__func__, mst_dai_id);2609				return;2610			}2611			mst_data = afe_priv->dai_priv[mst_dai_id];2612			if (mst_data->cowork_source_id != COWORK_ETDM_NONE)2613				dev_info(afe->dev, "%s [%d] wrong sync source\n"2614					 , __func__, i);2615			mst_data->cowork_slv_id[mst_data->cowork_slv_count] = i;2616			mst_data->cowork_slv_count++;2617		}2618	}2619}2620 2621static void mt8195_dai_etdm_parse_of(struct mtk_base_afe *afe)2622{2623	const struct device_node *of_node = afe->dev->of_node;2624	struct mt8195_afe_private *afe_priv = afe->platform_priv;2625	struct mtk_dai_etdm_priv *etdm_data;2626	int i, j;2627	char prop[48];2628	u8 disable_chn[MT8195_ETDM_MAX_CHANNELS];2629	int max_chn = MT8195_ETDM_MAX_CHANNELS;2630	u32 sel;2631	int ret;2632	int dai_id;2633	unsigned int sync_id;2634	struct {2635		const char *name;2636		const unsigned int sync_id;2637	} of_afe_etdms[MT8195_AFE_IO_ETDM_NUM] = {2638		{"etdm-in1", ETDM_SYNC_FROM_IN1},2639		{"etdm-in2", ETDM_SYNC_FROM_IN2},2640		{"etdm-out1", ETDM_SYNC_FROM_OUT1},2641		{"etdm-out2", ETDM_SYNC_FROM_OUT2},2642		{"etdm-out3", ETDM_SYNC_FROM_OUT3},2643	};2644 2645	for (i = 0; i < MT8195_AFE_IO_ETDM_NUM; i++) {2646		dai_id = ETDM_TO_DAI_ID(i);2647		if (!mt8195_afe_etdm_is_valid(dai_id)) {2648			dev_err(afe->dev, "%s invalid dai id %d\n",2649				__func__, dai_id);2650			return;2651		}2652 2653		etdm_data = afe_priv->dai_priv[dai_id];2654 2655		ret = snprintf(prop, sizeof(prop),2656			       "mediatek,%s-mclk-always-on-rate",2657			       of_afe_etdms[i].name);2658		if (ret < 0) {2659			dev_info(afe->dev, "%s snprintf err=%d\n",2660				 __func__, ret);2661			return;2662		}2663		ret = of_property_read_u32(of_node, prop, &sel);2664		if (ret == 0) {2665			etdm_data->mclk_dir = SND_SOC_CLOCK_OUT;2666			if (mtk_dai_etdm_cal_mclk(afe, sel, dai_id))2667				dev_info(afe->dev, "%s unsupported mclk %uHz\n",2668					 __func__, sel);2669		}2670 2671		ret = snprintf(prop, sizeof(prop),2672			       "mediatek,%s-multi-pin-mode",2673			       of_afe_etdms[i].name);2674		if (ret < 0) {2675			dev_info(afe->dev, "%s snprintf err=%d\n",2676				 __func__, ret);2677			return;2678		}2679		etdm_data->data_mode = of_property_read_bool(of_node, prop);2680 2681		ret = snprintf(prop, sizeof(prop),2682			       "mediatek,%s-cowork-source",2683			       of_afe_etdms[i].name);2684		if (ret < 0) {2685			dev_info(afe->dev, "%s snprintf err=%d\n",2686				 __func__, ret);2687			return;2688		}2689		ret = of_property_read_u32(of_node, prop, &sel);2690		if (ret == 0) {2691			if (sel >= MT8195_AFE_IO_ETDM_NUM) {2692				dev_info(afe->dev, "%s invalid id=%d\n",2693					 __func__, sel);2694				etdm_data->cowork_source_id = COWORK_ETDM_NONE;2695			} else {2696				sync_id = of_afe_etdms[sel].sync_id;2697				etdm_data->cowork_source_id =2698					sync_to_dai_id(sync_id);2699			}2700		} else {2701			etdm_data->cowork_source_id = COWORK_ETDM_NONE;2702		}2703	}2704 2705	/* etdm in only */2706	for (i = 0; i < 2; i++) {2707		dai_id = ETDM_TO_DAI_ID(i);2708		etdm_data = afe_priv->dai_priv[dai_id];2709 2710		ret = snprintf(prop, sizeof(prop),2711			       "mediatek,%s-chn-disabled",2712			       of_afe_etdms[i].name);2713		if (ret < 0) {2714			dev_info(afe->dev, "%s snprintf err=%d\n",2715				 __func__, ret);2716			return;2717		}2718		ret = of_property_read_variable_u8_array(of_node, prop,2719							 disable_chn,2720							 1, max_chn);2721		if (ret < 0)2722			continue;2723 2724		for (j = 0; j < ret; j++) {2725			if (disable_chn[j] >= MT8195_ETDM_MAX_CHANNELS)2726				dev_info(afe->dev, "%s [%d] invalid chn %u\n",2727					 __func__, j, disable_chn[j]);2728			else2729				etdm_data->in_disable_ch[disable_chn[j]] = true;2730		}2731	}2732	mt8195_etdm_update_sync_info(afe);2733}2734 2735static int init_etdm_priv_data(struct mtk_base_afe *afe)2736{2737	struct mt8195_afe_private *afe_priv = afe->platform_priv;2738	struct mtk_dai_etdm_priv *etdm_priv;2739	int i;2740 2741	for (i = MT8195_AFE_IO_ETDM_START; i < MT8195_AFE_IO_ETDM_END; i++) {2742		etdm_priv = devm_kzalloc(afe->dev,2743					 sizeof(struct mtk_dai_etdm_priv),2744					 GFP_KERNEL);2745		if (!etdm_priv)2746			return -ENOMEM;2747 2748		afe_priv->dai_priv[i] = etdm_priv;2749	}2750 2751	afe_priv->dai_priv[MT8195_AFE_IO_DPTX] =2752		afe_priv->dai_priv[MT8195_AFE_IO_ETDM3_OUT];2753 2754	mt8195_dai_etdm_parse_of(afe);2755	return 0;2756}2757 2758int mt8195_dai_etdm_register(struct mtk_base_afe *afe)2759{2760	struct mtk_base_afe_dai *dai;2761 2762	dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);2763	if (!dai)2764		return -ENOMEM;2765 2766	list_add(&dai->list, &afe->sub_dais);2767 2768	dai->dai_drivers = mtk_dai_etdm_driver;2769	dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_etdm_driver);2770 2771	dai->dapm_widgets = mtk_dai_etdm_widgets;2772	dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_etdm_widgets);2773	dai->dapm_routes = mtk_dai_etdm_routes;2774	dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_etdm_routes);2775	dai->controls = mtk_dai_etdm_controls;2776	dai->num_controls = ARRAY_SIZE(mtk_dai_etdm_controls);2777 2778	return init_etdm_priv_data(afe);2779}2780