162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * MediaTek ALSA SoC Audio DAI eTDM Control
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (c) 2021 MediaTek Inc.
662306a36Sopenharmony_ci * Author: Bicycle Tsai <bicycle.tsai@mediatek.com>
762306a36Sopenharmony_ci *         Trevor Wu <trevor.wu@mediatek.com>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/delay.h>
1162306a36Sopenharmony_ci#include <linux/pm_runtime.h>
1262306a36Sopenharmony_ci#include <linux/regmap.h>
1362306a36Sopenharmony_ci#include <sound/pcm_params.h>
1462306a36Sopenharmony_ci#include "mt8195-afe-clk.h"
1562306a36Sopenharmony_ci#include "mt8195-afe-common.h"
1662306a36Sopenharmony_ci#include "mt8195-reg.h"
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define MT8195_ETDM_MAX_CHANNELS 24
1962306a36Sopenharmony_ci#define MT8195_ETDM_NORMAL_MAX_BCK_RATE 24576000
2062306a36Sopenharmony_ci#define ETDM_TO_DAI_ID(x) ((x) + MT8195_AFE_IO_ETDM_START)
2162306a36Sopenharmony_ci#define ENUM_TO_STR(x)	#x
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cienum {
2462306a36Sopenharmony_ci	MTK_DAI_ETDM_FORMAT_I2S = 0,
2562306a36Sopenharmony_ci	MTK_DAI_ETDM_FORMAT_LJ,
2662306a36Sopenharmony_ci	MTK_DAI_ETDM_FORMAT_RJ,
2762306a36Sopenharmony_ci	MTK_DAI_ETDM_FORMAT_EIAJ,
2862306a36Sopenharmony_ci	MTK_DAI_ETDM_FORMAT_DSPA,
2962306a36Sopenharmony_ci	MTK_DAI_ETDM_FORMAT_DSPB,
3062306a36Sopenharmony_ci};
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cienum {
3362306a36Sopenharmony_ci	MTK_DAI_ETDM_DATA_ONE_PIN = 0,
3462306a36Sopenharmony_ci	MTK_DAI_ETDM_DATA_MULTI_PIN,
3562306a36Sopenharmony_ci};
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cienum {
3862306a36Sopenharmony_ci	ETDM_IN,
3962306a36Sopenharmony_ci	ETDM_OUT,
4062306a36Sopenharmony_ci};
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cienum {
4362306a36Sopenharmony_ci	ETDM_IN_FROM_PAD,
4462306a36Sopenharmony_ci	ETDM_IN_FROM_ETDM_OUT1,
4562306a36Sopenharmony_ci	ETDM_IN_FROM_ETDM_OUT2,
4662306a36Sopenharmony_ci};
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cienum {
4962306a36Sopenharmony_ci	ETDM_IN_SLAVE_FROM_PAD,
5062306a36Sopenharmony_ci	ETDM_IN_SLAVE_FROM_ETDM_OUT1,
5162306a36Sopenharmony_ci	ETDM_IN_SLAVE_FROM_ETDM_OUT2,
5262306a36Sopenharmony_ci};
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cienum {
5562306a36Sopenharmony_ci	ETDM_OUT_SLAVE_FROM_PAD,
5662306a36Sopenharmony_ci	ETDM_OUT_SLAVE_FROM_ETDM_IN1,
5762306a36Sopenharmony_ci	ETDM_OUT_SLAVE_FROM_ETDM_IN2,
5862306a36Sopenharmony_ci};
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cienum {
6162306a36Sopenharmony_ci	COWORK_ETDM_NONE = 0,
6262306a36Sopenharmony_ci	COWORK_ETDM_IN1_M = 2,
6362306a36Sopenharmony_ci	COWORK_ETDM_IN1_S = 3,
6462306a36Sopenharmony_ci	COWORK_ETDM_IN2_M = 4,
6562306a36Sopenharmony_ci	COWORK_ETDM_IN2_S = 5,
6662306a36Sopenharmony_ci	COWORK_ETDM_OUT1_M = 10,
6762306a36Sopenharmony_ci	COWORK_ETDM_OUT1_S = 11,
6862306a36Sopenharmony_ci	COWORK_ETDM_OUT2_M = 12,
6962306a36Sopenharmony_ci	COWORK_ETDM_OUT2_S = 13,
7062306a36Sopenharmony_ci	COWORK_ETDM_OUT3_M = 14,
7162306a36Sopenharmony_ci	COWORK_ETDM_OUT3_S = 15,
7262306a36Sopenharmony_ci};
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_cienum {
7562306a36Sopenharmony_ci	ETDM_RELATCH_TIMING_A1A2SYS,
7662306a36Sopenharmony_ci	ETDM_RELATCH_TIMING_A3SYS,
7762306a36Sopenharmony_ci	ETDM_RELATCH_TIMING_A4SYS,
7862306a36Sopenharmony_ci};
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_cienum {
8162306a36Sopenharmony_ci	ETDM_SYNC_NONE,
8262306a36Sopenharmony_ci	ETDM_SYNC_FROM_IN1,
8362306a36Sopenharmony_ci	ETDM_SYNC_FROM_IN2,
8462306a36Sopenharmony_ci	ETDM_SYNC_FROM_OUT1,
8562306a36Sopenharmony_ci	ETDM_SYNC_FROM_OUT2,
8662306a36Sopenharmony_ci	ETDM_SYNC_FROM_OUT3,
8762306a36Sopenharmony_ci};
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_cistruct etdm_con_reg {
9062306a36Sopenharmony_ci	unsigned int con0;
9162306a36Sopenharmony_ci	unsigned int con1;
9262306a36Sopenharmony_ci	unsigned int con2;
9362306a36Sopenharmony_ci	unsigned int con3;
9462306a36Sopenharmony_ci	unsigned int con4;
9562306a36Sopenharmony_ci	unsigned int con5;
9662306a36Sopenharmony_ci};
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_cistruct mtk_dai_etdm_rate {
9962306a36Sopenharmony_ci	unsigned int rate;
10062306a36Sopenharmony_ci	unsigned int reg_value;
10162306a36Sopenharmony_ci};
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_cistruct mtk_dai_etdm_priv {
10462306a36Sopenharmony_ci	unsigned int clock_mode;
10562306a36Sopenharmony_ci	unsigned int data_mode;
10662306a36Sopenharmony_ci	bool slave_mode;
10762306a36Sopenharmony_ci	bool lrck_inv;
10862306a36Sopenharmony_ci	bool bck_inv;
10962306a36Sopenharmony_ci	unsigned int format;
11062306a36Sopenharmony_ci	unsigned int slots;
11162306a36Sopenharmony_ci	unsigned int lrck_width;
11262306a36Sopenharmony_ci	unsigned int mclk_freq;
11362306a36Sopenharmony_ci	unsigned int mclk_apll;
11462306a36Sopenharmony_ci	unsigned int mclk_dir;
11562306a36Sopenharmony_ci	int cowork_source_id; //dai id
11662306a36Sopenharmony_ci	unsigned int cowork_slv_count;
11762306a36Sopenharmony_ci	int cowork_slv_id[MT8195_AFE_IO_ETDM_NUM - 1]; //dai_id
11862306a36Sopenharmony_ci	bool in_disable_ch[MT8195_ETDM_MAX_CHANNELS];
11962306a36Sopenharmony_ci	unsigned int en_ref_cnt;
12062306a36Sopenharmony_ci};
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_cistatic const struct mtk_dai_etdm_rate mt8195_etdm_rates[] = {
12362306a36Sopenharmony_ci	{ .rate = 8000, .reg_value = 0, },
12462306a36Sopenharmony_ci	{ .rate = 12000, .reg_value = 1, },
12562306a36Sopenharmony_ci	{ .rate = 16000, .reg_value = 2, },
12662306a36Sopenharmony_ci	{ .rate = 24000, .reg_value = 3, },
12762306a36Sopenharmony_ci	{ .rate = 32000, .reg_value = 4, },
12862306a36Sopenharmony_ci	{ .rate = 48000, .reg_value = 5, },
12962306a36Sopenharmony_ci	{ .rate = 96000, .reg_value = 7, },
13062306a36Sopenharmony_ci	{ .rate = 192000, .reg_value = 9, },
13162306a36Sopenharmony_ci	{ .rate = 384000, .reg_value = 11, },
13262306a36Sopenharmony_ci	{ .rate = 11025, .reg_value = 16, },
13362306a36Sopenharmony_ci	{ .rate = 22050, .reg_value = 17, },
13462306a36Sopenharmony_ci	{ .rate = 44100, .reg_value = 18, },
13562306a36Sopenharmony_ci	{ .rate = 88200, .reg_value = 19, },
13662306a36Sopenharmony_ci	{ .rate = 176400, .reg_value = 20, },
13762306a36Sopenharmony_ci	{ .rate = 352800, .reg_value = 21, },
13862306a36Sopenharmony_ci};
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_cistatic bool mt8195_afe_etdm_is_valid(int id)
14162306a36Sopenharmony_ci{
14262306a36Sopenharmony_ci	switch (id) {
14362306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM1_IN:
14462306a36Sopenharmony_ci		fallthrough;
14562306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM2_IN:
14662306a36Sopenharmony_ci		fallthrough;
14762306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM1_OUT:
14862306a36Sopenharmony_ci		fallthrough;
14962306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM2_OUT:
15062306a36Sopenharmony_ci		fallthrough;
15162306a36Sopenharmony_ci	case MT8195_AFE_IO_DPTX:
15262306a36Sopenharmony_ci		fallthrough;
15362306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM3_OUT:
15462306a36Sopenharmony_ci		return true;
15562306a36Sopenharmony_ci	default:
15662306a36Sopenharmony_ci		return false;
15762306a36Sopenharmony_ci	}
15862306a36Sopenharmony_ci}
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_cistatic bool mt8195_afe_hdmitx_dptx_is_valid(int id)
16162306a36Sopenharmony_ci{
16262306a36Sopenharmony_ci	switch (id) {
16362306a36Sopenharmony_ci	case MT8195_AFE_IO_DPTX:
16462306a36Sopenharmony_ci		fallthrough;
16562306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM3_OUT:
16662306a36Sopenharmony_ci		return true;
16762306a36Sopenharmony_ci	default:
16862306a36Sopenharmony_ci		return false;
16962306a36Sopenharmony_ci	}
17062306a36Sopenharmony_ci}
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_cistatic int get_etdm_fs_timing(unsigned int rate)
17362306a36Sopenharmony_ci{
17462306a36Sopenharmony_ci	int i;
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(mt8195_etdm_rates); i++)
17762306a36Sopenharmony_ci		if (mt8195_etdm_rates[i].rate == rate)
17862306a36Sopenharmony_ci			return mt8195_etdm_rates[i].reg_value;
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci	return -EINVAL;
18162306a36Sopenharmony_ci}
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_cistatic unsigned int get_etdm_ch_fixup(unsigned int channels)
18462306a36Sopenharmony_ci{
18562306a36Sopenharmony_ci	if (channels > 16)
18662306a36Sopenharmony_ci		return 24;
18762306a36Sopenharmony_ci	else if (channels > 8)
18862306a36Sopenharmony_ci		return 16;
18962306a36Sopenharmony_ci	else if (channels > 4)
19062306a36Sopenharmony_ci		return 8;
19162306a36Sopenharmony_ci	else if (channels > 2)
19262306a36Sopenharmony_ci		return 4;
19362306a36Sopenharmony_ci	else
19462306a36Sopenharmony_ci		return 2;
19562306a36Sopenharmony_ci}
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_cistatic int get_etdm_reg(unsigned int dai_id, struct etdm_con_reg *etdm_reg)
19862306a36Sopenharmony_ci{
19962306a36Sopenharmony_ci	switch (dai_id) {
20062306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM1_IN:
20162306a36Sopenharmony_ci		etdm_reg->con0 = ETDM_IN1_CON0;
20262306a36Sopenharmony_ci		etdm_reg->con1 = ETDM_IN1_CON1;
20362306a36Sopenharmony_ci		etdm_reg->con2 = ETDM_IN1_CON2;
20462306a36Sopenharmony_ci		etdm_reg->con3 = ETDM_IN1_CON3;
20562306a36Sopenharmony_ci		etdm_reg->con4 = ETDM_IN1_CON4;
20662306a36Sopenharmony_ci		etdm_reg->con5 = ETDM_IN1_CON5;
20762306a36Sopenharmony_ci		break;
20862306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM2_IN:
20962306a36Sopenharmony_ci		etdm_reg->con0 = ETDM_IN2_CON0;
21062306a36Sopenharmony_ci		etdm_reg->con1 = ETDM_IN2_CON1;
21162306a36Sopenharmony_ci		etdm_reg->con2 = ETDM_IN2_CON2;
21262306a36Sopenharmony_ci		etdm_reg->con3 = ETDM_IN2_CON3;
21362306a36Sopenharmony_ci		etdm_reg->con4 = ETDM_IN2_CON4;
21462306a36Sopenharmony_ci		etdm_reg->con5 = ETDM_IN2_CON5;
21562306a36Sopenharmony_ci		break;
21662306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM1_OUT:
21762306a36Sopenharmony_ci		etdm_reg->con0 = ETDM_OUT1_CON0;
21862306a36Sopenharmony_ci		etdm_reg->con1 = ETDM_OUT1_CON1;
21962306a36Sopenharmony_ci		etdm_reg->con2 = ETDM_OUT1_CON2;
22062306a36Sopenharmony_ci		etdm_reg->con3 = ETDM_OUT1_CON3;
22162306a36Sopenharmony_ci		etdm_reg->con4 = ETDM_OUT1_CON4;
22262306a36Sopenharmony_ci		etdm_reg->con5 = ETDM_OUT1_CON5;
22362306a36Sopenharmony_ci		break;
22462306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM2_OUT:
22562306a36Sopenharmony_ci		etdm_reg->con0 = ETDM_OUT2_CON0;
22662306a36Sopenharmony_ci		etdm_reg->con1 = ETDM_OUT2_CON1;
22762306a36Sopenharmony_ci		etdm_reg->con2 = ETDM_OUT2_CON2;
22862306a36Sopenharmony_ci		etdm_reg->con3 = ETDM_OUT2_CON3;
22962306a36Sopenharmony_ci		etdm_reg->con4 = ETDM_OUT2_CON4;
23062306a36Sopenharmony_ci		etdm_reg->con5 = ETDM_OUT2_CON5;
23162306a36Sopenharmony_ci		break;
23262306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM3_OUT:
23362306a36Sopenharmony_ci	case MT8195_AFE_IO_DPTX:
23462306a36Sopenharmony_ci		etdm_reg->con0 = ETDM_OUT3_CON0;
23562306a36Sopenharmony_ci		etdm_reg->con1 = ETDM_OUT3_CON1;
23662306a36Sopenharmony_ci		etdm_reg->con2 = ETDM_OUT3_CON2;
23762306a36Sopenharmony_ci		etdm_reg->con3 = ETDM_OUT3_CON3;
23862306a36Sopenharmony_ci		etdm_reg->con4 = ETDM_OUT3_CON4;
23962306a36Sopenharmony_ci		etdm_reg->con5 = ETDM_OUT3_CON5;
24062306a36Sopenharmony_ci		break;
24162306a36Sopenharmony_ci	default:
24262306a36Sopenharmony_ci		return -EINVAL;
24362306a36Sopenharmony_ci	}
24462306a36Sopenharmony_ci	return 0;
24562306a36Sopenharmony_ci}
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_cistatic int get_etdm_dir(unsigned int dai_id)
24862306a36Sopenharmony_ci{
24962306a36Sopenharmony_ci	switch (dai_id) {
25062306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM1_IN:
25162306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM2_IN:
25262306a36Sopenharmony_ci		return ETDM_IN;
25362306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM1_OUT:
25462306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM2_OUT:
25562306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM3_OUT:
25662306a36Sopenharmony_ci		return ETDM_OUT;
25762306a36Sopenharmony_ci	default:
25862306a36Sopenharmony_ci		return -EINVAL;
25962306a36Sopenharmony_ci	}
26062306a36Sopenharmony_ci}
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_cistatic int get_etdm_wlen(unsigned int bitwidth)
26362306a36Sopenharmony_ci{
26462306a36Sopenharmony_ci	return bitwidth <= 16 ? 16 : 32;
26562306a36Sopenharmony_ci}
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_cistatic int is_cowork_mode(struct snd_soc_dai *dai)
26862306a36Sopenharmony_ci{
26962306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
27062306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
27162306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *etdm_data;
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ci	if (!mt8195_afe_etdm_is_valid(dai->id))
27462306a36Sopenharmony_ci		return -EINVAL;
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_ci	etdm_data = afe_priv->dai_priv[dai->id];
27762306a36Sopenharmony_ci	return (etdm_data->cowork_slv_count > 0 ||
27862306a36Sopenharmony_ci		etdm_data->cowork_source_id != COWORK_ETDM_NONE);
27962306a36Sopenharmony_ci}
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_cistatic int sync_to_dai_id(int source_sel)
28262306a36Sopenharmony_ci{
28362306a36Sopenharmony_ci	switch (source_sel) {
28462306a36Sopenharmony_ci	case ETDM_SYNC_FROM_IN1:
28562306a36Sopenharmony_ci		return MT8195_AFE_IO_ETDM1_IN;
28662306a36Sopenharmony_ci	case ETDM_SYNC_FROM_IN2:
28762306a36Sopenharmony_ci		return MT8195_AFE_IO_ETDM2_IN;
28862306a36Sopenharmony_ci	case ETDM_SYNC_FROM_OUT1:
28962306a36Sopenharmony_ci		return MT8195_AFE_IO_ETDM1_OUT;
29062306a36Sopenharmony_ci	case ETDM_SYNC_FROM_OUT2:
29162306a36Sopenharmony_ci		return MT8195_AFE_IO_ETDM2_OUT;
29262306a36Sopenharmony_ci	case ETDM_SYNC_FROM_OUT3:
29362306a36Sopenharmony_ci		return MT8195_AFE_IO_ETDM3_OUT;
29462306a36Sopenharmony_ci	default:
29562306a36Sopenharmony_ci		return 0;
29662306a36Sopenharmony_ci	}
29762306a36Sopenharmony_ci}
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_cistatic int get_etdm_cowork_master_id(struct snd_soc_dai *dai)
30062306a36Sopenharmony_ci{
30162306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
30262306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
30362306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *etdm_data;
30462306a36Sopenharmony_ci	int dai_id;
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci	if (!mt8195_afe_etdm_is_valid(dai->id))
30762306a36Sopenharmony_ci		return -EINVAL;
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci	etdm_data = afe_priv->dai_priv[dai->id];
31062306a36Sopenharmony_ci	dai_id = etdm_data->cowork_source_id;
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ci	if (dai_id == COWORK_ETDM_NONE)
31362306a36Sopenharmony_ci		dai_id = dai->id;
31462306a36Sopenharmony_ci
31562306a36Sopenharmony_ci	return dai_id;
31662306a36Sopenharmony_ci}
31762306a36Sopenharmony_ci
31862306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o048_mix[] = {
31962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN48, 20, 1, 0),
32062306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN48, 22, 1, 0),
32162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN48_1, 14, 1, 0),
32262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN48_2, 6, 1, 0),
32362306a36Sopenharmony_ci};
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o049_mix[] = {
32662306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN49, 21, 1, 0),
32762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN49, 23, 1, 0),
32862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN49_1, 15, 1, 0),
32962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN49_2, 7, 1, 0),
33062306a36Sopenharmony_ci};
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o050_mix[] = {
33362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN50, 24, 1, 0),
33462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN50_1, 16, 1, 0),
33562306a36Sopenharmony_ci};
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o051_mix[] = {
33862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN51, 25, 1, 0),
33962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN51_1, 17, 1, 0),
34062306a36Sopenharmony_ci};
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o052_mix[] = {
34362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN52, 26, 1, 0),
34462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN52_1, 18, 1, 0),
34562306a36Sopenharmony_ci};
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o053_mix[] = {
34862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN53, 27, 1, 0),
34962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN53_1, 19, 1, 0),
35062306a36Sopenharmony_ci};
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o054_mix[] = {
35362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN54, 28, 1, 0),
35462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN54_1, 20, 1, 0),
35562306a36Sopenharmony_ci};
35662306a36Sopenharmony_ci
35762306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o055_mix[] = {
35862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN55, 29, 1, 0),
35962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN55_1, 21, 1, 0),
36062306a36Sopenharmony_ci};
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o056_mix[] = {
36362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN56, 30, 1, 0),
36462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I054 Switch", AFE_CONN56_1, 22, 1, 0),
36562306a36Sopenharmony_ci};
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o057_mix[] = {
36862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN57, 31, 1, 0),
36962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I055 Switch", AFE_CONN57_1, 23, 1, 0),
37062306a36Sopenharmony_ci};
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o058_mix[] = {
37362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN58_1, 0, 1, 0),
37462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I056 Switch", AFE_CONN58_1, 24, 1, 0),
37562306a36Sopenharmony_ci};
37662306a36Sopenharmony_ci
37762306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o059_mix[] = {
37862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN59_1, 1, 1, 0),
37962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I057 Switch", AFE_CONN59_1, 25, 1, 0),
38062306a36Sopenharmony_ci};
38162306a36Sopenharmony_ci
38262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o060_mix[] = {
38362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN60_1, 2, 1, 0),
38462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I058 Switch", AFE_CONN60_1, 26, 1, 0),
38562306a36Sopenharmony_ci};
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o061_mix[] = {
38862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN61_1, 3, 1, 0),
38962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I059 Switch", AFE_CONN61_1, 27, 1, 0),
39062306a36Sopenharmony_ci};
39162306a36Sopenharmony_ci
39262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o062_mix[] = {
39362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN62_1, 4, 1, 0),
39462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I060 Switch", AFE_CONN62_1, 28, 1, 0),
39562306a36Sopenharmony_ci};
39662306a36Sopenharmony_ci
39762306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o063_mix[] = {
39862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN63_1, 5, 1, 0),
39962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I061 Switch", AFE_CONN63_1, 29, 1, 0),
40062306a36Sopenharmony_ci};
40162306a36Sopenharmony_ci
40262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o064_mix[] = {
40362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I038 Switch", AFE_CONN64_1, 6, 1, 0),
40462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I062 Switch", AFE_CONN64_1, 30, 1, 0),
40562306a36Sopenharmony_ci};
40662306a36Sopenharmony_ci
40762306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o065_mix[] = {
40862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I039 Switch", AFE_CONN65_1, 7, 1, 0),
40962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I063 Switch", AFE_CONN65_1, 31, 1, 0),
41062306a36Sopenharmony_ci};
41162306a36Sopenharmony_ci
41262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o066_mix[] = {
41362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I040 Switch", AFE_CONN66_1, 8, 1, 0),
41462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I064 Switch", AFE_CONN66_2, 0, 1, 0),
41562306a36Sopenharmony_ci};
41662306a36Sopenharmony_ci
41762306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o067_mix[] = {
41862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I041 Switch", AFE_CONN67_1, 9, 1, 0),
41962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I065 Switch", AFE_CONN67_2, 1, 1, 0),
42062306a36Sopenharmony_ci};
42162306a36Sopenharmony_ci
42262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o068_mix[] = {
42362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I042 Switch", AFE_CONN68_1, 10, 1, 0),
42462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I066 Switch", AFE_CONN68_2, 2, 1, 0),
42562306a36Sopenharmony_ci};
42662306a36Sopenharmony_ci
42762306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o069_mix[] = {
42862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I043 Switch", AFE_CONN69_1, 11, 1, 0),
42962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I067 Switch", AFE_CONN69_2, 3, 1, 0),
43062306a36Sopenharmony_ci};
43162306a36Sopenharmony_ci
43262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o070_mix[] = {
43362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I044 Switch", AFE_CONN70_1, 12, 1, 0),
43462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I068 Switch", AFE_CONN70_2, 4, 1, 0),
43562306a36Sopenharmony_ci};
43662306a36Sopenharmony_ci
43762306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o071_mix[] = {
43862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I045 Switch", AFE_CONN71_1, 13, 1, 0),
43962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I069 Switch", AFE_CONN71_2, 5, 1, 0),
44062306a36Sopenharmony_ci};
44162306a36Sopenharmony_ci
44262306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o072_mix[] = {
44362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN72, 20, 1, 0),
44462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN72, 22, 1, 0),
44562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN72_1, 14, 1, 0),
44662306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN72_2, 6, 1, 0),
44762306a36Sopenharmony_ci};
44862306a36Sopenharmony_ci
44962306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o073_mix[] = {
45062306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN73, 21, 1, 0),
45162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN73, 23, 1, 0),
45262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN73_1, 15, 1, 0),
45362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN73_2, 7, 1, 0),
45462306a36Sopenharmony_ci};
45562306a36Sopenharmony_ci
45662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o074_mix[] = {
45762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN74, 24, 1, 0),
45862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN74_1, 16, 1, 0),
45962306a36Sopenharmony_ci};
46062306a36Sopenharmony_ci
46162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o075_mix[] = {
46262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN75, 25, 1, 0),
46362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN75_1, 17, 1, 0),
46462306a36Sopenharmony_ci};
46562306a36Sopenharmony_ci
46662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o076_mix[] = {
46762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN76, 26, 1, 0),
46862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN76_1, 18, 1, 0),
46962306a36Sopenharmony_ci};
47062306a36Sopenharmony_ci
47162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o077_mix[] = {
47262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN77, 27, 1, 0),
47362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN77_1, 19, 1, 0),
47462306a36Sopenharmony_ci};
47562306a36Sopenharmony_ci
47662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o078_mix[] = {
47762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN78, 28, 1, 0),
47862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN78_1, 20, 1, 0),
47962306a36Sopenharmony_ci};
48062306a36Sopenharmony_ci
48162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o079_mix[] = {
48262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN79, 29, 1, 0),
48362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN79_1, 21, 1, 0),
48462306a36Sopenharmony_ci};
48562306a36Sopenharmony_ci
48662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o080_mix[] = {
48762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN80, 30, 1, 0),
48862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I054 Switch", AFE_CONN80_1, 22, 1, 0),
48962306a36Sopenharmony_ci};
49062306a36Sopenharmony_ci
49162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o081_mix[] = {
49262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN81, 31, 1, 0),
49362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I055 Switch", AFE_CONN81_1, 23, 1, 0),
49462306a36Sopenharmony_ci};
49562306a36Sopenharmony_ci
49662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o082_mix[] = {
49762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN82_1, 0, 1, 0),
49862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I056 Switch", AFE_CONN82_1, 24, 1, 0),
49962306a36Sopenharmony_ci};
50062306a36Sopenharmony_ci
50162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o083_mix[] = {
50262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN83_1, 1, 1, 0),
50362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I057 Switch", AFE_CONN83_1, 25, 1, 0),
50462306a36Sopenharmony_ci};
50562306a36Sopenharmony_ci
50662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o084_mix[] = {
50762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN84_1, 2, 1, 0),
50862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I058 Switch", AFE_CONN84_1, 26, 1, 0),
50962306a36Sopenharmony_ci};
51062306a36Sopenharmony_ci
51162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o085_mix[] = {
51262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN85_1, 3, 1, 0),
51362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I059 Switch", AFE_CONN85_1, 27, 1, 0),
51462306a36Sopenharmony_ci};
51562306a36Sopenharmony_ci
51662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o086_mix[] = {
51762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN86_1, 4, 1, 0),
51862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I060 Switch", AFE_CONN86_1, 28, 1, 0),
51962306a36Sopenharmony_ci};
52062306a36Sopenharmony_ci
52162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o087_mix[] = {
52262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN87_1, 5, 1, 0),
52362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I061 Switch", AFE_CONN87_1, 29, 1, 0),
52462306a36Sopenharmony_ci};
52562306a36Sopenharmony_ci
52662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o088_mix[] = {
52762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I038 Switch", AFE_CONN88_1, 6, 1, 0),
52862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I062 Switch", AFE_CONN88_1, 30, 1, 0),
52962306a36Sopenharmony_ci};
53062306a36Sopenharmony_ci
53162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o089_mix[] = {
53262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I039 Switch", AFE_CONN89_1, 7, 1, 0),
53362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I063 Switch", AFE_CONN89_1, 31, 1, 0),
53462306a36Sopenharmony_ci};
53562306a36Sopenharmony_ci
53662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o090_mix[] = {
53762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I040 Switch", AFE_CONN90_1, 8, 1, 0),
53862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I064 Switch", AFE_CONN90_2, 0, 1, 0),
53962306a36Sopenharmony_ci};
54062306a36Sopenharmony_ci
54162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o091_mix[] = {
54262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I041 Switch", AFE_CONN91_1, 9, 1, 0),
54362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I065 Switch", AFE_CONN91_2, 1, 1, 0),
54462306a36Sopenharmony_ci};
54562306a36Sopenharmony_ci
54662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o092_mix[] = {
54762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I042 Switch", AFE_CONN92_1, 10, 1, 0),
54862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I066 Switch", AFE_CONN92_2, 2, 1, 0),
54962306a36Sopenharmony_ci};
55062306a36Sopenharmony_ci
55162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o093_mix[] = {
55262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I043 Switch", AFE_CONN93_1, 11, 1, 0),
55362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I067 Switch", AFE_CONN93_2, 3, 1, 0),
55462306a36Sopenharmony_ci};
55562306a36Sopenharmony_ci
55662306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o094_mix[] = {
55762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I044 Switch", AFE_CONN94_1, 12, 1, 0),
55862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I068 Switch", AFE_CONN94_2, 4, 1, 0),
55962306a36Sopenharmony_ci};
56062306a36Sopenharmony_ci
56162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_o095_mix[] = {
56262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I045 Switch", AFE_CONN95_1, 13, 1, 0),
56362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("I069 Switch", AFE_CONN95_2, 5, 1, 0),
56462306a36Sopenharmony_ci};
56562306a36Sopenharmony_ci
56662306a36Sopenharmony_cistatic const char * const mt8195_etdm_clk_src_sel_text[] = {
56762306a36Sopenharmony_ci	"26m",
56862306a36Sopenharmony_ci	"a1sys_a2sys",
56962306a36Sopenharmony_ci	"a3sys",
57062306a36Sopenharmony_ci	"a4sys",
57162306a36Sopenharmony_ci};
57262306a36Sopenharmony_ci
57362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_EXT_DECL(etdmout_clk_src_enum,
57462306a36Sopenharmony_ci	mt8195_etdm_clk_src_sel_text);
57562306a36Sopenharmony_ci
57662306a36Sopenharmony_cistatic const char * const hdmitx_dptx_mux_map[] = {
57762306a36Sopenharmony_ci	"Disconnect", "Connect",
57862306a36Sopenharmony_ci};
57962306a36Sopenharmony_ci
58062306a36Sopenharmony_cistatic int hdmitx_dptx_mux_map_value[] = {
58162306a36Sopenharmony_ci	0, 1,
58262306a36Sopenharmony_ci};
58362306a36Sopenharmony_ci
58462306a36Sopenharmony_ci/* HDMI_OUT_MUX */
58562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(hdmi_out_mux_map_enum,
58662306a36Sopenharmony_ci				SND_SOC_NOPM,
58762306a36Sopenharmony_ci				0,
58862306a36Sopenharmony_ci				1,
58962306a36Sopenharmony_ci				hdmitx_dptx_mux_map,
59062306a36Sopenharmony_ci				hdmitx_dptx_mux_map_value);
59162306a36Sopenharmony_ci
59262306a36Sopenharmony_cistatic const struct snd_kcontrol_new hdmi_out_mux_control =
59362306a36Sopenharmony_ci	SOC_DAPM_ENUM("HDMI_OUT_MUX", hdmi_out_mux_map_enum);
59462306a36Sopenharmony_ci
59562306a36Sopenharmony_ci/* DPTX_OUT_MUX */
59662306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(dptx_out_mux_map_enum,
59762306a36Sopenharmony_ci				SND_SOC_NOPM,
59862306a36Sopenharmony_ci				0,
59962306a36Sopenharmony_ci				1,
60062306a36Sopenharmony_ci				hdmitx_dptx_mux_map,
60162306a36Sopenharmony_ci				hdmitx_dptx_mux_map_value);
60262306a36Sopenharmony_ci
60362306a36Sopenharmony_cistatic const struct snd_kcontrol_new dptx_out_mux_control =
60462306a36Sopenharmony_ci	SOC_DAPM_ENUM("DPTX_OUT_MUX", dptx_out_mux_map_enum);
60562306a36Sopenharmony_ci
60662306a36Sopenharmony_ci/* HDMI_CH0_MUX ~ HDMI_CH7_MUX */
60762306a36Sopenharmony_cistatic const char *const afe_conn_hdmi_mux_map[] = {
60862306a36Sopenharmony_ci	"CH0", "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7",
60962306a36Sopenharmony_ci};
61062306a36Sopenharmony_ci
61162306a36Sopenharmony_cistatic int afe_conn_hdmi_mux_map_value[] = {
61262306a36Sopenharmony_ci	0, 1, 2, 3, 4, 5, 6, 7,
61362306a36Sopenharmony_ci};
61462306a36Sopenharmony_ci
61562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch0_mux_map_enum,
61662306a36Sopenharmony_ci				AFE_TDMOUT_CONN0,
61762306a36Sopenharmony_ci				0,
61862306a36Sopenharmony_ci				0xf,
61962306a36Sopenharmony_ci				afe_conn_hdmi_mux_map,
62062306a36Sopenharmony_ci				afe_conn_hdmi_mux_map_value);
62162306a36Sopenharmony_ci
62262306a36Sopenharmony_cistatic const struct snd_kcontrol_new hdmi_ch0_mux_control =
62362306a36Sopenharmony_ci	SOC_DAPM_ENUM("HDMI_CH0_MUX", hdmi_ch0_mux_map_enum);
62462306a36Sopenharmony_ci
62562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch1_mux_map_enum,
62662306a36Sopenharmony_ci				AFE_TDMOUT_CONN0,
62762306a36Sopenharmony_ci				4,
62862306a36Sopenharmony_ci				0xf,
62962306a36Sopenharmony_ci				afe_conn_hdmi_mux_map,
63062306a36Sopenharmony_ci				afe_conn_hdmi_mux_map_value);
63162306a36Sopenharmony_ci
63262306a36Sopenharmony_cistatic const struct snd_kcontrol_new hdmi_ch1_mux_control =
63362306a36Sopenharmony_ci	SOC_DAPM_ENUM("HDMI_CH1_MUX", hdmi_ch1_mux_map_enum);
63462306a36Sopenharmony_ci
63562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch2_mux_map_enum,
63662306a36Sopenharmony_ci				AFE_TDMOUT_CONN0,
63762306a36Sopenharmony_ci				8,
63862306a36Sopenharmony_ci				0xf,
63962306a36Sopenharmony_ci				afe_conn_hdmi_mux_map,
64062306a36Sopenharmony_ci				afe_conn_hdmi_mux_map_value);
64162306a36Sopenharmony_ci
64262306a36Sopenharmony_cistatic const struct snd_kcontrol_new hdmi_ch2_mux_control =
64362306a36Sopenharmony_ci	SOC_DAPM_ENUM("HDMI_CH2_MUX", hdmi_ch2_mux_map_enum);
64462306a36Sopenharmony_ci
64562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch3_mux_map_enum,
64662306a36Sopenharmony_ci				AFE_TDMOUT_CONN0,
64762306a36Sopenharmony_ci				12,
64862306a36Sopenharmony_ci				0xf,
64962306a36Sopenharmony_ci				afe_conn_hdmi_mux_map,
65062306a36Sopenharmony_ci				afe_conn_hdmi_mux_map_value);
65162306a36Sopenharmony_ci
65262306a36Sopenharmony_cistatic const struct snd_kcontrol_new hdmi_ch3_mux_control =
65362306a36Sopenharmony_ci	SOC_DAPM_ENUM("HDMI_CH3_MUX", hdmi_ch3_mux_map_enum);
65462306a36Sopenharmony_ci
65562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch4_mux_map_enum,
65662306a36Sopenharmony_ci				AFE_TDMOUT_CONN0,
65762306a36Sopenharmony_ci				16,
65862306a36Sopenharmony_ci				0xf,
65962306a36Sopenharmony_ci				afe_conn_hdmi_mux_map,
66062306a36Sopenharmony_ci				afe_conn_hdmi_mux_map_value);
66162306a36Sopenharmony_ci
66262306a36Sopenharmony_cistatic const struct snd_kcontrol_new hdmi_ch4_mux_control =
66362306a36Sopenharmony_ci	SOC_DAPM_ENUM("HDMI_CH4_MUX", hdmi_ch4_mux_map_enum);
66462306a36Sopenharmony_ci
66562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch5_mux_map_enum,
66662306a36Sopenharmony_ci				AFE_TDMOUT_CONN0,
66762306a36Sopenharmony_ci				20,
66862306a36Sopenharmony_ci				0xf,
66962306a36Sopenharmony_ci				afe_conn_hdmi_mux_map,
67062306a36Sopenharmony_ci				afe_conn_hdmi_mux_map_value);
67162306a36Sopenharmony_ci
67262306a36Sopenharmony_cistatic const struct snd_kcontrol_new hdmi_ch5_mux_control =
67362306a36Sopenharmony_ci	SOC_DAPM_ENUM("HDMI_CH5_MUX", hdmi_ch5_mux_map_enum);
67462306a36Sopenharmony_ci
67562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch6_mux_map_enum,
67662306a36Sopenharmony_ci				AFE_TDMOUT_CONN0,
67762306a36Sopenharmony_ci				24,
67862306a36Sopenharmony_ci				0xf,
67962306a36Sopenharmony_ci				afe_conn_hdmi_mux_map,
68062306a36Sopenharmony_ci				afe_conn_hdmi_mux_map_value);
68162306a36Sopenharmony_ci
68262306a36Sopenharmony_cistatic const struct snd_kcontrol_new hdmi_ch6_mux_control =
68362306a36Sopenharmony_ci	SOC_DAPM_ENUM("HDMI_CH6_MUX", hdmi_ch6_mux_map_enum);
68462306a36Sopenharmony_ci
68562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch7_mux_map_enum,
68662306a36Sopenharmony_ci				AFE_TDMOUT_CONN0,
68762306a36Sopenharmony_ci				28,
68862306a36Sopenharmony_ci				0xf,
68962306a36Sopenharmony_ci				afe_conn_hdmi_mux_map,
69062306a36Sopenharmony_ci				afe_conn_hdmi_mux_map_value);
69162306a36Sopenharmony_ci
69262306a36Sopenharmony_cistatic const struct snd_kcontrol_new hdmi_ch7_mux_control =
69362306a36Sopenharmony_ci	SOC_DAPM_ENUM("HDMI_CH7_MUX", hdmi_ch7_mux_map_enum);
69462306a36Sopenharmony_ci
69562306a36Sopenharmony_cistatic int mt8195_etdm_clk_src_sel_put(struct snd_kcontrol *kcontrol,
69662306a36Sopenharmony_ci				       struct snd_ctl_elem_value *ucontrol)
69762306a36Sopenharmony_ci{
69862306a36Sopenharmony_ci	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
69962306a36Sopenharmony_ci	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
70062306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
70162306a36Sopenharmony_ci	unsigned int source = ucontrol->value.enumerated.item[0];
70262306a36Sopenharmony_ci	unsigned int val;
70362306a36Sopenharmony_ci	unsigned int mask;
70462306a36Sopenharmony_ci	unsigned int reg;
70562306a36Sopenharmony_ci
70662306a36Sopenharmony_ci	if (source >= e->items)
70762306a36Sopenharmony_ci		return -EINVAL;
70862306a36Sopenharmony_ci
70962306a36Sopenharmony_ci	reg = 0;
71062306a36Sopenharmony_ci	if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) {
71162306a36Sopenharmony_ci		reg = ETDM_OUT1_CON4;
71262306a36Sopenharmony_ci		mask = ETDM_OUT_CON4_CLOCK_MASK;
71362306a36Sopenharmony_ci		val = ETDM_OUT_CON4_CLOCK(source);
71462306a36Sopenharmony_ci	} else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) {
71562306a36Sopenharmony_ci		reg = ETDM_OUT2_CON4;
71662306a36Sopenharmony_ci		mask = ETDM_OUT_CON4_CLOCK_MASK;
71762306a36Sopenharmony_ci		val = ETDM_OUT_CON4_CLOCK(source);
71862306a36Sopenharmony_ci	} else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) {
71962306a36Sopenharmony_ci		reg = ETDM_OUT3_CON4;
72062306a36Sopenharmony_ci		mask = ETDM_OUT_CON4_CLOCK_MASK;
72162306a36Sopenharmony_ci		val = ETDM_OUT_CON4_CLOCK(source);
72262306a36Sopenharmony_ci	} else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) {
72362306a36Sopenharmony_ci		reg = ETDM_IN1_CON2;
72462306a36Sopenharmony_ci		mask = ETDM_IN_CON2_CLOCK_MASK;
72562306a36Sopenharmony_ci		val = ETDM_IN_CON2_CLOCK(source);
72662306a36Sopenharmony_ci	} else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) {
72762306a36Sopenharmony_ci		reg = ETDM_IN2_CON2;
72862306a36Sopenharmony_ci		mask = ETDM_IN_CON2_CLOCK_MASK;
72962306a36Sopenharmony_ci		val = ETDM_IN_CON2_CLOCK(source);
73062306a36Sopenharmony_ci	}
73162306a36Sopenharmony_ci
73262306a36Sopenharmony_ci	if (reg)
73362306a36Sopenharmony_ci		regmap_update_bits(afe->regmap, reg, mask, val);
73462306a36Sopenharmony_ci
73562306a36Sopenharmony_ci	return 0;
73662306a36Sopenharmony_ci}
73762306a36Sopenharmony_ci
73862306a36Sopenharmony_cistatic int mt8195_etdm_clk_src_sel_get(struct snd_kcontrol *kcontrol,
73962306a36Sopenharmony_ci				       struct snd_ctl_elem_value *ucontrol)
74062306a36Sopenharmony_ci{
74162306a36Sopenharmony_ci	struct snd_soc_component *component =
74262306a36Sopenharmony_ci		snd_soc_kcontrol_component(kcontrol);
74362306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
74462306a36Sopenharmony_ci	unsigned int value = 0;
74562306a36Sopenharmony_ci	unsigned int reg = 0;
74662306a36Sopenharmony_ci	unsigned int mask = 0;
74762306a36Sopenharmony_ci	unsigned int shift = 0;
74862306a36Sopenharmony_ci
74962306a36Sopenharmony_ci	if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) {
75062306a36Sopenharmony_ci		reg = ETDM_OUT1_CON4;
75162306a36Sopenharmony_ci		mask = ETDM_OUT_CON4_CLOCK_MASK;
75262306a36Sopenharmony_ci		shift = ETDM_OUT_CON4_CLOCK_SHIFT;
75362306a36Sopenharmony_ci	} else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) {
75462306a36Sopenharmony_ci		reg = ETDM_OUT2_CON4;
75562306a36Sopenharmony_ci		mask = ETDM_OUT_CON4_CLOCK_MASK;
75662306a36Sopenharmony_ci		shift = ETDM_OUT_CON4_CLOCK_SHIFT;
75762306a36Sopenharmony_ci	} else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) {
75862306a36Sopenharmony_ci		reg = ETDM_OUT3_CON4;
75962306a36Sopenharmony_ci		mask = ETDM_OUT_CON4_CLOCK_MASK;
76062306a36Sopenharmony_ci		shift = ETDM_OUT_CON4_CLOCK_SHIFT;
76162306a36Sopenharmony_ci	} else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) {
76262306a36Sopenharmony_ci		reg = ETDM_IN1_CON2;
76362306a36Sopenharmony_ci		mask = ETDM_IN_CON2_CLOCK_MASK;
76462306a36Sopenharmony_ci		shift = ETDM_IN_CON2_CLOCK_SHIFT;
76562306a36Sopenharmony_ci	} else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) {
76662306a36Sopenharmony_ci		reg = ETDM_IN2_CON2;
76762306a36Sopenharmony_ci		mask = ETDM_IN_CON2_CLOCK_MASK;
76862306a36Sopenharmony_ci		shift = ETDM_IN_CON2_CLOCK_SHIFT;
76962306a36Sopenharmony_ci	}
77062306a36Sopenharmony_ci
77162306a36Sopenharmony_ci	if (reg)
77262306a36Sopenharmony_ci		regmap_read(afe->regmap, reg, &value);
77362306a36Sopenharmony_ci
77462306a36Sopenharmony_ci	value &= mask;
77562306a36Sopenharmony_ci	value >>= shift;
77662306a36Sopenharmony_ci	ucontrol->value.enumerated.item[0] = value;
77762306a36Sopenharmony_ci	return 0;
77862306a36Sopenharmony_ci}
77962306a36Sopenharmony_ci
78062306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_etdm_controls[] = {
78162306a36Sopenharmony_ci	SOC_ENUM_EXT("ETDM_OUT1_Clock_Source",
78262306a36Sopenharmony_ci		     etdmout_clk_src_enum,
78362306a36Sopenharmony_ci		     mt8195_etdm_clk_src_sel_get,
78462306a36Sopenharmony_ci		     mt8195_etdm_clk_src_sel_put),
78562306a36Sopenharmony_ci	SOC_ENUM_EXT("ETDM_OUT2_Clock_Source",
78662306a36Sopenharmony_ci		     etdmout_clk_src_enum,
78762306a36Sopenharmony_ci		     mt8195_etdm_clk_src_sel_get,
78862306a36Sopenharmony_ci		     mt8195_etdm_clk_src_sel_put),
78962306a36Sopenharmony_ci	SOC_ENUM_EXT("ETDM_OUT3_Clock_Source",
79062306a36Sopenharmony_ci		     etdmout_clk_src_enum,
79162306a36Sopenharmony_ci		     mt8195_etdm_clk_src_sel_get,
79262306a36Sopenharmony_ci		     mt8195_etdm_clk_src_sel_put),
79362306a36Sopenharmony_ci	SOC_ENUM_EXT("ETDM_IN1_Clock_Source",
79462306a36Sopenharmony_ci		     etdmout_clk_src_enum,
79562306a36Sopenharmony_ci		     mt8195_etdm_clk_src_sel_get,
79662306a36Sopenharmony_ci		     mt8195_etdm_clk_src_sel_put),
79762306a36Sopenharmony_ci	SOC_ENUM_EXT("ETDM_IN2_Clock_Source",
79862306a36Sopenharmony_ci		     etdmout_clk_src_enum,
79962306a36Sopenharmony_ci		     mt8195_etdm_clk_src_sel_get,
80062306a36Sopenharmony_ci		     mt8195_etdm_clk_src_sel_put),
80162306a36Sopenharmony_ci};
80262306a36Sopenharmony_ci
80362306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget mtk_dai_etdm_widgets[] = {
80462306a36Sopenharmony_ci	/* eTDM_IN2 */
80562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I012", SND_SOC_NOPM, 0, 0, NULL, 0),
80662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I013", SND_SOC_NOPM, 0, 0, NULL, 0),
80762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I014", SND_SOC_NOPM, 0, 0, NULL, 0),
80862306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I015", SND_SOC_NOPM, 0, 0, NULL, 0),
80962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I016", SND_SOC_NOPM, 0, 0, NULL, 0),
81062306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I017", SND_SOC_NOPM, 0, 0, NULL, 0),
81162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I018", SND_SOC_NOPM, 0, 0, NULL, 0),
81262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I019", SND_SOC_NOPM, 0, 0, NULL, 0),
81362306a36Sopenharmony_ci
81462306a36Sopenharmony_ci	/* eTDM_IN1 */
81562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I072", SND_SOC_NOPM, 0, 0, NULL, 0),
81662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I073", SND_SOC_NOPM, 0, 0, NULL, 0),
81762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I074", SND_SOC_NOPM, 0, 0, NULL, 0),
81862306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I075", SND_SOC_NOPM, 0, 0, NULL, 0),
81962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I076", SND_SOC_NOPM, 0, 0, NULL, 0),
82062306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I077", SND_SOC_NOPM, 0, 0, NULL, 0),
82162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I078", SND_SOC_NOPM, 0, 0, NULL, 0),
82262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I079", SND_SOC_NOPM, 0, 0, NULL, 0),
82362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I080", SND_SOC_NOPM, 0, 0, NULL, 0),
82462306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I081", SND_SOC_NOPM, 0, 0, NULL, 0),
82562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I082", SND_SOC_NOPM, 0, 0, NULL, 0),
82662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I083", SND_SOC_NOPM, 0, 0, NULL, 0),
82762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I084", SND_SOC_NOPM, 0, 0, NULL, 0),
82862306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I085", SND_SOC_NOPM, 0, 0, NULL, 0),
82962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I086", SND_SOC_NOPM, 0, 0, NULL, 0),
83062306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I087", SND_SOC_NOPM, 0, 0, NULL, 0),
83162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I088", SND_SOC_NOPM, 0, 0, NULL, 0),
83262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I089", SND_SOC_NOPM, 0, 0, NULL, 0),
83362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I090", SND_SOC_NOPM, 0, 0, NULL, 0),
83462306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I091", SND_SOC_NOPM, 0, 0, NULL, 0),
83562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I092", SND_SOC_NOPM, 0, 0, NULL, 0),
83662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I093", SND_SOC_NOPM, 0, 0, NULL, 0),
83762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I094", SND_SOC_NOPM, 0, 0, NULL, 0),
83862306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I095", SND_SOC_NOPM, 0, 0, NULL, 0),
83962306a36Sopenharmony_ci
84062306a36Sopenharmony_ci	/* eTDM_OUT2 */
84162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O048", SND_SOC_NOPM, 0, 0,
84262306a36Sopenharmony_ci			   mtk_dai_etdm_o048_mix,
84362306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o048_mix)),
84462306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O049", SND_SOC_NOPM, 0, 0,
84562306a36Sopenharmony_ci			   mtk_dai_etdm_o049_mix,
84662306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o049_mix)),
84762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O050", SND_SOC_NOPM, 0, 0,
84862306a36Sopenharmony_ci			   mtk_dai_etdm_o050_mix,
84962306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o050_mix)),
85062306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O051", SND_SOC_NOPM, 0, 0,
85162306a36Sopenharmony_ci			   mtk_dai_etdm_o051_mix,
85262306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o051_mix)),
85362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O052", SND_SOC_NOPM, 0, 0,
85462306a36Sopenharmony_ci			   mtk_dai_etdm_o052_mix,
85562306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o052_mix)),
85662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O053", SND_SOC_NOPM, 0, 0,
85762306a36Sopenharmony_ci			   mtk_dai_etdm_o053_mix,
85862306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o053_mix)),
85962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O054", SND_SOC_NOPM, 0, 0,
86062306a36Sopenharmony_ci			   mtk_dai_etdm_o054_mix,
86162306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o054_mix)),
86262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O055", SND_SOC_NOPM, 0, 0,
86362306a36Sopenharmony_ci			   mtk_dai_etdm_o055_mix,
86462306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o055_mix)),
86562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O056", SND_SOC_NOPM, 0, 0,
86662306a36Sopenharmony_ci			   mtk_dai_etdm_o056_mix,
86762306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o056_mix)),
86862306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O057", SND_SOC_NOPM, 0, 0,
86962306a36Sopenharmony_ci			   mtk_dai_etdm_o057_mix,
87062306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o057_mix)),
87162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O058", SND_SOC_NOPM, 0, 0,
87262306a36Sopenharmony_ci			   mtk_dai_etdm_o058_mix,
87362306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o058_mix)),
87462306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O059", SND_SOC_NOPM, 0, 0,
87562306a36Sopenharmony_ci			   mtk_dai_etdm_o059_mix,
87662306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o059_mix)),
87762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O060", SND_SOC_NOPM, 0, 0,
87862306a36Sopenharmony_ci			   mtk_dai_etdm_o060_mix,
87962306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o060_mix)),
88062306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O061", SND_SOC_NOPM, 0, 0,
88162306a36Sopenharmony_ci			   mtk_dai_etdm_o061_mix,
88262306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o061_mix)),
88362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O062", SND_SOC_NOPM, 0, 0,
88462306a36Sopenharmony_ci			   mtk_dai_etdm_o062_mix,
88562306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o062_mix)),
88662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O063", SND_SOC_NOPM, 0, 0,
88762306a36Sopenharmony_ci			   mtk_dai_etdm_o063_mix,
88862306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o063_mix)),
88962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O064", SND_SOC_NOPM, 0, 0,
89062306a36Sopenharmony_ci			   mtk_dai_etdm_o064_mix,
89162306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o064_mix)),
89262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O065", SND_SOC_NOPM, 0, 0,
89362306a36Sopenharmony_ci			   mtk_dai_etdm_o065_mix,
89462306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o065_mix)),
89562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O066", SND_SOC_NOPM, 0, 0,
89662306a36Sopenharmony_ci			   mtk_dai_etdm_o066_mix,
89762306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o066_mix)),
89862306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O067", SND_SOC_NOPM, 0, 0,
89962306a36Sopenharmony_ci			   mtk_dai_etdm_o067_mix,
90062306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o067_mix)),
90162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O068", SND_SOC_NOPM, 0, 0,
90262306a36Sopenharmony_ci			   mtk_dai_etdm_o068_mix,
90362306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o068_mix)),
90462306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O069", SND_SOC_NOPM, 0, 0,
90562306a36Sopenharmony_ci			   mtk_dai_etdm_o069_mix,
90662306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o069_mix)),
90762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O070", SND_SOC_NOPM, 0, 0,
90862306a36Sopenharmony_ci			   mtk_dai_etdm_o070_mix,
90962306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o070_mix)),
91062306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O071", SND_SOC_NOPM, 0, 0,
91162306a36Sopenharmony_ci			   mtk_dai_etdm_o071_mix,
91262306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o071_mix)),
91362306a36Sopenharmony_ci
91462306a36Sopenharmony_ci	/* eTDM_OUT1 */
91562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O072", SND_SOC_NOPM, 0, 0,
91662306a36Sopenharmony_ci			   mtk_dai_etdm_o072_mix,
91762306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o072_mix)),
91862306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O073", SND_SOC_NOPM, 0, 0,
91962306a36Sopenharmony_ci			   mtk_dai_etdm_o073_mix,
92062306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o073_mix)),
92162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O074", SND_SOC_NOPM, 0, 0,
92262306a36Sopenharmony_ci			   mtk_dai_etdm_o074_mix,
92362306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o074_mix)),
92462306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O075", SND_SOC_NOPM, 0, 0,
92562306a36Sopenharmony_ci			   mtk_dai_etdm_o075_mix,
92662306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o075_mix)),
92762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O076", SND_SOC_NOPM, 0, 0,
92862306a36Sopenharmony_ci			   mtk_dai_etdm_o076_mix,
92962306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o076_mix)),
93062306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O077", SND_SOC_NOPM, 0, 0,
93162306a36Sopenharmony_ci			   mtk_dai_etdm_o077_mix,
93262306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o077_mix)),
93362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O078", SND_SOC_NOPM, 0, 0,
93462306a36Sopenharmony_ci			   mtk_dai_etdm_o078_mix,
93562306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o078_mix)),
93662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O079", SND_SOC_NOPM, 0, 0,
93762306a36Sopenharmony_ci			   mtk_dai_etdm_o079_mix,
93862306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o079_mix)),
93962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O080", SND_SOC_NOPM, 0, 0,
94062306a36Sopenharmony_ci			   mtk_dai_etdm_o080_mix,
94162306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o080_mix)),
94262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O081", SND_SOC_NOPM, 0, 0,
94362306a36Sopenharmony_ci			   mtk_dai_etdm_o081_mix,
94462306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o081_mix)),
94562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O082", SND_SOC_NOPM, 0, 0,
94662306a36Sopenharmony_ci			   mtk_dai_etdm_o082_mix,
94762306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o082_mix)),
94862306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O083", SND_SOC_NOPM, 0, 0,
94962306a36Sopenharmony_ci			   mtk_dai_etdm_o083_mix,
95062306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o083_mix)),
95162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O084", SND_SOC_NOPM, 0, 0,
95262306a36Sopenharmony_ci			   mtk_dai_etdm_o084_mix,
95362306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o084_mix)),
95462306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O085", SND_SOC_NOPM, 0, 0,
95562306a36Sopenharmony_ci			   mtk_dai_etdm_o085_mix,
95662306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o085_mix)),
95762306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O086", SND_SOC_NOPM, 0, 0,
95862306a36Sopenharmony_ci			   mtk_dai_etdm_o086_mix,
95962306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o086_mix)),
96062306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O087", SND_SOC_NOPM, 0, 0,
96162306a36Sopenharmony_ci			   mtk_dai_etdm_o087_mix,
96262306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o087_mix)),
96362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O088", SND_SOC_NOPM, 0, 0,
96462306a36Sopenharmony_ci			   mtk_dai_etdm_o088_mix,
96562306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o088_mix)),
96662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O089", SND_SOC_NOPM, 0, 0,
96762306a36Sopenharmony_ci			   mtk_dai_etdm_o089_mix,
96862306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o089_mix)),
96962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O090", SND_SOC_NOPM, 0, 0,
97062306a36Sopenharmony_ci			   mtk_dai_etdm_o090_mix,
97162306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o090_mix)),
97262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O091", SND_SOC_NOPM, 0, 0,
97362306a36Sopenharmony_ci			   mtk_dai_etdm_o091_mix,
97462306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o091_mix)),
97562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O092", SND_SOC_NOPM, 0, 0,
97662306a36Sopenharmony_ci			   mtk_dai_etdm_o092_mix,
97762306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o092_mix)),
97862306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O093", SND_SOC_NOPM, 0, 0,
97962306a36Sopenharmony_ci			   mtk_dai_etdm_o093_mix,
98062306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o093_mix)),
98162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O094", SND_SOC_NOPM, 0, 0,
98262306a36Sopenharmony_ci			   mtk_dai_etdm_o094_mix,
98362306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o094_mix)),
98462306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("O095", SND_SOC_NOPM, 0, 0,
98562306a36Sopenharmony_ci			   mtk_dai_etdm_o095_mix,
98662306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_dai_etdm_o095_mix)),
98762306a36Sopenharmony_ci
98862306a36Sopenharmony_ci	/* eTDM_OUT3 */
98962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("HDMI_OUT_MUX", SND_SOC_NOPM, 0, 0,
99062306a36Sopenharmony_ci			 &hdmi_out_mux_control),
99162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DPTX_OUT_MUX", SND_SOC_NOPM, 0, 0,
99262306a36Sopenharmony_ci			 &dptx_out_mux_control),
99362306a36Sopenharmony_ci
99462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("HDMI_CH0_MUX", SND_SOC_NOPM, 0, 0,
99562306a36Sopenharmony_ci			 &hdmi_ch0_mux_control),
99662306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("HDMI_CH1_MUX", SND_SOC_NOPM, 0, 0,
99762306a36Sopenharmony_ci			 &hdmi_ch1_mux_control),
99862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("HDMI_CH2_MUX", SND_SOC_NOPM, 0, 0,
99962306a36Sopenharmony_ci			 &hdmi_ch2_mux_control),
100062306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("HDMI_CH3_MUX", SND_SOC_NOPM, 0, 0,
100162306a36Sopenharmony_ci			 &hdmi_ch3_mux_control),
100262306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("HDMI_CH4_MUX", SND_SOC_NOPM, 0, 0,
100362306a36Sopenharmony_ci			 &hdmi_ch4_mux_control),
100462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("HDMI_CH5_MUX", SND_SOC_NOPM, 0, 0,
100562306a36Sopenharmony_ci			 &hdmi_ch5_mux_control),
100662306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("HDMI_CH6_MUX", SND_SOC_NOPM, 0, 0,
100762306a36Sopenharmony_ci			 &hdmi_ch6_mux_control),
100862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("HDMI_CH7_MUX", SND_SOC_NOPM, 0, 0,
100962306a36Sopenharmony_ci			 &hdmi_ch7_mux_control),
101062306a36Sopenharmony_ci
101162306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("ETDM_INPUT"),
101262306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("ETDM_OUTPUT"),
101362306a36Sopenharmony_ci};
101462306a36Sopenharmony_ci
101562306a36Sopenharmony_cistatic const struct snd_soc_dapm_route mtk_dai_etdm_routes[] = {
101662306a36Sopenharmony_ci	{"I012", NULL, "ETDM2 Capture"},
101762306a36Sopenharmony_ci	{"I013", NULL, "ETDM2 Capture"},
101862306a36Sopenharmony_ci	{"I014", NULL, "ETDM2 Capture"},
101962306a36Sopenharmony_ci	{"I015", NULL, "ETDM2 Capture"},
102062306a36Sopenharmony_ci	{"I016", NULL, "ETDM2 Capture"},
102162306a36Sopenharmony_ci	{"I017", NULL, "ETDM2 Capture"},
102262306a36Sopenharmony_ci	{"I018", NULL, "ETDM2 Capture"},
102362306a36Sopenharmony_ci	{"I019", NULL, "ETDM2 Capture"},
102462306a36Sopenharmony_ci
102562306a36Sopenharmony_ci	{"I072", NULL, "ETDM1 Capture"},
102662306a36Sopenharmony_ci	{"I073", NULL, "ETDM1 Capture"},
102762306a36Sopenharmony_ci	{"I074", NULL, "ETDM1 Capture"},
102862306a36Sopenharmony_ci	{"I075", NULL, "ETDM1 Capture"},
102962306a36Sopenharmony_ci	{"I076", NULL, "ETDM1 Capture"},
103062306a36Sopenharmony_ci	{"I077", NULL, "ETDM1 Capture"},
103162306a36Sopenharmony_ci	{"I078", NULL, "ETDM1 Capture"},
103262306a36Sopenharmony_ci	{"I079", NULL, "ETDM1 Capture"},
103362306a36Sopenharmony_ci	{"I080", NULL, "ETDM1 Capture"},
103462306a36Sopenharmony_ci	{"I081", NULL, "ETDM1 Capture"},
103562306a36Sopenharmony_ci	{"I082", NULL, "ETDM1 Capture"},
103662306a36Sopenharmony_ci	{"I083", NULL, "ETDM1 Capture"},
103762306a36Sopenharmony_ci	{"I084", NULL, "ETDM1 Capture"},
103862306a36Sopenharmony_ci	{"I085", NULL, "ETDM1 Capture"},
103962306a36Sopenharmony_ci	{"I086", NULL, "ETDM1 Capture"},
104062306a36Sopenharmony_ci	{"I087", NULL, "ETDM1 Capture"},
104162306a36Sopenharmony_ci	{"I088", NULL, "ETDM1 Capture"},
104262306a36Sopenharmony_ci	{"I089", NULL, "ETDM1 Capture"},
104362306a36Sopenharmony_ci	{"I090", NULL, "ETDM1 Capture"},
104462306a36Sopenharmony_ci	{"I091", NULL, "ETDM1 Capture"},
104562306a36Sopenharmony_ci	{"I092", NULL, "ETDM1 Capture"},
104662306a36Sopenharmony_ci	{"I093", NULL, "ETDM1 Capture"},
104762306a36Sopenharmony_ci	{"I094", NULL, "ETDM1 Capture"},
104862306a36Sopenharmony_ci	{"I095", NULL, "ETDM1 Capture"},
104962306a36Sopenharmony_ci
105062306a36Sopenharmony_ci	{"UL8", NULL, "ETDM1 Capture"},
105162306a36Sopenharmony_ci	{"UL3", NULL, "ETDM2 Capture"},
105262306a36Sopenharmony_ci
105362306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O048"},
105462306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O049"},
105562306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O050"},
105662306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O051"},
105762306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O052"},
105862306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O053"},
105962306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O054"},
106062306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O055"},
106162306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O056"},
106262306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O057"},
106362306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O058"},
106462306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O059"},
106562306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O060"},
106662306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O061"},
106762306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O062"},
106862306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O063"},
106962306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O064"},
107062306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O065"},
107162306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O066"},
107262306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O067"},
107362306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O068"},
107462306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O069"},
107562306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O070"},
107662306a36Sopenharmony_ci	{"ETDM2 Playback", NULL, "O071"},
107762306a36Sopenharmony_ci
107862306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O072"},
107962306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O073"},
108062306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O074"},
108162306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O075"},
108262306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O076"},
108362306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O077"},
108462306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O078"},
108562306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O079"},
108662306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O080"},
108762306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O081"},
108862306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O082"},
108962306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O083"},
109062306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O084"},
109162306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O085"},
109262306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O086"},
109362306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O087"},
109462306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O088"},
109562306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O089"},
109662306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O090"},
109762306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O091"},
109862306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O092"},
109962306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O093"},
110062306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O094"},
110162306a36Sopenharmony_ci	{"ETDM1 Playback", NULL, "O095"},
110262306a36Sopenharmony_ci
110362306a36Sopenharmony_ci	{"O048", "I020 Switch", "I020"},
110462306a36Sopenharmony_ci	{"O049", "I021 Switch", "I021"},
110562306a36Sopenharmony_ci
110662306a36Sopenharmony_ci	{"O048", "I022 Switch", "I022"},
110762306a36Sopenharmony_ci	{"O049", "I023 Switch", "I023"},
110862306a36Sopenharmony_ci	{"O050", "I024 Switch", "I024"},
110962306a36Sopenharmony_ci	{"O051", "I025 Switch", "I025"},
111062306a36Sopenharmony_ci	{"O052", "I026 Switch", "I026"},
111162306a36Sopenharmony_ci	{"O053", "I027 Switch", "I027"},
111262306a36Sopenharmony_ci	{"O054", "I028 Switch", "I028"},
111362306a36Sopenharmony_ci	{"O055", "I029 Switch", "I029"},
111462306a36Sopenharmony_ci	{"O056", "I030 Switch", "I030"},
111562306a36Sopenharmony_ci	{"O057", "I031 Switch", "I031"},
111662306a36Sopenharmony_ci	{"O058", "I032 Switch", "I032"},
111762306a36Sopenharmony_ci	{"O059", "I033 Switch", "I033"},
111862306a36Sopenharmony_ci	{"O060", "I034 Switch", "I034"},
111962306a36Sopenharmony_ci	{"O061", "I035 Switch", "I035"},
112062306a36Sopenharmony_ci	{"O062", "I036 Switch", "I036"},
112162306a36Sopenharmony_ci	{"O063", "I037 Switch", "I037"},
112262306a36Sopenharmony_ci	{"O064", "I038 Switch", "I038"},
112362306a36Sopenharmony_ci	{"O065", "I039 Switch", "I039"},
112462306a36Sopenharmony_ci	{"O066", "I040 Switch", "I040"},
112562306a36Sopenharmony_ci	{"O067", "I041 Switch", "I041"},
112662306a36Sopenharmony_ci	{"O068", "I042 Switch", "I042"},
112762306a36Sopenharmony_ci	{"O069", "I043 Switch", "I043"},
112862306a36Sopenharmony_ci	{"O070", "I044 Switch", "I044"},
112962306a36Sopenharmony_ci	{"O071", "I045 Switch", "I045"},
113062306a36Sopenharmony_ci
113162306a36Sopenharmony_ci	{"O048", "I046 Switch", "I046"},
113262306a36Sopenharmony_ci	{"O049", "I047 Switch", "I047"},
113362306a36Sopenharmony_ci	{"O050", "I048 Switch", "I048"},
113462306a36Sopenharmony_ci	{"O051", "I049 Switch", "I049"},
113562306a36Sopenharmony_ci	{"O052", "I050 Switch", "I050"},
113662306a36Sopenharmony_ci	{"O053", "I051 Switch", "I051"},
113762306a36Sopenharmony_ci	{"O054", "I052 Switch", "I052"},
113862306a36Sopenharmony_ci	{"O055", "I053 Switch", "I053"},
113962306a36Sopenharmony_ci	{"O056", "I054 Switch", "I054"},
114062306a36Sopenharmony_ci	{"O057", "I055 Switch", "I055"},
114162306a36Sopenharmony_ci	{"O058", "I056 Switch", "I056"},
114262306a36Sopenharmony_ci	{"O059", "I057 Switch", "I057"},
114362306a36Sopenharmony_ci	{"O060", "I058 Switch", "I058"},
114462306a36Sopenharmony_ci	{"O061", "I059 Switch", "I059"},
114562306a36Sopenharmony_ci	{"O062", "I060 Switch", "I060"},
114662306a36Sopenharmony_ci	{"O063", "I061 Switch", "I061"},
114762306a36Sopenharmony_ci	{"O064", "I062 Switch", "I062"},
114862306a36Sopenharmony_ci	{"O065", "I063 Switch", "I063"},
114962306a36Sopenharmony_ci	{"O066", "I064 Switch", "I064"},
115062306a36Sopenharmony_ci	{"O067", "I065 Switch", "I065"},
115162306a36Sopenharmony_ci	{"O068", "I066 Switch", "I066"},
115262306a36Sopenharmony_ci	{"O069", "I067 Switch", "I067"},
115362306a36Sopenharmony_ci	{"O070", "I068 Switch", "I068"},
115462306a36Sopenharmony_ci	{"O071", "I069 Switch", "I069"},
115562306a36Sopenharmony_ci
115662306a36Sopenharmony_ci	{"O048", "I070 Switch", "I070"},
115762306a36Sopenharmony_ci	{"O049", "I071 Switch", "I071"},
115862306a36Sopenharmony_ci
115962306a36Sopenharmony_ci	{"O072", "I020 Switch", "I020"},
116062306a36Sopenharmony_ci	{"O073", "I021 Switch", "I021"},
116162306a36Sopenharmony_ci
116262306a36Sopenharmony_ci	{"O072", "I022 Switch", "I022"},
116362306a36Sopenharmony_ci	{"O073", "I023 Switch", "I023"},
116462306a36Sopenharmony_ci	{"O074", "I024 Switch", "I024"},
116562306a36Sopenharmony_ci	{"O075", "I025 Switch", "I025"},
116662306a36Sopenharmony_ci	{"O076", "I026 Switch", "I026"},
116762306a36Sopenharmony_ci	{"O077", "I027 Switch", "I027"},
116862306a36Sopenharmony_ci	{"O078", "I028 Switch", "I028"},
116962306a36Sopenharmony_ci	{"O079", "I029 Switch", "I029"},
117062306a36Sopenharmony_ci	{"O080", "I030 Switch", "I030"},
117162306a36Sopenharmony_ci	{"O081", "I031 Switch", "I031"},
117262306a36Sopenharmony_ci	{"O082", "I032 Switch", "I032"},
117362306a36Sopenharmony_ci	{"O083", "I033 Switch", "I033"},
117462306a36Sopenharmony_ci	{"O084", "I034 Switch", "I034"},
117562306a36Sopenharmony_ci	{"O085", "I035 Switch", "I035"},
117662306a36Sopenharmony_ci	{"O086", "I036 Switch", "I036"},
117762306a36Sopenharmony_ci	{"O087", "I037 Switch", "I037"},
117862306a36Sopenharmony_ci	{"O088", "I038 Switch", "I038"},
117962306a36Sopenharmony_ci	{"O089", "I039 Switch", "I039"},
118062306a36Sopenharmony_ci	{"O090", "I040 Switch", "I040"},
118162306a36Sopenharmony_ci	{"O091", "I041 Switch", "I041"},
118262306a36Sopenharmony_ci	{"O092", "I042 Switch", "I042"},
118362306a36Sopenharmony_ci	{"O093", "I043 Switch", "I043"},
118462306a36Sopenharmony_ci	{"O094", "I044 Switch", "I044"},
118562306a36Sopenharmony_ci	{"O095", "I045 Switch", "I045"},
118662306a36Sopenharmony_ci
118762306a36Sopenharmony_ci	{"O072", "I046 Switch", "I046"},
118862306a36Sopenharmony_ci	{"O073", "I047 Switch", "I047"},
118962306a36Sopenharmony_ci	{"O074", "I048 Switch", "I048"},
119062306a36Sopenharmony_ci	{"O075", "I049 Switch", "I049"},
119162306a36Sopenharmony_ci	{"O076", "I050 Switch", "I050"},
119262306a36Sopenharmony_ci	{"O077", "I051 Switch", "I051"},
119362306a36Sopenharmony_ci	{"O078", "I052 Switch", "I052"},
119462306a36Sopenharmony_ci	{"O079", "I053 Switch", "I053"},
119562306a36Sopenharmony_ci	{"O080", "I054 Switch", "I054"},
119662306a36Sopenharmony_ci	{"O081", "I055 Switch", "I055"},
119762306a36Sopenharmony_ci	{"O082", "I056 Switch", "I056"},
119862306a36Sopenharmony_ci	{"O083", "I057 Switch", "I057"},
119962306a36Sopenharmony_ci	{"O084", "I058 Switch", "I058"},
120062306a36Sopenharmony_ci	{"O085", "I059 Switch", "I059"},
120162306a36Sopenharmony_ci	{"O086", "I060 Switch", "I060"},
120262306a36Sopenharmony_ci	{"O087", "I061 Switch", "I061"},
120362306a36Sopenharmony_ci	{"O088", "I062 Switch", "I062"},
120462306a36Sopenharmony_ci	{"O089", "I063 Switch", "I063"},
120562306a36Sopenharmony_ci	{"O090", "I064 Switch", "I064"},
120662306a36Sopenharmony_ci	{"O091", "I065 Switch", "I065"},
120762306a36Sopenharmony_ci	{"O092", "I066 Switch", "I066"},
120862306a36Sopenharmony_ci	{"O093", "I067 Switch", "I067"},
120962306a36Sopenharmony_ci	{"O094", "I068 Switch", "I068"},
121062306a36Sopenharmony_ci	{"O095", "I069 Switch", "I069"},
121162306a36Sopenharmony_ci
121262306a36Sopenharmony_ci	{"O072", "I070 Switch", "I070"},
121362306a36Sopenharmony_ci	{"O073", "I071 Switch", "I071"},
121462306a36Sopenharmony_ci
121562306a36Sopenharmony_ci	{"HDMI_CH0_MUX", "CH0", "DL10"},
121662306a36Sopenharmony_ci	{"HDMI_CH0_MUX", "CH1", "DL10"},
121762306a36Sopenharmony_ci	{"HDMI_CH0_MUX", "CH2", "DL10"},
121862306a36Sopenharmony_ci	{"HDMI_CH0_MUX", "CH3", "DL10"},
121962306a36Sopenharmony_ci	{"HDMI_CH0_MUX", "CH4", "DL10"},
122062306a36Sopenharmony_ci	{"HDMI_CH0_MUX", "CH5", "DL10"},
122162306a36Sopenharmony_ci	{"HDMI_CH0_MUX", "CH6", "DL10"},
122262306a36Sopenharmony_ci	{"HDMI_CH0_MUX", "CH7", "DL10"},
122362306a36Sopenharmony_ci
122462306a36Sopenharmony_ci	{"HDMI_CH1_MUX", "CH0", "DL10"},
122562306a36Sopenharmony_ci	{"HDMI_CH1_MUX", "CH1", "DL10"},
122662306a36Sopenharmony_ci	{"HDMI_CH1_MUX", "CH2", "DL10"},
122762306a36Sopenharmony_ci	{"HDMI_CH1_MUX", "CH3", "DL10"},
122862306a36Sopenharmony_ci	{"HDMI_CH1_MUX", "CH4", "DL10"},
122962306a36Sopenharmony_ci	{"HDMI_CH1_MUX", "CH5", "DL10"},
123062306a36Sopenharmony_ci	{"HDMI_CH1_MUX", "CH6", "DL10"},
123162306a36Sopenharmony_ci	{"HDMI_CH1_MUX", "CH7", "DL10"},
123262306a36Sopenharmony_ci
123362306a36Sopenharmony_ci	{"HDMI_CH2_MUX", "CH0", "DL10"},
123462306a36Sopenharmony_ci	{"HDMI_CH2_MUX", "CH1", "DL10"},
123562306a36Sopenharmony_ci	{"HDMI_CH2_MUX", "CH2", "DL10"},
123662306a36Sopenharmony_ci	{"HDMI_CH2_MUX", "CH3", "DL10"},
123762306a36Sopenharmony_ci	{"HDMI_CH2_MUX", "CH4", "DL10"},
123862306a36Sopenharmony_ci	{"HDMI_CH2_MUX", "CH5", "DL10"},
123962306a36Sopenharmony_ci	{"HDMI_CH2_MUX", "CH6", "DL10"},
124062306a36Sopenharmony_ci	{"HDMI_CH2_MUX", "CH7", "DL10"},
124162306a36Sopenharmony_ci
124262306a36Sopenharmony_ci	{"HDMI_CH3_MUX", "CH0", "DL10"},
124362306a36Sopenharmony_ci	{"HDMI_CH3_MUX", "CH1", "DL10"},
124462306a36Sopenharmony_ci	{"HDMI_CH3_MUX", "CH2", "DL10"},
124562306a36Sopenharmony_ci	{"HDMI_CH3_MUX", "CH3", "DL10"},
124662306a36Sopenharmony_ci	{"HDMI_CH3_MUX", "CH4", "DL10"},
124762306a36Sopenharmony_ci	{"HDMI_CH3_MUX", "CH5", "DL10"},
124862306a36Sopenharmony_ci	{"HDMI_CH3_MUX", "CH6", "DL10"},
124962306a36Sopenharmony_ci	{"HDMI_CH3_MUX", "CH7", "DL10"},
125062306a36Sopenharmony_ci
125162306a36Sopenharmony_ci	{"HDMI_CH4_MUX", "CH0", "DL10"},
125262306a36Sopenharmony_ci	{"HDMI_CH4_MUX", "CH1", "DL10"},
125362306a36Sopenharmony_ci	{"HDMI_CH4_MUX", "CH2", "DL10"},
125462306a36Sopenharmony_ci	{"HDMI_CH4_MUX", "CH3", "DL10"},
125562306a36Sopenharmony_ci	{"HDMI_CH4_MUX", "CH4", "DL10"},
125662306a36Sopenharmony_ci	{"HDMI_CH4_MUX", "CH5", "DL10"},
125762306a36Sopenharmony_ci	{"HDMI_CH4_MUX", "CH6", "DL10"},
125862306a36Sopenharmony_ci	{"HDMI_CH4_MUX", "CH7", "DL10"},
125962306a36Sopenharmony_ci
126062306a36Sopenharmony_ci	{"HDMI_CH5_MUX", "CH0", "DL10"},
126162306a36Sopenharmony_ci	{"HDMI_CH5_MUX", "CH1", "DL10"},
126262306a36Sopenharmony_ci	{"HDMI_CH5_MUX", "CH2", "DL10"},
126362306a36Sopenharmony_ci	{"HDMI_CH5_MUX", "CH3", "DL10"},
126462306a36Sopenharmony_ci	{"HDMI_CH5_MUX", "CH4", "DL10"},
126562306a36Sopenharmony_ci	{"HDMI_CH5_MUX", "CH5", "DL10"},
126662306a36Sopenharmony_ci	{"HDMI_CH5_MUX", "CH6", "DL10"},
126762306a36Sopenharmony_ci	{"HDMI_CH5_MUX", "CH7", "DL10"},
126862306a36Sopenharmony_ci
126962306a36Sopenharmony_ci	{"HDMI_CH6_MUX", "CH0", "DL10"},
127062306a36Sopenharmony_ci	{"HDMI_CH6_MUX", "CH1", "DL10"},
127162306a36Sopenharmony_ci	{"HDMI_CH6_MUX", "CH2", "DL10"},
127262306a36Sopenharmony_ci	{"HDMI_CH6_MUX", "CH3", "DL10"},
127362306a36Sopenharmony_ci	{"HDMI_CH6_MUX", "CH4", "DL10"},
127462306a36Sopenharmony_ci	{"HDMI_CH6_MUX", "CH5", "DL10"},
127562306a36Sopenharmony_ci	{"HDMI_CH6_MUX", "CH6", "DL10"},
127662306a36Sopenharmony_ci	{"HDMI_CH6_MUX", "CH7", "DL10"},
127762306a36Sopenharmony_ci
127862306a36Sopenharmony_ci	{"HDMI_CH7_MUX", "CH0", "DL10"},
127962306a36Sopenharmony_ci	{"HDMI_CH7_MUX", "CH1", "DL10"},
128062306a36Sopenharmony_ci	{"HDMI_CH7_MUX", "CH2", "DL10"},
128162306a36Sopenharmony_ci	{"HDMI_CH7_MUX", "CH3", "DL10"},
128262306a36Sopenharmony_ci	{"HDMI_CH7_MUX", "CH4", "DL10"},
128362306a36Sopenharmony_ci	{"HDMI_CH7_MUX", "CH5", "DL10"},
128462306a36Sopenharmony_ci	{"HDMI_CH7_MUX", "CH6", "DL10"},
128562306a36Sopenharmony_ci	{"HDMI_CH7_MUX", "CH7", "DL10"},
128662306a36Sopenharmony_ci
128762306a36Sopenharmony_ci	{"HDMI_OUT_MUX", "Connect", "HDMI_CH0_MUX"},
128862306a36Sopenharmony_ci	{"HDMI_OUT_MUX", "Connect", "HDMI_CH1_MUX"},
128962306a36Sopenharmony_ci	{"HDMI_OUT_MUX", "Connect", "HDMI_CH2_MUX"},
129062306a36Sopenharmony_ci	{"HDMI_OUT_MUX", "Connect", "HDMI_CH3_MUX"},
129162306a36Sopenharmony_ci	{"HDMI_OUT_MUX", "Connect", "HDMI_CH4_MUX"},
129262306a36Sopenharmony_ci	{"HDMI_OUT_MUX", "Connect", "HDMI_CH5_MUX"},
129362306a36Sopenharmony_ci	{"HDMI_OUT_MUX", "Connect", "HDMI_CH6_MUX"},
129462306a36Sopenharmony_ci	{"HDMI_OUT_MUX", "Connect", "HDMI_CH7_MUX"},
129562306a36Sopenharmony_ci
129662306a36Sopenharmony_ci	{"DPTX_OUT_MUX", "Connect", "HDMI_CH0_MUX"},
129762306a36Sopenharmony_ci	{"DPTX_OUT_MUX", "Connect", "HDMI_CH1_MUX"},
129862306a36Sopenharmony_ci	{"DPTX_OUT_MUX", "Connect", "HDMI_CH2_MUX"},
129962306a36Sopenharmony_ci	{"DPTX_OUT_MUX", "Connect", "HDMI_CH3_MUX"},
130062306a36Sopenharmony_ci	{"DPTX_OUT_MUX", "Connect", "HDMI_CH4_MUX"},
130162306a36Sopenharmony_ci	{"DPTX_OUT_MUX", "Connect", "HDMI_CH5_MUX"},
130262306a36Sopenharmony_ci	{"DPTX_OUT_MUX", "Connect", "HDMI_CH6_MUX"},
130362306a36Sopenharmony_ci	{"DPTX_OUT_MUX", "Connect", "HDMI_CH7_MUX"},
130462306a36Sopenharmony_ci
130562306a36Sopenharmony_ci	{"ETDM3 Playback", NULL, "HDMI_OUT_MUX"},
130662306a36Sopenharmony_ci	{"DPTX Playback", NULL, "DPTX_OUT_MUX"},
130762306a36Sopenharmony_ci
130862306a36Sopenharmony_ci	{"ETDM_OUTPUT", NULL, "DPTX Playback"},
130962306a36Sopenharmony_ci	{"ETDM_OUTPUT", NULL, "ETDM1 Playback"},
131062306a36Sopenharmony_ci	{"ETDM_OUTPUT", NULL, "ETDM2 Playback"},
131162306a36Sopenharmony_ci	{"ETDM_OUTPUT", NULL, "ETDM3 Playback"},
131262306a36Sopenharmony_ci	{"ETDM1 Capture", NULL, "ETDM_INPUT"},
131362306a36Sopenharmony_ci	{"ETDM2 Capture", NULL, "ETDM_INPUT"},
131462306a36Sopenharmony_ci};
131562306a36Sopenharmony_ci
131662306a36Sopenharmony_cistatic int mt8195_afe_enable_etdm(struct mtk_base_afe *afe, int dai_id)
131762306a36Sopenharmony_ci{
131862306a36Sopenharmony_ci	int ret = 0;
131962306a36Sopenharmony_ci	struct etdm_con_reg etdm_reg;
132062306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
132162306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *etdm_data;
132262306a36Sopenharmony_ci	unsigned long flags;
132362306a36Sopenharmony_ci
132462306a36Sopenharmony_ci	if (!mt8195_afe_etdm_is_valid(dai_id))
132562306a36Sopenharmony_ci		return -EINVAL;
132662306a36Sopenharmony_ci
132762306a36Sopenharmony_ci	etdm_data = afe_priv->dai_priv[dai_id];
132862306a36Sopenharmony_ci	spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags);
132962306a36Sopenharmony_ci	etdm_data->en_ref_cnt++;
133062306a36Sopenharmony_ci	if (etdm_data->en_ref_cnt == 1) {
133162306a36Sopenharmony_ci		ret = get_etdm_reg(dai_id, &etdm_reg);
133262306a36Sopenharmony_ci		if (ret < 0)
133362306a36Sopenharmony_ci			goto out;
133462306a36Sopenharmony_ci
133562306a36Sopenharmony_ci		regmap_update_bits(afe->regmap, etdm_reg.con0,
133662306a36Sopenharmony_ci				   ETDM_CON0_EN, ETDM_CON0_EN);
133762306a36Sopenharmony_ci	}
133862306a36Sopenharmony_ciout:
133962306a36Sopenharmony_ci	spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags);
134062306a36Sopenharmony_ci	return ret;
134162306a36Sopenharmony_ci}
134262306a36Sopenharmony_ci
134362306a36Sopenharmony_cistatic int mt8195_afe_disable_etdm(struct mtk_base_afe *afe, int dai_id)
134462306a36Sopenharmony_ci{
134562306a36Sopenharmony_ci	int ret = 0;
134662306a36Sopenharmony_ci	struct etdm_con_reg etdm_reg;
134762306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
134862306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *etdm_data;
134962306a36Sopenharmony_ci	unsigned long flags;
135062306a36Sopenharmony_ci
135162306a36Sopenharmony_ci	if (!mt8195_afe_etdm_is_valid(dai_id))
135262306a36Sopenharmony_ci		return -EINVAL;
135362306a36Sopenharmony_ci
135462306a36Sopenharmony_ci	etdm_data = afe_priv->dai_priv[dai_id];
135562306a36Sopenharmony_ci	spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags);
135662306a36Sopenharmony_ci	if (etdm_data->en_ref_cnt > 0) {
135762306a36Sopenharmony_ci		etdm_data->en_ref_cnt--;
135862306a36Sopenharmony_ci		if (etdm_data->en_ref_cnt == 0) {
135962306a36Sopenharmony_ci			ret = get_etdm_reg(dai_id, &etdm_reg);
136062306a36Sopenharmony_ci			if (ret < 0)
136162306a36Sopenharmony_ci				goto out;
136262306a36Sopenharmony_ci
136362306a36Sopenharmony_ci			regmap_update_bits(afe->regmap, etdm_reg.con0,
136462306a36Sopenharmony_ci					   ETDM_CON0_EN, 0);
136562306a36Sopenharmony_ci		}
136662306a36Sopenharmony_ci	}
136762306a36Sopenharmony_ciout:
136862306a36Sopenharmony_ci	spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags);
136962306a36Sopenharmony_ci	return ret;
137062306a36Sopenharmony_ci}
137162306a36Sopenharmony_ci
137262306a36Sopenharmony_cistatic int etdm_cowork_slv_sel(int id, int slave_mode)
137362306a36Sopenharmony_ci{
137462306a36Sopenharmony_ci	if (slave_mode) {
137562306a36Sopenharmony_ci		switch (id) {
137662306a36Sopenharmony_ci		case MT8195_AFE_IO_ETDM1_IN:
137762306a36Sopenharmony_ci			return COWORK_ETDM_IN1_S;
137862306a36Sopenharmony_ci		case MT8195_AFE_IO_ETDM2_IN:
137962306a36Sopenharmony_ci			return COWORK_ETDM_IN2_S;
138062306a36Sopenharmony_ci		case MT8195_AFE_IO_ETDM1_OUT:
138162306a36Sopenharmony_ci			return COWORK_ETDM_OUT1_S;
138262306a36Sopenharmony_ci		case MT8195_AFE_IO_ETDM2_OUT:
138362306a36Sopenharmony_ci			return COWORK_ETDM_OUT2_S;
138462306a36Sopenharmony_ci		case MT8195_AFE_IO_ETDM3_OUT:
138562306a36Sopenharmony_ci			return COWORK_ETDM_OUT3_S;
138662306a36Sopenharmony_ci		default:
138762306a36Sopenharmony_ci			return -EINVAL;
138862306a36Sopenharmony_ci		}
138962306a36Sopenharmony_ci	} else {
139062306a36Sopenharmony_ci		switch (id) {
139162306a36Sopenharmony_ci		case MT8195_AFE_IO_ETDM1_IN:
139262306a36Sopenharmony_ci			return COWORK_ETDM_IN1_M;
139362306a36Sopenharmony_ci		case MT8195_AFE_IO_ETDM2_IN:
139462306a36Sopenharmony_ci			return COWORK_ETDM_IN2_M;
139562306a36Sopenharmony_ci		case MT8195_AFE_IO_ETDM1_OUT:
139662306a36Sopenharmony_ci			return COWORK_ETDM_OUT1_M;
139762306a36Sopenharmony_ci		case MT8195_AFE_IO_ETDM2_OUT:
139862306a36Sopenharmony_ci			return COWORK_ETDM_OUT2_M;
139962306a36Sopenharmony_ci		case MT8195_AFE_IO_ETDM3_OUT:
140062306a36Sopenharmony_ci			return COWORK_ETDM_OUT3_M;
140162306a36Sopenharmony_ci		default:
140262306a36Sopenharmony_ci			return -EINVAL;
140362306a36Sopenharmony_ci		}
140462306a36Sopenharmony_ci	}
140562306a36Sopenharmony_ci}
140662306a36Sopenharmony_ci
140762306a36Sopenharmony_cistatic int mt8195_etdm_sync_mode_configure(struct mtk_base_afe *afe, int dai_id)
140862306a36Sopenharmony_ci{
140962306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
141062306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *etdm_data;
141162306a36Sopenharmony_ci	unsigned int reg = 0;
141262306a36Sopenharmony_ci	unsigned int mask;
141362306a36Sopenharmony_ci	unsigned int val;
141462306a36Sopenharmony_ci	int cowork_source_sel;
141562306a36Sopenharmony_ci
141662306a36Sopenharmony_ci	if (!mt8195_afe_etdm_is_valid(dai_id))
141762306a36Sopenharmony_ci		return -EINVAL;
141862306a36Sopenharmony_ci
141962306a36Sopenharmony_ci	etdm_data = afe_priv->dai_priv[dai_id];
142062306a36Sopenharmony_ci	if (etdm_data->cowork_source_id == COWORK_ETDM_NONE)
142162306a36Sopenharmony_ci		return 0;
142262306a36Sopenharmony_ci
142362306a36Sopenharmony_ci	cowork_source_sel = etdm_cowork_slv_sel(etdm_data->cowork_source_id,
142462306a36Sopenharmony_ci						etdm_data->slave_mode);
142562306a36Sopenharmony_ci	if (cowork_source_sel < 0)
142662306a36Sopenharmony_ci		return cowork_source_sel;
142762306a36Sopenharmony_ci
142862306a36Sopenharmony_ci	switch (dai_id) {
142962306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM1_IN:
143062306a36Sopenharmony_ci		reg = ETDM_COWORK_CON1;
143162306a36Sopenharmony_ci		mask = ETDM_IN1_SLAVE_SEL_MASK;
143262306a36Sopenharmony_ci		val = ETDM_IN1_SLAVE_SEL(cowork_source_sel);
143362306a36Sopenharmony_ci		break;
143462306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM2_IN:
143562306a36Sopenharmony_ci		reg = ETDM_COWORK_CON2;
143662306a36Sopenharmony_ci		mask = ETDM_IN2_SLAVE_SEL_MASK;
143762306a36Sopenharmony_ci		val = ETDM_IN2_SLAVE_SEL(cowork_source_sel);
143862306a36Sopenharmony_ci		break;
143962306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM1_OUT:
144062306a36Sopenharmony_ci		reg = ETDM_COWORK_CON0;
144162306a36Sopenharmony_ci		mask = ETDM_OUT1_SLAVE_SEL_MASK;
144262306a36Sopenharmony_ci		val = ETDM_OUT1_SLAVE_SEL(cowork_source_sel);
144362306a36Sopenharmony_ci		break;
144462306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM2_OUT:
144562306a36Sopenharmony_ci		reg = ETDM_COWORK_CON2;
144662306a36Sopenharmony_ci		mask = ETDM_OUT2_SLAVE_SEL_MASK;
144762306a36Sopenharmony_ci		val = ETDM_OUT2_SLAVE_SEL(cowork_source_sel);
144862306a36Sopenharmony_ci		break;
144962306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM3_OUT:
145062306a36Sopenharmony_ci		reg = ETDM_COWORK_CON2;
145162306a36Sopenharmony_ci		mask = ETDM_OUT3_SLAVE_SEL_MASK;
145262306a36Sopenharmony_ci		val = ETDM_OUT3_SLAVE_SEL(cowork_source_sel);
145362306a36Sopenharmony_ci		break;
145462306a36Sopenharmony_ci	default:
145562306a36Sopenharmony_ci		return 0;
145662306a36Sopenharmony_ci	}
145762306a36Sopenharmony_ci
145862306a36Sopenharmony_ci	regmap_update_bits(afe->regmap, reg, mask, val);
145962306a36Sopenharmony_ci
146062306a36Sopenharmony_ci	return 0;
146162306a36Sopenharmony_ci}
146262306a36Sopenharmony_ci
146362306a36Sopenharmony_cistatic int mtk_dai_etdm_get_cg_id_by_dai_id(int dai_id)
146462306a36Sopenharmony_ci{
146562306a36Sopenharmony_ci	int cg_id = -1;
146662306a36Sopenharmony_ci
146762306a36Sopenharmony_ci	switch (dai_id) {
146862306a36Sopenharmony_ci	case MT8195_AFE_IO_DPTX:
146962306a36Sopenharmony_ci		cg_id = MT8195_CLK_AUD_HDMI_OUT;
147062306a36Sopenharmony_ci		break;
147162306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM1_IN:
147262306a36Sopenharmony_ci		cg_id = MT8195_CLK_AUD_TDM_IN;
147362306a36Sopenharmony_ci		break;
147462306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM2_IN:
147562306a36Sopenharmony_ci		cg_id = MT8195_CLK_AUD_I2SIN;
147662306a36Sopenharmony_ci		break;
147762306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM1_OUT:
147862306a36Sopenharmony_ci		cg_id = MT8195_CLK_AUD_TDM_OUT;
147962306a36Sopenharmony_ci		break;
148062306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM2_OUT:
148162306a36Sopenharmony_ci		cg_id = MT8195_CLK_AUD_I2S_OUT;
148262306a36Sopenharmony_ci		break;
148362306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM3_OUT:
148462306a36Sopenharmony_ci		cg_id = MT8195_CLK_AUD_HDMI_OUT;
148562306a36Sopenharmony_ci		break;
148662306a36Sopenharmony_ci	default:
148762306a36Sopenharmony_ci		break;
148862306a36Sopenharmony_ci	}
148962306a36Sopenharmony_ci
149062306a36Sopenharmony_ci	return cg_id;
149162306a36Sopenharmony_ci}
149262306a36Sopenharmony_ci
149362306a36Sopenharmony_cistatic int mtk_dai_etdm_get_clk_id_by_dai_id(int dai_id)
149462306a36Sopenharmony_ci{
149562306a36Sopenharmony_ci	int clk_id = -1;
149662306a36Sopenharmony_ci
149762306a36Sopenharmony_ci	switch (dai_id) {
149862306a36Sopenharmony_ci	case MT8195_AFE_IO_DPTX:
149962306a36Sopenharmony_ci		clk_id = MT8195_CLK_TOP_DPTX_M_SEL;
150062306a36Sopenharmony_ci		break;
150162306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM1_IN:
150262306a36Sopenharmony_ci		clk_id = MT8195_CLK_TOP_I2SI1_M_SEL;
150362306a36Sopenharmony_ci		break;
150462306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM2_IN:
150562306a36Sopenharmony_ci		clk_id = MT8195_CLK_TOP_I2SI2_M_SEL;
150662306a36Sopenharmony_ci		break;
150762306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM1_OUT:
150862306a36Sopenharmony_ci		clk_id = MT8195_CLK_TOP_I2SO1_M_SEL;
150962306a36Sopenharmony_ci		break;
151062306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM2_OUT:
151162306a36Sopenharmony_ci		clk_id = MT8195_CLK_TOP_I2SO2_M_SEL;
151262306a36Sopenharmony_ci		break;
151362306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM3_OUT:
151462306a36Sopenharmony_ci	default:
151562306a36Sopenharmony_ci		break;
151662306a36Sopenharmony_ci	}
151762306a36Sopenharmony_ci
151862306a36Sopenharmony_ci	return clk_id;
151962306a36Sopenharmony_ci}
152062306a36Sopenharmony_ci
152162306a36Sopenharmony_cistatic int mtk_dai_etdm_get_clkdiv_id_by_dai_id(int dai_id)
152262306a36Sopenharmony_ci{
152362306a36Sopenharmony_ci	int clk_id = -1;
152462306a36Sopenharmony_ci
152562306a36Sopenharmony_ci	switch (dai_id) {
152662306a36Sopenharmony_ci	case MT8195_AFE_IO_DPTX:
152762306a36Sopenharmony_ci		clk_id = MT8195_CLK_TOP_APLL12_DIV9;
152862306a36Sopenharmony_ci		break;
152962306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM1_IN:
153062306a36Sopenharmony_ci		clk_id = MT8195_CLK_TOP_APLL12_DIV0;
153162306a36Sopenharmony_ci		break;
153262306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM2_IN:
153362306a36Sopenharmony_ci		clk_id = MT8195_CLK_TOP_APLL12_DIV1;
153462306a36Sopenharmony_ci		break;
153562306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM1_OUT:
153662306a36Sopenharmony_ci		clk_id = MT8195_CLK_TOP_APLL12_DIV2;
153762306a36Sopenharmony_ci		break;
153862306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM2_OUT:
153962306a36Sopenharmony_ci		clk_id = MT8195_CLK_TOP_APLL12_DIV3;
154062306a36Sopenharmony_ci		break;
154162306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM3_OUT:
154262306a36Sopenharmony_ci	default:
154362306a36Sopenharmony_ci		break;
154462306a36Sopenharmony_ci	}
154562306a36Sopenharmony_ci
154662306a36Sopenharmony_ci	return clk_id;
154762306a36Sopenharmony_ci}
154862306a36Sopenharmony_ci
154962306a36Sopenharmony_cistatic int mtk_dai_etdm_enable_mclk(struct mtk_base_afe *afe, int dai_id)
155062306a36Sopenharmony_ci{
155162306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
155262306a36Sopenharmony_ci	int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id);
155362306a36Sopenharmony_ci
155462306a36Sopenharmony_ci	if (clkdiv_id < 0)
155562306a36Sopenharmony_ci		return -EINVAL;
155662306a36Sopenharmony_ci
155762306a36Sopenharmony_ci	mt8195_afe_enable_clk(afe, afe_priv->clk[clkdiv_id]);
155862306a36Sopenharmony_ci
155962306a36Sopenharmony_ci	return 0;
156062306a36Sopenharmony_ci}
156162306a36Sopenharmony_ci
156262306a36Sopenharmony_cistatic int mtk_dai_etdm_disable_mclk(struct mtk_base_afe *afe, int dai_id)
156362306a36Sopenharmony_ci{
156462306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
156562306a36Sopenharmony_ci	int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id);
156662306a36Sopenharmony_ci
156762306a36Sopenharmony_ci	if (clkdiv_id < 0)
156862306a36Sopenharmony_ci		return -EINVAL;
156962306a36Sopenharmony_ci
157062306a36Sopenharmony_ci	mt8195_afe_disable_clk(afe, afe_priv->clk[clkdiv_id]);
157162306a36Sopenharmony_ci
157262306a36Sopenharmony_ci	return 0;
157362306a36Sopenharmony_ci}
157462306a36Sopenharmony_ci
157562306a36Sopenharmony_ci/* dai ops */
157662306a36Sopenharmony_cistatic int mtk_dai_etdm_startup(struct snd_pcm_substream *substream,
157762306a36Sopenharmony_ci				struct snd_soc_dai *dai)
157862306a36Sopenharmony_ci{
157962306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
158062306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
158162306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *mst_etdm_data;
158262306a36Sopenharmony_ci	int cg_id;
158362306a36Sopenharmony_ci	int mst_dai_id;
158462306a36Sopenharmony_ci	int slv_dai_id;
158562306a36Sopenharmony_ci	int i;
158662306a36Sopenharmony_ci
158762306a36Sopenharmony_ci	if (is_cowork_mode(dai)) {
158862306a36Sopenharmony_ci		mst_dai_id = get_etdm_cowork_master_id(dai);
158962306a36Sopenharmony_ci		if (!mt8195_afe_etdm_is_valid(mst_dai_id))
159062306a36Sopenharmony_ci			return -EINVAL;
159162306a36Sopenharmony_ci
159262306a36Sopenharmony_ci		mtk_dai_etdm_enable_mclk(afe, mst_dai_id);
159362306a36Sopenharmony_ci		cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(mst_dai_id);
159462306a36Sopenharmony_ci		if (cg_id >= 0)
159562306a36Sopenharmony_ci			mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]);
159662306a36Sopenharmony_ci
159762306a36Sopenharmony_ci		mst_etdm_data = afe_priv->dai_priv[mst_dai_id];
159862306a36Sopenharmony_ci
159962306a36Sopenharmony_ci		for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {
160062306a36Sopenharmony_ci			slv_dai_id = mst_etdm_data->cowork_slv_id[i];
160162306a36Sopenharmony_ci			cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(slv_dai_id);
160262306a36Sopenharmony_ci			if (cg_id >= 0)
160362306a36Sopenharmony_ci				mt8195_afe_enable_clk(afe,
160462306a36Sopenharmony_ci						      afe_priv->clk[cg_id]);
160562306a36Sopenharmony_ci		}
160662306a36Sopenharmony_ci	} else {
160762306a36Sopenharmony_ci		mtk_dai_etdm_enable_mclk(afe, dai->id);
160862306a36Sopenharmony_ci
160962306a36Sopenharmony_ci		cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id);
161062306a36Sopenharmony_ci		if (cg_id >= 0)
161162306a36Sopenharmony_ci			mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]);
161262306a36Sopenharmony_ci	}
161362306a36Sopenharmony_ci
161462306a36Sopenharmony_ci	return 0;
161562306a36Sopenharmony_ci}
161662306a36Sopenharmony_ci
161762306a36Sopenharmony_cistatic void mtk_dai_etdm_shutdown(struct snd_pcm_substream *substream,
161862306a36Sopenharmony_ci				  struct snd_soc_dai *dai)
161962306a36Sopenharmony_ci{
162062306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
162162306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
162262306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *mst_etdm_data;
162362306a36Sopenharmony_ci	int cg_id;
162462306a36Sopenharmony_ci	int mst_dai_id;
162562306a36Sopenharmony_ci	int slv_dai_id;
162662306a36Sopenharmony_ci	int i;
162762306a36Sopenharmony_ci
162862306a36Sopenharmony_ci	if (is_cowork_mode(dai)) {
162962306a36Sopenharmony_ci		mst_dai_id = get_etdm_cowork_master_id(dai);
163062306a36Sopenharmony_ci		if (!mt8195_afe_etdm_is_valid(mst_dai_id))
163162306a36Sopenharmony_ci			return;
163262306a36Sopenharmony_ci
163362306a36Sopenharmony_ci		cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(mst_dai_id);
163462306a36Sopenharmony_ci		if (cg_id >= 0)
163562306a36Sopenharmony_ci			mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]);
163662306a36Sopenharmony_ci
163762306a36Sopenharmony_ci		mst_etdm_data = afe_priv->dai_priv[mst_dai_id];
163862306a36Sopenharmony_ci		for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {
163962306a36Sopenharmony_ci			slv_dai_id = mst_etdm_data->cowork_slv_id[i];
164062306a36Sopenharmony_ci			cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(slv_dai_id);
164162306a36Sopenharmony_ci			if (cg_id >= 0)
164262306a36Sopenharmony_ci				mt8195_afe_disable_clk(afe,
164362306a36Sopenharmony_ci						       afe_priv->clk[cg_id]);
164462306a36Sopenharmony_ci		}
164562306a36Sopenharmony_ci		mtk_dai_etdm_disable_mclk(afe, mst_dai_id);
164662306a36Sopenharmony_ci	} else {
164762306a36Sopenharmony_ci		cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id);
164862306a36Sopenharmony_ci		if (cg_id >= 0)
164962306a36Sopenharmony_ci			mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]);
165062306a36Sopenharmony_ci
165162306a36Sopenharmony_ci		mtk_dai_etdm_disable_mclk(afe, dai->id);
165262306a36Sopenharmony_ci	}
165362306a36Sopenharmony_ci}
165462306a36Sopenharmony_ci
165562306a36Sopenharmony_cistatic int mtk_dai_etdm_fifo_mode(struct mtk_base_afe *afe,
165662306a36Sopenharmony_ci				  int dai_id, unsigned int rate)
165762306a36Sopenharmony_ci{
165862306a36Sopenharmony_ci	unsigned int mode = 0;
165962306a36Sopenharmony_ci	unsigned int reg = 0;
166062306a36Sopenharmony_ci	unsigned int val = 0;
166162306a36Sopenharmony_ci	unsigned int mask = (ETDM_IN_AFIFO_MODE_MASK | ETDM_IN_USE_AFIFO);
166262306a36Sopenharmony_ci
166362306a36Sopenharmony_ci	if (rate != 0)
166462306a36Sopenharmony_ci		mode = mt8195_afe_fs_timing(rate);
166562306a36Sopenharmony_ci
166662306a36Sopenharmony_ci	switch (dai_id) {
166762306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM1_IN:
166862306a36Sopenharmony_ci		reg = ETDM_IN1_AFIFO_CON;
166962306a36Sopenharmony_ci		if (rate == 0)
167062306a36Sopenharmony_ci			mode = MT8195_ETDM_IN1_1X_EN;
167162306a36Sopenharmony_ci		break;
167262306a36Sopenharmony_ci	case MT8195_AFE_IO_ETDM2_IN:
167362306a36Sopenharmony_ci		reg = ETDM_IN2_AFIFO_CON;
167462306a36Sopenharmony_ci		if (rate == 0)
167562306a36Sopenharmony_ci			mode = MT8195_ETDM_IN2_1X_EN;
167662306a36Sopenharmony_ci		break;
167762306a36Sopenharmony_ci	default:
167862306a36Sopenharmony_ci		return -EINVAL;
167962306a36Sopenharmony_ci	}
168062306a36Sopenharmony_ci
168162306a36Sopenharmony_ci	val = (mode | ETDM_IN_USE_AFIFO);
168262306a36Sopenharmony_ci
168362306a36Sopenharmony_ci	regmap_update_bits(afe->regmap, reg, mask, val);
168462306a36Sopenharmony_ci	return 0;
168562306a36Sopenharmony_ci}
168662306a36Sopenharmony_ci
168762306a36Sopenharmony_cistatic int mtk_dai_etdm_in_configure(struct mtk_base_afe *afe,
168862306a36Sopenharmony_ci				     unsigned int rate,
168962306a36Sopenharmony_ci				     unsigned int channels,
169062306a36Sopenharmony_ci				     int dai_id)
169162306a36Sopenharmony_ci{
169262306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
169362306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *etdm_data;
169462306a36Sopenharmony_ci	struct etdm_con_reg etdm_reg;
169562306a36Sopenharmony_ci	bool slave_mode;
169662306a36Sopenharmony_ci	unsigned int data_mode;
169762306a36Sopenharmony_ci	unsigned int lrck_width;
169862306a36Sopenharmony_ci	unsigned int val = 0;
169962306a36Sopenharmony_ci	unsigned int mask = 0;
170062306a36Sopenharmony_ci	int i;
170162306a36Sopenharmony_ci	int ret;
170262306a36Sopenharmony_ci
170362306a36Sopenharmony_ci	if (!mt8195_afe_etdm_is_valid(dai_id))
170462306a36Sopenharmony_ci		return -EINVAL;
170562306a36Sopenharmony_ci
170662306a36Sopenharmony_ci	etdm_data = afe_priv->dai_priv[dai_id];
170762306a36Sopenharmony_ci	slave_mode = etdm_data->slave_mode;
170862306a36Sopenharmony_ci	data_mode = etdm_data->data_mode;
170962306a36Sopenharmony_ci	lrck_width = etdm_data->lrck_width;
171062306a36Sopenharmony_ci
171162306a36Sopenharmony_ci	dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n",
171262306a36Sopenharmony_ci		__func__, rate, channels, dai_id);
171362306a36Sopenharmony_ci
171462306a36Sopenharmony_ci	ret = get_etdm_reg(dai_id, &etdm_reg);
171562306a36Sopenharmony_ci	if (ret < 0)
171662306a36Sopenharmony_ci		return ret;
171762306a36Sopenharmony_ci
171862306a36Sopenharmony_ci	if (etdm_data->cowork_source_id != COWORK_ETDM_NONE)
171962306a36Sopenharmony_ci		slave_mode = true;
172062306a36Sopenharmony_ci
172162306a36Sopenharmony_ci	/* afifo */
172262306a36Sopenharmony_ci	if (slave_mode)
172362306a36Sopenharmony_ci		mtk_dai_etdm_fifo_mode(afe, dai_id, 0);
172462306a36Sopenharmony_ci	else
172562306a36Sopenharmony_ci		mtk_dai_etdm_fifo_mode(afe, dai_id, rate);
172662306a36Sopenharmony_ci
172762306a36Sopenharmony_ci	/* con1 */
172862306a36Sopenharmony_ci	if (lrck_width > 0) {
172962306a36Sopenharmony_ci		mask |= (ETDM_IN_CON1_LRCK_AUTO_MODE |
173062306a36Sopenharmony_ci			ETDM_IN_CON1_LRCK_WIDTH_MASK);
173162306a36Sopenharmony_ci		val |= ETDM_IN_CON1_LRCK_WIDTH(lrck_width);
173262306a36Sopenharmony_ci	}
173362306a36Sopenharmony_ci	regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);
173462306a36Sopenharmony_ci
173562306a36Sopenharmony_ci	mask = 0;
173662306a36Sopenharmony_ci	val = 0;
173762306a36Sopenharmony_ci
173862306a36Sopenharmony_ci	/* con2 */
173962306a36Sopenharmony_ci	if (!slave_mode) {
174062306a36Sopenharmony_ci		mask |= ETDM_IN_CON2_UPDATE_GAP_MASK;
174162306a36Sopenharmony_ci		if (rate == 352800 || rate == 384000)
174262306a36Sopenharmony_ci			val |= ETDM_IN_CON2_UPDATE_GAP(4);
174362306a36Sopenharmony_ci		else
174462306a36Sopenharmony_ci			val |= ETDM_IN_CON2_UPDATE_GAP(3);
174562306a36Sopenharmony_ci	}
174662306a36Sopenharmony_ci	mask |= (ETDM_IN_CON2_MULTI_IP_2CH_MODE |
174762306a36Sopenharmony_ci		ETDM_IN_CON2_MULTI_IP_TOTAL_CH_MASK);
174862306a36Sopenharmony_ci	if (data_mode == MTK_DAI_ETDM_DATA_MULTI_PIN) {
174962306a36Sopenharmony_ci		val |= ETDM_IN_CON2_MULTI_IP_2CH_MODE |
175062306a36Sopenharmony_ci		       ETDM_IN_CON2_MULTI_IP_TOTAL_CH(channels);
175162306a36Sopenharmony_ci	}
175262306a36Sopenharmony_ci	regmap_update_bits(afe->regmap, etdm_reg.con2, mask, val);
175362306a36Sopenharmony_ci
175462306a36Sopenharmony_ci	mask = 0;
175562306a36Sopenharmony_ci	val = 0;
175662306a36Sopenharmony_ci
175762306a36Sopenharmony_ci	/* con3 */
175862306a36Sopenharmony_ci	mask |= ETDM_IN_CON3_DISABLE_OUT_MASK;
175962306a36Sopenharmony_ci	for (i = 0; i < channels; i += 2) {
176062306a36Sopenharmony_ci		if (etdm_data->in_disable_ch[i] &&
176162306a36Sopenharmony_ci		    etdm_data->in_disable_ch[i + 1])
176262306a36Sopenharmony_ci			val |= ETDM_IN_CON3_DISABLE_OUT(i >> 1);
176362306a36Sopenharmony_ci	}
176462306a36Sopenharmony_ci	if (!slave_mode) {
176562306a36Sopenharmony_ci		mask |= ETDM_IN_CON3_FS_MASK;
176662306a36Sopenharmony_ci		val |= ETDM_IN_CON3_FS(get_etdm_fs_timing(rate));
176762306a36Sopenharmony_ci	}
176862306a36Sopenharmony_ci	regmap_update_bits(afe->regmap, etdm_reg.con3, mask, val);
176962306a36Sopenharmony_ci
177062306a36Sopenharmony_ci	mask = 0;
177162306a36Sopenharmony_ci	val = 0;
177262306a36Sopenharmony_ci
177362306a36Sopenharmony_ci	/* con4 */
177462306a36Sopenharmony_ci	mask |= (ETDM_IN_CON4_MASTER_LRCK_INV | ETDM_IN_CON4_MASTER_BCK_INV |
177562306a36Sopenharmony_ci		ETDM_IN_CON4_SLAVE_LRCK_INV | ETDM_IN_CON4_SLAVE_BCK_INV);
177662306a36Sopenharmony_ci	if (slave_mode) {
177762306a36Sopenharmony_ci		if (etdm_data->lrck_inv)
177862306a36Sopenharmony_ci			val |= ETDM_IN_CON4_SLAVE_LRCK_INV;
177962306a36Sopenharmony_ci		if (etdm_data->bck_inv)
178062306a36Sopenharmony_ci			val |= ETDM_IN_CON4_SLAVE_BCK_INV;
178162306a36Sopenharmony_ci	} else {
178262306a36Sopenharmony_ci		if (etdm_data->lrck_inv)
178362306a36Sopenharmony_ci			val |= ETDM_IN_CON4_MASTER_LRCK_INV;
178462306a36Sopenharmony_ci		if (etdm_data->bck_inv)
178562306a36Sopenharmony_ci			val |= ETDM_IN_CON4_MASTER_BCK_INV;
178662306a36Sopenharmony_ci	}
178762306a36Sopenharmony_ci	regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val);
178862306a36Sopenharmony_ci
178962306a36Sopenharmony_ci	mask = 0;
179062306a36Sopenharmony_ci	val = 0;
179162306a36Sopenharmony_ci
179262306a36Sopenharmony_ci	/* con5 */
179362306a36Sopenharmony_ci	mask |= ETDM_IN_CON5_LR_SWAP_MASK;
179462306a36Sopenharmony_ci	mask |= ETDM_IN_CON5_ENABLE_ODD_MASK;
179562306a36Sopenharmony_ci	for (i = 0; i < channels; i += 2) {
179662306a36Sopenharmony_ci		if (etdm_data->in_disable_ch[i] &&
179762306a36Sopenharmony_ci		    !etdm_data->in_disable_ch[i + 1]) {
179862306a36Sopenharmony_ci			if (i == (channels - 2))
179962306a36Sopenharmony_ci				val |= ETDM_IN_CON5_LR_SWAP(15);
180062306a36Sopenharmony_ci			else
180162306a36Sopenharmony_ci				val |= ETDM_IN_CON5_LR_SWAP(i >> 1);
180262306a36Sopenharmony_ci			val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1);
180362306a36Sopenharmony_ci		} else if (!etdm_data->in_disable_ch[i] &&
180462306a36Sopenharmony_ci			   etdm_data->in_disable_ch[i + 1]) {
180562306a36Sopenharmony_ci			val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1);
180662306a36Sopenharmony_ci		}
180762306a36Sopenharmony_ci	}
180862306a36Sopenharmony_ci	regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val);
180962306a36Sopenharmony_ci	return 0;
181062306a36Sopenharmony_ci}
181162306a36Sopenharmony_ci
181262306a36Sopenharmony_cistatic int mtk_dai_etdm_out_configure(struct mtk_base_afe *afe,
181362306a36Sopenharmony_ci				      unsigned int rate,
181462306a36Sopenharmony_ci				      unsigned int channels,
181562306a36Sopenharmony_ci				      int dai_id)
181662306a36Sopenharmony_ci{
181762306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
181862306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *etdm_data;
181962306a36Sopenharmony_ci	struct etdm_con_reg etdm_reg;
182062306a36Sopenharmony_ci	bool slave_mode;
182162306a36Sopenharmony_ci	unsigned int lrck_width;
182262306a36Sopenharmony_ci	unsigned int val = 0;
182362306a36Sopenharmony_ci	unsigned int mask = 0;
182462306a36Sopenharmony_ci	int ret;
182562306a36Sopenharmony_ci	int fs = 0;
182662306a36Sopenharmony_ci
182762306a36Sopenharmony_ci	if (!mt8195_afe_etdm_is_valid(dai_id))
182862306a36Sopenharmony_ci		return -EINVAL;
182962306a36Sopenharmony_ci
183062306a36Sopenharmony_ci	etdm_data = afe_priv->dai_priv[dai_id];
183162306a36Sopenharmony_ci	slave_mode = etdm_data->slave_mode;
183262306a36Sopenharmony_ci	lrck_width = etdm_data->lrck_width;
183362306a36Sopenharmony_ci
183462306a36Sopenharmony_ci	dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n",
183562306a36Sopenharmony_ci		__func__, rate, channels, dai_id);
183662306a36Sopenharmony_ci
183762306a36Sopenharmony_ci	ret = get_etdm_reg(dai_id, &etdm_reg);
183862306a36Sopenharmony_ci	if (ret < 0)
183962306a36Sopenharmony_ci		return ret;
184062306a36Sopenharmony_ci
184162306a36Sopenharmony_ci	if (etdm_data->cowork_source_id != COWORK_ETDM_NONE)
184262306a36Sopenharmony_ci		slave_mode = true;
184362306a36Sopenharmony_ci
184462306a36Sopenharmony_ci	/* con0 */
184562306a36Sopenharmony_ci	mask = ETDM_OUT_CON0_RELATCH_DOMAIN_MASK;
184662306a36Sopenharmony_ci	val = ETDM_OUT_CON0_RELATCH_DOMAIN(ETDM_RELATCH_TIMING_A1A2SYS);
184762306a36Sopenharmony_ci	regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val);
184862306a36Sopenharmony_ci
184962306a36Sopenharmony_ci	mask = 0;
185062306a36Sopenharmony_ci	val = 0;
185162306a36Sopenharmony_ci
185262306a36Sopenharmony_ci	/* con1 */
185362306a36Sopenharmony_ci	if (lrck_width > 0) {
185462306a36Sopenharmony_ci		mask |= (ETDM_OUT_CON1_LRCK_AUTO_MODE |
185562306a36Sopenharmony_ci			ETDM_OUT_CON1_LRCK_WIDTH_MASK);
185662306a36Sopenharmony_ci		val |= ETDM_OUT_CON1_LRCK_WIDTH(lrck_width);
185762306a36Sopenharmony_ci	}
185862306a36Sopenharmony_ci	regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);
185962306a36Sopenharmony_ci
186062306a36Sopenharmony_ci	mask = 0;
186162306a36Sopenharmony_ci	val = 0;
186262306a36Sopenharmony_ci
186362306a36Sopenharmony_ci	if (slave_mode) {
186462306a36Sopenharmony_ci		/* con2 */
186562306a36Sopenharmony_ci		mask = (ETDM_OUT_CON2_LRCK_DELAY_BCK_INV |
186662306a36Sopenharmony_ci			ETDM_OUT_CON2_LRCK_DELAY_0P5T_EN);
186762306a36Sopenharmony_ci		val = (ETDM_OUT_CON2_LRCK_DELAY_BCK_INV |
186862306a36Sopenharmony_ci			ETDM_OUT_CON2_LRCK_DELAY_0P5T_EN);
186962306a36Sopenharmony_ci		regmap_update_bits(afe->regmap, etdm_reg.con2,
187062306a36Sopenharmony_ci				   mask, val);
187162306a36Sopenharmony_ci		mask = 0;
187262306a36Sopenharmony_ci		val = 0;
187362306a36Sopenharmony_ci	} else {
187462306a36Sopenharmony_ci		/* con4 */
187562306a36Sopenharmony_ci		mask |= ETDM_OUT_CON4_FS_MASK;
187662306a36Sopenharmony_ci		val |= ETDM_OUT_CON4_FS(get_etdm_fs_timing(rate));
187762306a36Sopenharmony_ci	}
187862306a36Sopenharmony_ci
187962306a36Sopenharmony_ci	mask |= ETDM_OUT_CON4_RELATCH_EN_MASK;
188062306a36Sopenharmony_ci	if (dai_id == MT8195_AFE_IO_ETDM1_OUT)
188162306a36Sopenharmony_ci		fs = MT8195_ETDM_OUT1_1X_EN;
188262306a36Sopenharmony_ci	else if (dai_id == MT8195_AFE_IO_ETDM2_OUT)
188362306a36Sopenharmony_ci		fs = MT8195_ETDM_OUT2_1X_EN;
188462306a36Sopenharmony_ci
188562306a36Sopenharmony_ci	val |= ETDM_OUT_CON4_RELATCH_EN(fs);
188662306a36Sopenharmony_ci
188762306a36Sopenharmony_ci	regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val);
188862306a36Sopenharmony_ci
188962306a36Sopenharmony_ci	mask = 0;
189062306a36Sopenharmony_ci	val = 0;
189162306a36Sopenharmony_ci
189262306a36Sopenharmony_ci	/* con5 */
189362306a36Sopenharmony_ci	mask |= (ETDM_OUT_CON5_MASTER_LRCK_INV | ETDM_OUT_CON5_MASTER_BCK_INV |
189462306a36Sopenharmony_ci		ETDM_OUT_CON5_SLAVE_LRCK_INV | ETDM_OUT_CON5_SLAVE_BCK_INV);
189562306a36Sopenharmony_ci	if (slave_mode) {
189662306a36Sopenharmony_ci		if (etdm_data->lrck_inv)
189762306a36Sopenharmony_ci			val |= ETDM_OUT_CON5_SLAVE_LRCK_INV;
189862306a36Sopenharmony_ci		if (etdm_data->bck_inv)
189962306a36Sopenharmony_ci			val |= ETDM_OUT_CON5_SLAVE_BCK_INV;
190062306a36Sopenharmony_ci	} else {
190162306a36Sopenharmony_ci		if (etdm_data->lrck_inv)
190262306a36Sopenharmony_ci			val |= ETDM_OUT_CON5_MASTER_LRCK_INV;
190362306a36Sopenharmony_ci		if (etdm_data->bck_inv)
190462306a36Sopenharmony_ci			val |= ETDM_OUT_CON5_MASTER_BCK_INV;
190562306a36Sopenharmony_ci	}
190662306a36Sopenharmony_ci	regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val);
190762306a36Sopenharmony_ci
190862306a36Sopenharmony_ci	return 0;
190962306a36Sopenharmony_ci}
191062306a36Sopenharmony_ci
191162306a36Sopenharmony_cistatic int mtk_dai_etdm_mclk_configure(struct mtk_base_afe *afe, int dai_id)
191262306a36Sopenharmony_ci{
191362306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
191462306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *etdm_data;
191562306a36Sopenharmony_ci	int clk_id = mtk_dai_etdm_get_clk_id_by_dai_id(dai_id);
191662306a36Sopenharmony_ci	int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id);
191762306a36Sopenharmony_ci	int apll;
191862306a36Sopenharmony_ci	int apll_clk_id;
191962306a36Sopenharmony_ci	struct etdm_con_reg etdm_reg;
192062306a36Sopenharmony_ci	unsigned int val = 0;
192162306a36Sopenharmony_ci	unsigned int mask = 0;
192262306a36Sopenharmony_ci	int ret = 0;
192362306a36Sopenharmony_ci
192462306a36Sopenharmony_ci	if (clk_id < 0 || clkdiv_id < 0)
192562306a36Sopenharmony_ci		return 0;
192662306a36Sopenharmony_ci
192762306a36Sopenharmony_ci	if (!mt8195_afe_etdm_is_valid(dai_id))
192862306a36Sopenharmony_ci		return -EINVAL;
192962306a36Sopenharmony_ci
193062306a36Sopenharmony_ci	etdm_data = afe_priv->dai_priv[dai_id];
193162306a36Sopenharmony_ci	ret = get_etdm_reg(dai_id, &etdm_reg);
193262306a36Sopenharmony_ci	if (ret < 0)
193362306a36Sopenharmony_ci		return ret;
193462306a36Sopenharmony_ci
193562306a36Sopenharmony_ci	mask |= ETDM_CON1_MCLK_OUTPUT;
193662306a36Sopenharmony_ci	if (etdm_data->mclk_dir == SND_SOC_CLOCK_OUT)
193762306a36Sopenharmony_ci		val |= ETDM_CON1_MCLK_OUTPUT;
193862306a36Sopenharmony_ci	regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);
193962306a36Sopenharmony_ci
194062306a36Sopenharmony_ci	if (etdm_data->mclk_freq) {
194162306a36Sopenharmony_ci		apll = etdm_data->mclk_apll;
194262306a36Sopenharmony_ci		apll_clk_id = mt8195_afe_get_mclk_source_clk_id(apll);
194362306a36Sopenharmony_ci		if (apll_clk_id < 0)
194462306a36Sopenharmony_ci			return apll_clk_id;
194562306a36Sopenharmony_ci
194662306a36Sopenharmony_ci		/* select apll */
194762306a36Sopenharmony_ci		ret = mt8195_afe_set_clk_parent(afe, afe_priv->clk[clk_id],
194862306a36Sopenharmony_ci						afe_priv->clk[apll_clk_id]);
194962306a36Sopenharmony_ci		if (ret)
195062306a36Sopenharmony_ci			return ret;
195162306a36Sopenharmony_ci
195262306a36Sopenharmony_ci		/* set rate */
195362306a36Sopenharmony_ci		ret = mt8195_afe_set_clk_rate(afe, afe_priv->clk[clkdiv_id],
195462306a36Sopenharmony_ci					      etdm_data->mclk_freq);
195562306a36Sopenharmony_ci	} else {
195662306a36Sopenharmony_ci		if (etdm_data->mclk_dir == SND_SOC_CLOCK_OUT)
195762306a36Sopenharmony_ci			dev_dbg(afe->dev, "%s mclk freq = 0\n", __func__);
195862306a36Sopenharmony_ci	}
195962306a36Sopenharmony_ci	return ret;
196062306a36Sopenharmony_ci}
196162306a36Sopenharmony_ci
196262306a36Sopenharmony_cistatic int mtk_dai_etdm_configure(struct mtk_base_afe *afe,
196362306a36Sopenharmony_ci				  unsigned int rate,
196462306a36Sopenharmony_ci				  unsigned int channels,
196562306a36Sopenharmony_ci				  unsigned int bit_width,
196662306a36Sopenharmony_ci				  int dai_id)
196762306a36Sopenharmony_ci{
196862306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
196962306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *etdm_data;
197062306a36Sopenharmony_ci	struct etdm_con_reg etdm_reg;
197162306a36Sopenharmony_ci	bool slave_mode;
197262306a36Sopenharmony_ci	unsigned int etdm_channels;
197362306a36Sopenharmony_ci	unsigned int val = 0;
197462306a36Sopenharmony_ci	unsigned int mask = 0;
197562306a36Sopenharmony_ci	unsigned int bck;
197662306a36Sopenharmony_ci	unsigned int wlen = get_etdm_wlen(bit_width);
197762306a36Sopenharmony_ci	int ret;
197862306a36Sopenharmony_ci
197962306a36Sopenharmony_ci	if (!mt8195_afe_etdm_is_valid(dai_id))
198062306a36Sopenharmony_ci		return -EINVAL;
198162306a36Sopenharmony_ci
198262306a36Sopenharmony_ci	etdm_data = afe_priv->dai_priv[dai_id];
198362306a36Sopenharmony_ci	slave_mode = etdm_data->slave_mode;
198462306a36Sopenharmony_ci	ret = get_etdm_reg(dai_id, &etdm_reg);
198562306a36Sopenharmony_ci	if (ret < 0)
198662306a36Sopenharmony_ci		return ret;
198762306a36Sopenharmony_ci
198862306a36Sopenharmony_ci	if (etdm_data->cowork_source_id != COWORK_ETDM_NONE)
198962306a36Sopenharmony_ci		slave_mode = true;
199062306a36Sopenharmony_ci
199162306a36Sopenharmony_ci	dev_dbg(afe->dev, "%s fmt %u data %u lrck %d-%u bck %d, clock %u slv %u\n",
199262306a36Sopenharmony_ci		__func__, etdm_data->format, etdm_data->data_mode,
199362306a36Sopenharmony_ci		etdm_data->lrck_inv, etdm_data->lrck_width, etdm_data->bck_inv,
199462306a36Sopenharmony_ci		etdm_data->clock_mode, etdm_data->slave_mode);
199562306a36Sopenharmony_ci	dev_dbg(afe->dev, "%s rate %u channels %u bitwidth %u, id %d\n",
199662306a36Sopenharmony_ci		__func__, rate, channels, bit_width, dai_id);
199762306a36Sopenharmony_ci
199862306a36Sopenharmony_ci	etdm_channels = (etdm_data->data_mode == MTK_DAI_ETDM_DATA_ONE_PIN) ?
199962306a36Sopenharmony_ci			get_etdm_ch_fixup(channels) : 2;
200062306a36Sopenharmony_ci
200162306a36Sopenharmony_ci	bck = rate * etdm_channels * wlen;
200262306a36Sopenharmony_ci	if (bck > MT8195_ETDM_NORMAL_MAX_BCK_RATE) {
200362306a36Sopenharmony_ci		dev_info(afe->dev, "%s bck rate %u not support\n",
200462306a36Sopenharmony_ci			 __func__, bck);
200562306a36Sopenharmony_ci		return -EINVAL;
200662306a36Sopenharmony_ci	}
200762306a36Sopenharmony_ci
200862306a36Sopenharmony_ci	/* con0 */
200962306a36Sopenharmony_ci	mask |= ETDM_CON0_BIT_LEN_MASK;
201062306a36Sopenharmony_ci	val |= ETDM_CON0_BIT_LEN(bit_width);
201162306a36Sopenharmony_ci	mask |= ETDM_CON0_WORD_LEN_MASK;
201262306a36Sopenharmony_ci	val |= ETDM_CON0_WORD_LEN(wlen);
201362306a36Sopenharmony_ci	mask |= ETDM_CON0_FORMAT_MASK;
201462306a36Sopenharmony_ci	val |= ETDM_CON0_FORMAT(etdm_data->format);
201562306a36Sopenharmony_ci	mask |= ETDM_CON0_CH_NUM_MASK;
201662306a36Sopenharmony_ci	val |= ETDM_CON0_CH_NUM(etdm_channels);
201762306a36Sopenharmony_ci
201862306a36Sopenharmony_ci	mask |= ETDM_CON0_SLAVE_MODE;
201962306a36Sopenharmony_ci	if (slave_mode) {
202062306a36Sopenharmony_ci		if (dai_id == MT8195_AFE_IO_ETDM1_OUT &&
202162306a36Sopenharmony_ci		    etdm_data->cowork_source_id == COWORK_ETDM_NONE) {
202262306a36Sopenharmony_ci			dev_info(afe->dev, "%s id %d only support master mode\n",
202362306a36Sopenharmony_ci				 __func__, dai_id);
202462306a36Sopenharmony_ci			return -EINVAL;
202562306a36Sopenharmony_ci		}
202662306a36Sopenharmony_ci		val |= ETDM_CON0_SLAVE_MODE;
202762306a36Sopenharmony_ci	}
202862306a36Sopenharmony_ci	regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val);
202962306a36Sopenharmony_ci
203062306a36Sopenharmony_ci	if (get_etdm_dir(dai_id) == ETDM_IN)
203162306a36Sopenharmony_ci		mtk_dai_etdm_in_configure(afe, rate, channels, dai_id);
203262306a36Sopenharmony_ci	else
203362306a36Sopenharmony_ci		mtk_dai_etdm_out_configure(afe, rate, channels, dai_id);
203462306a36Sopenharmony_ci
203562306a36Sopenharmony_ci	return 0;
203662306a36Sopenharmony_ci}
203762306a36Sopenharmony_ci
203862306a36Sopenharmony_cistatic int mtk_dai_etdm_hw_params(struct snd_pcm_substream *substream,
203962306a36Sopenharmony_ci				  struct snd_pcm_hw_params *params,
204062306a36Sopenharmony_ci				  struct snd_soc_dai *dai)
204162306a36Sopenharmony_ci{
204262306a36Sopenharmony_ci	int ret = 0;
204362306a36Sopenharmony_ci	unsigned int rate = params_rate(params);
204462306a36Sopenharmony_ci	unsigned int bit_width = params_width(params);
204562306a36Sopenharmony_ci	unsigned int channels = params_channels(params);
204662306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
204762306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
204862306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *mst_etdm_data;
204962306a36Sopenharmony_ci	int mst_dai_id;
205062306a36Sopenharmony_ci	int slv_dai_id;
205162306a36Sopenharmony_ci	int i;
205262306a36Sopenharmony_ci
205362306a36Sopenharmony_ci	dev_dbg(afe->dev, "%s '%s' period %u-%u\n",
205462306a36Sopenharmony_ci		__func__, snd_pcm_stream_str(substream),
205562306a36Sopenharmony_ci		params_period_size(params), params_periods(params));
205662306a36Sopenharmony_ci
205762306a36Sopenharmony_ci	if (is_cowork_mode(dai)) {
205862306a36Sopenharmony_ci		mst_dai_id = get_etdm_cowork_master_id(dai);
205962306a36Sopenharmony_ci		if (!mt8195_afe_etdm_is_valid(mst_dai_id))
206062306a36Sopenharmony_ci			return -EINVAL;
206162306a36Sopenharmony_ci
206262306a36Sopenharmony_ci		ret = mtk_dai_etdm_mclk_configure(afe, mst_dai_id);
206362306a36Sopenharmony_ci		if (ret)
206462306a36Sopenharmony_ci			return ret;
206562306a36Sopenharmony_ci
206662306a36Sopenharmony_ci		ret = mtk_dai_etdm_configure(afe, rate, channels,
206762306a36Sopenharmony_ci					     bit_width, mst_dai_id);
206862306a36Sopenharmony_ci		if (ret)
206962306a36Sopenharmony_ci			return ret;
207062306a36Sopenharmony_ci
207162306a36Sopenharmony_ci		mst_etdm_data = afe_priv->dai_priv[mst_dai_id];
207262306a36Sopenharmony_ci		for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {
207362306a36Sopenharmony_ci			slv_dai_id = mst_etdm_data->cowork_slv_id[i];
207462306a36Sopenharmony_ci			ret = mtk_dai_etdm_configure(afe, rate, channels,
207562306a36Sopenharmony_ci						     bit_width, slv_dai_id);
207662306a36Sopenharmony_ci			if (ret)
207762306a36Sopenharmony_ci				return ret;
207862306a36Sopenharmony_ci
207962306a36Sopenharmony_ci			ret = mt8195_etdm_sync_mode_configure(afe, slv_dai_id);
208062306a36Sopenharmony_ci			if (ret)
208162306a36Sopenharmony_ci				return ret;
208262306a36Sopenharmony_ci		}
208362306a36Sopenharmony_ci	} else {
208462306a36Sopenharmony_ci		ret = mtk_dai_etdm_mclk_configure(afe, dai->id);
208562306a36Sopenharmony_ci		if (ret)
208662306a36Sopenharmony_ci			return ret;
208762306a36Sopenharmony_ci
208862306a36Sopenharmony_ci		ret = mtk_dai_etdm_configure(afe, rate, channels,
208962306a36Sopenharmony_ci					     bit_width, dai->id);
209062306a36Sopenharmony_ci	}
209162306a36Sopenharmony_ci
209262306a36Sopenharmony_ci	return ret;
209362306a36Sopenharmony_ci}
209462306a36Sopenharmony_ci
209562306a36Sopenharmony_cistatic int mtk_dai_etdm_trigger(struct snd_pcm_substream *substream, int cmd,
209662306a36Sopenharmony_ci				struct snd_soc_dai *dai)
209762306a36Sopenharmony_ci{
209862306a36Sopenharmony_ci	int ret = 0;
209962306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
210062306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
210162306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *mst_etdm_data;
210262306a36Sopenharmony_ci	int mst_dai_id;
210362306a36Sopenharmony_ci	int slv_dai_id;
210462306a36Sopenharmony_ci	int i;
210562306a36Sopenharmony_ci
210662306a36Sopenharmony_ci	dev_dbg(afe->dev, "%s(), cmd %d, dai id %d\n", __func__, cmd, dai->id);
210762306a36Sopenharmony_ci	switch (cmd) {
210862306a36Sopenharmony_ci	case SNDRV_PCM_TRIGGER_START:
210962306a36Sopenharmony_ci	case SNDRV_PCM_TRIGGER_RESUME:
211062306a36Sopenharmony_ci		if (is_cowork_mode(dai)) {
211162306a36Sopenharmony_ci			mst_dai_id = get_etdm_cowork_master_id(dai);
211262306a36Sopenharmony_ci			if (!mt8195_afe_etdm_is_valid(mst_dai_id))
211362306a36Sopenharmony_ci				return -EINVAL;
211462306a36Sopenharmony_ci
211562306a36Sopenharmony_ci			mst_etdm_data = afe_priv->dai_priv[mst_dai_id];
211662306a36Sopenharmony_ci
211762306a36Sopenharmony_ci			//open master first
211862306a36Sopenharmony_ci			ret |= mt8195_afe_enable_etdm(afe, mst_dai_id);
211962306a36Sopenharmony_ci			for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {
212062306a36Sopenharmony_ci				slv_dai_id = mst_etdm_data->cowork_slv_id[i];
212162306a36Sopenharmony_ci				ret |= mt8195_afe_enable_etdm(afe, slv_dai_id);
212262306a36Sopenharmony_ci			}
212362306a36Sopenharmony_ci		} else {
212462306a36Sopenharmony_ci			ret = mt8195_afe_enable_etdm(afe, dai->id);
212562306a36Sopenharmony_ci		}
212662306a36Sopenharmony_ci		break;
212762306a36Sopenharmony_ci	case SNDRV_PCM_TRIGGER_STOP:
212862306a36Sopenharmony_ci	case SNDRV_PCM_TRIGGER_SUSPEND:
212962306a36Sopenharmony_ci		if (is_cowork_mode(dai)) {
213062306a36Sopenharmony_ci			mst_dai_id = get_etdm_cowork_master_id(dai);
213162306a36Sopenharmony_ci			if (!mt8195_afe_etdm_is_valid(mst_dai_id))
213262306a36Sopenharmony_ci				return -EINVAL;
213362306a36Sopenharmony_ci
213462306a36Sopenharmony_ci			mst_etdm_data = afe_priv->dai_priv[mst_dai_id];
213562306a36Sopenharmony_ci
213662306a36Sopenharmony_ci			for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {
213762306a36Sopenharmony_ci				slv_dai_id = mst_etdm_data->cowork_slv_id[i];
213862306a36Sopenharmony_ci				ret |= mt8195_afe_disable_etdm(afe, slv_dai_id);
213962306a36Sopenharmony_ci			}
214062306a36Sopenharmony_ci			// close master at last
214162306a36Sopenharmony_ci			ret |= mt8195_afe_disable_etdm(afe, mst_dai_id);
214262306a36Sopenharmony_ci		} else {
214362306a36Sopenharmony_ci			ret = mt8195_afe_disable_etdm(afe, dai->id);
214462306a36Sopenharmony_ci		}
214562306a36Sopenharmony_ci		break;
214662306a36Sopenharmony_ci	default:
214762306a36Sopenharmony_ci		break;
214862306a36Sopenharmony_ci	}
214962306a36Sopenharmony_ci	return ret;
215062306a36Sopenharmony_ci}
215162306a36Sopenharmony_ci
215262306a36Sopenharmony_cistatic int mtk_dai_etdm_cal_mclk(struct mtk_base_afe *afe, int freq, int dai_id)
215362306a36Sopenharmony_ci{
215462306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
215562306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *etdm_data;
215662306a36Sopenharmony_ci	int apll;
215762306a36Sopenharmony_ci	int apll_rate;
215862306a36Sopenharmony_ci
215962306a36Sopenharmony_ci	if (!mt8195_afe_etdm_is_valid(dai_id))
216062306a36Sopenharmony_ci		return -EINVAL;
216162306a36Sopenharmony_ci
216262306a36Sopenharmony_ci	etdm_data = afe_priv->dai_priv[dai_id];
216362306a36Sopenharmony_ci	if (freq == 0) {
216462306a36Sopenharmony_ci		etdm_data->mclk_freq = freq;
216562306a36Sopenharmony_ci		return 0;
216662306a36Sopenharmony_ci	}
216762306a36Sopenharmony_ci
216862306a36Sopenharmony_ci	apll = mt8195_afe_get_default_mclk_source_by_rate(freq);
216962306a36Sopenharmony_ci	apll_rate = mt8195_afe_get_mclk_source_rate(afe, apll);
217062306a36Sopenharmony_ci
217162306a36Sopenharmony_ci	if (freq > apll_rate) {
217262306a36Sopenharmony_ci		dev_info(afe->dev, "freq %d > apll rate %d\n", freq, apll_rate);
217362306a36Sopenharmony_ci		return -EINVAL;
217462306a36Sopenharmony_ci	}
217562306a36Sopenharmony_ci
217662306a36Sopenharmony_ci	if (apll_rate % freq != 0) {
217762306a36Sopenharmony_ci		dev_info(afe->dev, "APLL%d cannot generate freq Hz\n", apll);
217862306a36Sopenharmony_ci		return -EINVAL;
217962306a36Sopenharmony_ci	}
218062306a36Sopenharmony_ci
218162306a36Sopenharmony_ci	etdm_data->mclk_apll = apll;
218262306a36Sopenharmony_ci	etdm_data->mclk_freq = freq;
218362306a36Sopenharmony_ci
218462306a36Sopenharmony_ci	return 0;
218562306a36Sopenharmony_ci}
218662306a36Sopenharmony_ci
218762306a36Sopenharmony_cistatic int mtk_dai_etdm_set_sysclk(struct snd_soc_dai *dai,
218862306a36Sopenharmony_ci				   int clk_id, unsigned int freq, int dir)
218962306a36Sopenharmony_ci{
219062306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
219162306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
219262306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *etdm_data;
219362306a36Sopenharmony_ci	int dai_id;
219462306a36Sopenharmony_ci
219562306a36Sopenharmony_ci	dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n",
219662306a36Sopenharmony_ci		__func__, dai->id, freq, dir);
219762306a36Sopenharmony_ci	if (is_cowork_mode(dai))
219862306a36Sopenharmony_ci		dai_id = get_etdm_cowork_master_id(dai);
219962306a36Sopenharmony_ci	else
220062306a36Sopenharmony_ci		dai_id = dai->id;
220162306a36Sopenharmony_ci
220262306a36Sopenharmony_ci	if (!mt8195_afe_etdm_is_valid(dai_id))
220362306a36Sopenharmony_ci		return -EINVAL;
220462306a36Sopenharmony_ci
220562306a36Sopenharmony_ci	etdm_data = afe_priv->dai_priv[dai_id];
220662306a36Sopenharmony_ci	etdm_data->mclk_dir = dir;
220762306a36Sopenharmony_ci	return mtk_dai_etdm_cal_mclk(afe, freq, dai_id);
220862306a36Sopenharmony_ci}
220962306a36Sopenharmony_ci
221062306a36Sopenharmony_cistatic int mtk_dai_etdm_set_tdm_slot(struct snd_soc_dai *dai,
221162306a36Sopenharmony_ci				     unsigned int tx_mask, unsigned int rx_mask,
221262306a36Sopenharmony_ci				     int slots, int slot_width)
221362306a36Sopenharmony_ci{
221462306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
221562306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
221662306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *etdm_data;
221762306a36Sopenharmony_ci
221862306a36Sopenharmony_ci	if (!mt8195_afe_etdm_is_valid(dai->id))
221962306a36Sopenharmony_ci		return -EINVAL;
222062306a36Sopenharmony_ci
222162306a36Sopenharmony_ci	etdm_data = afe_priv->dai_priv[dai->id];
222262306a36Sopenharmony_ci	dev_dbg(dai->dev, "%s id %d slot_width %d\n",
222362306a36Sopenharmony_ci		__func__, dai->id, slot_width);
222462306a36Sopenharmony_ci
222562306a36Sopenharmony_ci	etdm_data->slots = slots;
222662306a36Sopenharmony_ci	etdm_data->lrck_width = slot_width;
222762306a36Sopenharmony_ci	return 0;
222862306a36Sopenharmony_ci}
222962306a36Sopenharmony_ci
223062306a36Sopenharmony_cistatic int mtk_dai_etdm_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
223162306a36Sopenharmony_ci{
223262306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
223362306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
223462306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *etdm_data;
223562306a36Sopenharmony_ci
223662306a36Sopenharmony_ci	if (!mt8195_afe_etdm_is_valid(dai->id))
223762306a36Sopenharmony_ci		return -EINVAL;
223862306a36Sopenharmony_ci
223962306a36Sopenharmony_ci	etdm_data = afe_priv->dai_priv[dai->id];
224062306a36Sopenharmony_ci	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
224162306a36Sopenharmony_ci	case SND_SOC_DAIFMT_I2S:
224262306a36Sopenharmony_ci		etdm_data->format = MTK_DAI_ETDM_FORMAT_I2S;
224362306a36Sopenharmony_ci		break;
224462306a36Sopenharmony_ci	case SND_SOC_DAIFMT_LEFT_J:
224562306a36Sopenharmony_ci		etdm_data->format = MTK_DAI_ETDM_FORMAT_LJ;
224662306a36Sopenharmony_ci		break;
224762306a36Sopenharmony_ci	case SND_SOC_DAIFMT_RIGHT_J:
224862306a36Sopenharmony_ci		etdm_data->format = MTK_DAI_ETDM_FORMAT_RJ;
224962306a36Sopenharmony_ci		break;
225062306a36Sopenharmony_ci	case SND_SOC_DAIFMT_DSP_A:
225162306a36Sopenharmony_ci		etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPA;
225262306a36Sopenharmony_ci		break;
225362306a36Sopenharmony_ci	case SND_SOC_DAIFMT_DSP_B:
225462306a36Sopenharmony_ci		etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPB;
225562306a36Sopenharmony_ci		break;
225662306a36Sopenharmony_ci	default:
225762306a36Sopenharmony_ci		return -EINVAL;
225862306a36Sopenharmony_ci	}
225962306a36Sopenharmony_ci
226062306a36Sopenharmony_ci	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
226162306a36Sopenharmony_ci	case SND_SOC_DAIFMT_NB_NF:
226262306a36Sopenharmony_ci		etdm_data->bck_inv = false;
226362306a36Sopenharmony_ci		etdm_data->lrck_inv = false;
226462306a36Sopenharmony_ci		break;
226562306a36Sopenharmony_ci	case SND_SOC_DAIFMT_NB_IF:
226662306a36Sopenharmony_ci		etdm_data->bck_inv = false;
226762306a36Sopenharmony_ci		etdm_data->lrck_inv = true;
226862306a36Sopenharmony_ci		break;
226962306a36Sopenharmony_ci	case SND_SOC_DAIFMT_IB_NF:
227062306a36Sopenharmony_ci		etdm_data->bck_inv = true;
227162306a36Sopenharmony_ci		etdm_data->lrck_inv = false;
227262306a36Sopenharmony_ci		break;
227362306a36Sopenharmony_ci	case SND_SOC_DAIFMT_IB_IF:
227462306a36Sopenharmony_ci		etdm_data->bck_inv = true;
227562306a36Sopenharmony_ci		etdm_data->lrck_inv = true;
227662306a36Sopenharmony_ci		break;
227762306a36Sopenharmony_ci	default:
227862306a36Sopenharmony_ci		return -EINVAL;
227962306a36Sopenharmony_ci	}
228062306a36Sopenharmony_ci
228162306a36Sopenharmony_ci	switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
228262306a36Sopenharmony_ci	case SND_SOC_DAIFMT_BC_FC:
228362306a36Sopenharmony_ci		etdm_data->slave_mode = true;
228462306a36Sopenharmony_ci		break;
228562306a36Sopenharmony_ci	case SND_SOC_DAIFMT_BP_FP:
228662306a36Sopenharmony_ci		etdm_data->slave_mode = false;
228762306a36Sopenharmony_ci		break;
228862306a36Sopenharmony_ci	default:
228962306a36Sopenharmony_ci		return -EINVAL;
229062306a36Sopenharmony_ci	}
229162306a36Sopenharmony_ci
229262306a36Sopenharmony_ci	return 0;
229362306a36Sopenharmony_ci}
229462306a36Sopenharmony_ci
229562306a36Sopenharmony_cistatic int mtk_dai_hdmitx_dptx_startup(struct snd_pcm_substream *substream,
229662306a36Sopenharmony_ci				       struct snd_soc_dai *dai)
229762306a36Sopenharmony_ci{
229862306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
229962306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
230062306a36Sopenharmony_ci	int cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id);
230162306a36Sopenharmony_ci
230262306a36Sopenharmony_ci	if (cg_id >= 0)
230362306a36Sopenharmony_ci		mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]);
230462306a36Sopenharmony_ci
230562306a36Sopenharmony_ci	mtk_dai_etdm_enable_mclk(afe, dai->id);
230662306a36Sopenharmony_ci
230762306a36Sopenharmony_ci	return 0;
230862306a36Sopenharmony_ci}
230962306a36Sopenharmony_ci
231062306a36Sopenharmony_cistatic void mtk_dai_hdmitx_dptx_shutdown(struct snd_pcm_substream *substream,
231162306a36Sopenharmony_ci					 struct snd_soc_dai *dai)
231262306a36Sopenharmony_ci{
231362306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
231462306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
231562306a36Sopenharmony_ci	int cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(dai->id);
231662306a36Sopenharmony_ci
231762306a36Sopenharmony_ci	mtk_dai_etdm_disable_mclk(afe, dai->id);
231862306a36Sopenharmony_ci
231962306a36Sopenharmony_ci	if (cg_id >= 0)
232062306a36Sopenharmony_ci		mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]);
232162306a36Sopenharmony_ci}
232262306a36Sopenharmony_ci
232362306a36Sopenharmony_cistatic unsigned int mtk_dai_get_dptx_ch_en(unsigned int channel)
232462306a36Sopenharmony_ci{
232562306a36Sopenharmony_ci	switch (channel) {
232662306a36Sopenharmony_ci	case 1 ... 2:
232762306a36Sopenharmony_ci		return AFE_DPTX_CON_CH_EN_2CH;
232862306a36Sopenharmony_ci	case 3 ... 4:
232962306a36Sopenharmony_ci		return AFE_DPTX_CON_CH_EN_4CH;
233062306a36Sopenharmony_ci	case 5 ... 6:
233162306a36Sopenharmony_ci		return AFE_DPTX_CON_CH_EN_6CH;
233262306a36Sopenharmony_ci	case 7 ... 8:
233362306a36Sopenharmony_ci		return AFE_DPTX_CON_CH_EN_8CH;
233462306a36Sopenharmony_ci	default:
233562306a36Sopenharmony_ci		return AFE_DPTX_CON_CH_EN_2CH;
233662306a36Sopenharmony_ci	}
233762306a36Sopenharmony_ci}
233862306a36Sopenharmony_ci
233962306a36Sopenharmony_cistatic unsigned int mtk_dai_get_dptx_ch(unsigned int ch)
234062306a36Sopenharmony_ci{
234162306a36Sopenharmony_ci	return (ch > 2) ?
234262306a36Sopenharmony_ci		AFE_DPTX_CON_CH_NUM_8CH : AFE_DPTX_CON_CH_NUM_2CH;
234362306a36Sopenharmony_ci}
234462306a36Sopenharmony_ci
234562306a36Sopenharmony_cistatic unsigned int mtk_dai_get_dptx_wlen(snd_pcm_format_t format)
234662306a36Sopenharmony_ci{
234762306a36Sopenharmony_ci	return snd_pcm_format_physical_width(format) <= 16 ?
234862306a36Sopenharmony_ci		AFE_DPTX_CON_16BIT : AFE_DPTX_CON_24BIT;
234962306a36Sopenharmony_ci}
235062306a36Sopenharmony_ci
235162306a36Sopenharmony_cistatic int mtk_dai_hdmitx_dptx_hw_params(struct snd_pcm_substream *substream,
235262306a36Sopenharmony_ci					 struct snd_pcm_hw_params *params,
235362306a36Sopenharmony_ci					 struct snd_soc_dai *dai)
235462306a36Sopenharmony_ci{
235562306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
235662306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
235762306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *etdm_data;
235862306a36Sopenharmony_ci	unsigned int rate = params_rate(params);
235962306a36Sopenharmony_ci	unsigned int channels = params_channels(params);
236062306a36Sopenharmony_ci	snd_pcm_format_t format = params_format(params);
236162306a36Sopenharmony_ci	int width = snd_pcm_format_physical_width(format);
236262306a36Sopenharmony_ci	int ret = 0;
236362306a36Sopenharmony_ci
236462306a36Sopenharmony_ci	if (!mt8195_afe_hdmitx_dptx_is_valid(dai->id))
236562306a36Sopenharmony_ci		return -EINVAL;
236662306a36Sopenharmony_ci
236762306a36Sopenharmony_ci	etdm_data = afe_priv->dai_priv[dai->id];
236862306a36Sopenharmony_ci
236962306a36Sopenharmony_ci	/* dptx configure */
237062306a36Sopenharmony_ci	if (dai->id == MT8195_AFE_IO_DPTX) {
237162306a36Sopenharmony_ci		regmap_update_bits(afe->regmap, AFE_DPTX_CON,
237262306a36Sopenharmony_ci				   AFE_DPTX_CON_CH_EN_MASK,
237362306a36Sopenharmony_ci				   mtk_dai_get_dptx_ch_en(channels));
237462306a36Sopenharmony_ci		regmap_update_bits(afe->regmap, AFE_DPTX_CON,
237562306a36Sopenharmony_ci				   AFE_DPTX_CON_CH_NUM_MASK,
237662306a36Sopenharmony_ci				   mtk_dai_get_dptx_ch(channels));
237762306a36Sopenharmony_ci		regmap_update_bits(afe->regmap, AFE_DPTX_CON,
237862306a36Sopenharmony_ci				   AFE_DPTX_CON_16BIT_MASK,
237962306a36Sopenharmony_ci				   mtk_dai_get_dptx_wlen(format));
238062306a36Sopenharmony_ci
238162306a36Sopenharmony_ci		if (mtk_dai_get_dptx_ch(channels) == AFE_DPTX_CON_CH_NUM_8CH) {
238262306a36Sopenharmony_ci			etdm_data->data_mode = MTK_DAI_ETDM_DATA_ONE_PIN;
238362306a36Sopenharmony_ci			channels = 8;
238462306a36Sopenharmony_ci		} else {
238562306a36Sopenharmony_ci			channels = 2;
238662306a36Sopenharmony_ci		}
238762306a36Sopenharmony_ci	} else {
238862306a36Sopenharmony_ci		etdm_data->data_mode = MTK_DAI_ETDM_DATA_MULTI_PIN;
238962306a36Sopenharmony_ci	}
239062306a36Sopenharmony_ci
239162306a36Sopenharmony_ci	ret = mtk_dai_etdm_mclk_configure(afe, dai->id);
239262306a36Sopenharmony_ci	if (ret)
239362306a36Sopenharmony_ci		return ret;
239462306a36Sopenharmony_ci
239562306a36Sopenharmony_ci	ret = mtk_dai_etdm_configure(afe, rate, channels, width, dai->id);
239662306a36Sopenharmony_ci
239762306a36Sopenharmony_ci	return ret;
239862306a36Sopenharmony_ci}
239962306a36Sopenharmony_ci
240062306a36Sopenharmony_cistatic int mtk_dai_hdmitx_dptx_trigger(struct snd_pcm_substream *substream,
240162306a36Sopenharmony_ci				       int cmd,
240262306a36Sopenharmony_ci				       struct snd_soc_dai *dai)
240362306a36Sopenharmony_ci{
240462306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
240562306a36Sopenharmony_ci	int ret = 0;
240662306a36Sopenharmony_ci
240762306a36Sopenharmony_ci	dev_dbg(afe->dev, "%s(), cmd %d, dai id %d\n", __func__, cmd, dai->id);
240862306a36Sopenharmony_ci
240962306a36Sopenharmony_ci	switch (cmd) {
241062306a36Sopenharmony_ci	case SNDRV_PCM_TRIGGER_START:
241162306a36Sopenharmony_ci	case SNDRV_PCM_TRIGGER_RESUME:
241262306a36Sopenharmony_ci		/* enable dptx interface */
241362306a36Sopenharmony_ci		if (dai->id == MT8195_AFE_IO_DPTX)
241462306a36Sopenharmony_ci			regmap_update_bits(afe->regmap, AFE_DPTX_CON,
241562306a36Sopenharmony_ci					   AFE_DPTX_CON_ON_MASK,
241662306a36Sopenharmony_ci					   AFE_DPTX_CON_ON);
241762306a36Sopenharmony_ci
241862306a36Sopenharmony_ci		/* enable etdm_out3 */
241962306a36Sopenharmony_ci		ret = mt8195_afe_enable_etdm(afe, dai->id);
242062306a36Sopenharmony_ci		break;
242162306a36Sopenharmony_ci	case SNDRV_PCM_TRIGGER_STOP:
242262306a36Sopenharmony_ci	case SNDRV_PCM_TRIGGER_SUSPEND:
242362306a36Sopenharmony_ci		/* disable etdm_out3 */
242462306a36Sopenharmony_ci		ret = mt8195_afe_disable_etdm(afe, dai->id);
242562306a36Sopenharmony_ci
242662306a36Sopenharmony_ci		/* disable dptx interface */
242762306a36Sopenharmony_ci		if (dai->id == MT8195_AFE_IO_DPTX)
242862306a36Sopenharmony_ci			regmap_update_bits(afe->regmap, AFE_DPTX_CON,
242962306a36Sopenharmony_ci					   AFE_DPTX_CON_ON_MASK, 0);
243062306a36Sopenharmony_ci		break;
243162306a36Sopenharmony_ci	default:
243262306a36Sopenharmony_ci		return -EINVAL;
243362306a36Sopenharmony_ci	}
243462306a36Sopenharmony_ci
243562306a36Sopenharmony_ci	return ret;
243662306a36Sopenharmony_ci}
243762306a36Sopenharmony_ci
243862306a36Sopenharmony_cistatic int mtk_dai_hdmitx_dptx_set_sysclk(struct snd_soc_dai *dai,
243962306a36Sopenharmony_ci					  int clk_id,
244062306a36Sopenharmony_ci					  unsigned int freq,
244162306a36Sopenharmony_ci					  int dir)
244262306a36Sopenharmony_ci{
244362306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
244462306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
244562306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *etdm_data;
244662306a36Sopenharmony_ci
244762306a36Sopenharmony_ci	if (!mt8195_afe_hdmitx_dptx_is_valid(dai->id))
244862306a36Sopenharmony_ci		return -EINVAL;
244962306a36Sopenharmony_ci
245062306a36Sopenharmony_ci	etdm_data = afe_priv->dai_priv[dai->id];
245162306a36Sopenharmony_ci
245262306a36Sopenharmony_ci	dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n",
245362306a36Sopenharmony_ci		__func__, dai->id, freq, dir);
245462306a36Sopenharmony_ci
245562306a36Sopenharmony_ci	etdm_data->mclk_dir = dir;
245662306a36Sopenharmony_ci	return mtk_dai_etdm_cal_mclk(afe, freq, dai->id);
245762306a36Sopenharmony_ci}
245862306a36Sopenharmony_ci
245962306a36Sopenharmony_ci/* dai driver */
246062306a36Sopenharmony_ci#define MTK_ETDM_RATES (SNDRV_PCM_RATE_8000_384000)
246162306a36Sopenharmony_ci
246262306a36Sopenharmony_ci#define MTK_ETDM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
246362306a36Sopenharmony_ci			  SNDRV_PCM_FMTBIT_S24_LE |\
246462306a36Sopenharmony_ci			  SNDRV_PCM_FMTBIT_S32_LE)
246562306a36Sopenharmony_ci
246662306a36Sopenharmony_cistatic int mtk_dai_etdm_probe(struct snd_soc_dai *dai)
246762306a36Sopenharmony_ci{
246862306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
246962306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
247062306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *etdm_data;
247162306a36Sopenharmony_ci
247262306a36Sopenharmony_ci	dev_dbg(dai->dev, "%s id %d\n", __func__, dai->id);
247362306a36Sopenharmony_ci
247462306a36Sopenharmony_ci	if (!mt8195_afe_etdm_is_valid(dai->id))
247562306a36Sopenharmony_ci		return -EINVAL;
247662306a36Sopenharmony_ci
247762306a36Sopenharmony_ci	etdm_data = afe_priv->dai_priv[dai->id];
247862306a36Sopenharmony_ci	if (etdm_data->mclk_freq) {
247962306a36Sopenharmony_ci		dev_dbg(afe->dev, "MCLK always on, rate %d\n",
248062306a36Sopenharmony_ci			etdm_data->mclk_freq);
248162306a36Sopenharmony_ci		pm_runtime_get_sync(afe->dev);
248262306a36Sopenharmony_ci		mtk_dai_etdm_mclk_configure(afe, dai->id);
248362306a36Sopenharmony_ci		mtk_dai_etdm_enable_mclk(afe, dai->id);
248462306a36Sopenharmony_ci		pm_runtime_put_sync(afe->dev);
248562306a36Sopenharmony_ci	}
248662306a36Sopenharmony_ci	return 0;
248762306a36Sopenharmony_ci}
248862306a36Sopenharmony_ci
248962306a36Sopenharmony_cistatic const struct snd_soc_dai_ops mtk_dai_hdmitx_dptx_ops = {
249062306a36Sopenharmony_ci	.startup	= mtk_dai_hdmitx_dptx_startup,
249162306a36Sopenharmony_ci	.shutdown	= mtk_dai_hdmitx_dptx_shutdown,
249262306a36Sopenharmony_ci	.hw_params	= mtk_dai_hdmitx_dptx_hw_params,
249362306a36Sopenharmony_ci	.trigger	= mtk_dai_hdmitx_dptx_trigger,
249462306a36Sopenharmony_ci	.set_sysclk	= mtk_dai_hdmitx_dptx_set_sysclk,
249562306a36Sopenharmony_ci	.set_fmt	= mtk_dai_etdm_set_fmt,
249662306a36Sopenharmony_ci};
249762306a36Sopenharmony_ci
249862306a36Sopenharmony_cistatic const struct snd_soc_dai_ops mtk_dai_hdmitx_dptx_ops2 = {
249962306a36Sopenharmony_ci	.probe		= mtk_dai_etdm_probe,
250062306a36Sopenharmony_ci	.startup	= mtk_dai_hdmitx_dptx_startup,
250162306a36Sopenharmony_ci	.shutdown	= mtk_dai_hdmitx_dptx_shutdown,
250262306a36Sopenharmony_ci	.hw_params	= mtk_dai_hdmitx_dptx_hw_params,
250362306a36Sopenharmony_ci	.trigger	= mtk_dai_hdmitx_dptx_trigger,
250462306a36Sopenharmony_ci	.set_sysclk	= mtk_dai_hdmitx_dptx_set_sysclk,
250562306a36Sopenharmony_ci	.set_fmt	= mtk_dai_etdm_set_fmt,
250662306a36Sopenharmony_ci};
250762306a36Sopenharmony_ci
250862306a36Sopenharmony_cistatic const struct snd_soc_dai_ops mtk_dai_etdm_ops = {
250962306a36Sopenharmony_ci	.probe		= mtk_dai_etdm_probe,
251062306a36Sopenharmony_ci	.startup	= mtk_dai_etdm_startup,
251162306a36Sopenharmony_ci	.shutdown	= mtk_dai_etdm_shutdown,
251262306a36Sopenharmony_ci	.hw_params	= mtk_dai_etdm_hw_params,
251362306a36Sopenharmony_ci	.trigger	= mtk_dai_etdm_trigger,
251462306a36Sopenharmony_ci	.set_sysclk	= mtk_dai_etdm_set_sysclk,
251562306a36Sopenharmony_ci	.set_fmt	= mtk_dai_etdm_set_fmt,
251662306a36Sopenharmony_ci	.set_tdm_slot	= mtk_dai_etdm_set_tdm_slot,
251762306a36Sopenharmony_ci};
251862306a36Sopenharmony_ci
251962306a36Sopenharmony_cistatic struct snd_soc_dai_driver mtk_dai_etdm_driver[] = {
252062306a36Sopenharmony_ci	{
252162306a36Sopenharmony_ci		.name = "DPTX",
252262306a36Sopenharmony_ci		.id = MT8195_AFE_IO_DPTX,
252362306a36Sopenharmony_ci		.playback = {
252462306a36Sopenharmony_ci			.stream_name = "DPTX Playback",
252562306a36Sopenharmony_ci			.channels_min = 1,
252662306a36Sopenharmony_ci			.channels_max = 8,
252762306a36Sopenharmony_ci			.rates = MTK_ETDM_RATES,
252862306a36Sopenharmony_ci			.formats = MTK_ETDM_FORMATS,
252962306a36Sopenharmony_ci		},
253062306a36Sopenharmony_ci		.ops = &mtk_dai_hdmitx_dptx_ops,
253162306a36Sopenharmony_ci	},
253262306a36Sopenharmony_ci	{
253362306a36Sopenharmony_ci		.name = "ETDM1_IN",
253462306a36Sopenharmony_ci		.id = MT8195_AFE_IO_ETDM1_IN,
253562306a36Sopenharmony_ci		.capture = {
253662306a36Sopenharmony_ci			.stream_name = "ETDM1 Capture",
253762306a36Sopenharmony_ci			.channels_min = 1,
253862306a36Sopenharmony_ci			.channels_max = 24,
253962306a36Sopenharmony_ci			.rates = MTK_ETDM_RATES,
254062306a36Sopenharmony_ci			.formats = MTK_ETDM_FORMATS,
254162306a36Sopenharmony_ci		},
254262306a36Sopenharmony_ci		.ops = &mtk_dai_etdm_ops,
254362306a36Sopenharmony_ci	},
254462306a36Sopenharmony_ci	{
254562306a36Sopenharmony_ci		.name = "ETDM2_IN",
254662306a36Sopenharmony_ci		.id = MT8195_AFE_IO_ETDM2_IN,
254762306a36Sopenharmony_ci		.capture = {
254862306a36Sopenharmony_ci			.stream_name = "ETDM2 Capture",
254962306a36Sopenharmony_ci			.channels_min = 1,
255062306a36Sopenharmony_ci			.channels_max = 16,
255162306a36Sopenharmony_ci			.rates = MTK_ETDM_RATES,
255262306a36Sopenharmony_ci			.formats = MTK_ETDM_FORMATS,
255362306a36Sopenharmony_ci		},
255462306a36Sopenharmony_ci		.ops = &mtk_dai_etdm_ops,
255562306a36Sopenharmony_ci	},
255662306a36Sopenharmony_ci	{
255762306a36Sopenharmony_ci		.name = "ETDM1_OUT",
255862306a36Sopenharmony_ci		.id = MT8195_AFE_IO_ETDM1_OUT,
255962306a36Sopenharmony_ci		.playback = {
256062306a36Sopenharmony_ci			.stream_name = "ETDM1 Playback",
256162306a36Sopenharmony_ci			.channels_min = 1,
256262306a36Sopenharmony_ci			.channels_max = 24,
256362306a36Sopenharmony_ci			.rates = MTK_ETDM_RATES,
256462306a36Sopenharmony_ci			.formats = MTK_ETDM_FORMATS,
256562306a36Sopenharmony_ci		},
256662306a36Sopenharmony_ci		.ops = &mtk_dai_etdm_ops,
256762306a36Sopenharmony_ci	},
256862306a36Sopenharmony_ci	{
256962306a36Sopenharmony_ci		.name = "ETDM2_OUT",
257062306a36Sopenharmony_ci		.id = MT8195_AFE_IO_ETDM2_OUT,
257162306a36Sopenharmony_ci		.playback = {
257262306a36Sopenharmony_ci			.stream_name = "ETDM2 Playback",
257362306a36Sopenharmony_ci			.channels_min = 1,
257462306a36Sopenharmony_ci			.channels_max = 24,
257562306a36Sopenharmony_ci			.rates = MTK_ETDM_RATES,
257662306a36Sopenharmony_ci			.formats = MTK_ETDM_FORMATS,
257762306a36Sopenharmony_ci		},
257862306a36Sopenharmony_ci		.ops = &mtk_dai_etdm_ops,
257962306a36Sopenharmony_ci	},
258062306a36Sopenharmony_ci	{
258162306a36Sopenharmony_ci		.name = "ETDM3_OUT",
258262306a36Sopenharmony_ci		.id = MT8195_AFE_IO_ETDM3_OUT,
258362306a36Sopenharmony_ci		.playback = {
258462306a36Sopenharmony_ci			.stream_name = "ETDM3 Playback",
258562306a36Sopenharmony_ci			.channels_min = 1,
258662306a36Sopenharmony_ci			.channels_max = 8,
258762306a36Sopenharmony_ci			.rates = MTK_ETDM_RATES,
258862306a36Sopenharmony_ci			.formats = MTK_ETDM_FORMATS,
258962306a36Sopenharmony_ci		},
259062306a36Sopenharmony_ci		.ops = &mtk_dai_hdmitx_dptx_ops2,
259162306a36Sopenharmony_ci	},
259262306a36Sopenharmony_ci};
259362306a36Sopenharmony_ci
259462306a36Sopenharmony_cistatic void mt8195_etdm_update_sync_info(struct mtk_base_afe *afe)
259562306a36Sopenharmony_ci{
259662306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
259762306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *etdm_data;
259862306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *mst_data;
259962306a36Sopenharmony_ci	int i;
260062306a36Sopenharmony_ci	int mst_dai_id;
260162306a36Sopenharmony_ci
260262306a36Sopenharmony_ci	for (i = MT8195_AFE_IO_ETDM_START; i < MT8195_AFE_IO_ETDM_END; i++) {
260362306a36Sopenharmony_ci		etdm_data = afe_priv->dai_priv[i];
260462306a36Sopenharmony_ci		if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) {
260562306a36Sopenharmony_ci			mst_dai_id = etdm_data->cowork_source_id;
260662306a36Sopenharmony_ci			if (!mt8195_afe_etdm_is_valid(mst_dai_id)) {
260762306a36Sopenharmony_ci				dev_err(afe->dev, "%s invalid dai id %d\n",
260862306a36Sopenharmony_ci					__func__, mst_dai_id);
260962306a36Sopenharmony_ci				return;
261062306a36Sopenharmony_ci			}
261162306a36Sopenharmony_ci			mst_data = afe_priv->dai_priv[mst_dai_id];
261262306a36Sopenharmony_ci			if (mst_data->cowork_source_id != COWORK_ETDM_NONE)
261362306a36Sopenharmony_ci				dev_info(afe->dev, "%s [%d] wrong sync source\n"
261462306a36Sopenharmony_ci					 , __func__, i);
261562306a36Sopenharmony_ci			mst_data->cowork_slv_id[mst_data->cowork_slv_count] = i;
261662306a36Sopenharmony_ci			mst_data->cowork_slv_count++;
261762306a36Sopenharmony_ci		}
261862306a36Sopenharmony_ci	}
261962306a36Sopenharmony_ci}
262062306a36Sopenharmony_ci
262162306a36Sopenharmony_cistatic void mt8195_dai_etdm_parse_of(struct mtk_base_afe *afe)
262262306a36Sopenharmony_ci{
262362306a36Sopenharmony_ci	const struct device_node *of_node = afe->dev->of_node;
262462306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
262562306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *etdm_data;
262662306a36Sopenharmony_ci	int i, j;
262762306a36Sopenharmony_ci	char prop[48];
262862306a36Sopenharmony_ci	u8 disable_chn[MT8195_ETDM_MAX_CHANNELS];
262962306a36Sopenharmony_ci	int max_chn = MT8195_ETDM_MAX_CHANNELS;
263062306a36Sopenharmony_ci	u32 sel;
263162306a36Sopenharmony_ci	int ret;
263262306a36Sopenharmony_ci	int dai_id;
263362306a36Sopenharmony_ci	unsigned int sync_id;
263462306a36Sopenharmony_ci	struct {
263562306a36Sopenharmony_ci		const char *name;
263662306a36Sopenharmony_ci		const unsigned int sync_id;
263762306a36Sopenharmony_ci	} of_afe_etdms[MT8195_AFE_IO_ETDM_NUM] = {
263862306a36Sopenharmony_ci		{"etdm-in1", ETDM_SYNC_FROM_IN1},
263962306a36Sopenharmony_ci		{"etdm-in2", ETDM_SYNC_FROM_IN2},
264062306a36Sopenharmony_ci		{"etdm-out1", ETDM_SYNC_FROM_OUT1},
264162306a36Sopenharmony_ci		{"etdm-out2", ETDM_SYNC_FROM_OUT2},
264262306a36Sopenharmony_ci		{"etdm-out3", ETDM_SYNC_FROM_OUT3},
264362306a36Sopenharmony_ci	};
264462306a36Sopenharmony_ci
264562306a36Sopenharmony_ci	for (i = 0; i < MT8195_AFE_IO_ETDM_NUM; i++) {
264662306a36Sopenharmony_ci		dai_id = ETDM_TO_DAI_ID(i);
264762306a36Sopenharmony_ci		if (!mt8195_afe_etdm_is_valid(dai_id)) {
264862306a36Sopenharmony_ci			dev_err(afe->dev, "%s invalid dai id %d\n",
264962306a36Sopenharmony_ci				__func__, dai_id);
265062306a36Sopenharmony_ci			return;
265162306a36Sopenharmony_ci		}
265262306a36Sopenharmony_ci
265362306a36Sopenharmony_ci		etdm_data = afe_priv->dai_priv[dai_id];
265462306a36Sopenharmony_ci
265562306a36Sopenharmony_ci		ret = snprintf(prop, sizeof(prop),
265662306a36Sopenharmony_ci			       "mediatek,%s-mclk-always-on-rate",
265762306a36Sopenharmony_ci			       of_afe_etdms[i].name);
265862306a36Sopenharmony_ci		if (ret < 0) {
265962306a36Sopenharmony_ci			dev_info(afe->dev, "%s snprintf err=%d\n",
266062306a36Sopenharmony_ci				 __func__, ret);
266162306a36Sopenharmony_ci			return;
266262306a36Sopenharmony_ci		}
266362306a36Sopenharmony_ci		ret = of_property_read_u32(of_node, prop, &sel);
266462306a36Sopenharmony_ci		if (ret == 0) {
266562306a36Sopenharmony_ci			etdm_data->mclk_dir = SND_SOC_CLOCK_OUT;
266662306a36Sopenharmony_ci			if (mtk_dai_etdm_cal_mclk(afe, sel, dai_id))
266762306a36Sopenharmony_ci				dev_info(afe->dev, "%s unsupported mclk %uHz\n",
266862306a36Sopenharmony_ci					 __func__, sel);
266962306a36Sopenharmony_ci		}
267062306a36Sopenharmony_ci
267162306a36Sopenharmony_ci		ret = snprintf(prop, sizeof(prop),
267262306a36Sopenharmony_ci			       "mediatek,%s-multi-pin-mode",
267362306a36Sopenharmony_ci			       of_afe_etdms[i].name);
267462306a36Sopenharmony_ci		if (ret < 0) {
267562306a36Sopenharmony_ci			dev_info(afe->dev, "%s snprintf err=%d\n",
267662306a36Sopenharmony_ci				 __func__, ret);
267762306a36Sopenharmony_ci			return;
267862306a36Sopenharmony_ci		}
267962306a36Sopenharmony_ci		etdm_data->data_mode = of_property_read_bool(of_node, prop);
268062306a36Sopenharmony_ci
268162306a36Sopenharmony_ci		ret = snprintf(prop, sizeof(prop),
268262306a36Sopenharmony_ci			       "mediatek,%s-cowork-source",
268362306a36Sopenharmony_ci			       of_afe_etdms[i].name);
268462306a36Sopenharmony_ci		if (ret < 0) {
268562306a36Sopenharmony_ci			dev_info(afe->dev, "%s snprintf err=%d\n",
268662306a36Sopenharmony_ci				 __func__, ret);
268762306a36Sopenharmony_ci			return;
268862306a36Sopenharmony_ci		}
268962306a36Sopenharmony_ci		ret = of_property_read_u32(of_node, prop, &sel);
269062306a36Sopenharmony_ci		if (ret == 0) {
269162306a36Sopenharmony_ci			if (sel >= MT8195_AFE_IO_ETDM_NUM) {
269262306a36Sopenharmony_ci				dev_info(afe->dev, "%s invalid id=%d\n",
269362306a36Sopenharmony_ci					 __func__, sel);
269462306a36Sopenharmony_ci				etdm_data->cowork_source_id = COWORK_ETDM_NONE;
269562306a36Sopenharmony_ci			} else {
269662306a36Sopenharmony_ci				sync_id = of_afe_etdms[sel].sync_id;
269762306a36Sopenharmony_ci				etdm_data->cowork_source_id =
269862306a36Sopenharmony_ci					sync_to_dai_id(sync_id);
269962306a36Sopenharmony_ci			}
270062306a36Sopenharmony_ci		} else {
270162306a36Sopenharmony_ci			etdm_data->cowork_source_id = COWORK_ETDM_NONE;
270262306a36Sopenharmony_ci		}
270362306a36Sopenharmony_ci	}
270462306a36Sopenharmony_ci
270562306a36Sopenharmony_ci	/* etdm in only */
270662306a36Sopenharmony_ci	for (i = 0; i < 2; i++) {
270762306a36Sopenharmony_ci		dai_id = ETDM_TO_DAI_ID(i);
270862306a36Sopenharmony_ci		etdm_data = afe_priv->dai_priv[dai_id];
270962306a36Sopenharmony_ci
271062306a36Sopenharmony_ci		ret = snprintf(prop, sizeof(prop),
271162306a36Sopenharmony_ci			       "mediatek,%s-chn-disabled",
271262306a36Sopenharmony_ci			       of_afe_etdms[i].name);
271362306a36Sopenharmony_ci		if (ret < 0) {
271462306a36Sopenharmony_ci			dev_info(afe->dev, "%s snprintf err=%d\n",
271562306a36Sopenharmony_ci				 __func__, ret);
271662306a36Sopenharmony_ci			return;
271762306a36Sopenharmony_ci		}
271862306a36Sopenharmony_ci		ret = of_property_read_variable_u8_array(of_node, prop,
271962306a36Sopenharmony_ci							 disable_chn,
272062306a36Sopenharmony_ci							 1, max_chn);
272162306a36Sopenharmony_ci		if (ret < 0)
272262306a36Sopenharmony_ci			continue;
272362306a36Sopenharmony_ci
272462306a36Sopenharmony_ci		for (j = 0; j < ret; j++) {
272562306a36Sopenharmony_ci			if (disable_chn[j] >= MT8195_ETDM_MAX_CHANNELS)
272662306a36Sopenharmony_ci				dev_info(afe->dev, "%s [%d] invalid chn %u\n",
272762306a36Sopenharmony_ci					 __func__, j, disable_chn[j]);
272862306a36Sopenharmony_ci			else
272962306a36Sopenharmony_ci				etdm_data->in_disable_ch[disable_chn[j]] = true;
273062306a36Sopenharmony_ci		}
273162306a36Sopenharmony_ci	}
273262306a36Sopenharmony_ci	mt8195_etdm_update_sync_info(afe);
273362306a36Sopenharmony_ci}
273462306a36Sopenharmony_ci
273562306a36Sopenharmony_cistatic int init_etdm_priv_data(struct mtk_base_afe *afe)
273662306a36Sopenharmony_ci{
273762306a36Sopenharmony_ci	struct mt8195_afe_private *afe_priv = afe->platform_priv;
273862306a36Sopenharmony_ci	struct mtk_dai_etdm_priv *etdm_priv;
273962306a36Sopenharmony_ci	int i;
274062306a36Sopenharmony_ci
274162306a36Sopenharmony_ci	for (i = MT8195_AFE_IO_ETDM_START; i < MT8195_AFE_IO_ETDM_END; i++) {
274262306a36Sopenharmony_ci		etdm_priv = devm_kzalloc(afe->dev,
274362306a36Sopenharmony_ci					 sizeof(struct mtk_dai_etdm_priv),
274462306a36Sopenharmony_ci					 GFP_KERNEL);
274562306a36Sopenharmony_ci		if (!etdm_priv)
274662306a36Sopenharmony_ci			return -ENOMEM;
274762306a36Sopenharmony_ci
274862306a36Sopenharmony_ci		afe_priv->dai_priv[i] = etdm_priv;
274962306a36Sopenharmony_ci	}
275062306a36Sopenharmony_ci
275162306a36Sopenharmony_ci	afe_priv->dai_priv[MT8195_AFE_IO_DPTX] =
275262306a36Sopenharmony_ci		afe_priv->dai_priv[MT8195_AFE_IO_ETDM3_OUT];
275362306a36Sopenharmony_ci
275462306a36Sopenharmony_ci	mt8195_dai_etdm_parse_of(afe);
275562306a36Sopenharmony_ci	return 0;
275662306a36Sopenharmony_ci}
275762306a36Sopenharmony_ci
275862306a36Sopenharmony_ciint mt8195_dai_etdm_register(struct mtk_base_afe *afe)
275962306a36Sopenharmony_ci{
276062306a36Sopenharmony_ci	struct mtk_base_afe_dai *dai;
276162306a36Sopenharmony_ci
276262306a36Sopenharmony_ci	dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
276362306a36Sopenharmony_ci	if (!dai)
276462306a36Sopenharmony_ci		return -ENOMEM;
276562306a36Sopenharmony_ci
276662306a36Sopenharmony_ci	list_add(&dai->list, &afe->sub_dais);
276762306a36Sopenharmony_ci
276862306a36Sopenharmony_ci	dai->dai_drivers = mtk_dai_etdm_driver;
276962306a36Sopenharmony_ci	dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_etdm_driver);
277062306a36Sopenharmony_ci
277162306a36Sopenharmony_ci	dai->dapm_widgets = mtk_dai_etdm_widgets;
277262306a36Sopenharmony_ci	dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_etdm_widgets);
277362306a36Sopenharmony_ci	dai->dapm_routes = mtk_dai_etdm_routes;
277462306a36Sopenharmony_ci	dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_etdm_routes);
277562306a36Sopenharmony_ci	dai->controls = mtk_dai_etdm_controls;
277662306a36Sopenharmony_ci	dai->num_controls = ARRAY_SIZE(mtk_dai_etdm_controls);
277762306a36Sopenharmony_ci
277862306a36Sopenharmony_ci	return init_etdm_priv_data(afe);
277962306a36Sopenharmony_ci}
2780