162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci//
362306a36Sopenharmony_ci// MediaTek ALSA SoC Audio DAI ADDA Control
462306a36Sopenharmony_ci//
562306a36Sopenharmony_ci// Copyright (c) 2018 MediaTek Inc.
662306a36Sopenharmony_ci// Author: KaiChieh Chuang <kaichieh.chuang@mediatek.com>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/regmap.h>
962306a36Sopenharmony_ci#include <linux/delay.h>
1062306a36Sopenharmony_ci#include "mt6797-afe-common.h"
1162306a36Sopenharmony_ci#include "mt6797-interconnection.h"
1262306a36Sopenharmony_ci#include "mt6797-reg.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cienum {
1562306a36Sopenharmony_ci	MTK_AFE_ADDA_DL_RATE_8K = 0,
1662306a36Sopenharmony_ci	MTK_AFE_ADDA_DL_RATE_11K = 1,
1762306a36Sopenharmony_ci	MTK_AFE_ADDA_DL_RATE_12K = 2,
1862306a36Sopenharmony_ci	MTK_AFE_ADDA_DL_RATE_16K = 3,
1962306a36Sopenharmony_ci	MTK_AFE_ADDA_DL_RATE_22K = 4,
2062306a36Sopenharmony_ci	MTK_AFE_ADDA_DL_RATE_24K = 5,
2162306a36Sopenharmony_ci	MTK_AFE_ADDA_DL_RATE_32K = 6,
2262306a36Sopenharmony_ci	MTK_AFE_ADDA_DL_RATE_44K = 7,
2362306a36Sopenharmony_ci	MTK_AFE_ADDA_DL_RATE_48K = 8,
2462306a36Sopenharmony_ci	MTK_AFE_ADDA_DL_RATE_96K = 9,
2562306a36Sopenharmony_ci	MTK_AFE_ADDA_DL_RATE_192K = 10,
2662306a36Sopenharmony_ci};
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cienum {
2962306a36Sopenharmony_ci	MTK_AFE_ADDA_UL_RATE_8K = 0,
3062306a36Sopenharmony_ci	MTK_AFE_ADDA_UL_RATE_16K = 1,
3162306a36Sopenharmony_ci	MTK_AFE_ADDA_UL_RATE_32K = 2,
3262306a36Sopenharmony_ci	MTK_AFE_ADDA_UL_RATE_48K = 3,
3362306a36Sopenharmony_ci	MTK_AFE_ADDA_UL_RATE_96K = 4,
3462306a36Sopenharmony_ci	MTK_AFE_ADDA_UL_RATE_192K = 5,
3562306a36Sopenharmony_ci	MTK_AFE_ADDA_UL_RATE_48K_HD = 6,
3662306a36Sopenharmony_ci};
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistatic unsigned int adda_dl_rate_transform(struct mtk_base_afe *afe,
3962306a36Sopenharmony_ci					   unsigned int rate)
4062306a36Sopenharmony_ci{
4162306a36Sopenharmony_ci	switch (rate) {
4262306a36Sopenharmony_ci	case 8000:
4362306a36Sopenharmony_ci		return MTK_AFE_ADDA_DL_RATE_8K;
4462306a36Sopenharmony_ci	case 11025:
4562306a36Sopenharmony_ci		return MTK_AFE_ADDA_DL_RATE_11K;
4662306a36Sopenharmony_ci	case 12000:
4762306a36Sopenharmony_ci		return MTK_AFE_ADDA_DL_RATE_12K;
4862306a36Sopenharmony_ci	case 16000:
4962306a36Sopenharmony_ci		return MTK_AFE_ADDA_DL_RATE_16K;
5062306a36Sopenharmony_ci	case 22050:
5162306a36Sopenharmony_ci		return MTK_AFE_ADDA_DL_RATE_22K;
5262306a36Sopenharmony_ci	case 24000:
5362306a36Sopenharmony_ci		return MTK_AFE_ADDA_DL_RATE_24K;
5462306a36Sopenharmony_ci	case 32000:
5562306a36Sopenharmony_ci		return MTK_AFE_ADDA_DL_RATE_32K;
5662306a36Sopenharmony_ci	case 44100:
5762306a36Sopenharmony_ci		return MTK_AFE_ADDA_DL_RATE_44K;
5862306a36Sopenharmony_ci	case 48000:
5962306a36Sopenharmony_ci		return MTK_AFE_ADDA_DL_RATE_48K;
6062306a36Sopenharmony_ci	case 96000:
6162306a36Sopenharmony_ci		return MTK_AFE_ADDA_DL_RATE_96K;
6262306a36Sopenharmony_ci	case 192000:
6362306a36Sopenharmony_ci		return MTK_AFE_ADDA_DL_RATE_192K;
6462306a36Sopenharmony_ci	default:
6562306a36Sopenharmony_ci		dev_warn(afe->dev, "%s(), rate %d invalid, use 48kHz!!!\n",
6662306a36Sopenharmony_ci			 __func__, rate);
6762306a36Sopenharmony_ci		return MTK_AFE_ADDA_DL_RATE_48K;
6862306a36Sopenharmony_ci	}
6962306a36Sopenharmony_ci}
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_cistatic unsigned int adda_ul_rate_transform(struct mtk_base_afe *afe,
7262306a36Sopenharmony_ci					   unsigned int rate)
7362306a36Sopenharmony_ci{
7462306a36Sopenharmony_ci	switch (rate) {
7562306a36Sopenharmony_ci	case 8000:
7662306a36Sopenharmony_ci		return MTK_AFE_ADDA_UL_RATE_8K;
7762306a36Sopenharmony_ci	case 16000:
7862306a36Sopenharmony_ci		return MTK_AFE_ADDA_UL_RATE_16K;
7962306a36Sopenharmony_ci	case 32000:
8062306a36Sopenharmony_ci		return MTK_AFE_ADDA_UL_RATE_32K;
8162306a36Sopenharmony_ci	case 48000:
8262306a36Sopenharmony_ci		return MTK_AFE_ADDA_UL_RATE_48K;
8362306a36Sopenharmony_ci	case 96000:
8462306a36Sopenharmony_ci		return MTK_AFE_ADDA_UL_RATE_96K;
8562306a36Sopenharmony_ci	case 192000:
8662306a36Sopenharmony_ci		return MTK_AFE_ADDA_UL_RATE_192K;
8762306a36Sopenharmony_ci	default:
8862306a36Sopenharmony_ci		dev_warn(afe->dev, "%s(), rate %d invalid, use 48kHz!!!\n",
8962306a36Sopenharmony_ci			 __func__, rate);
9062306a36Sopenharmony_ci		return MTK_AFE_ADDA_UL_RATE_48K;
9162306a36Sopenharmony_ci	}
9262306a36Sopenharmony_ci}
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci/* dai component */
9562306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_adda_dl_ch1_mix[] = {
9662306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN3, I_DL1_CH1, 1, 0),
9762306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN3, I_DL2_CH1, 1, 0),
9862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN3, I_DL3_CH1, 1, 0),
9962306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN3,
10062306a36Sopenharmony_ci				    I_ADDA_UL_CH2, 1, 0),
10162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN3,
10262306a36Sopenharmony_ci				    I_ADDA_UL_CH1, 1, 0),
10362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN3,
10462306a36Sopenharmony_ci				    I_PCM_1_CAP_CH1, 1, 0),
10562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN3,
10662306a36Sopenharmony_ci				    I_PCM_2_CAP_CH1, 1, 0),
10762306a36Sopenharmony_ci};
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_cistatic const struct snd_kcontrol_new mtk_adda_dl_ch2_mix[] = {
11062306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN4, I_DL1_CH1, 1, 0),
11162306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN4, I_DL1_CH2, 1, 0),
11262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN4, I_DL2_CH1, 1, 0),
11362306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN4, I_DL2_CH2, 1, 0),
11462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN4, I_DL3_CH1, 1, 0),
11562306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN4, I_DL3_CH2, 1, 0),
11662306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN4,
11762306a36Sopenharmony_ci				    I_ADDA_UL_CH2, 1, 0),
11862306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN4,
11962306a36Sopenharmony_ci				    I_ADDA_UL_CH1, 1, 0),
12062306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN4,
12162306a36Sopenharmony_ci				    I_PCM_1_CAP_CH1, 1, 0),
12262306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN4,
12362306a36Sopenharmony_ci				    I_PCM_2_CAP_CH1, 1, 0),
12462306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN4,
12562306a36Sopenharmony_ci				    I_PCM_1_CAP_CH2, 1, 0),
12662306a36Sopenharmony_ci	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN4,
12762306a36Sopenharmony_ci				    I_PCM_2_CAP_CH2, 1, 0),
12862306a36Sopenharmony_ci};
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_cistatic int mtk_adda_ul_event(struct snd_soc_dapm_widget *w,
13162306a36Sopenharmony_ci			     struct snd_kcontrol *kcontrol,
13262306a36Sopenharmony_ci			     int event)
13362306a36Sopenharmony_ci{
13462306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
13562306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci	dev_dbg(afe->dev, "%s(), name %s, event 0x%x\n",
13862306a36Sopenharmony_ci		__func__, w->name, event);
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci	switch (event) {
14162306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
14262306a36Sopenharmony_ci		/* should delayed 1/fs(smallest is 8k) = 125us before afe off */
14362306a36Sopenharmony_ci		usleep_range(125, 135);
14462306a36Sopenharmony_ci		break;
14562306a36Sopenharmony_ci	default:
14662306a36Sopenharmony_ci		break;
14762306a36Sopenharmony_ci	}
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci	return 0;
15062306a36Sopenharmony_ci}
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_cienum {
15362306a36Sopenharmony_ci	SUPPLY_SEQ_AUD_TOP_PDN,
15462306a36Sopenharmony_ci	SUPPLY_SEQ_ADDA_AFE_ON,
15562306a36Sopenharmony_ci	SUPPLY_SEQ_ADDA_DL_ON,
15662306a36Sopenharmony_ci	SUPPLY_SEQ_ADDA_UL_ON,
15762306a36Sopenharmony_ci};
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget mtk_dai_adda_widgets[] = {
16062306a36Sopenharmony_ci	/* adda */
16162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("ADDA_DL_CH1", SND_SOC_NOPM, 0, 0,
16262306a36Sopenharmony_ci			   mtk_adda_dl_ch1_mix,
16362306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_adda_dl_ch1_mix)),
16462306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("ADDA_DL_CH2", SND_SOC_NOPM, 0, 0,
16562306a36Sopenharmony_ci			   mtk_adda_dl_ch2_mix,
16662306a36Sopenharmony_ci			   ARRAY_SIZE(mtk_adda_dl_ch2_mix)),
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("ADDA Enable", SUPPLY_SEQ_ADDA_AFE_ON,
16962306a36Sopenharmony_ci			      AFE_ADDA_UL_DL_CON0, ADDA_AFE_ON_SFT, 0,
17062306a36Sopenharmony_ci			      NULL, 0),
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("ADDA Playback Enable", SUPPLY_SEQ_ADDA_DL_ON,
17362306a36Sopenharmony_ci			      AFE_ADDA_DL_SRC2_CON0,
17462306a36Sopenharmony_ci			      DL_2_SRC_ON_TMP_CTL_PRE_SFT, 0,
17562306a36Sopenharmony_ci			      NULL, 0),
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("ADDA Capture Enable", SUPPLY_SEQ_ADDA_UL_ON,
17862306a36Sopenharmony_ci			      AFE_ADDA_UL_SRC_CON0,
17962306a36Sopenharmony_ci			      UL_SRC_ON_TMP_CTL_SFT, 0,
18062306a36Sopenharmony_ci			      mtk_adda_ul_event,
18162306a36Sopenharmony_ci			      SND_SOC_DAPM_POST_PMD),
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("aud_dac_clk", SUPPLY_SEQ_AUD_TOP_PDN,
18462306a36Sopenharmony_ci			      AUDIO_TOP_CON0, PDN_DAC_SFT, 1,
18562306a36Sopenharmony_ci			      NULL, 0),
18662306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("aud_dac_predis_clk", SUPPLY_SEQ_AUD_TOP_PDN,
18762306a36Sopenharmony_ci			      AUDIO_TOP_CON0, PDN_DAC_PREDIS_SFT, 1,
18862306a36Sopenharmony_ci			      NULL, 0),
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("aud_adc_clk", SUPPLY_SEQ_AUD_TOP_PDN,
19162306a36Sopenharmony_ci			      AUDIO_TOP_CON0, PDN_ADC_SFT, 1,
19262306a36Sopenharmony_ci			      NULL, 0),
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci	SND_SOC_DAPM_CLOCK_SUPPLY("mtkaif_26m_clk"),
19562306a36Sopenharmony_ci};
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_cistatic const struct snd_soc_dapm_route mtk_dai_adda_routes[] = {
19862306a36Sopenharmony_ci	/* playback */
19962306a36Sopenharmony_ci	{"ADDA_DL_CH1", "DL1_CH1", "DL1"},
20062306a36Sopenharmony_ci	{"ADDA_DL_CH2", "DL1_CH1", "DL1"},
20162306a36Sopenharmony_ci	{"ADDA_DL_CH2", "DL1_CH2", "DL1"},
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci	{"ADDA_DL_CH1", "DL2_CH1", "DL2"},
20462306a36Sopenharmony_ci	{"ADDA_DL_CH2", "DL2_CH1", "DL2"},
20562306a36Sopenharmony_ci	{"ADDA_DL_CH2", "DL2_CH2", "DL2"},
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_ci	{"ADDA_DL_CH1", "DL3_CH1", "DL3"},
20862306a36Sopenharmony_ci	{"ADDA_DL_CH2", "DL3_CH1", "DL3"},
20962306a36Sopenharmony_ci	{"ADDA_DL_CH2", "DL3_CH2", "DL3"},
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci	{"ADDA Playback", NULL, "ADDA_DL_CH1"},
21262306a36Sopenharmony_ci	{"ADDA Playback", NULL, "ADDA_DL_CH2"},
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_ci	/* adda enable */
21562306a36Sopenharmony_ci	{"ADDA Playback", NULL, "ADDA Enable"},
21662306a36Sopenharmony_ci	{"ADDA Playback", NULL, "ADDA Playback Enable"},
21762306a36Sopenharmony_ci	{"ADDA Capture", NULL, "ADDA Enable"},
21862306a36Sopenharmony_ci	{"ADDA Capture", NULL, "ADDA Capture Enable"},
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci	/* clk */
22162306a36Sopenharmony_ci	{"ADDA Playback", NULL, "mtkaif_26m_clk"},
22262306a36Sopenharmony_ci	{"ADDA Playback", NULL, "aud_dac_clk"},
22362306a36Sopenharmony_ci	{"ADDA Playback", NULL, "aud_dac_predis_clk"},
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci	{"ADDA Capture", NULL, "mtkaif_26m_clk"},
22662306a36Sopenharmony_ci	{"ADDA Capture", NULL, "aud_adc_clk"},
22762306a36Sopenharmony_ci};
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ci/* dai ops */
23062306a36Sopenharmony_cistatic int mtk_dai_adda_hw_params(struct snd_pcm_substream *substream,
23162306a36Sopenharmony_ci				  struct snd_pcm_hw_params *params,
23262306a36Sopenharmony_ci				  struct snd_soc_dai *dai)
23362306a36Sopenharmony_ci{
23462306a36Sopenharmony_ci	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
23562306a36Sopenharmony_ci	unsigned int rate = params_rate(params);
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci	dev_dbg(afe->dev, "%s(), id %d, stream %d, rate %d\n",
23862306a36Sopenharmony_ci		__func__, dai->id, substream->stream, rate);
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_ci	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
24162306a36Sopenharmony_ci		unsigned int dl_src2_con0 = 0;
24262306a36Sopenharmony_ci		unsigned int dl_src2_con1 = 0;
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_ci		/* clean predistortion */
24562306a36Sopenharmony_ci		regmap_write(afe->regmap, AFE_ADDA_PREDIS_CON0, 0);
24662306a36Sopenharmony_ci		regmap_write(afe->regmap, AFE_ADDA_PREDIS_CON1, 0);
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ci		/* set input sampling rate */
24962306a36Sopenharmony_ci		dl_src2_con0 = adda_dl_rate_transform(afe, rate) << 28;
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_ci		/* set output mode */
25262306a36Sopenharmony_ci		switch (rate) {
25362306a36Sopenharmony_ci		case 192000:
25462306a36Sopenharmony_ci			dl_src2_con0 |= (0x1 << 24); /* UP_SAMPLING_RATE_X2 */
25562306a36Sopenharmony_ci			dl_src2_con0 |= 1 << 14;
25662306a36Sopenharmony_ci			break;
25762306a36Sopenharmony_ci		case 96000:
25862306a36Sopenharmony_ci			dl_src2_con0 |= (0x2 << 24); /* UP_SAMPLING_RATE_X4 */
25962306a36Sopenharmony_ci			dl_src2_con0 |= 1 << 14;
26062306a36Sopenharmony_ci			break;
26162306a36Sopenharmony_ci		default:
26262306a36Sopenharmony_ci			dl_src2_con0 |= (0x3 << 24); /* UP_SAMPLING_RATE_X8 */
26362306a36Sopenharmony_ci			break;
26462306a36Sopenharmony_ci		}
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci		/* turn off mute function */
26762306a36Sopenharmony_ci		dl_src2_con0 |= (0x03 << 11);
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_ci		/* set voice input data if input sample rate is 8k or 16k */
27062306a36Sopenharmony_ci		if (rate == 8000 || rate == 16000)
27162306a36Sopenharmony_ci			dl_src2_con0 |= 0x01 << 5;
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ci		if (rate < 96000) {
27462306a36Sopenharmony_ci			/* SA suggest apply -0.3db to audio/speech path */
27562306a36Sopenharmony_ci			dl_src2_con1 = 0xf74f0000;
27662306a36Sopenharmony_ci		} else {
27762306a36Sopenharmony_ci			/* SA suggest apply -0.3db to audio/speech path
27862306a36Sopenharmony_ci			 * with DL gain set to half,
27962306a36Sopenharmony_ci			 * 0xFFFF = 0dB -> 0x8000 = 0dB when 96k, 192k
28062306a36Sopenharmony_ci			 */
28162306a36Sopenharmony_ci			dl_src2_con1 = 0x7ba70000;
28262306a36Sopenharmony_ci		}
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ci		/* turn on down-link gain */
28562306a36Sopenharmony_ci		dl_src2_con0 = dl_src2_con0 | (0x01 << 1);
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_ci		regmap_write(afe->regmap, AFE_ADDA_DL_SRC2_CON0, dl_src2_con0);
28862306a36Sopenharmony_ci		regmap_write(afe->regmap, AFE_ADDA_DL_SRC2_CON1, dl_src2_con1);
28962306a36Sopenharmony_ci	} else {
29062306a36Sopenharmony_ci		unsigned int voice_mode = 0;
29162306a36Sopenharmony_ci		unsigned int ul_src_con0 = 0;	/* default value */
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_ci		/* Using Internal ADC */
29462306a36Sopenharmony_ci		regmap_update_bits(afe->regmap,
29562306a36Sopenharmony_ci				   AFE_ADDA_TOP_CON0,
29662306a36Sopenharmony_ci				   0x1 << 0,
29762306a36Sopenharmony_ci				   0x0 << 0);
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_ci		voice_mode = adda_ul_rate_transform(afe, rate);
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_ci		ul_src_con0 |= (voice_mode << 17) & (0x7 << 17);
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_ci		/* up8x txif sat on */
30462306a36Sopenharmony_ci		regmap_write(afe->regmap, AFE_ADDA_NEWIF_CFG0, 0x03F87201);
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci		if (rate >= 96000) {	/* hires */
30762306a36Sopenharmony_ci			/* use hires format [1 0 23] */
30862306a36Sopenharmony_ci			regmap_update_bits(afe->regmap,
30962306a36Sopenharmony_ci					   AFE_ADDA_NEWIF_CFG0,
31062306a36Sopenharmony_ci					   0x1 << 5,
31162306a36Sopenharmony_ci					   0x1 << 5);
31262306a36Sopenharmony_ci
31362306a36Sopenharmony_ci			regmap_update_bits(afe->regmap,
31462306a36Sopenharmony_ci					   AFE_ADDA_NEWIF_CFG2,
31562306a36Sopenharmony_ci					   0xf << 28,
31662306a36Sopenharmony_ci					   voice_mode << 28);
31762306a36Sopenharmony_ci		} else {	/* normal 8~48k */
31862306a36Sopenharmony_ci			/* use fixed 260k anc path */
31962306a36Sopenharmony_ci			regmap_update_bits(afe->regmap,
32062306a36Sopenharmony_ci					   AFE_ADDA_NEWIF_CFG2,
32162306a36Sopenharmony_ci					   0xf << 28,
32262306a36Sopenharmony_ci					   8 << 28);
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ci			/* ul_use_cic_out */
32562306a36Sopenharmony_ci			ul_src_con0 |= 0x1 << 20;
32662306a36Sopenharmony_ci		}
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci		regmap_update_bits(afe->regmap,
32962306a36Sopenharmony_ci				   AFE_ADDA_NEWIF_CFG2,
33062306a36Sopenharmony_ci				   0xf << 28,
33162306a36Sopenharmony_ci				   8 << 28);
33262306a36Sopenharmony_ci
33362306a36Sopenharmony_ci		regmap_update_bits(afe->regmap,
33462306a36Sopenharmony_ci				   AFE_ADDA_UL_SRC_CON0,
33562306a36Sopenharmony_ci				   0xfffffffe,
33662306a36Sopenharmony_ci				   ul_src_con0);
33762306a36Sopenharmony_ci	}
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ci	return 0;
34062306a36Sopenharmony_ci}
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_cistatic const struct snd_soc_dai_ops mtk_dai_adda_ops = {
34362306a36Sopenharmony_ci	.hw_params = mtk_dai_adda_hw_params,
34462306a36Sopenharmony_ci};
34562306a36Sopenharmony_ci
34662306a36Sopenharmony_ci/* dai driver */
34762306a36Sopenharmony_ci#define MTK_ADDA_PLAYBACK_RATES (SNDRV_PCM_RATE_8000_48000 |\
34862306a36Sopenharmony_ci				 SNDRV_PCM_RATE_96000 |\
34962306a36Sopenharmony_ci				 SNDRV_PCM_RATE_192000)
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_ci#define MTK_ADDA_CAPTURE_RATES (SNDRV_PCM_RATE_8000 |\
35262306a36Sopenharmony_ci				SNDRV_PCM_RATE_16000 |\
35362306a36Sopenharmony_ci				SNDRV_PCM_RATE_32000 |\
35462306a36Sopenharmony_ci				SNDRV_PCM_RATE_48000 |\
35562306a36Sopenharmony_ci				SNDRV_PCM_RATE_96000 |\
35662306a36Sopenharmony_ci				SNDRV_PCM_RATE_192000)
35762306a36Sopenharmony_ci
35862306a36Sopenharmony_ci#define MTK_ADDA_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
35962306a36Sopenharmony_ci			  SNDRV_PCM_FMTBIT_S24_LE |\
36062306a36Sopenharmony_ci			  SNDRV_PCM_FMTBIT_S32_LE)
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_cistatic struct snd_soc_dai_driver mtk_dai_adda_driver[] = {
36362306a36Sopenharmony_ci	{
36462306a36Sopenharmony_ci		.name = "ADDA",
36562306a36Sopenharmony_ci		.id = MT6797_DAI_ADDA,
36662306a36Sopenharmony_ci		.playback = {
36762306a36Sopenharmony_ci			.stream_name = "ADDA Playback",
36862306a36Sopenharmony_ci			.channels_min = 1,
36962306a36Sopenharmony_ci			.channels_max = 2,
37062306a36Sopenharmony_ci			.rates = MTK_ADDA_PLAYBACK_RATES,
37162306a36Sopenharmony_ci			.formats = MTK_ADDA_FORMATS,
37262306a36Sopenharmony_ci		},
37362306a36Sopenharmony_ci		.capture = {
37462306a36Sopenharmony_ci			.stream_name = "ADDA Capture",
37562306a36Sopenharmony_ci			.channels_min = 1,
37662306a36Sopenharmony_ci			.channels_max = 2,
37762306a36Sopenharmony_ci			.rates = MTK_ADDA_CAPTURE_RATES,
37862306a36Sopenharmony_ci			.formats = MTK_ADDA_FORMATS,
37962306a36Sopenharmony_ci		},
38062306a36Sopenharmony_ci		.ops = &mtk_dai_adda_ops,
38162306a36Sopenharmony_ci	},
38262306a36Sopenharmony_ci};
38362306a36Sopenharmony_ci
38462306a36Sopenharmony_ciint mt6797_dai_adda_register(struct mtk_base_afe *afe)
38562306a36Sopenharmony_ci{
38662306a36Sopenharmony_ci	struct mtk_base_afe_dai *dai;
38762306a36Sopenharmony_ci
38862306a36Sopenharmony_ci	dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
38962306a36Sopenharmony_ci	if (!dai)
39062306a36Sopenharmony_ci		return -ENOMEM;
39162306a36Sopenharmony_ci
39262306a36Sopenharmony_ci	list_add(&dai->list, &afe->sub_dais);
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci	dai->dai_drivers = mtk_dai_adda_driver;
39562306a36Sopenharmony_ci	dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_adda_driver);
39662306a36Sopenharmony_ci
39762306a36Sopenharmony_ci	dai->dapm_widgets = mtk_dai_adda_widgets;
39862306a36Sopenharmony_ci	dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_adda_widgets);
39962306a36Sopenharmony_ci	dai->dapm_routes = mtk_dai_adda_routes;
40062306a36Sopenharmony_ci	dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_adda_routes);
40162306a36Sopenharmony_ci	return 0;
40262306a36Sopenharmony_ci}
403