162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci//
362306a36Sopenharmony_ci// MediaTek ALSA SoC Audio DAI I2S Control
462306a36Sopenharmony_ci//
562306a36Sopenharmony_ci// Copyright (c) 2020 MediaTek Inc.
662306a36Sopenharmony_ci// Author: Shane Chien <shane.chien@mediatek.com>
762306a36Sopenharmony_ci//
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/bitops.h>
1062306a36Sopenharmony_ci#include <linux/regmap.h>
1162306a36Sopenharmony_ci#include <sound/pcm_params.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include "mt8192-afe-clk.h"
1462306a36Sopenharmony_ci#include "mt8192-afe-common.h"
1562306a36Sopenharmony_ci#include "mt8192-afe-gpio.h"
1662306a36Sopenharmony_ci#include "mt8192-interconnection.h"
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cienum {
1962306a36Sopenharmony_ci	I2S_FMT_EIAJ = 0,
2062306a36Sopenharmony_ci	I2S_FMT_I2S = 1,
2162306a36Sopenharmony_ci};
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cienum {
2462306a36Sopenharmony_ci	I2S_WLEN_16_BIT = 0,
2562306a36Sopenharmony_ci	I2S_WLEN_32_BIT = 1,
2662306a36Sopenharmony_ci};
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cienum {
2962306a36Sopenharmony_ci	I2S_HD_NORMAL = 0,
3062306a36Sopenharmony_ci	I2S_HD_LOW_JITTER = 1,
3162306a36Sopenharmony_ci};
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cienum {
3462306a36Sopenharmony_ci	I2S1_SEL_O28_O29 = 0,
3562306a36Sopenharmony_ci	I2S1_SEL_O03_O04 = 1,
3662306a36Sopenharmony_ci};
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cienum {
3962306a36Sopenharmony_ci	I2S_IN_PAD_CONNSYS = 0,
4062306a36Sopenharmony_ci	I2S_IN_PAD_IO_MUX = 1,
4162306a36Sopenharmony_ci};
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cistruct mtk_afe_i2s_priv {
4462306a36Sopenharmony_ci	int id;
4562306a36Sopenharmony_ci	int rate; /* for determine which apll to use */
4662306a36Sopenharmony_ci	int low_jitter_en;
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	int share_i2s_id;
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	int mclk_id;
5162306a36Sopenharmony_ci	int mclk_rate;
5262306a36Sopenharmony_ci	int mclk_apll;
5362306a36Sopenharmony_ci};
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistatic unsigned int get_i2s_wlen(snd_pcm_format_t format)
5662306a36Sopenharmony_ci{
5762306a36Sopenharmony_ci	return snd_pcm_format_physical_width(format) <= 16 ?
5862306a36Sopenharmony_ci	       I2S_WLEN_16_BIT : I2S_WLEN_32_BIT;
5962306a36Sopenharmony_ci}
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#define MTK_AFE_I2S0_KCONTROL_NAME "I2S0_HD_Mux"
6262306a36Sopenharmony_ci#define MTK_AFE_I2S1_KCONTROL_NAME "I2S1_HD_Mux"
6362306a36Sopenharmony_ci#define MTK_AFE_I2S2_KCONTROL_NAME "I2S2_HD_Mux"
6462306a36Sopenharmony_ci#define MTK_AFE_I2S3_KCONTROL_NAME "I2S3_HD_Mux"
6562306a36Sopenharmony_ci#define MTK_AFE_I2S5_KCONTROL_NAME "I2S5_HD_Mux"
6662306a36Sopenharmony_ci#define MTK_AFE_I2S6_KCONTROL_NAME "I2S6_HD_Mux"
6762306a36Sopenharmony_ci#define MTK_AFE_I2S7_KCONTROL_NAME "I2S7_HD_Mux"
6862306a36Sopenharmony_ci#define MTK_AFE_I2S8_KCONTROL_NAME "I2S8_HD_Mux"
6962306a36Sopenharmony_ci#define MTK_AFE_I2S9_KCONTROL_NAME "I2S9_HD_Mux"
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci#define I2S0_HD_EN_W_NAME "I2S0_HD_EN"
7262306a36Sopenharmony_ci#define I2S1_HD_EN_W_NAME "I2S1_HD_EN"
7362306a36Sopenharmony_ci#define I2S2_HD_EN_W_NAME "I2S2_HD_EN"
7462306a36Sopenharmony_ci#define I2S3_HD_EN_W_NAME "I2S3_HD_EN"
7562306a36Sopenharmony_ci#define I2S5_HD_EN_W_NAME "I2S5_HD_EN"
7662306a36Sopenharmony_ci#define I2S6_HD_EN_W_NAME "I2S6_HD_EN"
7762306a36Sopenharmony_ci#define I2S7_HD_EN_W_NAME "I2S7_HD_EN"
7862306a36Sopenharmony_ci#define I2S8_HD_EN_W_NAME "I2S8_HD_EN"
7962306a36Sopenharmony_ci#define I2S9_HD_EN_W_NAME "I2S9_HD_EN"
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci#define I2S0_MCLK_EN_W_NAME "I2S0_MCLK_EN"
8262306a36Sopenharmony_ci#define I2S1_MCLK_EN_W_NAME "I2S1_MCLK_EN"
8362306a36Sopenharmony_ci#define I2S2_MCLK_EN_W_NAME "I2S2_MCLK_EN"
8462306a36Sopenharmony_ci#define I2S3_MCLK_EN_W_NAME "I2S3_MCLK_EN"
8562306a36Sopenharmony_ci#define I2S5_MCLK_EN_W_NAME "I2S5_MCLK_EN"
8662306a36Sopenharmony_ci#define I2S6_MCLK_EN_W_NAME "I2S6_MCLK_EN"
8762306a36Sopenharmony_ci#define I2S7_MCLK_EN_W_NAME "I2S7_MCLK_EN"
8862306a36Sopenharmony_ci#define I2S8_MCLK_EN_W_NAME "I2S8_MCLK_EN"
8962306a36Sopenharmony_ci#define I2S9_MCLK_EN_W_NAME "I2S9_MCLK_EN"
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_cistatic int get_i2s_id_by_name(struct mtk_base_afe *afe,
9262306a36Sopenharmony_ci			      const char *name)
9362306a36Sopenharmony_ci{
9462306a36Sopenharmony_ci	if (strncmp(name, "I2S0", 4) == 0)
9562306a36Sopenharmony_ci		return MT8192_DAI_I2S_0;
9662306a36Sopenharmony_ci	else if (strncmp(name, "I2S1", 4) == 0)
9762306a36Sopenharmony_ci		return MT8192_DAI_I2S_1;
9862306a36Sopenharmony_ci	else if (strncmp(name, "I2S2", 4) == 0)
9962306a36Sopenharmony_ci		return MT8192_DAI_I2S_2;
10062306a36Sopenharmony_ci	else if (strncmp(name, "I2S3", 4) == 0)
10162306a36Sopenharmony_ci		return MT8192_DAI_I2S_3;
10262306a36Sopenharmony_ci	else if (strncmp(name, "I2S5", 4) == 0)
10362306a36Sopenharmony_ci		return MT8192_DAI_I2S_5;
10462306a36Sopenharmony_ci	else if (strncmp(name, "I2S6", 4) == 0)
10562306a36Sopenharmony_ci		return MT8192_DAI_I2S_6;
10662306a36Sopenharmony_ci	else if (strncmp(name, "I2S7", 4) == 0)
10762306a36Sopenharmony_ci		return MT8192_DAI_I2S_7;
10862306a36Sopenharmony_ci	else if (strncmp(name, "I2S8", 4) == 0)
10962306a36Sopenharmony_ci		return MT8192_DAI_I2S_8;
11062306a36Sopenharmony_ci	else if (strncmp(name, "I2S9", 4) == 0)
11162306a36Sopenharmony_ci		return MT8192_DAI_I2S_9;
11262306a36Sopenharmony_ci	else
11362306a36Sopenharmony_ci		return -EINVAL;
11462306a36Sopenharmony_ci}
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_cistatic struct mtk_afe_i2s_priv *get_i2s_priv_by_name(struct mtk_base_afe *afe,
11762306a36Sopenharmony_ci						     const char *name)
11862306a36Sopenharmony_ci{
11962306a36Sopenharmony_ci	struct mt8192_afe_private *afe_priv = afe->platform_priv;
12062306a36Sopenharmony_ci	int dai_id = get_i2s_id_by_name(afe, name);
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci	if (dai_id < 0)
12362306a36Sopenharmony_ci		return NULL;
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci	return afe_priv->dai_priv[dai_id];
12662306a36Sopenharmony_ci}
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci/* low jitter control */
12962306a36Sopenharmony_cistatic const char * const mt8192_i2s_hd_str[] = {
13062306a36Sopenharmony_ci	"Normal", "Low_Jitter"
13162306a36Sopenharmony_ci};
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_EXT_DECL(mt8192_i2s_enum, mt8192_i2s_hd_str);
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_cistatic int mt8192_i2s_hd_get(struct snd_kcontrol *kcontrol,
13662306a36Sopenharmony_ci			     struct snd_ctl_elem_value *ucontrol)
13762306a36Sopenharmony_ci{
13862306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
13962306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
14062306a36Sopenharmony_ci	struct mtk_afe_i2s_priv *i2s_priv;
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_ci	i2s_priv = get_i2s_priv_by_name(afe, kcontrol->id.name);
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci	if (!i2s_priv) {
14562306a36Sopenharmony_ci		dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
14662306a36Sopenharmony_ci		return -EINVAL;
14762306a36Sopenharmony_ci	}
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci	ucontrol->value.integer.value[0] = i2s_priv->low_jitter_en;
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci	return 0;
15262306a36Sopenharmony_ci}
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_cistatic int mt8192_i2s_hd_set(struct snd_kcontrol *kcontrol,
15562306a36Sopenharmony_ci			     struct snd_ctl_elem_value *ucontrol)
15662306a36Sopenharmony_ci{
15762306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
15862306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
15962306a36Sopenharmony_ci	struct mtk_afe_i2s_priv *i2s_priv;
16062306a36Sopenharmony_ci	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
16162306a36Sopenharmony_ci	int hd_en;
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci	if (ucontrol->value.enumerated.item[0] >= e->items)
16462306a36Sopenharmony_ci		return -EINVAL;
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci	hd_en = ucontrol->value.integer.value[0];
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci	dev_dbg(afe->dev, "%s(), kcontrol name %s, hd_en %d\n",
16962306a36Sopenharmony_ci		__func__, kcontrol->id.name, hd_en);
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci	i2s_priv = get_i2s_priv_by_name(afe, kcontrol->id.name);
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci	if (!i2s_priv) {
17462306a36Sopenharmony_ci		dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
17562306a36Sopenharmony_ci		return -EINVAL;
17662306a36Sopenharmony_ci	}
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci	i2s_priv->low_jitter_en = hd_en;
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci	return 0;
18162306a36Sopenharmony_ci}
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_dai_i2s_controls[] = {
18462306a36Sopenharmony_ci	SOC_ENUM_EXT(MTK_AFE_I2S0_KCONTROL_NAME, mt8192_i2s_enum,
18562306a36Sopenharmony_ci		     mt8192_i2s_hd_get, mt8192_i2s_hd_set),
18662306a36Sopenharmony_ci	SOC_ENUM_EXT(MTK_AFE_I2S1_KCONTROL_NAME, mt8192_i2s_enum,
18762306a36Sopenharmony_ci		     mt8192_i2s_hd_get, mt8192_i2s_hd_set),
18862306a36Sopenharmony_ci	SOC_ENUM_EXT(MTK_AFE_I2S2_KCONTROL_NAME, mt8192_i2s_enum,
18962306a36Sopenharmony_ci		     mt8192_i2s_hd_get, mt8192_i2s_hd_set),
19062306a36Sopenharmony_ci	SOC_ENUM_EXT(MTK_AFE_I2S3_KCONTROL_NAME, mt8192_i2s_enum,
19162306a36Sopenharmony_ci		     mt8192_i2s_hd_get, mt8192_i2s_hd_set),
19262306a36Sopenharmony_ci	SOC_ENUM_EXT(MTK_AFE_I2S5_KCONTROL_NAME, mt8192_i2s_enum,
19362306a36Sopenharmony_ci		     mt8192_i2s_hd_get, mt8192_i2s_hd_set),
19462306a36Sopenharmony_ci	SOC_ENUM_EXT(MTK_AFE_I2S6_KCONTROL_NAME, mt8192_i2s_enum,
19562306a36Sopenharmony_ci		     mt8192_i2s_hd_get, mt8192_i2s_hd_set),
19662306a36Sopenharmony_ci	SOC_ENUM_EXT(MTK_AFE_I2S7_KCONTROL_NAME, mt8192_i2s_enum,
19762306a36Sopenharmony_ci		     mt8192_i2s_hd_get, mt8192_i2s_hd_set),
19862306a36Sopenharmony_ci	SOC_ENUM_EXT(MTK_AFE_I2S8_KCONTROL_NAME, mt8192_i2s_enum,
19962306a36Sopenharmony_ci		     mt8192_i2s_hd_get, mt8192_i2s_hd_set),
20062306a36Sopenharmony_ci	SOC_ENUM_EXT(MTK_AFE_I2S9_KCONTROL_NAME, mt8192_i2s_enum,
20162306a36Sopenharmony_ci		     mt8192_i2s_hd_get, mt8192_i2s_hd_set),
20262306a36Sopenharmony_ci};
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci/* dai component */
20562306a36Sopenharmony_ci/* i2s virtual mux to output widget */
20662306a36Sopenharmony_cistatic const char * const i2s_mux_map[] = {
20762306a36Sopenharmony_ci	"Normal", "Dummy_Widget",
20862306a36Sopenharmony_ci};
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_cistatic int i2s_mux_map_value[] = {
21162306a36Sopenharmony_ci	0, 1,
21262306a36Sopenharmony_ci};
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(i2s_mux_map_enum,
21562306a36Sopenharmony_ci					      SND_SOC_NOPM,
21662306a36Sopenharmony_ci					      0,
21762306a36Sopenharmony_ci					      1,
21862306a36Sopenharmony_ci					      i2s_mux_map,
21962306a36Sopenharmony_ci					      i2s_mux_map_value);
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_cistatic const struct snd_kcontrol_new i2s0_in_mux_control =
22262306a36Sopenharmony_ci	SOC_DAPM_ENUM("I2S0 In Select", i2s_mux_map_enum);
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_cistatic const struct snd_kcontrol_new i2s8_in_mux_control =
22562306a36Sopenharmony_ci	SOC_DAPM_ENUM("I2S8 In Select", i2s_mux_map_enum);
22662306a36Sopenharmony_ci
22762306a36Sopenharmony_cistatic const struct snd_kcontrol_new i2s1_out_mux_control =
22862306a36Sopenharmony_ci	SOC_DAPM_ENUM("I2S1 Out Select", i2s_mux_map_enum);
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_cistatic const struct snd_kcontrol_new i2s3_out_mux_control =
23162306a36Sopenharmony_ci	SOC_DAPM_ENUM("I2S3 Out Select", i2s_mux_map_enum);
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_cistatic const struct snd_kcontrol_new i2s5_out_mux_control =
23462306a36Sopenharmony_ci	SOC_DAPM_ENUM("I2S5 Out Select", i2s_mux_map_enum);
23562306a36Sopenharmony_ci
23662306a36Sopenharmony_cistatic const struct snd_kcontrol_new i2s7_out_mux_control =
23762306a36Sopenharmony_ci	SOC_DAPM_ENUM("I2S7 Out Select", i2s_mux_map_enum);
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_cistatic const struct snd_kcontrol_new i2s9_out_mux_control =
24062306a36Sopenharmony_ci	SOC_DAPM_ENUM("I2S9 Out Select", i2s_mux_map_enum);
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci/* Tinyconn Mux */
24362306a36Sopenharmony_cienum {
24462306a36Sopenharmony_ci	TINYCONN_CH1_MUX_DL1 = 0x0,
24562306a36Sopenharmony_ci	TINYCONN_CH2_MUX_DL1 = 0x1,
24662306a36Sopenharmony_ci	TINYCONN_CH1_MUX_DL12 = 0x2,
24762306a36Sopenharmony_ci	TINYCONN_CH2_MUX_DL12 = 0x3,
24862306a36Sopenharmony_ci	TINYCONN_CH1_MUX_DL2 = 0x4,
24962306a36Sopenharmony_ci	TINYCONN_CH2_MUX_DL2 = 0x5,
25062306a36Sopenharmony_ci	TINYCONN_CH1_MUX_DL3 = 0x6,
25162306a36Sopenharmony_ci	TINYCONN_CH2_MUX_DL3 = 0x7,
25262306a36Sopenharmony_ci	TINYCONN_MUX_NONE = 0x1f,
25362306a36Sopenharmony_ci};
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_cistatic const char * const tinyconn_mux_map[] = {
25662306a36Sopenharmony_ci	"NONE",
25762306a36Sopenharmony_ci	"DL1_CH1",
25862306a36Sopenharmony_ci	"DL1_CH2",
25962306a36Sopenharmony_ci	"DL12_CH1",
26062306a36Sopenharmony_ci	"DL12_CH2",
26162306a36Sopenharmony_ci	"DL2_CH1",
26262306a36Sopenharmony_ci	"DL2_CH2",
26362306a36Sopenharmony_ci	"DL3_CH1",
26462306a36Sopenharmony_ci	"DL3_CH2",
26562306a36Sopenharmony_ci};
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_cistatic int tinyconn_mux_map_value[] = {
26862306a36Sopenharmony_ci	TINYCONN_MUX_NONE,
26962306a36Sopenharmony_ci	TINYCONN_CH1_MUX_DL1,
27062306a36Sopenharmony_ci	TINYCONN_CH2_MUX_DL1,
27162306a36Sopenharmony_ci	TINYCONN_CH1_MUX_DL12,
27262306a36Sopenharmony_ci	TINYCONN_CH2_MUX_DL12,
27362306a36Sopenharmony_ci	TINYCONN_CH1_MUX_DL2,
27462306a36Sopenharmony_ci	TINYCONN_CH2_MUX_DL2,
27562306a36Sopenharmony_ci	TINYCONN_CH1_MUX_DL3,
27662306a36Sopenharmony_ci	TINYCONN_CH2_MUX_DL3,
27762306a36Sopenharmony_ci};
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(i2s1_tinyconn_ch1_mux_map_enum,
28062306a36Sopenharmony_ci				  AFE_TINY_CONN5,
28162306a36Sopenharmony_ci				  O_20_CFG_SFT,
28262306a36Sopenharmony_ci				  O_20_CFG_MASK,
28362306a36Sopenharmony_ci				  tinyconn_mux_map,
28462306a36Sopenharmony_ci				  tinyconn_mux_map_value);
28562306a36Sopenharmony_cistatic const struct snd_kcontrol_new i2s1_tinyconn_ch1_mux_control =
28662306a36Sopenharmony_ci	SOC_DAPM_ENUM("i2s1 ch1 tinyconn Select",
28762306a36Sopenharmony_ci		      i2s1_tinyconn_ch1_mux_map_enum);
28862306a36Sopenharmony_ci
28962306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(i2s1_tinyconn_ch2_mux_map_enum,
29062306a36Sopenharmony_ci				  AFE_TINY_CONN5,
29162306a36Sopenharmony_ci				  O_21_CFG_SFT,
29262306a36Sopenharmony_ci				  O_21_CFG_MASK,
29362306a36Sopenharmony_ci				  tinyconn_mux_map,
29462306a36Sopenharmony_ci				  tinyconn_mux_map_value);
29562306a36Sopenharmony_cistatic const struct snd_kcontrol_new i2s1_tinyconn_ch2_mux_control =
29662306a36Sopenharmony_ci	SOC_DAPM_ENUM("i2s1 ch2 tinyconn Select",
29762306a36Sopenharmony_ci		      i2s1_tinyconn_ch2_mux_map_enum);
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(i2s3_tinyconn_ch1_mux_map_enum,
30062306a36Sopenharmony_ci				  AFE_TINY_CONN5,
30162306a36Sopenharmony_ci				  O_22_CFG_SFT,
30262306a36Sopenharmony_ci				  O_22_CFG_MASK,
30362306a36Sopenharmony_ci				  tinyconn_mux_map,
30462306a36Sopenharmony_ci				  tinyconn_mux_map_value);
30562306a36Sopenharmony_cistatic const struct snd_kcontrol_new i2s3_tinyconn_ch1_mux_control =
30662306a36Sopenharmony_ci	SOC_DAPM_ENUM("i2s3 ch1 tinyconn Select",
30762306a36Sopenharmony_ci		      i2s3_tinyconn_ch1_mux_map_enum);
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(i2s3_tinyconn_ch2_mux_map_enum,
31062306a36Sopenharmony_ci				  AFE_TINY_CONN5,
31162306a36Sopenharmony_ci				  O_23_CFG_SFT,
31262306a36Sopenharmony_ci				  O_23_CFG_MASK,
31362306a36Sopenharmony_ci				  tinyconn_mux_map,
31462306a36Sopenharmony_ci				  tinyconn_mux_map_value);
31562306a36Sopenharmony_cistatic const struct snd_kcontrol_new i2s3_tinyconn_ch2_mux_control =
31662306a36Sopenharmony_ci	SOC_DAPM_ENUM("i2s3 ch2 tinyconn Select",
31762306a36Sopenharmony_ci		      i2s3_tinyconn_ch2_mux_map_enum);
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_ci/* i2s in lpbk */
32062306a36Sopenharmony_cistatic const char * const i2s_lpbk_mux_map[] = {
32162306a36Sopenharmony_ci	"Normal", "Lpbk",
32262306a36Sopenharmony_ci};
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_cistatic int i2s_lpbk_mux_map_value[] = {
32562306a36Sopenharmony_ci	0, 1,
32662306a36Sopenharmony_ci};
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(i2s0_lpbk_mux_map_enum,
32962306a36Sopenharmony_ci					      AFE_I2S_CON,
33062306a36Sopenharmony_ci					      I2S_LOOPBACK_SFT,
33162306a36Sopenharmony_ci					      1,
33262306a36Sopenharmony_ci					      i2s_lpbk_mux_map,
33362306a36Sopenharmony_ci					      i2s_lpbk_mux_map_value);
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_cistatic const struct snd_kcontrol_new i2s0_lpbk_mux_control =
33662306a36Sopenharmony_ci	SOC_DAPM_ENUM("I2S Lpbk Select", i2s0_lpbk_mux_map_enum);
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(i2s2_lpbk_mux_map_enum,
33962306a36Sopenharmony_ci					      AFE_I2S_CON2,
34062306a36Sopenharmony_ci					      I2S3_LOOPBACK_SFT,
34162306a36Sopenharmony_ci					      1,
34262306a36Sopenharmony_ci					      i2s_lpbk_mux_map,
34362306a36Sopenharmony_ci					      i2s_lpbk_mux_map_value);
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_cistatic const struct snd_kcontrol_new i2s2_lpbk_mux_control =
34662306a36Sopenharmony_ci	SOC_DAPM_ENUM("I2S Lpbk Select", i2s2_lpbk_mux_map_enum);
34762306a36Sopenharmony_ci
34862306a36Sopenharmony_ci/* interconnection */
34962306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_i2s3_ch1_mix[] = {
35062306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN0, I_DL1_CH1, 1, 0),
35162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN0, I_DL2_CH1, 1, 0),
35262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN0, I_DL3_CH1, 1, 0),
35362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN0, I_DL12_CH1, 1, 0),
35462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN0_1, I_DL6_CH1, 1, 0),
35562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN0_1, I_DL4_CH1, 1, 0),
35662306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN0_1, I_DL5_CH1, 1, 0),
35762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN0_1, I_DL8_CH1, 1, 0),
35862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH1", AFE_CONN0_1, I_DL9_CH1, 1, 0),
35962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN0,
36062306a36Sopenharmony_ci				    I_GAIN1_OUT_CH1, 1, 0),
36162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN0,
36262306a36Sopenharmony_ci				    I_ADDA_UL_CH1, 1, 0),
36362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN0,
36462306a36Sopenharmony_ci				    I_ADDA_UL_CH2, 1, 0),
36562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN0,
36662306a36Sopenharmony_ci				    I_ADDA_UL_CH3, 1, 0),
36762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN0,
36862306a36Sopenharmony_ci				    I_PCM_1_CAP_CH1, 1, 0),
36962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN0,
37062306a36Sopenharmony_ci				    I_PCM_2_CAP_CH1, 1, 0),
37162306a36Sopenharmony_ci};
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_i2s3_ch2_mix[] = {
37462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN1, I_DL1_CH2, 1, 0),
37562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN1, I_DL2_CH2, 1, 0),
37662306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN1, I_DL3_CH2, 1, 0),
37762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN1, I_DL12_CH2, 1, 0),
37862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN1_1, I_DL6_CH2, 1, 0),
37962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN1_1, I_DL4_CH2, 1, 0),
38062306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN1_1, I_DL5_CH2, 1, 0),
38162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN1_1, I_DL8_CH2, 1, 0),
38262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH2", AFE_CONN1_1, I_DL9_CH2, 1, 0),
38362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN1,
38462306a36Sopenharmony_ci				    I_GAIN1_OUT_CH2, 1, 0),
38562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN1,
38662306a36Sopenharmony_ci				    I_ADDA_UL_CH1, 1, 0),
38762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN1,
38862306a36Sopenharmony_ci				    I_ADDA_UL_CH2, 1, 0),
38962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN1,
39062306a36Sopenharmony_ci				    I_ADDA_UL_CH3, 1, 0),
39162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN1,
39262306a36Sopenharmony_ci				    I_PCM_1_CAP_CH1, 1, 0),
39362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN1,
39462306a36Sopenharmony_ci				    I_PCM_2_CAP_CH1, 1, 0),
39562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN1,
39662306a36Sopenharmony_ci				    I_PCM_1_CAP_CH2, 1, 0),
39762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN1,
39862306a36Sopenharmony_ci				    I_PCM_2_CAP_CH2, 1, 0),
39962306a36Sopenharmony_ci};
40062306a36Sopenharmony_ci
40162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_i2s1_ch1_mix[] = {
40262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN28, I_DL1_CH1, 1, 0),
40362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN28, I_DL2_CH1, 1, 0),
40462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN28, I_DL3_CH1, 1, 0),
40562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN28, I_DL12_CH1, 1, 0),
40662306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN28_1, I_DL6_CH1, 1, 0),
40762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN28_1, I_DL4_CH1, 1, 0),
40862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN28_1, I_DL5_CH1, 1, 0),
40962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN28_1, I_DL8_CH1, 1, 0),
41062306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH1", AFE_CONN28_1, I_DL9_CH1, 1, 0),
41162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN28,
41262306a36Sopenharmony_ci				    I_GAIN1_OUT_CH1, 1, 0),
41362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN28,
41462306a36Sopenharmony_ci				    I_ADDA_UL_CH1, 1, 0),
41562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN28,
41662306a36Sopenharmony_ci				    I_PCM_1_CAP_CH1, 1, 0),
41762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN28,
41862306a36Sopenharmony_ci				    I_PCM_2_CAP_CH1, 1, 0),
41962306a36Sopenharmony_ci};
42062306a36Sopenharmony_ci
42162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_i2s1_ch2_mix[] = {
42262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN29, I_DL1_CH2, 1, 0),
42362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN29, I_DL2_CH2, 1, 0),
42462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN29, I_DL3_CH2, 1, 0),
42562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN29, I_DL12_CH2, 1, 0),
42662306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN29_1, I_DL6_CH2, 1, 0),
42762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN29_1, I_DL4_CH2, 1, 0),
42862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN29_1, I_DL5_CH2, 1, 0),
42962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN29_1, I_DL8_CH2, 1, 0),
43062306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH2", AFE_CONN29_1, I_DL9_CH2, 1, 0),
43162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN29,
43262306a36Sopenharmony_ci				    I_GAIN1_OUT_CH2, 1, 0),
43362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN29,
43462306a36Sopenharmony_ci				    I_ADDA_UL_CH2, 1, 0),
43562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN29,
43662306a36Sopenharmony_ci				    I_PCM_1_CAP_CH1, 1, 0),
43762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN29,
43862306a36Sopenharmony_ci				    I_PCM_2_CAP_CH1, 1, 0),
43962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN29,
44062306a36Sopenharmony_ci				    I_PCM_1_CAP_CH2, 1, 0),
44162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN29,
44262306a36Sopenharmony_ci				    I_PCM_2_CAP_CH2, 1, 0),
44362306a36Sopenharmony_ci};
44462306a36Sopenharmony_ci
44562306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_i2s5_ch1_mix[] = {
44662306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN30, I_DL1_CH1, 1, 0),
44762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN30, I_DL2_CH1, 1, 0),
44862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN30, I_DL3_CH1, 1, 0),
44962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN30, I_DL12_CH1, 1, 0),
45062306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN30_1, I_DL6_CH1, 1, 0),
45162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN30_1, I_DL4_CH1, 1, 0),
45262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN30_1, I_DL5_CH1, 1, 0),
45362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN30_1, I_DL8_CH1, 1, 0),
45462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH1", AFE_CONN30_1, I_DL9_CH1, 1, 0),
45562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN30,
45662306a36Sopenharmony_ci				    I_GAIN1_OUT_CH1, 1, 0),
45762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN30,
45862306a36Sopenharmony_ci				    I_ADDA_UL_CH1, 1, 0),
45962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN30,
46062306a36Sopenharmony_ci				    I_PCM_1_CAP_CH1, 1, 0),
46162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN30,
46262306a36Sopenharmony_ci				    I_PCM_2_CAP_CH1, 1, 0),
46362306a36Sopenharmony_ci};
46462306a36Sopenharmony_ci
46562306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_i2s5_ch2_mix[] = {
46662306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN31, I_DL1_CH2, 1, 0),
46762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN31, I_DL2_CH2, 1, 0),
46862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN31, I_DL3_CH2, 1, 0),
46962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN31, I_DL12_CH2, 1, 0),
47062306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN31_1, I_DL6_CH2, 1, 0),
47162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN31_1, I_DL4_CH2, 1, 0),
47262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN31_1, I_DL5_CH2, 1, 0),
47362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN31_1, I_DL8_CH2, 1, 0),
47462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH2", AFE_CONN31_1, I_DL9_CH2, 1, 0),
47562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN31,
47662306a36Sopenharmony_ci				    I_GAIN1_OUT_CH2, 1, 0),
47762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN31,
47862306a36Sopenharmony_ci				    I_ADDA_UL_CH2, 1, 0),
47962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN31,
48062306a36Sopenharmony_ci				    I_PCM_1_CAP_CH1, 1, 0),
48162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN31,
48262306a36Sopenharmony_ci				    I_PCM_2_CAP_CH1, 1, 0),
48362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN31,
48462306a36Sopenharmony_ci				    I_PCM_1_CAP_CH2, 1, 0),
48562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN31,
48662306a36Sopenharmony_ci				    I_PCM_2_CAP_CH2, 1, 0),
48762306a36Sopenharmony_ci};
48862306a36Sopenharmony_ci
48962306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_i2s7_ch1_mix[] = {
49062306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN54, I_DL1_CH1, 1, 0),
49162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN54, I_DL2_CH1, 1, 0),
49262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN54, I_DL3_CH1, 1, 0),
49362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN54, I_DL12_CH1, 1, 0),
49462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN54_1, I_DL6_CH1, 1, 0),
49562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN54_1, I_DL4_CH1, 1, 0),
49662306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN54_1, I_DL5_CH1, 1, 0),
49762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH1", AFE_CONN54_1, I_DL9_CH1, 1, 0),
49862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN54,
49962306a36Sopenharmony_ci				    I_GAIN1_OUT_CH1, 1, 0),
50062306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN54,
50162306a36Sopenharmony_ci				    I_ADDA_UL_CH1, 1, 0),
50262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN54,
50362306a36Sopenharmony_ci				    I_PCM_1_CAP_CH1, 1, 0),
50462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN54,
50562306a36Sopenharmony_ci				    I_PCM_2_CAP_CH1, 1, 0),
50662306a36Sopenharmony_ci};
50762306a36Sopenharmony_ci
50862306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_i2s7_ch2_mix[] = {
50962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN55, I_DL1_CH2, 1, 0),
51062306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN55, I_DL2_CH2, 1, 0),
51162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN55, I_DL3_CH2, 1, 0),
51262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN55, I_DL12_CH2, 1, 0),
51362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN55_1, I_DL6_CH2, 1, 0),
51462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN55_1, I_DL4_CH2, 1, 0),
51562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN55_1, I_DL5_CH2, 1, 0),
51662306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH2", AFE_CONN55_1, I_DL9_CH2, 1, 0),
51762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN55,
51862306a36Sopenharmony_ci				    I_GAIN1_OUT_CH2, 1, 0),
51962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN55,
52062306a36Sopenharmony_ci				    I_ADDA_UL_CH2, 1, 0),
52162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN55,
52262306a36Sopenharmony_ci				    I_PCM_1_CAP_CH1, 1, 0),
52362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN55,
52462306a36Sopenharmony_ci				    I_PCM_2_CAP_CH1, 1, 0),
52562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN55,
52662306a36Sopenharmony_ci				    I_PCM_1_CAP_CH2, 1, 0),
52762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN55,
52862306a36Sopenharmony_ci				    I_PCM_2_CAP_CH2, 1, 0),
52962306a36Sopenharmony_ci};
53062306a36Sopenharmony_ci
53162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_i2s9_ch1_mix[] = {
53262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN56, I_DL1_CH1, 1, 0),
53362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN56, I_DL2_CH1, 1, 0),
53462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN56, I_DL3_CH1, 1, 0),
53562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN56, I_DL12_CH1, 1, 0),
53662306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN56_1, I_DL6_CH1, 1, 0),
53762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN56_1, I_DL4_CH1, 1, 0),
53862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN56_1, I_DL5_CH1, 1, 0),
53962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN56_1, I_DL8_CH1, 1, 0),
54062306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH1", AFE_CONN56_1, I_DL9_CH1, 1, 0),
54162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN56,
54262306a36Sopenharmony_ci				    I_GAIN1_OUT_CH1, 1, 0),
54362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN56,
54462306a36Sopenharmony_ci				    I_ADDA_UL_CH1, 1, 0),
54562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN56,
54662306a36Sopenharmony_ci				    I_PCM_1_CAP_CH1, 1, 0),
54762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN56,
54862306a36Sopenharmony_ci				    I_PCM_2_CAP_CH1, 1, 0),
54962306a36Sopenharmony_ci};
55062306a36Sopenharmony_ci
55162306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_i2s9_ch2_mix[] = {
55262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN57, I_DL1_CH2, 1, 0),
55362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN57, I_DL2_CH2, 1, 0),
55462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN57, I_DL3_CH2, 1, 0),
55562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN57, I_DL12_CH2, 1, 0),
55662306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN57_1, I_DL6_CH2, 1, 0),
55762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN57_1, I_DL4_CH2, 1, 0),
55862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN57_1, I_DL5_CH2, 1, 0),
55962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN57_1, I_DL8_CH2, 1, 0),
56062306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH2", AFE_CONN57_1, I_DL9_CH2, 1, 0),
56162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN57,
56262306a36Sopenharmony_ci				    I_GAIN1_OUT_CH2, 1, 0),
56362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN57,
56462306a36Sopenharmony_ci				    I_ADDA_UL_CH2, 1, 0),
56562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN57,
56662306a36Sopenharmony_ci				    I_PCM_1_CAP_CH1, 1, 0),
56762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN57,
56862306a36Sopenharmony_ci				    I_PCM_2_CAP_CH1, 1, 0),
56962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN57,
57062306a36Sopenharmony_ci				    I_PCM_1_CAP_CH2, 1, 0),
57162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN57,
57262306a36Sopenharmony_ci				    I_PCM_2_CAP_CH2, 1, 0),
57362306a36Sopenharmony_ci};
57462306a36Sopenharmony_ci
57562306a36Sopenharmony_cienum {
57662306a36Sopenharmony_ci	SUPPLY_SEQ_APLL,
57762306a36Sopenharmony_ci	SUPPLY_SEQ_I2S_MCLK_EN,
57862306a36Sopenharmony_ci	SUPPLY_SEQ_I2S_HD_EN,
57962306a36Sopenharmony_ci	SUPPLY_SEQ_I2S_EN,
58062306a36Sopenharmony_ci};
58162306a36Sopenharmony_ci
58262306a36Sopenharmony_cistatic int mtk_i2s_en_event(struct snd_soc_dapm_widget *w,
58362306a36Sopenharmony_ci			    struct snd_kcontrol *kcontrol,
58462306a36Sopenharmony_ci			    int event)
58562306a36Sopenharmony_ci{
58662306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
58762306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
58862306a36Sopenharmony_ci	struct mtk_afe_i2s_priv *i2s_priv;
58962306a36Sopenharmony_ci
59062306a36Sopenharmony_ci	i2s_priv = get_i2s_priv_by_name(afe, w->name);
59162306a36Sopenharmony_ci
59262306a36Sopenharmony_ci	if (!i2s_priv) {
59362306a36Sopenharmony_ci		dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
59462306a36Sopenharmony_ci		return -EINVAL;
59562306a36Sopenharmony_ci	}
59662306a36Sopenharmony_ci
59762306a36Sopenharmony_ci	dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",
59862306a36Sopenharmony_ci		__func__, w->name, event);
59962306a36Sopenharmony_ci
60062306a36Sopenharmony_ci	switch (event) {
60162306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
60262306a36Sopenharmony_ci		mt8192_afe_gpio_request(afe->dev, true, i2s_priv->id, 0);
60362306a36Sopenharmony_ci		break;
60462306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
60562306a36Sopenharmony_ci		mt8192_afe_gpio_request(afe->dev, false, i2s_priv->id, 0);
60662306a36Sopenharmony_ci		break;
60762306a36Sopenharmony_ci	default:
60862306a36Sopenharmony_ci		break;
60962306a36Sopenharmony_ci	}
61062306a36Sopenharmony_ci
61162306a36Sopenharmony_ci	return 0;
61262306a36Sopenharmony_ci}
61362306a36Sopenharmony_ci
61462306a36Sopenharmony_cistatic int mtk_apll_event(struct snd_soc_dapm_widget *w,
61562306a36Sopenharmony_ci			  struct snd_kcontrol *kcontrol,
61662306a36Sopenharmony_ci			  int event)
61762306a36Sopenharmony_ci{
61862306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
61962306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
62062306a36Sopenharmony_ci
62162306a36Sopenharmony_ci	dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",
62262306a36Sopenharmony_ci		__func__, w->name, event);
62362306a36Sopenharmony_ci
62462306a36Sopenharmony_ci	switch (event) {
62562306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
62662306a36Sopenharmony_ci		if (strcmp(w->name, APLL1_W_NAME) == 0)
62762306a36Sopenharmony_ci			mt8192_apll1_enable(afe);
62862306a36Sopenharmony_ci		else
62962306a36Sopenharmony_ci			mt8192_apll2_enable(afe);
63062306a36Sopenharmony_ci		break;
63162306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
63262306a36Sopenharmony_ci		if (strcmp(w->name, APLL1_W_NAME) == 0)
63362306a36Sopenharmony_ci			mt8192_apll1_disable(afe);
63462306a36Sopenharmony_ci		else
63562306a36Sopenharmony_ci			mt8192_apll2_disable(afe);
63662306a36Sopenharmony_ci		break;
63762306a36Sopenharmony_ci	default:
63862306a36Sopenharmony_ci		break;
63962306a36Sopenharmony_ci	}
64062306a36Sopenharmony_ci
64162306a36Sopenharmony_ci	return 0;
64262306a36Sopenharmony_ci}
64362306a36Sopenharmony_ci
64462306a36Sopenharmony_cistatic int i2s_out_tinyconn_event(struct snd_soc_dapm_widget *w,
64562306a36Sopenharmony_ci				  struct snd_kcontrol *kcontrol,
64662306a36Sopenharmony_ci				  int event)
64762306a36Sopenharmony_ci{
64862306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
64962306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
65062306a36Sopenharmony_ci	unsigned int reg;
65162306a36Sopenharmony_ci	unsigned int reg_shift;
65262306a36Sopenharmony_ci	unsigned int reg_mask_shift;
65362306a36Sopenharmony_ci
65462306a36Sopenharmony_ci	dev_dbg(afe->dev, "%s(), event 0x%x\n", __func__, event);
65562306a36Sopenharmony_ci
65662306a36Sopenharmony_ci	if (strstr(w->name, "I2S1")) {
65762306a36Sopenharmony_ci		reg = AFE_I2S_CON1;
65862306a36Sopenharmony_ci		reg_shift = I2S2_32BIT_EN_SFT;
65962306a36Sopenharmony_ci		reg_mask_shift = I2S2_32BIT_EN_MASK_SFT;
66062306a36Sopenharmony_ci	} else if (strstr(w->name, "I2S3")) {
66162306a36Sopenharmony_ci		reg = AFE_I2S_CON3;
66262306a36Sopenharmony_ci		reg_shift = I2S4_32BIT_EN_SFT;
66362306a36Sopenharmony_ci		reg_mask_shift = I2S4_32BIT_EN_MASK_SFT;
66462306a36Sopenharmony_ci	} else if (strstr(w->name, "I2S5")) {
66562306a36Sopenharmony_ci		reg = AFE_I2S_CON4;
66662306a36Sopenharmony_ci		reg_shift = I2S5_32BIT_EN_SFT;
66762306a36Sopenharmony_ci		reg_mask_shift = I2S5_32BIT_EN_MASK_SFT;
66862306a36Sopenharmony_ci	} else if (strstr(w->name, "I2S7")) {
66962306a36Sopenharmony_ci		reg = AFE_I2S_CON7;
67062306a36Sopenharmony_ci		reg_shift = I2S7_32BIT_EN_SFT;
67162306a36Sopenharmony_ci		reg_mask_shift = I2S7_32BIT_EN_MASK_SFT;
67262306a36Sopenharmony_ci	} else if (strstr(w->name, "I2S9")) {
67362306a36Sopenharmony_ci		reg = AFE_I2S_CON9;
67462306a36Sopenharmony_ci		reg_shift = I2S9_32BIT_EN_SFT;
67562306a36Sopenharmony_ci		reg_mask_shift = I2S9_32BIT_EN_MASK_SFT;
67662306a36Sopenharmony_ci	} else {
67762306a36Sopenharmony_ci		reg = AFE_I2S_CON1;
67862306a36Sopenharmony_ci		reg_shift = I2S2_32BIT_EN_SFT;
67962306a36Sopenharmony_ci		reg_mask_shift = I2S2_32BIT_EN_MASK_SFT;
68062306a36Sopenharmony_ci		dev_warn(afe->dev, "%s(), error widget name %s, use i2s1\n",
68162306a36Sopenharmony_ci			 __func__, w->name);
68262306a36Sopenharmony_ci	}
68362306a36Sopenharmony_ci
68462306a36Sopenharmony_ci	switch (event) {
68562306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
68662306a36Sopenharmony_ci		regmap_update_bits(afe->regmap, reg, reg_mask_shift,
68762306a36Sopenharmony_ci				   0x1 << reg_shift);
68862306a36Sopenharmony_ci		break;
68962306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMD:
69062306a36Sopenharmony_ci		regmap_update_bits(afe->regmap, reg, reg_mask_shift,
69162306a36Sopenharmony_ci				   0x0 << reg_shift);
69262306a36Sopenharmony_ci		break;
69362306a36Sopenharmony_ci	default:
69462306a36Sopenharmony_ci		break;
69562306a36Sopenharmony_ci	}
69662306a36Sopenharmony_ci
69762306a36Sopenharmony_ci	return 0;
69862306a36Sopenharmony_ci}
69962306a36Sopenharmony_ci
70062306a36Sopenharmony_cistatic int mtk_mclk_en_event(struct snd_soc_dapm_widget *w,
70162306a36Sopenharmony_ci			     struct snd_kcontrol *kcontrol,
70262306a36Sopenharmony_ci			     int event)
70362306a36Sopenharmony_ci{
70462306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
70562306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
70662306a36Sopenharmony_ci	struct mtk_afe_i2s_priv *i2s_priv;
70762306a36Sopenharmony_ci
70862306a36Sopenharmony_ci	dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",
70962306a36Sopenharmony_ci		__func__, w->name, event);
71062306a36Sopenharmony_ci
71162306a36Sopenharmony_ci	i2s_priv = get_i2s_priv_by_name(afe, w->name);
71262306a36Sopenharmony_ci	if (!i2s_priv) {
71362306a36Sopenharmony_ci		dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
71462306a36Sopenharmony_ci		return -EINVAL;
71562306a36Sopenharmony_ci	}
71662306a36Sopenharmony_ci
71762306a36Sopenharmony_ci	switch (event) {
71862306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
71962306a36Sopenharmony_ci		mt8192_mck_enable(afe, i2s_priv->mclk_id, i2s_priv->mclk_rate);
72062306a36Sopenharmony_ci		break;
72162306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
72262306a36Sopenharmony_ci		i2s_priv->mclk_rate = 0;
72362306a36Sopenharmony_ci		mt8192_mck_disable(afe, i2s_priv->mclk_id);
72462306a36Sopenharmony_ci		break;
72562306a36Sopenharmony_ci	default:
72662306a36Sopenharmony_ci		break;
72762306a36Sopenharmony_ci	}
72862306a36Sopenharmony_ci
72962306a36Sopenharmony_ci	return 0;
73062306a36Sopenharmony_ci}
73162306a36Sopenharmony_ci
73262306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget mtk_dai_i2s_widgets[] = {
73362306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("CONNSYS"),
73462306a36Sopenharmony_ci
73562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I2S1_CH1", SND_SOC_NOPM, 0, 0,
73662306a36Sopenharmony_ci			   mtk_i2s1_ch1_mix,
73762306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_i2s1_ch1_mix)),
73862306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I2S1_CH2", SND_SOC_NOPM, 0, 0,
73962306a36Sopenharmony_ci			   mtk_i2s1_ch2_mix,
74062306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_i2s1_ch2_mix)),
74162306a36Sopenharmony_ci
74262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I2S3_CH1", SND_SOC_NOPM, 0, 0,
74362306a36Sopenharmony_ci			   mtk_i2s3_ch1_mix,
74462306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_i2s3_ch1_mix)),
74562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I2S3_CH2", SND_SOC_NOPM, 0, 0,
74662306a36Sopenharmony_ci			   mtk_i2s3_ch2_mix,
74762306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_i2s3_ch2_mix)),
74862306a36Sopenharmony_ci
74962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I2S5_CH1", SND_SOC_NOPM, 0, 0,
75062306a36Sopenharmony_ci			   mtk_i2s5_ch1_mix,
75162306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_i2s5_ch1_mix)),
75262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I2S5_CH2", SND_SOC_NOPM, 0, 0,
75362306a36Sopenharmony_ci			   mtk_i2s5_ch2_mix,
75462306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_i2s5_ch2_mix)),
75562306a36Sopenharmony_ci
75662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I2S7_CH1", SND_SOC_NOPM, 0, 0,
75762306a36Sopenharmony_ci			   mtk_i2s7_ch1_mix,
75862306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_i2s7_ch1_mix)),
75962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I2S7_CH2", SND_SOC_NOPM, 0, 0,
76062306a36Sopenharmony_ci			   mtk_i2s7_ch2_mix,
76162306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_i2s7_ch2_mix)),
76262306a36Sopenharmony_ci
76362306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I2S9_CH1", SND_SOC_NOPM, 0, 0,
76462306a36Sopenharmony_ci			   mtk_i2s9_ch1_mix,
76562306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_i2s9_ch1_mix)),
76662306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("I2S9_CH2", SND_SOC_NOPM, 0, 0,
76762306a36Sopenharmony_ci			   mtk_i2s9_ch2_mix,
76862306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_i2s9_ch2_mix)),
76962306a36Sopenharmony_ci
77062306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("I2S1_TINYCONN_CH1_MUX", SND_SOC_NOPM, 0, 0,
77162306a36Sopenharmony_ci			   &i2s1_tinyconn_ch1_mux_control,
77262306a36Sopenharmony_ci			   i2s_out_tinyconn_event,
77362306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),
77462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("I2S1_TINYCONN_CH2_MUX", SND_SOC_NOPM, 0, 0,
77562306a36Sopenharmony_ci			   &i2s1_tinyconn_ch2_mux_control,
77662306a36Sopenharmony_ci			   i2s_out_tinyconn_event,
77762306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),
77862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("I2S3_TINYCONN_CH1_MUX", SND_SOC_NOPM, 0, 0,
77962306a36Sopenharmony_ci			   &i2s3_tinyconn_ch1_mux_control,
78062306a36Sopenharmony_ci			   i2s_out_tinyconn_event,
78162306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),
78262306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("I2S3_TINYCONN_CH2_MUX", SND_SOC_NOPM, 0, 0,
78362306a36Sopenharmony_ci			   &i2s3_tinyconn_ch2_mux_control,
78462306a36Sopenharmony_ci			   i2s_out_tinyconn_event,
78562306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),
78662306a36Sopenharmony_ci
78762306a36Sopenharmony_ci	/* i2s en*/
78862306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("I2S0_EN", SUPPLY_SEQ_I2S_EN,
78962306a36Sopenharmony_ci			      AFE_I2S_CON, I2S_EN_SFT, 0,
79062306a36Sopenharmony_ci			      mtk_i2s_en_event,
79162306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
79262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("I2S1_EN", SUPPLY_SEQ_I2S_EN,
79362306a36Sopenharmony_ci			      AFE_I2S_CON1, I2S_EN_SFT, 0,
79462306a36Sopenharmony_ci			      mtk_i2s_en_event,
79562306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
79662306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("I2S2_EN", SUPPLY_SEQ_I2S_EN,
79762306a36Sopenharmony_ci			      AFE_I2S_CON2, I2S_EN_SFT, 0,
79862306a36Sopenharmony_ci			      mtk_i2s_en_event,
79962306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
80062306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("I2S3_EN", SUPPLY_SEQ_I2S_EN,
80162306a36Sopenharmony_ci			      AFE_I2S_CON3, I2S_EN_SFT, 0,
80262306a36Sopenharmony_ci			      mtk_i2s_en_event,
80362306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
80462306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("I2S5_EN", SUPPLY_SEQ_I2S_EN,
80562306a36Sopenharmony_ci			      AFE_I2S_CON4, I2S5_EN_SFT, 0,
80662306a36Sopenharmony_ci			      mtk_i2s_en_event,
80762306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
80862306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("I2S6_EN", SUPPLY_SEQ_I2S_EN,
80962306a36Sopenharmony_ci			      AFE_I2S_CON6, I2S6_EN_SFT, 0,
81062306a36Sopenharmony_ci			      mtk_i2s_en_event,
81162306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
81262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("I2S7_EN", SUPPLY_SEQ_I2S_EN,
81362306a36Sopenharmony_ci			      AFE_I2S_CON7, I2S7_EN_SFT, 0,
81462306a36Sopenharmony_ci			      mtk_i2s_en_event,
81562306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
81662306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("I2S8_EN", SUPPLY_SEQ_I2S_EN,
81762306a36Sopenharmony_ci			      AFE_I2S_CON8, I2S8_EN_SFT, 0,
81862306a36Sopenharmony_ci			      mtk_i2s_en_event,
81962306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
82062306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("I2S9_EN", SUPPLY_SEQ_I2S_EN,
82162306a36Sopenharmony_ci			      AFE_I2S_CON9, I2S9_EN_SFT, 0,
82262306a36Sopenharmony_ci			      mtk_i2s_en_event,
82362306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
82462306a36Sopenharmony_ci	/* i2s hd en */
82562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S(I2S0_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,
82662306a36Sopenharmony_ci			      AFE_I2S_CON, I2S1_HD_EN_SFT, 0, NULL, 0),
82762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S(I2S1_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,
82862306a36Sopenharmony_ci			      AFE_I2S_CON1, I2S2_HD_EN_SFT, 0, NULL, 0),
82962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S(I2S2_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,
83062306a36Sopenharmony_ci			      AFE_I2S_CON2, I2S3_HD_EN_SFT, 0, NULL, 0),
83162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S(I2S3_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,
83262306a36Sopenharmony_ci			      AFE_I2S_CON3, I2S4_HD_EN_SFT, 0, NULL, 0),
83362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S(I2S5_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,
83462306a36Sopenharmony_ci			      AFE_I2S_CON4, I2S5_HD_EN_SFT, 0, NULL, 0),
83562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S(I2S6_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,
83662306a36Sopenharmony_ci			      AFE_I2S_CON6, I2S6_HD_EN_SFT, 0, NULL, 0),
83762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S(I2S7_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,
83862306a36Sopenharmony_ci			      AFE_I2S_CON7, I2S7_HD_EN_SFT, 0, NULL, 0),
83962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S(I2S8_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,
84062306a36Sopenharmony_ci			      AFE_I2S_CON8, I2S8_HD_EN_SFT, 0, NULL, 0),
84162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S(I2S9_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,
84262306a36Sopenharmony_ci			      AFE_I2S_CON9, I2S9_HD_EN_SFT, 0, NULL, 0),
84362306a36Sopenharmony_ci
84462306a36Sopenharmony_ci	/* i2s mclk en */
84562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S(I2S0_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,
84662306a36Sopenharmony_ci			      SND_SOC_NOPM, 0, 0,
84762306a36Sopenharmony_ci			      mtk_mclk_en_event,
84862306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
84962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S(I2S1_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,
85062306a36Sopenharmony_ci			      SND_SOC_NOPM, 0, 0,
85162306a36Sopenharmony_ci			      mtk_mclk_en_event,
85262306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
85362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S(I2S2_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,
85462306a36Sopenharmony_ci			      SND_SOC_NOPM, 0, 0,
85562306a36Sopenharmony_ci			      mtk_mclk_en_event,
85662306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
85762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S(I2S3_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,
85862306a36Sopenharmony_ci			      SND_SOC_NOPM, 0, 0,
85962306a36Sopenharmony_ci			      mtk_mclk_en_event,
86062306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
86162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S(I2S5_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,
86262306a36Sopenharmony_ci			      SND_SOC_NOPM, 0, 0,
86362306a36Sopenharmony_ci			      mtk_mclk_en_event,
86462306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
86562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S(I2S6_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,
86662306a36Sopenharmony_ci			      SND_SOC_NOPM, 0, 0,
86762306a36Sopenharmony_ci			      mtk_mclk_en_event,
86862306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
86962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S(I2S7_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,
87062306a36Sopenharmony_ci			      SND_SOC_NOPM, 0, 0,
87162306a36Sopenharmony_ci			      mtk_mclk_en_event,
87262306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
87362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S(I2S8_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,
87462306a36Sopenharmony_ci			      SND_SOC_NOPM, 0, 0,
87562306a36Sopenharmony_ci			      mtk_mclk_en_event,
87662306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
87762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S(I2S9_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,
87862306a36Sopenharmony_ci			      SND_SOC_NOPM, 0, 0,
87962306a36Sopenharmony_ci			      mtk_mclk_en_event,
88062306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
88162306a36Sopenharmony_ci
88262306a36Sopenharmony_ci	/* apll */
88362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S(APLL1_W_NAME, SUPPLY_SEQ_APLL,
88462306a36Sopenharmony_ci			      SND_SOC_NOPM, 0, 0,
88562306a36Sopenharmony_ci			      mtk_apll_event,
88662306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
88762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S(APLL2_W_NAME, SUPPLY_SEQ_APLL,
88862306a36Sopenharmony_ci			      SND_SOC_NOPM, 0, 0,
88962306a36Sopenharmony_ci			      mtk_apll_event,
89062306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
89162306a36Sopenharmony_ci
89262306a36Sopenharmony_ci	/* allow i2s on without codec on */
89362306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("I2S_DUMMY_OUT"),
89462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("I2S1_Out_Mux",
89562306a36Sopenharmony_ci			 SND_SOC_NOPM, 0, 0, &i2s1_out_mux_control),
89662306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("I2S3_Out_Mux",
89762306a36Sopenharmony_ci			 SND_SOC_NOPM, 0, 0, &i2s3_out_mux_control),
89862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("I2S5_Out_Mux",
89962306a36Sopenharmony_ci			 SND_SOC_NOPM, 0, 0, &i2s5_out_mux_control),
90062306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("I2S7_Out_Mux",
90162306a36Sopenharmony_ci			 SND_SOC_NOPM, 0, 0, &i2s7_out_mux_control),
90262306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("I2S9_Out_Mux",
90362306a36Sopenharmony_ci			 SND_SOC_NOPM, 0, 0, &i2s9_out_mux_control),
90462306a36Sopenharmony_ci
90562306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("I2S_DUMMY_IN"),
90662306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("I2S0_In_Mux",
90762306a36Sopenharmony_ci			 SND_SOC_NOPM, 0, 0, &i2s0_in_mux_control),
90862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("I2S8_In_Mux",
90962306a36Sopenharmony_ci			 SND_SOC_NOPM, 0, 0, &i2s8_in_mux_control),
91062306a36Sopenharmony_ci
91162306a36Sopenharmony_ci	/* i2s in lpbk */
91262306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("I2S0_Lpbk_Mux",
91362306a36Sopenharmony_ci			 SND_SOC_NOPM, 0, 0, &i2s0_lpbk_mux_control),
91462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("I2S2_Lpbk_Mux",
91562306a36Sopenharmony_ci			 SND_SOC_NOPM, 0, 0, &i2s2_lpbk_mux_control),
91662306a36Sopenharmony_ci};
91762306a36Sopenharmony_ci
91862306a36Sopenharmony_cistatic int mtk_afe_i2s_share_connect(struct snd_soc_dapm_widget *source,
91962306a36Sopenharmony_ci				     struct snd_soc_dapm_widget *sink)
92062306a36Sopenharmony_ci{
92162306a36Sopenharmony_ci	struct snd_soc_dapm_widget *w = sink;
92262306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
92362306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
92462306a36Sopenharmony_ci	struct mtk_afe_i2s_priv *i2s_priv;
92562306a36Sopenharmony_ci
92662306a36Sopenharmony_ci	i2s_priv = get_i2s_priv_by_name(afe, sink->name);
92762306a36Sopenharmony_ci	if (!i2s_priv) {
92862306a36Sopenharmony_ci		dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
92962306a36Sopenharmony_ci		return 0;
93062306a36Sopenharmony_ci	}
93162306a36Sopenharmony_ci
93262306a36Sopenharmony_ci	if (i2s_priv->share_i2s_id < 0)
93362306a36Sopenharmony_ci		return 0;
93462306a36Sopenharmony_ci
93562306a36Sopenharmony_ci	return i2s_priv->share_i2s_id == get_i2s_id_by_name(afe, source->name);
93662306a36Sopenharmony_ci}
93762306a36Sopenharmony_ci
93862306a36Sopenharmony_cistatic int mtk_afe_i2s_hd_connect(struct snd_soc_dapm_widget *source,
93962306a36Sopenharmony_ci				  struct snd_soc_dapm_widget *sink)
94062306a36Sopenharmony_ci{
94162306a36Sopenharmony_ci	struct snd_soc_dapm_widget *w = sink;
94262306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
94362306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
94462306a36Sopenharmony_ci	struct mtk_afe_i2s_priv *i2s_priv;
94562306a36Sopenharmony_ci
94662306a36Sopenharmony_ci	i2s_priv = get_i2s_priv_by_name(afe, sink->name);
94762306a36Sopenharmony_ci	if (!i2s_priv) {
94862306a36Sopenharmony_ci		dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
94962306a36Sopenharmony_ci		return 0;
95062306a36Sopenharmony_ci	}
95162306a36Sopenharmony_ci
95262306a36Sopenharmony_ci	if (get_i2s_id_by_name(afe, sink->name) ==
95362306a36Sopenharmony_ci	    get_i2s_id_by_name(afe, source->name))
95462306a36Sopenharmony_ci		return i2s_priv->low_jitter_en;
95562306a36Sopenharmony_ci
95662306a36Sopenharmony_ci	/* check if share i2s need hd en */
95762306a36Sopenharmony_ci	if (i2s_priv->share_i2s_id < 0)
95862306a36Sopenharmony_ci		return 0;
95962306a36Sopenharmony_ci
96062306a36Sopenharmony_ci	if (i2s_priv->share_i2s_id == get_i2s_id_by_name(afe, source->name))
96162306a36Sopenharmony_ci		return i2s_priv->low_jitter_en;
96262306a36Sopenharmony_ci
96362306a36Sopenharmony_ci	return 0;
96462306a36Sopenharmony_ci}
96562306a36Sopenharmony_ci
96662306a36Sopenharmony_cistatic int mtk_afe_i2s_apll_connect(struct snd_soc_dapm_widget *source,
96762306a36Sopenharmony_ci				    struct snd_soc_dapm_widget *sink)
96862306a36Sopenharmony_ci{
96962306a36Sopenharmony_ci	struct snd_soc_dapm_widget *w = sink;
97062306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
97162306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
97262306a36Sopenharmony_ci	struct mtk_afe_i2s_priv *i2s_priv;
97362306a36Sopenharmony_ci	int cur_apll;
97462306a36Sopenharmony_ci	int i2s_need_apll;
97562306a36Sopenharmony_ci
97662306a36Sopenharmony_ci	i2s_priv = get_i2s_priv_by_name(afe, w->name);
97762306a36Sopenharmony_ci	if (!i2s_priv) {
97862306a36Sopenharmony_ci		dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
97962306a36Sopenharmony_ci		return 0;
98062306a36Sopenharmony_ci	}
98162306a36Sopenharmony_ci
98262306a36Sopenharmony_ci	/* which apll */
98362306a36Sopenharmony_ci	cur_apll = mt8192_get_apll_by_name(afe, source->name);
98462306a36Sopenharmony_ci
98562306a36Sopenharmony_ci	/* choose APLL from i2s rate */
98662306a36Sopenharmony_ci	i2s_need_apll = mt8192_get_apll_by_rate(afe, i2s_priv->rate);
98762306a36Sopenharmony_ci
98862306a36Sopenharmony_ci	if (i2s_need_apll == cur_apll)
98962306a36Sopenharmony_ci		return 1;
99062306a36Sopenharmony_ci
99162306a36Sopenharmony_ci	return 0;
99262306a36Sopenharmony_ci}
99362306a36Sopenharmony_ci
99462306a36Sopenharmony_cistatic int mtk_afe_i2s_mclk_connect(struct snd_soc_dapm_widget *source,
99562306a36Sopenharmony_ci				    struct snd_soc_dapm_widget *sink)
99662306a36Sopenharmony_ci{
99762306a36Sopenharmony_ci	struct snd_soc_dapm_widget *w = sink;
99862306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
99962306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
100062306a36Sopenharmony_ci	struct mtk_afe_i2s_priv *i2s_priv;
100162306a36Sopenharmony_ci
100262306a36Sopenharmony_ci	i2s_priv = get_i2s_priv_by_name(afe, sink->name);
100362306a36Sopenharmony_ci	if (!i2s_priv) {
100462306a36Sopenharmony_ci		dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
100562306a36Sopenharmony_ci		return 0;
100662306a36Sopenharmony_ci	}
100762306a36Sopenharmony_ci
100862306a36Sopenharmony_ci	if (get_i2s_id_by_name(afe, sink->name) ==
100962306a36Sopenharmony_ci	    get_i2s_id_by_name(afe, source->name))
101062306a36Sopenharmony_ci		return (i2s_priv->mclk_rate > 0) ? 1 : 0;
101162306a36Sopenharmony_ci
101262306a36Sopenharmony_ci	/* check if share i2s need mclk */
101362306a36Sopenharmony_ci	if (i2s_priv->share_i2s_id < 0)
101462306a36Sopenharmony_ci		return 0;
101562306a36Sopenharmony_ci
101662306a36Sopenharmony_ci	if (i2s_priv->share_i2s_id == get_i2s_id_by_name(afe, source->name))
101762306a36Sopenharmony_ci		return (i2s_priv->mclk_rate > 0) ? 1 : 0;
101862306a36Sopenharmony_ci
101962306a36Sopenharmony_ci	return 0;
102062306a36Sopenharmony_ci}
102162306a36Sopenharmony_ci
102262306a36Sopenharmony_cistatic int mtk_afe_mclk_apll_connect(struct snd_soc_dapm_widget *source,
102362306a36Sopenharmony_ci				     struct snd_soc_dapm_widget *sink)
102462306a36Sopenharmony_ci{
102562306a36Sopenharmony_ci	struct snd_soc_dapm_widget *w = sink;
102662306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
102762306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
102862306a36Sopenharmony_ci	struct mtk_afe_i2s_priv *i2s_priv;
102962306a36Sopenharmony_ci	int cur_apll;
103062306a36Sopenharmony_ci
103162306a36Sopenharmony_ci	i2s_priv = get_i2s_priv_by_name(afe, w->name);
103262306a36Sopenharmony_ci	if (!i2s_priv) {
103362306a36Sopenharmony_ci		dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
103462306a36Sopenharmony_ci		return 0;
103562306a36Sopenharmony_ci	}
103662306a36Sopenharmony_ci
103762306a36Sopenharmony_ci	/* which apll */
103862306a36Sopenharmony_ci	cur_apll = mt8192_get_apll_by_name(afe, source->name);
103962306a36Sopenharmony_ci
104062306a36Sopenharmony_ci	if (i2s_priv->mclk_apll == cur_apll)
104162306a36Sopenharmony_ci		return 1;
104262306a36Sopenharmony_ci
104362306a36Sopenharmony_ci	return 0;
104462306a36Sopenharmony_ci}
104562306a36Sopenharmony_ci
104662306a36Sopenharmony_cistatic const struct snd_soc_dapm_route mtk_dai_i2s_routes[] = {
104762306a36Sopenharmony_ci	{"Connsys I2S", NULL, "CONNSYS"},
104862306a36Sopenharmony_ci
104962306a36Sopenharmony_ci	/* i2s0 */
105062306a36Sopenharmony_ci	{"I2S0", NULL, "I2S0_EN"},
105162306a36Sopenharmony_ci	{"I2S0", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},
105262306a36Sopenharmony_ci	{"I2S0", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},
105362306a36Sopenharmony_ci	{"I2S0", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},
105462306a36Sopenharmony_ci	{"I2S0", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},
105562306a36Sopenharmony_ci	{"I2S0", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},
105662306a36Sopenharmony_ci	{"I2S0", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},
105762306a36Sopenharmony_ci	{"I2S0", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},
105862306a36Sopenharmony_ci	{"I2S0", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},
105962306a36Sopenharmony_ci
106062306a36Sopenharmony_ci	{"I2S0", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
106162306a36Sopenharmony_ci	{"I2S0", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
106262306a36Sopenharmony_ci	{"I2S0", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
106362306a36Sopenharmony_ci	{"I2S0", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
106462306a36Sopenharmony_ci	{"I2S0", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
106562306a36Sopenharmony_ci	{"I2S0", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
106662306a36Sopenharmony_ci	{"I2S0", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
106762306a36Sopenharmony_ci	{"I2S0", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
106862306a36Sopenharmony_ci	{"I2S0", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
106962306a36Sopenharmony_ci	{I2S0_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},
107062306a36Sopenharmony_ci	{I2S0_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},
107162306a36Sopenharmony_ci
107262306a36Sopenharmony_ci	{"I2S0", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
107362306a36Sopenharmony_ci	{"I2S0", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
107462306a36Sopenharmony_ci	{"I2S0", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
107562306a36Sopenharmony_ci	{"I2S0", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
107662306a36Sopenharmony_ci	{"I2S0", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
107762306a36Sopenharmony_ci	{"I2S0", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
107862306a36Sopenharmony_ci	{"I2S0", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
107962306a36Sopenharmony_ci	{"I2S0", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
108062306a36Sopenharmony_ci	{"I2S0", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
108162306a36Sopenharmony_ci	{I2S0_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
108262306a36Sopenharmony_ci	{I2S0_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
108362306a36Sopenharmony_ci
108462306a36Sopenharmony_ci	/* i2s1 */
108562306a36Sopenharmony_ci	{"I2S1_CH1", "DL1_CH1", "DL1"},
108662306a36Sopenharmony_ci	{"I2S1_CH2", "DL1_CH2", "DL1"},
108762306a36Sopenharmony_ci	{"I2S1_TINYCONN_CH1_MUX", "DL1_CH1", "DL1"},
108862306a36Sopenharmony_ci	{"I2S1_TINYCONN_CH2_MUX", "DL1_CH2", "DL1"},
108962306a36Sopenharmony_ci
109062306a36Sopenharmony_ci	{"I2S1_CH1", "DL2_CH1", "DL2"},
109162306a36Sopenharmony_ci	{"I2S1_CH2", "DL2_CH2", "DL2"},
109262306a36Sopenharmony_ci	{"I2S1_TINYCONN_CH1_MUX", "DL2_CH1", "DL2"},
109362306a36Sopenharmony_ci	{"I2S1_TINYCONN_CH2_MUX", "DL2_CH2", "DL2"},
109462306a36Sopenharmony_ci
109562306a36Sopenharmony_ci	{"I2S1_CH1", "DL3_CH1", "DL3"},
109662306a36Sopenharmony_ci	{"I2S1_CH2", "DL3_CH2", "DL3"},
109762306a36Sopenharmony_ci	{"I2S1_TINYCONN_CH1_MUX", "DL3_CH1", "DL3"},
109862306a36Sopenharmony_ci	{"I2S1_TINYCONN_CH2_MUX", "DL3_CH2", "DL3"},
109962306a36Sopenharmony_ci
110062306a36Sopenharmony_ci	{"I2S1_CH1", "DL12_CH1", "DL12"},
110162306a36Sopenharmony_ci	{"I2S1_CH2", "DL12_CH2", "DL12"},
110262306a36Sopenharmony_ci	{"I2S1_TINYCONN_CH1_MUX", "DL12_CH1", "DL12"},
110362306a36Sopenharmony_ci	{"I2S1_TINYCONN_CH2_MUX", "DL12_CH2", "DL12"},
110462306a36Sopenharmony_ci
110562306a36Sopenharmony_ci	{"I2S1_CH1", "DL4_CH1", "DL4"},
110662306a36Sopenharmony_ci	{"I2S1_CH2", "DL4_CH2", "DL4"},
110762306a36Sopenharmony_ci
110862306a36Sopenharmony_ci	{"I2S1_CH1", "DL5_CH1", "DL5"},
110962306a36Sopenharmony_ci	{"I2S1_CH2", "DL5_CH2", "DL5"},
111062306a36Sopenharmony_ci
111162306a36Sopenharmony_ci	{"I2S1_CH1", "DL6_CH1", "DL6"},
111262306a36Sopenharmony_ci	{"I2S1_CH2", "DL6_CH2", "DL6"},
111362306a36Sopenharmony_ci
111462306a36Sopenharmony_ci	{"I2S1_CH1", "DL8_CH1", "DL8"},
111562306a36Sopenharmony_ci	{"I2S1_CH2", "DL8_CH2", "DL8"},
111662306a36Sopenharmony_ci
111762306a36Sopenharmony_ci	{"I2S1", NULL, "I2S1_CH1"},
111862306a36Sopenharmony_ci	{"I2S1", NULL, "I2S1_CH2"},
111962306a36Sopenharmony_ci	{"I2S1", NULL, "I2S3_TINYCONN_CH1_MUX"},
112062306a36Sopenharmony_ci	{"I2S1", NULL, "I2S3_TINYCONN_CH2_MUX"},
112162306a36Sopenharmony_ci
112262306a36Sopenharmony_ci	{"I2S1", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},
112362306a36Sopenharmony_ci	{"I2S1", NULL, "I2S1_EN"},
112462306a36Sopenharmony_ci	{"I2S1", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},
112562306a36Sopenharmony_ci	{"I2S1", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},
112662306a36Sopenharmony_ci	{"I2S1", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},
112762306a36Sopenharmony_ci	{"I2S1", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},
112862306a36Sopenharmony_ci	{"I2S1", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},
112962306a36Sopenharmony_ci	{"I2S1", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},
113062306a36Sopenharmony_ci	{"I2S1", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},
113162306a36Sopenharmony_ci
113262306a36Sopenharmony_ci	{"I2S1", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
113362306a36Sopenharmony_ci	{"I2S1", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
113462306a36Sopenharmony_ci	{"I2S1", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
113562306a36Sopenharmony_ci	{"I2S1", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
113662306a36Sopenharmony_ci	{"I2S1", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
113762306a36Sopenharmony_ci	{"I2S1", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
113862306a36Sopenharmony_ci	{"I2S1", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
113962306a36Sopenharmony_ci	{"I2S1", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
114062306a36Sopenharmony_ci	{"I2S1", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
114162306a36Sopenharmony_ci	{I2S1_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},
114262306a36Sopenharmony_ci	{I2S1_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},
114362306a36Sopenharmony_ci
114462306a36Sopenharmony_ci	{"I2S1", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
114562306a36Sopenharmony_ci	{"I2S1", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
114662306a36Sopenharmony_ci	{"I2S1", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
114762306a36Sopenharmony_ci	{"I2S1", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
114862306a36Sopenharmony_ci	{"I2S1", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
114962306a36Sopenharmony_ci	{"I2S1", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
115062306a36Sopenharmony_ci	{"I2S1", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
115162306a36Sopenharmony_ci	{"I2S1", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
115262306a36Sopenharmony_ci	{"I2S1", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
115362306a36Sopenharmony_ci	{I2S1_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
115462306a36Sopenharmony_ci	{I2S1_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
115562306a36Sopenharmony_ci
115662306a36Sopenharmony_ci	/* i2s2 */
115762306a36Sopenharmony_ci	{"I2S2", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},
115862306a36Sopenharmony_ci	{"I2S2", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},
115962306a36Sopenharmony_ci	{"I2S2", NULL, "I2S2_EN"},
116062306a36Sopenharmony_ci	{"I2S2", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},
116162306a36Sopenharmony_ci	{"I2S2", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},
116262306a36Sopenharmony_ci	{"I2S2", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},
116362306a36Sopenharmony_ci	{"I2S2", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},
116462306a36Sopenharmony_ci	{"I2S2", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},
116562306a36Sopenharmony_ci	{"I2S2", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},
116662306a36Sopenharmony_ci
116762306a36Sopenharmony_ci	{"I2S2", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
116862306a36Sopenharmony_ci	{"I2S2", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
116962306a36Sopenharmony_ci	{"I2S2", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
117062306a36Sopenharmony_ci	{"I2S2", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
117162306a36Sopenharmony_ci	{"I2S2", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
117262306a36Sopenharmony_ci	{"I2S2", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
117362306a36Sopenharmony_ci	{"I2S2", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
117462306a36Sopenharmony_ci	{"I2S2", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
117562306a36Sopenharmony_ci	{"I2S2", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
117662306a36Sopenharmony_ci	{I2S2_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},
117762306a36Sopenharmony_ci	{I2S2_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},
117862306a36Sopenharmony_ci
117962306a36Sopenharmony_ci	{"I2S2", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
118062306a36Sopenharmony_ci	{"I2S2", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
118162306a36Sopenharmony_ci	{"I2S2", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
118262306a36Sopenharmony_ci	{"I2S2", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
118362306a36Sopenharmony_ci	{"I2S2", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
118462306a36Sopenharmony_ci	{"I2S2", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
118562306a36Sopenharmony_ci	{"I2S2", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
118662306a36Sopenharmony_ci	{"I2S2", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
118762306a36Sopenharmony_ci	{"I2S2", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
118862306a36Sopenharmony_ci	{I2S2_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
118962306a36Sopenharmony_ci	{I2S2_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
119062306a36Sopenharmony_ci
119162306a36Sopenharmony_ci	/* i2s3 */
119262306a36Sopenharmony_ci	{"I2S3_CH1", "DL1_CH1", "DL1"},
119362306a36Sopenharmony_ci	{"I2S3_CH2", "DL1_CH2", "DL1"},
119462306a36Sopenharmony_ci	{"I2S3_TINYCONN_CH1_MUX", "DL1_CH1", "DL1"},
119562306a36Sopenharmony_ci	{"I2S3_TINYCONN_CH2_MUX", "DL1_CH2", "DL1"},
119662306a36Sopenharmony_ci
119762306a36Sopenharmony_ci	{"I2S3_CH1", "DL2_CH1", "DL2"},
119862306a36Sopenharmony_ci	{"I2S3_CH2", "DL2_CH2", "DL2"},
119962306a36Sopenharmony_ci	{"I2S3_TINYCONN_CH1_MUX", "DL2_CH1", "DL2"},
120062306a36Sopenharmony_ci	{"I2S3_TINYCONN_CH2_MUX", "DL2_CH2", "DL2"},
120162306a36Sopenharmony_ci
120262306a36Sopenharmony_ci	{"I2S3_CH1", "DL3_CH1", "DL3"},
120362306a36Sopenharmony_ci	{"I2S3_CH2", "DL3_CH2", "DL3"},
120462306a36Sopenharmony_ci	{"I2S3_TINYCONN_CH1_MUX", "DL3_CH1", "DL3"},
120562306a36Sopenharmony_ci	{"I2S3_TINYCONN_CH2_MUX", "DL3_CH2", "DL3"},
120662306a36Sopenharmony_ci
120762306a36Sopenharmony_ci	{"I2S3_CH1", "DL12_CH1", "DL12"},
120862306a36Sopenharmony_ci	{"I2S3_CH2", "DL12_CH2", "DL12"},
120962306a36Sopenharmony_ci	{"I2S3_TINYCONN_CH1_MUX", "DL12_CH1", "DL12"},
121062306a36Sopenharmony_ci	{"I2S3_TINYCONN_CH2_MUX", "DL12_CH2", "DL12"},
121162306a36Sopenharmony_ci
121262306a36Sopenharmony_ci	{"I2S3_CH1", "DL4_CH1", "DL4"},
121362306a36Sopenharmony_ci	{"I2S3_CH2", "DL4_CH2", "DL4"},
121462306a36Sopenharmony_ci
121562306a36Sopenharmony_ci	{"I2S3_CH1", "DL5_CH1", "DL5"},
121662306a36Sopenharmony_ci	{"I2S3_CH2", "DL5_CH2", "DL5"},
121762306a36Sopenharmony_ci
121862306a36Sopenharmony_ci	{"I2S3_CH1", "DL6_CH1", "DL6"},
121962306a36Sopenharmony_ci	{"I2S3_CH2", "DL6_CH2", "DL6"},
122062306a36Sopenharmony_ci
122162306a36Sopenharmony_ci	{"I2S3_CH1", "DL8_CH1", "DL8"},
122262306a36Sopenharmony_ci	{"I2S3_CH2", "DL8_CH2", "DL8"},
122362306a36Sopenharmony_ci
122462306a36Sopenharmony_ci	{"I2S3", NULL, "I2S3_CH1"},
122562306a36Sopenharmony_ci	{"I2S3", NULL, "I2S3_CH2"},
122662306a36Sopenharmony_ci	{"I2S3", NULL, "I2S3_TINYCONN_CH1_MUX"},
122762306a36Sopenharmony_ci	{"I2S3", NULL, "I2S3_TINYCONN_CH2_MUX"},
122862306a36Sopenharmony_ci
122962306a36Sopenharmony_ci	{"I2S3", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},
123062306a36Sopenharmony_ci	{"I2S3", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},
123162306a36Sopenharmony_ci	{"I2S3", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},
123262306a36Sopenharmony_ci	{"I2S3", NULL, "I2S3_EN"},
123362306a36Sopenharmony_ci	{"I2S3", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},
123462306a36Sopenharmony_ci	{"I2S3", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},
123562306a36Sopenharmony_ci	{"I2S3", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},
123662306a36Sopenharmony_ci	{"I2S3", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},
123762306a36Sopenharmony_ci	{"I2S3", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},
123862306a36Sopenharmony_ci
123962306a36Sopenharmony_ci	{"I2S3", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
124062306a36Sopenharmony_ci	{"I2S3", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
124162306a36Sopenharmony_ci	{"I2S3", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
124262306a36Sopenharmony_ci	{"I2S3", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
124362306a36Sopenharmony_ci	{"I2S3", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
124462306a36Sopenharmony_ci	{"I2S3", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
124562306a36Sopenharmony_ci	{"I2S3", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
124662306a36Sopenharmony_ci	{"I2S3", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
124762306a36Sopenharmony_ci	{"I2S3", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
124862306a36Sopenharmony_ci	{I2S3_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},
124962306a36Sopenharmony_ci	{I2S3_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},
125062306a36Sopenharmony_ci
125162306a36Sopenharmony_ci	{"I2S3", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
125262306a36Sopenharmony_ci	{"I2S3", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
125362306a36Sopenharmony_ci	{"I2S3", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
125462306a36Sopenharmony_ci	{"I2S3", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
125562306a36Sopenharmony_ci	{"I2S3", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
125662306a36Sopenharmony_ci	{"I2S3", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
125762306a36Sopenharmony_ci	{"I2S3", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
125862306a36Sopenharmony_ci	{"I2S3", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
125962306a36Sopenharmony_ci	{"I2S3", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
126062306a36Sopenharmony_ci	{I2S3_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
126162306a36Sopenharmony_ci	{I2S3_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
126262306a36Sopenharmony_ci
126362306a36Sopenharmony_ci	/* i2s5 */
126462306a36Sopenharmony_ci	{"I2S5_CH1", "DL1_CH1", "DL1"},
126562306a36Sopenharmony_ci	{"I2S5_CH2", "DL1_CH2", "DL1"},
126662306a36Sopenharmony_ci
126762306a36Sopenharmony_ci	{"I2S5_CH1", "DL2_CH1", "DL2"},
126862306a36Sopenharmony_ci	{"I2S5_CH2", "DL2_CH2", "DL2"},
126962306a36Sopenharmony_ci
127062306a36Sopenharmony_ci	{"I2S5_CH1", "DL3_CH1", "DL3"},
127162306a36Sopenharmony_ci	{"I2S5_CH2", "DL3_CH2", "DL3"},
127262306a36Sopenharmony_ci
127362306a36Sopenharmony_ci	{"I2S5_CH1", "DL12_CH1", "DL12"},
127462306a36Sopenharmony_ci	{"I2S5_CH2", "DL12_CH2", "DL12"},
127562306a36Sopenharmony_ci
127662306a36Sopenharmony_ci	{"I2S5_CH1", "DL4_CH1", "DL4"},
127762306a36Sopenharmony_ci	{"I2S5_CH2", "DL4_CH2", "DL4"},
127862306a36Sopenharmony_ci
127962306a36Sopenharmony_ci	{"I2S5_CH1", "DL5_CH1", "DL5"},
128062306a36Sopenharmony_ci	{"I2S5_CH2", "DL5_CH2", "DL5"},
128162306a36Sopenharmony_ci
128262306a36Sopenharmony_ci	{"I2S5_CH1", "DL6_CH1", "DL6"},
128362306a36Sopenharmony_ci	{"I2S5_CH2", "DL6_CH2", "DL6"},
128462306a36Sopenharmony_ci
128562306a36Sopenharmony_ci	{"I2S5_CH1", "DL8_CH1", "DL8"},
128662306a36Sopenharmony_ci	{"I2S5_CH2", "DL8_CH2", "DL8"},
128762306a36Sopenharmony_ci
128862306a36Sopenharmony_ci	{"I2S5", NULL, "I2S5_CH1"},
128962306a36Sopenharmony_ci	{"I2S5", NULL, "I2S5_CH2"},
129062306a36Sopenharmony_ci
129162306a36Sopenharmony_ci	{"I2S5", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},
129262306a36Sopenharmony_ci	{"I2S5", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},
129362306a36Sopenharmony_ci	{"I2S5", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},
129462306a36Sopenharmony_ci	{"I2S5", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},
129562306a36Sopenharmony_ci	{"I2S5", NULL, "I2S5_EN"},
129662306a36Sopenharmony_ci	{"I2S5", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},
129762306a36Sopenharmony_ci	{"I2S5", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},
129862306a36Sopenharmony_ci	{"I2S5", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},
129962306a36Sopenharmony_ci	{"I2S5", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},
130062306a36Sopenharmony_ci
130162306a36Sopenharmony_ci	{"I2S5", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
130262306a36Sopenharmony_ci	{"I2S5", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
130362306a36Sopenharmony_ci	{"I2S5", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
130462306a36Sopenharmony_ci	{"I2S5", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
130562306a36Sopenharmony_ci	{"I2S5", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
130662306a36Sopenharmony_ci	{"I2S5", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
130762306a36Sopenharmony_ci	{"I2S5", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
130862306a36Sopenharmony_ci	{"I2S5", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
130962306a36Sopenharmony_ci	{"I2S5", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
131062306a36Sopenharmony_ci	{I2S5_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},
131162306a36Sopenharmony_ci	{I2S5_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},
131262306a36Sopenharmony_ci
131362306a36Sopenharmony_ci	{"I2S5", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
131462306a36Sopenharmony_ci	{"I2S5", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
131562306a36Sopenharmony_ci	{"I2S5", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
131662306a36Sopenharmony_ci	{"I2S5", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
131762306a36Sopenharmony_ci	{"I2S5", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
131862306a36Sopenharmony_ci	{"I2S5", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
131962306a36Sopenharmony_ci	{"I2S5", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
132062306a36Sopenharmony_ci	{"I2S5", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
132162306a36Sopenharmony_ci	{"I2S5", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
132262306a36Sopenharmony_ci	{I2S5_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
132362306a36Sopenharmony_ci	{I2S5_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
132462306a36Sopenharmony_ci
132562306a36Sopenharmony_ci	/* i2s6 */
132662306a36Sopenharmony_ci	{"I2S6", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},
132762306a36Sopenharmony_ci	{"I2S6", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},
132862306a36Sopenharmony_ci	{"I2S6", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},
132962306a36Sopenharmony_ci	{"I2S6", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},
133062306a36Sopenharmony_ci	{"I2S6", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},
133162306a36Sopenharmony_ci	{"I2S6", NULL, "I2S6_EN"},
133262306a36Sopenharmony_ci	{"I2S6", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},
133362306a36Sopenharmony_ci	{"I2S6", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},
133462306a36Sopenharmony_ci	{"I2S6", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},
133562306a36Sopenharmony_ci
133662306a36Sopenharmony_ci	{"I2S6", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
133762306a36Sopenharmony_ci	{"I2S6", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
133862306a36Sopenharmony_ci	{"I2S6", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
133962306a36Sopenharmony_ci	{"I2S6", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
134062306a36Sopenharmony_ci	{"I2S6", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
134162306a36Sopenharmony_ci	{"I2S6", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
134262306a36Sopenharmony_ci	{"I2S6", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
134362306a36Sopenharmony_ci	{"I2S6", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
134462306a36Sopenharmony_ci	{"I2S6", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
134562306a36Sopenharmony_ci	{I2S6_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},
134662306a36Sopenharmony_ci	{I2S6_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},
134762306a36Sopenharmony_ci
134862306a36Sopenharmony_ci	{"I2S6", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
134962306a36Sopenharmony_ci	{"I2S6", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
135062306a36Sopenharmony_ci	{"I2S6", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
135162306a36Sopenharmony_ci	{"I2S6", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
135262306a36Sopenharmony_ci	{"I2S6", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
135362306a36Sopenharmony_ci	{"I2S6", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
135462306a36Sopenharmony_ci	{"I2S6", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
135562306a36Sopenharmony_ci	{"I2S6", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
135662306a36Sopenharmony_ci	{"I2S6", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
135762306a36Sopenharmony_ci	{I2S6_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
135862306a36Sopenharmony_ci	{I2S6_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
135962306a36Sopenharmony_ci
136062306a36Sopenharmony_ci	/* i2s7 */
136162306a36Sopenharmony_ci	{"I2S7", NULL, "I2S7_CH1"},
136262306a36Sopenharmony_ci	{"I2S7", NULL, "I2S7_CH2"},
136362306a36Sopenharmony_ci
136462306a36Sopenharmony_ci	{"I2S7", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},
136562306a36Sopenharmony_ci	{"I2S7", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},
136662306a36Sopenharmony_ci	{"I2S7", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},
136762306a36Sopenharmony_ci	{"I2S7", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},
136862306a36Sopenharmony_ci	{"I2S7", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},
136962306a36Sopenharmony_ci	{"I2S7", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},
137062306a36Sopenharmony_ci	{"I2S7", NULL, "I2S7_EN"},
137162306a36Sopenharmony_ci	{"I2S7", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},
137262306a36Sopenharmony_ci	{"I2S7", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},
137362306a36Sopenharmony_ci
137462306a36Sopenharmony_ci	{"I2S7", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
137562306a36Sopenharmony_ci	{"I2S7", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
137662306a36Sopenharmony_ci	{"I2S7", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
137762306a36Sopenharmony_ci	{"I2S7", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
137862306a36Sopenharmony_ci	{"I2S7", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
137962306a36Sopenharmony_ci	{"I2S7", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
138062306a36Sopenharmony_ci	{"I2S7", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
138162306a36Sopenharmony_ci	{"I2S7", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
138262306a36Sopenharmony_ci	{"I2S7", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
138362306a36Sopenharmony_ci	{I2S7_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},
138462306a36Sopenharmony_ci	{I2S7_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},
138562306a36Sopenharmony_ci
138662306a36Sopenharmony_ci	{"I2S7", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
138762306a36Sopenharmony_ci	{"I2S7", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
138862306a36Sopenharmony_ci	{"I2S7", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
138962306a36Sopenharmony_ci	{"I2S7", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
139062306a36Sopenharmony_ci	{"I2S7", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
139162306a36Sopenharmony_ci	{"I2S7", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
139262306a36Sopenharmony_ci	{"I2S7", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
139362306a36Sopenharmony_ci	{"I2S7", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
139462306a36Sopenharmony_ci	{"I2S7", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
139562306a36Sopenharmony_ci	{I2S7_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
139662306a36Sopenharmony_ci	{I2S7_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
139762306a36Sopenharmony_ci
139862306a36Sopenharmony_ci	/* i2s8 */
139962306a36Sopenharmony_ci	{"I2S8", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},
140062306a36Sopenharmony_ci	{"I2S8", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},
140162306a36Sopenharmony_ci	{"I2S8", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},
140262306a36Sopenharmony_ci	{"I2S8", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},
140362306a36Sopenharmony_ci	{"I2S8", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},
140462306a36Sopenharmony_ci	{"I2S8", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},
140562306a36Sopenharmony_ci	{"I2S8", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},
140662306a36Sopenharmony_ci	{"I2S8", NULL, "I2S8_EN"},
140762306a36Sopenharmony_ci	{"I2S8", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},
140862306a36Sopenharmony_ci
140962306a36Sopenharmony_ci	{"I2S8", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
141062306a36Sopenharmony_ci	{"I2S8", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
141162306a36Sopenharmony_ci	{"I2S8", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
141262306a36Sopenharmony_ci	{"I2S8", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
141362306a36Sopenharmony_ci	{"I2S8", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
141462306a36Sopenharmony_ci	{"I2S8", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
141562306a36Sopenharmony_ci	{"I2S8", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
141662306a36Sopenharmony_ci	{"I2S8", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
141762306a36Sopenharmony_ci	{"I2S8", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
141862306a36Sopenharmony_ci	{I2S8_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},
141962306a36Sopenharmony_ci	{I2S8_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},
142062306a36Sopenharmony_ci
142162306a36Sopenharmony_ci	{"I2S8", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
142262306a36Sopenharmony_ci	{"I2S8", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
142362306a36Sopenharmony_ci	{"I2S8", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
142462306a36Sopenharmony_ci	{"I2S8", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
142562306a36Sopenharmony_ci	{"I2S8", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
142662306a36Sopenharmony_ci	{"I2S8", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
142762306a36Sopenharmony_ci	{"I2S8", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
142862306a36Sopenharmony_ci	{"I2S8", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
142962306a36Sopenharmony_ci	{"I2S8", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
143062306a36Sopenharmony_ci	{I2S8_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
143162306a36Sopenharmony_ci	{I2S8_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
143262306a36Sopenharmony_ci
143362306a36Sopenharmony_ci	/* i2s9 */
143462306a36Sopenharmony_ci	{"I2S9_CH1", "DL1_CH1", "DL1"},
143562306a36Sopenharmony_ci	{"I2S9_CH2", "DL1_CH2", "DL1"},
143662306a36Sopenharmony_ci
143762306a36Sopenharmony_ci	{"I2S9_CH1", "DL2_CH1", "DL2"},
143862306a36Sopenharmony_ci	{"I2S9_CH2", "DL2_CH2", "DL2"},
143962306a36Sopenharmony_ci
144062306a36Sopenharmony_ci	{"I2S9_CH1", "DL3_CH1", "DL3"},
144162306a36Sopenharmony_ci	{"I2S9_CH2", "DL3_CH2", "DL3"},
144262306a36Sopenharmony_ci
144362306a36Sopenharmony_ci	{"I2S9_CH1", "DL12_CH1", "DL12"},
144462306a36Sopenharmony_ci	{"I2S9_CH2", "DL12_CH2", "DL12"},
144562306a36Sopenharmony_ci
144662306a36Sopenharmony_ci	{"I2S9_CH1", "DL4_CH1", "DL4"},
144762306a36Sopenharmony_ci	{"I2S9_CH2", "DL4_CH2", "DL4"},
144862306a36Sopenharmony_ci
144962306a36Sopenharmony_ci	{"I2S9_CH1", "DL5_CH1", "DL5"},
145062306a36Sopenharmony_ci	{"I2S9_CH2", "DL5_CH2", "DL5"},
145162306a36Sopenharmony_ci
145262306a36Sopenharmony_ci	{"I2S9_CH1", "DL6_CH1", "DL6"},
145362306a36Sopenharmony_ci	{"I2S9_CH2", "DL6_CH2", "DL6"},
145462306a36Sopenharmony_ci
145562306a36Sopenharmony_ci	{"I2S9_CH1", "DL8_CH1", "DL8"},
145662306a36Sopenharmony_ci	{"I2S9_CH2", "DL8_CH2", "DL8"},
145762306a36Sopenharmony_ci
145862306a36Sopenharmony_ci	{"I2S9_CH1", "DL9_CH1", "DL9"},
145962306a36Sopenharmony_ci	{"I2S9_CH2", "DL9_CH2", "DL9"},
146062306a36Sopenharmony_ci
146162306a36Sopenharmony_ci	{"I2S9", NULL, "I2S9_CH1"},
146262306a36Sopenharmony_ci	{"I2S9", NULL, "I2S9_CH2"},
146362306a36Sopenharmony_ci
146462306a36Sopenharmony_ci	{"I2S9", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},
146562306a36Sopenharmony_ci	{"I2S9", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},
146662306a36Sopenharmony_ci	{"I2S9", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},
146762306a36Sopenharmony_ci	{"I2S9", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},
146862306a36Sopenharmony_ci	{"I2S9", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},
146962306a36Sopenharmony_ci	{"I2S9", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},
147062306a36Sopenharmony_ci	{"I2S9", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},
147162306a36Sopenharmony_ci	{"I2S9", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},
147262306a36Sopenharmony_ci	{"I2S9", NULL, "I2S9_EN"},
147362306a36Sopenharmony_ci
147462306a36Sopenharmony_ci	{"I2S9", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
147562306a36Sopenharmony_ci	{"I2S9", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
147662306a36Sopenharmony_ci	{"I2S9", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
147762306a36Sopenharmony_ci	{"I2S9", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
147862306a36Sopenharmony_ci	{"I2S9", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
147962306a36Sopenharmony_ci	{"I2S9", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
148062306a36Sopenharmony_ci	{"I2S9", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
148162306a36Sopenharmony_ci	{"I2S9", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
148262306a36Sopenharmony_ci	{"I2S9", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
148362306a36Sopenharmony_ci	{I2S9_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},
148462306a36Sopenharmony_ci	{I2S9_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},
148562306a36Sopenharmony_ci
148662306a36Sopenharmony_ci	{"I2S9", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
148762306a36Sopenharmony_ci	{"I2S9", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
148862306a36Sopenharmony_ci	{"I2S9", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
148962306a36Sopenharmony_ci	{"I2S9", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
149062306a36Sopenharmony_ci	{"I2S9", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
149162306a36Sopenharmony_ci	{"I2S9", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
149262306a36Sopenharmony_ci	{"I2S9", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
149362306a36Sopenharmony_ci	{"I2S9", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
149462306a36Sopenharmony_ci	{"I2S9", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
149562306a36Sopenharmony_ci	{I2S9_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
149662306a36Sopenharmony_ci	{I2S9_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
149762306a36Sopenharmony_ci
149862306a36Sopenharmony_ci	/* allow i2s on without codec on */
149962306a36Sopenharmony_ci	{"I2S0", NULL, "I2S0_In_Mux"},
150062306a36Sopenharmony_ci	{"I2S0_In_Mux", "Dummy_Widget", "I2S_DUMMY_IN"},
150162306a36Sopenharmony_ci
150262306a36Sopenharmony_ci	{"I2S8", NULL, "I2S8_In_Mux"},
150362306a36Sopenharmony_ci	{"I2S8_In_Mux", "Dummy_Widget", "I2S_DUMMY_IN"},
150462306a36Sopenharmony_ci
150562306a36Sopenharmony_ci	{"I2S1_Out_Mux", "Dummy_Widget", "I2S1"},
150662306a36Sopenharmony_ci	{"I2S_DUMMY_OUT", NULL, "I2S1_Out_Mux"},
150762306a36Sopenharmony_ci
150862306a36Sopenharmony_ci	{"I2S3_Out_Mux", "Dummy_Widget", "I2S3"},
150962306a36Sopenharmony_ci	{"I2S_DUMMY_OUT", NULL, "I2S3_Out_Mux"},
151062306a36Sopenharmony_ci
151162306a36Sopenharmony_ci	{"I2S5_Out_Mux", "Dummy_Widget", "I2S5"},
151262306a36Sopenharmony_ci	{"I2S_DUMMY_OUT", NULL, "I2S5_Out_Mux"},
151362306a36Sopenharmony_ci
151462306a36Sopenharmony_ci	{"I2S7_Out_Mux", "Dummy_Widget", "I2S7"},
151562306a36Sopenharmony_ci	{"I2S_DUMMY_OUT", NULL, "I2S7_Out_Mux"},
151662306a36Sopenharmony_ci
151762306a36Sopenharmony_ci	{"I2S9_Out_Mux", "Dummy_Widget", "I2S9"},
151862306a36Sopenharmony_ci	{"I2S_DUMMY_OUT", NULL, "I2S9_Out_Mux"},
151962306a36Sopenharmony_ci
152062306a36Sopenharmony_ci	/* i2s in lpbk */
152162306a36Sopenharmony_ci	{"I2S0_Lpbk_Mux", "Lpbk", "I2S3"},
152262306a36Sopenharmony_ci	{"I2S2_Lpbk_Mux", "Lpbk", "I2S1"},
152362306a36Sopenharmony_ci	{"I2S0", NULL, "I2S0_Lpbk_Mux"},
152462306a36Sopenharmony_ci	{"I2S2", NULL, "I2S2_Lpbk_Mux"},
152562306a36Sopenharmony_ci};
152662306a36Sopenharmony_ci
152762306a36Sopenharmony_ci/* dai ops */
152862306a36Sopenharmony_cistatic int mtk_dai_connsys_i2s_hw_params(struct snd_pcm_substream *substream,
152962306a36Sopenharmony_ci					 struct snd_pcm_hw_params *params,
153062306a36Sopenharmony_ci					 struct snd_soc_dai *dai)
153162306a36Sopenharmony_ci{
153262306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
153362306a36Sopenharmony_ci	unsigned int rate = params_rate(params);
153462306a36Sopenharmony_ci	unsigned int rate_reg = mt8192_rate_transform(afe->dev,
153562306a36Sopenharmony_ci						      rate, dai->id);
153662306a36Sopenharmony_ci	unsigned int i2s_con = 0;
153762306a36Sopenharmony_ci
153862306a36Sopenharmony_ci	dev_dbg(afe->dev, "%s(), id %d, stream %d, rate %d\n",
153962306a36Sopenharmony_ci		__func__, dai->id, substream->stream, rate);
154062306a36Sopenharmony_ci
154162306a36Sopenharmony_ci	/* non-inverse, i2s mode, proxy mode, 16bits, from connsys */
154262306a36Sopenharmony_ci	i2s_con |= 0 << INV_PAD_CTRL_SFT;
154362306a36Sopenharmony_ci	i2s_con |= I2S_FMT_I2S << I2S_FMT_SFT;
154462306a36Sopenharmony_ci	i2s_con |= 1 << I2S_SRC_SFT;
154562306a36Sopenharmony_ci	i2s_con |= get_i2s_wlen(SNDRV_PCM_FORMAT_S16_LE) << I2S_WLEN_SFT;
154662306a36Sopenharmony_ci	i2s_con |= 0 << I2SIN_PAD_SEL_SFT;
154762306a36Sopenharmony_ci	regmap_write(afe->regmap, AFE_CONNSYS_I2S_CON, i2s_con);
154862306a36Sopenharmony_ci
154962306a36Sopenharmony_ci	/* use asrc */
155062306a36Sopenharmony_ci	regmap_update_bits(afe->regmap,
155162306a36Sopenharmony_ci			   AFE_CONNSYS_I2S_CON,
155262306a36Sopenharmony_ci			   I2S_BYPSRC_MASK_SFT,
155362306a36Sopenharmony_ci			   0x0 << I2S_BYPSRC_SFT);
155462306a36Sopenharmony_ci
155562306a36Sopenharmony_ci	/* proxy mode, set i2s for asrc */
155662306a36Sopenharmony_ci	regmap_update_bits(afe->regmap,
155762306a36Sopenharmony_ci			   AFE_CONNSYS_I2S_CON,
155862306a36Sopenharmony_ci			   I2S_MODE_MASK_SFT,
155962306a36Sopenharmony_ci			   rate_reg << I2S_MODE_SFT);
156062306a36Sopenharmony_ci
156162306a36Sopenharmony_ci	switch (rate) {
156262306a36Sopenharmony_ci	case 32000:
156362306a36Sopenharmony_ci		regmap_write(afe->regmap, AFE_ASRC_2CH_CON3, 0x140000);
156462306a36Sopenharmony_ci		break;
156562306a36Sopenharmony_ci	case 44100:
156662306a36Sopenharmony_ci		regmap_write(afe->regmap, AFE_ASRC_2CH_CON3, 0x001B9000);
156762306a36Sopenharmony_ci		break;
156862306a36Sopenharmony_ci	default:
156962306a36Sopenharmony_ci		regmap_write(afe->regmap, AFE_ASRC_2CH_CON3, 0x001E0000);
157062306a36Sopenharmony_ci		break;
157162306a36Sopenharmony_ci	}
157262306a36Sopenharmony_ci
157362306a36Sopenharmony_ci	/* Calibration setting */
157462306a36Sopenharmony_ci	regmap_write(afe->regmap, AFE_ASRC_2CH_CON4, 0x00140000);
157562306a36Sopenharmony_ci	regmap_write(afe->regmap, AFE_ASRC_2CH_CON9, 0x00036000);
157662306a36Sopenharmony_ci	regmap_write(afe->regmap, AFE_ASRC_2CH_CON10, 0x0002FC00);
157762306a36Sopenharmony_ci	regmap_write(afe->regmap, AFE_ASRC_2CH_CON6, 0x00007EF4);
157862306a36Sopenharmony_ci	regmap_write(afe->regmap, AFE_ASRC_2CH_CON5, 0x00FF5986);
157962306a36Sopenharmony_ci
158062306a36Sopenharmony_ci	/* 0:Stereo 1:Mono */
158162306a36Sopenharmony_ci	regmap_update_bits(afe->regmap,
158262306a36Sopenharmony_ci			   AFE_ASRC_2CH_CON2,
158362306a36Sopenharmony_ci			   CHSET_IS_MONO_MASK_SFT,
158462306a36Sopenharmony_ci			   0x0 << CHSET_IS_MONO_SFT);
158562306a36Sopenharmony_ci
158662306a36Sopenharmony_ci	return 0;
158762306a36Sopenharmony_ci}
158862306a36Sopenharmony_ci
158962306a36Sopenharmony_cistatic int mtk_dai_connsys_i2s_trigger(struct snd_pcm_substream *substream,
159062306a36Sopenharmony_ci				       int cmd, struct snd_soc_dai *dai)
159162306a36Sopenharmony_ci{
159262306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
159362306a36Sopenharmony_ci	struct mt8192_afe_private *afe_priv = afe->platform_priv;
159462306a36Sopenharmony_ci
159562306a36Sopenharmony_ci	dev_dbg(afe->dev, "%s(), cmd %d, stream %d\n",
159662306a36Sopenharmony_ci		__func__, cmd, substream->stream);
159762306a36Sopenharmony_ci
159862306a36Sopenharmony_ci	switch (cmd) {
159962306a36Sopenharmony_ci	case SNDRV_PCM_TRIGGER_START:
160062306a36Sopenharmony_ci	case SNDRV_PCM_TRIGGER_RESUME:
160162306a36Sopenharmony_ci		/* i2s enable */
160262306a36Sopenharmony_ci		regmap_update_bits(afe->regmap,
160362306a36Sopenharmony_ci				   AFE_CONNSYS_I2S_CON,
160462306a36Sopenharmony_ci				   I2S_EN_MASK_SFT,
160562306a36Sopenharmony_ci				   0x1 << I2S_EN_SFT);
160662306a36Sopenharmony_ci
160762306a36Sopenharmony_ci		/* calibrator enable */
160862306a36Sopenharmony_ci		regmap_update_bits(afe->regmap,
160962306a36Sopenharmony_ci				   AFE_ASRC_2CH_CON5,
161062306a36Sopenharmony_ci				   CALI_EN_MASK_SFT,
161162306a36Sopenharmony_ci				   0x1 << CALI_EN_SFT);
161262306a36Sopenharmony_ci
161362306a36Sopenharmony_ci		/* asrc enable */
161462306a36Sopenharmony_ci		regmap_update_bits(afe->regmap,
161562306a36Sopenharmony_ci				   AFE_ASRC_2CH_CON0,
161662306a36Sopenharmony_ci				   CON0_CHSET_STR_CLR_MASK_SFT,
161762306a36Sopenharmony_ci				   0x1 << CON0_CHSET_STR_CLR_SFT);
161862306a36Sopenharmony_ci		regmap_update_bits(afe->regmap,
161962306a36Sopenharmony_ci				   AFE_ASRC_2CH_CON0,
162062306a36Sopenharmony_ci				   CON0_ASM_ON_MASK_SFT,
162162306a36Sopenharmony_ci				   0x1 << CON0_ASM_ON_SFT);
162262306a36Sopenharmony_ci
162362306a36Sopenharmony_ci		afe_priv->dai_on[dai->id] = true;
162462306a36Sopenharmony_ci		break;
162562306a36Sopenharmony_ci	case SNDRV_PCM_TRIGGER_STOP:
162662306a36Sopenharmony_ci	case SNDRV_PCM_TRIGGER_SUSPEND:
162762306a36Sopenharmony_ci		regmap_update_bits(afe->regmap,
162862306a36Sopenharmony_ci				   AFE_ASRC_2CH_CON0,
162962306a36Sopenharmony_ci				   CON0_ASM_ON_MASK_SFT,
163062306a36Sopenharmony_ci				   0 << CON0_ASM_ON_SFT);
163162306a36Sopenharmony_ci		regmap_update_bits(afe->regmap,
163262306a36Sopenharmony_ci				   AFE_ASRC_2CH_CON5,
163362306a36Sopenharmony_ci				   CALI_EN_MASK_SFT,
163462306a36Sopenharmony_ci				   0 << CALI_EN_SFT);
163562306a36Sopenharmony_ci
163662306a36Sopenharmony_ci		/* i2s disable */
163762306a36Sopenharmony_ci		regmap_update_bits(afe->regmap,
163862306a36Sopenharmony_ci				   AFE_CONNSYS_I2S_CON,
163962306a36Sopenharmony_ci				   I2S_EN_MASK_SFT,
164062306a36Sopenharmony_ci				   0x0 << I2S_EN_SFT);
164162306a36Sopenharmony_ci
164262306a36Sopenharmony_ci		/* bypass asrc */
164362306a36Sopenharmony_ci		regmap_update_bits(afe->regmap,
164462306a36Sopenharmony_ci				   AFE_CONNSYS_I2S_CON,
164562306a36Sopenharmony_ci				   I2S_BYPSRC_MASK_SFT,
164662306a36Sopenharmony_ci				   0x1 << I2S_BYPSRC_SFT);
164762306a36Sopenharmony_ci
164862306a36Sopenharmony_ci		afe_priv->dai_on[dai->id] = false;
164962306a36Sopenharmony_ci		break;
165062306a36Sopenharmony_ci	default:
165162306a36Sopenharmony_ci		return -EINVAL;
165262306a36Sopenharmony_ci	}
165362306a36Sopenharmony_ci	return 0;
165462306a36Sopenharmony_ci}
165562306a36Sopenharmony_ci
165662306a36Sopenharmony_cistatic const struct snd_soc_dai_ops mtk_dai_connsys_i2s_ops = {
165762306a36Sopenharmony_ci	.hw_params = mtk_dai_connsys_i2s_hw_params,
165862306a36Sopenharmony_ci	.trigger = mtk_dai_connsys_i2s_trigger,
165962306a36Sopenharmony_ci};
166062306a36Sopenharmony_ci
166162306a36Sopenharmony_ci/* i2s */
166262306a36Sopenharmony_cistatic int mtk_dai_i2s_config(struct mtk_base_afe *afe,
166362306a36Sopenharmony_ci			      struct snd_pcm_hw_params *params,
166462306a36Sopenharmony_ci			      int i2s_id)
166562306a36Sopenharmony_ci{
166662306a36Sopenharmony_ci	struct mt8192_afe_private *afe_priv = afe->platform_priv;
166762306a36Sopenharmony_ci	struct mtk_afe_i2s_priv *i2s_priv = afe_priv->dai_priv[i2s_id];
166862306a36Sopenharmony_ci
166962306a36Sopenharmony_ci	unsigned int rate = params_rate(params);
167062306a36Sopenharmony_ci	unsigned int rate_reg = mt8192_rate_transform(afe->dev,
167162306a36Sopenharmony_ci						      rate, i2s_id);
167262306a36Sopenharmony_ci	snd_pcm_format_t format = params_format(params);
167362306a36Sopenharmony_ci	unsigned int i2s_con = 0;
167462306a36Sopenharmony_ci	int ret = 0;
167562306a36Sopenharmony_ci
167662306a36Sopenharmony_ci	dev_dbg(afe->dev, "%s(), id %d, rate %d, format %d\n",
167762306a36Sopenharmony_ci		__func__, i2s_id, rate, format);
167862306a36Sopenharmony_ci
167962306a36Sopenharmony_ci	if (i2s_priv)
168062306a36Sopenharmony_ci		i2s_priv->rate = rate;
168162306a36Sopenharmony_ci	else
168262306a36Sopenharmony_ci		dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
168362306a36Sopenharmony_ci
168462306a36Sopenharmony_ci	switch (i2s_id) {
168562306a36Sopenharmony_ci	case MT8192_DAI_I2S_0:
168662306a36Sopenharmony_ci		i2s_con = I2S_IN_PAD_IO_MUX << I2SIN_PAD_SEL_SFT;
168762306a36Sopenharmony_ci		i2s_con |= rate_reg << I2S_OUT_MODE_SFT;
168862306a36Sopenharmony_ci		i2s_con |= I2S_FMT_I2S << I2S_FMT_SFT;
168962306a36Sopenharmony_ci		i2s_con |= get_i2s_wlen(format) << I2S_WLEN_SFT;
169062306a36Sopenharmony_ci		regmap_update_bits(afe->regmap, AFE_I2S_CON,
169162306a36Sopenharmony_ci				   0xffffeffe, i2s_con);
169262306a36Sopenharmony_ci		break;
169362306a36Sopenharmony_ci	case MT8192_DAI_I2S_1:
169462306a36Sopenharmony_ci		i2s_con = I2S1_SEL_O28_O29 << I2S2_SEL_O03_O04_SFT;
169562306a36Sopenharmony_ci		i2s_con |= rate_reg << I2S2_OUT_MODE_SFT;
169662306a36Sopenharmony_ci		i2s_con |= I2S_FMT_I2S << I2S2_FMT_SFT;
169762306a36Sopenharmony_ci		i2s_con |= get_i2s_wlen(format) << I2S2_WLEN_SFT;
169862306a36Sopenharmony_ci		regmap_update_bits(afe->regmap, AFE_I2S_CON1,
169962306a36Sopenharmony_ci				   0xffffeffe, i2s_con);
170062306a36Sopenharmony_ci		break;
170162306a36Sopenharmony_ci	case MT8192_DAI_I2S_2:
170262306a36Sopenharmony_ci		i2s_con = 8 << I2S3_UPDATE_WORD_SFT;
170362306a36Sopenharmony_ci		i2s_con |= rate_reg << I2S3_OUT_MODE_SFT;
170462306a36Sopenharmony_ci		i2s_con |= I2S_FMT_I2S << I2S3_FMT_SFT;
170562306a36Sopenharmony_ci		i2s_con |= get_i2s_wlen(format) << I2S3_WLEN_SFT;
170662306a36Sopenharmony_ci		regmap_update_bits(afe->regmap, AFE_I2S_CON2,
170762306a36Sopenharmony_ci				   0xffffeffe, i2s_con);
170862306a36Sopenharmony_ci		break;
170962306a36Sopenharmony_ci	case MT8192_DAI_I2S_3:
171062306a36Sopenharmony_ci		i2s_con = rate_reg << I2S4_OUT_MODE_SFT;
171162306a36Sopenharmony_ci		i2s_con |= I2S_FMT_I2S << I2S4_FMT_SFT;
171262306a36Sopenharmony_ci		i2s_con |= get_i2s_wlen(format) << I2S4_WLEN_SFT;
171362306a36Sopenharmony_ci		regmap_update_bits(afe->regmap, AFE_I2S_CON3,
171462306a36Sopenharmony_ci				   0xffffeffe, i2s_con);
171562306a36Sopenharmony_ci		break;
171662306a36Sopenharmony_ci	case MT8192_DAI_I2S_5:
171762306a36Sopenharmony_ci		i2s_con = rate_reg << I2S5_OUT_MODE_SFT;
171862306a36Sopenharmony_ci		i2s_con |= I2S_FMT_I2S << I2S5_FMT_SFT;
171962306a36Sopenharmony_ci		i2s_con |= get_i2s_wlen(format) << I2S5_WLEN_SFT;
172062306a36Sopenharmony_ci		regmap_update_bits(afe->regmap, AFE_I2S_CON4,
172162306a36Sopenharmony_ci				   0xffffeffe, i2s_con);
172262306a36Sopenharmony_ci		break;
172362306a36Sopenharmony_ci	case MT8192_DAI_I2S_6:
172462306a36Sopenharmony_ci		i2s_con = rate_reg << I2S6_OUT_MODE_SFT;
172562306a36Sopenharmony_ci		i2s_con |= I2S_FMT_I2S << I2S6_FMT_SFT;
172662306a36Sopenharmony_ci		i2s_con |= get_i2s_wlen(format) << I2S6_WLEN_SFT;
172762306a36Sopenharmony_ci		regmap_update_bits(afe->regmap, AFE_I2S_CON6,
172862306a36Sopenharmony_ci				   0xffffeffe, i2s_con);
172962306a36Sopenharmony_ci		break;
173062306a36Sopenharmony_ci	case MT8192_DAI_I2S_7:
173162306a36Sopenharmony_ci		i2s_con = rate_reg << I2S7_OUT_MODE_SFT;
173262306a36Sopenharmony_ci		i2s_con |= I2S_FMT_I2S << I2S7_FMT_SFT;
173362306a36Sopenharmony_ci		i2s_con |= get_i2s_wlen(format) << I2S7_WLEN_SFT;
173462306a36Sopenharmony_ci		regmap_update_bits(afe->regmap, AFE_I2S_CON7,
173562306a36Sopenharmony_ci				   0xffffeffe, i2s_con);
173662306a36Sopenharmony_ci		break;
173762306a36Sopenharmony_ci	case MT8192_DAI_I2S_8:
173862306a36Sopenharmony_ci		i2s_con = rate_reg << I2S8_OUT_MODE_SFT;
173962306a36Sopenharmony_ci		i2s_con |= I2S_FMT_I2S << I2S8_FMT_SFT;
174062306a36Sopenharmony_ci		i2s_con |= get_i2s_wlen(format) << I2S8_WLEN_SFT;
174162306a36Sopenharmony_ci		regmap_update_bits(afe->regmap, AFE_I2S_CON8,
174262306a36Sopenharmony_ci				   0xffffeffe, i2s_con);
174362306a36Sopenharmony_ci		break;
174462306a36Sopenharmony_ci	case MT8192_DAI_I2S_9:
174562306a36Sopenharmony_ci		i2s_con = rate_reg << I2S9_OUT_MODE_SFT;
174662306a36Sopenharmony_ci		i2s_con |= I2S_FMT_I2S << I2S9_FMT_SFT;
174762306a36Sopenharmony_ci		i2s_con |= get_i2s_wlen(format) << I2S9_WLEN_SFT;
174862306a36Sopenharmony_ci		regmap_update_bits(afe->regmap, AFE_I2S_CON9,
174962306a36Sopenharmony_ci				   0xffffeffe, i2s_con);
175062306a36Sopenharmony_ci		break;
175162306a36Sopenharmony_ci	default:
175262306a36Sopenharmony_ci		dev_warn(afe->dev, "%s(), id %d not support\n",
175362306a36Sopenharmony_ci			 __func__, i2s_id);
175462306a36Sopenharmony_ci		return -EINVAL;
175562306a36Sopenharmony_ci	}
175662306a36Sopenharmony_ci
175762306a36Sopenharmony_ci	/* set share i2s */
175862306a36Sopenharmony_ci	if (i2s_priv && i2s_priv->share_i2s_id >= 0)
175962306a36Sopenharmony_ci		ret = mtk_dai_i2s_config(afe, params, i2s_priv->share_i2s_id);
176062306a36Sopenharmony_ci
176162306a36Sopenharmony_ci	return ret;
176262306a36Sopenharmony_ci}
176362306a36Sopenharmony_ci
176462306a36Sopenharmony_cistatic int mtk_dai_i2s_hw_params(struct snd_pcm_substream *substream,
176562306a36Sopenharmony_ci				 struct snd_pcm_hw_params *params,
176662306a36Sopenharmony_ci				 struct snd_soc_dai *dai)
176762306a36Sopenharmony_ci{
176862306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
176962306a36Sopenharmony_ci
177062306a36Sopenharmony_ci	return mtk_dai_i2s_config(afe, params, dai->id);
177162306a36Sopenharmony_ci}
177262306a36Sopenharmony_ci
177362306a36Sopenharmony_cistatic int mtk_dai_i2s_set_sysclk(struct snd_soc_dai *dai,
177462306a36Sopenharmony_ci				  int clk_id, unsigned int freq, int dir)
177562306a36Sopenharmony_ci{
177662306a36Sopenharmony_ci	struct mtk_base_afe *afe = dev_get_drvdata(dai->dev);
177762306a36Sopenharmony_ci	struct mt8192_afe_private *afe_priv = afe->platform_priv;
177862306a36Sopenharmony_ci	struct mtk_afe_i2s_priv *i2s_priv = afe_priv->dai_priv[dai->id];
177962306a36Sopenharmony_ci	int apll;
178062306a36Sopenharmony_ci	int apll_rate;
178162306a36Sopenharmony_ci
178262306a36Sopenharmony_ci	if (!i2s_priv) {
178362306a36Sopenharmony_ci		dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
178462306a36Sopenharmony_ci		return -EINVAL;
178562306a36Sopenharmony_ci	}
178662306a36Sopenharmony_ci
178762306a36Sopenharmony_ci	if (dir != SND_SOC_CLOCK_OUT) {
178862306a36Sopenharmony_ci		dev_warn(afe->dev, "%s(), dir != SND_SOC_CLOCK_OUT", __func__);
178962306a36Sopenharmony_ci		return -EINVAL;
179062306a36Sopenharmony_ci	}
179162306a36Sopenharmony_ci
179262306a36Sopenharmony_ci	dev_dbg(afe->dev, "%s(), freq %d\n", __func__, freq);
179362306a36Sopenharmony_ci
179462306a36Sopenharmony_ci	apll = mt8192_get_apll_by_rate(afe, freq);
179562306a36Sopenharmony_ci	apll_rate = mt8192_get_apll_rate(afe, apll);
179662306a36Sopenharmony_ci
179762306a36Sopenharmony_ci	if (freq > apll_rate) {
179862306a36Sopenharmony_ci		dev_warn(afe->dev, "%s(), freq > apll rate", __func__);
179962306a36Sopenharmony_ci		return -EINVAL;
180062306a36Sopenharmony_ci	}
180162306a36Sopenharmony_ci
180262306a36Sopenharmony_ci	if (apll_rate % freq != 0) {
180362306a36Sopenharmony_ci		dev_warn(afe->dev, "%s(), APLL can't gen freq Hz", __func__);
180462306a36Sopenharmony_ci		return -EINVAL;
180562306a36Sopenharmony_ci	}
180662306a36Sopenharmony_ci
180762306a36Sopenharmony_ci	i2s_priv->mclk_rate = freq;
180862306a36Sopenharmony_ci	i2s_priv->mclk_apll = apll;
180962306a36Sopenharmony_ci
181062306a36Sopenharmony_ci	if (i2s_priv->share_i2s_id > 0) {
181162306a36Sopenharmony_ci		struct mtk_afe_i2s_priv *share_i2s_priv;
181262306a36Sopenharmony_ci
181362306a36Sopenharmony_ci		share_i2s_priv = afe_priv->dai_priv[i2s_priv->share_i2s_id];
181462306a36Sopenharmony_ci		if (!share_i2s_priv) {
181562306a36Sopenharmony_ci			dev_warn(afe->dev, "%s(), share_i2s_priv = NULL",
181662306a36Sopenharmony_ci				 __func__);
181762306a36Sopenharmony_ci			return -EINVAL;
181862306a36Sopenharmony_ci		}
181962306a36Sopenharmony_ci
182062306a36Sopenharmony_ci		share_i2s_priv->mclk_rate = i2s_priv->mclk_rate;
182162306a36Sopenharmony_ci		share_i2s_priv->mclk_apll = i2s_priv->mclk_apll;
182262306a36Sopenharmony_ci	}
182362306a36Sopenharmony_ci
182462306a36Sopenharmony_ci	return 0;
182562306a36Sopenharmony_ci}
182662306a36Sopenharmony_ci
182762306a36Sopenharmony_cistatic const struct snd_soc_dai_ops mtk_dai_i2s_ops = {
182862306a36Sopenharmony_ci	.hw_params = mtk_dai_i2s_hw_params,
182962306a36Sopenharmony_ci	.set_sysclk = mtk_dai_i2s_set_sysclk,
183062306a36Sopenharmony_ci};
183162306a36Sopenharmony_ci
183262306a36Sopenharmony_ci/* dai driver */
183362306a36Sopenharmony_ci#define MTK_CONNSYS_I2S_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
183462306a36Sopenharmony_ci
183562306a36Sopenharmony_ci#define MTK_I2S_RATES (SNDRV_PCM_RATE_8000_48000 |\
183662306a36Sopenharmony_ci		       SNDRV_PCM_RATE_88200 |\
183762306a36Sopenharmony_ci		       SNDRV_PCM_RATE_96000 |\
183862306a36Sopenharmony_ci		       SNDRV_PCM_RATE_176400 |\
183962306a36Sopenharmony_ci		       SNDRV_PCM_RATE_192000)
184062306a36Sopenharmony_ci
184162306a36Sopenharmony_ci#define MTK_I2S_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
184262306a36Sopenharmony_ci			 SNDRV_PCM_FMTBIT_S24_LE |\
184362306a36Sopenharmony_ci			 SNDRV_PCM_FMTBIT_S32_LE)
184462306a36Sopenharmony_ci
184562306a36Sopenharmony_cistatic struct snd_soc_dai_driver mtk_dai_i2s_driver[] = {
184662306a36Sopenharmony_ci	{
184762306a36Sopenharmony_ci		.name = "CONNSYS_I2S",
184862306a36Sopenharmony_ci		.id = MT8192_DAI_CONNSYS_I2S,
184962306a36Sopenharmony_ci		.capture = {
185062306a36Sopenharmony_ci			.stream_name = "Connsys I2S",
185162306a36Sopenharmony_ci			.channels_min = 1,
185262306a36Sopenharmony_ci			.channels_max = 2,
185362306a36Sopenharmony_ci			.rates = MTK_CONNSYS_I2S_RATES,
185462306a36Sopenharmony_ci			.formats = MTK_I2S_FORMATS,
185562306a36Sopenharmony_ci		},
185662306a36Sopenharmony_ci		.ops = &mtk_dai_connsys_i2s_ops,
185762306a36Sopenharmony_ci	},
185862306a36Sopenharmony_ci	{
185962306a36Sopenharmony_ci		.name = "I2S0",
186062306a36Sopenharmony_ci		.id = MT8192_DAI_I2S_0,
186162306a36Sopenharmony_ci		.capture = {
186262306a36Sopenharmony_ci			.stream_name = "I2S0",
186362306a36Sopenharmony_ci			.channels_min = 1,
186462306a36Sopenharmony_ci			.channels_max = 2,
186562306a36Sopenharmony_ci			.rates = MTK_I2S_RATES,
186662306a36Sopenharmony_ci			.formats = MTK_I2S_FORMATS,
186762306a36Sopenharmony_ci		},
186862306a36Sopenharmony_ci		.ops = &mtk_dai_i2s_ops,
186962306a36Sopenharmony_ci	},
187062306a36Sopenharmony_ci	{
187162306a36Sopenharmony_ci		.name = "I2S1",
187262306a36Sopenharmony_ci		.id = MT8192_DAI_I2S_1,
187362306a36Sopenharmony_ci		.playback = {
187462306a36Sopenharmony_ci			.stream_name = "I2S1",
187562306a36Sopenharmony_ci			.channels_min = 1,
187662306a36Sopenharmony_ci			.channels_max = 2,
187762306a36Sopenharmony_ci			.rates = MTK_I2S_RATES,
187862306a36Sopenharmony_ci			.formats = MTK_I2S_FORMATS,
187962306a36Sopenharmony_ci		},
188062306a36Sopenharmony_ci		.ops = &mtk_dai_i2s_ops,
188162306a36Sopenharmony_ci	},
188262306a36Sopenharmony_ci	{
188362306a36Sopenharmony_ci		.name = "I2S2",
188462306a36Sopenharmony_ci		.id = MT8192_DAI_I2S_2,
188562306a36Sopenharmony_ci		.capture = {
188662306a36Sopenharmony_ci			.stream_name = "I2S2",
188762306a36Sopenharmony_ci			.channels_min = 1,
188862306a36Sopenharmony_ci			.channels_max = 2,
188962306a36Sopenharmony_ci			.rates = MTK_I2S_RATES,
189062306a36Sopenharmony_ci			.formats = MTK_I2S_FORMATS,
189162306a36Sopenharmony_ci		},
189262306a36Sopenharmony_ci		.ops = &mtk_dai_i2s_ops,
189362306a36Sopenharmony_ci	},
189462306a36Sopenharmony_ci	{
189562306a36Sopenharmony_ci		.name = "I2S3",
189662306a36Sopenharmony_ci		.id = MT8192_DAI_I2S_3,
189762306a36Sopenharmony_ci		.playback = {
189862306a36Sopenharmony_ci			.stream_name = "I2S3",
189962306a36Sopenharmony_ci			.channels_min = 1,
190062306a36Sopenharmony_ci			.channels_max = 2,
190162306a36Sopenharmony_ci			.rates = MTK_I2S_RATES,
190262306a36Sopenharmony_ci			.formats = MTK_I2S_FORMATS,
190362306a36Sopenharmony_ci		},
190462306a36Sopenharmony_ci		.ops = &mtk_dai_i2s_ops,
190562306a36Sopenharmony_ci	},
190662306a36Sopenharmony_ci	{
190762306a36Sopenharmony_ci		.name = "I2S5",
190862306a36Sopenharmony_ci		.id = MT8192_DAI_I2S_5,
190962306a36Sopenharmony_ci		.playback = {
191062306a36Sopenharmony_ci			.stream_name = "I2S5",
191162306a36Sopenharmony_ci			.channels_min = 1,
191262306a36Sopenharmony_ci			.channels_max = 2,
191362306a36Sopenharmony_ci			.rates = MTK_I2S_RATES,
191462306a36Sopenharmony_ci			.formats = MTK_I2S_FORMATS,
191562306a36Sopenharmony_ci		},
191662306a36Sopenharmony_ci		.ops = &mtk_dai_i2s_ops,
191762306a36Sopenharmony_ci	},
191862306a36Sopenharmony_ci	{
191962306a36Sopenharmony_ci		.name = "I2S6",
192062306a36Sopenharmony_ci		.id = MT8192_DAI_I2S_6,
192162306a36Sopenharmony_ci		.capture = {
192262306a36Sopenharmony_ci			.stream_name = "I2S6",
192362306a36Sopenharmony_ci			.channels_min = 1,
192462306a36Sopenharmony_ci			.channels_max = 2,
192562306a36Sopenharmony_ci			.rates = MTK_I2S_RATES,
192662306a36Sopenharmony_ci			.formats = MTK_I2S_FORMATS,
192762306a36Sopenharmony_ci		},
192862306a36Sopenharmony_ci		.ops = &mtk_dai_i2s_ops,
192962306a36Sopenharmony_ci	},
193062306a36Sopenharmony_ci	{
193162306a36Sopenharmony_ci		.name = "I2S7",
193262306a36Sopenharmony_ci		.id = MT8192_DAI_I2S_7,
193362306a36Sopenharmony_ci		.playback = {
193462306a36Sopenharmony_ci			.stream_name = "I2S7",
193562306a36Sopenharmony_ci			.channels_min = 1,
193662306a36Sopenharmony_ci			.channels_max = 2,
193762306a36Sopenharmony_ci			.rates = MTK_I2S_RATES,
193862306a36Sopenharmony_ci			.formats = MTK_I2S_FORMATS,
193962306a36Sopenharmony_ci		},
194062306a36Sopenharmony_ci		.ops = &mtk_dai_i2s_ops,
194162306a36Sopenharmony_ci	},
194262306a36Sopenharmony_ci	{
194362306a36Sopenharmony_ci		.name = "I2S8",
194462306a36Sopenharmony_ci		.id = MT8192_DAI_I2S_8,
194562306a36Sopenharmony_ci		.capture = {
194662306a36Sopenharmony_ci			.stream_name = "I2S8",
194762306a36Sopenharmony_ci			.channels_min = 1,
194862306a36Sopenharmony_ci			.channels_max = 2,
194962306a36Sopenharmony_ci			.rates = MTK_I2S_RATES,
195062306a36Sopenharmony_ci			.formats = MTK_I2S_FORMATS,
195162306a36Sopenharmony_ci		},
195262306a36Sopenharmony_ci		.ops = &mtk_dai_i2s_ops,
195362306a36Sopenharmony_ci	},
195462306a36Sopenharmony_ci	{
195562306a36Sopenharmony_ci		.name = "I2S9",
195662306a36Sopenharmony_ci		.id = MT8192_DAI_I2S_9,
195762306a36Sopenharmony_ci		.playback = {
195862306a36Sopenharmony_ci			.stream_name = "I2S9",
195962306a36Sopenharmony_ci			.channels_min = 1,
196062306a36Sopenharmony_ci			.channels_max = 2,
196162306a36Sopenharmony_ci			.rates = MTK_I2S_RATES,
196262306a36Sopenharmony_ci			.formats = MTK_I2S_FORMATS,
196362306a36Sopenharmony_ci		},
196462306a36Sopenharmony_ci		.ops = &mtk_dai_i2s_ops,
196562306a36Sopenharmony_ci	}
196662306a36Sopenharmony_ci};
196762306a36Sopenharmony_ci
196862306a36Sopenharmony_ci/* this enum is merely for mtk_afe_i2s_priv declare */
196962306a36Sopenharmony_cienum {
197062306a36Sopenharmony_ci	DAI_I2S0 = 0,
197162306a36Sopenharmony_ci	DAI_I2S1,
197262306a36Sopenharmony_ci	DAI_I2S2,
197362306a36Sopenharmony_ci	DAI_I2S3,
197462306a36Sopenharmony_ci	DAI_I2S5,
197562306a36Sopenharmony_ci	DAI_I2S6,
197662306a36Sopenharmony_ci	DAI_I2S7,
197762306a36Sopenharmony_ci	DAI_I2S8,
197862306a36Sopenharmony_ci	DAI_I2S9,
197962306a36Sopenharmony_ci	DAI_I2S_NUM,
198062306a36Sopenharmony_ci};
198162306a36Sopenharmony_ci
198262306a36Sopenharmony_cistatic const struct mtk_afe_i2s_priv mt8192_i2s_priv[DAI_I2S_NUM] = {
198362306a36Sopenharmony_ci	[DAI_I2S0] = {
198462306a36Sopenharmony_ci		.id = MT8192_DAI_I2S_0,
198562306a36Sopenharmony_ci		.mclk_id = MT8192_I2S0_MCK,
198662306a36Sopenharmony_ci		.share_i2s_id = -1,
198762306a36Sopenharmony_ci	},
198862306a36Sopenharmony_ci	[DAI_I2S1] = {
198962306a36Sopenharmony_ci		.id = MT8192_DAI_I2S_1,
199062306a36Sopenharmony_ci		.mclk_id = MT8192_I2S1_MCK,
199162306a36Sopenharmony_ci		.share_i2s_id = -1,
199262306a36Sopenharmony_ci	},
199362306a36Sopenharmony_ci	[DAI_I2S2] = {
199462306a36Sopenharmony_ci		.id = MT8192_DAI_I2S_2,
199562306a36Sopenharmony_ci		.mclk_id = MT8192_I2S2_MCK,
199662306a36Sopenharmony_ci		.share_i2s_id = -1,
199762306a36Sopenharmony_ci	},
199862306a36Sopenharmony_ci	[DAI_I2S3] = {
199962306a36Sopenharmony_ci		.id = MT8192_DAI_I2S_3,
200062306a36Sopenharmony_ci		.mclk_id = MT8192_I2S3_MCK,
200162306a36Sopenharmony_ci		.share_i2s_id = -1,
200262306a36Sopenharmony_ci	},
200362306a36Sopenharmony_ci	[DAI_I2S5] = {
200462306a36Sopenharmony_ci		.id = MT8192_DAI_I2S_5,
200562306a36Sopenharmony_ci		.mclk_id = MT8192_I2S5_MCK,
200662306a36Sopenharmony_ci		.share_i2s_id = -1,
200762306a36Sopenharmony_ci	},
200862306a36Sopenharmony_ci	[DAI_I2S6] = {
200962306a36Sopenharmony_ci		.id = MT8192_DAI_I2S_6,
201062306a36Sopenharmony_ci		.mclk_id = MT8192_I2S6_MCK,
201162306a36Sopenharmony_ci		.share_i2s_id = -1,
201262306a36Sopenharmony_ci	},
201362306a36Sopenharmony_ci	[DAI_I2S7] = {
201462306a36Sopenharmony_ci		.id = MT8192_DAI_I2S_7,
201562306a36Sopenharmony_ci		.mclk_id = MT8192_I2S7_MCK,
201662306a36Sopenharmony_ci		.share_i2s_id = -1,
201762306a36Sopenharmony_ci	},
201862306a36Sopenharmony_ci	[DAI_I2S8] = {
201962306a36Sopenharmony_ci		.id = MT8192_DAI_I2S_8,
202062306a36Sopenharmony_ci		.mclk_id = MT8192_I2S8_MCK,
202162306a36Sopenharmony_ci		.share_i2s_id = -1,
202262306a36Sopenharmony_ci	},
202362306a36Sopenharmony_ci	[DAI_I2S9] = {
202462306a36Sopenharmony_ci		.id = MT8192_DAI_I2S_9,
202562306a36Sopenharmony_ci		.mclk_id = MT8192_I2S9_MCK,
202662306a36Sopenharmony_ci		.share_i2s_id = -1,
202762306a36Sopenharmony_ci	},
202862306a36Sopenharmony_ci};
202962306a36Sopenharmony_ci
203062306a36Sopenharmony_ci/**
203162306a36Sopenharmony_ci * mt8192_dai_i2s_set_share() - Set up I2S ports to share a single clock.
203262306a36Sopenharmony_ci * @afe: Pointer to &struct mtk_base_afe
203362306a36Sopenharmony_ci * @main_i2s_name: The name of the I2S port that will provide the clock
203462306a36Sopenharmony_ci * @secondary_i2s_name: The name of the I2S port that will use this clock
203562306a36Sopenharmony_ci */
203662306a36Sopenharmony_ciint mt8192_dai_i2s_set_share(struct mtk_base_afe *afe, const char *main_i2s_name,
203762306a36Sopenharmony_ci			     const char *secondary_i2s_name)
203862306a36Sopenharmony_ci{
203962306a36Sopenharmony_ci	struct mtk_afe_i2s_priv *secondary_i2s_priv;
204062306a36Sopenharmony_ci	int main_i2s_id;
204162306a36Sopenharmony_ci
204262306a36Sopenharmony_ci	secondary_i2s_priv = get_i2s_priv_by_name(afe, secondary_i2s_name);
204362306a36Sopenharmony_ci	if (!secondary_i2s_priv)
204462306a36Sopenharmony_ci		return -EINVAL;
204562306a36Sopenharmony_ci
204662306a36Sopenharmony_ci	main_i2s_id = get_i2s_id_by_name(afe, main_i2s_name);
204762306a36Sopenharmony_ci	if (main_i2s_id < 0)
204862306a36Sopenharmony_ci		return main_i2s_id;
204962306a36Sopenharmony_ci
205062306a36Sopenharmony_ci	secondary_i2s_priv->share_i2s_id = main_i2s_id;
205162306a36Sopenharmony_ci
205262306a36Sopenharmony_ci	return 0;
205362306a36Sopenharmony_ci}
205462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(mt8192_dai_i2s_set_share);
205562306a36Sopenharmony_ci
205662306a36Sopenharmony_cistatic int mt8192_dai_i2s_set_priv(struct mtk_base_afe *afe)
205762306a36Sopenharmony_ci{
205862306a36Sopenharmony_ci	int i;
205962306a36Sopenharmony_ci	int ret;
206062306a36Sopenharmony_ci
206162306a36Sopenharmony_ci	for (i = 0; i < DAI_I2S_NUM; i++) {
206262306a36Sopenharmony_ci		ret = mt8192_dai_set_priv(afe, mt8192_i2s_priv[i].id,
206362306a36Sopenharmony_ci					  sizeof(struct mtk_afe_i2s_priv),
206462306a36Sopenharmony_ci					  &mt8192_i2s_priv[i]);
206562306a36Sopenharmony_ci		if (ret)
206662306a36Sopenharmony_ci			return ret;
206762306a36Sopenharmony_ci	}
206862306a36Sopenharmony_ci
206962306a36Sopenharmony_ci	return 0;
207062306a36Sopenharmony_ci}
207162306a36Sopenharmony_ci
207262306a36Sopenharmony_ciint mt8192_dai_i2s_register(struct mtk_base_afe *afe)
207362306a36Sopenharmony_ci{
207462306a36Sopenharmony_ci	struct mtk_base_afe_dai *dai;
207562306a36Sopenharmony_ci	int ret;
207662306a36Sopenharmony_ci
207762306a36Sopenharmony_ci	dev_dbg(afe->dev, "%s()\n", __func__);
207862306a36Sopenharmony_ci
207962306a36Sopenharmony_ci	dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
208062306a36Sopenharmony_ci	if (!dai)
208162306a36Sopenharmony_ci		return -ENOMEM;
208262306a36Sopenharmony_ci
208362306a36Sopenharmony_ci	list_add(&dai->list, &afe->sub_dais);
208462306a36Sopenharmony_ci
208562306a36Sopenharmony_ci	dai->dai_drivers = mtk_dai_i2s_driver;
208662306a36Sopenharmony_ci	dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_i2s_driver);
208762306a36Sopenharmony_ci
208862306a36Sopenharmony_ci	dai->controls = mtk_dai_i2s_controls;
208962306a36Sopenharmony_ci	dai->num_controls = ARRAY_SIZE(mtk_dai_i2s_controls);
209062306a36Sopenharmony_ci	dai->dapm_widgets = mtk_dai_i2s_widgets;
209162306a36Sopenharmony_ci	dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_i2s_widgets);
209262306a36Sopenharmony_ci	dai->dapm_routes = mtk_dai_i2s_routes;
209362306a36Sopenharmony_ci	dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_i2s_routes);
209462306a36Sopenharmony_ci
209562306a36Sopenharmony_ci	/* set all dai i2s private data */
209662306a36Sopenharmony_ci	ret = mt8192_dai_i2s_set_priv(afe);
209762306a36Sopenharmony_ci	if (ret)
209862306a36Sopenharmony_ci		return ret;
209962306a36Sopenharmony_ci
210062306a36Sopenharmony_ci	return 0;
210162306a36Sopenharmony_ci}
2102